Ejemplo n.º 1
0
void
glw_scroll_layout(glw_scroll_control_t *gsc, glw_t *w, int height)
{
  const int max_value =
    MAX(0, gsc->total_size - gsc->page_size + gsc->scroll_threshold_post);

  if(w->glw_root->gr_pointer_grab == w) {

    gsc->filtered_pos = gsc->target_pos;

    gsc->filtered_pos = GLW_CLAMP(gsc->filtered_pos, 0, max_value);

  } else if(gsc->kinetic_scroll) {

    gsc->filtered_pos += gsc->kinetic_scroll;
    gsc->target_pos = gsc->filtered_pos;
    gsc->kinetic_scroll *= 0.95;

    gsc->filtered_pos = GLW_CLAMP(gsc->filtered_pos, 0, max_value);

  } else {

    gsc->target_pos = GLW_CLAMP(gsc->target_pos, 0, max_value);

    if(fabsf(gsc->target_pos - gsc->filtered_pos) > height * 2) {
      gsc->filtered_pos = gsc->target_pos;
    } else {
      glw_lp(&gsc->filtered_pos, w->glw_root, gsc->target_pos, 0.25);
    }
  }

  gsc->rounded_pos = gsc->filtered_pos;
}
Ejemplo n.º 2
0
static void
glw_slider_layout(glw_t *w, const glw_rctx_t *rc)
{
  glw_slider_t *s = (glw_slider_t *)w;
  glw_t *c;
  glw_rctx_t rc0;
  int f;

  if((c = TAILQ_FIRST(&w->glw_childs)) == NULL || 
     rc->rc_width == 0 || rc->rc_height == 0)
    return;

  f = glw_filter_constraints(c);

  if(s->fixed_knob_size) {
    if(w->glw_class == &glw_slider_x) {
      s->knob_size_px = s->knob_size_fixed * rc->rc_width;
    } else {
      s->knob_size_px = s->knob_size_fixed * rc->rc_height;
    }

  } else if(f & GLW_CONSTRAINT_X && w->glw_class == &glw_slider_x) {
    s->knob_size_px = c->glw_req_size_x;
  } else if(f & GLW_CONSTRAINT_Y && w->glw_class == &glw_slider_y) {
    s->knob_size_px = c->glw_req_size_y;
  } else if(w->glw_class == &glw_slider_x) {
    s->knob_size_px = rc->rc_height;
  } else {
    s->knob_size_px = rc->rc_width;
  }

  int p;

  rc0 = *rc;

  if(w->glw_class == &glw_slider_x) {
    p = s->value * (rc->rc_width - s->knob_size_px) + s->knob_size_px / 2;
    rc0.rc_width  = s->knob_size_px;
    s->slider_size_px = rc->rc_width;
  } else {
    p = (1 - s->value) *
      (rc->rc_height - s->knob_size_px) + s->knob_size_px / 2;
    rc0.rc_height  = s->knob_size_px;
    s->slider_size_px = rc->rc_height;
  }

  if(s->interpolate)
    glw_lp(&s->knob_pos_px, w->glw_root, p, 0.25);
  else
    s->knob_pos_px = p;
  
  glw_layout0(c, &rc0);
}
Ejemplo n.º 3
0
void
glw_scroll_layout(glw_scroll_control_t *gsc, glw_t *w, int height)
{
  const int max_value =
    MAX(0, gsc->total_size - gsc->page_size + gsc->scroll_threshold_post);

  if(w->glw_root->gr_pointer_grab_scroll == w) {

    gsc->filtered_pos = gsc->target_pos;

    gsc->filtered_pos = GLW_CLAMP(gsc->filtered_pos, 0, max_value);

  } else if(fabsf(gsc->kinetic_scroll) > 0.5) {

    gsc->filtered_pos += gsc->kinetic_scroll;
    if(gsc->target_pos != gsc->filtered_pos) {
      gsc->target_pos = gsc->filtered_pos;
      glw_need_refresh(w->glw_root, 0);
    }
    gsc->kinetic_scroll *= 0.95;
    gsc->bottom_anchored = 0;
    gsc->filtered_pos = GLW_CLAMP(gsc->filtered_pos, 0, max_value);

  } else {
    gsc->kinetic_scroll = 0;

    if(gsc->bottom_gravity) {

      if(gsc->target_pos == max_value) {
        gsc->bottom_anchored = 1;
      }
      if(gsc->bottom_anchored) {
        if(gsc->target_pos != max_value) {
          w->glw_flags |= GLW_UPDATE_METRICS;
        }
        gsc->target_pos = max_value;
      }
    }

    gsc->target_pos = GLW_CLAMP(gsc->target_pos, 0, max_value);

    if(fabsf(gsc->target_pos - gsc->filtered_pos) > height * 2) {
      gsc->filtered_pos = gsc->target_pos;
    } else {
      glw_lp(&gsc->filtered_pos, w->glw_root, gsc->target_pos, 0.25);
    }
  }

  gsc->rounded_pos = rintf(gsc->filtered_pos * 5.0f) / 5.0f;
}
Ejemplo n.º 4
0
static void
glw_segway_layout(glw_t *w, const glw_rctx_t *rc)
{
  glw_segway_t *s = (glw_segway_t *)w;
  glw_t *c;

  if((c = TAILQ_FIRST(&w->glw_childs)) == NULL)
    return;

  s->req_width = 0;
  int f = glw_filter_constraints(c);

  if(f & GLW_CONSTRAINT_X) {
    s->req_width = glw_req_width(c);
  } else if(f & GLW_CONSTRAINT_W && c->glw_req_weight < 0) {
    s->req_width = rc->rc_height * -c->glw_req_weight;
  }

  glw_rctx_t rc0 = *rc;
  float alpha;
  if(s->req_width == 0 || !s->direction) {
    rc0.rc_width = w->glw_root->gr_width;
    rc0.rc_segwayed = 1;
    alpha = 0;
  } else {
    rc0.rc_width = s->req_width;
    alpha = 1;
  }

  glw_lp(&s->alpha, w->glw_root, alpha, 0.25);
  glw_lp(&s->actual_width, w->glw_root, s->req_width, 0.25);
  s->actual_width_rounded = rintf(s->actual_width);

  rc0.rc_alpha *= s->alpha;
  glw_layout0(c, &rc0);
  glw_set_constraints(w, s->actual_width_rounded, 0, 0, GLW_CONSTRAINT_X);
}
Ejemplo n.º 5
0
static void
render_focus_widget(glw_t *w, glw_cursor_t *gc, const Mtx *saved,
                    glw_rctx_t *rc0, const glw_rctx_t *rc,
                    int *zmax)
{
  glw_root_t *gr = w->glw_root;

  if(!(gc->w.glw_flags & GLW_IN_FOCUS_PATH))
    return;

  glw_t *f = gr->gr_current_focus;

  if(f->glw_matrix != NULL) {

    Mtx a_inv;
    glw_mtx_invert(&a_inv, saved);
    Mtx *b = f->glw_matrix;

    if(0) {
      glw_rect_t focus_rect;
      glw_project_matrix(&focus_rect, b, gr);
      printf("Current focus: %d,%d - %d,%d\n",
             focus_rect.x1, focus_rect.y1,
             focus_rect.x2, focus_rect.y2);
    }

    Mtx x;
    glw_mtx_mul(&x, &a_inv, b);

    if (!gc->gc_initialized) {
      gc->gc_mtx = x;
      gc->gc_initialized = 1;
    } else {
      for(int r = 0; r < 4; r++) {
        for(int c = 0; c < 4; c++) {
          glw_lp(&gc->gc_mtx.r[r][c], gr, x.r[r][c], 0.75);
          /* printf("%2.3f%c", gc->gc_mtx[i], (i+1) & 3 ? '\t' : '\n'); */
        }
      }
    }
    glw_mtx_mul(&gc->gc_cursor_rctx.rc_mtx, saved, &gc->gc_mtx);
  }

  glw_rect_t cursor_rect;

  glw_project(&cursor_rect, &gc->gc_cursor_rctx, gr);

  gc->gc_cursor_rctx.rc_width  = cursor_rect.x2 - cursor_rect.x1;
  gc->gc_cursor_rctx.rc_height = cursor_rect.y2 - cursor_rect.y1;

  if(gc->gc_cursor_rctx.rc_width <= 0)
    return;

  if(gc->gc_cursor_rctx.rc_height <= 0)
    return;

  gc->gc_cursor_rctx.rc_alpha = 1.0f;
  gc->gc_cursor_rctx.rc_sharpness = 1.0f;

  glw_layout0(w, &gc->gc_cursor_rctx);

  rc0->rc_zindex = MAX(*zmax, rc->rc_zindex);
  gc->gc_cursor_rctx.rc_zmax = rc0->rc_zmax;
  gc->gc_cursor_rctx.rc_zindex = rc0->rc_zindex;
  glw_render0(w, &gc->gc_cursor_rctx);
}
Ejemplo n.º 6
0
static void 
drawFrame(glw_ps3_t *gp, int buffer, int with_universe)
{
  extern int browser_visible;

  gcmContextData *ctx = gp->gr.gr_be.be_ctx;

  realityViewportTranslate(ctx,
			   gp->res.width/2, gp->res.height/2, 0.0, 0.0);
  realityViewportScale(ctx,
		       gp->res.width/2, -gp->res.height/2, 1.0, 0.0); 

  realityZControl(ctx, 0, 1, 1); // disable viewport culling

  // Enable alpha blending.
  realityBlendFunc(ctx,
		   NV30_3D_BLEND_FUNC_SRC_RGB_SRC_ALPHA |
		   NV30_3D_BLEND_FUNC_SRC_ALPHA_SRC_ALPHA,
		   NV30_3D_BLEND_FUNC_DST_RGB_ONE_MINUS_SRC_ALPHA |
		   NV30_3D_BLEND_FUNC_DST_ALPHA_ZERO);
  realityBlendEquation(ctx, NV40_3D_BLEND_EQUATION_RGB_FUNC_ADD |
		       NV40_3D_BLEND_EQUATION_ALPHA_FUNC_ADD);
  realityBlendEnable(ctx, 1);

  realityViewport(ctx, gp->res.width, gp->res.height);
  
  setupRenderTarget(gp, buffer);

  // set the clear color
  realitySetClearColor(ctx, 0x00000000);

  realitySetClearDepthValue(ctx, 0xffff);

  // Clear the buffers
  realityClearBuffers(ctx,
		      REALITY_CLEAR_BUFFERS_COLOR_R |
		      REALITY_CLEAR_BUFFERS_COLOR_G |
		      REALITY_CLEAR_BUFFERS_COLOR_B |
		      NV30_3D_CLEAR_BUFFERS_COLOR_A | 
		      REALITY_CLEAR_BUFFERS_DEPTH);


  // XMB may overwrite currently loaded shaders, so clear them out
  gp->gr.gr_be.be_vp_current = NULL;
  gp->gr.gr_be.be_fp_current = NULL;

  realityCullEnable(ctx, 1);
  realityFrontFace(ctx, REALITY_FRONT_FACE_CCW);
  realityCullFace(ctx, REALITY_CULL_FACE_BACK);

  if(!with_universe)
    return;

  glw_lock(&gp->gr);
  glw_prepare_frame(&gp->gr, 0);

  gp->gr.gr_width = gp->res.width;
  gp->gr.gr_height = gp->res.height;

  glw_rctx_t rc;
  int zmax = 0;
  glw_rctx_init(&rc, gp->gr.gr_width * gp->scale, gp->gr.gr_height, 1, &zmax);

  glw_lp(&gp->gp_browser_alpha, &gp->gr, browser_visible, 0.1);

  rc.rc_alpha = 1 - gp->gp_stop * 0.1 - gp->gp_browser_alpha * 0.8;

  glw_layout0(gp->gr.gr_universe, &rc);
  glw_render0(gp->gr.gr_universe, &rc);
  glw_unlock(&gp->gr);
  glw_post_scene(&gp->gr);
}