static void clearlooks_glossy_draw_slider_button (cairo_t *cr, const ClearlooksColors *colors, const WidgetParameters *params, const SliderParameters *slider, int x, int y, int width, int height) { double radius = MIN (params->radius, MIN ((width - 1.0) / 2.0, (height - 1.0) / 2.0)); cairo_set_line_width (cr, 1.0); if (!slider->horizontal) ge_cairo_exchange_axis (cr, &x, &y, &width, &height); cairo_translate (cr, x, y); params->style_functions->draw_shadow (cr, colors, radius, width, height); params->style_functions->draw_slider (cr, colors, params, 1, 1, width-2, height-2); }
static void clearlooks_inverted_draw_scrollbar_slider (cairo_t *cr, const ClearlooksColors *colors, const WidgetParameters *widget, const ScrollBarParameters *scrollbar, int x, int y, int width, int height) { if (scrollbar->junction & CL_JUNCTION_BEGIN) { if (scrollbar->horizontal) { x -= 1; width += 1; } else { y -= 1; height += 1; } } if (scrollbar->junction & CL_JUNCTION_END) { if (scrollbar->horizontal) width += 1; else height += 1; } if (!scrollbar->horizontal) ge_cairo_exchange_axis (cr, &x, &y, &width, &height); cairo_translate (cr, x, y); if (scrollbar->has_color) { const CairoColor *border = &colors->shade[8]; CairoColor fill = scrollbar->color; CairoColor hilight; CairoColor shade1, shade2, shade3; cairo_pattern_t *pattern; if (widget->prelight) ge_shade_color (&fill, 1.1, &fill); cairo_set_line_width (cr, 1); ge_shade_color (&fill, 1.3, &hilight); ge_shade_color (&fill, 1.1, &shade1); ge_shade_color (&fill, 1.05, &shade2); ge_shade_color (&fill, 0.98, &shade3); pattern = cairo_pattern_create_linear (1, 1, 1, height-2); cairo_pattern_add_color_stop_rgb (pattern, 0, fill.r, fill.g, fill.b); cairo_pattern_add_color_stop_rgb (pattern, 0.5, shade3.r, shade3.g, shade3.b); cairo_pattern_add_color_stop_rgb (pattern, 0.5, shade2.r, shade2.g, shade2.b); cairo_pattern_add_color_stop_rgb (pattern, 1.0, shade1.r, shade1.g, shade1.b); cairo_rectangle (cr, 1, 1, width-2, height-2); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_set_source_rgba (cr, hilight.r, hilight.g, hilight.b, 0.5); ge_cairo_stroke_rectangle (cr, 1.5, 1.5, width-3, height-3); ge_cairo_set_color (cr, border); ge_cairo_stroke_rectangle (cr, 0.5, 0.5, width-1, height-1); } else { CairoColor border; CairoColor s1, s2, s3; cairo_pattern_t *pattern; int bar_x, i; const CairoColor *dark = &colors->shade[4]; const CairoColor *light = &colors->shade[0]; ge_shade_color(&colors->shade[6], 1.05, &border); pattern = cairo_pattern_create_linear(1, 1, 1, height-1); s1 = colors->bg[widget->state_type]; ge_shade_color(&s1, 0.95, &s2); ge_shade_color(&s1, 1.05, &s3); cairo_pattern_add_color_stop_rgb(pattern, 0, s2.r, s2.g, s2.b); cairo_pattern_add_color_stop_rgb(pattern, 1.0, s3.r, s3.g, s3.b); cairo_rectangle (cr, 1, 1, width-2, height-2); cairo_set_source(cr, pattern); cairo_fill(cr); cairo_pattern_destroy(pattern); widget->style_functions->draw_top_left_highlight (cr, &s2, widget, 1, 1, width-2, height-2, 0, widget->corners); clearlooks_set_border_gradient (cr, &border, 1.2, 0, height); ge_cairo_stroke_rectangle (cr, 0.5, 0.5, width-1, height-1); /* draw handles */ cairo_set_line_width (cr, 1); bar_x = width/2 - 4; cairo_translate(cr, 0.5, 0.5); for (i=0; i<3; i++) { cairo_move_to (cr, bar_x, 4); cairo_line_to (cr, bar_x, height-5); ge_cairo_set_color (cr, dark); cairo_stroke (cr); cairo_move_to (cr, bar_x+1, 4); cairo_line_to (cr, bar_x+1, height-5); ge_cairo_set_color (cr, light); cairo_stroke (cr); bar_x += 3; } } }
static void clearlooks_inverted_draw_progressbar_fill (cairo_t *cr, const ClearlooksColors *colors, const WidgetParameters *params, const ProgressBarParameters *progressbar, int x, int y, int width, int height, gint offset) { boolean is_horizontal = progressbar->orientation < 2; double tile_pos = 0; double stroke_width; double radius; int x_step; cairo_pattern_t *pattern; CairoColor bg_shade; CairoColor border; CairoColor shadow; CairoColor top_shade; radius = MAX (0, params->radius - params->xthickness); cairo_save (cr); if (!is_horizontal) ge_cairo_exchange_axis (cr, &x, &y, &width, &height); if ((progressbar->orientation == CL_ORIENTATION_RIGHT_TO_LEFT) || (progressbar->orientation == CL_ORIENTATION_BOTTOM_TO_TOP)) ge_cairo_mirror (cr, CR_MIRROR_HORIZONTAL, &x, &y, &width, &height); /* Clamp the radius so that the _height_ fits ... */ radius = MIN (radius, height / 2.0); stroke_width = height*2; x_step = (((float)stroke_width/10)*offset); /* This looks weird ... */ cairo_translate (cr, x, y); cairo_save (cr); /* This is kind of nasty ... Clip twice from each side in case the length * of the fill is smaller than twice the radius. */ ge_cairo_rounded_rectangle (cr, 0, 0, width + radius, height, radius, CR_CORNER_TOPLEFT | CR_CORNER_BOTTOMLEFT); cairo_clip (cr); ge_cairo_rounded_rectangle (cr, -radius, 0, width + radius, height, radius, CR_CORNER_TOPRIGHT | CR_CORNER_BOTTOMRIGHT); cairo_clip (cr); ge_shade_color (&colors->spot[1], 1.05, &top_shade); /* Draw the background gradient */ ge_shade_color (&colors->spot[1], 0.925, &bg_shade); pattern = cairo_pattern_create_linear (0, 0, 0, height); cairo_pattern_add_color_stop_rgb (pattern, 0.0, bg_shade.r, bg_shade.g, bg_shade.b); cairo_pattern_add_color_stop_rgb (pattern, 0.5, top_shade.r, top_shade.g, top_shade.b); cairo_pattern_add_color_stop_rgb (pattern, 1.0, bg_shade.r, bg_shade.g, bg_shade.b); cairo_set_source (cr, pattern); cairo_paint (cr); cairo_pattern_destroy (pattern); /* Draw the Strokes */ while (stroke_width > 0 && tile_pos <= width+x_step) { cairo_move_to (cr, stroke_width/2-x_step, 0); cairo_line_to (cr, stroke_width-x_step, 0); cairo_line_to (cr, stroke_width/2-x_step, height); cairo_line_to (cr, -x_step, height); cairo_translate (cr, stroke_width, 0); tile_pos += stroke_width; } cairo_set_source_rgba (cr, colors->spot[2].r, colors->spot[2].g, colors->spot[2].b, 0.15); cairo_fill (cr); cairo_restore (cr); /* rounded clip region */ /* inner highlight border * This is again kinda ugly. Draw once from each side, clipping away the other. */ cairo_set_source_rgba (cr, colors->spot[0].r, colors->spot[0].g, colors->spot[0].b, 0.5); /* left side */ cairo_save (cr); cairo_rectangle (cr, 0, 0, width / 2, height); cairo_clip (cr); if (progressbar->pulsing) ge_cairo_rounded_rectangle (cr, 1.5, 0.5, width + radius, height - 1, radius, CR_CORNER_TOPLEFT | CR_CORNER_BOTTOMLEFT); else ge_cairo_rounded_rectangle (cr, 0.5, 0.5, width + radius, height - 1, radius, CR_CORNER_TOPLEFT | CR_CORNER_BOTTOMLEFT); cairo_stroke (cr); cairo_restore (cr); /* clip */ /* right side */ cairo_save (cr); cairo_rectangle (cr, width / 2, 0, (width+1) / 2, height); cairo_clip (cr); if (progressbar->value < 1.0 || progressbar->pulsing) ge_cairo_rounded_rectangle (cr, -1.5 - radius, 0.5, width + radius, height - 1, radius, CR_CORNER_TOPRIGHT | CR_CORNER_BOTTOMRIGHT); else ge_cairo_rounded_rectangle (cr, -0.5 - radius, 0.5, width + radius, height - 1, radius, CR_CORNER_TOPRIGHT | CR_CORNER_BOTTOMRIGHT); cairo_stroke (cr); cairo_restore (cr); /* clip */ /* Draw the dark lines and the shadow */ cairo_save (cr); /* Again, this weird clip area. */ ge_cairo_rounded_rectangle (cr, -1.0, 0, width + radius + 2.0, height, radius, CR_CORNER_TOPLEFT | CR_CORNER_BOTTOMLEFT); cairo_clip (cr); ge_cairo_rounded_rectangle (cr, -radius - 1.0, 0, width + radius + 2.0, height, radius, CR_CORNER_TOPRIGHT | CR_CORNER_BOTTOMRIGHT); cairo_clip (cr); border = colors->spot[2]; border.a = 0.5; shadow.r = 0.0; shadow.g = 0.0; shadow.b = 0.0; shadow.a = 0.1; if (progressbar->pulsing) { /* At the beginning of the bar. */ cairo_move_to (cr, 0.5 + radius, height + 0.5); ge_cairo_rounded_corner (cr, 0.5, height + 0.5, radius + 1, CR_CORNER_BOTTOMLEFT); ge_cairo_rounded_corner (cr, 0.5, -0.5, radius + 1, CR_CORNER_TOPLEFT); ge_cairo_set_color (cr, &border); cairo_stroke (cr); cairo_move_to (cr, -0.5 + radius, height + 0.5); ge_cairo_rounded_corner (cr, -0.5, height + 0.5, radius + 1, CR_CORNER_BOTTOMLEFT); ge_cairo_rounded_corner (cr, -0.5, -0.5, radius + 1, CR_CORNER_TOPLEFT); ge_cairo_set_color (cr, &shadow); cairo_stroke (cr); } if (progressbar->value < 1.0 || progressbar->pulsing) { /* At the end of the bar. */ cairo_move_to (cr, width - 0.5 - radius, -0.5); ge_cairo_rounded_corner (cr, width - 0.5, -0.5, radius + 1, CR_CORNER_TOPRIGHT); ge_cairo_rounded_corner (cr, width - 0.5, height + 0.5, radius + 1, CR_CORNER_BOTTOMRIGHT); ge_cairo_set_color (cr, &border); cairo_stroke (cr); cairo_move_to (cr, width + 0.5 - radius, -0.5); ge_cairo_rounded_corner (cr, width + 0.5, -0.5, radius + 1, CR_CORNER_TOPRIGHT); ge_cairo_rounded_corner (cr, width + 0.5, height + 0.5, radius + 1, CR_CORNER_BOTTOMRIGHT); ge_cairo_set_color (cr, &shadow); cairo_stroke (cr); } cairo_restore (cr); cairo_restore (cr); /* rotation, mirroring */ }
static void clearlooks_glossy_draw_scrollbar_slider (cairo_t *cr, const ClearlooksColors *colors, const WidgetParameters *widget, const ScrollBarParameters *scrollbar, int x, int y, int width, int height) { const CairoColor *border = &colors->shade[7]; CairoColor fill = scrollbar->color; CairoColor hilight; CairoColor shade1, shade2, shade3; cairo_pattern_t *pattern; if (scrollbar->junction & CL_JUNCTION_BEGIN) { if (scrollbar->horizontal) { x -= 1; width += 1; } else { y -= 1; height += 1; } } if (scrollbar->junction & CL_JUNCTION_END) { if (scrollbar->horizontal) width += 1; else height += 1; } if (!scrollbar->horizontal) ge_cairo_exchange_axis (cr, &x, &y, &width, &height); cairo_translate (cr, x, y); if (widget->prelight) ge_shade_color (&fill, 1.1, &fill); cairo_set_line_width (cr, 1); ge_shade_color (&fill, 1.25, &hilight); ge_shade_color (&fill, 1.16, &shade1); ge_shade_color (&fill, 1.08, &shade2); ge_shade_color (&fill, 1.08, &shade3); pattern = cairo_pattern_create_linear (1, 1, 1, height-2); cairo_pattern_add_color_stop_rgb (pattern, 0, shade1.r, shade1.g, shade1.b); cairo_pattern_add_color_stop_rgb (pattern, 0.5, shade2.r, shade2.g, shade2.b); cairo_pattern_add_color_stop_rgb (pattern, 0.5, fill.r, fill.g, fill.b); cairo_pattern_add_color_stop_rgb (pattern, 1, shade3.r, shade3.g, shade3.b); cairo_rectangle (cr, 1, 1, width-2, height-2); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); if (scrollbar->has_color) { cairo_set_source_rgba (cr, hilight.r, hilight.g, hilight.b, 0.5); ge_cairo_stroke_rectangle (cr, 1.5, 1.5, width-3, height-3); } clearlooks_set_mixed_color (cr, border, &fill, scrollbar->has_color? 0.4 : 0.2); ge_cairo_stroke_rectangle (cr, 0.5, 0.5, width-1, height-1); }