[gnome-mag/cairo-port: 7/8] Paint the crosswire with Cairo



commit 5d89a5887b68b106a2c5e2acb915aff2dddb9cc3
Author: Benjamin Otte <otte redhat com>
Date:   Fri Aug 13 04:19:10 2010 +0200

    Paint the crosswire with Cairo

 magnifier/zoom-region-private.h |    2 -
 magnifier/zoom-region.c         |  126 ++++++++++++---------------------------
 2 files changed, 38 insertions(+), 90 deletions(-)
---
diff --git a/magnifier/zoom-region-private.h b/magnifier/zoom-region-private.h
index d5ad435..8402a6f 100644
--- a/magnifier/zoom-region-private.h
+++ b/magnifier/zoom-region-private.h
@@ -37,8 +37,6 @@ struct _ZoomRegionPrivate {
 	GtkWidget *border;
 	GdkDrawable *source_drawable;
         GdkGC     *default_gc;
-        GdkGC     *paint_cursor_gc;
-        GdkGC     *crosswire_gc;
 	GdkPixbuf *source_pixbuf_cache;
 	GdkPixbuf *scaled_pixbuf;
 	GdkPixmap *pixmap;
diff --git a/magnifier/zoom-region.c b/magnifier/zoom-region.c
index 5a60699..10cdb4b 100644
--- a/magnifier/zoom-region.c
+++ b/magnifier/zoom-region.c
@@ -796,14 +796,10 @@ static void
 zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_rect)
 {
 	Magnifier *magnifier = zoom_region->priv->parent;
-	static GdkColormap *cmap;
-	static GdkColor last_color;
-	static gboolean last_color_init = FALSE;
-	GdkGCValues values;
 	GdkRectangle rect, crect;
-	GdkColor color = {0, 0, 0, 0};
 	int x_start = 0, y_start = 0, x_end = 4096, y_end = 4096;
 	int x_left_clip = 0, x_right_clip = 0, y_top_clip = 0, y_bottom_clip = 0;
+        cairo_t *cr;
 	
 #ifdef ZOOM_REGION_DEBUG
 	g_assert (zoom_region->alive);
@@ -813,57 +809,33 @@ zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_
 	      GDK_IS_DRAWABLE (gtk_widget_get_window (GTK_WIDGET (zoom_region))) &&
 	      magnifier->crosswire_size > 0)) return;
 
-	if (zoom_region->priv->crosswire_gc == NULL) 
-	{
-		zoom_region->priv->crosswire_gc = gdk_gc_new (gtk_widget_get_window (GTK_WIDGET (zoom_region)));
-		cmap = gdk_gc_get_colormap(zoom_region->priv->crosswire_gc);
-		last_color_init = FALSE;
-	}
+        cr = gdk_cairo_create (gtk_widget_get_window (GTK_WIDGET (zoom_region)));
+
+        if (clip_rect)
+        {
+                gdk_cairo_rectangle (cr, clip_rect);
+                cairo_clip (cr);
+        }
 
 	if (magnifier->crosswire_color == 0)
 	{
-		color.red = 0xFFFF;
-		color.blue = 0xFFFF;
-		color.green = 0xFFFF;
-		values.function = GDK_INVERT;
+                cairo_set_source_rgb (cr, 1, 1, 1);
+                cairo_set_operator (cr, CAIRO_OPERATOR_DIFFERENCE);
 	}
 	else
 	{
-		color.red = (magnifier->crosswire_color & 0xFF0000) >> 8;
-		color.green = (magnifier->crosswire_color & 0xFF00);
-		color.blue = (magnifier->crosswire_color & 0xFF) << 8;
-		values.function = GDK_COPY;
+                cairo_set_source_rgb (cr, 
+		                      ((magnifier->crosswire_color & 0xFF0000) >> 16) / 255.0,
+		                      ((magnifier->crosswire_color & 0x00FF00) >>  8) / 255.0,
+		                       (magnifier->crosswire_color & 0x0000FF)        / 255.0);
 	}
 
