int check_ui_object_clipped (ui_object *obj) { int flag; ui_object *parent; float x1, x2, y1, y2, x_min, y_min, x_max, y_max, old_vp_x1, old_vp_y1, old_vp_x2, old_vp_y2; old_vp_x1 = active_viewport.x_min; old_vp_y1 = active_viewport.y_min; old_vp_x2 = active_viewport.x_max; old_vp_y2 = active_viewport.y_max; parent = get_ui_object_parent (obj); ASSERT (parent); x1 = get_ui_object_x (parent); y1 = get_ui_object_y (parent); x2 = x1 + get_ui_object_x_size (parent); y2 = y1 + get_ui_object_y_size (parent); x_min = get_ui_object_x (obj); y_min = get_ui_object_y (obj); x_max = x_min + get_ui_object_x_size (obj); y_max = y_min + get_ui_object_y_size (obj); set_viewport (x1, y1, x2, y2); flag = ui_clip_area (&x_min, &y_min, &x_max, &y_max); set_viewport (old_vp_x1, old_vp_y1, old_vp_x2, old_vp_y2); return flag; }
static void update_vslider_ui_object (ui_object *obj) { float parent_x1, parent_y1, parent_x2, parent_y2, parent_x_origin, parent_y_origin; float x1, y1, x2, y2; ui_object *parent; area_ui_object *area; float old_viewport_x1, old_viewport_y1, old_viewport_x2, old_viewport_y2; // store parents viewport data old_viewport_x1 = active_viewport.x_min; old_viewport_y1 = active_viewport.y_min; old_viewport_x2 = active_viewport.x_max; old_viewport_y2 = active_viewport.y_max; area = (area_ui_object *) obj->data; // store parents viewport data parent = get_ui_object_parent (obj); parent_x_origin = get_ui_object_x_origin (parent); parent_y_origin = get_ui_object_y_origin (parent); parent_x1 = get_ui_object_x (parent); parent_y1 = get_ui_object_y (parent); parent_x2 = parent_x1 + get_ui_object_x_size (parent); parent_y2 = parent_y1 + get_ui_object_y_size (parent); recalculate_slider_size (obj); if (area->drawable) { ui_set_origin (0, 0); draw_ui_object (obj); if (area->child) { x1 = get_ui_object_x (obj); y1 = get_ui_object_y (obj); x2 = x1 + get_ui_object_x_size (obj); y2 = y1 + get_ui_object_y_size (obj); ui_clip_area (&x1, &y1, &x2, &y2); set_viewport (x1, y1, x2, y2); ui_set_origin (0, 0); update_ui_object (area->child); } } set_viewport (old_viewport_x1, old_viewport_y1, old_viewport_x2, old_viewport_y2); if (area->next) { parent = get_ui_object_parent (obj); if (parent) { set_viewport (parent_x1, parent_y1, parent_x2, parent_y2); ui_set_origin (parent_x_origin, parent_y_origin); } update_ui_object (area->next); } }
static void update_mslider_ui_object (ui_object *obj) { float parent_x1, parent_y1, parent_x2, parent_y2, parent_x_origin, parent_y_origin; float min, max, x1, y1, x2, y2; ui_object *object_to_slide, *parent; area_ui_object *area; float old_viewport_x1, old_viewport_y1, old_viewport_x2, old_viewport_y2; // store parents viewport data old_viewport_x1 = active_viewport.x_min; old_viewport_y1 = active_viewport.y_min; old_viewport_x2 = active_viewport.x_max; old_viewport_y2 = active_viewport.y_max; area = obj->data; // Scroll if required if (scroll) { min = get_ui_object_slider_min (obj); max = get_ui_object_slider_max (obj); object_to_slide = get_ui_object_next (obj); scroll_slider (object_to_slide, min, max, scroll); } // store parents viewport data parent = get_ui_object_parent (obj); parent_x_origin = get_ui_object_x_origin (parent); parent_y_origin = get_ui_object_y_origin (parent); parent_x1 = get_ui_object_x (parent); parent_y1 = get_ui_object_y (parent); parent_x2 = parent_x1 + get_ui_object_x_size (parent); parent_y2 = parent_y1 + get_ui_object_y_size (parent); if (area->drawable) { ui_set_origin (0, 0); draw_ui_object (obj); if (area->child) { x1 = get_ui_object_x (obj); y1 = get_ui_object_y (obj); x2 = x1 + get_ui_object_x_size (obj); y2 = y1 + get_ui_object_y_size (obj); ui_clip_area (&x1, &y1, &x2, &y2); set_viewport (x1, y1, x2, y2); ui_set_origin (0, 0); update_ui_object (area->child); } } if (area->next) { parent = get_ui_object_parent (obj); if (parent) { set_viewport (parent_x1, parent_y1, parent_x2, parent_y2); ui_set_origin (parent_x_origin, parent_y_origin); } update_ui_object (area->next); } set_viewport (old_viewport_x1, old_viewport_y1, old_viewport_x2, old_viewport_y2); }
static void update_menu_ui_object (ui_object *obj) { float x1, y1, x2, y2, parent_x1, parent_y1, parent_x2, parent_y2, grand_parent_x_origin = 0.0, grand_parent_y_origin = 0.0; ui_object *stack_head, *grand_parent, *parent; area_ui_object *area; area = obj->data; // store parents viewport data parent = get_ui_object_parent (obj); grand_parent = get_ui_object_parent (parent); if (parent) { if (grand_parent) { grand_parent_x_origin = get_ui_object_x_origin (grand_parent); grand_parent_y_origin = get_ui_object_y_origin (grand_parent); } ui_set_origin (grand_parent_x_origin, grand_parent_y_origin); parent_x1 = get_ui_object_x (parent); parent_y1 = get_ui_object_y (parent); parent_x2 = parent_x1 + get_ui_object_x_size (parent); parent_y2 = parent_y1 + get_ui_object_y_size (parent); x1 = parent_x1; y1 = parent_y1; x2 = parent_x2; y2 = parent_y2; ui_clip_area (&x1, &y1, &x2, &y2); x1 += grand_parent_x_origin; y1 += grand_parent_y_origin; x2 += grand_parent_x_origin; y2 += grand_parent_y_origin; set_viewport (x1, y1, x2, y2); } if (area->drawable) { draw_ui_object (obj); } // and its list head stack_head = obj->stack_head; if (stack_head) { parent = get_ui_object_parent (stack_head); grand_parent = get_ui_object_parent (parent); if (parent) { if (grand_parent) { grand_parent_x_origin = get_ui_object_x_origin (grand_parent); grand_parent_y_origin = get_ui_object_y_origin (grand_parent); } ui_set_origin (grand_parent_x_origin, grand_parent_y_origin); parent_x1 = get_ui_object_x (parent); parent_y1 = get_ui_object_y (parent); parent_x2 = parent_x1 + get_ui_object_x_size (parent); parent_y2 = parent_y1 + get_ui_object_y_size (parent); x1 = parent_x1; y1 = parent_y1; x2 = parent_x2; y2 = parent_y2; ui_clip_area (&x1, &y1, &x2, &y2); x1 += grand_parent_x_origin; y1 += grand_parent_y_origin; x2 += grand_parent_x_origin; y2 += grand_parent_y_origin; set_viewport (x1, y1, x2, y2); } if (area->drawable) { draw_ui_object (stack_head); } } // list head end if (area->next) { parent = get_ui_object_parent (obj); grand_parent = get_ui_object_parent (parent); if (parent) { if (grand_parent) { grand_parent_x_origin = get_ui_object_x_origin (grand_parent); grand_parent_y_origin = get_ui_object_y_origin (grand_parent); } ui_set_origin (grand_parent_x_origin, grand_parent_y_origin); parent_x1 = get_ui_object_x (parent); parent_y1 = get_ui_object_y (parent); parent_x2 = parent_x1 + get_ui_object_x_size (parent); parent_y2 = parent_y1 + get_ui_object_y_size (parent); x1 = parent_x1; y1 = parent_y1; x2 = parent_x2; y2 = parent_y2; x1 += grand_parent_x_origin; y1 += grand_parent_y_origin; x2 += grand_parent_x_origin; y2 += grand_parent_y_origin; set_viewport (x1, y1, x2, y2); parent_x1 += get_ui_object_x_origin (parent); parent_y1 += get_ui_object_y_origin (parent); ui_set_origin (parent_x1, parent_y1); } update_ui_object (area->next); } }
void ui_draw_button (float x1, float y1, float x2, float y2, int state) { float new_x1, new_y1, new_x2, new_y2; int int_x1, int_y1, int_x2, int_y2; rgb_colour background_colour, top_line_colour, bottom_line_colour, left_line_colour, right_line_colour, top_left_pixel_colour, bottom_left_pixel_colour, top_right_pixel_colour, bottom_right_pixel_colour; x1 -= ui_x_origin; y1 -= ui_y_origin; x2 -= ui_x_origin; y2 -= ui_y_origin; new_x1 = x1; new_y1 = y1; new_x2 = x2; new_y2 = y2; // clip button to ui viewport ui_clip_area (&new_x1, &new_y1, &new_x2, &new_y2); // button coords should be in viewport coords, // so add ui_origin to convert into screen coords x1 += ui_x_origin; y1 += ui_y_origin; x2 += ui_x_origin; y2 += ui_y_origin; new_x1 += ui_x_origin; new_y1 += ui_y_origin; new_x2 += ui_x_origin; new_y2 += ui_y_origin; // check if possible to draw if ((new_x2 - new_x1 < 2) || (new_y2 - new_y1 <= 2)) { return; } // convert variabless to ints to save crap conversion convert_float_to_int (new_x1, &int_x1); convert_float_to_int (new_y1, &int_y1); convert_float_to_int (new_x2, &int_x2); convert_float_to_int (new_y2, &int_y2); // assign correct colours switch (state) { case UI_OBJECT_STATE_ON: { background_colour = ui_button_down_background; top_line_colour = ui_button_down_dark_edge; bottom_line_colour = ui_button_down_light_edge; left_line_colour = ui_button_down_dark_edge; right_line_colour = ui_button_down_light_edge; top_left_pixel_colour = ui_button_down_dark_edge; bottom_left_pixel_colour = ui_button_down_light_edge; top_right_pixel_colour = ui_button_down_light_edge; bottom_right_pixel_colour = ui_button_down_light_edge; break; } case UI_OBJECT_STATE_OFF: { background_colour = ui_button_up_background; top_line_colour = ui_button_up_light_edge; bottom_line_colour = ui_button_up_dark_edge; left_line_colour = ui_button_up_light_edge; right_line_colour = ui_button_up_dark_edge; top_left_pixel_colour = ui_button_up_light_edge; bottom_left_pixel_colour = ui_button_up_light_edge; top_right_pixel_colour = ui_button_up_light_edge; bottom_right_pixel_colour = ui_button_up_dark_edge; break; } case UI_OBJECT_STATE_HIGHLIGHTED: { background_colour = ui_button_highlighted_background; top_line_colour = ui_button_highlighted_light_edge; bottom_line_colour = ui_button_highlighted_dark_edge; left_line_colour = ui_button_highlighted_light_edge; right_line_colour = ui_button_highlighted_dark_edge; top_left_pixel_colour = ui_button_highlighted_light_edge; bottom_left_pixel_colour = ui_button_highlighted_light_edge; top_right_pixel_colour = ui_button_highlighted_light_edge; bottom_right_pixel_colour = ui_button_highlighted_dark_edge; break; } } // draw background if (x1 != new_x1) { if (y1 != new_y1) { set_block (int_x1, int_y1, int_x2, int_y2, background_colour); } else { set_block (int_x1, int_y1 + 1, int_x2, int_y2, background_colour); } } else if (y1 != new_y1) { set_block (int_x1 + 1 , int_y1, int_x2, int_y2, background_colour); } else { set_block (int_x1 + 1 , int_y1 + 1, int_x2 - 1, int_y2 - 1, background_colour); } // draw top line if (y1 == new_y1) { if ((x1 == new_x1) && (x2 == new_x2)) { draw_line (new_x1 + 2, new_y1, new_x2 - 2, new_y1, top_line_colour); } else if (x1 == new_x1) { draw_line (new_x1 + 2, new_y1, new_x2, new_y1, top_line_colour); } else if (x2 == new_x2) { draw_line (new_x1, new_y1, new_x2 - 2, new_y1, top_line_colour); } else { draw_line (new_x1, new_y1, new_x2, new_y1, top_line_colour); } } // draw botton line if (y2 == new_y2) { if ((x1 == new_x1) && (x2 == new_x2)) { draw_line (new_x1 + 2, new_y2, new_x2 - 2, new_y2, bottom_line_colour); } else if (x1 == new_x1) { draw_line (new_x1 + 2, new_y2, new_x2, new_y2, bottom_line_colour); } else if (x2 == new_x2) { draw_line (new_x1, new_y2, new_x2 - 2, new_y2, bottom_line_colour); } else { draw_line (new_x1, new_y2, new_x2, new_y2, bottom_line_colour); } } // draw left side if (x1 == new_x1) { if ((y1 == new_y1) && (y2 == new_y2)) { draw_line (new_x1, new_y1 + 2, new_x1, new_y2 - 2, left_line_colour); } else if (y1 == new_y1) { draw_line (new_x1, new_y1 + 2, new_x1, new_y2, left_line_colour); } else if (y2 == new_y2) { draw_line (new_x1, new_y1, new_x1, new_y2 - 2, left_line_colour); } else { draw_line (new_x1, new_y1, new_x1, new_y2, left_line_colour); } } // draw right side if (x2 == new_x2) { if ((y1 == new_y1) && (y2 == new_y2)) { draw_line (new_x2, new_y1 + 2, new_x2, new_y2 - 2, right_line_colour); } else if (y1 == new_y1) { draw_line (new_x2, new_y1 + 2, new_x2, new_y2, right_line_colour); } else if (y2 == new_y2) { draw_line (new_x2, new_y1, new_x2, new_y2 - 2, right_line_colour); } else { draw_line (new_x2, new_y1, new_x2, new_y2, right_line_colour); } } // draw odd pixels in corners if (x1 == new_x1) { // top left if (y1 == new_y1) { set_pixel (int_x1 + 1, int_y1 + 1, top_left_pixel_colour); } // bottom left if (y2 == new_y2) { set_pixel (int_x1 + 1, int_y2 - 1, bottom_left_pixel_colour); } } if (x2 == new_x2) { // top right if (y1 == new_y1) { set_pixel (int_x2 - 1, int_y1 + 1, top_right_pixel_colour); } // bottom right if (y2 == new_y2) { set_pixel (int_x2 - 1, int_y2 - 1, bottom_right_pixel_colour); } } }
void ui_draw_area (float x1, float y1, float x2, float y2, ui_object *obj) { float new_x1, new_y1, new_x2, new_y2; int state, int_x1, int_y1, int_x2, int_y2; rgb_colour background_colour, top_line_colour, bottom_line_colour, left_line_colour, right_line_colour; state = get_ui_object_state (obj); new_x1 = x1; new_y1 = y1; new_x2 = x2; new_y2 = y2; // clip area to ui viewport ui_clip_area (&new_x1, &new_y1, &new_x2, &new_y2); ui_clip_area (&x1, &y1, &x2, &y2); // button coords should be in viewport coords, // so add ui_origin to convert into screen coords x1 += ui_x_origin; y1 += ui_y_origin; x2 += ui_x_origin; y2 += ui_y_origin; new_x1 += ui_x_origin; new_y1 += ui_y_origin; new_x2 += ui_x_origin; new_y2 += ui_y_origin; // check if possible to draw if ((new_x2 - new_x1 < 2) || (new_y2 - new_y1 <= 2)) { return; } // convert variabless to ints to save crap conversion convert_float_to_int (new_x1, &int_x1); convert_float_to_int (new_y1, &int_y1); convert_float_to_int (new_x2, &int_x2); convert_float_to_int (new_y2, &int_y2); // assign correct colours switch (state) { case UI_OBJECT_STATE_ON: case UI_OBJECT_STATE_OFF: { background_colour = get_ui_object_colour (obj); //ui_area_background; top_line_colour = ui_area_light_edge; bottom_line_colour = ui_area_dark_edge; left_line_colour = ui_area_light_edge; right_line_colour = ui_area_dark_edge; break; } case UI_OBJECT_STATE_HIGHLIGHTED: { background_colour = get_ui_object_highlighted_colour (obj); // ui_area_highlighted_background; top_line_colour = ui_area_highlighted_light_edge; bottom_line_colour = ui_area_highlighted_dark_edge; left_line_colour = ui_area_highlighted_light_edge; right_line_colour = ui_area_highlighted_dark_edge; break; } } // draw background if (x1 != new_x1) { if (y1 != new_y1) { set_block (int_x1, int_y1, int_x2, int_y2, background_colour); } else { set_block (int_x1, int_y1 + 1, int_x2, int_y2, background_colour); } } else if (y1 != new_y1) { set_block (int_x1 + 1 , int_y1, int_x2, int_y2, background_colour); } else { set_block (int_x1 + 1 , int_y1 + 1, int_x2, int_y2, background_colour); } // draw top line if (y1 == new_y1) { if ((x1 == new_x1) && (x2 == new_x2)) { draw_line (new_x1 + 1, new_y1, new_x2 - 1, new_y1, top_line_colour); } else if (x1 == new_x1) { draw_line (new_x1 + 1, new_y1, new_x2, new_y1, top_line_colour); } else if (x2 == new_x2) { draw_line (new_x1, new_y1, new_x2 - 1, new_y1, top_line_colour); } else { draw_line (new_x1, new_y1, new_x2, new_y1, top_line_colour); } } // draw botton line if (y2 == new_y2) { if ((x1 == new_x1) && (x2 == new_x2)) { draw_line (new_x1 + 1, new_y2, new_x2 - 1, new_y2, bottom_line_colour); } else if (x1 == new_x1) { draw_line (new_x1 + 1, new_y2, new_x2, new_y2, bottom_line_colour); } else if (x2 == new_x2) { draw_line (new_x1, new_y2, new_x2 - 1, new_y2, bottom_line_colour); } else { draw_line (new_x1, new_y2, new_x2, new_y2, bottom_line_colour); } } // draw left side if (x1 == new_x1) { if ((y1 == new_y1) && (y2 == new_y2)) { draw_line (new_x1, new_y1 + 1, new_x1, new_y2 - 1, left_line_colour); } else if (y1 == new_y1) { draw_line (new_x1, new_y1 + 1, new_x1, new_y2, left_line_colour); } else if (y2 == new_y2) { draw_line (new_x1, new_y1, new_x1, new_y2 - 1, left_line_colour); } else { draw_line (new_x1, new_y1, new_x1, new_y2, left_line_colour); } } // draw right side if (x2 == new_x2) { if ((y1 == new_y1) && (y2 == new_y2)) { draw_line (new_x2, new_y1 + 1, new_x2, new_y2 - 1, right_line_colour); } else if (y1 == new_y1) { draw_line (new_x2, new_y1 + 1, new_x2, new_y2, right_line_colour); } else if (y2 == new_y2) { draw_line (new_x2, new_y1, new_x2, new_y2 - 1, right_line_colour); } else { draw_line (new_x2, new_y1, new_x2, new_y2, right_line_colour); } } }