static void draw_cross (cairo_t *cr, double cx, double cy, double size) { cairo_move_to (cr, cx, cy - size/2.0); cairo_rel_line_to (cr, size, size); cairo_move_to (cr, cx, cy + size/2.0); cairo_rel_line_to (cr, size, -size); cairo_set_source_rgba (cr, 0.6, 0.6, 0.6, GSD_OSD_WINDOW_FG_ALPHA / 2); cairo_set_line_width (cr, 14); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_stroke_preserve (cr); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, GSD_OSD_WINDOW_FG_ALPHA); cairo_set_line_width (cr, 10); cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND); cairo_stroke (cr); }
static PyObject * pycairo_rel_line_to (PycairoContext *o, PyObject *args) { double dx, dy; if (!PyArg_ParseTuple (args, "dd:Context.rel_line_to", &dx, &dy)) return NULL; cairo_rel_line_to (o->ctx, dx, dy); if (Pycairo_Check_Status (cairo_status (o->ctx))) return NULL; Py_RETURN_NONE; }
void DrawMarker(cairo_t *cr, gint x, gint y, gint type, GdkColor *color) { if (type == 0) { gdk_cairo_set_source_color(cr, &color[0]); cairo_move_to(cr, x - MARKERLENGTH, y); cairo_rel_line_to(cr, 2 * MARKERLENGTH, 0); cairo_move_to(cr, x, y); cairo_rel_line_to(cr, 0, -MARKERLENGTH); cairo_stroke(cr); } else if (type == 1) { gdk_cairo_set_source_color(cr, &color[1]); cairo_move_to(cr, x, y - MARKERLENGTH); cairo_rel_line_to(cr, 0, 2 * MARKERLENGTH); cairo_move_to(cr, x, y); cairo_rel_line_to(cr, MARKERLENGTH, 0); cairo_stroke(cr); } else if (type == 2) { gdk_cairo_set_source_color(cr, &color[2]); cairo_rectangle(cr, x - MARKERLENGTH / 2, y - MARKERLENGTH / 2, MARKERLENGTH, MARKERLENGTH); cairo_stroke(cr); } }
void DefaultWebThemeEngine::paintCheckbox(WebCanvas* canvas, State state, const WebRect& rect, const ButtonExtraParams& param) const { cairo_save(canvas); setupBorder(canvas, state); cairo_rectangle(canvas, rect.x + 0.5, rect.y + 0.5, rect.width, rect.height); cairo_stroke_preserve(canvas); gradientFill(canvas, rect.y, rect.height, state == StatePressed); if (param.checked) { const double border = 3; cairo_set_line_width(canvas, 2); cairo_set_source_rgb(canvas, CHECK_COLOR, CHECK_COLOR, CHECK_COLOR); cairo_move_to(canvas, rect.x + 0.5 + border, rect.y + 0.5 + rect.height - border); cairo_rel_line_to(canvas, rect.width - border * 2, -rect.height + border * 2); cairo_move_to(canvas, rect.x + 0.5 + border, rect.y + 0.5 + border); cairo_rel_line_to(canvas, rect.width - border * 2, rect.height - border * 2); cairo_stroke(canvas); } cairo_restore(canvas); }
void DefaultWebThemeEngine::paintTextField(WebCanvas* canvas, State, const WebRect& rect) const { cairo_save(canvas); const double lineWidth = 2; const double correction = lineWidth / 2.0; cairo_set_line_width(canvas, lineWidth); cairo_set_source_rgb(canvas, TEXTFIELD_DARK_BORDER_COLOR, TEXTFIELD_DARK_BORDER_COLOR, TEXTFIELD_DARK_BORDER_COLOR); cairo_move_to(canvas, rect.x + correction, rect.y + correction + rect.height); cairo_rel_line_to(canvas, 0, -rect.height); cairo_rel_line_to(canvas, rect.width, 0); cairo_stroke(canvas); cairo_set_source_rgb(canvas, TEXTFIELD_LIGHT_BORDER_COLOR, TEXTFIELD_LIGHT_BORDER_COLOR, TEXTFIELD_LIGHT_BORDER_COLOR); cairo_move_to(canvas, rect.x + correction + rect.width, rect.y + correction); cairo_rel_line_to(canvas, 0, rect.height); cairo_rel_line_to(canvas, -rect.width, 0); cairo_stroke(canvas); cairo_restore(canvas); }
void DefaultWebThemeEngine::paintTextField(Canvas* canvas, State, const Rect& rect) const { cairo_save(canvas); const double lineWidth = 2; const double correction = lineWidth / 2.0; cairo_set_line_width(canvas, lineWidth); cairo_set_source_rgb(canvas, TextFieldDarkBorderColor, TextFieldDarkBorderColor, TextFieldDarkBorderColor); cairo_move_to(canvas, rect.x + correction, rect.y + correction + rect.height); cairo_rel_line_to(canvas, 0, -rect.height); cairo_rel_line_to(canvas, rect.width, 0); cairo_stroke(canvas); cairo_set_source_rgb(canvas, TextFieldLightBorderColor, TextFieldLightBorderColor, TextFieldLightBorderColor); cairo_move_to(canvas, rect.x + correction + rect.width, rect.y + correction); cairo_rel_line_to(canvas, 0, rect.height); cairo_rel_line_to(canvas, -rect.width, 0); cairo_stroke(canvas); cairo_restore(canvas); }
void _cairo_draw_rounded_box (cairo_t *cr, double x, double y, double w, double h, double r) { if (r == 0) { cairo_rectangle (cr, x, y, w, h); } else { cairo_move_to (cr, x, y + r); cairo_arc (cr, x + r, y + r, r, 1.0 * M_PI, 1.5 * M_PI); cairo_rel_line_to (cr, w - (r * 2), 0); cairo_arc (cr, x + w - r, y + r, r, 1.5 * M_PI, 2.0 * M_PI); cairo_rel_line_to (cr, 0, h - (r * 2)); cairo_arc (cr, x + w - r, y + h - r, r, 0.0 * M_PI, 0.5 * M_PI); cairo_rel_line_to (cr, - (w - (r * 2)), 0); cairo_arc (cr, x + r, y + h - r, r, 0.5 * M_PI, 1.0 * M_PI); cairo_rel_line_to (cr, 0, - (h - (r * 2))); } }
ETERM * rel_line_to(ETERM* arg, int c_node) { ETERM *x, *y; cairo_context *ctx = get_cairo_context(arg); if (ctx) { x = erl_element(2, arg); y = erl_element(3, arg); cairo_rel_line_to(ctx->cr, val(x), val(y)); erl_free_term(x); erl_free_term(y); return erl_format("{c_node, ~i, ok}", c_node); } else { return erl_format("{c_node, ~i, {error, '~s'}}", c_node, ERR_CONTEXT); } }
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_GdkGraphics2D_cairoRelLineTo (JNIEnv *env, jobject obj, jdouble dx, jdouble dy) { struct graphics2d *gr = NULL; gdk_threads_enter(); if (peer_is_disposed(env, obj)) { gdk_threads_leave(); return; } gr = (struct graphics2d *) NSA_GET_G2D_PTR (env, obj); g_assert (gr != NULL); if (gr->debug) printf ("cairo_rel_line_to (%f, %f)\n", dx, dy); cairo_rel_line_to (gr->cr, dx, dy); gdk_threads_leave(); }
static cairo_test_status_t draw (cairo_t *cr, int width, int height) { cairo_translate (cr, PAD, PAD); /* A red triangle with SOURCE */ cairo_move_to (cr, SIZE / 5, SIZE / 5); cairo_rel_line_to (cr, SIZE / 2, 0); cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); cairo_close_path (cr); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ cairo_fill (cr); /* A green circle with OVER */ cairo_arc (cr, SIZE / 2, SIZE / 2, SIZE / 4, 0., 2. * M_PI); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgba (cr, 0., 1., 0., 0.5); /* 50% green */ cairo_fill (cr); /* Another red triangle with SOURCE */ cairo_move_to (cr, SIZE / 2, SIZE / 2); cairo_rel_line_to (cr, SIZE / 2, 0); cairo_rel_line_to (cr, -SIZE / 2, SIZE / 2); cairo_close_path (cr); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba (cr, 1., 0., 0., 0.5); /* 50% red */ cairo_fill (cr); return CAIRO_TEST_SUCCESS; }
static gboolean draw_text_cursor_cb (GtkWidget *widget, cairo_t *cr, gpointer user_data) { GtkEditable *editable = GTK_EDITABLE(widget); GtkStyleContext *stylectxt = gtk_widget_get_style_context (GTK_WIDGET(widget)); gint height = gtk_widget_get_allocated_height (widget); const gchar *text; GdkRGBA *fg_color; GdkRGBA color; gint x_offset; gint cursor_x = 0; // Get the layout x offset gtk_entry_get_layout_offsets (GTK_ENTRY(widget), &x_offset, NULL); // Get the foreground color gdk_rgba_parse (&color, "black"); gtk_style_context_get_color (stylectxt, GTK_STATE_FLAG_NORMAL, &color); fg_color = &color; text = gtk_entry_get_text (GTK_ENTRY (widget)); if ((text != NULL) && (*text != '\0')) { PangoLayout *layout; PangoRectangle strong_pos; gint start_pos, end_pos, cursor_pos, cursor_byte_pos; cursor_pos = gtk_editable_get_position (editable); cursor_byte_pos = g_utf8_offset_to_pointer (text, cursor_pos) - text; gtk_editable_get_selection_bounds (editable, &start_pos, &end_pos); layout = gtk_entry_get_layout (GTK_ENTRY(widget)); pango_layout_get_cursor_pos (layout, cursor_byte_pos, &strong_pos, NULL); cursor_x = x_offset + PANGO_PIXELS (strong_pos.x); } else cursor_x = x_offset; // Now draw a vertical line cairo_set_source_rgb (cr, fg_color->red, fg_color->green, fg_color->blue); cairo_set_line_width (cr, 1.0); cairo_move_to (cr, cursor_x + 0.5, 2); cairo_rel_line_to (cr, 0, height - 4); cairo_stroke (cr); return FALSE; }
static void make_path (cairo_t *cr) { cairo_move_to (cr, 0, SIZE/2 + LINE_WIDTH); cairo_rel_line_to (cr, SIZE, 0); cairo_rel_line_to (cr, -SIZE, 0); cairo_close_path (cr); cairo_move_to (cr, 3*SIZE/4, 0); cairo_rel_line_to (cr, -SIZE/2, SIZE); cairo_rel_line_to (cr, SIZE/2, -SIZE); cairo_close_path (cr); cairo_move_to (cr, 0, SIZE/2-LINE_WIDTH); cairo_rel_curve_to (cr, SIZE/2, -2*LINE_WIDTH, SIZE/2, 2*LINE_WIDTH, SIZE, 0); cairo_rel_curve_to (cr, -SIZE/2, 2*LINE_WIDTH, -SIZE/2, -2*LINE_WIDTH, -SIZE, 0); cairo_close_path (cr); }
void gt_graphics_cairo_draw_vertical_line(GtGraphics *gg, double x, double y, GtColor color, double length, double stroke_width) { GtGraphicsCairo *g = gt_graphics_cairo_cast(gg); gt_assert(g); cairo_save(g->cr); cairo_move_to(g->cr, rnd_to_nhalf(x), rnd_to_nhalf(y)); cairo_set_line_width(g->cr, 1); cairo_rel_line_to(g->cr, 0, floor(length)); cairo_set_line_width(g->cr, stroke_width); cairo_set_source_rgba(g->cr, color.red, color.green, color.blue, color.alpha); cairo_stroke(g->cr); cairo_restore(g->cr); }
static cairo_test_status_t diagonal (cairo_t *cr, int width, int height) { int x; cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); cairo_paint (cr); cairo_set_source_rgba (cr, 1, 1, 1, 1); for (x = -HEIGHT*PRECISION-2; x <= (WIDTH+HEIGHT)*PRECISION+2; x += 6) { cairo_move_to (cr, x / (double)PRECISION - 2, -2); cairo_rel_line_to (cr, HEIGHT + 4, HEIGHT + 4); } cairo_set_line_width (cr, 2 / (double)PRECISION); cairo_stroke (cr); return CAIRO_TEST_SUCCESS; }
/*================================================================================== psrpgn - subroutine to generate closed polygons using rel. coordinates for all after the first ==================================================================================*/ void psrpgn_ (double *x1, double *y1, double *rx, double *ry, int *npts, double *rline, double *width,int *ifill) { int i; DEBUGPRINT(("In psrpgn\n")); completeRelativeOperation(); cairo_move_to(dmh_cr, *x1, *y1); for (i = 0; i <= *npts-1; i++) { cairo_rel_line_to(dmh_cr, deviceW(rx[i]), deviceH(ry[i])); } cairo_close_path(dmh_cr); setLineProperties((int) *rline, *width); cairo_set_source_rgb (dmh_cr, 0, 0, 0); /* black */ cairo_stroke_preserve(dmh_cr); setFillType (*ifill); cairo_fill(dmh_cr); }
static double vcap_sunburst_draw (cairo_t * cr, const struct vcap_data_entry * e, unsigned int m_radius, double arc_start) { unsigned int i; double arc_end, radius, nrsum, c; radius = ((double)e->level / m_radius); if (e->parent) { arc_end = arc_start + ((double)e->amount / vcap_data_lookup("eth")->amount) * 2 * M_PI; } else { arc_end = 2 * M_PI; } if (e->entries) { nrsum = arc_start; for (i = 0; i < e->ecount; i++) { nrsum = vcap_sunburst_draw(cr, e->entries[i], m_radius, nrsum); } } cairo_move_to (cr, 0, 0); cairo_rel_line_to (cr, cos (arc_start) * radius, sin (arc_start) * radius); cairo_arc (cr, 0, 0, radius, arc_start, arc_end); cairo_line_to (cr, 0, 0); c = ((double)(1/(double)(arc_start+e->level+1)))+0.2; cairo_set_source_rgb (cr, c + (e->level%3 > 0)*0.02, c + (e->level/3)*0.05, c + (e->level%2 == 0)*0.1); cairo_fill_preserve (cr); cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_line_width (cr, 0.001); cairo_stroke (cr); return arc_end; }
//================================================================================= // metaball //================================================================================= static void metaball_a(Qdr *qdr, cairo_t *cr, int edge, int x, int y, double radius) { switch(edge){ case 0: //MB_NON cairo_arc(cr, x+radius, y+radius, radius, 180*(M_PI/180.0), 270*(M_PI/180.0)); break; case 1: //MB_TB cairo_arc(cr, x+radius, y+radius, radius, 180*(M_PI/180.0), 210*(M_PI/180.0)); cairo_arc_negative(cr, x+radius-sqrt(3)*radius, y, radius, 30*(M_PI/180.0), 0*(M_PI/180.0)); break; case 2: //MB_LR cairo_arc_negative(cr, x, y+radius-sqrt(3)*radius, radius, 90*(M_PI/180.0), 60*(M_PI/180.0)); cairo_arc(cr, x+radius, y+radius, radius, 240*(M_PI/180.0), 270*(M_PI/180.0)); break; case 3: //MB_BOTH cairo_arc_negative(cr, x, y, (2-sqrt(3))*radius, 90*(M_PI/180.0), 0*(M_PI/180.0)); break; case 4: //MB_FULL cairo_line_to(cr, x, y-radius); cairo_rel_line_to(cr, radius, 0); break; } }
static void metaball_d(Qdr *qdr, cairo_t *cr, int edge, int x, int y, double radius) { switch(edge){ case 0: cairo_arc(cr, x+radius, y+radius, radius, 90*(M_PI/180.0), 180*(M_PI/180.0)); break; case 1: cairo_arc_negative(cr, x+radius-sqrt(3)*radius, y+radius*2, radius, 0*(M_PI/180.0), 330*(M_PI/180.0)); cairo_arc(cr, x+radius, y+radius, radius, 150*(M_PI/180.0), 180*(M_PI/180.0)); break; case 2: cairo_arc(cr, x+radius, y+radius, radius, 90*(M_PI/180.0), 120*(M_PI/180.0)); cairo_arc_negative(cr, x, y+radius+sqrt(3)*radius, radius, 300*(M_PI/180.0), 270*(M_PI/180.0)); break; case 3: cairo_arc_negative(cr, x, y+radius*2, (2-sqrt(3))*radius, 0*(M_PI/180.0), 270*(M_PI/180.0)); break; case 4: cairo_line_to(cr, x, y+qdr->msize); cairo_rel_line_to(cr, 0, -radius); break; } }
static void blockarc_c(Qdr *qdr, cairo_t *cr, int edge, int x, int y, double half, double lead, double radius) { switch(edge){ case 0: //rect cairo_rel_line_to(cr, 0, half); cairo_rel_line_to(cr, -half, 0); break; case 1: //arc cairo_rel_line_to(cr, 0, lead); cairo_arc(cr, x+half+lead, y+half+lead, radius, 0*(M_PI/180.0), 90*(M_PI/180.0)); cairo_rel_line_to(cr, -lead, 0); break; case 2: //narc cairo_rel_line_to(cr, 0, lead); cairo_arc_negative(cr, x+qdr->msize+radius, y+half+lead, radius, 180*(M_PI/180.0), 90*(M_PI/180.0)); cairo_rel_line_to(cr, -(radius+half), 0); break; } }
static gboolean sc_arrow_draw(GtkWidget*widget, cairo_t*cr) { SCArrow*arrow=SC_ARROW(widget); int width=gtk_widget_get_allocated_width(widget); int height =gtk_widget_get_allocated_height(widget); double arrow_width=1.5*arrow->line_width; double arrow_length=2*arrow_width; double dashs[]={arrow_length,arrow_length-2,100000}; cairo_set_line_width(cr,arrow->line_width); gdk_cairo_set_source_rgba(cr,&arrow->color); // cairo_move_to(cr,arrow->x1,arrow->y1); cairo_line_to(cr,arrow->x0,arrow->y0); // cairo_set_dash(cr,dashs,3,arrow_length); cairo_stroke(cr); // double rad=0.0; int dx,dy; dx=arrow->x1-arrow->x0; dy=arrow->y1-arrow->y0; if(dx>=0){ rad= atan(((double)dy)/dx); }else{//dx<=0 rad=atan(((double)dy)/dx)+M_PI; } cairo_save(cr); cairo_translate(cr,arrow->x1,arrow->y1); //FIXME //WARNING:: invalid matrix (not invertible) cairo_rotate(cr,rad); cairo_move_to(cr,0,0); cairo_rel_line_to(cr,-arrow_length,-arrow_width); cairo_rel_line_to(cr,0,arrow_width*2); cairo_rel_line_to(cr,0,0); cairo_fill(cr); cairo_restore(cr); return FALSE; }
static void draw_month_grid (GcalYearView *year_view, GtkWidget *widget, cairo_t *cr, gint month_nr, gint *weeks_counter) { GcalYearViewPrivate *priv = year_view->priv; GtkStyleContext *context; GtkStateFlags state_flags; PangoLayout *layout, *slayout; PangoFontDescription *font_desc, *sfont_desc; GdkRGBA color; gint layout_width, layout_height, i, j, sw; gint x, y, column, row, box_side, box_padding_top, box_padding_start; gint days_delay, days, shown_rows, sunday_idx; gchar *str, *nr_day, *nr_week; gboolean selected_day; cairo_save (cr); context = gtk_widget_get_style_context (widget); state_flags = gtk_widget_get_state_flags (widget); sw = 1 - 2 * priv->k; box_side = priv->navigator_grid->box_side; x = priv->navigator_grid->coordinates[month_nr].x; y = priv->navigator_grid->coordinates[month_nr].y; gtk_style_context_get (context, state_flags | GTK_STATE_FLAG_SELECTED, "font", &sfont_desc, NULL); slayout = gtk_widget_create_pango_layout (widget, NULL); pango_layout_set_font_description (slayout, sfont_desc); /* header */ gtk_style_context_save (context); gtk_style_context_add_class (context, "header"); str = g_strdup (gcal_get_month_name (month_nr)); gtk_style_context_get (context, state_flags, "font", &font_desc, NULL); layout = gtk_widget_create_pango_layout (widget, str); pango_layout_set_font_description (layout, font_desc); pango_layout_get_pixel_size (layout, &layout_width, &layout_height); gtk_render_layout (context, cr, x + (box_side * 8 - layout_width) / 2, y + (box_side - layout_height) / 2, layout); gtk_render_background (context, cr, x + (box_side * 8 - layout_width) / 2, y + (box_side - layout_height) / 2, layout_width, layout_width); pango_font_description_free (font_desc); g_free (str); gtk_style_context_restore (context); /* separator line */ gtk_style_context_save (context); gtk_style_context_add_class (context, "lines"); gtk_style_context_get_color (context, state_flags, &color); cairo_set_line_width (cr, 0.2); gdk_cairo_set_source_rgba (cr, &color); cairo_move_to (cr, x + box_side / 2, y + box_side + 0.4); cairo_rel_line_to (cr, 7 * box_side, 0); cairo_stroke (cr); gtk_style_context_restore (context); /* days */ gtk_style_context_save (context); gtk_style_context_add_class (context, "days"); gtk_style_context_get (context, state_flags, "font", &font_desc, NULL); pango_layout_set_font_description (layout, font_desc); days_delay = (time_day_of_week (1, month_nr, priv->date->year) - priv->first_weekday + 7) % 7; days = days_delay + icaltime_days_in_month (month_nr + 1, priv->date->year); shown_rows = ceil (days / 7.0); sunday_idx = priv->k * 6 + sw * ((7 - priv->first_weekday) % 7); for (i = 0; i < 7 * shown_rows; i++) { column = i % 7; row = i / 7; j = 7 * ((i + 7 * priv->k) / 7) + sw * (i % 7) + (1 - priv->k); if (j <= days_delay) continue; else if (j > days) continue; j -= days_delay; nr_day = g_strdup_printf ("%d", j); pango_layout_set_text (layout, nr_day, -1); pango_layout_get_pixel_size (layout, &layout_width, &layout_height); box_padding_top = (box_side - layout_height) / 2 > 0 ? (box_side - layout_height) / 2 : 0; box_padding_start = (box_side - layout_width) / 2 > 0 ? (box_side - layout_width) / 2 : 0; selected_day = FALSE; if (priv->selected_data->start_day != 0) { ButtonData selected_data = *(priv->selected_data); order_selected_data (&selected_data); if (month_nr > selected_data.start_month && month_nr < selected_data.end_month) { selected_day = TRUE; } else if (month_nr == selected_data.start_month && month_nr == selected_data.end_month) { selected_day = j >= selected_data.start_day && j <= selected_data.end_day; } else if (month_nr == selected_data.start_month && j >= selected_data.start_day) { selected_day = TRUE; } else if (month_nr == selected_data.end_month && j <= selected_data.end_day) { selected_day = TRUE; } } if (priv->date->year == priv->current_date->year && month_nr + 1 == priv->current_date->month && j == priv->current_date->day) { PangoLayout *clayout; PangoFontDescription *cfont_desc; gtk_style_context_save (context); gtk_style_context_add_class (context, "current"); clayout = gtk_widget_create_pango_layout (widget, nr_day); gtk_style_context_get (context, state_flags, "font", &cfont_desc, NULL); pango_layout_set_font_description (clayout, cfont_desc); pango_layout_get_pixel_size (clayout, &layout_width, &layout_height); box_padding_top = (box_side - layout_height) / 2 > 0 ? (box_side - layout_height) / 2 : 0; box_padding_start = (box_side - layout_width) / 2 > 0 ? (box_side - layout_width) / 2 : 0; /* FIXME: hardcoded padding of the number background */ gtk_render_background (context, cr, box_side * (column + 0.5 + priv->k) + x + sw * box_padding_start - priv->k * layout_width - 2.0, box_side * (row + 1) + y + box_padding_top - 1.0, layout_width + 4.0, layout_height + 2.0); gtk_render_layout (context, cr, box_side * (column + 0.5 + priv->k) + x + sw * box_padding_start - priv->k * layout_width, box_side * (row + 1) + y + box_padding_top, clayout); gtk_style_context_restore (context); pango_font_description_free (cfont_desc); g_object_unref (clayout); } else if (selected_day) { gtk_style_context_set_state (context, state_flags | GTK_STATE_FLAG_SELECTED); pango_layout_set_text (slayout, nr_day, -1); pango_layout_get_pixel_size (slayout, &layout_width, &layout_height); box_padding_top = (box_side - layout_height) / 2 > 0 ? (box_side - layout_height) / 2 : 0; box_padding_start = (box_side - layout_width) / 2 > 0 ? (box_side - layout_width) / 2 : 0; gtk_render_layout (context, cr, box_side * (column + 0.5 + priv->k) + x + sw * box_padding_start - priv->k * layout_width, box_side * (row + 1) + y + box_padding_top, slayout); gtk_style_context_set_state (context, state_flags); } else if (column == sunday_idx) { gtk_style_context_save (context); gtk_style_context_add_class (context, "sunday"); gtk_render_layout (context, cr, box_side * (column + 0.5 + priv->k) + x + sw * box_padding_start - priv->k * layout_width, box_side * (row + 1) + y + box_padding_top, layout); gtk_style_context_restore (context); } else { gtk_render_layout (context, cr, box_side * (column + 0.5 + priv->k) + x + sw * box_padding_start - priv->k * layout_width, box_side * (row + 1) + y + box_padding_top, layout); } g_free (nr_day); } pango_font_description_free (font_desc); gtk_style_context_restore (context); /* week numbers */ gtk_style_context_save (context); gtk_style_context_add_class (context, "week-numbers"); gtk_style_context_get (context, state_flags, "font", &font_desc, NULL); pango_layout_set_font_description (layout, font_desc); for (i = 0; i < shown_rows; i++) { if (i == 0) { if (days_delay == 0) *weeks_counter = *weeks_counter + 1; } else *weeks_counter = *weeks_counter + 1; nr_week = g_strdup_printf ("%d", *weeks_counter); pango_layout_set_text (layout, nr_week, -1); pango_layout_get_pixel_size (layout, &layout_width, &layout_height); box_padding_top = (box_side - layout_height) / 2 > 0 ? (box_side - layout_height) / 2 : 0; box_padding_start = ((box_side / 2) - layout_width) / 2 > 0 ? ((box_side / 2) - layout_width) / 2 : 0; gtk_render_layout (context, cr, x + sw * box_padding_start + priv->k * (8 * box_side - layout_width), box_side * (i + 1) + y + box_padding_top, layout); g_free (nr_week); } gtk_style_context_restore (context); pango_font_description_free (sfont_desc); g_object_unref (slayout); pango_font_description_free (font_desc); g_object_unref (layout); cairo_restore (cr); }
void cd_rendering_render_optimized_3D_plane (cairo_t *pCairoContext, CairoDock *pDock, GdkRectangle *pArea) { //g_print ("%s ((%d;%d) x (%d;%d) / (%dx%d))\n", __func__, pArea->x, pArea->y, pArea->width, pArea->height, pDock->iCurrentWidth, pDock->iCurrentHeight); double fLineWidth = myBackground.iDockLineWidth; double fMargin = myBackground.iFrameMargin; int iWidth = pDock->iCurrentWidth; int iHeight = pDock->iCurrentHeight; //\____________________ On dessine les decorations du fond sur la portion de fenetre. cairo_save (pCairoContext); double fDockOffsetX, fDockOffsetY; if (pDock->bHorizontalDock) { fDockOffsetX = pArea->x; fDockOffsetY = (pDock->bDirectionUp ? iHeight - pDock->iDecorationsHeight - fLineWidth : fLineWidth); } else { fDockOffsetX = (pDock->bDirectionUp ? iHeight - pDock->iDecorationsHeight - fLineWidth : fLineWidth); fDockOffsetY = pArea->y; } //cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY); if (pDock->bHorizontalDock) cairo_rectangle (pCairoContext, fDockOffsetX, fDockOffsetY, pArea->width, pDock->iDecorationsHeight); else cairo_rectangle (pCairoContext, fDockOffsetX, fDockOffsetY, pDock->iDecorationsHeight, pArea->height); double fRadius = MIN (myBackground.iDockRadius, (pDock->iDecorationsHeight + myBackground.iDockLineWidth) / 2 - 1); double fDeltaXTrapeze=0.; double fOffsetX; if (cairo_dock_is_extended_dock (pDock)) // mode panel etendu. { fOffsetX = fRadius + fLineWidth / 2; } else { Icon *pFirstIcon = cairo_dock_get_first_drawn_icon (pDock); fOffsetX = (pFirstIcon != NULL ? pFirstIcon->fX - fMargin : fRadius + fLineWidth / 2); } double fDockWidth = cairo_dock_get_current_dock_width_linear (pDock); if (g_pBackgroundSurface != NULL) { double fInclinationOnHorizon = (fDockWidth / 2) / iVanishingPointY; double fRadius = myBackground.iDockRadius; if (2*fRadius > pDock->iDecorationsHeight + fLineWidth) fRadius = (pDock->iDecorationsHeight + fLineWidth) / 2 - 1; double fDeltaXForLoop = fInclinationOnHorizon * (pDock->iDecorationsHeight + fLineWidth - (myBackground.bRoundedBottomCorner ? 2 : 1) * fRadius); double cosa = 1. / sqrt (1 + fInclinationOnHorizon * fInclinationOnHorizon); fDeltaXTrapeze = fDeltaXForLoop + fRadius * cosa; double sina = cosa * fInclinationOnHorizon; fDeltaXTrapeze = fInclinationOnHorizon * (pDock->iDecorationsHeight - (FALSE ? 2 : 1-sina) * fRadius) + fRadius * (FALSE ? 1 : cosa); } cairo_dock_render_decorations_in_frame (pCairoContext, pDock, pDock->bHorizontalDock ? fDockOffsetY : fDockOffsetX, fOffsetX-fDeltaXTrapeze, fDockWidth+2*fDeltaXTrapeze); //\____________________ On dessine la partie du cadre qui va bien. cairo_new_path (pCairoContext); if (pDock->bHorizontalDock) { cairo_set_line_width (pCairoContext, fLineWidth); cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY - 0.5*fLineWidth); cairo_rel_line_to (pCairoContext, pArea->width, 0); cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]); cairo_stroke (pCairoContext); cairo_new_path (pCairoContext); cairo_move_to (pCairoContext, fDockOffsetX, (pDock->bDirectionUp ? iHeight - 0.5*fLineWidth : pDock->iDecorationsHeight + 1.5 * fLineWidth)); cairo_rel_line_to (pCairoContext, pArea->width, 0); } else { cairo_move_to (pCairoContext, fDockOffsetX - .5*fLineWidth, fDockOffsetY); cairo_rel_line_to (pCairoContext, 0, pArea->height); cairo_set_line_width (pCairoContext, fLineWidth); cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]); cairo_stroke (pCairoContext); cairo_new_path (pCairoContext); cairo_move_to (pCairoContext, (pDock->bDirectionUp ? iHeight - fLineWidth / 2 : pDock->iDecorationsHeight + 1.5 * fLineWidth), fDockOffsetY); cairo_rel_line_to (pCairoContext, 0, pArea->height); } cairo_set_line_width (pCairoContext, fLineWidth); cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]); cairo_stroke (pCairoContext); cairo_restore (pCairoContext); //\____________________ On dessine les icones impactees. GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons); if (pFirstDrawnElement != NULL) { double fXMin = (pDock->bHorizontalDock ? pArea->x : pArea->y), fXMax = (pDock->bHorizontalDock ? pArea->x + pArea->width : pArea->y + pArea->height); double fDockMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex); double fXLeft, fXRight; Icon *icon; GList *ic = pFirstDrawnElement; if (my_iDrawSeparator3D == CD_FLAT_SEPARATOR || my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { cairo_set_line_cap (pCairoContext, CAIRO_LINE_CAP_SQUARE); do { icon = ic->data; if (CAIRO_DOCK_IS_SEPARATOR (icon) && icon->acFileName == NULL) { if (_cd_separator_is_impacted (icon, pDock, fXMin, fXMax, TRUE, (my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR))) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, TRUE); cairo_restore (pCairoContext); } } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); do { icon = ic->data; if (! CAIRO_DOCK_IS_SEPARATOR (icon) || icon->acFileName != NULL) { fXLeft = icon->fDrawX + icon->fScale + 1; fXRight = icon->fDrawX + (icon->fWidth - 1) * icon->fScale * icon->fWidthFactor - 1; if (fXLeft <= fXMax && floor (fXRight) > fXMin) { if (icon->fDrawX >= 0 && icon->fDrawX + icon->fWidth * icon->fScale <= pDock->iCurrentWidth) icon->fAlpha = 1; else icon->fAlpha = .25; cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pDock, pCairoContext, fDockMagnitude, TRUE); cairo_restore (pCairoContext); } } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); if (my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { do { icon = ic->data; if (CAIRO_DOCK_IS_SEPARATOR (icon) && icon->acFileName == NULL) { if (_cd_separator_is_impacted (icon, pDock, fXMin, fXMax, FALSE, (my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR))) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, FALSE); cairo_restore (pCairoContext); } } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } } else { do { icon = ic->data; fXLeft = icon->fDrawX + icon->fScale + 1; fXRight = icon->fDrawX + (icon->fWidth - 1) * icon->fScale * icon->fWidthFactor - 1; if (fXLeft <= fXMax && floor (fXRight) > fXMin) { if (icon->fDrawX >= 0 && icon->fDrawX + icon->fWidth * icon->fScale <= pDock->iCurrentWidth) icon->fAlpha = 1; else icon->fAlpha = .25; cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pDock, pCairoContext, fDockMagnitude, TRUE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } } }
void lime_cairo_rel_line_to (double handle, double dx, double dy) { cairo_rel_line_to ((cairo_t*)(intptr_t)handle, dx, dy); }
void lime_cairo_rel_line_to (value handle, double dx, double dy) { cairo_rel_line_to ((cairo_t*)val_data (handle), dx, dy); }
static int ui_show_underlined_text(lua_State *L) { struct context *c = lua_touserdata(L, 1); const char *str = lua_tostring(L, 2); if (!str) { return 0; } char *tmp = alloca(strlen(str)+1); double x1, y1; cairo_get_current_point(c->cr, &x1, &y1); cairo_show_text(c->cr, str); double x2, y2; cairo_get_current_point(c->cr, &x2, &y2); if (lua_isnil(L, 3)) { /* underline full string */ cairo_move_to(c->cr, x1, y1); cairo_line_to(c->cr, x2, y2); cairo_stroke(c->cr); return 0; } /* underline pattern */ lua_getfield(L, LUA_GLOBALSINDEX, "string"); lua_getfield(L, -1, "find"); lua_pushvalue(L, -1); /* string.find */ lua_pushvalue(L, 2); /* str */ lua_pushvalue(L, 3); /* pattern */ lua_call(L, 2, 2); while (!lua_isnil(L, -2)) { int start = lua_tointeger(L, -2); int end = lua_tointeger(L, -1); cairo_text_extents_t te1; memcpy(tmp, str, start-1); tmp[start-1] = 0; cairo_text_extents(c->cr, tmp, &te1); cairo_text_extents_t te2; memcpy(tmp, str+start-1, end-start+1); tmp[end-start+1] = 0; cairo_text_extents(c->cr, tmp, &te2); cairo_move_to(c->cr, x1 + te1.x_advance, y1 + 1); cairo_rel_line_to(c->cr, te2.x_advance, 0); cairo_stroke(c->cr); lua_pop(L, 2); lua_pushvalue(L, -1); /* string.find */ lua_pushvalue(L, 2); /* str */ lua_pushvalue(L, 3); /* pattern */ lua_pushinteger(L, end + 1); /* init */ lua_call(L, 3, 2); } cairo_move_to(c->cr, x2, y2); return 0; }
static void draw(GtkWidget *widget, cairo_t *cr, gpointer data) { CalibArea *calib_area = (CalibArea*)data; int i; double x; double y; PangoLayout *layout; PangoRectangle logical_rect; GtkStyleContext *context; char *markup; resize_display(calib_area); context = gtk_widget_get_style_context (widget); /* Black background and reset the operator */ cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* If calibration is successful, just draw the tick */ if (calib_area->icon_success) { draw_success_icon (calib_area, cr); return; } /* Print the help lines */ layout = pango_layout_new (gtk_widget_get_pango_context (widget)); pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); markup = g_strdup_printf ("<span foreground=\"white\"><big><b>%s</b></big>\n<big>%s</big></span>", _(HELP_TEXT_TITLE), _(HELP_TEXT_MAIN)); pango_layout_set_markup (layout, markup, -1); g_free (markup); pango_layout_get_pixel_extents (layout, NULL, &logical_rect); x = (calib_area->display_width - logical_rect.width) / 2 + logical_rect.x; y = (calib_area->display_height - logical_rect.height) / 2 - logical_rect.height - 40 + logical_rect.y; gtk_render_layout (context, cr, x + logical_rect.x, y + logical_rect.y, layout); g_object_unref (layout); /* Draw the points */ cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); i = calib_area->calibrator.num_clicks; cairo_set_line_width(cr, 1); cairo_move_to(cr, calib_area->X[i] - CROSS_LINES, calib_area->Y[i] - 0.5); cairo_rel_line_to(cr, CROSS_LINES*2, 0); cairo_move_to(cr, calib_area->X[i] - 0.5, calib_area->Y[i] - CROSS_LINES); cairo_rel_line_to(cr, 0, CROSS_LINES*2); cairo_stroke(cr); cairo_set_line_width(cr, 2); cairo_arc(cr, calib_area->X[i] - 0.5, calib_area->Y[i] - 0.5, CROSS_CIRCLE, 0.0, 2.0 * M_PI); cairo_stroke(cr); cairo_set_line_width(cr, 5); cairo_arc(cr, calib_area->X[i] - 0.5, calib_area->Y[i] - 0.5, CROSS_CIRCLE2, 0.0, 2.0 * M_PI); cairo_stroke(cr); /* Draw the clock background */ cairo_arc(cr, calib_area->display_width/2, calib_area->display_height/2, CLOCK_RADIUS/2, 0.0, 2.0 * M_PI); cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); cairo_fill_preserve(cr); cairo_stroke(cr); cairo_set_line_width(cr, CLOCK_LINE_WIDTH); cairo_arc(cr, calib_area->display_width/2, calib_area->display_height/2, (CLOCK_RADIUS - CLOCK_LINE_WIDTH - CLOCK_LINE_PADDING)/2, 3/2.0*M_PI, (3/2.0*M_PI) + ((double)calib_area->time_elapsed/(double)MAX_TIME) * 2*M_PI); cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); cairo_stroke(cr); /* Draw the message (if any) */ if (calib_area->message != NULL) { cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); /* Frame the message */ layout = pango_layout_new (gtk_widget_get_pango_context (widget)); pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER); markup = g_strdup_printf ("<span foreground=\"white\"><big>%s</big></span>", _(calib_area->message)); pango_layout_set_markup (layout, markup, -1); g_free (markup); pango_layout_get_pixel_extents (layout, NULL, &logical_rect); x = (calib_area->display_width - logical_rect.width) / 2 + logical_rect.x; y = (calib_area->display_height - logical_rect.height + CLOCK_RADIUS) / 2 + 60 + logical_rect.y; cairo_set_line_width(cr, 2); cairo_rectangle(cr, x - 10 - 0.5 , y - 10 - 0.5, logical_rect.width + 20 + 1, logical_rect.height + 20 + 1); cairo_stroke (cr); /* Print the message */ gtk_render_layout (context, cr, x + logical_rect.x, y + logical_rect.y, layout); g_object_unref (layout); } }
static gboolean dt_iop_zonesystem_bar_expose (GtkWidget *widget, GdkEventExpose *event, dt_iop_module_t *self) { dt_iop_zonesystem_gui_data_t *g = (dt_iop_zonesystem_gui_data_t *)self->gui_data; dt_iop_zonesystem_params_t *p = (dt_iop_zonesystem_params_t *)self->params; const int inset = DT_ZONESYSTEM_INSET; int width = widget->allocation.width, height = widget->allocation.height; cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); /* clear background */ cairo_set_source_rgb (cr, .15, .15, .15); cairo_paint(cr); /* translate and scale */ width-=2*inset; height-=2*inset; cairo_save(cr); cairo_translate(cr, inset, inset); cairo_scale(cr,width,height); /* render the bars */ float zonemap[MAX_ZONE_SYSTEM_SIZE]= {0}; _iop_zonesystem_calculate_zonemap (p, zonemap); float s=(1./(p->size-2)); cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); for(int i=0; i<p->size-1; i++) { /* draw the reference zone */ float z=s*i; cairo_rectangle (cr,(1./(p->size-1))*i,0,(1./(p->size-1)),DT_ZONESYSTEM_REFERENCE_SPLIT-DT_ZONESYSTEM_BAR_SPLIT_WIDTH); cairo_set_source_rgb (cr, z, z, z); cairo_fill (cr); /* draw zone mappings */ cairo_rectangle (cr, zonemap[i],DT_ZONESYSTEM_REFERENCE_SPLIT+DT_ZONESYSTEM_BAR_SPLIT_WIDTH, (zonemap[i+1]-zonemap[i]),1.0-DT_ZONESYSTEM_REFERENCE_SPLIT); cairo_set_source_rgb (cr, z, z, z); cairo_fill (cr); } cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); cairo_restore (cr); /* render zonebar control lines */ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE); cairo_set_line_width (cr, 1.); cairo_rectangle (cr,inset,inset,width,height); cairo_set_source_rgb (cr, .1,.1,.1); cairo_stroke (cr); cairo_set_antialias (cr, CAIRO_ANTIALIAS_DEFAULT); /* render control points handles */ cairo_set_source_rgb (cr, 0.6, 0.6, 0.6); cairo_set_line_width (cr, 1.); const float arrw = 7.0f; for (int k=1; k<p->size-1; k++) { float nzw=zonemap[k+1]-zonemap[k]; float pzw=zonemap[k]-zonemap[k-1]; if ( ( ((g->mouse_x/width) > (zonemap[k]-(pzw/2.0))) && ((g->mouse_x/width) < (zonemap[k]+(nzw/2.0))) ) || p->zone[k] != -1) { gboolean is_under_mouse = ((width*zonemap[k]) - arrw*.5f < g->mouse_x && (width*zonemap[k]) + arrw*.5f > g->mouse_x); cairo_move_to(cr, inset+(width*zonemap[k]), height+(2*inset)-1); cairo_rel_line_to(cr, -arrw*.5f, 0); cairo_rel_line_to(cr, arrw*.5f, -arrw); cairo_rel_line_to(cr, arrw*.5f, arrw); cairo_close_path(cr); if ( is_under_mouse ) cairo_fill(cr); else cairo_stroke(cr); } } /* push mem surface into widget */ cairo_destroy (cr); cairo_t *cr_pixmap = gdk_cairo_create (gtk_widget_get_window (widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint (cr_pixmap); cairo_destroy (cr_pixmap); cairo_surface_destroy (cst); return TRUE; }
static void draw_frame(ANativeWindow_Buffer *buffer) { int pixel_size = 0; cairo_surface_t *surface = NULL; /* Setup our cairo surface to render directly to the native window buffer */ if (buffer->format == WINDOW_FORMAT_RGB_565) { pixel_size = 2; surface = cairo_image_surface_create_for_data(buffer->bits, CAIRO_FORMAT_RGB16_565, buffer->width, buffer->height, buffer->stride*pixel_size); } else if (buffer->format == WINDOW_FORMAT_RGBA_8888 || buffer->format == WINDOW_FORMAT_RGBX_8888) { pixel_size = 4; surface = cairo_image_surface_create_for_data(buffer->bits, CAIRO_FORMAT_RGB24, buffer->width, buffer->height, buffer->stride*pixel_size); } else { LOGE("Unsupported buffer format: %d", buffer->format); return; } cairo_t *cr = cairo_create(surface); /* clear the screen */ memset(buffer->bits, 0, buffer->stride*pixel_size*buffer->height); /* Normalize our canvas size to make our lives easier */ cairo_scale(cr, buffer->width, buffer->height); /* Draw the big X */ double position = (tick%30)*(1.0/30); cairo_set_source_rgba (cr, 0.5, 0.5, 0.5, 0.7); cairo_move_to (cr, 0.1, position); cairo_line_to (cr, 0.9, 1.0-position); cairo_move_to (cr, 0.9, position); cairo_line_to (cr, 0.1, 1.0-position); cairo_set_line_width (cr, 0.1); cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); cairo_stroke (cr); /* Draw three color squares */ cairo_rectangle (cr, 0, 0,0.5, 0.5); cairo_set_source_rgba (cr, 1, 0, 0, 0.50); cairo_fill (cr); cairo_rectangle (cr, 0, 0.5, 0.5, 0.5); cairo_set_source_rgba (cr, 0, 1, 0, 0.50); cairo_fill (cr); cairo_rectangle (cr, 0.5, 0, 0.5, 0.5); cairo_set_source_rgba (cr, 0, 0, 1, 0.50); cairo_fill (cr); /* Draw a more complicated path */ cairo_set_line_width (cr, 0.04); cairo_scale(cr, 0.5, 0.5); cairo_translate(cr, 0.5, 1.0); cairo_set_source_rgba (cr, 1.0, 0.2, 0.0, 0.5); cairo_move_to (cr, 0.25, 0.25); cairo_line_to (cr, 0.5, 0.375); cairo_rel_line_to (cr, 0.25, -0.125); cairo_arc (cr, 0.5, 0.5, 0.25 * sqrt(2), -0.25 * M_PI, 0.25 * M_PI); cairo_rel_curve_to (cr, -0.25, -0.125, -0.25, 0.125, -0.5, 0); cairo_close_path (cr); cairo_set_line_cap(cr, CAIRO_LINE_CAP_BUTT); cairo_stroke (cr); /* Clean up. */ cairo_destroy(cr); cairo_surface_destroy(surface); }
static void cd_rendering_make_3D_separator (Icon *icon, cairo_t *pCairoContext, CairoDock *pDock, gboolean bIncludeEdges, gboolean bBackGround) { double hi = myIcons.fReflectSize * pDock->fRatio + myBackground.iFrameMargin; hi = pDock->iCurrentHeight - (icon->fDrawY + icon->fHeight * icon->fScale); double fLeftInclination = (icon->fDrawX - pDock->iCurrentWidth / 2) / iVanishingPointY; double fRightInclination = (icon->fDrawX + icon->fWidth * icon->fScale - pDock->iCurrentWidth / 2) / iVanishingPointY; double fHeight, fBigWidth, fLittleWidth; if (bIncludeEdges) { fHeight = (bBackGround ? pDock->iDecorationsHeight - hi : hi) + myBackground.iDockLineWidth; fBigWidth = fabs (fRightInclination - fLeftInclination) * (bBackGround ? iVanishingPointY : iVanishingPointY + fHeight); fLittleWidth = fabs (fRightInclination - fLeftInclination) * (bBackGround ? iVanishingPointY - fHeight : iVanishingPointY); } else { fHeight = pDock->iDecorationsHeight - myBackground.iDockLineWidth; fBigWidth = fabs (fRightInclination - fLeftInclination) * (iVanishingPointY + hi); fLittleWidth = fabs (fRightInclination - fLeftInclination) * (iVanishingPointY + hi - fHeight); } double fDeltaXLeft = fHeight * fLeftInclination; double fDeltaXRight = fHeight * fRightInclination; //g_print ("fBigWidth : %.2f ; fLittleWidth : %.2f\n", fBigWidth, fLittleWidth); int sens; double fDockOffsetX, fDockOffsetY; if (pDock->bDirectionUp) { sens = 1; if (bIncludeEdges) fDockOffsetY = pDock->iCurrentHeight - fHeight - (bBackGround ? myBackground.iDockLineWidth + hi : 0); else fDockOffsetY = pDock->iCurrentHeight - fHeight - myBackground.iDockLineWidth; } else { sens = -1; if (bIncludeEdges) fDockOffsetY = fHeight + (bBackGround ? myBackground.iDockLineWidth + hi : 0); else fDockOffsetY = fHeight + myBackground.iDockLineWidth; } if (bIncludeEdges) fDockOffsetX = icon->fDrawX - (bBackGround ? fHeight * fLeftInclination : 0); else fDockOffsetX = icon->fDrawX - (fHeight - hi) * fLeftInclination; if (pDock->bHorizontalDock) { cairo_translate (pCairoContext, fDockOffsetX, fDockOffsetY); // coin haut gauche. cairo_move_to (pCairoContext, 0, 0); // coin haut gauche. cairo_rel_line_to (pCairoContext, fLittleWidth, 0); cairo_rel_line_to (pCairoContext, fDeltaXRight, sens * fHeight); cairo_rel_line_to (pCairoContext, - fBigWidth, 0); cairo_rel_line_to (pCairoContext, - fDeltaXLeft, - sens * fHeight); if (my_iDrawSeparator3D == CD_FLAT_SEPARATOR) { if (! pDock->bDirectionUp) cairo_scale (pCairoContext, 1, -1); cairo_set_source_surface (pCairoContext, my_pFlatSeparatorSurface[CAIRO_DOCK_HORIZONTAL], MIN (0, (fHeight + hi) * fLeftInclination), 0); } } else { cairo_translate (pCairoContext, fDockOffsetY, fDockOffsetX); // coin haut gauche. cairo_move_to (pCairoContext, 0, 0); // coin haut gauche. cairo_rel_line_to (pCairoContext, 0, fLittleWidth); cairo_rel_line_to (pCairoContext, sens * fHeight, fDeltaXRight); cairo_rel_line_to (pCairoContext, 0, - fBigWidth); cairo_rel_line_to (pCairoContext, - sens * fHeight, - fDeltaXLeft); if (my_iDrawSeparator3D == CD_FLAT_SEPARATOR) { if (! pDock->bDirectionUp) cairo_scale (pCairoContext, -1, 1); cairo_set_source_surface (pCairoContext, my_pFlatSeparatorSurface[CAIRO_DOCK_VERTICAL], 0, MIN (0, (fHeight + hi) * fLeftInclination)); } } }
static gboolean dt_iop_levels_expose(GtkWidget *widget, GdkEventExpose *event, gpointer user_data) { dt_iop_module_t *self = (dt_iop_module_t *)user_data; dt_iop_levels_gui_data_t *c = (dt_iop_levels_gui_data_t *)self->gui_data; dt_iop_levels_params_t *p = (dt_iop_levels_params_t *)self->params; const int inset = DT_GUI_CURVE_EDITOR_INSET; int width = widget->allocation.width, height = widget->allocation.height; cairo_surface_t *cst = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t *cr = cairo_create(cst); float mean_picked_color = *self->picked_color / 100.0; /* we need to save the last picked color to prevent flickering when * changing from one picker to another, as the picked_color value does not * update as rapidly */ if(self->request_color_pick && mean_picked_color != c->last_picked_color) { float previous_color[3]; previous_color[0] = p->levels[0]; previous_color[1] = p->levels[1]; previous_color[2] = p->levels[2]; c->last_picked_color = mean_picked_color; if (BLACK == c->current_pick) { if (mean_picked_color > p->levels[1]) { p->levels[0] = p->levels[1]-FLT_EPSILON; } else { p->levels[0] = mean_picked_color; } c->pick_xy_positions[0][0] = self->color_picker_point[0]; c->pick_xy_positions[0][1] = self->color_picker_point[1]; } else if (GREY == c->current_pick) { if (mean_picked_color < p->levels[0] || mean_picked_color > p->levels[2]) { p->levels[1] = p->levels[1]; } else { p->levels[1] = mean_picked_color; } c->pick_xy_positions[1][0] = self->color_picker_point[0]; c->pick_xy_positions[1][1] = self->color_picker_point[1]; } else if (WHITE == c->current_pick) { if (mean_picked_color < p->levels[1]) { p->levels[2] = p->levels[1]+FLT_EPSILON; } else { p->levels[2] = mean_picked_color; } c->pick_xy_positions[2][0] = self->color_picker_point[0]; c->pick_xy_positions[2][1] = self->color_picker_point[1]; } if ( previous_color[0] != p->levels[0] || previous_color[1] != p->levels[1] || previous_color[2] != p->levels[2] ) { dt_dev_add_history_item(darktable.develop, self, TRUE); } } // clear bg cairo_set_source_rgb (cr, .2, .2, .2); cairo_paint(cr); cairo_translate(cr, inset, inset); width -= 2*inset; height -= 2*inset; cairo_set_line_width(cr, 1.0); cairo_set_source_rgb (cr, .1, .1, .1); cairo_rectangle(cr, 0, 0, width, height); cairo_stroke(cr); cairo_set_source_rgb (cr, .3, .3, .3); cairo_rectangle(cr, 0, 0, width, height); cairo_fill(cr); // draw grid cairo_set_line_width(cr, .4); cairo_set_source_rgb (cr, .1, .1, .1); dt_draw_vertical_lines(cr, 4, 0, 0, width, height); // Drawing the vertical line indicators cairo_set_line_width(cr, 2.); for(int k = 0; k < 3; k++) { if(k == c->handle_move && c->mouse_x > 0) cairo_set_source_rgb(cr, 1, 1, 1); else cairo_set_source_rgb(cr, .7, .7, .7); cairo_move_to(cr, width*p->levels[k], height); cairo_rel_line_to(cr, 0, -height); cairo_stroke(cr); } // draw x positions cairo_set_line_width(cr, 1.); const float arrw = 7.0f; for(int k=0; k<3; k++) { switch(k) { case 0: cairo_set_source_rgb(cr, 0, 0, 0); break; case 1: cairo_set_source_rgb(cr, 0.5, 0.5, 0.5); break; default: cairo_set_source_rgb(cr, 1, 1, 1); break; } cairo_move_to(cr, width*p->levels[k], height+inset-1); cairo_rel_line_to(cr, -arrw*.5f, 0); cairo_rel_line_to(cr, arrw*.5f, -arrw); cairo_rel_line_to(cr, arrw*.5f, arrw); cairo_close_path(cr); if(c->handle_move == k && c->mouse_x > 0) cairo_fill(cr); else cairo_stroke(cr); } cairo_translate(cr, 0, height); // draw lum histogram in background // only if the module is enabled if (self->enabled) { dt_develop_t *dev = darktable.develop; float *hist, hist_max; hist = dev->histogram_pre_levels; hist_max = dev->histogram_linear?dev->histogram_pre_levels_max:logf(1.0 + dev->histogram_pre_levels_max); if(hist_max > 0) { cairo_save(cr); cairo_scale(cr, width/63.0, -(height-5)/(float)hist_max); cairo_set_source_rgba(cr, .2, .2, .2, 0.5); dt_draw_histogram_8(cr, hist, 3); cairo_restore(cr); } } // Cleaning up cairo_destroy(cr); cairo_t *cr_pixmap = gdk_cairo_create(gtk_widget_get_window(widget)); cairo_set_source_surface (cr_pixmap, cst, 0, 0); cairo_paint(cr_pixmap); cairo_destroy(cr_pixmap); cairo_surface_destroy(cst); return TRUE; }