/* Draw a rectangle on the screen */ static void draw_brush (GtkWidget *widget, gdouble x, gdouble y) { GdkRectangle update_rect; cairo_t *cr; if (surface == NULL || cairo_image_surface_get_width (surface) != gtk_widget_get_width (widget) || cairo_image_surface_get_height (surface) != gtk_widget_get_height (widget)) create_surface (widget); update_rect.x = x - 3; update_rect.y = y - 3; update_rect.width = 6; update_rect.height = 6; /* Paint to the surface, where we store our state */ cr = cairo_create (surface); gdk_cairo_rectangle (cr, &update_rect); cairo_fill (cr); cairo_destroy (cr); gtk_widget_queue_draw (widget); }
static void cb_compose_images_snapshot (GtkWidget *widget, GtkSnapshot *snapshot) { const int width = gtk_widget_get_width (widget); const int height = gtk_widget_get_height (widget); /* This is only relevant when an image gets transitioned to being deleted, * but we just always push a clip node here, for simplicity. */ gtk_snapshot_push_clip (snapshot, &GRAPHENE_RECT_INIT (0, 0, width, height), "ComposeImagesClip"); GTK_WIDGET_CLASS (cb_compose_images_parent_class)->snapshot (widget, snapshot); gtk_snapshot_pop (snapshot); }
/* Create a new surface of the appropriate size to store our scribbles */ static void create_surface (GtkWidget *widget) { cairo_t *cr; if (surface) cairo_surface_destroy (surface); surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, gtk_widget_get_width (widget), gtk_widget_get_height (widget)); /* Initialize the surface to white */ cr = cairo_create (surface); cairo_set_source_rgb (cr, 1, 1, 1); cairo_paint (cr); cairo_destroy (cr); }