? 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 #include -#ifdef WITH_CAIRO -#include -#else -#include -#endif +#include 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 #include +#include +#include #include #include #include @@ -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 #include -#include +#include #include #include @@ -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 */