static void plot_data_fft(SFSUI* ui) { cairo_t* cr; cr = cairo_create (ui->sf_dat); rounded_rectangle (cr, SS_BORDER, SS_BORDER, SS_SIZE, SS_SIZE, SS_BORDER); cairo_clip_preserve (cr); const float persistence = robtk_dial_get_value(ui->screen); float transp; cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (persistence > 0) { cairo_set_source_rgba(cr, 0, 0, 0, .25 - .0025 * persistence); transp = 0.05; } else { cairo_set_source_rgba(cr, 0, 0, 0, 1.0); transp = .5; } cairo_fill(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_set_line_width (cr, 1.0); const float xmid = rintf(SS_BORDER + SS_SIZE *.5) + .5; const float dnum = SS_SIZE / ui->log_base; const float denom = ui->log_rate / (float)ui->fft_bins; cairo_set_operator (cr, CAIRO_OPERATOR_OVER); for (uint32_t i = 1; i < ui->fft_bins-1 ; ++i) { if (ui->level[i] < 0) continue; const float level = MAKEUP_GAIN + fftx_power_to_dB(ui->level[i]); if (level < -80) continue; const float y = rintf(SS_BORDER + SS_SIZE - dnum * fast_log10(1.0 + i * denom)) + .5; const float y1 = rintf(SS_BORDER + SS_SIZE - dnum * fast_log10(1.0 + (i+1) * denom)) + .5; const float pk = level > 0.0 ? 1.0 : (80 + level) / 80.0; const float a_lr = ui->lr[i]; float clr[3]; hsl2rgb(clr, .70 - .72 * pk, .9, .3 + pk * .4); cairo_set_source_rgba(cr, clr[0], clr[1], clr[2], transp + pk * .2); cairo_set_line_width (cr, MAX(1.0, (y - y1))); cairo_move_to(cr, xmid, y); cairo_line_to(cr, SS_BORDER + SS_SIZE * a_lr, y); cairo_stroke(cr); } cairo_destroy (cr); }
cairo_t * ge_gdk_drawable_to_cairo (GdkDrawable *window, GdkRectangle *area) { cairo_t *cr; g_return_val_if_fail (window != NULL, NULL); cr = (cairo_t*) gdk_cairo_create (window); cairo_set_line_width (cr, 1.0); cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); cairo_set_line_join (cr, CAIRO_LINE_JOIN_MITER); if (area) { cairo_rectangle (cr, area->x, area->y, area->width, area->height); cairo_clip_preserve (cr); cairo_new_path (cr); } return cr; }
static VALUE cr_clip (int argc, VALUE *argv, VALUE self) { VALUE preserve; rb_scan_args(argc, argv, "01", &preserve); if (rb_block_given_p ()) { cr_new_path (self); rb_yield (self); } if (RVAL2CBOOL (preserve)) cairo_clip_preserve(_SELF); else cairo_clip (_SELF); cr_check_status (_SELF); return self; }
/* linear FFT data display */ static void plot_data_fft(MF2UI* ui) { cairo_t* cr; const double ccc = ui->width / 2.0 + .5; const double rad = (ui->width - XOFF) * .5; const float gain = robtk_dial_get_value(ui->gain); const float persistence = robtk_dial_get_value(ui->screen); cr = cairo_create (ui->sf_dat); cairo_arc (cr, ccc, ccc, rad, 0, 2.0 * M_PI); cairo_clip_preserve (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (persistence > 0) { cairo_set_source_rgba(cr, 0, 0, 0, .3 - .003 * persistence); } else { cairo_set_source_rgba(cr, 0, 0, 0, 1.0); } cairo_fill(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); const float dnum = ui->scale * PH_RAD / ui->log_base; const float denom = ui->log_rate / (float)ui->fft_bins; const float cutoff = ui->db_cutoff; for (uint32_t i = 1; i < ui->fft_bins-1 ; ++i) { if (ui->level[i] < 0) continue; const float level = gain + fftx_power_to_dB(ui->level[i]); if (level < cutoff) continue; const float dist = dnum * fast_log10(1.0 + i * denom); const float dx = ccc + dist * sinf(ui->phase[i]); const float dy = ccc - dist * cosf(ui->phase[i]); const float pk = level > 0.0 ? 1.0 : (cutoff - level) / cutoff; draw_point(ui, cr, pk, dx, dy, ccc, dist, ui->phase[i]); } cairo_destroy (cr); }
static gboolean gtk_color_swatch_render (GtkCssGadget *gadget, cairo_t *cr, int x, int y, int width, int height, gpointer data) { GtkWidget *widget; GtkColorSwatch *swatch; GtkStyleContext *context; widget = gtk_css_gadget_get_owner (gadget); swatch = GTK_COLOR_SWATCH (widget); context = gtk_widget_get_style_context (widget); if (swatch->priv->has_color) { cairo_pattern_t *pattern; cairo_matrix_t matrix; gtk_render_content_path (context, cr, x, y, width, height); if (swatch->priv->use_alpha) { cairo_save (cr); cairo_clip_preserve (cr); cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); cairo_fill_preserve (cr); pattern = _gtk_color_chooser_get_checkered_pattern (); cairo_matrix_init_scale (&matrix, 0.125, 0.125); cairo_pattern_set_matrix (pattern, &matrix); cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); cairo_mask (cr, pattern); cairo_pattern_destroy (pattern); cairo_restore (cr); gdk_cairo_set_source_rgba (cr, &swatch->priv->color); } else { cairo_set_source_rgb (cr, swatch->priv->color.red, swatch->priv->color.green, swatch->priv->color.blue); } cairo_fill (cr); } gtk_render_frame (context, cr, x, y, width, height); gtk_css_gadget_draw (swatch->priv->overlay_gadget, cr); return gtk_widget_has_visible_focus (widget); }
/** * ppg_visualizer_task_notify_state: * @visualizer: (in): A #PpgVisualizer. * @pspec: (in): A #GParamSpec. * @task: (in): A #PpgTask. * * Handle the "notify::state" signal from @task. Update the visualizer * pattern if necessary. * * Returns: None. * Side effects: None. */ static void ppg_visualizer_task_notify_state (PpgVisualizer *visualizer, GParamSpec *pspec, PpgTask *task) { PpgVisualizerPrivate *priv; cairo_surface_t *surface; PpgTaskState state; cairo_t *cr; gdouble begin_time; gdouble height; gdouble total_width; gdouble span; gdouble width; gdouble x; gdouble y; g_return_if_fail(PPG_IS_VISUALIZER(visualizer)); g_return_if_fail(PPG_IS_TASK(task)); g_return_if_fail(visualizer->priv->surface); priv = visualizer->priv; /* * We don't own the reference, so safe to just drop our pointer. Using * GObjects weak pointers here would be a lot of maintenance pain. */ if (priv->task == task) { priv->task = NULL; } g_object_get(task, "state", &state, "surface", &surface, NULL); if (state == PPG_TASK_SUCCESS) { g_object_get(task, "begin-time", &begin_time, "height", &height, "width", &width, "x", &x, "y", &y, NULL); span = priv->end_time - priv->begin_time; g_object_get(visualizer, "width", &total_width, NULL); x = (begin_time - priv->begin_time) / span * total_width; /* * Only draw what we can do on integer aligned offsets. * * TODO: We need to make sure we render extra area to prevent * a striping effect. */ width -= ceil(x) - x; x = ceil(x); cr = cairo_create(priv->surface); cairo_set_source_surface(cr, surface, x, y); if (cairo_status(cr) != 0) { cairo_destroy(cr); GOTO(failure); } /* * Clip the range of the draw. */ cairo_rectangle(cr, x, y, width, height); cairo_clip_preserve(cr); /* * Clear the draw area. */ cairo_save(cr); cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_fill_preserve(cr); cairo_restore(cr); /* * Fill in the rendered image. */ cairo_fill(cr); cairo_destroy(cr); goo_canvas_item_request_update(GOO_CANVAS_ITEM(visualizer)); } failure: /* * Release our surface that was allocated for the draw request. */ if ((state & PPG_TASK_FINISHED_MASK) != 0) { cairo_surface_destroy(surface); } }
static gboolean swatch_draw (GtkWidget *widget, cairo_t *cr) { GtkColorSwatch *swatch = (GtkColorSwatch*)widget; gdouble width, height; GtkStyleContext *context; GtkStateFlags state; GtkIconTheme *theme; GtkBorder border, padding; GdkRectangle rect; GtkIconInfo *icon_info = NULL; theme = gtk_icon_theme_get_default (); context = gtk_widget_get_style_context (widget); state = gtk_style_context_get_state (context); width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); gtk_render_background (context, cr, 0, 0, width, height); if (swatch->priv->has_color) { cairo_pattern_t *pattern; cairo_matrix_t matrix; gtk_render_content_path (context, cr, 0, 0, width, height); if (swatch->priv->use_alpha) { cairo_save (cr); cairo_clip_preserve (cr); cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); cairo_fill_preserve (cr); pattern = _gtk_color_chooser_get_checkered_pattern (); cairo_matrix_init_scale (&matrix, 0.125, 0.125); cairo_pattern_set_matrix (pattern, &matrix); cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); cairo_mask (cr, pattern); cairo_pattern_destroy (pattern); cairo_restore (cr); gdk_cairo_set_source_rgba (cr, &swatch->priv->color); } else { cairo_set_source_rgb (cr, swatch->priv->color.red, swatch->priv->color.green, swatch->priv->color.blue); } cairo_fill (cr); } gtk_render_frame (context, cr, 0, 0, width, height); if (swatch->priv->icon) { icon_info = gtk_icon_theme_lookup_icon (theme, swatch->priv->icon, PIXBUF_SIZE, GTK_ICON_LOOKUP_GENERIC_FALLBACK | GTK_ICON_LOOKUP_USE_BUILTIN); } else if ((state & GTK_STATE_FLAG_SELECTED) != 0) { GIcon *gicon; gicon = g_themed_icon_new ("object-select-symbolic"); /* fallback for themes that don't have object-select-symbolic */ g_themed_icon_append_name (G_THEMED_ICON (gicon), "gtk-apply"); icon_info = gtk_icon_theme_lookup_by_gicon (theme, gicon, PIXBUF_SIZE, GTK_ICON_LOOKUP_GENERIC_FALLBACK | GTK_ICON_LOOKUP_USE_BUILTIN); g_object_unref (gicon); } /* now draw the overlay image */ gtk_style_context_get_border (context, state, &border); gtk_style_context_get_padding (context, state, &padding); rect.width = width - (border.left + border.right + padding.left + padding.right); rect.height = height - (border.top + border.bottom + padding.top + padding.bottom); rect.x = border.left + padding.left; rect.y = border.top + padding.top; gtk_style_context_save (context); gtk_style_context_add_class (context, "overlay"); gtk_render_background (context, cr, rect.x, rect.y, rect.width, rect.height); gtk_render_frame (context, cr, rect.x, rect.y, rect.width, rect.height); if (icon_info != NULL) { GdkPixbuf *pixbuf; pixbuf = gtk_icon_info_load_symbolic_for_context (icon_info, context, NULL, NULL); if (pixbuf != NULL) { gtk_render_icon (context, cr, pixbuf, rect.x + (rect.width - gdk_pixbuf_get_width (pixbuf)) / 2, rect.y + (rect.height - gdk_pixbuf_get_height (pixbuf)) / 2); g_object_unref (pixbuf); } g_object_unref (icon_info); } if (gtk_widget_has_visible_focus (widget)) { gtk_render_focus (context, cr, 0, 0, width, height); } gtk_style_context_restore (context); return FALSE; }
EXPORT void clip_preserve(cairo_t *context) { cairo_clip_preserve(context); }
static void active_sensor_update_graph(ActiveSensor *as, cairo_t *cr) { GtkAllocation allocation; gdouble line_height; gdouble width, height; gdouble x, y; cairo_pattern_t *pattern; gint i; gtk_widget_get_allocation (as->graph, &allocation); width = allocation.width; height = allocation.height; /* so we can set a clipping area, as well as fill the * back of the graph black */ cairo_rectangle(cr, 0, 0, width, height); /* clip to rectangle and keep it as a path so can be * filled below */ cairo_clip_preserve(cr); /* use black for bg color of graphs */ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0); cairo_fill(cr); /* determine height to scale line at for each value - * only do as many as will fit or the number of * samples that we have */ for (i = 0; i < MIN(as->num_samples, width); i++) { /* need to remove one more to make it line up * properly when drawing */ x = width - i - 1; y = height; line_height = sensor_value_range_normalised(as->sensor_values[i], as->sensor_low_value, as->sensor_high_value) * height; if (line_height > 0) { cairo_move_to(cr, x, y); cairo_line_to(cr, x, y - line_height); } } /* make lines a gradient from slightly darker than * chosen color at bottom of graph, to slightly * lighter than chosen color at top of graph */ pattern = cairo_pattern_create_linear(x, y, x, 0); cairo_pattern_add_color_stop_rgb(pattern, 0, as->graph_color.red / 65535.0 - CAIRO_GRAPH_COLOR_GRADIENT, as->graph_color.green / 65535.0 - CAIRO_GRAPH_COLOR_GRADIENT, as->graph_color.blue / 65535.0 - CAIRO_GRAPH_COLOR_GRADIENT); cairo_pattern_add_color_stop_rgb(pattern, height, as->graph_color.red / 65535.0 + CAIRO_GRAPH_COLOR_GRADIENT, as->graph_color.green / 65535.0 + CAIRO_GRAPH_COLOR_GRADIENT, as->graph_color.blue / 65535.0 + CAIRO_GRAPH_COLOR_GRADIENT); cairo_set_source(cr, pattern); cairo_stroke(cr); cairo_pattern_destroy(pattern); }
/* 1/Octave data display */ static void plot_data_oct(MF2UI* ui) { cairo_t* cr; const double ccc = ui->width / 2.0 + .5; const double rad = (ui->width - XOFF) * .5; const float gain = robtk_dial_get_value(ui->gain); const float persistence = robtk_dial_get_value(ui->screen); cr = cairo_create (ui->sf_dat); cairo_arc (cr, ccc, ccc, rad, 0, 2.0 * M_PI); cairo_clip_preserve (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (persistence > 0) { cairo_set_source_rgba(cr, 0, 0, 0, .33 - .0033 * persistence); } else { cairo_set_source_rgba(cr, 0, 0, 0, 1.0); } cairo_fill(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); const float dnum = ui->scale * PH_RAD / ui->log_base; const float denom = 2.0 * ui->log_rate / ui->rate; const float cutoff = ui->db_cutoff; uint32_t fi = 1; for (uint32_t i = 0; i < ui->freq_bins; ++i) { float ang_x = 0; float ang_y = 0; float a_level = 0; float a_freq = 0; uint32_t a_cnt = 0; while(fi < ui->freq_band[i]) { if (ui->level[fi] < 0) { fi++; continue; } a_freq += fi * ui->fa->freq_per_bin; a_level += ui->level[fi]; ang_x += sinf(ui->phase[fi]); ang_y += cosf(ui->phase[fi]); a_cnt++; fi++; } if (a_cnt == 0) continue; a_level = gain + fftx_power_to_dB (a_level); if (a_level < cutoff) continue; a_freq /= (float)a_cnt; const float dist = dnum * fast_log10(1.0 + a_freq * denom); const float pk = a_level > 0.0 ? 1.0 : (cutoff - a_level) / cutoff; float dx, dy; if (a_cnt == 1) { dx = ccc + dist * ang_x; dy = ccc - dist * ang_y; } else { const float phase = atan2f(ang_x, ang_y); dx = ccc + dist * sinf(phase); dy = ccc - dist * cosf(phase); } draw_point(ui, cr, pk, dx, dy, 0, 0, 0); } cairo_destroy (cr); }
static void plot_data_oct(SFSUI* ui) { cairo_t* cr; cr = cairo_create (ui->sf_dat); rounded_rectangle (cr, SS_BORDER, SS_BORDER, SS_SIZE, SS_SIZE, SS_BORDER); cairo_clip_preserve (cr); const float persistence = robtk_dial_get_value(ui->screen); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); if (persistence > 0) { cairo_set_source_rgba(cr, 0, 0, 0, .33 - .0033 * persistence); } else { cairo_set_source_rgba(cr, 0, 0, 0, 1.0); } cairo_fill(cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); const float xmid = rintf(SS_BORDER + SS_SIZE *.5) + .5; const float dnum = SS_SIZE / ui->log_base; const float denom = 2.0 * ui->log_rate / ui->rate; uint32_t fi = 1; for (uint32_t i = 0; i < ui->freq_bins; ++i) { float a_lr = 0; float a_level = 0; float a_freq = 0; uint32_t a_cnt = 0; while(fi < ui->freq_band[i]) { if (ui->level[fi] < 0) { fi++; continue; } a_freq += fi * ui->fa->freq_per_bin; a_level += ui->level[fi]; a_lr += ui->lr[fi]; a_cnt++; fi++; } if (a_cnt == 0) continue; a_level = MAKEUP_GAIN + fftx_power_to_dB (a_level); if (a_level < -80) continue; a_freq /= (float)a_cnt; a_lr /= (float)a_cnt; const float y = rintf(SS_BORDER + SS_SIZE - dnum * fast_log10(1.0 + a_freq * denom)) + .5; const float pk = a_level > 0.0 ? 1.0 : (80 + a_level) / 80.0; float clr[3]; hsl2rgb(clr, .70 - .72 * pk, .9, .3 + pk * .4); cairo_set_source_rgba(cr, clr[0], clr[1], clr[2], 0.8); if (fabsf(a_lr -.5) < .05) { cairo_set_line_width (cr, 3.0); } else { cairo_set_line_width (cr, 1.0); } cairo_move_to(cr, xmid, y); cairo_line_to(cr, SS_BORDER + SS_SIZE * a_lr, y); cairo_stroke(cr); } cairo_destroy (cr); }
/* * BackgroundLayer::render * * Render the background to the tab bar, also render the tab bar animation * */ void BackgroundLayer::render () { cairo_t *cr; int twidth, theight, radius; int borderWidth; float r, g, b, a; double x0, y0, x1, y1; GROUP_SCREEN (screen); if (!HAS_TOP_WIN (mGroup) || !mCairo) return; /* Dimentions are the tab bar's region */ twidth = mGroup->mTabBar->mRegion.boundingRect ().width (); theight = mGroup->mTabBar->mRegion.boundingRect ().height (); radius = gs->optionGetBorderRadius (); /* Do not draw more than the tab bar width */ if (twidth > width ()) twidth = width (); /* Border radius should not exceed * half of the tab bar height */ if (radius > twidth / 2) radius = twidth / 2; cr = mCairo; /* Clear the layer */ clear (); /* Draw the border around the tab bar */ borderWidth = gs->optionGetBorderWidth (); cairo_set_line_width (cr, borderWidth); cairo_save (cr); /* Move to the center of where we want to draw the line */ x0 = borderWidth / 2.0f; y0 = borderWidth / 2.0f; /* The center of where we want to draw the opposite line */ x1 = twidth - borderWidth / 2.0f; y1 = theight - borderWidth / 2.0f; cairo_move_to (cr, x0 + radius, y0); /* Arc the top right corner */ cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); /* Arc the bottom right corner */ cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); /* Arc the bottom left corner */ cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); /* Arc the top left corner */ cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); cairo_close_path (cr); /* There are 5 different tab styles here: * Simple: draws a simple filled rect * Gradient: left to right gradient between base and highlight * Glass: left to right gradient, stopping at 60% and drawing a shadow * Metal: base -> highlight -> base gradient * Murrina: draws an arc between the two corners blending base and highlight */ switch (gs->optionGetTabStyle ()) { case GroupOptions::TabStyleSimple: { /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); cairo_fill_preserve (cr); break; } case GroupOptions::TabStyleGradient: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, twidth, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleGlass: { cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip (cr); /* ===== HIGHLIGHT ===== */ /* make draw the shape for the highlight and create a pattern for it */ cairo_rectangle (cr, 0, 0, twidth, theight / 2); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.6f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== SHADOW ===== */ /* make draw the shape for the show and create a pattern for it */ cairo_rectangle (cr, 0, theight / 2, twidth, theight); pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.5f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); /* draw shape again for the outline */ cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } case GroupOptions::TabStyleMetal: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color #1 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.55f, r, g, b, a); /* base color #2 */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case GroupOptions::TabStyleMurrina: { double ratio, transX; cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip_preserve (cr); /* ==== TOP ==== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = gs->optionGetTabHighlightColorRed () / 65535.0f; g = gs->optionGetTabHighlightColorGreen () / 65535.0f; b = gs->optionGetTabHighlightColorBlue () / 65535.0f; a = gs->optionGetTabHighlightColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== BOTTOM ===== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = (y1 - y0) / 2; ratio = (double)twidth / (double)theight; transX = twidth - (twidth * ratio); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x1, y0); if (twidth < theight) { cairo_translate (cr, transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc (cr, x1 - radius, y0, radius, 0.0, M_PI * 0.5); if (twidth < theight) { cairo_scale (cr, 1.0 / ratio, 1.0); cairo_translate (cr, -transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc_negative (cr, x0 + radius, y1, radius, M_PI * 1.5, M_PI); cairo_close_path (cr); /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, theight); /* base color */ r = gs->optionGetTabBaseColorRed () / 65535.0f; g = gs->optionGetTabBaseColorGreen () / 65535.0f; b = gs->optionGetTabBaseColorBlue () / 65535.0f; a = gs->optionGetTabBaseColorAlpha () / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* we don't want to use a full highlight here so we mix the colors */ r = (gs->optionGetTabHighlightColorRed () + gs->optionGetTabBaseColorRed ()) / (2 * 65535.0f); g = (gs->optionGetTabHighlightColorGreen () + gs->optionGetTabBaseColorGreen ()) / (2 * 65535.0f); b = (gs->optionGetTabHighlightColorBlue () + gs->optionGetTabBaseColorBlue ()) / (2 * 65535.0f); a = (gs->optionGetTabHighlightColorAlpha () + gs->optionGetTabBaseColorAlpha ()) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_restore (cr); /* draw shape again for the outline */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = twidth - borderWidth / 2.0; y1 = theight - borderWidth / 2.0; radius = gs->optionGetBorderRadius (); cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } default: break; } /* outline */ r = gs->optionGetTabBorderColorRed () / 65535.0f; g = gs->optionGetTabBorderColorGreen () / 65535.0f; b = gs->optionGetTabBorderColorBlue () / 65535.0f; a = gs->optionGetTabBorderColorAlpha () / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); /* If there is an animation running, stroke preserved * so that we can paint directly on top (and blend!) * the new animation with the existing tab bar. * Otherwise just stroke normally, this is less expensive */ if (mBgAnimation != AnimationNone) cairo_stroke_preserve (cr); else cairo_stroke (cr); /* There are two animations here: * Pulse: Highlight tab bar in and out (used for tab hover) * Reflex: Paint a diagonal gradient moving from right to left * on the tab bar when it appears */ switch (mBgAnimation) { case AnimationPulse: { double animationProgress; double alpha; /* Progress here is measured in the current time */ animationProgress = mBgAnimationTime / (gs->optionGetPulseTime () * 1000.0); /* The highlight pulsates in and out, so the alpha here should run * on a sine wave */ alpha = sin ((2 * PI * animationProgress) - 1.55)*0.5 + 0.5; /* If the alpha of the animation is < 0, don't bother painting */ if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); /* Paint highlight over the tab bar */ cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, alpha); cairo_fill (cr); cairo_restore (cr); break; } case AnimationReflex: { double animationProgress; double reflexWidth; double posX, alpha; cairo_pattern_t *pattern; /* Progress is measured in current time */ animationProgress = mBgAnimationTime / (gs->optionGetReflexTime () * 1000.0); /* Position here is the tab bar width plus the reflection width * 2 */ reflexWidth = (mGroup->mTabBar->mSlots.size () / 2.0) * 30; posX = (twidth + reflexWidth * 2.0) * animationProgress; alpha = sin (PI * animationProgress) * 0.55; if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); pattern = cairo_pattern_create_linear (posX - reflexWidth, 0.0, posX, theight); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, 1.0, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgba (pattern, 0.5f, 1.0, 1.0, 1.0, alpha); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, 1.0, 1.0, 1.0, 0.0); cairo_rectangle (cr, 0.0, 0.0, twidth, theight); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_restore (cr); cairo_pattern_destroy (pattern); break; } case AnimationNone: default: break; } /* draw inner outline */ cairo_move_to (cr, x0 + radius + 1.0, y0 + 1.0); cairo_arc (cr, x1 - radius - 1.0, y0 + radius + 1.0, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius - 1.0, y1 - radius - 1.0, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius + 1.0, y1 - radius - 1.0, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius + 1.0, y0 + radius + 1.0, radius, M_PI, M_PI * 1.5); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.3); cairo_stroke(cr); cairo_restore (cr); mTexture = GLTexture::imageBufferToTexture ((char*) mBuffer, (CompSize &) *this); }
static gboolean gstyle_color_widget_draw (GtkWidget *widget, cairo_t *cr) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GtkStyleContext *style_context; GdkRectangle margin_box; GdkRectangle border_box; cairo_matrix_t matrix; GdkRGBA bg_color = {0}; gint radius; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (cr != NULL); style_context = gtk_widget_get_style_context (GTK_WIDGET (self)); gtk_widget_get_allocation (widget, &margin_box); margin_box.x = margin_box.y = 0; gstyle_utils_get_rect_resized_box (margin_box, &margin_box, &self->cached_margin); gstyle_utils_get_rect_resized_box (margin_box, &border_box, &self->cached_border); cairo_save (cr); if (self->color != NULL) { gtk_style_context_get (style_context, gtk_style_context_get_state (style_context), "border-radius", &radius, NULL); gstyle_color_fill_rgba (self->color, &bg_color); if (self->filter_func != NULL) self->filter_func (&bg_color, &bg_color, self->filter_user_data); cairo_new_path (cr); draw_cairo_round_box (cr, border_box, radius, radius, radius, radius); } else cairo_rectangle (cr, border_box.x, border_box.y, border_box.width, border_box.height); cairo_clip_preserve (cr); cairo_set_source_rgb (cr, 0.20, 0.20, 0.20); cairo_paint (cr); cairo_set_source_rgb (cr, 0.80, 0.80, 0.80); cairo_matrix_init_scale (&matrix, 0.1, 0.1); cairo_matrix_translate (&matrix, -border_box.x, -border_box.y); cairo_pattern_set_matrix (self->checkered_pattern, &matrix); cairo_mask (cr, self->checkered_pattern); if (self->color != NULL) { gdk_cairo_set_source_rgba (cr, &bg_color); cairo_fill (cr); } else gtk_render_background (style_context, cr, border_box.x, border_box.y, border_box.width, border_box.height); cairo_restore (cr); gtk_render_frame (gtk_widget_get_style_context (widget), cr, margin_box.x, margin_box.y, margin_box.width, margin_box.height); return GTK_WIDGET_CLASS (gstyle_color_widget_parent_class)->draw (widget, cr); }
static void add_average (struct chart *c, int test, int report, double value) { double dx, dy, x; cairo_text_extents_t extents; char buf[80]; double y; if (fabs (value) < 0.1) return; dy = (c->height/2. - PAD) / MAX (-c->min_value, c->max_value); /* the first report is always skipped, as it is used as the baseline */ dx = c->width / (double) (c->num_tests * c->num_reports); x = dx * (c->num_reports * test + report - .5); cairo_rectangle (c->cr, floor (x), c->height / 2., floor (x + dx) - floor (x), ceil (-dy*value - c->height/2.) + c->height/2.); if (dx < 5) { set_report_color (c, report); cairo_fill (c->cr); } else { set_report_gradient (c, report, floor (x), c->height / 2., floor (x + dx) - floor (x), ceil (-dy*value - c->height/2.) + c->height/2.); cairo_fill_preserve (c->cr); cairo_save (c->cr); cairo_clip_preserve (c->cr); set_report_color (c, report); cairo_stroke (c->cr); cairo_restore (c->cr); } /* Skip the label if the difference between the two is less than 0.1% */ if (fabs (value) < 0.1) return; cairo_save (c->cr); cairo_set_font_size (c->cr, dx - 2); if (value < 0) { sprintf (buf, "%.1f", -value/100 + 1); } else { sprintf (buf, "%.1f", value/100 + 1); } cairo_text_extents (c->cr, buf, &extents); /* will it be clipped? */ y = -dy * value; if (y < -c->height/2) { y = -c->height/2; } else if (y > c->height/2) { y = c->height/2; } if (y < 0) { if (y > -extents.width - 6) y -= extents.width + 6; } else { if (y < extents.width + 6) y += extents.width + 6; } cairo_translate (c->cr, floor (x) + (floor (x + dx) - floor (x))/2, floor (y) + c->height/2.); cairo_rotate (c->cr, -M_PI/2); if (y < 0) { cairo_move_to (c->cr, -extents.x_bearing -extents.width - 4, -extents.y_bearing/2); } else { cairo_move_to (c->cr, 2, -extents.y_bearing/2); } cairo_set_source_rgb (c->cr, .95, .95, .95); cairo_show_text (c->cr, buf); cairo_restore (c->cr); }
static int cr_clip_preserve (lua_State *L) { cairo_t **obj = luaL_checkudata(L, 1, OOCAIRO_MT_NAME_CONTEXT); cairo_clip_preserve(*obj); return 0; }
static void draw_shadow_background(decor_t * d, cairo_t * cr) { cairo_matrix_t matrix; double w, x2; gint width = 0, height = 0; gint left, right, top, bottom; window_settings *ws = d->fs->ws; if (!ws->large_shadow_surface) { cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0); cairo_paint(cr); return; } if (cairo_surface_get_type(ws->large_shadow_surface) == CAIRO_SURFACE_TYPE_IMAGE) { width = cairo_image_surface_get_width(ws->large_shadow_surface); height = cairo_image_surface_get_height(ws->large_shadow_surface); } else if (cairo_surface_get_type(ws->large_shadow_surface) == CAIRO_SURFACE_TYPE_XLIB) { width = cairo_xlib_surface_get_width(ws->large_shadow_surface); height = cairo_xlib_surface_get_height(ws->large_shadow_surface); } left = ws->left_space + ws->left_corner_space; right = ws->right_space + ws->right_corner_space; top = ws->top_space + ws->top_corner_space; bottom = ws->bottom_space + ws->bottom_corner_space; if (d->width - left - right < 0) { left = d->width / 2; right = d->width - left; } if (d->height - top - bottom < 0) { top = d->height / 2; bottom = d->height - top; } w = d->width - left - right; x2 = d->width - right; /* top left */ cairo_matrix_init_identity(&matrix); cairo_pattern_set_matrix(ws->shadow_pattern, &matrix); cairo_set_source(cr, ws->shadow_pattern); cairo_rectangle(cr, 0.0, 0.0, left, top); cairo_fill(cr); /* top */ if (w > 0) { cairo_matrix_init_translate(&matrix, left, 0.0); cairo_matrix_scale(&matrix, 1.0 / w, 1.0); cairo_matrix_translate(&matrix, -left, 0.0); cairo_pattern_set_matrix(ws->shadow_pattern, &matrix); cairo_set_source(cr, ws->shadow_pattern); cairo_rectangle(cr, left, 0.0, w, top); cairo_fill(cr); } /* top right */ cairo_matrix_init_translate(&matrix, width - right - x2, 0.0); cairo_pattern_set_matrix(ws->shadow_pattern, &matrix); cairo_set_source(cr, ws->shadow_pattern); cairo_rectangle(cr, x2, 0.0, right, top); cairo_clip_preserve(cr); cairo_fill(cr); }
void Context::clipPerserve() { cairo_clip_preserve( mCairo ); }
static void clearlooks_inverted_draw_slider (cairo_t *cr, const ClearlooksColors *colors, const WidgetParameters *params, int x, int y, int width, int height) { const CairoColor *border = &colors->shade[params->disabled ? 4 : 6]; const CairoColor *spot = &colors->spot[1]; const CairoColor *fill = &colors->shade[2]; double radius = MIN (params->radius, MIN ((width - 1.0) / 2.0, (height - 1.0) / 2.0)); cairo_pattern_t *pattern; cairo_set_line_width (cr, 1.0); cairo_translate (cr, x, y); if (params->disabled) border = &colors->shade[4]; else if (params->prelight) border = &colors->spot[2]; else border = &colors->shade[6]; /* fill the widget */ cairo_rectangle (cr, 1.0, 1.0, width-2, height-2); /* Fake light */ if (!params->disabled) { const CairoColor *top = &colors->shade[2]; const CairoColor *bot = &colors->shade[0]; pattern = cairo_pattern_create_linear (0, 0, 0, height); cairo_pattern_add_color_stop_rgb (pattern, 0.0, top->r, top->g, top->b); cairo_pattern_add_color_stop_rgb (pattern, 1.0, bot->r, bot->g, bot->b); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); } else { ge_cairo_set_color (cr, fill); cairo_rectangle (cr, 1.0, 1.0, width-2, height-2); cairo_fill (cr); } /* Set the clip */ cairo_save (cr); cairo_rectangle (cr, 1.0, 1.0, 6, height-2); cairo_rectangle (cr, width-7.0, 1.0, 6, height-2); cairo_clip_preserve (cr); cairo_new_path (cr); /* Draw the handles */ ge_cairo_rounded_rectangle (cr, 1.0, 1.0, width-1, height-1, radius, params->corners); pattern = cairo_pattern_create_linear (0.5, 0.5, 0.5, 0.5+height); if (params->prelight) { CairoColor highlight; ge_shade_color (spot, 1.5, &highlight); cairo_pattern_add_color_stop_rgb (pattern, 0.0, spot->r, spot->g, spot->b); cairo_pattern_add_color_stop_rgb (pattern, 1.0, highlight.r, highlight.g, highlight.b); cairo_set_source (cr, pattern); } else { CairoColor hilight; ge_shade_color (fill, 1.5, &hilight); cairo_set_source_rgba (cr, hilight.r, hilight.g, hilight.b, 0.5); } cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); /* Draw the border */ ge_cairo_inner_rounded_rectangle (cr, 0, 0, width, height, radius, params->corners); if (params->prelight || params->disabled) ge_cairo_set_color (cr, border); else clearlooks_set_border_gradient (cr, border, 1.2, 0, height); cairo_stroke (cr); /* Draw handle lines */ if (width > 14) { cairo_move_to (cr, 6.5, 1.0); cairo_line_to (cr, 6.5, height-1); cairo_move_to (cr, width-6.5, 1.0); cairo_line_to (cr, width-6.5, height-1); cairo_set_line_width (cr, 1.0); cairo_set_source_rgba (cr, border->r, border->g, border->b, 0.3); cairo_stroke (cr); } }
void lime_cairo_clip_preserve (double handle) { cairo_clip_preserve ((cairo_t*)(intptr_t)handle); }
/* * groupRenderTabBarBackground * */ void groupRenderTabBarBackground(GroupSelection *group) { GroupCairoLayer *layer; cairo_t *cr; int width, height, radius; int borderWidth; float r, g, b, a; double x0, y0, x1, y1; CompScreen *s = group->screen; GroupTabBar *bar = group->tabBar; if (!bar || !HAS_TOP_WIN (group) || !bar->bgLayer || !bar->bgLayer->cairo) return; width = bar->region->extents.x2 - bar->region->extents.x1; height = bar->region->extents.y2 - bar->region->extents.y1; radius = groupGetBorderRadius (s); if (width > bar->bgLayer->texWidth) width = bar->bgLayer->texWidth; if (radius > width / 2) radius = width / 2; layer = bar->bgLayer; cr = layer->cairo; groupClearCairoLayer (layer); borderWidth = groupGetBorderWidth (s); cairo_set_line_width (cr, borderWidth); cairo_save (cr); x0 = borderWidth / 2.0f; y0 = borderWidth / 2.0f; x1 = width - borderWidth / 2.0f; y1 = height - borderWidth / 2.0f; cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); cairo_close_path (cr); switch (groupGetTabStyle (s)) { case TabStyleSimple: { /* base color */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); cairo_fill_preserve (cr); break; } case TabStyleGradient: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, width, height); /* highlight color */ r = groupGetTabHighlightColorRed (s) / 65535.0f; g = groupGetTabHighlightColorGreen (s) / 65535.0f; b = groupGetTabHighlightColorBlue (s) / 65535.0f; a = groupGetTabHighlightColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case TabStyleGlass: { cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip (cr); /* ===== HIGHLIGHT ===== */ /* make draw the shape for the highlight and create a pattern for it */ cairo_rectangle (cr, 0, 0, width, height / 2); pattern = cairo_pattern_create_linear (0, 0, 0, height); /* highlight color */ r = groupGetTabHighlightColorRed (s) / 65535.0f; g = groupGetTabHighlightColorGreen (s) / 65535.0f; b = groupGetTabHighlightColorBlue (s) / 65535.0f; a = groupGetTabHighlightColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* base color */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.6f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== SHADOW ===== */ /* make draw the shape for the show and create a pattern for it */ cairo_rectangle (cr, 0, height / 2, width, height); pattern = cairo_pattern_create_linear (0, 0, 0, height); /* we don't want to use a full highlight here so we mix the colors */ r = (groupGetTabHighlightColorRed (s) + groupGetTabBaseColorRed (s)) / (2 * 65535.0f); g = (groupGetTabHighlightColorGreen (s) + groupGetTabBaseColorGreen (s)) / (2 * 65535.0f); b = (groupGetTabHighlightColorBlue (s) + groupGetTabBaseColorBlue (s)) / (2 * 65535.0f); a = (groupGetTabHighlightColorAlpha (s) + groupGetTabBaseColorAlpha (s)) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); /* base color */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.5f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_restore (cr); /* draw shape again for the outline */ cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } case TabStyleMetal: { /* fill */ cairo_pattern_t *pattern; pattern = cairo_pattern_create_linear (0, 0, 0, height); /* base color #1 */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = groupGetTabHighlightColorRed (s) / 65535.0f; g = groupGetTabHighlightColorGreen (s) / 65535.0f; b = groupGetTabHighlightColorBlue (s) / 65535.0f; a = groupGetTabHighlightColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.55f, r, g, b, a); /* base color #2 */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill_preserve (cr); cairo_pattern_destroy (pattern); break; } case TabStyleMurrina: { double ratio, transX; cairo_pattern_t *pattern; cairo_save (cr); /* clip width rounded rectangle */ cairo_clip_preserve (cr); /* ==== TOP ==== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = width - borderWidth / 2.0; y1 = height - borderWidth / 2.0; radius = (y1 - y0) / 2; /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, height); /* we don't want to use a full highlight here so we mix the colors */ r = (groupGetTabHighlightColorRed (s) + groupGetTabBaseColorRed (s)) / (2 * 65535.0f); g = (groupGetTabHighlightColorGreen (s) + groupGetTabBaseColorGreen (s)) / (2 * 65535.0f); b = (groupGetTabHighlightColorBlue (s) + groupGetTabBaseColorBlue (s)) / (2 * 65535.0f); a = (groupGetTabHighlightColorAlpha (s) + groupGetTabBaseColorAlpha (s)) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* highlight color */ r = groupGetTabHighlightColorRed (s) / 65535.0f; g = groupGetTabHighlightColorGreen (s) / 65535.0f; b = groupGetTabHighlightColorBlue (s) / 65535.0f; a = groupGetTabHighlightColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); /* ==== BOTTOM ===== */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = width - borderWidth / 2.0; y1 = height - borderWidth / 2.0; radius = (y1 - y0) / 2; ratio = (double)width / (double)height; transX = width - (width * ratio); cairo_move_to (cr, x1, y1); cairo_line_to (cr, x1, y0); if (width < height) { cairo_translate (cr, transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc (cr, x1 - radius, y0, radius, 0.0, M_PI * 0.5); if (width < height) { cairo_scale (cr, 1.0 / ratio, 1.0); cairo_translate (cr, -transX, 0); cairo_scale (cr, ratio, 1.0); } cairo_arc_negative (cr, x0 + radius, y1, radius, M_PI * 1.5, M_PI); cairo_close_path (cr); /* setup pattern */ pattern = cairo_pattern_create_linear (0, 0, 0, height); /* base color */ r = groupGetTabBaseColorRed (s) / 65535.0f; g = groupGetTabBaseColorGreen (s) / 65535.0f; b = groupGetTabBaseColorBlue (s) / 65535.0f; a = groupGetTabBaseColorAlpha (s) / 65535.0f; cairo_pattern_add_color_stop_rgba (pattern, 0.0f, r, g, b, a); /* we don't want to use a full highlight here so we mix the colors */ r = (groupGetTabHighlightColorRed (s) + groupGetTabBaseColorRed (s)) / (2 * 65535.0f); g = (groupGetTabHighlightColorGreen (s) + groupGetTabBaseColorGreen (s)) / (2 * 65535.0f); b = (groupGetTabHighlightColorBlue (s) + groupGetTabBaseColorBlue (s)) / (2 * 65535.0f); a = (groupGetTabHighlightColorAlpha (s) + groupGetTabBaseColorAlpha (s)) / (2 * 65535.0f); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, r, g, b, a); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_pattern_destroy (pattern); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_restore (cr); /* draw shape again for the outline */ x0 = borderWidth / 2.0; y0 = borderWidth / 2.0; x1 = width - borderWidth / 2.0; y1 = height - borderWidth / 2.0; radius = groupGetBorderRadius (s); cairo_move_to (cr, x0 + radius, y0); cairo_arc (cr, x1 - radius, y0 + radius, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius, y1 - radius, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius, y1 - radius, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius, y0 + radius, radius, M_PI, M_PI * 1.5); break; } default: break; } /* outline */ r = groupGetTabBorderColorRed (s) / 65535.0f; g = groupGetTabBorderColorGreen (s) / 65535.0f; b = groupGetTabBorderColorBlue (s) / 65535.0f; a = groupGetTabBorderColorAlpha (s) / 65535.0f; cairo_set_source_rgba (cr, r, g, b, a); if (bar->bgAnimation != AnimationNone) cairo_stroke_preserve (cr); else cairo_stroke (cr); switch (bar->bgAnimation) { case AnimationPulse: { double animationProgress; double alpha; animationProgress = bar->bgAnimationTime / (groupGetPulseTime (s) * 1000.0); alpha = sin ((2 * PI * animationProgress) - 1.55)*0.5 + 0.5; if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); cairo_set_operator (cr, CAIRO_OPERATOR_XOR); cairo_rectangle (cr, 0.0, 0.0, width, height); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, alpha); cairo_fill (cr); cairo_restore (cr); break; } case AnimationReflex: { double animationProgress; double reflexWidth; double posX, alpha; cairo_pattern_t *pattern; animationProgress = bar->bgAnimationTime / (groupGetReflexTime (s) * 1000.0); reflexWidth = (bar->nSlots / 2.0) * 30; posX = (width + reflexWidth * 2.0) * animationProgress; alpha = sin (PI * animationProgress) * 0.55; if (alpha <= 0) break; cairo_save (cr); cairo_clip (cr); pattern = cairo_pattern_create_linear (posX - reflexWidth, 0.0, posX, height); cairo_pattern_add_color_stop_rgba (pattern, 0.0f, 1.0, 1.0, 1.0, 0.0); cairo_pattern_add_color_stop_rgba (pattern, 0.5f, 1.0, 1.0, 1.0, alpha); cairo_pattern_add_color_stop_rgba (pattern, 1.0f, 1.0, 1.0, 1.0, 0.0); cairo_rectangle (cr, 0.0, 0.0, width, height); cairo_set_source (cr, pattern); cairo_fill (cr); cairo_restore (cr); cairo_pattern_destroy (pattern); break; } case AnimationNone: default: break; } /* draw inner outline */ cairo_move_to (cr, x0 + radius + 1.0, y0 + 1.0); cairo_arc (cr, x1 - radius - 1.0, y0 + radius + 1.0, radius, M_PI * 1.5, M_PI * 2.0); cairo_arc (cr, x1 - radius - 1.0, y1 - radius - 1.0, radius, 0.0, M_PI * 0.5); cairo_arc (cr, x0 + radius + 1.0, y1 - radius - 1.0, radius, M_PI * 0.5, M_PI); cairo_arc (cr, x0 + radius + 1.0, y0 + radius + 1.0, radius, M_PI, M_PI * 1.5); cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 0.3); cairo_stroke(cr); cairo_restore (cr); imageBufferToTexture (s, &layer->texture, (char*) layer->buffer, layer->texWidth, layer->texHeight); }
void gfxContext::Clip() { cairo_clip_preserve(mCairo); }
void lime_cairo_clip_preserve (value handle) { cairo_clip_preserve ((cairo_t*)val_data (handle)); }
static gboolean swatch_draw (GtkWidget *widget, cairo_t *cr) { GtkColorSwatch *swatch = (GtkColorSwatch*)widget; GtkThemingBackground background; gdouble width, height; GtkStyleContext *context; GtkStateFlags state; GtkIconTheme *theme; GtkIconInfo *icon_info = NULL; theme = gtk_icon_theme_get_default (); context = gtk_widget_get_style_context (widget); state = gtk_widget_get_state_flags (widget); width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); cairo_save (cr); gtk_style_context_save (context); gtk_style_context_set_state (context, state); _gtk_theming_background_init_from_context (&background, context, 0, 0, width, height, GTK_JUNCTION_NONE); if (swatch->priv->has_color) { cairo_pattern_t *pattern; cairo_matrix_t matrix; if (swatch->priv->use_alpha) { cairo_save (cr); _gtk_rounded_box_path (&background.padding_box, cr); cairo_clip_preserve (cr); cairo_set_source_rgb (cr, 0.33, 0.33, 0.33); cairo_fill_preserve (cr); pattern = _gtk_color_chooser_get_checkered_pattern (); cairo_matrix_init_scale (&matrix, 0.125, 0.125); cairo_pattern_set_matrix (pattern, &matrix); cairo_set_source_rgb (cr, 0.66, 0.66, 0.66); cairo_mask (cr, pattern); cairo_pattern_destroy (pattern); cairo_restore (cr); background.bg_color = swatch->priv->color; } else { background.bg_color = swatch->priv->color; background.bg_color.alpha = 1.0; } _gtk_theming_background_render (&background, cr); } else _gtk_theming_background_render (&background, cr); gtk_render_frame (context, cr, 0, 0, width, height); if (gtk_widget_has_visible_focus (widget)) { cairo_set_line_width (cr, 2); if (swatch->priv->has_color && INTENSITY (swatch->priv->color.red, swatch->priv->color.green, swatch->priv->color.blue) < 0.5) cairo_set_source_rgba (cr, 1., 1., 1., 0.4); else cairo_set_source_rgba (cr, 0., 0., 0., 0.4); _gtk_rounded_box_shrink (&background.padding_box, 3, 3, 3, 3); _gtk_rounded_box_path (&background.padding_box, cr); cairo_stroke (cr); } if (swatch->priv->icon) { icon_info = gtk_icon_theme_lookup_icon (theme, swatch->priv->icon, 16, GTK_ICON_LOOKUP_GENERIC_FALLBACK | GTK_ICON_LOOKUP_USE_BUILTIN); } else if ((state & GTK_STATE_FLAG_SELECTED) != 0) { GdkRGBA bg, border; GtkBorder border_width; GIcon *gicon; gtk_style_context_add_class (context, "color-active-badge"); _gtk_theming_background_init_from_context (&background, context, (width - 2 * ACTIVE_BADGE_RADIUS) / 2, (height - 2 * ACTIVE_BADGE_RADIUS) / 2, 2 * ACTIVE_BADGE_RADIUS, 2* ACTIVE_BADGE_RADIUS, GTK_JUNCTION_NONE); if (_gtk_theming_background_has_background_image (&background)) { _gtk_theming_background_render (&background, cr); } else { gtk_style_context_get_background_color (context, state, &bg); gtk_style_context_get_border_color (context, state, &border); gtk_style_context_get_border (context, state, &border_width); cairo_new_sub_path (cr); cairo_arc (cr, width / 2, height / 2, ACTIVE_BADGE_RADIUS, 0, 2 * G_PI); cairo_close_path (cr); gdk_cairo_set_source_rgba (cr, &bg); cairo_fill_preserve (cr); gdk_cairo_set_source_rgba (cr, &border); cairo_set_line_width (cr, border_width.left); cairo_stroke (cr); gicon = g_themed_icon_new ("object-select-symbolic"); /* fallback for themes that don't have object-select-symbolic */ g_themed_icon_append_name (G_THEMED_ICON (gicon), "gtk-apply"); icon_info = gtk_icon_theme_lookup_by_gicon (theme, gicon, 16, GTK_ICON_LOOKUP_GENERIC_FALLBACK | GTK_ICON_LOOKUP_USE_BUILTIN); g_object_unref (gicon); } } if (icon_info != NULL) { GdkPixbuf *pixbuf; pixbuf = gtk_icon_info_load_symbolic_for_context (icon_info, context, NULL, NULL); if (pixbuf != NULL) { gtk_render_icon (context, cr, pixbuf, (width - gdk_pixbuf_get_width (pixbuf)) / 2, (height - gdk_pixbuf_get_height (pixbuf)) / 2); g_object_unref (pixbuf); } g_object_unref (icon_info); } cairo_restore (cr); gtk_style_context_restore (context); return FALSE; }