diff options
author | Owen Taylor <otaylor@redhat.com> | 2005-05-02 23:29:24 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2005-05-02 23:29:24 +0000 |
commit | 788bbf520a8c62f7798cb032228434ac7da39ada (patch) | |
tree | 6c6d244362bce12b25c5e252af4f8133327f7182 /gdk/linux-fb/gdkgc-fb.c | |
parent | b1cebb4c50256b2ed3c4b2167ab84dac6eb834c3 (diff) | |
download | gtk+-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.c | 129 |
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); } |