Hi,

Here are two patchs that will make testing of cairo renderer in goffice
easier (goffice patch also contains fix for making cairo renderer
compilable).

Ok to commit ?

Emmanuel.
? po/fr.po.autosave
? src/gnm-graph-window.c
? src/gnm-graph-window.h
Index: src/sheet-object-graph.c
===================================================================
RCS file: /cvs/gnome/gnumeric/src/sheet-object-graph.c,v
retrieving revision 1.73
diff -u -p -r1.73 sheet-object-graph.c
--- src/sheet-object-graph.c	7 Nov 2005 04:44:03 -0000	1.73
+++ src/sheet-object-graph.c	17 Nov 2005 14:59:50 -0000
@@ -44,7 +44,7 @@
 #include <goffice/graph/gog-data-allocator.h>
 #include <goffice/graph/gog-data-set.h>
 #include <goffice/graph/gog-renderer-gnome-print.h>
-#include <goffice/graph/gog-renderer-pixbuf.h>
+#include <goffice/graph/gog-renderer.h>
 #include <goffice/graph/gog-renderer-svg.h>
 #include <goffice/graph/gog-control-foocanvas.h>
 #include <goffice/utils/go-file.h>
@@ -113,7 +113,7 @@ static GSF_CLASS_FULL (SOGraphFooView, s
 typedef struct {
 	SheetObject  base;
 	GogGraph	*graph;
-	GObject		*renderer;
+	GogRenderer	*renderer;
 	gulong		 add_sig, remove_sig;
 } SheetObjectGraph;
 typedef SheetObjectClass SheetObjectGraphClass;
@@ -261,12 +261,11 @@ gnm_sog_write_image (SheetObject const *
 	if (strcmp (format, "svg") == 0) {
 		res = gog_graph_export_to_svg (sog->graph, output, w, h, 1.0);
 	} else {
-		GogRendererPixbuf *prend = GOG_RENDERER_PIXBUF (sog->renderer);
-		GdkPixbuf *pixbuf = gog_renderer_pixbuf_get (prend);
+		GdkPixbuf *pixbuf = gog_renderer_get_pixbuf (sog->renderer);
 
 		if (!pixbuf) {
-			gog_renderer_pixbuf_update (prend, w, h, 1.);
-			pixbuf = gog_renderer_pixbuf_get (prend);
+			gog_renderer_update (sog->renderer, w, h, 1.);
+			pixbuf = gog_renderer_get_pixbuf (sog->renderer);
 		}
 		res = gdk_pixbuf_save_to_callback (pixbuf,
 						   sog_gsf_gdk_pixbuf_save,
@@ -627,9 +626,7 @@ sheet_object_graph_set_gog (SheetObject 
 	if (sog->renderer != NULL)
 		g_object_set (sog->renderer, "model", graph, NULL);
 	else
-		sog->renderer = g_object_new (GOG_RENDERER_PIXBUF_TYPE,
-					      "model", sog->graph,
-					      NULL);
+		sog->renderer = gog_renderer_new_for_pixbuf (sog->graph);
 }
 
 static void
? jhgen
? goffice/gtk/go-marshal.c
? goffice/gtk/go-marshal.h
? goffice/gtk/go-marshal.list
Index: goffice/graph/Makefile.am
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/Makefile.am,v
retrieving revision 1.47
diff -u -p -r1.47 Makefile.am
--- goffice/graph/Makefile.am	18 Aug 2005 14:20:35 -0000	1.47
+++ goffice/graph/Makefile.am	17 Nov 2005 15:50:51 -0000
@@ -31,7 +31,6 @@ libgoffice_graph_la_SOURCES = \
 	\
 	gog-guru.c			\
 	gog-renderer.c			\
-	gog-renderer-pixbuf.c		\
 	gog-control-foocanvas.c		\
 	gog-renderer-gnome-print.c	\
 	gog-renderer-svg.c
@@ -70,7 +69,6 @@ libgoffice_graph_la_HEADERS = \
 	gog-guru.h			\
 	gog-renderer.h			\
 	gog-renderer-impl.h		\
-	gog-renderer-pixbuf.h		\
 	gog-control-foocanvas.h		\
 	gog-renderer-gnome-print.h	\
 	gog-renderer-svg.h
@@ -78,7 +76,11 @@ libgoffice_graph_la_HEADERS = \
 if WITH_CAIRO
   libgoffice_graph_la_SOURCES += gog-renderer-cairo.c	
   libgoffice_graph_la_HEADERS += gog-renderer-cairo.h
+else
+  libgoffice_graph_la_SOURCES += gog-renderer-pixbuf.c	
+  libgoffice_graph_la_HEADERS += gog-renderer-pixbuf.h
 endif
+
 
 gladedir = $(goffice_datadir)/glade
 dist_glade_DATA = \
Index: goffice/graph/gog-control-foocanvas.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-control-foocanvas.c,v
retrieving revision 1.18
diff -u -p -r1.18 gog-control-foocanvas.c
--- goffice/graph/gog-control-foocanvas.c	15 Nov 2005 15:56:23 -0000	1.18
+++ goffice/graph/gog-control-foocanvas.c	17 Nov 2005 15:50:51 -0000
@@ -57,25 +57,13 @@ gog_control_foocanvas_set_property (GObj
 	case CTRL_FOO_PROP_MODEL:
 		if (ctrl->renderer != NULL)
 			g_object_unref (ctrl->renderer);
-#ifdef WITH_CAIRO
-		ctrl->renderer = g_object_new (GOG_RENDERER_CAIRO_TYPE,
-					       "model", g_value_get_object (value),
-					       NULL);
-#else
-		ctrl->renderer = g_object_new (GOG_RENDERER_PIXBUF_TYPE,
-					       "model", g_value_get_object (value),
-					       NULL);
-#endif
+		ctrl->renderer = gog_renderer_new_for_pixbuf (g_value_get_object (value));
 		break;
 
 	case CTRL_FOO_PROP_RENDERER:
 		if (ctrl->renderer != NULL)
 			g_object_unref (ctrl->renderer);
-#ifdef WITH_CAIRO
-		ctrl->renderer = GOG_RENDERER_CAIRO (g_value_get_object (value));
-#else
-		ctrl->renderer = GOG_RENDERER_PIXBUF (g_value_get_object (value));
-#endif
+		ctrl->renderer = GOG_RENDERER (g_value_get_object (value));
 		if (ctrl->renderer != NULL)
 			g_object_ref (ctrl->renderer);
 		break;
@@ -129,11 +117,7 @@ gog_control_foocanvas_draw (FooCanvasIte
 			    GdkEventExpose *ev)
 {
 	GogControlFooCanvas *ctrl = GOG_CONTROL_FOOCANVAS (item);
-#ifdef WITH_CAIRO
-	GdkPixbuf *buffer = gog_renderer_cairo_get_pixbuf (ctrl->renderer);
-#else
-	GdkPixbuf *buffer = gog_renderer_pixbuf_get (ctrl->renderer);
-#endif
+	GdkPixbuf *buffer = gog_renderer_get_pixbuf (ctrl->renderer);
 	GdkRectangle display_rect, draw_rect;
 	GdkRegion *draw_region;
 
@@ -183,13 +167,7 @@ gog_control_foocanvas_update (FooCanvasI
 	foo_canvas_w2c (item->canvas, ctrl->base.xpos, ctrl->base.ypos, &x1, &y1);
 	foo_canvas_w2c (item->canvas, ctrl->base.xpos + ctrl->new_w, ctrl->base.ypos + ctrl->new_h, &x2, &y2);
 
-#ifdef WITH_CAIRO
-	redraw = gog_renderer_cairo_update (ctrl->renderer, x2-x1, y2-y1,
-		item->canvas->pixels_per_unit);
-#else
-	redraw = gog_renderer_pixbuf_update (ctrl->renderer, x2-x1, y2-y1,
-		item->canvas->pixels_per_unit);
-#endif
+	redraw = gog_renderer_update (ctrl->renderer, x2-x1, y2-y1, item->canvas->pixels_per_unit);
 	if (item->x1 != x1 || item->y1 != y1 || item->x2 != x2 || item->y2 != y2)
 		foo_canvas_update_bbox (FOO_CANVAS_ITEM (ctrl), x1, y1, x2, y2);
 	else if (redraw)
@@ -240,17 +218,10 @@ gog_control_foocanvas_class_init (GogCon
 		g_param_spec_object ("model", "model",
 			"the GogObject this object displays",
 			GOG_OBJECT_TYPE, G_PARAM_WRITABLE));
-#ifdef WITH_CAIRO
 	g_object_class_install_property (gobject_klass, CTRL_FOO_PROP_RENDERER,
 		g_param_spec_object ("renderer", "renderer",
-			"the GogRendererCairo being displayed",
-			GOG_RENDERER_CAIRO_TYPE, G_PARAM_READWRITE));
-#else
-	g_object_class_install_property (gobject_klass, CTRL_FOO_PROP_RENDERER,
-		g_param_spec_object ("renderer", "renderer",
-			"the GogRendererPixbuf being displayed",
-			GOG_RENDERER_PIXBUF_TYPE, G_PARAM_READWRITE));
-#endif
+			"the GogRenderer being displayed",
+			GOG_RENDERER_TYPE, G_PARAM_READWRITE));
 }
 
 static void
Index: goffice/graph/gog-control-foocanvas.h
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-control-foocanvas.h,v
retrieving revision 1.6
diff -u -p -r1.6 gog-control-foocanvas.h
--- goffice/graph/gog-control-foocanvas.h	8 Aug 2005 08:56:59 -0000	1.6
+++ goffice/graph/gog-control-foocanvas.h	17 Nov 2005 15:50:51 -0000
@@ -23,11 +23,7 @@
 
 #include <goffice/graph/goffice-graph.h>
 #include <goffice/cut-n-paste/foocanvas/foo-canvas.h>
-#ifdef WITH_CAIRO
-#include <goffice/graph/gog-renderer-cairo.h>
-#else
-#include <goffice/graph/gog-renderer-pixbuf.h>
-#endif
+#include <goffice/graph/gog-renderer.h>
 
 G_BEGIN_DECLS
 
@@ -41,11 +37,7 @@ typedef struct {
 	double new_h, new_w;
 
 	GogGraph *model;
-#ifdef WITH_CAIRO
-	GogRendererCairo *renderer;
-#else
-	GogRendererPixbuf *renderer;
-#endif
+	GogRenderer *renderer;
 } GogControlFooCanvas;
 typedef FooCanvasGroupClass GogControlFooCanvasClass;
 
Index: goffice/graph/gog-renderer-cairo.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-renderer-cairo.c,v
retrieving revision 1.6
diff -u -p -r1.6 gog-renderer-cairo.c
--- goffice/graph/gog-renderer-cairo.c	30 Aug 2005 00:50:11 -0000	1.6
+++ goffice/graph/gog-renderer-cairo.c	17 Nov 2005 15:50:51 -0000
@@ -101,31 +101,6 @@ gog_renderer_cairo_finalize (GObject *ob
 	(*parent_klass->finalize) (obj);
 }
 
-static void
-gog_renderer_cairo_clip_push (GogRenderer *rend, GogRendererClip *clip)
-{
-	GogRendererCairo *crend = GOG_RENDERER_CAIRO (rend);
-	double x, y;
-
-	/* Rounding clipping area trigger cairo fast clip */
-	x = floor (clip->area.x + 0.5);
-	y = floor (clip->area.y + 0.5);
-
-	cairo_save (crend->cairo);
-	cairo_rectangle (crend->cairo, x, y,
-			 floor (clip->area.x + clip->area.w + 0.5) - x,
-			 floor (clip->area.y + clip->area.h + 0.5) - y);
-	cairo_clip (crend->cairo);
-}
-
-static void
-gog_renderer_cairo_clip_pop (GogRenderer *rend, GogRendererClip *clip)
-{
-	GogRendererCairo *crend = GOG_RENDERER_CAIRO (rend);
-
-	cairo_restore (crend->cairo);
-}
-
 static double
 grc_line_size (GogRenderer const *rend, double width)
 {
@@ -139,36 +114,6 @@ grc_line_size (GogRenderer const *rend, 
 	return floor (width);
 }
 
-static double
-gog_renderer_cairo_line_size (GogRenderer const *rend, double width)
-{
-	double size = grc_line_size (rend, width);
-
-	if (size < 1.0)
-		return ceil (size);
-
-	return size;
-}
-
-static void
-gog_renderer_cairo_sharp_path (GogRenderer *rend, ArtVpath *path, double line_width) 
-{
-	ArtVpath *iter = path;
-
-	if (((int) (rint (line_width)) % 2 == 0) && line_width > 1.0) 
-		while (iter->code != ART_END) {
-			iter->x = floor (iter->x + .5);
-			iter->y = floor (iter->y + .5);
-			iter++;
-		}
-	else
-		while (iter->code != ART_END) {
-			iter->x = floor (iter->x) + .5;
-			iter->y = floor (iter->y) + .5;
-			iter++;
-		}
-}
-
 static void
 grc_path (cairo_t *cr, ArtVpath *vpath, ArtBpath *bpath)
 {
@@ -250,6 +195,77 @@ grc_draw_path (GogRenderer *rend, ArtVpa
 }
 
 static void
+gog_renderer_cairo_push_clip (GogRenderer *rend, GogRendererClip *clip)
+{
+	GogRendererCairo *crend = GOG_RENDERER_CAIRO (rend);
+	ArtVpath *path = clip->path;
+	int i;
+	gboolean is_rectangle;
+
+	for (i = 0; i < 6; i++)
+		if (path[i].code == ART_END)
+			break;
+	
+	is_rectangle = i == 5 &&
+		path[5].code == ART_END &&
+		path[0].x == path[3].x &&
+		path[0].x == path[4].x &&
+		path[1].x == path[2].x &&
+		path[0].y == path[1].y &&
+	       	path[0].y == path[4].y &&
+		path[2].y == path[3].y;
+
+	cairo_save (crend->cairo);
+	if (is_rectangle) {
+		double x = floor (path[0].x + 0.5);
+		double y = floor (path[0].y + 0.5);
+		cairo_rectangle (crend->cairo, x, y,
+				 floor (path[1].x + 0.5) - x,
+				 floor (path[2].y + 0.5) - y);
+	} else 
+		grc_path (crend->cairo, path, NULL);
+	cairo_clip (crend->cairo);
+}
+
+static void
+gog_renderer_cairo_pop_clip (GogRenderer *rend, GogRendererClip *clip)
+{
+	GogRendererCairo *crend = GOG_RENDERER_CAIRO (rend);
+
+	cairo_restore (crend->cairo);
+}
+
+static double
+gog_renderer_cairo_line_size (GogRenderer const *rend, double width)
+{
+	double size = grc_line_size (rend, width);
+
+	if (size < 1.0)
+		return ceil (size);
+
+	return size;
+}
+
+static void
+gog_renderer_cairo_sharp_path (GogRenderer *rend, ArtVpath *path, double line_width) 
+{
+	ArtVpath *iter = path;
+
+	if (((int) (rint (line_width)) % 2 == 0) && line_width > 1.0) 
+		while (iter->code != ART_END) {
+			iter->x = floor (iter->x + .5);
+			iter->y = floor (iter->y + .5);
+			iter++;
+		}
+	else
+		while (iter->code != ART_END) {
+			iter->x = floor (iter->x) + .5;
+			iter->y = floor (iter->y) + .5;
+			iter++;
+		}
+}
+
+static void
 gog_renderer_cairo_draw_path (GogRenderer *rend, ArtVpath const *path)
 {
 	grc_draw_path (rend, path, NULL);
@@ -445,7 +461,7 @@ gog_renderer_cairo_draw_text (GogRendere
 	}
 /*	g_message ("family: %s, size: %g", family, size);*/
 	/* FIXME: calculate dpi */
-	size *= 96.0 * rend->scale * rend->zoom / 72.0;
+	size *= 72.0 * rend->scale * rend->zoom / 72.0;
 	cairo_select_font_face (cr, family, slant, 
 		weight > PANGO_WEIGHT_SEMIBOLD ?  CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL);
 	cairo_set_font_size (cr, size);
@@ -516,7 +532,7 @@ gog_renderer_cairo_get_text_OBR (GogRend
 	
 	family = pango_font_description_get_family (fd);
 	/* FIXME: calculate dpi */
-	size = pango_font_description_get_size (fd) / PANGO_SCALE / 72.0 * 96.0 * rend->scale * rend->zoom;
+	size = pango_font_description_get_size (fd) / PANGO_SCALE / 72.0 * 72.0 * rend->scale * rend->zoom;
 	weight = pango_font_description_get_weight (fd);
 	switch (pango_font_description_get_style (fd)) {
 		case (PANGO_STYLE_NORMAL):  slant = CAIRO_FONT_SLANT_NORMAL; break;
@@ -610,8 +626,8 @@ gog_renderer_cairo_class_init (GogRender
 	gobject_klass->finalize		= gog_renderer_cairo_finalize;
 	rend_klass->push_style		= gog_renderer_cairo_push_style;
 	rend_klass->pop_style		= gog_renderer_cairo_pop_style;
-	rend_klass->clip_push  		= gog_renderer_cairo_clip_push;
-	rend_klass->clip_pop     	= gog_renderer_cairo_clip_pop;
+	rend_klass->push_clip  		= gog_renderer_cairo_push_clip;
+	rend_klass->pop_clip     	= gog_renderer_cairo_pop_clip;
 	rend_klass->sharp_path		= gog_renderer_cairo_sharp_path;
 	rend_klass->draw_path	  	= gog_renderer_cairo_draw_path;
 	rend_klass->draw_polygon  	= gog_renderer_cairo_draw_polygon;
Index: goffice/graph/gog-renderer.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-renderer.c,v
retrieving revision 1.42
diff -u -p -r1.42 gog-renderer.c
--- goffice/graph/gog-renderer.c	17 Nov 2005 03:25:22 -0000	1.42
+++ goffice/graph/gog-renderer.c	17 Nov 2005 15:50:51 -0000
@@ -21,6 +21,8 @@
 
 #include <goffice/goffice-config.h>
 #include <goffice/graph/gog-renderer-impl.h>
+#include <goffice/graph/gog-renderer-pixbuf.h>
+#include <goffice/graph/gog-renderer-cairo.h>
 #include <goffice/graph/gog-style.h>
 #include <goffice/graph/gog-graph.h>
 #include <goffice/graph/gog-view.h>
@@ -837,4 +839,38 @@ gog_renderer_push_selection_style (GogRe
 		renderer->grip_style->fill.type = GOG_FILL_STYLE_PATTERN;
 	}
 	gog_renderer_push_style (renderer, renderer->grip_style);
+}
+
+GogRenderer*
+gog_renderer_new_for_pixbuf (GogGraph *graph)
+{
+#ifdef WITH_CAIRO
+	return g_object_new (GOG_RENDERER_CAIRO_TYPE, "model", graph, NULL);
+#else
+	return g_object_new (GOG_RENDERER_PIXBUF_TYPE, "model", graph, NULL);
+#endif
+}
+
+gboolean
+gog_renderer_update (GogRenderer *renderer, double w, double h, double zoom)
+{
+#ifdef WITH_CAIRO
+	g_return_val_if_fail (GOG_RENDERER_CAIRO (renderer) != NULL, FALSE);
+	return gog_renderer_cairo_update (GOG_RENDERER_CAIRO (renderer), w, h, zoom);
+#else
+	g_return_val_if_fail (GOG_RENDERER_PIXBUF (renderer) != NULL, FALSE);
+	return gog_renderer_pixbuf_update (GOG_RENDERER_PIXBUF (renderer), w, h, zoom);
+#endif
+}
+
+GdkPixbuf*
+gog_renderer_get_pixbuf (GogRenderer *renderer)
+{
+#ifdef WITH_CAIRO
+	g_return_val_if_fail (GOG_RENDERER_CAIRO (renderer) != NULL, NULL);
+     	return gog_renderer_cairo_get_pixbuf (GOG_RENDERER_CAIRO (renderer));
+#else
+	g_return_val_if_fail (GOG_RENDERER_PIXBUF (renderer) != NULL, NULL);
+	return gog_renderer_pixbuf_get (GOG_RENDERER_PIXBUF (renderer));
+#endif
 }
Index: goffice/graph/gog-renderer.h
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-renderer.h,v
retrieving revision 1.25
diff -u -p -r1.25 gog-renderer.h
--- goffice/graph/gog-renderer.h	15 Nov 2005 15:56:23 -0000	1.25
+++ goffice/graph/gog-renderer.h	17 Nov 2005 15:50:51 -0000
@@ -91,6 +91,11 @@ double gog_renderer_pt2r_x   	  	(GogRen
 double gog_renderer_pt2r_y   	  	(GogRenderer const *r, double d);
 double gog_renderer_pt2r   	  	(GogRenderer const *r, double d);
 
+/* utilities for cairo/libart transition */
+GogRenderer 	*gog_renderer_new_for_pixbuf 	(GogGraph *graph);
+gboolean 	 gog_renderer_update 		(GogRenderer *renderer, double w, double h, double zoom);
+GdkPixbuf 	*gog_renderer_get_pixbuf 	(GogRenderer *renderer); 
+
 G_END_DECLS
 
 #endif /* GOG_RENDERER_H */
Index: goffice/gtk/go-graph-widget.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/gtk/go-graph-widget.c,v
retrieving revision 1.3
diff -u -p -r1.3 go-graph-widget.c
--- goffice/gtk/go-graph-widget.c	8 Aug 2005 08:57:00 -0000	1.3
+++ goffice/gtk/go-graph-widget.c	17 Nov 2005 15:50:51 -0000
@@ -22,7 +22,7 @@
 #include "go-graph-widget.h"
 #include <gtk/gtkdrawingarea.h>
 #include <goffice/graph/gog-object.h>
-#include <goffice/graph/gog-renderer-pixbuf.h>
+#include <goffice/graph/gog-renderer.h>
 #include <goffice/utils/go-math.h>
 
 #include <gsf/gsf-impl-utils.h>
@@ -35,7 +35,7 @@ enum {
 struct  _GOGraphWidget{
 	GtkDrawingArea	base;
 
-	GogRendererPixbuf *renderer;
+	GogRenderer *renderer;
 	GogGraph *graph;
 	GogChart *chart; /* first chart created on init */
 	double aspect_ratio, width, height, xoffset, yoffset;
@@ -66,7 +66,7 @@ go_graph_widget_size_allocate (GtkWidget
 			w->yoffset = 0;
 		}
 	}
-	gog_renderer_pixbuf_update (w->renderer, w->width, w->height, 1.0);
+	gog_renderer_update (w->renderer, w->width, w->height, 1.0);
 	graph_parent_klass->size_allocate (widget, allocation);
 }
 
@@ -80,7 +80,7 @@ go_graph_widget_expose_event (GtkWidget 
 
 	if (w->idle_id)
 		return TRUE;
-	pixbuf = gog_renderer_pixbuf_get (w->renderer);
+	pixbuf = gog_renderer_get_pixbuf (w->renderer);
 	display_rect.x = w->xoffset;
 	display_rect.y = w->yoffset;
 	display_rect.width  = w->width;
@@ -171,7 +171,7 @@ idle_handler (GOGraphWidget *w)
 {
 	GDK_THREADS_ENTER ();
 
-	gog_renderer_pixbuf_update (w->renderer, w->width, w->height, 1.0);
+	gog_renderer_update (w->renderer, w->width, w->height, 1.0);
 
 	/* Reset idle id */
 	w->idle_id = 0;
@@ -194,9 +194,7 @@ static void
 go_graph_widget_init (GOGraphWidget *w)
 {
 	w->graph = (GogGraph *) g_object_new (GOG_GRAPH_TYPE, NULL);
-	w->renderer = g_object_new (GOG_RENDERER_PIXBUF_TYPE,
-					  "model", w->graph,
-					  NULL);
+	w->renderer = gog_renderer_new_for_pixbuf (w->graph);
 	g_signal_connect_swapped (w->renderer, "request_update",
 		G_CALLBACK (go_graph_widget_request_update), w);
 	/* by default, create one chart and add it to the graph */
_______________________________________________
gnumeric-list mailing list
gnumeric-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gnumeric-list

Reply via email to