[dia/cairo-port: 49/53] Working rendering of the canvas
- From: Zander <zbrown src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia/cairo-port: 49/53] Working rendering of the canvas
- Date: Sat, 11 May 2019 15:36:23 +0000 (UTC)
commit f1de9111d1dc5bc175de229d4aebe1a32cb79198
Author: Zander Brown <zbrown gnome org>
Date: Tue Dec 25 12:25:09 2018 +0000
Working rendering of the canvas
app/display.c | 165 +-----------------------------------
app/display.h | 5 --
app/interface.c | 59 +++++++++++--
lib/diainteractiverenderer.c | 16 +++-
lib/diarenderer.h | 39 +++++----
lib/renderer/diacairo-interactive.c | 74 ++++++++--------
6 files changed, 128 insertions(+), 230 deletions(-)
---
diff --git a/app/display.c b/app/display.c
index 5586ee89..0439bf5d 100644
--- a/app/display.c
+++ b/app/display.c
@@ -199,8 +199,6 @@ copy_display(DDisplay *orig_ddisp)
ddisp->aa_renderer = orig_ddisp->aa_renderer;
ddisp->update_areas = orig_ddisp->update_areas;
- ddisp->display_areas = orig_ddisp->display_areas;
- ddisp->update_id = 0;
ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0;
@@ -258,8 +256,6 @@ new_display(Diagram *dia)
ddisp->aa_renderer = (preset > 0 ? TRUE : FALSE);
ddisp->update_areas = NULL;
- ddisp->display_areas = NULL;
- ddisp->update_id = 0;
ddisp->clicked_position.x = ddisp->clicked_position.y = 0.0;
@@ -362,20 +358,6 @@ ddisplay_add_update_pixels(DDisplay *ddisp, Point *point,
ddisplay_add_update(ddisp, &rect);
}
-/** Free display_areas list */
-static void
-ddisplay_free_display_areas(DDisplay *ddisp)
-{
- GSList *l;
- l = ddisp->display_areas;
- while(l!=NULL) {
- g_free(l->data);
- l = g_slist_next(l);
- }
- g_slist_free(ddisp->display_areas);
- ddisp->display_areas = NULL;
-}
-
/** Free update_areas list */
static void
ddisplay_free_update_areas(DDisplay *ddisp)
@@ -399,9 +381,6 @@ ddisplay_add_update_all(DDisplay *ddisp)
if (ddisp->update_areas != NULL) {
ddisplay_free_update_areas(ddisp);
}
- if (ddisp->display_areas != NULL) {
- ddisplay_free_display_areas(ddisp);
- }
ddisplay_add_update(ddisp, &ddisp->visible);
}
@@ -426,8 +405,6 @@ void
ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect)
{
Rectangle *r;
- int top,bottom,left,right;
- Rectangle *visible;
int width, height;
if (!ddisp->renderer)
@@ -450,122 +427,7 @@ ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect)
rectangle_intersection(r, &ddisp->visible);
}
- visible = &ddisp->visible;
- left = floor( (r->left - visible->left) * (real)width /
- (visible->right - visible->left) ) - 1;
- top = floor( (r->top - visible->top) * (real)height /
- (visible->bottom - visible->top) ) - 1;
- right = ceil( (r->right - visible->left) * (real)width /
- (visible->right - visible->left) ) + 1;
- bottom = ceil( (r->bottom - visible->top) * (real)height /
- (visible->bottom - visible->top) ) + 1;
-
- ddisplay_add_display_area(ddisp,
- left, top,
- right, bottom);
-}
-
-void
-ddisplay_add_display_area(DDisplay *ddisp,
- int left, int top,
- int right, int bottom)
-{
- IRectangle *r;
-
- if (!ddisp->renderer)
- return; /* if we don't have a renderer yet prefer ignoring over crashing */
- if (left < 0)
- left = 0;
- if (top < 0)
- top = 0;
- if (right > dia_renderer_get_width_pixels (ddisp->renderer))
- right = dia_renderer_get_width_pixels (ddisp->renderer);
- if (bottom > dia_renderer_get_height_pixels (ddisp->renderer))
- bottom = dia_renderer_get_height_pixels (ddisp->renderer);
-
- /* draw some rectangles to show where updates are...*/
- /*
- gdk_draw_rectangle(gtk_widget_get_window(ddisp->canvas),
- gtk_widget_get_style(ddisp->canvas)->black_gc, TRUE,
- left, top, right-left,bottom-top);
- */
- /* Temporarily just do a union of all Irectangles: */
- if (ddisp->display_areas==NULL) {
- r = g_new(IRectangle,1);
- r->top = top; r->bottom = bottom;
- r->left = left; r->right = right;
- ddisp->display_areas = g_slist_prepend(ddisp->display_areas, r);
- } else {
- r = (IRectangle *) ddisp->display_areas->data;
-
- r->top = MIN( r->top, top );
- r->bottom = MAX( r->bottom, bottom );
- r->left = MIN( r->left, left );
- r->right = MAX( r->right, right );
- }
-}
-
-static gboolean
-ddisplay_update_handler(DDisplay *ddisp)
-{
- GSList *l;
- IRectangle *ir;
- Rectangle *r, totrect;
- DiaInteractiveRendererInterface *renderer;
-
- g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
-
- /* Renders updates to pixmap + copies display_areas to canvas(screen) */
- renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
-
- /* Only update if update_areas exist */
- l = ddisp->update_areas;
- if (l != NULL)
- {
- totrect = *(Rectangle *) l->data;
-
- g_return_val_if_fail ( renderer->clip_region_clear != NULL
- && renderer->clip_region_add_rect != NULL, FALSE);
-
- renderer->clip_region_clear (ddisp->renderer);
-
- while(l!=NULL) {
- r = (Rectangle *) l->data;
-
- rectangle_union(&totrect, r);
- renderer->clip_region_add_rect (ddisp->renderer, r);
-
- l = g_slist_next(l);
- }
- /* Free update_areas list: */
- ddisplay_free_update_areas(ddisp);
-
- totrect.left -= 0.1;
- totrect.right += 0.1;
- totrect.top -= 0.1;
- totrect.bottom += 0.1;
-
- ddisplay_render_pixmap(ddisp, &totrect);
- }
-
- l = ddisp->display_areas;
- while(l!=NULL) {
- ir = (IRectangle *) l->data;
-
- g_return_val_if_fail (renderer->copy_to_window, FALSE);
- renderer->copy_to_window(ddisp->renderer,
- gtk_widget_get_window(ddisp->canvas),
- ir->left, ir->top,
- ir->right - ir->left, ir->bottom - ir->top);
-
- l = g_slist_next(l);
- }
-
- ddisplay_free_display_areas(ddisp);
-
- ddisp->update_id = 0;
-
- return FALSE;
+ gtk_widget_queue_draw (ddisp->canvas);
}
void
@@ -579,12 +441,7 @@ ddisplay_flush(DDisplay *ddisp)
* GTK_PRIORITY_RESIZE = (G_PRIORITY_HIGH_IDLE + 10)
* Dia's canvas rendering is in between
*/
- if (!ddisp->update_id)
- ddisp->update_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE+15, (GSourceFunc)ddisplay_update_handler,
ddisp, NULL);
- if (ddisp->display_areas) {
- IRectangle *r = (IRectangle *)ddisp->display_areas->data;
- dia_log_message ("DispUpdt: %4d,%3d - %4d,%3d\n", r->left, r->top, r->right, r->bottom);
- }
+ gtk_widget_queue_draw (ddisp->canvas);
}
static void
@@ -1097,12 +954,6 @@ ddisplay_set_renderer(DDisplay *ddisp, int aa_renderer)
int width, height;
GdkWindow *window = gtk_widget_get_window(ddisp->canvas);
- /* dont mix new renderer with old updates */
- if (ddisp->update_id) {
- g_source_remove (ddisp->update_id);
- ddisp->update_id = 0;
- }
-
if (ddisp->renderer)
g_object_unref (ddisp->renderer);
@@ -1213,10 +1064,6 @@ are_you_sure_close_dialog_respond(GtkWidget *widget, /* the dialog */
if (close_ddisp) /* saving succeeded */
recent_file_history_add(ddisp->diagram->filename);
- if (ddisp->update_id && close_ddisp) {
- g_source_remove (ddisp->update_id);
- ddisp->update_id = 0;
- }
/* fall through */
case GTK_RESPONSE_NO :
if (close_ddisp)
@@ -1351,12 +1198,6 @@ ddisplay_really_destroy(DDisplay *ddisp)
if (active_display == ddisp)
display_set_active(NULL);
- /* last chance to avoid crashing in the idle update */
- if (ddisp->update_id) {
- g_source_remove (ddisp->update_id);
- ddisp->update_id = 0;
- }
-
if (ddisp->diagram) {
diagram_remove_ddisplay(ddisp->diagram, ddisp);
/* if we are the last user of the diagram it will be unref'ed */
@@ -1369,8 +1210,6 @@ ddisplay_really_destroy(DDisplay *ddisp)
/* Free update_areas list: */
ddisplay_free_update_areas(ddisp);
- /* Free display_areas list */
- ddisplay_free_display_areas(ddisp);
g_free(ddisp);
}
diff --git a/app/display.h b/app/display.h
index 6ec1a7f6..06242df1 100644
--- a/app/display.h
+++ b/app/display.h
@@ -83,8 +83,6 @@ struct _DDisplay {
DiaRenderer *renderer;
GSList *update_areas; /* Update areas list */
- GSList *display_areas; /* Display areas list */
- guint update_id; /* idle handler ID for redraws */
GtkIMContext *im_context;
@@ -135,9 +133,6 @@ void ddisplay_add_update_all(DDisplay *ddisp);
void ddisplay_add_update_with_border(DDisplay *ddisp, const Rectangle *rect,
int pixel_border);
void ddisplay_add_update(DDisplay *ddisp, const Rectangle *rect);
-void ddisplay_add_display_area(DDisplay *ddisp,
- int left, int top,
- int right, int bottom);
void ddisplay_flush(DDisplay *ddisp);
void ddisplay_update_scrollbars(DDisplay *ddisp);
void ddisplay_set_origo(DDisplay *ddisp,
diff --git a/app/interface.c b/app/interface.c
index fd32e492..8111f896 100644
--- a/app/interface.c
+++ b/app/interface.c
@@ -385,20 +385,61 @@ canvas_configure_event (GtkWidget *widget,
return new_size;
}
-/* Got when an area previously obscured need to be redrawn.
- * Needs GDK_EXPOSURE_MASK.
- * Gone with gtk+-3.0 or better replaced by "draw".
- */
static gboolean
canvas_expose_event (GtkWidget *widget,
GdkEventExpose *event,
DDisplay *ddisp)
{
- ddisplay_add_display_area (ddisp,
- event->area.x, event->area.y,
- event->area.x + event->area.width,
- event->area.y + event->area.height);
- ddisplay_flush(ddisp);
+ GSList *l;
+ Rectangle *r, totrect;
+ DiaInteractiveRendererInterface *renderer;
+
+ g_return_val_if_fail (ddisp->renderer != NULL, FALSE);
+
+ /* Renders updates to pixmap + copies display_areas to canvas(screen) */
+ renderer = DIA_GET_INTERACTIVE_RENDERER_INTERFACE (ddisp->renderer);
+
+ /* Only update if update_areas exist */
+ l = ddisp->update_areas;
+ if (l != NULL)
+ {
+ totrect = *(Rectangle *) l->data;
+
+ g_return_val_if_fail ( renderer->clip_region_clear != NULL
+ && renderer->clip_region_add_rect != NULL, FALSE);
+
+ renderer->clip_region_clear (ddisp->renderer);
+
+ while(l!=NULL) {
+ r = (Rectangle *) l->data;
+
+ rectangle_union(&totrect, r);
+ renderer->clip_region_add_rect (ddisp->renderer, r);
+
+ l = g_slist_next(l);
+ }
+ /* Free update_areas list: */
+ l = ddisp->update_areas;
+ while(l!=NULL) {
+ g_free(l->data);
+ l = g_slist_next(l);
+ }
+ g_slist_free(ddisp->update_areas);
+ ddisp->update_areas = NULL;
+
+ totrect.left -= 0.1;
+ totrect.right += 0.1;
+ totrect.top -= 0.1;
+ totrect.bottom += 0.1;
+
+ ddisplay_render_pixmap(ddisp, &totrect);
+ }
+
+ dia_interactive_renderer_paint (ddisp->renderer,
+ ctx,
+ gtk_widget_get_allocated_width (widget),
+ gtk_widget_get_allocated_height (widget));
+
return FALSE;
}
diff --git a/lib/diainteractiverenderer.c b/lib/diainteractiverenderer.c
index 04197970..6d0976de 100644
--- a/lib/diainteractiverenderer.c
+++ b/lib/diainteractiverenderer.c
@@ -31,7 +31,7 @@ dia_interactive_renderer_iface_init (DiaInteractiveRendererInterface *iface)
iface->draw_pixel_line = NULL;
iface->draw_pixel_rect = NULL;
iface->fill_pixel_rect = NULL;
- iface->copy_to_window = NULL;
+ iface->paint = NULL;
iface->set_size = NULL;
iface->draw_object_highlighted = NULL;
}
@@ -78,3 +78,17 @@ dia_renderer_set_size (DiaRenderer* renderer, gpointer window,
irenderer->set_size (renderer, window, width, height);
}
+void
+dia_interactive_renderer_paint (DiaRenderer *renderer,
+ cairo_t *ctx,
+ int width,
+ int height)
+{
+ DiaInteractiveRendererInterface *irenderer =
+ DIA_GET_INTERACTIVE_RENDERER_INTERFACE (renderer);
+
+ g_return_if_fail (irenderer != NULL);
+ g_return_if_fail (irenderer->paint != NULL);
+
+ irenderer->paint (renderer, ctx, width, height);
+}
\ No newline at end of file
diff --git a/lib/diarenderer.h b/lib/diarenderer.h
index 368becac..eb9849d9 100644
--- a/lib/diarenderer.h
+++ b/lib/diarenderer.h
@@ -90,7 +90,7 @@ struct _DiaRendererClass
int (*get_height_pixels) (DiaRenderer*);
/*! \brief Render all the visible object in the layer */
void (*draw_layer) (DiaRenderer*, Layer *, gboolean, Rectangle *);
- /*! Calls the objects draw function, which calls the renderer again
+ /*! Calls the objects draw function, which calls the renderer again
* Affine transformation is mostly done on the renderer side for matrix!=NULL */
void (*draw_object) (DiaRenderer*, DiaObject*, DiaMatrix*);
/*! Returns the EXACT width of text in cm, using the current font.
@@ -102,8 +102,8 @@ struct _DiaRendererClass
const gchar *text, int length);
- /*
- * Function which MUST be implemented by any DiaRenderer
+ /*
+ * Function which MUST be implemented by any DiaRenderer
*/
/*! Called before rendering begins.
Can be used to do various pre-rendering setup. */
@@ -165,9 +165,9 @@ struct _DiaRendererClass
real width, real height,
DiaImage *image);
- /*
+ /*
* Functions which SHOULD be implemented by specific renderer, but
- * have a default implementation based on the above functions
+ * have a default implementation based on the above functions
*/
/*! Draw a bezier curve, given it's control points. */
void (*draw_bezier) (DiaRenderer *renderer,
@@ -197,7 +197,7 @@ struct _DiaRendererClass
Color *fill, Color *stroke);
/*
- * Highest level functions, probably only to be implemented by
+ * Highest level functions, probably only to be implemented by
* special 'high level' renderers
*/
/*! Draw a rounded rectangle, given its upper-left and lower-right corners */
@@ -211,14 +211,14 @@ struct _DiaRendererClass
Color *color, real radius );
/*! Highest level function doing specific arrow positioning */
- void (*draw_line_with_arrows) (DiaRenderer *renderer,
- Point *start, Point *end,
+ void (*draw_line_with_arrows) (DiaRenderer *renderer,
+ Point *start, Point *end,
real line_width,
Color *line_color,
Arrow *start_arrow,
Arrow *end_arrow);
/*! Highest level function doing specific arrow positioning */
- void (*draw_arc_with_arrows) (DiaRenderer *renderer,
+ void (*draw_arc_with_arrows) (DiaRenderer *renderer,
Point *start, Point *end,
Point *midpoint,
real line_width,
@@ -226,13 +226,13 @@ struct _DiaRendererClass
Arrow *start_arrow,
Arrow *end_arrow);
/*! Highest level function doing specific arrow positioning */
- void (*draw_polyline_with_arrows) (DiaRenderer *renderer,
+ void (*draw_polyline_with_arrows) (DiaRenderer *renderer,
Point *points, int num_points,
real line_width,
Color *color,
Arrow *start_arrow,
Arrow *end_arrow);
- void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer,
+ void (*draw_rounded_polyline_with_arrows) (DiaRenderer *renderer,
Point *points, int num_points,
real line_width,
Color *color,
@@ -240,7 +240,7 @@ struct _DiaRendererClass
Arrow *end_arrow,
real radius);
- void (*draw_bezier_with_arrows) (DiaRenderer *renderer,
+ void (*draw_bezier_with_arrows) (DiaRenderer *renderer,
BezPoint *points,
int num_points,
real line_width,
@@ -303,10 +303,11 @@ struct _DiaInteractiveRendererInterface
void (*fill_pixel_rect) (DiaRenderer *renderer,
int x, int y, int width, int height,
Color *color);
- /*! Copy already rendered content to the given window */
- void (*copy_to_window) (DiaRenderer *renderer,
- gpointer window,
- int x, int y, int width, int height);
+ /*! Copy already rendered content to the given context */
+ void (*paint) (DiaRenderer *renderer,
+ cairo_t *ctx,
+ int width,
+ int height);
/*! Support for drawing selected objects highlighted */
void (*draw_object_highlighted) (DiaRenderer *renderer,
DiaObject *object,
@@ -314,6 +315,12 @@ struct _DiaInteractiveRendererInterface
};
GType dia_interactive_renderer_interface_get_type (void) G_GNUC_CONST;
+
+void dia_interactive_renderer_paint (DiaRenderer *renderer,
+ cairo_t *ctx,
+ int width,
+ int height);
+
/*!
* \brief Size adjustment to the given window
* \memberof DiaInteractiveRendererInterface
diff --git a/lib/renderer/diacairo-interactive.c b/lib/renderer/diacairo-interactive.c
index d4132263..c92c62b0 100644
--- a/lib/renderer/diacairo-interactive.c
+++ b/lib/renderer/diacairo-interactive.c
@@ -80,12 +80,13 @@ static void fill_pixel_rect(DiaRenderer *renderer,
int x, int y,
int width, int height,
Color *color);
-static void set_size (DiaRenderer *renderer,
+static void set_size (DiaRenderer *renderer,
gpointer window,
int width, int height);
-static void copy_to_window (DiaRenderer *renderer,
- gpointer window,
- int x, int y, int width, int height);
+static void paint (DiaRenderer *renderer,
+ cairo_t *ctx,
+ int width,
+ int height);
static void cairo_interactive_renderer_get_property (GObject *object,
guint prop_id,
@@ -105,14 +106,14 @@ enum {
static int
get_width_pixels (DiaRenderer *object)
-{
+{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
return renderer->width;
}
static int
get_height_pixels (DiaRenderer *object)
-{
+{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
return renderer->height;
}
@@ -128,9 +129,9 @@ cairo_interactive_renderer_init (DiaCairoInteractiveRenderer *object, void *p)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
DiaRenderer *dia_renderer = DIA_RENDERER(object);
-
+
dia_renderer->is_interactive = 1;
-
+
renderer->pixmap = NULL;
renderer->highlight_color = NULL;
@@ -189,7 +190,7 @@ calculate_relative_luminance (const Color *c)
return 0.2126 * R + 0.7152 * G + 0.0722 * B;
}
-static void
+static void
draw_text_line (DiaRenderer *self, TextLine *text_line,
Point *pos, Alignment alignment, Color *color)
{
@@ -209,7 +210,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
real x = pos->x;
real y = pos->y;
- y -= text_line_get_ascent(text_line);
+ y -= text_line_get_ascent(text_line);
x -= text_line_get_alignment_adjustment (text_line, alignment);
rl = calculate_relative_luminance (color) + 0.05;
@@ -218,17 +219,17 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
cr2 = calculate_relative_luminance (&alternate_color) + 0.05;
cr2 = (cr2 > rl) ? cr2 / rl : rl / cr2;
- /* use color giving the better contrast ratio, if necessary
+ /* use color giving the better contrast ratio, if necessary
* http://www.w3.org/TR/2008/REC-WCAG20-20081211/#visual-audio-contrast-contrast
*/
if (cr1 > cr2)
- cairo_set_source_rgba (renderer->cr,
+ cairo_set_source_rgba (renderer->cr,
interactive->highlight_color->red,
interactive->highlight_color->green,
interactive->highlight_color->blue,
1.0);
else
- cairo_set_source_rgba (renderer->cr,
+ cairo_set_source_rgba (renderer->cr,
alternate_color.red,
alternate_color.green,
alternate_color.blue,
@@ -240,7 +241,7 @@ draw_text_line (DiaRenderer *self, TextLine *text_line,
DIA_RENDERER_CLASS (parent_class)->draw_text_line (self, text_line, pos, alignment, color);
}
static void
-draw_object_highlighted (DiaRenderer *self,
+draw_object_highlighted (DiaRenderer *self,
DiaObject *object,
DiaHighlightType type)
{
@@ -263,7 +264,7 @@ draw_object_highlighted (DiaRenderer *self,
/* always reset when done with this object */
interactive->highlight_color = NULL;
}
-static void
+static void
dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* iface)
{
iface->clip_region_clear = clip_region_clear;
@@ -271,7 +272,7 @@ dia_cairo_interactive_renderer_iface_init (DiaInteractiveRendererInterface* ifac
iface->draw_pixel_line = draw_pixel_line;
iface->draw_pixel_rect = draw_pixel_rect;
iface->fill_pixel_rect = fill_pixel_rect;
- iface->copy_to_window = copy_to_window;
+ iface->paint = paint;
iface->set_size = set_size;
iface->draw_object_highlighted = draw_object_highlighted;
}
@@ -296,7 +297,7 @@ dia_cairo_interactive_renderer_get_type (void)
(GInstanceInitFunc) cairo_interactive_renderer_init /* init */
};
- static const GInterfaceInfo irenderer_iface_info =
+ static const GInterfaceInfo irenderer_iface_info =
{
(GInterfaceInitFunc) dia_cairo_interactive_renderer_iface_init,
NULL, /* iface_finalize */
@@ -313,7 +314,7 @@ dia_cairo_interactive_renderer_get_type (void)
&irenderer_iface_info);
}
-
+
return object_type;
}
@@ -329,7 +330,7 @@ begin_render(DiaRenderer *self, const Rectangle *update)
/* Setup clipping for this sequence of render operations */
/* Must be done before the scaling because the clip is in pixel coords */
gdk_cairo_region (base_renderer->cr, renderer->clip_region);
- cairo_clip(base_renderer->cr);
+ cairo_clip(base_renderer->cr);
cairo_scale (base_renderer->cr, *renderer->zoom_factor, *renderer->zoom_factor);
cairo_translate (base_renderer->cr, -renderer->visible->left, -renderer->visible->top);
@@ -389,7 +390,7 @@ cairo_interactive_renderer_class_init (DiaCairoInteractiveRendererClass *klass)
_("Visible rect pointer"),
_("Visible rect pointer"),
G_PARAM_READWRITE));
-
+
/* renderer members */
renderer_class->get_width_pixels = get_width_pixels;
renderer_class->get_height_pixels = get_height_pixels;
@@ -430,7 +431,7 @@ cairo_interactive_renderer_get_property (GObject *object,
GParamSpec *pspec)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
-
+
switch (prop_id) {
case PROP_ZOOM:
g_value_set_pointer (value, renderer->zoom_factor);
@@ -462,18 +463,19 @@ set_size(DiaRenderer *object, gpointer window,
}
static void
-copy_to_window (DiaRenderer *object, gpointer window,
- int x, int y, int width, int height)
+paint (DiaRenderer *object,
+ cairo_t *ctx,
+ int width,
+ int height)
{
DiaCairoInteractiveRenderer *renderer = DIA_CAIRO_INTERACTIVE_RENDERER (object);
- cairo_t *cr;
-
- cr = gdk_cairo_create (GDK_WINDOW(window));
- cairo_set_source_surface (cr, renderer->pixmap, 0.0, 0.0);
- cairo_rectangle (cr, x, y, width > 0 ? width : -width, height > 0 ? height : -height);
- cairo_clip (cr);
- cairo_paint (cr);
- cairo_destroy (cr);
+
+ cairo_save (ctx);
+ cairo_set_source_surface (ctx, renderer->pixmap, 0.0, 0.0);
+ cairo_rectangle (ctx, 0, 0, width > 0 ? width : -width, height > 0 ? height : -height);
+ cairo_clip (ctx);
+ cairo_paint (ctx);
+ cairo_restore (ctx);
}
static void
@@ -502,7 +504,7 @@ clip_region_add_rect(DiaRenderer *object,
dia_transform_coords(transform, rect->left, rect->top, &x1, &y1);
dia_transform_coords(transform, rect->right, rect->bottom, &x2, &y2);
g_object_unref(transform);
-
+
clip_rect.x = x1;
clip_rect.y = y1;
clip_rect.width = x2 - x1 + 1;
@@ -521,7 +523,7 @@ draw_pixel_line(DiaRenderer *object,
double x1u = x1 + .5, y1u = y1 + .5, x2u = x2 + .5, y2u = y2 + .5;
double lw[2];
lw[0] = 1; lw[1] = 0;
-
+
cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
cairo_set_line_width (renderer->cr, lw[0]);
@@ -544,7 +546,7 @@ draw_pixel_rect(DiaRenderer *object,
double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
double lw[2];
lw[0] = 1; lw[1] = 0;
-
+
cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
cairo_set_line_width (renderer->cr, lw[0]);
@@ -566,7 +568,7 @@ fill_pixel_rect(DiaRenderer *object,
double x1u = x + .5, y1u = y + .5, x2u = x + width + .5, y2u = y + height + .5;
double lw[2];
lw[0] = 1; lw[1] = 0;
-
+
cairo_device_to_user_distance (renderer->cr, &lw[0], &lw[1]);
cairo_set_line_width (renderer->cr, lw[0]);
@@ -582,4 +584,4 @@ DiaRenderer *
dia_cairo_interactive_renderer_new ()
{
return g_object_new (DIA_TYPE_CAIRO_INTERACTIVE_RENDERER, NULL);
-}
\ No newline at end of file
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]