static void _button_set_uniforms() { float btn_size[2] = {button_shader.uniform.btn_size.x, button_shader.uniform.btn_size.y}; glUniform2fv(glGetUniformLocation(button_shader.shader.program, "btn_size"), 1, btn_size); glUniform1f(glGetUniformLocation(button_shader.shader.program, "radius"), button_shader.uniform.radius); SET_COLOUR(&button_shader); GLint location = 0; if(!location){ location = glGetUniformLocation(button_shader.shader.program, "bg_colour"); } float bg_colour[4] = {0.0, 0.0, 0.0, ((float)(button_shader.uniform.bg_colour & 0xff)) / 0x100}; agl_rgba_to_float(button_shader.uniform.bg_colour, &bg_colour[0], &bg_colour[1], &bg_colour[2]); glUniform4fv(location, 1, bg_colour); location = 0; if(!location){ location = glGetUniformLocation(button_shader.shader.program, "fill_colour"); } float fill_colour[4] = {0.0, 0.0, 0.0, ((float)(button_shader.uniform.fill_colour & 0xff)) / 0x100}; agl_rgba_to_float(button_shader.uniform.fill_colour, &fill_colour[0], &fill_colour[1], &fill_colour[2]); glUniform4fv(location, 1, fill_colour); }
/* Set link style variables */ void set_link_vars(void) { SET_BOOL(link_dashed); SET_BOOL(link_spline); SET_COLOUR(link_colour); SET_COLOUR(link_text_colour); SET_FONT(link_text_font); SET_FONTSIZE(link_text_fontsize); SET_REAL(link_arrow_size); SET_REAL(link_line_width); SET_STRING(link_inout_string); SET_STRING(link_updown_string); }
static void _circle_set_uniforms() { float centre[2] = {circle_shader.uniform.centre.x, circle_shader.uniform.centre.y}; glUniform2fv(glGetUniformLocation(circle_shader.shader.program, "centre"), 1, centre); glUniform1f(glGetUniformLocation(circle_shader.shader.program, "radius"), circle_shader.uniform.radius); SET_COLOUR(&circle_shader); GLint location = 0; if(!location){ location = glGetUniformLocation(circle_shader.shader.program, "bg_colour"); } float bg_colour[4] = {0.0, 0.0, 0.0, ((float)(circle_shader.uniform.bg_colour & 0xff)) / 0x100}; agl_rgba_to_float(circle_shader.uniform.bg_colour, &bg_colour[0], &bg_colour[1], &bg_colour[2]); glUniform4fv(location, 1, bg_colour); }
static void _scrollbar_set_uniforms(ScrollbarShader* scrollbar_shader) { float centre1[2] = {scrollbar_shader->uniform.centre1.x, scrollbar_shader->uniform.centre1.y}; float centre2[2] = {scrollbar_shader->uniform.centre2.x, scrollbar_shader->uniform.centre2.y}; glUniform2fv(glGetUniformLocation(scrollbar_shader->shader.program, "centre1"), 1, centre1); glUniform2fv(glGetUniformLocation(scrollbar_shader->shader.program, "centre2"), 1, centre2); glUniform1f(glGetUniformLocation(scrollbar_shader->shader.program, "radius"), scrollbar_shader->uniform.radius); SET_COLOUR(scrollbar_shader); GLint location = 0; if(!location){ location = glGetUniformLocation(scrollbar_shader->shader.program, "bg_colour"); } float bg_colour[4] = {0.0, 0.0, 0.0, ((float)(scrollbar_shader->uniform.bg_colour & 0xff)) / 0x100}; agl_rgba_to_float(scrollbar_shader->uniform.bg_colour, &bg_colour[0], &bg_colour[1], &bg_colour[2]); glUniform4fv(location, 1, bg_colour); }
/* Set map style variables */ void set_map_vars(void) { SET_BOOL(show_page_border); SET_BOOL(show_page_title); SET_BOOL(show_map_border); SET_BOOL(show_map_title); SET_BOOL(show_tags); SET_COLOUR(map_background_colour); SET_COLOUR(map_border_colour); SET_COLOUR(map_title_colour); SET_COLOUR(page_background_colour); SET_COLOUR(page_border_colour); SET_COLOUR(page_title_colour); SET_FONT(map_title_font); SET_FONT(page_title_font); SET_REAL(font_scale); font_scale = V_MAX(font_scale, 0.1); SET_REAL(page_margin); SET_FONTSIZE(map_title_fontsize); SET_FONTSIZE(page_title_fontsize); SET_STRING(page_size); if (!get_papersize(page_size, &page_width, &page_height)) fatal("invalid paper size: %s", page_size); if (VAR_DEF("page_width")) SET_REAL(page_width); if (VAR_DEF("page_height")) SET_REAL(page_height); SET_REAL(room_size); room_size = V_MAX(room_size, 0.1); SET_REAL(room_width); SET_REAL(room_height); }
/* Set room style variables */ void set_room_vars(void) { SET_BOOL(room_border_dashed); SET_BOOL(show_items); SET_COLOUR(item_text_colour); SET_COLOUR(room_border_colour); SET_COLOUR(room_colour); SET_COLOUR(room_exit_colour); SET_COLOUR(room_shadow_colour); SET_COLOUR(room_text_colour); SET_FONT(item_text_font); SET_FONT(room_text_font); SET_FONTSIZE(item_text_fontsize); SET_FONTSIZE(room_text_fontsize); SET_REAL(room_border_width); SET_REAL(room_exit_width); SET_REAL(room_shadow_xoff); SET_REAL(room_shadow_yoff); }
static void fix_unbalance_down(ptst_t *ptst, node_t *x) { /* WN == W_NEAR, WF == W_FAR (W_FAR is further, in key space, from X). */ qnode_t x_qn, w_qn, p_qn, g_qn, wn_qn, wf_qn; node_t *w, *p, *g, *wn, *wf; int done = 0; do { if ( !IS_UNBALANCED(x->v) || IS_GARBAGE(x) ) return; p = x->p; g = p->p; mcs_lock(&g->lock, &g_qn); if ( !ADJACENT(g, p) || IS_UNBALANCED(g->v) || IS_GARBAGE(g) ) goto unlock_g; mcs_lock(&p->lock, &p_qn); if ( !ADJACENT(p, x) || IS_UNBALANCED(p->v) ) goto unlock_pg; mcs_lock(&x->lock, &x_qn); if ( !IS_BLACK(x->v) || !IS_UNBALANCED(x->v) ) { done = 1; goto unlock_xpg; } if ( IS_ROOT(x) ) { x->v = MK_BALANCED(x->v); done = 1; goto unlock_xpg; } w = (x == p->l) ? p->r : p->l; mcs_lock(&w->lock, &w_qn); if ( IS_UNBALANCED(w->v) ) { if ( IS_BLACK(w->v) ) { /* Funky relaxed rules to the rescue. */ x->v = MK_BALANCED(x->v); w->v = MK_BALANCED(w->v); if ( IS_BLACK(p->v) ) { p->v = MK_UNBALANCED(p->v); done = 2; } else { p->v = MK_BLACK(p->v); done = 1; } } goto unlock_wxpg; } assert(!IS_LEAF(w)); if ( x == p->l ) { wn = w->l; wf = w->r; } else { wn = w->r; wf = w->l; } mcs_lock(&wn->lock, &wn_qn); /* Hanke has an extra relaxed transform here. It's not needed. */ if ( IS_UNBALANCED(wn->v) ) goto unlock_wnwxpg; mcs_lock(&wf->lock, &wf_qn); if ( IS_UNBALANCED(wf->v) ) goto unlock_wfwnwxpg; if ( IS_RED(w->v) ) { /* Case 1. Rotate at parent. */ assert(IS_BLACK(p->v) && IS_BLACK(wn->v) && IS_BLACK(wf->v)); w->v = MK_BLACK(w->v); p->v = MK_RED(p->v); if ( x == p->l ) left_rotate(ptst, p); else right_rotate(ptst, p); goto unlock_wfwnwxpg; } if ( IS_BLACK(wn->v) && IS_BLACK(wf->v) ) { if ( IS_RED(p->v) ) { /* Case 2. Simple recolouring. */ p->v = MK_BLACK(p->v); done = 1; } else { /* Case 5. Simple recolouring. */ p->v = MK_UNBALANCED(p->v); done = 2; } w->v = MK_RED(w->v); x->v = MK_BALANCED(x->v); goto unlock_wfwnwxpg; } if ( x == p->l ) { if ( IS_RED(wf->v) ) { /* Case 3. Single rotation. */ wf->v = MK_BLACK(wf->v); w->v = SET_COLOUR(w->v, GET_COLOUR(p->v)); p->v = MK_BLACK(p->v); x->v = MK_BALANCED(x->v); left_rotate(ptst, p); } else { /* Case 4. Double rotation. */ assert(IS_RED(wn->v)); wn->v = SET_COLOUR(wn->v, GET_COLOUR(p->v)); p->v = MK_BLACK(p->v); x->v = MK_BALANCED(x->v); right_rotate(ptst, w); left_rotate(ptst, p); } } else /* SYMMETRIC CASE: X == P->R */ { if ( IS_RED(wf->v) ) { /* Case 3. Single rotation. */ wf->v = MK_BLACK(wf->v); w->v = SET_COLOUR(w->v, GET_COLOUR(p->v)); p->v = MK_BLACK(p->v); x->v = MK_BALANCED(x->v); right_rotate(ptst, p); } else { /* Case 4. Double rotation. */ assert(IS_RED(wn->v)); wn->v = SET_COLOUR(wn->v, GET_COLOUR(p->v)); p->v = MK_BLACK(p->v); x->v = MK_BALANCED(x->v); left_rotate(ptst, w); right_rotate(ptst, p); } } done = 1; unlock_wfwnwxpg: mcs_unlock(&wf->lock, &wf_qn); unlock_wnwxpg: mcs_unlock(&wn->lock, &wn_qn); unlock_wxpg: mcs_unlock(&w->lock, &w_qn); unlock_xpg: mcs_unlock(&x->lock, &x_qn); unlock_pg: mcs_unlock(&p->lock, &p_qn); unlock_g: mcs_unlock(&g->lock, &g_qn); if ( done == 2 ) { x = p; done = 0; } } while ( !done ); }
static void _fix_after_insertion(ptst_t *ptst, stm_tx *tx, stm_blk *sb, stm_blk *xb, node_t *x) { stm_blk *pb, *gpb, *yb, *lub; node_t *p, *gp, *y; SET_COLOUR(x, RED); // rebalance tree set_t * s = (set_t*)READ_OBJ(sb); while (xb != NULL && GET_PARENT(x) != NULL) { pb = GET_PARENT(x); p = READ_OBJ(pb); if (IS_BLACK(p)) // case 2 - parent is black break; gpb = GET_PARENT(p); gp = READ_OBJ(gpb); lub = GET_LEFT(gp); if (pb == lub) { // parent is red, p=GET_LEFT(g) yb = GET_RIGHT(gp); // y (uncle) y = READ_OBJ(yb); if (IS_RED(y)) { // case 3 - parent is red, uncle is red (p = GET_LEFT(gp)) p = WRITE_OBJ(pb); y = WRITE_OBJ(yb); gp = WRITE_OBJ(gpb); SET_COLOUR(p, BLACK); SET_COLOUR(y, BLACK); SET_COLOUR(gp, RED); xb = gpb; x = gp; } else { // parent is red, uncle is black (p = GET_LEFT(gp)) if ( xb == GET_RIGHT(p) ) { // case 4 - parent is red, uncle is black, x = GET_RIGHT(p), p = GET_LEFT(gp) xb = pb; x = WRITE_OBJ(pb); _left_rotate(ptst, tx, sb, xb, x); pb=GET_PARENT(x); } // case 5 - parent is red, uncle is black, x = GET_LEFT(p), p = GET_LEFT(gp) p = WRITE_OBJ(pb); gpb = GET_PARENT(p); gp = WRITE_OBJ(gpb); SET_COLOUR(p, BLACK); SET_COLOUR(gp, RED); if (gp != NULL) { _right_rotate(ptst, tx, sb, gpb, gp); } } } else { // parent is red, p = GET_RIGHT(gp) yb = lub; y = READ_OBJ(yb); if (IS_RED(y)) { // case 3 - parent is red, uncle is red (p = GET_RIGHT(gp)) p = WRITE_OBJ(pb); y = WRITE_OBJ(yb); gp = WRITE_OBJ(gpb); SET_COLOUR(p, BLACK); SET_COLOUR(y, BLACK); SET_COLOUR(gp, RED); xb = gpb; x = gp; } else { // parent is red, uncle is black (p = GET_RIGHT(gp)) if ( xb == GET_LEFT(p) ) { // case 4 - parent is red, uncle is black, x = GET_LEFT(p), p = GET_RIGHT(gp) xb = pb; x = WRITE_OBJ(pb); _right_rotate(ptst, tx, sb, xb, x); pb = GET_PARENT(x); } // case 5 - parent is red, uncle is black, x = GET_RIGHT(p), p = GET_RIGHT(gp) p = WRITE_OBJ(pb); gpb = GET_PARENT(p); gp = WRITE_OBJ(gpb); SET_COLOUR(p, BLACK); SET_COLOUR(gp, RED); if(gp != NULL) { _left_rotate(ptst, tx, sb, gpb, gp); } } } } s = (set_t*)READ_OBJ(sb); stm_blk * rob = GET_ROOT(s); node_t * ro = READ_OBJ(rob); if (IS_RED(ro)) { ro = WRITE_OBJ(rob); SET_COLOUR(ro,BLACK); } }
static void _fix_after_deletion(ptst_t *ptst, stm_tx *tx, stm_blk *sb, stm_blk *xb, node_t *x) { stm_blk *pb, *plb, *sibb, *siblb, *sibrb; node_t *p, *sib, *sibl, *sibr; set_t *s; while (GET_PARENT(x)!=NULL && IS_BLACK(x)) { pb = GET_PARENT(x); p = WRITE_OBJ(pb); plb = GET_LEFT(p); if ( xb == plb ) { sibb = GET_RIGHT(p); sib = WRITE_OBJ(sibb); if (IS_RED(sib)) { SET_COLOUR(sib, BLACK); SET_COLOUR(p, RED); _left_rotate(ptst, tx, sb, pb, p); pb = GET_PARENT(x); p=WRITE_OBJ(pb); sibb = GET_RIGHT(p); sib = WRITE_OBJ(sibb); } siblb = GET_LEFT(sib); sibl = READ_OBJ(siblb); sibrb = GET_RIGHT(sib); sibr = READ_OBJ(sibrb); if (IS_BLACK(sibl) && IS_BLACK(sibr)) { SET_COLOUR(sib, RED); xb = GET_PARENT(x); x = WRITE_OBJ(xb); } else { if (IS_BLACK(sibr)) { sibl = WRITE_OBJ(siblb); SET_COLOUR(sibl, BLACK); SET_COLOUR(sib,RED); _right_rotate(ptst, tx, sb, sibb, sib); pb = GET_PARENT(x); p = WRITE_OBJ(pb); sibb = GET_RIGHT(p); } sib = WRITE_OBJ(sibb); SET_COLOUR(sib, GET_COLOUR(p)); p = WRITE_OBJ(pb); SET_COLOUR(p, BLACK); sibrb = GET_RIGHT(sib); sibr = WRITE_OBJ(sibrb); SET_COLOUR(sibr, BLACK); _left_rotate(ptst, tx, sb, pb, p); s = (set_t*)READ_OBJ(sb); xb = GET_ROOT(s); x = WRITE_OBJ(xb); break; } } else { // inverse sibb = plb; sib = WRITE_OBJ(sibb); if (IS_RED(sib)) { SET_COLOUR(sib, BLACK); SET_COLOUR(p, RED); _right_rotate(ptst, tx, sb, pb, p); pb = GET_PARENT(x); p=WRITE_OBJ(pb); sibb = GET_LEFT(p); sib = WRITE_OBJ(sibb); } siblb = GET_LEFT(sib); sibl = READ_OBJ(siblb); sibrb = GET_RIGHT(sib); sibr = READ_OBJ(sibrb); if (IS_BLACK(sibl) && IS_BLACK(sibr)) { SET_COLOUR(sib, RED); xb = GET_PARENT(x); x = WRITE_OBJ(xb); } else { if (IS_BLACK(sibl)) { sibr = WRITE_OBJ(sibrb); SET_COLOUR(sibr, BLACK); SET_COLOUR(sib, RED); _left_rotate(ptst, tx, sb, sibb, sib); pb = GET_PARENT(x); p = WRITE_OBJ(pb); sibb = GET_LEFT(p); } sib = WRITE_OBJ(sibb); SET_COLOUR(sib, GET_COLOUR(p)); p = WRITE_OBJ(pb); SET_COLOUR(p, BLACK); siblb = GET_LEFT(sib); sibl = WRITE_OBJ(siblb); SET_COLOUR(sibl, BLACK); _right_rotate(ptst, tx, sb, pb, p); s = (set_t*)READ_OBJ(sb); xb = GET_ROOT(s); x = WRITE_OBJ(xb); break; } } } if(IS_RED(x)) { SET_COLOUR(x, BLACK); } }//fix_after_deletion