diff --git a/ChangeLog b/ChangeLog index cf0a1f4c11..3bf4a3216b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2008-07-20 Sven Herzberg + + 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 + 2008-07-20 Sven Herzberg reviewed by: Richard Hult diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c index abf2916fc9..ec0cf6c746 100644 --- a/gdk/quartz/gdkdrawable-quartz.c +++ b/gdk/quartz/gdkdrawable-quartz.c @@ -337,6 +337,7 @@ gdk_quartz_draw_drawable (GdkDrawable *drawable, 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_draw_drawable (GdkDrawable *drawable, _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_quartz_draw_drawable (GdkDrawable *drawable, GDK_PIXMAP_IMPL_QUARTZ (src_impl)->height), GDK_PIXMAP_IMPL_QUARTZ (src_impl)->image); + CGContextRestoreGState (context); + gdk_quartz_drawable_release_context (drawable, context); } else diff --git a/gdk/quartz/gdkgc-quartz.c b/gdk/quartz/gdkgc-quartz.c index 601e62ede1..ea77379101 100644 --- a/gdk/quartz/gdkgc-quartz.c +++ b/gdk/quartz/gdkgc-quartz.c @@ -290,12 +290,6 @@ gdk_quartz_draw_tiled_pattern (void *info, 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); diff --git a/gdk/quartz/gdkpixmap-quartz.c b/gdk/quartz/gdkpixmap-quartz.c index 62f0418461..e55ff9d1aa 100644 --- a/gdk/quartz/gdkpixmap-quartz.c +++ b/gdk/quartz/gdkpixmap-quartz.c @@ -47,6 +47,7 @@ gdk_pixmap_impl_quartz_get_context (GdkDrawable *drawable, { 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 @@ gdk_pixmap_impl_quartz_get_context (GdkDrawable *drawable, 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; }