3 * Copyright (C) 2005 Imendio AB
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
24 #include "gdkprivate-quartz.h"
26 static gpointer parent_class = NULL;
29 gdk_quartz_gc_get_values (GdkGC *gc,
32 /* FIXME: Implement */
36 gdk_quartz_gc_set_values (GdkGC *gc,
40 GdkGCQuartz *private = GDK_GC_QUARTZ (gc);
42 private->values_mask |= mask;
44 if (mask & GDK_GC_CLIP_MASK)
46 private->have_clip_region = FALSE;
47 private->have_clip_mask = values->clip_mask != NULL;
48 if (private->clip_mask)
49 CGImageRelease (private->clip_mask);
51 if (values->clip_mask)
52 private->clip_mask = CGImageCreateCopy (GDK_PIXMAP_IMPL_QUARTZ (GDK_PIXMAP_OBJECT (values->clip_mask)->impl)->image);
54 private->clip_mask = NULL;
59 gdk_quartz_gc_set_dashes (GdkGC *gc,
64 /* FIXME: Implement */
68 gdk_gc_quartz_finalize (GObject *object)
70 GdkGCQuartz *private = GDK_GC_QUARTZ (object);
72 if (private->clip_mask)
73 CGImageRelease (private->clip_mask);
75 G_OBJECT_CLASS (parent_class)->finalize (object);
79 gdk_gc_quartz_class_init (GdkGCQuartzClass *klass)
81 GObjectClass *object_class = G_OBJECT_CLASS (klass);
82 GdkGCClass *gc_class = GDK_GC_CLASS (klass);
84 parent_class = g_type_class_peek_parent (klass);
86 object_class->finalize = gdk_gc_quartz_finalize;
88 gc_class->get_values = gdk_quartz_gc_get_values;
89 gc_class->set_values = gdk_quartz_gc_set_values;
90 gc_class->set_dashes = gdk_quartz_gc_set_dashes;
94 _gdk_gc_quartz_get_type (void)
96 static GType object_type = 0;
100 static const GTypeInfo object_info =
102 sizeof (GdkGCQuartzClass),
103 (GBaseInitFunc) NULL,
104 (GBaseFinalizeFunc) NULL,
105 (GClassInitFunc) gdk_gc_quartz_class_init,
106 NULL, /* class_finalize */
107 NULL, /* class_data */
108 sizeof (GdkGCQuartz),
110 (GInstanceInitFunc) NULL,
113 object_type = g_type_register_static (GDK_TYPE_GC,
122 _gdk_quartz_gc_new (GdkDrawable *drawable,
124 GdkGCValuesMask values_mask)
128 gc = g_object_new (GDK_TYPE_GC_QUARTZ, NULL);
130 _gdk_gc_init (gc, drawable, values, values_mask);
132 gdk_quartz_gc_set_values (gc, values, values_mask);
138 _gdk_windowing_gc_set_clip_region (GdkGC *gc,
141 GdkGCQuartz *private = GDK_GC_QUARTZ (gc);
143 if ((private->have_clip_region && ! region) || private->have_clip_mask)
145 if (private->clip_mask)
147 CGImageRelease (private->clip_mask);
148 private->clip_mask = NULL;
150 private->have_clip_mask = FALSE;
153 private->have_clip_region = region != NULL;
155 gc->clip_x_origin = 0;
156 gc->clip_y_origin = 0;
160 _gdk_windowing_gc_copy (GdkGC *dst_gc,
163 /* FIXME: Implement */
167 gdk_gc_get_screen (GdkGC *gc)
173 _gdk_quartz_update_context_from_gc (CGContextRef context, GdkGC *gc)
175 GdkGCQuartz *private;
180 private = GDK_GC_QUARTZ (gc);
182 if (private->have_clip_region)
189 gdk_region_get_rectangles (_gdk_gc_get_clip_region (gc),
195 cg_rects = g_new (CGRect, n_rects);
197 for (i = 0; i < n_rects; i++)
199 cg_rects[i].origin.x = rects[i].x + gc->clip_x_origin;
200 cg_rects[i].origin.y = rects[i].y + gc->clip_y_origin;
201 cg_rects[i].size.width = rects[i].width;
202 cg_rects[i].size.height = rects[i].height;
205 CGContextClipToRects (context, cg_rects, n_rects);
208 if (cg_rects != &rect)
211 else if (private->have_clip_mask && private->clip_mask)
213 /* FIXME: This is 10.4 only. For lower versions, we need to transform the
214 * mask into a region.
216 CGContextClipToMask (context,
217 CGRectMake(gc->clip_x_origin, gc->clip_y_origin,
218 CGImageGetWidth (private->clip_mask),
219 CGImageGetHeight (private->clip_mask)),