mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 19:00:08 +00:00
API: remove gdk_draw_drawable()
This commit is contained in:
parent
0cef9c2bbe
commit
61d4a019f8
@ -333,9 +333,6 @@ gdk_drawable_get_size
|
||||
gdk_drawable_get_clip_region
|
||||
gdk_drawable_get_visible_region
|
||||
|
||||
<SUBSECTION>
|
||||
gdk_draw_drawable
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GDK_DRAWABLE
|
||||
GDK_DRAWABLE_GET_CLASS
|
||||
|
@ -127,19 +127,3 @@ or a #GdkWindow.
|
||||
@Returns:
|
||||
|
||||
|
||||
<!-- ##### FUNCTION gdk_draw_drawable ##### -->
|
||||
<para>
|
||||
|
||||
</para>
|
||||
|
||||
@drawable:
|
||||
@gc:
|
||||
@src:
|
||||
@xsrc:
|
||||
@ysrc:
|
||||
@xdest:
|
||||
@ydest:
|
||||
@width:
|
||||
@height:
|
||||
|
||||
|
||||
|
@ -382,8 +382,7 @@ union, 16-bit data uses the s array, and 32-bit data uses the l array.
|
||||
|
||||
<!-- ##### STRUCT GdkEventNoExpose ##### -->
|
||||
<para>
|
||||
Generated when the area of a #GdkDrawable being copied, with gdk_draw_drawable()
|
||||
, was completely available.
|
||||
Generated when the area of a #GdkDrawable being copied was completely available.
|
||||
</para>
|
||||
<para>
|
||||
FIXME: add more here.
|
||||
|
@ -8,7 +8,7 @@ Offscreen drawables
|
||||
<para>
|
||||
Pixmaps are offscreen drawables. They can be drawn upon with the
|
||||
standard drawing primitives, then copied to another drawable (such as
|
||||
a #GdkWindow) with gdk_draw_drawable(). The depth of a pixmap
|
||||
a #GdkWindow). The depth of a pixmap
|
||||
is the number of bits per pixels. Bitmaps are simply pixmaps
|
||||
with a depth of 1. (That is, they are monochrome bitmaps - each
|
||||
pixel can be either on or off).
|
||||
|
@ -397,62 +397,6 @@ gdk_directfb_setup_for_drawing (GdkDrawableImplDirectFB *impl,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_directfb_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GdkDrawableImplDirectFB *impl;
|
||||
GdkDrawableImplDirectFB *src_impl;
|
||||
cairo_region_t clip;
|
||||
GdkRectangle dest_rect = { xdest,
|
||||
ydest,
|
||||
xdest + width ,
|
||||
ydest + height};
|
||||
|
||||
DFBRectangle rect = { xsrc, ysrc, width, height };
|
||||
gint i;
|
||||
|
||||
D_DEBUG_AT( GDKDFB_Drawable, "%s( %p, %p, %p, %4d,%4d -> %4d,%4d - %dx%d )\n", G_STRFUNC,
|
||||
drawable, gc, src, xsrc, ysrc, xdest, ydest, width, height );
|
||||
|
||||
impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
|
||||
|
||||
if (!impl->surface)
|
||||
return;
|
||||
|
||||
if (GDK_IS_PIXMAP (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_PIXMAP_OBJECT (src)->impl);
|
||||
else if (GDK_IS_WINDOW (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (src)->impl);
|
||||
else if (GDK_IS_DRAWABLE_IMPL_DIRECTFB (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_DIRECTFB (src);
|
||||
else
|
||||
return;
|
||||
|
||||
gdk_directfb_clip_region (drawable, gc, &dest_rect, &clip);
|
||||
|
||||
impl->surface->SetBlittingFlags (impl->surface, DSBLIT_NOFX);
|
||||
|
||||
for (i = 0; i < clip.numRects; i++)
|
||||
{
|
||||
DFBRegion reg = { clip.rects[i].x1, clip.rects[i].y1,
|
||||
clip.rects[i].x2 , clip.rects[i].y2 };
|
||||
|
||||
impl->surface->SetClip (impl->surface, ®);
|
||||
impl->surface->Blit (impl->surface, src_impl->surface, &rect,
|
||||
xdest, ydest);
|
||||
}
|
||||
|
||||
temp_region_deinit( &clip );
|
||||
}
|
||||
|
||||
static inline void
|
||||
convert_rgba_pixbuf_to_image (guint32 *src,
|
||||
guint src_pitch,
|
||||
@ -549,7 +493,6 @@ gdk_drawable_impl_directfb_class_init (GdkDrawableImplDirectFBClass *klass)
|
||||
object_class->finalize = gdk_drawable_impl_directfb_finalize;
|
||||
|
||||
drawable_class->create_gc = _gdk_directfb_gc_new;
|
||||
drawable_class->draw_drawable = gdk_directfb_draw_drawable;
|
||||
|
||||
drawable_class->ref_cairo_surface = gdk_directfb_ref_cairo_surface;
|
||||
drawable_class->set_colormap = gdk_directfb_set_colormap;
|
||||
|
@ -549,7 +549,6 @@ gdk_drawable_get_type G_GNUC_CONST
|
||||
gdk_drawable_get_visible_region
|
||||
gdk_drawable_get_visual
|
||||
gdk_drawable_set_colormap
|
||||
gdk_draw_drawable
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
129
gdk/gdkdraw.c
129
gdk/gdkdraw.c
@ -44,15 +44,6 @@ static GdkDrawable* gdk_drawable_real_get_composite_drawable (GdkDrawable *draw
|
||||
gint *composite_x_offset,
|
||||
gint *composite_y_offset);
|
||||
static cairo_region_t * gdk_drawable_real_get_visible_region (GdkDrawable *drawable);
|
||||
static void gdk_drawable_real_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height);
|
||||
|
||||
|
||||
G_DEFINE_ABSTRACT_TYPE (GdkDrawable, gdk_drawable, G_TYPE_OBJECT)
|
||||
@ -64,7 +55,6 @@ gdk_drawable_class_init (GdkDrawableClass *klass)
|
||||
/* Default implementation for clip and visible region is the same */
|
||||
klass->get_clip_region = gdk_drawable_real_get_visible_region;
|
||||
klass->get_visible_region = gdk_drawable_real_get_visible_region;
|
||||
klass->draw_drawable = gdk_drawable_real_draw_drawable;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -211,100 +201,6 @@ gdk_drawable_get_colormap (GdkDrawable *drawable)
|
||||
return GDK_DRAWABLE_GET_CLASS (drawable)->get_colormap (drawable);
|
||||
}
|
||||
|
||||
/* Drawing
|
||||
*/
|
||||
|
||||
/**
|
||||
* gdk_draw_drawable:
|
||||
* @drawable: a #GdkDrawable
|
||||
* @gc: a #GdkGC sharing the drawable's visual and colormap
|
||||
* @src: the source #GdkDrawable, which may be the same as @drawable
|
||||
* @xsrc: X position in @src of rectangle to draw
|
||||
* @ysrc: Y position in @src of rectangle to draw
|
||||
* @xdest: X position in @drawable where the rectangle should be drawn
|
||||
* @ydest: Y position in @drawable where the rectangle should be drawn
|
||||
* @width: width of rectangle to draw, or -1 for entire @src width
|
||||
* @height: height of rectangle to draw, or -1 for entire @src height
|
||||
*
|
||||
* Copies the @width x @height region of @src at coordinates (@xsrc,
|
||||
* @ysrc) to coordinates (@xdest, @ydest) in @drawable.
|
||||
* @width and/or @height may be given as -1, in which case the entire
|
||||
* @src drawable will be copied.
|
||||
*
|
||||
* Most fields in @gc are not used for this operation, but notably the
|
||||
* clip mask or clip region will be honored.
|
||||
*
|
||||
* The source and destination drawables must have the same visual and
|
||||
* colormap, or errors will result. (On X11, failure to match
|
||||
* visual/colormap results in a BadMatch error from the X server.)
|
||||
* A common cause of this problem is an attempt to draw a bitmap to
|
||||
* a color drawable. The way to draw a bitmap is to set the bitmap as
|
||||
* the stipple on the #GdkGC, set the fill mode to %GDK_STIPPLED, and
|
||||
* then draw the rectangle.
|
||||
**/
|
||||
void
|
||||
gdk_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GdkDrawable *composite;
|
||||
gint composite_x_offset = 0;
|
||||
gint composite_y_offset = 0;
|
||||
|
||||
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
|
||||
g_return_if_fail (GDK_IS_DRAWABLE (src));
|
||||
g_return_if_fail (GDK_IS_GC (gc));
|
||||
|
||||
if (width < 0 || height < 0)
|
||||
{
|
||||
gint real_width;
|
||||
gint real_height;
|
||||
|
||||
gdk_drawable_get_size (src, &real_width, &real_height);
|
||||
|
||||
if (width < 0)
|
||||
width = real_width;
|
||||
if (height < 0)
|
||||
height = real_height;
|
||||
}
|
||||
|
||||
|
||||
composite =
|
||||
GDK_DRAWABLE_GET_CLASS (src)->get_composite_drawable (src,
|
||||
xsrc, ysrc,
|
||||
width, height,
|
||||
&composite_x_offset,
|
||||
&composite_y_offset);
|
||||
|
||||
/* TODO: For non-native windows this may copy stuff from other overlapping
|
||||
windows. We should clip that and (for windows with bg != None) clear that
|
||||
area in the destination instead. */
|
||||
|
||||
if (GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src)
|
||||
GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src (drawable, gc,
|
||||
composite,
|
||||
xsrc - composite_x_offset,
|
||||
ysrc - composite_y_offset,
|
||||
xdest, ydest,
|
||||
width, height,
|
||||
src);
|
||||
else /* backwards compat for old out-of-tree implementations of GdkDrawable (are there any?) */
|
||||
GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable (drawable, gc,
|
||||
composite,
|
||||
xsrc - composite_x_offset,
|
||||
ysrc - composite_y_offset,
|
||||
xdest, ydest,
|
||||
width, height);
|
||||
|
||||
g_object_unref (composite);
|
||||
}
|
||||
|
||||
static GdkDrawable *
|
||||
gdk_drawable_real_get_composite_drawable (GdkDrawable *drawable,
|
||||
gint x,
|
||||
@ -396,31 +292,6 @@ _gdk_drawable_ref_cairo_surface (GdkDrawable *drawable)
|
||||
return GDK_DRAWABLE_GET_CLASS (drawable)->ref_cairo_surface (drawable);
|
||||
}
|
||||
|
||||
/* Implementation of the old vfunc in terms of the new one
|
||||
in case someone calls it directly (which they shouldn't!) */
|
||||
static void
|
||||
gdk_drawable_real_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
GDK_DRAWABLE_GET_CLASS (drawable)->draw_drawable_with_src (drawable,
|
||||
gc,
|
||||
src,
|
||||
xsrc,
|
||||
ysrc,
|
||||
xdest,
|
||||
ydest,
|
||||
width,
|
||||
height,
|
||||
src);
|
||||
}
|
||||
|
||||
/************************************************************************/
|
||||
|
||||
/**
|
||||
|
@ -60,15 +60,6 @@ struct _GdkDrawableClass
|
||||
GdkGC *(*create_gc) (GdkDrawable *drawable,
|
||||
GdkGCValues *values,
|
||||
GdkGCValuesMask mask);
|
||||
void (*draw_drawable) (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height);
|
||||
|
||||
gint (*get_depth) (GdkDrawable *drawable);
|
||||
void (*get_size) (GdkDrawable *drawable,
|
||||
@ -104,17 +95,6 @@ struct _GdkDrawableClass
|
||||
int width,
|
||||
int height);
|
||||
|
||||
void (*draw_drawable_with_src) (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src);
|
||||
|
||||
/* Padding for future expansion */
|
||||
void (*_gdk_reserved7) (void);
|
||||
void (*_gdk_reserved9) (void);
|
||||
@ -141,18 +121,6 @@ gint gdk_drawable_get_depth (GdkDrawable *drawable);
|
||||
GdkScreen* gdk_drawable_get_screen (GdkDrawable *drawable);
|
||||
GdkDisplay* gdk_drawable_get_display (GdkDrawable *drawable);
|
||||
|
||||
/* Drawing
|
||||
*/
|
||||
void gdk_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height);
|
||||
|
||||
cairo_region_t *gdk_drawable_get_clip_region (GdkDrawable *drawable);
|
||||
cairo_region_t *gdk_drawable_get_visible_region (GdkDrawable *drawable);
|
||||
|
||||
|
@ -921,7 +921,7 @@ _gdk_gc_get_subwindow (GdkGC *gc)
|
||||
* Sets whether copying non-visible portions of a drawable
|
||||
* using this graphics context generate exposure events
|
||||
* for the corresponding regions of the destination
|
||||
* drawable. (See gdk_draw_drawable()).
|
||||
* drawable.
|
||||
**/
|
||||
void
|
||||
gdk_gc_set_exposures (GdkGC *gc,
|
||||
|
@ -273,37 +273,6 @@ add_damage (GdkOffscreenWindow *offscreen,
|
||||
cairo_region_destroy (damage);
|
||||
}
|
||||
|
||||
static GdkDrawable *
|
||||
get_real_drawable (GdkOffscreenWindow *offscreen)
|
||||
{
|
||||
GdkPixmapObject *pixmap;
|
||||
pixmap = (GdkPixmapObject *) offscreen->pixmap;
|
||||
return GDK_DRAWABLE (pixmap->impl);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_offscreen_window_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src)
|
||||
{
|
||||
GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
|
||||
GdkDrawable *real_drawable = get_real_drawable (offscreen);
|
||||
|
||||
gdk_draw_drawable (real_drawable, gc,
|
||||
src, xsrc, ysrc,
|
||||
xdest, ydest,
|
||||
width, height);
|
||||
|
||||
add_damage (offscreen, xdest, ydest, width, height, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_offscreen_window_new (GdkWindow *window,
|
||||
GdkScreen *screen,
|
||||
@ -953,8 +922,6 @@ gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
|
||||
drawable_class->get_visual = gdk_offscreen_window_get_visual;
|
||||
drawable_class->get_source_drawable = gdk_offscreen_window_get_source_drawable;
|
||||
drawable_class->get_composite_drawable = gdk_offscreen_window_get_composite_drawable;
|
||||
|
||||
drawable_class->draw_drawable_with_src = gdk_offscreen_window_draw_drawable;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -34,16 +34,6 @@
|
||||
static GdkGC *gdk_pixmap_create_gc (GdkDrawable *drawable,
|
||||
GdkGCValues *values,
|
||||
GdkGCValuesMask mask);
|
||||
static void gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkPixmap *original_src);
|
||||
|
||||
static void gdk_pixmap_real_get_size (GdkDrawable *drawable,
|
||||
gint *width,
|
||||
@ -102,7 +92,6 @@ gdk_pixmap_class_init (GdkPixmapObjectClass *klass)
|
||||
object_class->finalize = gdk_pixmap_finalize;
|
||||
|
||||
drawable_class->create_gc = gdk_pixmap_create_gc;
|
||||
drawable_class->draw_drawable_with_src = gdk_pixmap_draw_drawable;
|
||||
drawable_class->get_depth = gdk_pixmap_real_get_depth;
|
||||
drawable_class->get_screen = gdk_pixmap_real_get_screen;
|
||||
drawable_class->get_size = gdk_pixmap_real_get_size;
|
||||
@ -181,30 +170,6 @@ gdk_pixmap_create_gc (GdkDrawable *drawable,
|
||||
values, mask);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_pixmap_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkPixmap *original_src)
|
||||
{
|
||||
GdkPixmapObject *private = (GdkPixmapObject *)drawable;
|
||||
|
||||
_gdk_gc_remove_drawable_clip (gc);
|
||||
/* Call the method directly to avoid getting the composite drawable again */
|
||||
GDK_DRAWABLE_GET_CLASS (private->impl)->draw_drawable_with_src (private->impl, gc,
|
||||
src,
|
||||
xsrc, ysrc,
|
||||
xdest, ydest,
|
||||
width, height,
|
||||
original_src);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_pixmap_real_get_size (GdkDrawable *drawable,
|
||||
gint *width,
|
||||
|
100
gdk/gdkwindow.c
100
gdk/gdkwindow.c
@ -229,16 +229,6 @@ typedef struct {
|
||||
static GdkGC *gdk_window_create_gc (GdkDrawable *drawable,
|
||||
GdkGCValues *values,
|
||||
GdkGCValuesMask mask);
|
||||
static void gdk_window_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src);
|
||||
|
||||
static cairo_surface_t *gdk_window_ref_cairo_surface (GdkDrawable *drawable);
|
||||
static cairo_surface_t *gdk_window_create_cairo_surface (GdkDrawable *drawable,
|
||||
@ -417,7 +407,6 @@ gdk_window_class_init (GdkWindowObjectClass *klass)
|
||||
object_class->get_property = gdk_window_get_property;
|
||||
|
||||
drawable_class->create_gc = gdk_window_create_gc;
|
||||
drawable_class->draw_drawable_with_src = gdk_window_draw_drawable;
|
||||
drawable_class->get_depth = gdk_window_real_get_depth;
|
||||
drawable_class->get_screen = gdk_window_real_get_screen;
|
||||
drawable_class->get_size = gdk_window_real_get_size;
|
||||
@ -4033,95 +4022,6 @@ gdk_window_get_visible_region (GdkDrawable *drawable)
|
||||
return cairo_region_copy (private->clip_region);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_window_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src)
|
||||
{
|
||||
GdkWindowObject *private = (GdkWindowObject *)drawable;
|
||||
|
||||
if (GDK_WINDOW_DESTROYED (drawable))
|
||||
return;
|
||||
|
||||
BEGIN_DRAW;
|
||||
|
||||
/* Call the method directly to avoid getting the composite drawable again */
|
||||
GDK_DRAWABLE_GET_CLASS (impl)->draw_drawable_with_src (impl, gc,
|
||||
src,
|
||||
xsrc, ysrc,
|
||||
xdest - x_offset,
|
||||
ydest - y_offset,
|
||||
width, height,
|
||||
original_src);
|
||||
|
||||
if (!private->paint_stack)
|
||||
{
|
||||
/* We might have drawn from an obscured part of a client
|
||||
side window, if so we need to send graphics exposures */
|
||||
if (_gdk_gc_get_exposures (gc) &&
|
||||
GDK_IS_WINDOW (original_src))
|
||||
{
|
||||
cairo_region_t *exposure_region;
|
||||
cairo_region_t *clip;
|
||||
GdkRectangle r;
|
||||
|
||||
r.x = xdest;
|
||||
r.y = ydest;
|
||||
r.width = width;
|
||||
r.height = height;
|
||||
exposure_region = cairo_region_create_rectangle (&r);
|
||||
|
||||
if (_gdk_gc_get_subwindow (gc) == GDK_CLIP_BY_CHILDREN)
|
||||
clip = private->clip_region_with_children;
|
||||
else
|
||||
clip = private->clip_region;
|
||||
cairo_region_intersect (exposure_region, clip);
|
||||
|
||||
_gdk_gc_remove_drawable_clip (gc);
|
||||
clip = _gdk_gc_get_clip_region (gc);
|
||||
if (clip)
|
||||
{
|
||||
cairo_region_translate (exposure_region,
|
||||
old_clip_x,
|
||||
old_clip_y);
|
||||
cairo_region_intersect (exposure_region, clip);
|
||||
cairo_region_translate (exposure_region,
|
||||
-old_clip_x,
|
||||
-old_clip_y);
|
||||
}
|
||||
|
||||
/* Note: We don't clip by the clip mask if set, so this
|
||||
may invalidate to much */
|
||||
|
||||
/* Remove the area that is correctly copied from the src.
|
||||
* Note that xsrc/ysrc has been corrected for abs_x/y offsets already,
|
||||
* which need to be undone */
|
||||
clip = gdk_drawable_get_visible_region (original_src);
|
||||
cairo_region_translate (clip,
|
||||
xdest - (xsrc - GDK_WINDOW_OBJECT (original_src)->abs_x),
|
||||
ydest - (ysrc - GDK_WINDOW_OBJECT (original_src)->abs_y));
|
||||
cairo_region_subtract (exposure_region, clip);
|
||||
cairo_region_destroy (clip);
|
||||
|
||||
gdk_window_invalidate_region_full (GDK_WINDOW (private),
|
||||
exposure_region,
|
||||
_gdk_gc_get_subwindow (gc) == GDK_INCLUDE_INFERIORS,
|
||||
CLEAR_BG_ALL);
|
||||
|
||||
cairo_region_destroy (exposure_region);
|
||||
}
|
||||
}
|
||||
|
||||
END_DRAW;
|
||||
}
|
||||
|
||||
static cairo_t *
|
||||
setup_backing_rect (GdkWindow *window, GdkWindowPaint *paint, int x_offset_cairo, int y_offset_cairo)
|
||||
{
|
||||
|
@ -147,87 +147,6 @@ gdk_quartz_get_depth (GdkDrawable *drawable)
|
||||
return gdk_drawable_get_depth (GDK_DRAWABLE_IMPL_QUARTZ (drawable)->wrapper);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_quartz_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src)
|
||||
{
|
||||
int src_depth = gdk_drawable_get_depth (src);
|
||||
int dest_depth = gdk_drawable_get_depth (drawable);
|
||||
GdkDrawableImplQuartz *src_impl;
|
||||
|
||||
if (GDK_IS_WINDOW_IMPL_QUARTZ (src))
|
||||
{
|
||||
GdkWindowImplQuartz *window_impl;
|
||||
|
||||
window_impl = GDK_WINDOW_IMPL_QUARTZ (src);
|
||||
|
||||
/* We do support moving areas on the same drawable, if it can be done
|
||||
* by using a scroll. FIXME: We need to check that the params support
|
||||
* this hack, and make sure it's done properly with any offsets etc?
|
||||
*/
|
||||
if (drawable == (GdkDrawable *)window_impl)
|
||||
{
|
||||
[window_impl->view scrollRect:NSMakeRect (xsrc, ysrc, width, height)
|
||||
by:NSMakeSize (xdest - xsrc, ydest - ysrc)];
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
g_warning ("Drawing with window source != dest is not supported");
|
||||
|
||||
return;
|
||||
}
|
||||
else if (GDK_IS_DRAWABLE_IMPL_QUARTZ (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_QUARTZ (src);
|
||||
else if (GDK_IS_PIXMAP (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_QUARTZ (GDK_PIXMAP_OBJECT (src)->impl);
|
||||
else
|
||||
{
|
||||
g_warning ("Unsupported source %s", G_OBJECT_TYPE_NAME (src));
|
||||
return;
|
||||
}
|
||||
|
||||
/* Handle drawable and pixmap sources. */
|
||||
if (src_depth == 1)
|
||||
{
|
||||
/* FIXME: src depth 1 is not supported yet */
|
||||
g_warning ("Source with depth 1 unsupported");
|
||||
}
|
||||
else if (dest_depth != 0 && src_depth == dest_depth)
|
||||
{
|
||||
GdkPixmapImplQuartz *pixmap_impl = GDK_PIXMAP_IMPL_QUARTZ (src_impl);
|
||||
CGContextRef context = gdk_quartz_drawable_get_context (drawable, FALSE);
|
||||
|
||||
if (!context)
|
||||
return;
|
||||
|
||||
_gdk_quartz_gc_update_cg_context (gc, drawable, context,
|
||||
GDK_QUARTZ_CONTEXT_STROKE);
|
||||
|
||||
CGContextClipToRect (context, CGRectMake (xdest, ydest, width, height));
|
||||
CGContextTranslateCTM (context, xdest - xsrc, ydest - ysrc +
|
||||
pixmap_impl->height);
|
||||
CGContextScaleCTM (context, 1.0, -1.0);
|
||||
|
||||
CGContextDrawImage (context,
|
||||
CGRectMake (0, 0, pixmap_impl->width, pixmap_impl->height),
|
||||
pixmap_impl->image);
|
||||
|
||||
gdk_quartz_drawable_release_context (drawable, context);
|
||||
}
|
||||
else
|
||||
g_warning ("Attempt to draw a drawable with depth %d to a drawable with depth %d",
|
||||
src_depth, dest_depth);
|
||||
}
|
||||
|
||||
static inline void
|
||||
gdk_quartz_fix_cap_not_last_line (GdkGCQuartz *private,
|
||||
gint x1,
|
||||
@ -277,7 +196,6 @@ gdk_drawable_impl_quartz_class_init (GdkDrawableImplQuartzClass *klass)
|
||||
object_class->finalize = gdk_drawable_impl_quartz_finalize;
|
||||
|
||||
drawable_class->create_gc = _gdk_quartz_gc_new;
|
||||
drawable_class->draw_drawable_with_src = gdk_quartz_draw_drawable;
|
||||
|
||||
drawable_class->ref_cairo_surface = gdk_quartz_ref_cairo_surface;
|
||||
|
||||
|
@ -48,17 +48,6 @@
|
||||
(gcwin32->line_style == GDK_LINE_DOUBLE_DASH || \
|
||||
(gcwin32->line_style == GDK_LINE_ON_OFF_DASH && gcwin32->pen_dash_offset))
|
||||
|
||||
static void gdk_win32_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src);
|
||||
|
||||
static cairo_surface_t *gdk_win32_ref_cairo_surface (GdkDrawable *drawable);
|
||||
|
||||
static void gdk_win32_set_colormap (GdkDrawable *drawable,
|
||||
@ -88,7 +77,6 @@ _gdk_drawable_impl_win32_class_init (GdkDrawableImplWin32Class *klass)
|
||||
object_class->finalize = gdk_drawable_impl_win32_finalize;
|
||||
|
||||
drawable_class->create_gc = _gdk_win32_gc_new;
|
||||
drawable_class->draw_drawable_with_src = gdk_win32_draw_drawable;
|
||||
|
||||
drawable_class->ref_cairo_surface = gdk_win32_ref_cairo_surface;
|
||||
|
||||
@ -431,25 +419,6 @@ widen_bounds (GdkRectangle *bounds,
|
||||
return cairo_region_create_rectangle (bounds);
|
||||
}
|
||||
|
||||
static void
|
||||
gdk_win32_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src)
|
||||
{
|
||||
g_assert (GDK_IS_DRAWABLE_IMPL_WIN32 (drawable));
|
||||
|
||||
_gdk_win32_blit (FALSE, (GdkDrawableImplWin32 *) drawable,
|
||||
gc, src, xsrc, ysrc,
|
||||
xdest, ydest, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
blit_from_pixmap (gboolean use_fg_bg,
|
||||
GdkDrawableImplWin32 *dest,
|
||||
@ -650,158 +619,6 @@ blit_from_window (HDC hdc,
|
||||
GDI_CALL (ReleaseDC, (src->handle, srcdc));
|
||||
}
|
||||
|
||||
void
|
||||
_gdk_win32_blit (gboolean use_fg_bg,
|
||||
GdkDrawableImplWin32 *draw_impl,
|
||||
GdkGC *gc,
|
||||
GdkDrawable *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height)
|
||||
{
|
||||
HDC hdc;
|
||||
HRGN src_rgn, draw_rgn, outside_rgn;
|
||||
RECT r;
|
||||
GdkDrawableImplWin32 *src_impl = NULL;
|
||||
gint src_width, src_height;
|
||||
|
||||
GDK_NOTE (DRAW, g_print ("_gdk_win32_blit: src:%s %dx%d@%+d%+d\n"
|
||||
" dst:%s @%+d%+d use_fg_bg=%d\n",
|
||||
_gdk_win32_drawable_description (src),
|
||||
width, height, xsrc, ysrc,
|
||||
_gdk_win32_drawable_description (&draw_impl->parent_instance),
|
||||
xdest, ydest,
|
||||
use_fg_bg));
|
||||
|
||||
/* If blitting from the root window, take the multi-monitor offset
|
||||
* into account.
|
||||
*/
|
||||
if (src == ((GdkWindowObject *)_gdk_root)->impl)
|
||||
{
|
||||
GDK_NOTE (DRAW, g_print ("... offsetting src coords\n"));
|
||||
xsrc -= _gdk_offset_x;
|
||||
ysrc -= _gdk_offset_y;
|
||||
}
|
||||
|
||||
if (GDK_IS_DRAWABLE_IMPL_WIN32 (src))
|
||||
src_impl = (GdkDrawableImplWin32 *) src;
|
||||
else if (GDK_IS_WINDOW (src))
|
||||
src_impl = (GdkDrawableImplWin32 *) GDK_WINDOW_OBJECT (src)->impl;
|
||||
else if (GDK_IS_PIXMAP (src))
|
||||
src_impl = (GdkDrawableImplWin32 *) GDK_PIXMAP_OBJECT (src)->impl;
|
||||
else
|
||||
g_assert_not_reached ();
|
||||
|
||||
if (GDK_IS_WINDOW_IMPL_WIN32 (draw_impl) &&
|
||||
GDK_IS_PIXMAP_IMPL_WIN32 (src_impl))
|
||||
{
|
||||
GdkPixmapImplWin32 *src_pixmap = GDK_PIXMAP_IMPL_WIN32 (src_impl);
|
||||
|
||||
if (xsrc < 0)
|
||||
{
|
||||
width += xsrc;
|
||||
xdest -= xsrc;
|
||||
xsrc = 0;
|
||||
}
|
||||
|
||||
if (ysrc < 0)
|
||||
{
|
||||
height += ysrc;
|
||||
ydest -= ysrc;
|
||||
ysrc = 0;
|
||||
}
|
||||
|
||||
if (xsrc + width > src_pixmap->width)
|
||||
width = src_pixmap->width - xsrc;
|
||||
if (ysrc + height > src_pixmap->height)
|
||||
height = src_pixmap->height - ysrc;
|
||||
}
|
||||
|
||||
hdc = gdk_win32_hdc_get (&draw_impl->parent_instance, gc, GDK_GC_FOREGROUND);
|
||||
|
||||
gdk_drawable_get_size (src_impl->wrapper, &src_width, &src_height);
|
||||
|
||||
if ((src_rgn = CreateRectRgn (0, 0, src_width + 1, src_height + 1)) == NULL)
|
||||
{
|
||||
WIN32_GDI_FAILED ("CreateRectRgn");
|
||||
}
|
||||
else if ((draw_rgn = CreateRectRgn (xsrc, ysrc,
|
||||
xsrc + width + 1,
|
||||
ysrc + height + 1)) == NULL)
|
||||
{
|
||||
WIN32_GDI_FAILED ("CreateRectRgn");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (GDK_IS_WINDOW_IMPL_WIN32 (draw_impl))
|
||||
{
|
||||
int comb;
|
||||
|
||||
/* If we are drawing on a window, calculate the region that is
|
||||
* outside the source pixmap, and invalidate that, causing it to
|
||||
* be cleared. Not completely sure whether this is always needed. XXX
|
||||
*/
|
||||
SetRectEmpty (&r);
|
||||
outside_rgn = CreateRectRgnIndirect (&r);
|
||||
|
||||
if ((comb = CombineRgn (outside_rgn,
|
||||
draw_rgn, src_rgn,
|
||||
RGN_DIFF)) == ERROR)
|
||||
WIN32_GDI_FAILED ("CombineRgn");
|
||||
else if (comb != NULLREGION)
|
||||
{
|
||||
OffsetRgn (outside_rgn, xdest, ydest);
|
||||
GDK_NOTE (DRAW, (GetRgnBox (outside_rgn, &r),
|
||||
g_print ("... InvalidateRgn "
|
||||
"bbox: %ldx%ld@%+ld%+ld\n",
|
||||
r.right - r.left - 1, r.bottom - r.top - 1,
|
||||
r.left, r.top)));
|
||||
InvalidateRgn (draw_impl->handle, outside_rgn, TRUE);
|
||||
}
|
||||
GDI_CALL (DeleteObject, (outside_rgn));
|
||||
}
|
||||
|
||||
#if 1 /* Don't know if this is necessary XXX */
|
||||
if (CombineRgn (draw_rgn, draw_rgn, src_rgn, RGN_AND) == COMPLEXREGION)
|
||||
g_warning ("gdk_win32_blit: CombineRgn returned a COMPLEXREGION");
|
||||
|
||||
GetRgnBox (draw_rgn, &r);
|
||||
if (r.left != xsrc || r.top != ysrc ||
|
||||
r.right != xsrc + width + 1 || r.bottom != ysrc + height + 1)
|
||||
{
|
||||
xdest += r.left - xsrc;
|
||||
xsrc = r.left;
|
||||
ydest += r.top - ysrc;
|
||||
ysrc = r.top;
|
||||
width = r.right - xsrc - 1;
|
||||
height = r.bottom - ysrc - 1;
|
||||
|
||||
GDK_NOTE (DRAW, g_print ("... restricted to src: %dx%d@%+d%+d, "
|
||||
"dest: @%+d%+d\n",
|
||||
width, height, xsrc, ysrc,
|
||||
xdest, ydest));
|
||||
}
|
||||
#endif
|
||||
|
||||
GDI_CALL (DeleteObject, (src_rgn));
|
||||
GDI_CALL (DeleteObject, (draw_rgn));
|
||||
}
|
||||
|
||||
if (draw_impl->handle == src_impl->handle)
|
||||
blit_inside_drawable (hdc, GDK_GC_WIN32 (gc), xsrc, ysrc, xdest, ydest, width, height);
|
||||
else if (GDK_IS_PIXMAP_IMPL_WIN32 (src_impl))
|
||||
blit_from_pixmap (use_fg_bg, draw_impl, hdc,
|
||||
(GdkPixmapImplWin32 *) src_impl, gc,
|
||||
xsrc, ysrc, xdest, ydest, width, height);
|
||||
else
|
||||
blit_from_window (hdc, GDK_GC_WIN32 (gc), src_impl, xsrc, ysrc, xdest, ydest, width, height);
|
||||
|
||||
gdk_win32_hdc_release (&draw_impl->parent_instance, gc, GDK_GC_FOREGROUND);
|
||||
}
|
||||
|
||||
/**
|
||||
* _gdk_win32_drawable_acquire_dc
|
||||
* @drawable: a Win32 #GdkDrawable implementation
|
||||
|
@ -48,17 +48,6 @@
|
||||
#include "gdkdisplay-x11.h"
|
||||
|
||||
|
||||
static void gdk_x11_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src);
|
||||
|
||||
static cairo_surface_t *gdk_x11_ref_cairo_surface (GdkDrawable *drawable);
|
||||
|
||||
static void gdk_x11_set_colormap (GdkDrawable *drawable,
|
||||
@ -84,7 +73,6 @@ _gdk_drawable_impl_x11_class_init (GdkDrawableImplX11Class *klass)
|
||||
object_class->finalize = gdk_drawable_impl_x11_finalize;
|
||||
|
||||
drawable_class->create_gc = _gdk_x11_gc_new;
|
||||
drawable_class->draw_drawable_with_src = gdk_x11_draw_drawable;
|
||||
|
||||
drawable_class->ref_cairo_surface = gdk_x11_ref_cairo_surface;
|
||||
|
||||
@ -277,95 +265,6 @@ gdk_x11_set_colormap (GdkDrawable *drawable,
|
||||
g_object_ref (impl->colormap);
|
||||
}
|
||||
|
||||
/* Drawing
|
||||
*/
|
||||
|
||||
static void
|
||||
gdk_x11_draw_drawable (GdkDrawable *drawable,
|
||||
GdkGC *gc,
|
||||
GdkPixmap *src,
|
||||
gint xsrc,
|
||||
gint ysrc,
|
||||
gint xdest,
|
||||
gint ydest,
|
||||
gint width,
|
||||
gint height,
|
||||
GdkDrawable *original_src)
|
||||
{
|
||||
int src_depth = gdk_drawable_get_depth (src);
|
||||
int dest_depth = gdk_drawable_get_depth (drawable);
|
||||
GdkDrawableImplX11 *impl;
|
||||
GdkDrawableImplX11 *src_impl;
|
||||
|
||||
impl = GDK_DRAWABLE_IMPL_X11 (drawable);
|
||||
|
||||
if (GDK_IS_DRAWABLE_IMPL_X11 (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_X11 (src);
|
||||
else if (GDK_IS_WINDOW (src))
|
||||
src_impl = GDK_DRAWABLE_IMPL_X11(((GdkWindowObject *)src)->impl);
|
||||
else
|
||||
src_impl = GDK_DRAWABLE_IMPL_X11(((GdkPixmapObject *)src)->impl);
|
||||
|
||||
if (GDK_IS_WINDOW_IMPL_X11 (impl) &&
|
||||
GDK_IS_PIXMAP_IMPL_X11 (src_impl))
|
||||
{
|
||||
GdkPixmapImplX11 *src_pixmap = GDK_PIXMAP_IMPL_X11 (src_impl);
|
||||
/* Work around an Xserver bug where non-visible areas from
|
||||
* a pixmap to a window will clear the window background
|
||||
* in destination areas that are supposed to be clipped out.
|
||||
* This is a problem with client side windows as this means
|
||||
* things may draw outside the virtual windows. This could
|
||||
* also happen for window to window copies, but I don't
|
||||
* think we generate any calls like that.
|
||||
*
|
||||
* See:
|
||||
* http://lists.freedesktop.org/archives/xorg/2009-February/043318.html
|
||||
*/
|
||||
if (xsrc < 0)
|
||||
{
|
||||
width += xsrc;
|
||||
xdest -= xsrc;
|
||||
xsrc = 0;
|
||||
}
|
||||
|
||||
if (ysrc < 0)
|
||||
{
|
||||
height += ysrc;
|
||||
ydest -= ysrc;
|
||||
ysrc = 0;
|
||||
}
|
||||
|
||||
if (xsrc + width > src_pixmap->width)
|
||||
width = src_pixmap->width - xsrc;
|
||||
if (ysrc + height > src_pixmap->height)
|
||||
height = src_pixmap->height - ysrc;
|
||||
}
|
||||
|
||||
if (src_depth == 1)
|
||||
{
|
||||
XCopyArea (GDK_SCREEN_XDISPLAY (impl->screen),
|
||||
src_impl->xid,
|
||||
impl->xid,
|
||||
GDK_GC_GET_XGC (gc),
|
||||
xsrc, ysrc,
|
||||
width, height,
|
||||
xdest, ydest);
|
||||
}
|
||||
else if (dest_depth != 0 && src_depth == dest_depth)
|
||||
{
|
||||
XCopyArea (GDK_SCREEN_XDISPLAY (impl->screen),
|
||||
src_impl->xid,
|
||||
impl->xid,
|
||||
GDK_GC_GET_XGC (gc),
|
||||
xsrc, ysrc,
|
||||
width, height,
|
||||
xdest, ydest);
|
||||
}
|
||||
else
|
||||
g_warning ("Attempt to draw a drawable with depth %d to a drawable with depth %d",
|
||||
src_depth, dest_depth);
|
||||
}
|
||||
|
||||
static gint
|
||||
gdk_x11_get_depth (GdkDrawable *drawable)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user