Hi,

Here's a patch that fixes a bug regarding text rendering in pixbuf
renderer, as you can see in attached image (equation box at top/left
corner).

Ok to commit ?

        Emmanuel.
Index: goffice/graph/gog-graph.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-graph.c,v
retrieving revision 1.33
diff -u -p -r1.33 gog-graph.c
--- goffice/graph/gog-graph.c	15 Aug 2005 11:30:21 -0000	1.33
+++ goffice/graph/gog-graph.c	25 Sep 2005 17:41:58 -0000
@@ -643,6 +643,7 @@ gog_graph_view_class_init (GogGraphViewC
 	gview_parent_klass = g_type_class_peek_parent (gview_klass);
 	gobject_klass->set_property = gog_graph_view_set_property;
 	view_klass->size_allocate   = gog_graph_view_size_allocate;
+	view_klass->clip	    = TRUE;
 
 	g_object_class_install_property (gobject_klass, GRAPH_VIEW_PROP_RENDERER,
 		g_param_spec_object ("renderer", "renderer",
Index: goffice/graph/gog-renderer-pixbuf.c
===================================================================
RCS file: /cvs/gnome/goffice/goffice/graph/gog-renderer-pixbuf.c,v
retrieving revision 1.70
diff -u -p -r1.70 gog-renderer-pixbuf.c
--- goffice/graph/gog-renderer-pixbuf.c	14 Aug 2005 10:20:19 -0000	1.70
+++ goffice/graph/gog-renderer-pixbuf.c	25 Sep 2005 17:41:58 -0000
@@ -671,15 +671,18 @@ gog_renderer_pixbuf_draw_text (GogRender
 {
 	FT_Bitmap ft_bitmap;
 	GogRendererPixbuf *prend = GOG_RENDERER_PIXBUF (rend);
-	PangoRectangle rect;
-	PangoLayout   *layout;
+	PangoRectangle rect, ft_rect;
+	PangoLayout *layout;
+	double angle;
 	guint8 r, g, b, a, alpha, *dst, *src;
 	int h, w, i, x, y, interrow, intercol, rotation_type;
-	int ft_x, ft_y, ft_w, ft_h, offset;
+	int ft_x, ft_y, ft_w, ft_h, offset_x, offset_y;
+	int end_x = 0, end_y = 0;
 	GogStyle const *style = rend->cur_style;
 	PangoMatrix matrix, old_matrix;
 
-	rotation_type  = go_geometry_get_rotation_type (rend->cur_style->text_layout.angle * M_PI / 180);
+	angle = rend->cur_style->text_layout.angle * M_PI / 180.0;
+	rotation_type  = go_geometry_get_rotation_type (angle);
 
 	layout = gog_renderer_pixbuf_get_pango_layout ((GogRendererPixbuf *) rend);
 	pango_layout_set_text (layout, text, -1);
@@ -702,8 +705,8 @@ gog_renderer_pixbuf_draw_text (GogRender
 			rect.y = PANGO_PIXELS (rect.y);
 	}
 
-	ft_x = rect.x;
-	ft_y = rect.y;
+	ft_rect = rect;
+
 	switch (rotation_type) {
 		case GO_ROTATE_CLOCKWISE:
 		case GO_ROTATE_COUNTERCLOCKWISE:
@@ -730,12 +733,16 @@ gog_renderer_pixbuf_draw_text (GogRender
 			break;
 		default : break;
 	}
-	x = (x > 0) ? (x + PANGO_SCALE / 2) / PANGO_SCALE : 0;
+	x = (x + PANGO_SCALE / 2) / PANGO_SCALE;
 	w = (rect.width + PANGO_SCALE / 2) / PANGO_SCALE;
-	offset = rotation_type == GO_ROTATE_NONE ? rect.x : 0.0;
-	if ((x + w + offset) > prend->w)
-		w = prend->w - x - offset;
-
+	offset_x = -MIN (x, 0.);
+	x = MAX (x, 0.);
+	w -= offset_x;
+	if (w + x - offset_x > prend->w) {
+		end_x = w - (prend->w - x);
+		w = prend->w - x;	
+	}
+	
 	switch (anchor) {
 	case GTK_ANCHOR_CENTER : case GTK_ANCHOR_E : case GTK_ANCHOR_W :
 		y -= rect.height / 2;
@@ -745,11 +752,15 @@ gog_renderer_pixbuf_draw_text (GogRender
 		break;
 	default : break;
 	}
-	y = (y > 0) ? (y + PANGO_SCALE / 2) / PANGO_SCALE : 0;
+	y = (y + PANGO_SCALE / 2) / PANGO_SCALE;
 	h = (rect.height + PANGO_SCALE / 2) / PANGO_SCALE;
-	offset = rotation_type == GO_ROTATE_CLOCKWISE ? rect.y : 0.0;
-	if ((y + h + offset) > prend->h)
-		h = prend->h - y - offset;
+	offset_y = -MIN (y, 0.);
+	y = MAX (y, 0.);
+	h -= offset_y;
+	if (h + y > prend->h) {
+		end_y = h - (prend->h - y);
+		h = prend->h - y;
+	}
 
 	if (result != NULL) {
 		result->x = x;
@@ -766,13 +777,34 @@ gog_renderer_pixbuf_draw_text (GogRender
 
 	switch (rotation_type) {
 		case GO_ROTATE_CLOCKWISE:
+			ft_h = w;
+			ft_w = h;
+			ft_x = offset_y;
+			ft_y = end_x;
+			break;
 		case GO_ROTATE_COUNTERCLOCKWISE:
 			ft_h = w;
 			ft_w = h;
+			ft_x = end_y;
+			ft_y = offset_x;
+			break;
+		case GO_ROTATE_UPSIDEDOWN:
+			ft_h = h;
+			ft_w = w;
+			ft_x = end_x;
+			ft_y = end_y;
+			break;
+		case GO_ROTATE_FREE:
+			ft_h = h;
+			ft_w = w;
+			ft_x = offset_x * cos (angle) + offset_y * sin (-angle);
+			ft_y = offset_x * sin (angle) + offset_y * cos (-angle);
 			break;
 		default:
 			ft_h = h;
 			ft_w = w;
+			ft_x = offset_x;
+			ft_y = offset_y;
 	}
 
 	ft_bitmap.rows         = ft_h;
@@ -802,7 +834,7 @@ gog_renderer_pixbuf_draw_text (GogRender
 			intercol = 4;
 			interrow = prend->rowstride - w * 4;
 			dst += y * prend->rowstride;
-			dst += (x + ft_x) * 4;
+			dst += x * 4;
 			break;
 		case GO_ROTATE_COUNTERCLOCKWISE:
 			intercol = - prend->rowstride;
@@ -813,7 +845,7 @@ gog_renderer_pixbuf_draw_text (GogRender
 		case GO_ROTATE_CLOCKWISE:
 			intercol = prend->rowstride;
 			interrow = - 4 - h * prend->rowstride; 
-			dst += (y + ft_x) * prend->rowstride;
+			dst += y * prend->rowstride;
 			dst += (x + w - 1)* 4;
 			break;
 		case GO_ROTATE_UPSIDEDOWN:
@@ -839,7 +871,7 @@ gog_renderer_pixbuf_draw_text (GogRender
 		src += ft_bitmap.pitch - ft_w;
 	}
 	g_free (ft_bitmap.buffer);
-	
+
 	if (rotation_type == GO_ROTATE_FREE) 
 		pango_context_set_matrix (pango_layout_get_context (layout), &old_matrix);
 }

Attachment: clip-bug.png
Description: PNG image

_______________________________________________
gnumeric-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnumeric-list

Reply via email to