-	values.foreground = color;
-
-	/* Only reset colors if they have changed */
-    if (!last_color_init || color.red != last_color.red ||
-	    color.blue != last_color.blue || color.green != last_color.green)
-	{
-		if (cmap)
-		{
-			gdk_rgb_find_color (cmap, &(values.foreground));
-			gdk_gc_set_values(zoom_region->priv->crosswire_gc, &values, GDK_GC_FUNCTION | GDK_GC_FOREGROUND);
-		}
-		else
-		{
-			gdk_gc_set_values(zoom_region->priv->crosswire_gc, &values, GDK_GC_FUNCTION);
-		}
-
-		last_color.red   = color.red;
-		last_color.blue  = color.blue;
-		last_color.green = color.green;
-		last_color_init  = TRUE;
-	}
 
 	rect.x = zoom_region->priv->last_cursor_pos.x;
 	rect.y = zoom_region->priv->last_cursor_pos.y;
 	rect.width = 0;
 	rect.height = 0;
 	rect = zoom_region_view_rect_from_source_rect (zoom_region, rect);
-	if (clip_rect) gdk_gc_set_clip_rectangle (zoom_region->priv->crosswire_gc, clip_rect);
-	else gdk_gc_set_clip_rectangle (zoom_region->priv->crosswire_gc, NULL);
 
         magnifier_get_cursor_size (magnifier, &crect);
         crect.x += rect.x;
@@ -887,55 +859,33 @@ zoom_region_paint_crosswire_cursor (ZoomRegion *zoom_region, GdkRectangle *clip_
 	{
 		y_top_clip = crect.y - magnifier->crosswire_size;
 		y_bottom_clip = crect.y + crect.height + magnifier->crosswire_size;
-		x_left_clip = rect.x - magnifier->crosswire_size;
+		x_left_clip = crect.x - magnifier->crosswire_size;
 		x_right_clip = crect.x + crect.width + magnifier->crosswire_size;
 
 	}
-	if (magnifier->crosswire_size == 1) {
-		if (magnifier->crosswire_clip) {
-			gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-				       zoom_region->priv->crosswire_gc,
-				       rect.x, y_top_clip, rect.x,
-				       y_bottom_clip);
-			gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-				       zoom_region->priv->crosswire_gc,
-				       x_left_clip, rect.y, x_right_clip,
-				       rect.y);
-		}
-		gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-			       zoom_region->priv->crosswire_gc,
-			       rect.x, y_start, rect.x, y_end);
-		gdk_draw_line (gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-			       zoom_region->priv->crosswire_gc,
-			       x_start, rect.y, x_end, rect.y);
-	}
-	else {
-		if (magnifier->crosswire_clip ) {
-			gdk_draw_rectangle (
-				gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-				zoom_region->priv->crosswire_gc, TRUE,
-				rect.x - magnifier->crosswire_size / 2,
-				y_top_clip, magnifier->crosswire_size,
-				y_bottom_clip - y_top_clip);
-			gdk_draw_rectangle (
-				gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-				zoom_region->priv->crosswire_gc, TRUE,
-				x_left_clip,
-				rect.y - magnifier->crosswire_size / 2,
-				x_right_clip - x_left_clip,
-				magnifier->crosswire_size);
-		}
-		gdk_draw_rectangle (
-			gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-			zoom_region->priv->crosswire_gc, TRUE,
-			rect.x - magnifier->crosswire_size / 2, y_start,
-			magnifier->crosswire_size, y_end - y_start);
-		gdk_draw_rectangle (
-			gtk_widget_get_window (GTK_WIDGET (zoom_region)),
-			zoom_region->priv->crosswire_gc, TRUE,
-			x_start, rect.y - magnifier->crosswire_size / 2,
-			x_end - x_start, magnifier->crosswire_size);
-	}
+
+        if (magnifier->crosswire_clip ) {
+                cairo_rectangle (cr,
+                                 rect.x - magnifier->crosswire_size / 2,
+                                 y_bottom_clip,
+                                 magnifier->crosswire_size,
+                                 y_top_clip - y_bottom_clip);
+                cairo_rectangle (cr,
+                                 x_right_clip,
+                                 rect.y - magnifier->crosswire_size / 2,
+                                 x_left_clip - x_right_clip,
+                                 magnifier->crosswire_size);
+        }
+        cairo_rectangle (cr,
+                         rect.x - magnifier->crosswire_size / 2, y_start,
+                         magnifier->crosswire_size, y_end - y_start);
+        cairo_rectangle (cr,
+                         x_start, rect.y - magnifier->crosswire_size / 2,
+                         x_end - x_start, magnifier->crosswire_size);
+
+        cairo_fill (cr);
+
+        cairo_destroy (cr);
 }
 
 static void



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]