gtk+ r20870 - in trunk: . gdk/quartz



Author: herzi
Date: Sun Jul 20 19:22:37 2008
New Revision: 20870
URL: http://svn.gnome.org/viewvc/gtk+?rev=20870&view=rev

Log:
2008-07-20  Sven Herzberg  <sven imendio com>

	reviewed by: Richard Hult

	Fixes #543868: GdkPixmap is upside down on quartz

	* gdk/quartz/gdkdrawable-quartz.c (gdk_quartz_draw_drawable): flip the
	coordinate space from GTK+ orientation to CoreGraphics orientation
	before calling CoreGraphics code
	* gdk/quartz/gdkgc-quartz.c (gdk_quartz_draw_tiled_pattern): drop the
	coordinate space flipping (we always get it right, now)
	* gdk/quartz/gdkpixmap-quartz.c
	(gdk_pixmap_impl_quartz_get_context): flip the coordinate space when
	creating the CGContextRef



Modified:
   trunk/ChangeLog
   trunk/gdk/quartz/gdkdrawable-quartz.c
   trunk/gdk/quartz/gdkgc-quartz.c
   trunk/gdk/quartz/gdkpixmap-quartz.c

Modified: trunk/gdk/quartz/gdkdrawable-quartz.c
==============================================================================
--- trunk/gdk/quartz/gdkdrawable-quartz.c	(original)
+++ trunk/gdk/quartz/gdkdrawable-quartz.c	Sun Jul 20 19:22:37 2008
@@ -337,6 +337,7 @@
   else if (dest_depth != 0 && src_depth == dest_depth)
     {
       CGContextRef context = gdk_quartz_drawable_get_context (drawable, FALSE);
+      gint width, height;
 
       if (!context)
 	return;
@@ -344,6 +345,13 @@
       _gdk_quartz_gc_update_cg_context (gc, drawable, context,
 					GDK_QUARTZ_CONTEXT_STROKE);
 
+      CGContextSaveGState (context);
+
+      /* convert coordinates from gtk+ to core graphics */
+      gdk_drawable_get_size (drawable, &width, &height);
+      CGContextTranslateCTM (context, 0, height);
+      CGContextScaleCTM (context, 1.0, -1.0);
+
       CGContextClipToRect (context, CGRectMake (xdest, ydest, width, height));
       CGContextTranslateCTM (context, xdest - xsrc, ydest - ysrc);
       CGContextDrawImage (context, 
@@ -352,6 +360,8 @@
 				     GDK_PIXMAP_IMPL_QUARTZ (src_impl)->height), 
 			  GDK_PIXMAP_IMPL_QUARTZ (src_impl)->image);
 
+      CGContextRestoreGState (context);
+
       gdk_quartz_drawable_release_context (drawable, context);
     }
   else

Modified: trunk/gdk/quartz/gdkgc-quartz.c
==============================================================================
--- trunk/gdk/quartz/gdkgc-quartz.c	(original)
+++ trunk/gdk/quartz/gdkgc-quartz.c	Sun Jul 20 19:22:37 2008
@@ -290,12 +290,6 @@
   width = CGImageGetWidth (pattern_image);
   height = CGImageGetHeight (pattern_image);
 
-  if (private->is_window)
-    {
-      CGContextTranslateCTM (context, 0, height);
-      CGContextScaleCTM (context, 1.0, -1.0);
-    }
-
   CGContextDrawImage (context, 
 		      CGRectMake (0, 0, width, height),
 		      pattern_image);

Modified: trunk/gdk/quartz/gdkpixmap-quartz.c
==============================================================================
--- trunk/gdk/quartz/gdkpixmap-quartz.c	(original)
+++ trunk/gdk/quartz/gdkpixmap-quartz.c	Sun Jul 20 19:22:37 2008
@@ -47,6 +47,7 @@
 {
   GdkPixmapImplQuartz *impl = GDK_PIXMAP_IMPL_QUARTZ (drawable);
   CGContextRef cg_context;
+  size_t height;
 
   cg_context = CGBitmapContextCreate (impl->data,
                                       CGImageGetWidth (impl->image),
@@ -57,6 +58,12 @@
                                       CGImageGetBitmapInfo (impl->image));
   CGContextSetAllowsAntialiasing (cg_context, antialias);
 
+  /* convert coordinates from core graphics to gtk+ */
+  height = CGImageGetHeight (impl->image);
+
+  CGContextTranslateCTM (cg_context, 0, height);
+  CGContextScaleCTM (cg_context, 1.0, -1.0);
+
   return cg_context;
 }
 



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