static void bevel_top(uint8_t *p0, int w, int h) { int x; uint8_t *p = p0; for(x = 0; x < w; x++) { *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; } }
static void glw_image_layout_tesselated(glw_root_t *gr, glw_rctx_t *rc, glw_image_t *gi, glw_loadable_texture_t *glt) { float tex[4][2]; float vex[4][2]; int x, y, i = 0; if(gr->gr_normalized_texture_coords) { tex[1][0] = 0.0f + (float)gi->gi_border_left / glt->glt_xs; tex[2][0] = glt->glt_s - (float)gi->gi_border_right / glt->glt_xs; tex[0][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_LEFT ? 0.0f : tex[1][0]; tex[3][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_RIGHT ? glt->glt_s : tex[2][0]; tex[0][1] = 0.0f; tex[1][1] = 0.0f + (float)gi->gi_border_top / glt->glt_ys; tex[2][1] = glt->glt_t - (float)gi->gi_border_bottom / glt->glt_ys; tex[3][1] = glt->glt_t; } else { tex[1][0] = gi->gi_border_left; tex[2][0] = glt->glt_xs - gi->gi_border_right; tex[0][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_LEFT ? 0.0f : tex[1][0]; tex[3][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_RIGHT ? glt->glt_xs : tex[2][0]; tex[0][1] = 0.0f; tex[1][1] = gi->gi_border_top; tex[2][1] = glt->glt_ys - gi->gi_border_bottom; tex[3][1] = glt->glt_ys; } vex[0][0] = GLW_MIN(-1.0f + 2.0f * (gi->gi_margin_left) / rc->rc_width, 0.0f); vex[1][0] = GLW_MIN(-1.0f + 2.0f * (gi->gi_border_left + gi->gi_margin_left) / rc->rc_width, 0.0f); vex[2][0] = GLW_MAX( 1.0f - 2.0f * (gi->gi_border_right + gi->gi_margin_right) / rc->rc_width, 0.0f); vex[3][0] = GLW_MAX( 1.0f - 2.0f * (gi->gi_margin_right) / rc->rc_width, 0.0f); vex[0][1] = GLW_MAX( 1.0f - 2.0f * (gi->gi_margin_top) / rc->rc_height, 0.0f); vex[1][1] = GLW_MAX( 1.0f - 2.0f * (gi->gi_border_top + gi->gi_margin_top) / rc->rc_height, 0.0f); vex[2][1] = GLW_MIN(-1.0f + 2.0f * (gi->gi_border_bottom + gi->gi_margin_bottom) / rc->rc_height, 0.0f); vex[3][1] = GLW_MIN(-1.0f + 2.0f * (gi->gi_margin_bottom) / rc->rc_height, 0.0f); for(y = 0; y < 4; y++) { for(x = 0; x < 4; x++) { glw_renderer_vtx_pos(&gi->gi_gr, i, vex[x][0], vex[y][1], 0.0f); glw_renderer_vtx_st (&gi->gi_gr, i, tex[x][0], tex[y][1]); i++; } } }
static void bevel_left(uint8_t *p0, int w, int h) { uint8_t *p = p0; int y; for(y = 0; y < h; y++) { *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; *p = GLW_MIN((int)*p + BEVEL_STRENGTH, 255); p++; p+= (w - 1) * GRAD_BPP; } }
static void glw_image_layout_alpha_edges(glw_root_t *gr, glw_rctx_t *rc, glw_image_t *gi, glw_loadable_texture_t *glt) { float tex[4][2]; float vex[4][2]; int x, y, i = 0; if(gr->gr_normalized_texture_coords) { tex[0][0] = 0.0f; tex[1][0] = 0.0f + (float)gi->gi_alpha_edge / glt->glt_xs; tex[2][0] = glt->glt_s - (float)gi->gi_alpha_edge / glt->glt_xs; tex[3][0] = glt->glt_s; tex[0][1] = 0.0f; tex[1][1] = 0.0f + (float)gi->gi_alpha_edge / glt->glt_ys; tex[2][1] = glt->glt_t - (float)gi->gi_alpha_edge / glt->glt_ys; tex[3][1] = glt->glt_t; } else { tex[0][0] = 0.0f; tex[1][0] = gi->gi_alpha_edge; tex[2][0] = glt->glt_xs - gi->gi_alpha_edge; tex[3][0] = glt->glt_xs; tex[0][1] = 0.0f; tex[1][1] = gi->gi_alpha_edge; tex[2][1] = glt->glt_ys - gi->gi_alpha_edge; tex[3][1] = glt->glt_ys; } vex[0][0] = -1.0f; vex[1][0] = GLW_MIN(-1.0f + 2.0f * gi->gi_alpha_edge / rc->rc_width, 0.0f); vex[2][0] = GLW_MAX( 1.0f - 2.0f * gi->gi_alpha_edge / rc->rc_width, 0.0f); vex[3][0] = 1.0f; vex[0][1] = 1.0f; vex[1][1] = GLW_MAX( 1.0f - 2.0f * gi->gi_alpha_edge / rc->rc_height, 0.0f); vex[2][1] = GLW_MIN(-1.0f + 2.0f * gi->gi_alpha_edge / rc->rc_height, 0.0f); vex[3][1] = -1.0f; for(y = 0; y < 4; y++) { for(x = 0; x < 4; x++) { glw_renderer_vtx_pos(&gi->gi_gr, i, vex[x][0], vex[y][1], 0.0f); glw_renderer_vtx_st (&gi->gi_gr, i, tex[x][0], tex[y][1]); glw_renderer_vtx_col(&gi->gi_gr, i, 1, 1, 1, alphaborder[x][y]); i++; } } }
static void glw_freefloat_layout(glw_freefloat_t *ff, glw_rctx_t *rc) { glw_t *w = &ff->w; glw_t *c; int i, candpos = -1; float vmin = 1; for(i = 0; i < ff->num_visible; i++) { if(ff->visible[i] == NULL) { candpos = i; } else { vmin = GLW_MIN(ff->visible[i]->glw_parent_v, vmin); } } if(vmin > 1.0 / (float)ff->num_visible && candpos != -1) { /* Insert new entry */ if(ff->pick != NULL) ff->pick = glw_next_widget(ff->pick); if(ff->pick == NULL) ff->pick = glw_first_widget(w); if(ff->pick != NULL && !is_visible(ff, ff->pick)) { ff->visible[candpos] = ff->pick; setup_floater(ff, ff->pick); } } for(i = 0; i < ff->num_visible; i++) { if((c = ff->visible[i]) == NULL) continue; if(c->glw_parent_v >= 1) { ff->visible[i] = NULL; } else { glw_layout0(c, rc); } if(c->glw_class->gc_ready ? c->glw_class->gc_ready(c) : 1) c->glw_parent_v += c->glw_parent_s; c->glw_parent_s += c->glw_parent_s2; } qsort(ff->visible, ff->num_visible, sizeof(void *), zsort); c = ff->pick; // Layout next few items to pick, to preload textures, etc for(i = 0; i < 3 && c != NULL; i++, c = glw_next_widget(c)) { if(!is_visible(ff, c)) glw_layout0(c, rc); } }
static void update_value_delta(glw_slider_t *s, float d) { if(s->p != NULL) prop_add_float(s->p, d * (s->max - s->min)); else { s->value = GLW_MAX(s->min, GLW_MIN(s->max, s->value + d)); if(s->bound_widget != NULL) { glw_scroll_t gs; gs.value = s->value; glw_signal0(s->bound_widget, GLW_SIGNAL_SCROLL, &gs); } } }
static void update_value(glw_slider_t *s, float v, int how) { v = GLW_MAX(0, GLW_MIN(1.0, v)); if(s->p != NULL) prop_set_float_ex(s->p, NULL, v * (s->max - s->min) + s->min, how); else { s->value = v; if(s->bound_widget != NULL) { glw_scroll_t gs; gs.value = s->value; glw_signal0(s->bound_widget, GLW_SIGNAL_SCROLL, &gs); } } }
static void update_value_delta(glw_slider_t *s, float d) { if(s->p != NULL) { s->interpolate = 2; prop_add_float(s->p, d * (s->max - s->min)); } else { s->value = GLW_MAX(s->min, GLW_MIN(s->max, s->value + d)); s->interpolate = 1; if(s->bound_widget != NULL) { glw_scroll_t gs; gs.value = s->value; glw_signal0(s->bound_widget, GLW_SIGNAL_SCROLL, &gs); } glw_need_refresh(s->w.glw_root, 0); } }
void glw_scroll_update_metrics(glw_scroll_control_t *gsc, glw_t *w) { float v; int do_update = 0; w->glw_flags &= ~GLW_UPDATE_METRICS; v = GLW_MIN(1.0f, (float)gsc->page_size / gsc->total_size); if(v != gsc->metrics.knob_size) { do_update = 1; gsc->metrics.knob_size = v; } v = GLW_MAX(0, (float)gsc->target_pos / (gsc->total_size - gsc->page_size + gsc->scroll_threshold_post)); if(v != gsc->metrics.position) { do_update = 1; gsc->metrics.position = v; } if(!do_update) return; if(gsc->total_size > gsc->page_size && !(w->glw_flags & GLW_CAN_SCROLL)) { w->glw_flags |= GLW_CAN_SCROLL; glw_signal0(w, GLW_SIGNAL_CAN_SCROLL_CHANGED, NULL); } else if(gsc->total_size <= gsc->page_size && w->glw_flags & GLW_CAN_SCROLL) { w->glw_flags &= ~GLW_CAN_SCROLL; glw_signal0(w, GLW_SIGNAL_CAN_SCROLL_CHANGED, NULL); } glw_signal0(w, GLW_SIGNAL_SLIDER_METRICS, &gsc->metrics); }
static void prop_callback(void *opaque, prop_event_t event, ...) { glw_slider_t *sl = opaque; glw_root_t *gr; float v; prop_t *p; int how = 0; int grabbed; if(sl == NULL) return; gr = sl->w.glw_root; va_list ap; va_start(ap, event); grabbed = gr->gr_pointer_grab == &sl->w; switch(event) { case PROP_SET_VOID: if(grabbed) gr->gr_pointer_grab = NULL; v = 0; p = va_arg(ap, prop_t *); break; case PROP_SET_FLOAT: v = va_arg(ap, double); p = va_arg(ap, prop_t *); how = va_arg(ap, int); break; case PROP_SET_INT: v = va_arg(ap, int); p = va_arg(ap, prop_t *); break; default: return; } prop_ref_dec(sl->p); sl->p = prop_ref_inc(p); switch(how) { case PROP_SET_NORMAL: if(sl->tentative_only) return; break; case PROP_SET_TENTATIVE: sl->tentative_only = 1; break; case PROP_SET_COMMIT: sl->tentative_only = 0; break; } if(sl->max - sl->min == 0) return; v = GLW_RESCALE(v, sl->min, sl->max); sl->value = GLW_MAX(0, GLW_MIN(1.0, v)); if(sl->interpolate) sl->interpolate--; }
static void glw_slideshow_layout(glw_t *w, const glw_rctx_t *rc) { glw_slideshow_t *s = (glw_slideshow_t *)w; glw_t *c, *p, *n; float delta; glw_reset_screensaver(w->glw_root); delta = s->w.glw_root->gr_frameduration / (1000000.0 * s->transition_time); if(s->time == 0) { s->displaytime = INT32_MAX; } else { s->displaytime = 1000000 * s->time / s->w.glw_root->gr_frameduration; } if((c = s->w.glw_focused) == NULL) { c = s->w.glw_focused = glw_first_widget(&s->w); if(c) glw_copy_constraints(&s->w, c); } if(c == NULL) return; if(s->timer >= s->displaytime) { c = glw_next_widget(c); if(c == NULL) c = glw_first_widget(&s->w); s->timer = 0; if(c != NULL) { glw_focus_open_path_close_all_other(c); glw_copy_constraints(&s->w, c); } } if(!s->hold) s->timer++; glw_layout0(c, rc); c->glw_parent_alpha = GLW_MIN(c->glw_parent_alpha + delta, 1.0f); /** * Keep previous and next images 'hot' (ie, loaded into texture memory) */ p = glw_prev_widget(c); if(p == NULL) p = glw_last_widget(&s->w); if(p != NULL && p != c) { p->glw_parent_alpha = GLW_MAX(p->glw_parent_alpha - delta, 0.0f); glw_layout0(p, rc); } n = glw_next_widget(c); if(n == NULL) n = glw_first_widget(&s->w); if(n != NULL && n != c) { n->glw_parent_alpha = GLW_MAX(n->glw_parent_alpha - delta, 0.0f); glw_layout0(n, rc); } }
static void glw_image_layout_tesselated(glw_root_t *gr, glw_rctx_t *rc, glw_image_t *gi, glw_loadable_texture_t *glt) { float tex[4][2]; float vex[4][2]; int x, y, i = 0, BL, BR; if(gi->w.glw_flags2 & GLW2_AUTOMARGIN) { gi->gi_automargin_left = 0; gi->gi_automargin_top = 0; gi->gi_automargin_right = 0; gi->gi_automargin_bottom = 0; glw_t *c = TAILQ_FIRST(&gi->w.glw_childs); if(c != NULL && (c->glw_flags & (GLW_CONSTRAINT_X | GLW_CONSTRAINT_Y)) == (GLW_CONSTRAINT_X | GLW_CONSTRAINT_Y)) { int hspill = rc->rc_width - c->glw_req_size_x - gi->gi_box_left - gi->gi_box_right; if(hspill > 0) { gi->gi_automargin_left = hspill / 2 + (hspill & 1); gi->gi_automargin_right = hspill / 2; } int vspill = rc->rc_height - c->glw_req_size_y - gi->gi_box_top - gi->gi_box_bottom; if(vspill > 0) { gi->gi_automargin_top = vspill / 2 + (vspill & 1); gi->gi_automargin_bottom = vspill / 2; } } else if(c != NULL && c->glw_flags & GLW_CONSTRAINT_W && c->glw_req_weight < 0) { float aspect = -c->glw_req_weight; float cw = rc->rc_width - gi->gi_box_left - gi->gi_box_right; float ch = rc->rc_height - gi->gi_box_top - gi->gi_box_bottom; float myaspect = cw / ch; if(myaspect > aspect) { // We are wider than our child wants int cwidth = ch * aspect; int hspill = cw - cwidth; if(hspill > 0) { gi->gi_automargin_left = hspill / 2 + (hspill & 1); gi->gi_automargin_right = hspill / 2; } } else { int cheight = cw / aspect; int vspill = ch - cheight; if(vspill > 0) { gi->gi_automargin_top = vspill / 2 + (vspill & 1); gi->gi_automargin_bottom = vspill / 2; } } } else if(gi->gi_child_aspect > 0) { int px = rc->rc_height * gi->gi_child_aspect; int hspill = rc->rc_width - px - gi->gi_box_left - gi->gi_box_right; if(hspill > 0) { gi->gi_automargin_left = hspill / 2 + (hspill & 1); gi->gi_automargin_right = hspill / 2; } } if(gi->w.glw_flags & GLW_DEBUG) printf("Automargin %d,%d,%d,%d\n", gi->gi_automargin_left, gi->gi_automargin_top, gi->gi_automargin_right, gi->gi_automargin_bottom); update_box(gi); } if(gr->gr_normalized_texture_coords) { tex[1][0] = 0.0f + (float)gi->gi_border_left / glt->glt_xs; tex[2][0] = glt->glt_s - (float)gi->gi_border_right / glt->glt_xs; tex[0][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_LEFT ? 0.0f : tex[1][0]; tex[3][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_RIGHT ? glt->glt_s : tex[2][0]; tex[0][1] = 0.0f; tex[1][1] = 0.0f + (float)gi->gi_border_top / glt->glt_ys; tex[2][1] = glt->glt_t - (float)gi->gi_border_bottom / glt->glt_ys; tex[3][1] = glt->glt_t; } else { tex[1][0] = gi->gi_border_left; tex[2][0] = glt->glt_xs - gi->gi_border_right; tex[0][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_LEFT ? 0.0f : tex[1][0]; tex[3][0] = gi->gi_bitmap_flags & GLW_IMAGE_BORDER_RIGHT ? glt->glt_xs : tex[2][0]; tex[0][1] = 0.0f; tex[1][1] = gi->gi_border_top; tex[2][1] = glt->glt_ys - gi->gi_border_bottom; tex[3][1] = glt->glt_ys; } if(gi->gi_bitmap_flags & GLW_IMAGE_ASPECT_FIXED_BORDERS) { BL = rc->rc_height * gi->gi_border_left / glt->glt_ys; BR = rc->rc_height * gi->gi_border_right / glt->glt_ys; gi->gi_border_left_afix = BL; gi->gi_border_right_afix = BR; update_box(gi); } else { BL = gi->gi_border_left; BR = gi->gi_border_right; } vex[0][0] = GLW_MIN(-1.0f + 2.0f * (gi->gi_margin_left + gi->gi_automargin_left) / rc->rc_width, 0.0f); vex[1][0] = GLW_MIN(-1.0f + 2.0f * (BL + gi->gi_margin_left + gi->gi_automargin_left) / rc->rc_width, 0.0f); vex[2][0] = GLW_MAX( 1.0f - 2.0f * (BR + gi->gi_margin_right + gi->gi_automargin_right) / rc->rc_width, 0.0f); vex[3][0] = GLW_MAX( 1.0f - 2.0f * (gi->gi_margin_right + gi->gi_automargin_right) / rc->rc_width, 0.0f); vex[0][1] = GLW_MAX( 1.0f - 2.0f * (gi->gi_margin_top + gi->gi_automargin_top) / rc->rc_height, 0.0f); vex[1][1] = GLW_MAX( 1.0f - 2.0f * (gi->gi_border_top + gi->gi_margin_top + gi->gi_automargin_top) / rc->rc_height, 0.0f); vex[2][1] = GLW_MIN(-1.0f + 2.0f * (gi->gi_border_bottom + gi->gi_margin_bottom + gi->gi_automargin_bottom) / rc->rc_height, 0.0f); vex[3][1] = GLW_MIN(-1.0f + 2.0f * (gi->gi_margin_bottom + gi->gi_automargin_bottom) / rc->rc_height, 0.0f); for(y = 0; y < 4; y++) { for(x = 0; x < 4; x++) { glw_renderer_vtx_pos(&gi->gi_gr, i, vex[x][0], vex[y][1], 0.0f); glw_renderer_vtx_st (&gi->gi_gr, i, tex[x][0], tex[y][1]); i++; } } }
static void glw_slideshow_layout(glw_t *w, const glw_rctx_t *rc) { glw_root_t *gr = w->glw_root; glw_slideshow_t *s = (glw_slideshow_t *)w; glw_t *c, *p, *n; float delta; int r = 0; glw_reset_screensaver(w->glw_root); delta = s->w.glw_root->gr_frameduration / (float)s->transition_time; if((c = s->w.glw_focused) == NULL) { c = s->w.glw_focused = glw_first_widget(&s->w); if(c) glw_copy_constraints(&s->w, c); } if(c == NULL) return; glw_schedule_refresh(gr, s->deadline); if(s->deadline <= gr->gr_frame_start) { s->deadline = gr->gr_frame_start + s->display_time; c = glw_next_widget(c); if(c == NULL) c = glw_first_widget(&s->w); if(c != NULL) { glw_focus_open_path_close_all_other(c); glw_copy_constraints(&s->w, c); } } glw_layout0(c, rc); r |= update_parent_alpha(c, GLW_MIN(c->glw_parent_alpha + delta, 1.0f)); /** * Keep previous and next images 'hot' (ie, loaded into texture memory) */ p = glw_prev_widget(c); if(p == NULL) p = glw_last_widget(&s->w, 0); if(p != NULL && p != c) { r |= update_parent_alpha(p, GLW_MAX(p->glw_parent_alpha - delta, 0.0f)); glw_layout0(p, rc); } n = glw_next_widget(c); if(n == NULL) n = glw_first_widget(&s->w); if(n != NULL && n != c) { r |= update_parent_alpha(n, GLW_MAX(n->glw_parent_alpha - delta, 0.0f)); glw_layout0(n, rc); } if(r) glw_need_refresh(w->glw_root, 0); }