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
[email protected]
http://mail.gnome.org/mailman/listinfo/gnumeric-list