summaryrefslogtreecommitdiff
path: root/gdk/linux-fb/gdkgc-fb.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2005-05-02 23:29:24 +0000
committerOwen Taylor <otaylor@src.gnome.org>2005-05-02 23:29:24 +0000
commit788bbf520a8c62f7798cb032228434ac7da39ada (patch)
tree6c6d244362bce12b25c5e252af4f8133327f7182 /gdk/linux-fb/gdkgc-fb.c
parentb1cebb4c50256b2ed3c4b2167ab84dac6eb834c3 (diff)
downloadgtk+-788bbf520a8c62f7798cb032228434ac7da39ada.tar.gz
Add a draw-border style property to allow themes to draw outside the
2005-04-28 Owen Taylor <otaylor@redhat.com> * gtk/gtkwidget.c: Add a draw-border style property to allow themes to draw outside the widget's allocation. * gdk/gdkwindow.c gtk/gtkstyle.c: Remove some save/restore pairs that were working around the clip-leakage bug in Cairo. * gtk/gtkstyle.c: Use cairo_fill_preserve() rathe than save/fill/restore. * gdk/gdkgc.c gdk/gdkinternals.h: Add _gdk_gc_update_context() That updates a Cairo context to match a GC. * gdk/gdkdraw.c: Use _gdk_gc_update_context() to add support for tiles/stipples/clipping to gdk_draw_glyphs(), gdk_draw_trapezoids(). * gdk/gdkpango.c: Use _gdk_gc_update_context() instead of internal implementation of stipples. Use one cairo_t across the entire drawing operation. Replace cairo_matrix_create() with stack-allocated matrices. * gdk/gdkgc.c gdk/gdkinternals.h gdk/x11/gdkgc-x11.c gdk/win32/gdkgc-win32.c: Save various aspects of the GC state (fill, tile, stipple, foreground, background, clip region) in instance-private-data for future use. Add getters. Get rid of _gdk_windowing_gc_get_foreground() function implemented by the backends. * gdk/gdkgc.c gdk/gdkinternals.h gdk/x11/gdkgc-x11.c gdk/win32/gdkgc-win32.c gdk/linux-fb/gdkgc-fb.c: Add _gdk_gc_init() to do initial setup of the GC from values; fixes some problems from drawable redirection. * gdk/gdkgc.c gdk/gdkinternals.h gdk/x11/gdkgc-x11.c gdk/win32/gdkgc-win32.c gdk/linux-fb/gdkgc-fb.c: Move gdk_gc_copy() and gdk_gc_set_clip_{region,rectangle}() into the generic code, add _gdk_windowing_gc_copy(), _gdk_windowing_gc_set_clip_region() to do backend specific stuff. * gdk/x11/{gdkprivate-x11.h,gdkgc-x11.c.c,gdkdrawable-x11.c} gdk/win32/{gdkprivate-win32.h,gdkgc-x11.c.c,gdkdrawable-x11.c} gdk/linux-fb/{gdkprivate-fb.h,gdkgc-fb.c.c,gdkdrawable-fb.c}: Don't duplicate state that now is stored by the generic code. * gdk/gdk.symbols Update
Diffstat (limited to 'gdk/linux-fb/gdkgc-fb.c')
-rw-r--r--gdk/linux-fb/gdkgc-fb.c129
1 files changed, 29 insertions, 100 deletions
diff --git a/gdk/linux-fb/gdkgc-fb.c b/gdk/linux-fb/gdkgc-fb.c
index 8b8a4c702d..a27b9ea962 100644
--- a/gdk/linux-fb/gdkgc-fb.c
+++ b/gdk/linux-fb/gdkgc-fb.c
@@ -79,6 +79,8 @@ _gdk_fb_gc_new (GdkDrawable *drawable,
gc = g_object_new (gdk_gc_fb_get_type (), NULL);
+ _gdk_gc_init (gc, drawable, values, values_mask);
+
private = (GdkGCFBData *)gc;
private->depth = GDK_DRAWABLE_FBDATA (drawable)->depth;
@@ -103,14 +105,8 @@ gdk_fb_gc_finalize (GObject *obj)
private = GDK_GC_FBDATA (gc);
- if (private->clip_region)
- gdk_region_destroy (private->clip_region);
if (private->values.clip_mask)
gdk_pixmap_unref (private->values.clip_mask);
- if (private->values.stipple)
- gdk_pixmap_unref (private->values.stipple);
- if (private->values.tile)
- gdk_pixmap_unref (private->values.tile);
g_free (private->dash_list);
@@ -175,7 +171,7 @@ gdk_fb_gc_set_values (GdkGC *gc,
if (values->tile)
g_assert (GDK_DRAWABLE_IMPL_FBDATA (values->tile)->depth >= 8);
- private->values.tile = values->tile ? gdk_pixmap_ref (values->tile) : NULL;
+ private->values.tile = values->tile;
private->values_mask |= GDK_GC_TILE;
if (oldpm)
gdk_pixmap_unref (oldpm);
@@ -186,7 +182,7 @@ gdk_fb_gc_set_values (GdkGC *gc,
oldpm = private->values.stipple;
if (values->stipple)
g_assert (GDK_DRAWABLE_IMPL_FBDATA (values->stipple)->depth == 1);
- private->values.stipple = values->stipple ? gdk_pixmap_ref (values->stipple) : NULL;
+ private->values.stipple = values->stipple;
private->values_mask |= GDK_GC_STIPPLE;
if (oldpm)
gdk_pixmap_unref (oldpm);
@@ -200,12 +196,6 @@ gdk_fb_gc_set_values (GdkGC *gc,
private->values_mask |= GDK_GC_CLIP_MASK;
if (oldpm)
gdk_pixmap_unref (oldpm);
-
- if (private->clip_region)
- {
- gdk_region_destroy (private->clip_region);
- private->clip_region = NULL;
- }
}
if (values_mask & GDK_GC_SUBWINDOW)
@@ -313,60 +303,13 @@ gc_unset_cmask(GdkGC *gc)
}
void
-gdk_gc_set_clip_rectangle (GdkGC *gc,
- GdkRectangle *rectangle)
-{
- GdkGC *private = (GdkGC *)gc;
- GdkGCFBData *data;
-
- g_return_if_fail (gc != NULL);
-
- data = GDK_GC_FBDATA (gc);
-
- if (data->clip_region)
- {
- gdk_region_destroy (data->clip_region);
- data->clip_region = NULL;
- }
-
- if (rectangle)
- data->clip_region = gdk_region_rectangle (rectangle);
-
- private->clip_x_origin = 0;
- private->clip_y_origin = 0;
- data->values.clip_x_origin = 0;
- data->values.clip_y_origin = 0;
-
- gc_unset_cmask (gc);
-
- _gdk_fb_gc_calc_state (gc, GDK_GC_CLIP_X_ORIGIN|GDK_GC_CLIP_Y_ORIGIN);
-}
-
-void
-gdk_gc_set_clip_region (GdkGC *gc,
- GdkRegion *region)
+_gdk_windowing_gc_set_clip_region (GdkGC *gc,
+ GdkRegion *region)
{
- GdkGC *private = (GdkGC *)gc;
- GdkGCFBData *data;
-
- g_return_if_fail (gc != NULL);
-
- data = GDK_GC_FBDATA (gc);
-
- if (region == data->clip_region)
- return;
+ GdkGCFBData *data = GDK_GC_FBDATA (gc);
- if (data->clip_region)
- {
- gdk_region_destroy (data->clip_region);
- data->clip_region = NULL;
- }
-
- if (region)
- data->clip_region = gdk_region_copy (region);
-
- private->clip_x_origin = 0;
- private->clip_y_origin = 0;
+ gc->clip_x_origin = 0;
+ gc->clip_y_origin = 0;
data->values.clip_x_origin = 0;
data->values.clip_y_origin = 0;
@@ -377,49 +320,35 @@ gdk_gc_set_clip_region (GdkGC *gc,
void
-gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc)
+_gdk_windowing_gc_copy (GdkGC *dst_gc,
+ GdkGC *src_gc)
{
- GdkGCFBData *dst_private;
- GdkGCFBData *src_private;
-
- src_private = GDK_GC_FBDATA (dst_gc);
- dst_private = GDK_GC_FBDATA (dst_gc);
-
- g_return_if_fail (dst_gc != NULL);
- g_return_if_fail (src_gc != NULL);
-
- if (dst_private->clip_region)
- gdk_region_destroy (dst_private->clip_region);
+ GdkGCFBData *dst_private = GDK_GC_FBDATA (dst_gc);
+ GdkGCFBData *src_private = GDK_GC_FBDATA (src_gc);
+ GdkGCValuesMask old_mask = dst_private->values_mask;
if (dst_private->values_mask & GDK_GC_FONT)
gdk_font_unref (dst_private->values.font);
- if (dst_private->values_mask & GDK_GC_TILE)
- gdk_pixmap_unref (dst_private->values.tile);
- if (dst_private->values_mask & GDK_GC_STIPPLE)
- gdk_pixmap_unref (dst_private->values.stipple);
if (dst_private->values_mask & GDK_GC_CLIP_MASK)
- gdk_pixmap_unref (dst_private->values.clip_mask);
+ g_object_unref (dst_private->values.clip_mask);
g_free (dst_private->dash_list);
- *dst_private = *src_private;
+ if (src_private->dash_list)
+ dst_private->dash_list = g_memdup (src_private->dash_list,
+ src_private->dash_list_len);
+
+ dst_private->values_mask = src_private->values_mask;
+ dst_private->values = src_private->values;
if (dst_private->values_mask & GDK_GC_FONT)
gdk_font_ref (dst_private->values.font);
- if (dst_private->values_mask & GDK_GC_TILE)
- gdk_pixmap_ref (dst_private->values.tile);
- if (dst_private->values_mask & GDK_GC_STIPPLE)
- gdk_pixmap_ref (dst_private->values.stipple);
if (dst_private->values_mask & GDK_GC_CLIP_MASK)
- gdk_pixmap_ref (dst_private->values.clip_mask);
-
- if (dst_private->clip_region)
- dst_private->clip_region = gdk_region_copy (dst_private->clip_region);
-
- if (dst_private->dash_list)
- {
- dst_private->dash_list = g_malloc (dst_private->dash_list_len);
- memcpy (dst_private->dash_list,
- src_private->dash_list,
- dst_private->dash_list_len);
- }
+ g_object_ref (dst_private->values.clip_mask);
+
+ dst_private->dash_offset = src_private->dash_offset;
+ dst_private->alu = src_private->alu;
+
+ dst_private->set_pixel = src_private->set_pixel;
+
+ _gdk_fb_gc_calc_state (gc, old_mask | dst_private->values_mask);
}