[gtk+/rendering-cleanup: 1/95] API: Remove gdk_draw_pixbuf()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/rendering-cleanup: 1/95] API: Remove gdk_draw_pixbuf()
- Date: Sat, 7 Aug 2010 03:10:58 +0000 (UTC)
commit f0a42c47e0bfd03ce821d48b388a422f81f664cf
Author: Benjamin Otte <otte redhat com>
Date: Mon Jul 12 16:50:00 2010 +0200
API: Remove gdk_draw_pixbuf()
docs/reference/gdk/gdk3-sections.txt | 1 -
gdk/directfb/gdkdrawable-directfb.c | 445 ----------------------------
gdk/gdk.symbols | 1 -
gdk/gdkdraw.c | 526 ----------------------------------
gdk/gdkdrawable.h | 24 --
gdk/gdkoffscreenwindow.c | 36 ---
gdk/gdkpixbuf-render.c | 4 +-
gdk/gdkpixmap.c | 47 +---
gdk/gdkwindow.c | 56 ----
gdk/quartz/gdkdrawable-quartz.c | 59 ----
gdk/win32/gdkdrawable-win32.c | 34 ---
gdk/x11/gdkdrawable-x11.c | 471 ------------------------------
12 files changed, 7 insertions(+), 1697 deletions(-)
---
diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt
index f611c01..c3ff865 100644
--- a/docs/reference/gdk/gdk3-sections.txt
+++ b/docs/reference/gdk/gdk3-sections.txt
@@ -412,7 +412,6 @@ gdk_draw_point
gdk_draw_points
gdk_draw_line
gdk_draw_lines
-gdk_draw_pixbuf
gdk_draw_segments
GdkSegment
gdk_draw_rectangle
diff --git a/gdk/directfb/gdkdrawable-directfb.c b/gdk/directfb/gdkdrawable-directfb.c
index 98047e5..de50d7b 100644
--- a/gdk/directfb/gdkdrawable-directfb.c
+++ b/gdk/directfb/gdkdrawable-directfb.c
@@ -129,19 +129,6 @@ static gboolean accelerated_alpha_blending = FALSE;
static gpointer parent_class = NULL;
static const cairo_user_data_key_t gdk_directfb_cairo_key;
-static void (*real_draw_pixbuf) (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
-
/**********************************************************
* DirectFB specific implementations of generic functions *
@@ -963,438 +950,6 @@ gdk_directfb_draw_image (GdkDrawable *drawable,
temp_region_deinit( &clip );
}
-static void
-composite (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- while (height--)
- {
- gint twidth = width;
- guchar *p = src;
- guchar *q = dest;
-
- while (twidth--)
- {
- guchar a = p[3];
- guint t;
-
- t = a * p[0] + (255 - a) * q[0] + 0x80;
- q[0] = (t + (t >> 8)) >> 8;
- t = a * p[1] + (255 - a) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = a * p[2] + (255 - a) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
-
- p += 4;
- q += 3;
- }
-
- src += src_rowstride;
- dest += dest_rowstride;
- }
-}
-
-static void
-composite_0888 (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- while (height--)
- {
- gint twidth = width;
- guchar *p = src;
- guchar *q = dest;
-
- if (dest_byte_order == GDK_LSB_FIRST)
- {
- while (twidth--)
- {
- guint t;
-
- t = p[3] * p[2] + (255 - p[3]) * q[0] + 0x80;
- q[0] = (t + (t >> 8)) >> 8;
- t = p[3] * p[1] + (255 - p[3]) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = p[3] * p[0] + (255 - p[3]) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
- p += 4;
- q += 4;
- }
- }
- else
- {
- while (twidth--)
- {
- guint t;
-
- t = p[3] * p[0] + (255 - p[3]) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = p[3] * p[1] + (255 - p[3]) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
- t = p[3] * p[2] + (255 - p[3]) * q[3] + 0x80;
- q[3] = (t + (t >> 8)) >> 8;
- p += 4;
- q += 4;
- }
- }
-
- src += src_rowstride;
- dest += dest_rowstride;
- }
-}
-
-/* change the last value to adjust the size of the device (1-4) */
-#define SET_PIXEL_DUFFS_DEVICE( D, S, w ) \
- SET_PIXEL_DUFFS_DEVICE_N( D, S, w, 2 )
-
-/* From DirectFB's gfx/generic/generic.c" */
-#define SET_PIXEL( D, S ) \
- switch (S >> 26) { \
- case 0: \
- break; \
- case 0x3f: \
- D = ((S << 8) & 0xF800) | \
- ((S >> 5) & 0x07E0) | \
- ((S >> 19) & 0x001F); \
- break; \
- default: \
- D = (((( (((S<<8) & 0xf800) | ((S>>19) & 0x001f)) \
- - (D & 0xf81f)) * ((S>>26)+1) + ((D & 0xf81f)<<6)) & 0x003e07c0) \
- + \
- ((( ((S>>5) & 0x07e0) \
- - (D & 0x07e0)) * ((S>>26)+1) + ((D & 0x07e0)<<6)) & 0x0001f800)) >> 6; \
- }
-
-static void
-composite_565 (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height)
-{
- while (height--) {
- int w = width;
- u16 *D = (u16*) dest_buf;
- u32 *S = (u32*) src_buf;
-#if 1
- if ((unsigned long)D & 2) {
- SET_PIXEL( D[0], S[0] );
- w--;
- D++;
- S++;
- }
-
- int i;
- int w2 = w / 2;
- u32 *D32 = (u32*) D;
-
- for (i=0; i<w2; i++) {
- register u32 S0 = S[(i << 1) + 0];
- register u32 S1 = S[(i << 1) + 1];
-
- if ((S0 >> 26) == 0x3f && (S1 >> 26) == 0x3f) {
- D32[i] = ((S0 << 8) & 0x0000F800) |
- ((S0 >> 5) & 0x000007E0) |
- ((S0 >> 19) & 0x0000001F) |
- ((S1 << 24) & 0xF8000000) |
- ((S1 << 11) & 0x07E00000) |
- ((S1 >> 3) & 0x001F0000);
- }
- else {
- SET_PIXEL( D[(i << 1) + 0], S0 );
- SET_PIXEL( D[(i << 1) + 1], S1 );
- }
- }
-
- if (w & 1)
- SET_PIXEL( D[w-1], S[w-1] );
-#else
- SET_PIXEL_DUFFS_DEVICE( D, S, w );
-#endif
-
- dest_buf += dest_rowstride;
- src_buf += src_rowstride;
- }
-}
-
-#undef SET_PIXEL
-#undef SET_PIXEL_DUFFS_DEVICE
-
-static void
-gdk_directfb_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkPixbuf *composited = NULL;
-#if 0
- cairo_region_t *clip;
- cairo_region_t *drect;
- GdkRectangle tmp_rect;
-#endif
- GdkDrawableImplDirectFB *impl = GDK_DRAWABLE_IMPL_DIRECTFB (drawable);
-
- g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
- g_return_if_fail (pixbuf->colorspace == GDK_COLORSPACE_RGB);
- g_return_if_fail (pixbuf->n_channels == 3 || pixbuf->n_channels == 4);
- g_return_if_fail (pixbuf->bits_per_sample == 8);
-
- g_return_if_fail (drawable != NULL);
-
- if (width == -1)
- width = pixbuf->width;
- if (height == -1)
- height = pixbuf->height;
-
- g_return_if_fail (width >= 0 && height >= 0);
- g_return_if_fail (src_x >= 0 && src_x + width <= pixbuf->width);
- g_return_if_fail (src_y >= 0 && src_y + height <= pixbuf->height);
-
- D_DEBUG_AT( GDKDFB_Drawable, "%s( %p, %p, %p, %4d,%4d -> %4d,%4d - %dx%d )\n", G_STRFUNC,
- drawable, gc, pixbuf, src_x, src_y, dest_x, dest_y, width, height );
-
- /* Clip to the drawable; this is required for get_from_drawable() so
- * can't be done implicitly
- */
-
- if (dest_x < 0)
- {
- src_x -= dest_x;
- width += dest_x;
- dest_x = 0;
- }
-
- if (dest_y < 0)
- {
- src_y -= dest_y;
- height += dest_y;
- dest_y = 0;
- }
-
- if ((dest_x + width) > impl->width)
- width = impl->width - dest_x;
-
- if ((dest_y + height) > impl->height)
- height = impl->height - dest_y;
-
- if (width <= 0 || height <= 0)
- return;
-
-#if 0
- /* Clip to the clip region; this avoids getting more
- * image data from the server than we need to.
- */
-
- tmp_rect.x = dest_x;
- tmp_rect.y = dest_y;
- tmp_rect.width = width;
- tmp_rect.height = height;
-
- drect = cairo_region_create_rectangle (&tmp_rect);
- clip = gdk_drawable_get_clip_region (drawable);
-
- cairo_region_intersect (drect, clip);
-
- cairo_region_get_extents (drect, &tmp_rect);
-
- cairo_region_destroy (drect);
- cairo_region_destroy (clip);
-
- if (tmp_rect.width == 0 ||
- tmp_rect.height == 0)
- return;
-#endif
-
- if (pixbuf->has_alpha && impl->format == DSPF_RGB16) {
- void *data;
- int pitch;
-
- if (impl->surface->Lock( impl->surface, DSLF_READ | DSLF_WRITE, &data, &pitch ) == DFB_OK) {
- composite_565( pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4,
- pixbuf->rowstride,
- data + dest_y * pitch + dest_x * 2,
- pitch,
- #if G_BYTE_ORDER == G_BIG_ENDIAN
- GDK_MSB_FIRST,
- #else
- GDK_LSB_FIRST,
- #endif
- width, height );
-
- impl->surface->Unlock( impl->surface );
-
- return;
- }
- }
-
- /* Actually draw */
- if (!gc)
- gc = _gdk_drawable_get_scratch_gc (drawable, FALSE);
-
- if (pixbuf->has_alpha)
- {
- GdkVisual *visual = gdk_drawable_get_visual (drawable);
- void (*composite_func) (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height) = NULL;
-
- /* First we see if we have a visual-specific composition function that can composite
- * the pixbuf data directly onto the image
- */
- if (visual)
- {
- gint bits_per_pixel = _gdk_windowing_get_bits_for_depth (gdk_drawable_get_display (drawable),
- visual->depth);
-
- if (visual->byte_order == (G_BYTE_ORDER == G_BIG_ENDIAN ? GDK_MSB_FIRST : GDK_LSB_FIRST) &&
- visual->depth == 16 &&
- visual->red_mask == 0xf800 &&
- visual->green_mask == 0x07e0 &&
- visual->blue_mask == 0x001f)
- composite_func = composite_565;
- else if (visual->depth == 24 && bits_per_pixel == 32 &&
- visual->red_mask == 0xff0000 &&
- visual->green_mask == 0x00ff00 &&
- visual->blue_mask == 0x0000ff)
- composite_func = composite_0888;
- }
-
- /* We can't use our composite func if we are required to dither
- */
- if (composite_func && !(dither == GDK_RGB_DITHER_MAX && visual->depth != 24))
- {
-#if 0
- gint x0, y0;
- for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
- {
- gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
- for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
- {
- gint xs0, ys0;
-
- gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
-
- GdkImage *image = _gdk_image_get_scratch (gdk_drawable_get_screen (drawable),
- width1, height1,
- gdk_drawable_get_depth (drawable), &xs0, &ys0);
-
- gdk_drawable_copy_to_image (drawable, image,
- dest_x + x0, dest_y + y0,
- xs0, ys0,
- width1, height1);
- (*composite_func) (pixbuf->pixels + (src_y + y0) * pixbuf->rowstride + (src_x + x0) * 4,
- pixbuf->rowstride,
- (guchar*)image->mem + ys0 * image->bpl + xs0 * image->bpp,
- image->bpl,
- visual->byte_order,
- width1, height1);
- gdk_draw_image (drawable, gc, image,
- xs0, ys0,
- dest_x + x0, dest_y + y0,
- width1, height1);
- }
- }
-#else
- void *data;
- int pitch;
-
- if (impl->surface->Lock( impl->surface, DSLF_READ | DSLF_WRITE, &data, &pitch ) == DFB_OK) {
- (*composite_func) (pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4,
- pixbuf->rowstride,
- data + dest_y * pitch + DFB_BYTES_PER_LINE( impl->format, dest_x ),
- pitch,
- visual->byte_order,
- width, height);
-
- impl->surface->Unlock( impl->surface );
- }
-#endif
- goto out;
- }
- else
- {
- /* No special composition func, convert dest to 24 bit RGB data, composite against
- * that, and convert back.
- */
- composited = gdk_pixbuf_get_from_drawable (NULL,
- drawable,
- NULL,
- dest_x, dest_y,
- 0, 0,
- width, height);
-
- if (composited)
- composite (pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4,
- pixbuf->rowstride,
- composited->pixels,
- composited->rowstride,
- width, height);
- }
- }
-
- if (composited)
- {
- src_x = 0;
- src_y = 0;
- pixbuf = composited;
- }
-
- if (pixbuf->n_channels == 4)
- {
- guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 4;
-
- gdk_draw_rgb_32_image_dithalign (drawable, gc,
- dest_x, dest_y,
- width, height,
- dither,
- buf, pixbuf->rowstride,
- x_dither, y_dither);
- }
- else /* n_channels == 3 */
- {
- guchar *buf = pixbuf->pixels + src_y * pixbuf->rowstride + src_x * 3;
-
- gdk_draw_rgb_image_dithalign (drawable, gc,
- dest_x, dest_y,
- width, height,
- dither,
- buf, pixbuf->rowstride,
- x_dither, y_dither);
- }
-
- out:
- if (composited)
- g_object_unref (composited);
-}
-
static inline void
convert_rgba_pixbuf_to_image (guint32 *src,
guint src_pitch,
diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols
index 3e02b91..dfeddbd 100644
--- a/gdk/gdk.symbols
+++ b/gdk/gdk.symbols
@@ -559,7 +559,6 @@ gdk_draw_glyphs_transformed
gdk_draw_image
gdk_draw_line
gdk_draw_lines
-gdk_draw_pixbuf
gdk_draw_point
gdk_draw_points
gdk_draw_polygon
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c
index 8dc1214..cc584f8 100644
--- a/gdk/gdkdraw.c
+++ b/gdk/gdkdraw.c
@@ -49,18 +49,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_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
static void gdk_drawable_real_draw_drawable (GdkDrawable *drawable,
GdkGC *gc,
GdkDrawable *src,
@@ -82,7 +70,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_pixbuf = gdk_drawable_real_draw_pixbuf;
klass->draw_drawable = gdk_drawable_real_draw_drawable;
}
@@ -552,71 +539,6 @@ gdk_draw_image (GdkDrawable *drawable,
}
/**
- * gdk_draw_pixbuf:
- * @drawable: Destination drawable.
- * @gc: (allow-none): a #GdkGC, used for clipping, or %NULL
- * @pixbuf: a #GdkPixbuf
- * @src_x: Source X coordinate within pixbuf.
- * @src_y: Source Y coordinates within pixbuf.
- * @dest_x: Destination X coordinate within drawable.
- * @dest_y: Destination Y coordinate within drawable.
- * @width: Width of region to render, in pixels, or -1 to use pixbuf width.
- * @height: Height of region to render, in pixels, or -1 to use pixbuf height.
- * @dither: Dithering mode for #GdkRGB.
- * @x_dither: X offset for dither.
- * @y_dither: Y offset for dither.
- *
- * Renders a rectangular portion of a pixbuf to a drawable. The destination
- * drawable must have a colormap. All windows have a colormap, however, pixmaps
- * only have colormap by default if they were created with a non-%NULL window
- * argument. Otherwise a colormap must be set on them with
- * gdk_drawable_set_colormap().
- *
- * On older X servers, rendering pixbufs with an alpha channel involves round
- * trips to the X server, and may be somewhat slow.
- *
- * If GDK is built with the Sun mediaLib library, the gdk_draw_pixbuf
- * function is accelerated using mediaLib, which provides hardware
- * acceleration on Intel, AMD, and Sparc chipsets. If desired, mediaLib
- * support can be turned off by setting the GDK_DISABLE_MEDIALIB environment
- * variable.
- *
- * Since: 2.2
- **/
-void
-gdk_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- const GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- g_return_if_fail (GDK_IS_DRAWABLE (drawable));
- g_return_if_fail (gc == NULL || GDK_IS_GC (gc));
- g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
-
- if (width == 0 || height == 0)
- return;
-
- if (width == -1)
- width = gdk_pixbuf_get_width (pixbuf);
- if (height == -1)
- height = gdk_pixbuf_get_height (pixbuf);
-
- GDK_DRAWABLE_GET_CLASS (drawable)->draw_pixbuf (drawable, gc,
- (GdkPixbuf *) pixbuf,
- src_x, src_y, dest_x, dest_y,
- width, height,
- dither, x_dither, y_dither);
-}
-
-/**
* gdk_draw_points:
* @drawable: a #GdkDrawable (a #GdkWindow or a #GdkPixmap).
* @gc: a #GdkGC.
@@ -1121,214 +1043,6 @@ _gdk_drawable_ref_cairo_surface (GdkDrawable *drawable)
return GDK_DRAWABLE_GET_CLASS (drawable)->ref_cairo_surface (drawable);
}
-static void
-composite (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- while (height--)
- {
- gint twidth = width;
- guchar *p = src;
- guchar *q = dest;
-
- while (twidth--)
- {
- guchar a = p[3];
- guint t;
-
- t = a * p[0] + (255 - a) * q[0] + 0x80;
- q[0] = (t + (t >> 8)) >> 8;
- t = a * p[1] + (255 - a) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = a * p[2] + (255 - a) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
-
- p += 4;
- q += 3;
- }
-
- src += src_rowstride;
- dest += dest_rowstride;
- }
-}
-
-static void
-composite_0888 (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- while (height--)
- {
- gint twidth = width;
- guchar *p = src;
- guchar *q = dest;
-
- if (dest_byte_order == GDK_LSB_FIRST)
- {
- while (twidth--)
- {
- guint t;
-
- t = p[3] * p[2] + (255 - p[3]) * q[0] + 0x80;
- q[0] = (t + (t >> 8)) >> 8;
- t = p[3] * p[1] + (255 - p[3]) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = p[3] * p[0] + (255 - p[3]) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
- p += 4;
- q += 4;
- }
- }
- else
- {
- while (twidth--)
- {
- guint t;
-
- t = p[3] * p[0] + (255 - p[3]) * q[1] + 0x80;
- q[1] = (t + (t >> 8)) >> 8;
- t = p[3] * p[1] + (255 - p[3]) * q[2] + 0x80;
- q[2] = (t + (t >> 8)) >> 8;
- t = p[3] * p[2] + (255 - p[3]) * q[3] + 0x80;
- q[3] = (t + (t >> 8)) >> 8;
- p += 4;
- q += 4;
- }
- }
-
- src += src_rowstride;
- dest += dest_rowstride;
- }
-}
-
-#ifdef USE_MEDIALIB
-static void
-composite_0888_medialib (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- mlib_image img_src, img_dst;
-
- mlib_ImageSetStruct (&img_dst,
- MLIB_BYTE,
- 4,
- width,
- height,
- dest_rowstride,
- dest_buf);
-
- mlib_ImageSetStruct (&img_src,
- MLIB_BYTE,
- 4,
- width,
- height,
- src_rowstride,
- src_buf);
-
- if (dest_byte_order == GDK_LSB_FIRST)
- mlib_ImageBlendRGBA2BGRA (&img_dst, &img_src);
- else
- mlib_ImageBlendRGBA2ARGB (&img_dst, &img_src);
-}
-#endif
-
-static void
-composite_565 (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height)
-{
- guchar *src = src_buf;
- guchar *dest = dest_buf;
-
- while (height--)
- {
- gint twidth = width;
- guchar *p = src;
- gushort *q = (gushort *)dest;
-
- while (twidth--)
- {
- guchar a = p[3];
- guint tr, tg, tb;
- guint tr1, tg1, tb1;
- guint tmp = *q;
-
-#if 1
- /* This is fast, and corresponds to what composite() above does
- * if we converted to 8-bit first.
- */
- tr = (tmp & 0xf800);
- tr1 = a * p[0] + (255 - a) * ((tr >> 8) + (tr >> 13)) + 0x80;
- tg = (tmp & 0x07e0);
- tg1 = a * p[1] + (255 - a) * ((tg >> 3) + (tg >> 9)) + 0x80;
- tb = (tmp & 0x001f);
- tb1 = a * p[2] + (255 - a) * ((tb << 3) + (tb >> 2)) + 0x80;
-
- *q = (((tr1 + (tr1 >> 8)) & 0xf800) |
- (((tg1 + (tg1 >> 8)) & 0xfc00) >> 5) |
- ((tb1 + (tb1 >> 8)) >> 11));
-#else
- /* This version correspond to the result we get with XRENDER -
- * a bit of precision is lost since we convert to 8 bit after premultiplying
- * instead of at the end
- */
- guint tr2, tg2, tb2;
- guint tr3, tg3, tb3;
-
- tr = (tmp & 0xf800);
- tr1 = (255 - a) * ((tr >> 8) + (tr >> 13)) + 0x80;
- tr2 = a * p[0] + 0x80;
- tr3 = ((tr1 + (tr1 >> 8)) >> 8) + ((tr2 + (tr2 >> 8)) >> 8);
-
- tg = (tmp & 0x07e0);
- tg1 = (255 - a) * ((tg >> 3) + (tg >> 9)) + 0x80;
- tg2 = a * p[0] + 0x80;
- tg3 = ((tg1 + (tg1 >> 8)) >> 8) + ((tg2 + (tg2 >> 8)) >> 8);
-
- tb = (tmp & 0x001f);
- tb1 = (255 - a) * ((tb << 3) + (tb >> 2)) + 0x80;
- tb2 = a * p[0] + 0x80;
- tb3 = ((tb1 + (tb1 >> 8)) >> 8) + ((tb2 + (tb2 >> 8)) >> 8);
-
- *q = (((tr3 & 0xf8) << 8) |
- ((tg3 & 0xfc) << 3) |
- ((tb3 >> 3)));
-#endif
-
- p += 4;
- q++;
- }
-
- src += src_rowstride;
- dest += dest_rowstride;
- }
-}
-
/* Implementation of the old vfunc in terms of the new one
in case someone calls it directly (which they shouldn't!) */
static void
@@ -1354,246 +1068,6 @@ gdk_drawable_real_draw_drawable (GdkDrawable *drawable,
src);
}
-static void
-gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkPixbuf *composited = NULL;
- gint dwidth, dheight;
- cairo_region_t *clip;
- cairo_region_t *drect;
- GdkRectangle tmp_rect;
- GdkDrawable *real_drawable;
-
- g_return_if_fail (GDK_IS_PIXBUF (pixbuf));
- g_return_if_fail (gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB);
- g_return_if_fail (gdk_pixbuf_get_n_channels (pixbuf) == 3 ||
- gdk_pixbuf_get_n_channels (pixbuf) == 4);
- g_return_if_fail (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
-
- g_return_if_fail (drawable != NULL);
-
- if (width == -1)
- width = gdk_pixbuf_get_width (pixbuf);
- if (height == -1)
- height = gdk_pixbuf_get_height (pixbuf);
-
- g_return_if_fail (width >= 0 && height >= 0);
- g_return_if_fail (src_x >= 0 && src_x + width <= gdk_pixbuf_get_width (pixbuf));
- g_return_if_fail (src_y >= 0 && src_y + height <= gdk_pixbuf_get_height (pixbuf));
-
- /* Clip to the drawable; this is required for get_from_drawable() so
- * can't be done implicitly
- */
-
- if (dest_x < 0)
- {
- src_x -= dest_x;
- width += dest_x;
- dest_x = 0;
- }
-
- if (dest_y < 0)
- {
- src_y -= dest_y;
- height += dest_y;
- dest_y = 0;
- }
-
- gdk_drawable_get_size (drawable, &dwidth, &dheight);
-
- if ((dest_x + width) > dwidth)
- width = dwidth - dest_x;
-
- if ((dest_y + height) > dheight)
- height = dheight - dest_y;
-
- if (width <= 0 || height <= 0)
- return;
-
- /* Clip to the clip region; this avoids getting more
- * image data from the server than we need to.
- */
-
- tmp_rect.x = dest_x;
- tmp_rect.y = dest_y;
- tmp_rect.width = width;
- tmp_rect.height = height;
-
- drect = cairo_region_create_rectangle (&tmp_rect);
- clip = gdk_drawable_get_clip_region (drawable);
-
- cairo_region_intersect (drect, clip);
-
- cairo_region_get_extents (drect, &tmp_rect);
-
- cairo_region_destroy (drect);
- cairo_region_destroy (clip);
-
- if (tmp_rect.width == 0 ||
- tmp_rect.height == 0)
- return;
-
- /* Actually draw */
- if (!gc)
- gc = _gdk_drawable_get_scratch_gc (drawable, FALSE);
-
- /* Drawable is a wrapper here, but at this time we
- have already retargeted the destination to any
- impl window and set the clip, so what we really
- want to do is draw directly on the impl, ignoring
- client side subwindows. We also use the impl
- in the pixmap target case to avoid resetting the
- already set clip on the GC. */
- if (GDK_IS_WINDOW (drawable))
- real_drawable = GDK_WINDOW_OBJECT (drawable)->impl;
- else
- real_drawable = GDK_PIXMAP_OBJECT (drawable)->impl;
-
- if (gdk_pixbuf_get_has_alpha (pixbuf))
- {
- GdkVisual *visual = gdk_drawable_get_visual (drawable);
- void (*composite_func) (guchar *src_buf,
- gint src_rowstride,
- guchar *dest_buf,
- gint dest_rowstride,
- GdkByteOrder dest_byte_order,
- gint width,
- gint height) = NULL;
-
- /* First we see if we have a visual-specific composition function that can composite
- * the pixbuf data directly onto the image
- */
- if (visual)
- {
- gint bits_per_pixel = _gdk_windowing_get_bits_for_depth (gdk_drawable_get_display (drawable),
- visual->depth);
-
- if (visual->byte_order == (G_BYTE_ORDER == G_BIG_ENDIAN ? GDK_MSB_FIRST : GDK_LSB_FIRST) &&
- visual->depth == 16 &&
- visual->red_mask == 0xf800 &&
- visual->green_mask == 0x07e0 &&
- visual->blue_mask == 0x001f)
- composite_func = composite_565;
- else if (visual->depth == 24 && bits_per_pixel == 32 &&
- visual->red_mask == 0xff0000 &&
- visual->green_mask == 0x00ff00 &&
- visual->blue_mask == 0x0000ff)
- {
-#ifdef USE_MEDIALIB
- if (_gdk_use_medialib ())
- composite_func = composite_0888_medialib;
- else
- composite_func = composite_0888;
-#else
- composite_func = composite_0888;
-#endif
- }
- }
-
- /* We can't use our composite func if we are required to dither
- */
- if (composite_func && !(dither == GDK_RGB_DITHER_MAX && visual->depth != 24))
- {
- gint x0, y0;
- for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
- {
- gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
- for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
- {
- gint xs0, ys0;
-
- gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
-
- GdkImage *image = _gdk_image_get_scratch (gdk_drawable_get_screen (drawable),
- width1, height1,
- gdk_drawable_get_depth (drawable), &xs0, &ys0);
-
- gdk_drawable_copy_to_image (drawable, image,
- dest_x + x0, dest_y + y0,
- xs0, ys0,
- width1, height1);
- (*composite_func) (gdk_pixbuf_get_pixels (pixbuf) + (src_y + y0) * gdk_pixbuf_get_rowstride (pixbuf) + (src_x + x0) * 4,
- gdk_pixbuf_get_rowstride (pixbuf),
- (guchar*)image->mem + ys0 * image->bpl + xs0 * image->bpp,
- image->bpl,
- visual->byte_order,
- width1, height1);
- gdk_draw_image (real_drawable, gc, image,
- xs0, ys0,
- dest_x + x0, dest_y + y0,
- width1, height1);
- }
- }
-
- goto out;
- }
- else
- {
- /* No special composition func, convert dest to 24 bit RGB data, composite against
- * that, and convert back.
- */
- composited = gdk_pixbuf_get_from_drawable (NULL,
- drawable,
- NULL,
- dest_x, dest_y,
- 0, 0,
- width, height);
-
- if (composited)
- composite (gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 4,
- gdk_pixbuf_get_rowstride (pixbuf),
- gdk_pixbuf_get_pixels (composited),
- gdk_pixbuf_get_rowstride (composited),
- width, height);
- }
- }
-
- if (composited)
- {
- src_x = 0;
- src_y = 0;
- pixbuf = composited;
- }
-
- if (gdk_pixbuf_get_n_channels (pixbuf) == 4)
- {
- guchar *buf = gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 4;
-
- gdk_draw_rgb_32_image_dithalign (real_drawable, gc,
- dest_x, dest_y,
- width, height,
- dither,
- buf, gdk_pixbuf_get_rowstride (pixbuf),
- x_dither, y_dither);
- }
- else /* n_channels == 3 */
- {
- guchar *buf = gdk_pixbuf_get_pixels (pixbuf) + src_y * gdk_pixbuf_get_rowstride (pixbuf) + src_x * 3;
-
- gdk_draw_rgb_image_dithalign (real_drawable, gc,
- dest_x, dest_y,
- width, height,
- dither,
- buf, gdk_pixbuf_get_rowstride (pixbuf),
- x_dither, y_dither);
- }
-
- out:
- if (composited)
- g_object_unref (composited);
-}
-
/************************************************************************/
/**
diff --git a/gdk/gdkdrawable.h b/gdk/gdkdrawable.h
index 5eb5f45..ad708f9 100644
--- a/gdk/gdkdrawable.h
+++ b/gdk/gdkdrawable.h
@@ -151,18 +151,6 @@ struct _GdkDrawableClass
gint *composite_x_offset,
gint *composite_y_offset);
- void (*draw_pixbuf) (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
GdkImage* (*_copy_to_image) (GdkDrawable *drawable,
GdkImage *image,
gint src_x,
@@ -300,18 +288,6 @@ void gdk_draw_lines (GdkDrawable *drawable,
GdkGC *gc,
const GdkPoint *points,
gint n_points);
-void gdk_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- const GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
void gdk_draw_glyphs (GdkDrawable *drawable,
GdkGC *gc,
diff --git a/gdk/gdkoffscreenwindow.c b/gdk/gdkoffscreenwindow.c
index 10bba66..faf3c4b 100644
--- a/gdk/gdkoffscreenwindow.c
+++ b/gdk/gdkoffscreenwindow.c
@@ -531,41 +531,6 @@ gdk_offscreen_window_draw_image (GdkDrawable *drawable,
add_damage (offscreen, xdest, ydest, width, height, FALSE);
}
-
-static void
-gdk_offscreen_window_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
- GdkDrawable *real_drawable = get_real_drawable (offscreen);
-
- gdk_draw_pixbuf (real_drawable,
- gc,
- pixbuf,
- src_x,
- src_y,
- dest_x,
- dest_y,
- width,
- height,
- dither,
- x_dither,
- y_dither);
-
- add_damage (offscreen, dest_x, dest_y, width, height, FALSE);
-
-}
-
void
_gdk_offscreen_window_new (GdkWindow *window,
GdkScreen *screen,
@@ -1199,7 +1164,6 @@ gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
drawable_class->draw_segments = gdk_offscreen_window_draw_segments;
drawable_class->draw_lines = gdk_offscreen_window_draw_lines;
drawable_class->draw_image = gdk_offscreen_window_draw_image;
- drawable_class->draw_pixbuf = gdk_offscreen_window_draw_pixbuf;
}
static void
diff --git a/gdk/gdkpixbuf-render.c b/gdk/gdkpixbuf-render.c
index c8fa635..0365691 100644
--- a/gdk/gdkpixbuf-render.c
+++ b/gdk/gdkpixbuf-render.c
@@ -158,7 +158,7 @@ gdk_pixbuf_render_threshold_alpha (GdkPixbuf *pixbuf,
* and @mask_return arguments, respectively, and renders a pixbuf and its
* corresponding thresholded alpha mask to them. This is merely a convenience
* function; applications that need to render pixbufs with dither offsets or to
- * given drawables should use gdk_draw_pixbuf() and gdk_pixbuf_render_threshold_alpha().
+ * given drawables should use Cairo and gdk_pixbuf_render_threshold_alpha().
*
* The pixmap that is created is created for the colormap returned
* by gdk_colormap_get_system(). You normally will want to instead use
@@ -219,7 +219,7 @@ remove_alpha_channel (GdkPixbuf *pixbuf)
* and @mask_return arguments, respectively, and renders a pixbuf and its
* corresponding tresholded alpha mask to them. This is merely a convenience
* function; applications that need to render pixbufs with dither offsets or to
- * given drawables should use gdk_draw_pixbuf(), and gdk_pixbuf_render_threshold_alpha().
+ * given drawables should use Cairo and gdk_pixbuf_render_threshold_alpha().
*
* The pixmap that is created uses the #GdkColormap specified by @colormap.
* This colormap must match the colormap of the window where the pixmap
diff --git a/gdk/gdkpixmap.c b/gdk/gdkpixmap.c
index a6a68e8..f71152a 100644
--- a/gdk/gdkpixmap.c
+++ b/gdk/gdkpixmap.c
@@ -101,18 +101,6 @@ static void gdk_pixmap_draw_image (GdkDrawable *drawable,
gint ydest,
gint width,
gint height);
-static void gdk_pixmap_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
static void gdk_pixmap_draw_trapezoids (GdkDrawable *drawable,
GdkGC *gc,
GdkTrapezoid *trapezoids,
@@ -194,7 +182,6 @@ gdk_pixmap_class_init (GdkPixmapObjectClass *klass)
drawable_class->draw_glyphs = gdk_pixmap_draw_glyphs;
drawable_class->draw_glyphs_transformed = gdk_pixmap_draw_glyphs_transformed;
drawable_class->draw_image = gdk_pixmap_draw_image;
- drawable_class->draw_pixbuf = gdk_pixmap_draw_pixbuf;
drawable_class->draw_trapezoids = gdk_pixmap_draw_trapezoids;
drawable_class->get_depth = gdk_pixmap_real_get_depth;
drawable_class->get_screen = gdk_pixmap_real_get_screen;
@@ -431,29 +418,6 @@ gdk_pixmap_draw_image (GdkDrawable *drawable,
}
static void
-gdk_pixmap_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkPixmapObject *private = (GdkPixmapObject *)drawable;
-
- if (gc)
- _gdk_gc_remove_drawable_clip (gc);
- gdk_draw_pixbuf (private->impl, gc, pixbuf,
- src_x, src_y, dest_x, dest_y, width, height,
- dither, x_dither, y_dither);
-}
-
-static void
gdk_pixmap_draw_trapezoids (GdkDrawable *drawable,
GdkGC *gc,
GdkTrapezoid *trapezoids,
@@ -579,7 +543,7 @@ gdk_pixmap_colormap_new_from_pixbuf (GdkColormap *colormap,
{
GdkPixmap *pixmap;
GdkPixbuf *render_pixbuf;
- GdkGC *tmp_gc;
+ cairo_t *cr;
GdkScreen *screen = gdk_colormap_get_screen (colormap);
pixmap = gdk_pixmap_new (gdk_screen_get_root_window (screen),
@@ -600,11 +564,10 @@ gdk_pixmap_colormap_new_from_pixbuf (GdkColormap *colormap,
else
render_pixbuf = pixbuf;
- tmp_gc = _gdk_drawable_get_scratch_gc (pixmap, FALSE);
- gdk_draw_pixbuf (pixmap, tmp_gc, render_pixbuf, 0, 0, 0, 0,
- gdk_pixbuf_get_width (render_pixbuf),
- gdk_pixbuf_get_height (render_pixbuf),
- GDK_RGB_DITHER_NORMAL, 0, 0);
+ cr = gdk_cairo_create (pixmap);
+ gdk_cairo_set_source_pixbuf (cr, render_pixbuf, 0, 0);
+ cairo_paint (cr);
+ cairo_destroy (cr);
if (render_pixbuf != pixbuf)
g_object_unref (render_pixbuf);
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index a14972e..68bb363 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -297,19 +297,6 @@ static void gdk_window_draw_image (GdkDrawable *drawable,
gint width,
gint height);
-static void gdk_window_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
-
static void gdk_window_draw_trapezoids (GdkDrawable *drawable,
GdkGC *gc,
GdkTrapezoid *trapezoids,
@@ -511,7 +498,6 @@ gdk_window_class_init (GdkWindowObjectClass *klass)
drawable_class->draw_glyphs = gdk_window_draw_glyphs;
drawable_class->draw_glyphs_transformed = gdk_window_draw_glyphs_transformed;
drawable_class->draw_image = gdk_window_draw_image;
- drawable_class->draw_pixbuf = gdk_window_draw_pixbuf;
drawable_class->draw_trapezoids = gdk_window_draw_trapezoids;
drawable_class->get_depth = gdk_window_real_get_depth;
drawable_class->get_screen = gdk_window_real_get_screen;
@@ -4850,48 +4836,6 @@ gdk_window_draw_image (GdkDrawable *drawable,
}
static void
-gdk_window_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkWindowObject *private = (GdkWindowObject *)drawable;
- GdkDrawableClass *klass;
-
- if (GDK_WINDOW_DESTROYED (drawable))
- return;
-
- /* If no gc => no user clipping, but we need clipping
- for window emulation, so use a scratch gc */
- if (!gc)
- gc = _gdk_drawable_get_scratch_gc (drawable, FALSE);
-
- BEGIN_DRAW;
-
- klass = GDK_DRAWABLE_GET_CLASS (impl);
-
- if (private->paint_stack)
- klass->draw_pixbuf (impl, gc, pixbuf, src_x, src_y,
- dest_x - x_offset, dest_y - y_offset,
- width, height,
- dither, x_dither - x_offset, y_dither - y_offset);
- else
- klass->draw_pixbuf (impl, gc, pixbuf, src_x, src_y,
- dest_x - x_offset, dest_y - y_offset,
- width, height,
- dither, x_dither, y_dither);
- END_DRAW;
-}
-
-static void
gdk_window_draw_trapezoids (GdkDrawable *drawable,
GdkGC *gc,
GdkTrapezoid *trapezoids,
diff --git a/gdk/quartz/gdkdrawable-quartz.c b/gdk/quartz/gdkdrawable-quartz.c
index 918e4bc..a8fdd63 100644
--- a/gdk/quartz/gdkdrawable-quartz.c
+++ b/gdk/quartz/gdkdrawable-quartz.c
@@ -507,64 +507,6 @@ gdk_quartz_draw_lines (GdkDrawable *drawable,
}
static void
-gdk_quartz_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- CGContextRef context = gdk_quartz_drawable_get_context (drawable, FALSE);
- CGColorSpaceRef colorspace;
- CGDataProviderRef data_provider;
- CGImageRef image;
- void *data;
- int rowstride, pixbuf_width, pixbuf_height;
- gboolean has_alpha;
-
- if (!context)
- return;
-
- pixbuf_width = gdk_pixbuf_get_width (pixbuf);
- pixbuf_height = gdk_pixbuf_get_height (pixbuf);
- rowstride = gdk_pixbuf_get_rowstride (pixbuf);
- has_alpha = gdk_pixbuf_get_has_alpha (pixbuf);
-
- data = gdk_pixbuf_get_pixels (pixbuf);
-
- colorspace = CGColorSpaceCreateDeviceRGB ();
- data_provider = CGDataProviderCreateWithData (NULL, data, pixbuf_height * rowstride, NULL);
-
- image = CGImageCreate (pixbuf_width, pixbuf_height, 8,
- has_alpha ? 32 : 24, rowstride,
- colorspace,
- has_alpha ? kCGImageAlphaLast : 0,
- data_provider, NULL, FALSE,
- kCGRenderingIntentDefault);
-
- CGDataProviderRelease (data_provider);
- CGColorSpaceRelease (colorspace);
-
- _gdk_quartz_gc_update_cg_context (gc, drawable, context,
- GDK_QUARTZ_CONTEXT_STROKE);
-
- CGContextClipToRect (context, CGRectMake (dest_x, dest_y, width, height));
- CGContextTranslateCTM (context, dest_x - src_x, dest_y - src_y + pixbuf_height);
- CGContextScaleCTM (context, 1, -1);
-
- CGContextDrawImage (context, CGRectMake (0, 0, pixbuf_width, pixbuf_height), image);
- CGImageRelease (image);
-
- gdk_quartz_drawable_release_context (drawable, context);
-}
-
-static void
gdk_quartz_draw_image (GdkDrawable *drawable,
GdkGC *gc,
GdkImage *image,
@@ -640,7 +582,6 @@ gdk_drawable_impl_quartz_class_init (GdkDrawableImplQuartzClass *klass)
drawable_class->draw_segments = gdk_quartz_draw_segments;
drawable_class->draw_lines = gdk_quartz_draw_lines;
drawable_class->draw_image = gdk_quartz_draw_image;
- drawable_class->draw_pixbuf = gdk_quartz_draw_pixbuf;
drawable_class->ref_cairo_surface = gdk_quartz_ref_cairo_surface;
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c
index 19bb89a..78c7152 100644
--- a/gdk/win32/gdkdrawable-win32.c
+++ b/gdk/win32/gdkdrawable-win32.c
@@ -100,18 +100,6 @@ static void gdk_win32_draw_image (GdkDrawable *drawable,
gint ydest,
gint width,
gint height);
-static void gdk_win32_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
static cairo_surface_t *gdk_win32_ref_cairo_surface (GdkDrawable *drawable);
@@ -150,7 +138,6 @@ _gdk_drawable_impl_win32_class_init (GdkDrawableImplWin32Class *klass)
drawable_class->draw_segments = gdk_win32_draw_segments;
drawable_class->draw_lines = gdk_win32_draw_lines;
drawable_class->draw_image = gdk_win32_draw_image;
- drawable_class->draw_pixbuf = gdk_win32_draw_pixbuf;
drawable_class->ref_cairo_surface = gdk_win32_ref_cairo_surface;
@@ -1634,27 +1621,6 @@ gdk_win32_draw_image (GdkDrawable *drawable,
xsrc, ysrc, xdest, ydest, width, height);
}
-static void
-gdk_win32_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_WIN32 (drawable)->wrapper;
- GDK_DRAWABLE_CLASS (_gdk_drawable_impl_win32_parent_class)->draw_pixbuf (wrapper, gc, pixbuf,
- src_x, src_y, dest_x, dest_y,
- width, height,
- dither, x_dither, y_dither);
-}
-
/**
* _gdk_win32_drawable_acquire_dc
* @drawable: a Win32 #GdkDrawable implementation
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c
index e48d8df..95aebf9 100644
--- a/gdk/x11/gdkdrawable-x11.c
+++ b/gdk/x11/gdkdrawable-x11.c
@@ -101,18 +101,6 @@ static void gdk_x11_draw_image (GdkDrawable *drawable,
gint ydest,
gint width,
gint height);
-static void gdk_x11_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither);
static cairo_surface_t *gdk_x11_ref_cairo_surface (GdkDrawable *drawable);
@@ -147,7 +135,6 @@ _gdk_drawable_impl_x11_class_init (GdkDrawableImplX11Class *klass)
drawable_class->draw_segments = gdk_x11_draw_segments;
drawable_class->draw_lines = gdk_x11_draw_lines;
drawable_class->draw_image = gdk_x11_draw_image;
- drawable_class->draw_pixbuf = gdk_x11_draw_pixbuf;
drawable_class->ref_cairo_surface = gdk_x11_ref_cairo_surface;
@@ -310,79 +297,6 @@ _gdk_x11_have_render (GdkDisplay *display)
return x11display->have_render == GDK_YES;
}
-static Picture
-gdk_x11_drawable_get_picture (GdkDrawable *drawable)
-{
- GdkDrawableImplX11 *impl = GDK_DRAWABLE_IMPL_X11 (drawable);
-
- if (!impl->picture)
- {
- Display *xdisplay = GDK_SCREEN_XDISPLAY (impl->screen);
- XRenderPictFormat *format;
-
- GdkVisual *visual = gdk_drawable_get_visual (GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper);
- if (!visual)
- return None;
-
- format = XRenderFindVisualFormat (xdisplay, GDK_VISUAL_XVISUAL (visual));
- if (format)
- {
- XRenderPictureAttributes attributes;
- attributes.graphics_exposures = False;
-
- impl->picture = XRenderCreatePicture (xdisplay, impl->xid, format,
- CPGraphicsExposure, &attributes);
- }
- }
-
- return impl->picture;
-}
-
-static void
-gdk_x11_drawable_update_picture_clip (GdkDrawable *drawable,
- GdkGC *gc)
-{
- GdkDrawableImplX11 *impl = GDK_DRAWABLE_IMPL_X11 (drawable);
- Display *xdisplay = GDK_SCREEN_XDISPLAY (impl->screen);
- Picture picture = gdk_x11_drawable_get_picture (drawable);
- cairo_region_t *clip_region = gc ? _gdk_gc_get_clip_region (gc) : NULL;
-
- if (clip_region)
- {
- XRectangle *rects;
- int n_rects;
-
- _gdk_region_get_xrectangles (clip_region,
- gc->clip_x_origin,
- gc->clip_y_origin,
- &rects,
- &n_rects);
- XRenderSetPictureClipRectangles (xdisplay, picture,
- 0, 0, rects, n_rects);
- g_free (rects);
- }
- else
- {
- XRenderPictureAttributes pa;
- GdkBitmap *mask;
- gulong pa_mask;
-
- pa_mask = CPClipMask;
- if (gc && (mask = _gdk_gc_get_clip_mask (gc)))
- {
- pa.clip_mask = GDK_PIXMAP_XID (mask);
- pa.clip_x_origin = gc->clip_x_origin;
- pa.clip_y_origin = gc->clip_y_origin;
- pa_mask |= CPClipXOrigin | CPClipYOrigin;
- }
- else
- pa.clip_mask = None;
-
- XRenderChangePicture (xdisplay, picture,
- pa_mask, &pa);
- }
-}
-
/*****************************************************
* X11 specific implementations of generic functions *
*****************************************************/
@@ -846,137 +760,6 @@ gdk_x11_pixmap_get_drawable_impl (GdkPixmap *pixmap)
return ((GdkPixmapObject *)pixmap)->impl;
}
-/* Code for accelerated alpha compositing using the RENDER extension.
- * It's a bit long because there are lots of possibilities for
- * what's the fastest depending on the available picture formats,
- * whether we can used shared pixmaps, etc.
- */
-
-static GdkX11FormatType
-select_format (GdkDisplay *display,
- XRenderPictFormat **format,
- XRenderPictFormat **mask)
-{
- Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
- XRenderPictFormat pf;
-
- if (!_gdk_x11_have_render (display))
- return GDK_X11_FORMAT_NONE;
-
- /* Look for a 32-bit xRGB and Axxx formats that exactly match the
- * in memory data format. We can use them as pixmap and mask
- * to deal with non-premultiplied data.
- */
-
- pf.type = PictTypeDirect;
- pf.depth = 32;
- pf.direct.redMask = 0xff;
- pf.direct.greenMask = 0xff;
- pf.direct.blueMask = 0xff;
-
- pf.direct.alphaMask = 0;
- if (ImageByteOrder (xdisplay) == LSBFirst)
- {
- /* ABGR */
- pf.direct.red = 0;
- pf.direct.green = 8;
- pf.direct.blue = 16;
- }
- else
- {
- /* RGBA */
- pf.direct.red = 24;
- pf.direct.green = 16;
- pf.direct.blue = 8;
- }
-
- *format = XRenderFindFormat (xdisplay,
- (PictFormatType | PictFormatDepth |
- PictFormatRedMask | PictFormatRed |
- PictFormatGreenMask | PictFormatGreen |
- PictFormatBlueMask | PictFormatBlue |
- PictFormatAlphaMask),
- &pf,
- 0);
-
- pf.direct.alphaMask = 0xff;
- if (ImageByteOrder (xdisplay) == LSBFirst)
- {
- /* ABGR */
- pf.direct.alpha = 24;
- }
- else
- {
- pf.direct.alpha = 0;
- }
-
- *mask = XRenderFindFormat (xdisplay,
- (PictFormatType | PictFormatDepth |
- PictFormatAlphaMask | PictFormatAlpha),
- &pf,
- 0);
-
- if (*format && *mask)
- return GDK_X11_FORMAT_EXACT_MASK;
-
- /* OK, that failed, now look for xRGB and Axxx formats in
- * RENDER's preferred order
- */
- pf.direct.alphaMask = 0;
- /* ARGB */
- pf.direct.red = 16;
- pf.direct.green = 8;
- pf.direct.blue = 0;
-
- *format = XRenderFindFormat (xdisplay,
- (PictFormatType | PictFormatDepth |
- PictFormatRedMask | PictFormatRed |
- PictFormatGreenMask | PictFormatGreen |
- PictFormatBlueMask | PictFormatBlue |
- PictFormatAlphaMask),
- &pf,
- 0);
-
- pf.direct.alphaMask = 0xff;
- pf.direct.alpha = 24;
-
- *mask = XRenderFindFormat (xdisplay,
- (PictFormatType | PictFormatDepth |
- PictFormatAlphaMask | PictFormatAlpha),
- &pf,
- 0);
-
- if (*format && *mask)
- return GDK_X11_FORMAT_ARGB_MASK;
-
- /* Finally, if neither of the above worked, fall back to
- * looking for combined ARGB -- we'll premultiply ourselves.
- */
-
- pf.type = PictTypeDirect;
- pf.depth = 32;
- pf.direct.red = 16;
- pf.direct.green = 8;
- pf.direct.blue = 0;
- pf.direct.alphaMask = 0xff;
- pf.direct.alpha = 24;
-
- *format = XRenderFindFormat (xdisplay,
- (PictFormatType | PictFormatDepth |
- PictFormatRedMask | PictFormatRed |
- PictFormatGreenMask | PictFormatGreen |
- PictFormatBlueMask | PictFormatBlue |
- PictFormatAlphaMask | PictFormatAlpha),
- &pf,
- 0);
- *mask = NULL;
-
- if (*format)
- return GDK_X11_FORMAT_ARGB;
-
- return GDK_X11_FORMAT_NONE;
-}
-
#if 0
static void
list_formats (XRenderPictFormat *pf)
@@ -1150,260 +933,6 @@ _gdk_x11_convert_to_format (guchar *src_buf,
}
static void
-draw_with_images (GdkDrawable *drawable,
- GdkGC *gc,
- GdkX11FormatType format_type,
- XRenderPictFormat *format,
- XRenderPictFormat *mask_format,
- guchar *src_rgb,
- gint src_rowstride,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height)
-{
- GdkScreen *screen = GDK_DRAWABLE_IMPL_X11 (drawable)->screen;
- Display *xdisplay = GDK_SCREEN_XDISPLAY (screen);
- GdkImage *image;
- GdkPixmap *pix;
- GdkGC *pix_gc;
- Picture pict;
- Picture dest_pict;
- Picture mask = None;
- gint x0, y0;
-
- pix = gdk_pixmap_new (gdk_screen_get_root_window (screen), width, height, 32);
-
- pict = XRenderCreatePicture (xdisplay,
- GDK_PIXMAP_XID (pix),
- format, 0, NULL);
- if (mask_format)
- mask = XRenderCreatePicture (xdisplay,
- GDK_PIXMAP_XID (pix),
- mask_format, 0, NULL);
-
- dest_pict = gdk_x11_drawable_get_picture (drawable);
-
- pix_gc = _gdk_drawable_get_scratch_gc (pix, FALSE);
-
- for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
- {
- gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
- for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
- {
- gint xs0, ys0;
-
- gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
-
- image = _gdk_image_get_scratch (screen, width1, height1, 32, &xs0, &ys0);
-
- _gdk_x11_convert_to_format (src_rgb + y0 * src_rowstride + 4 * x0, src_rowstride,
- (guchar *)image->mem + ys0 * image->bpl + xs0 * image->bpp, image->bpl,
- format_type, image->byte_order,
- width1, height1);
-
- gdk_draw_image (pix, pix_gc,
- image, xs0, ys0, x0, y0, width1, height1);
- }
- }
-
- XRenderComposite (xdisplay, PictOpOver, pict, mask, dest_pict,
- 0, 0, 0, 0, dest_x, dest_y, width, height);
-
- XRenderFreePicture (xdisplay, pict);
- if (mask)
- XRenderFreePicture (xdisplay, mask);
-
- g_object_unref (pix);
-}
-
-typedef struct _ShmPixmapInfo ShmPixmapInfo;
-
-struct _ShmPixmapInfo
-{
- Display *display;
- Pixmap pix;
- Picture pict;
- Picture mask;
-};
-
-static void
-shm_pixmap_info_destroy (gpointer data)
-{
- ShmPixmapInfo *info = data;
-
- if (info->pict != None)
- XRenderFreePicture (info->display, info->pict);
- if (info->mask != None)
- XRenderFreePicture (info->display, info->mask);
-
- g_free (data);
-}
-
-
-/* Returns FALSE if we can't get a shm pixmap */
-static gboolean
-get_shm_pixmap_for_image (Display *xdisplay,
- GdkImage *image,
- XRenderPictFormat *format,
- XRenderPictFormat *mask_format,
- Pixmap *pix,
- Picture *pict,
- Picture *mask)
-{
- ShmPixmapInfo *info;
-
- if (image->type != GDK_IMAGE_SHARED)
- return FALSE;
-
- info = g_object_get_data (G_OBJECT (image), "gdk-x11-shm-pixmap");
- if (!info)
- {
- *pix = _gdk_x11_image_get_shm_pixmap (image);
-
- if (!*pix)
- return FALSE;
-
- info = g_new (ShmPixmapInfo, 1);
- info->display = xdisplay;
- info->pix = *pix;
-
- info->pict = XRenderCreatePicture (xdisplay, info->pix,
- format, 0, NULL);
- if (mask_format)
- info->mask = XRenderCreatePicture (xdisplay, info->pix,
- mask_format, 0, NULL);
- else
- info->mask = None;
-
- g_object_set_data_full (G_OBJECT (image), "gdk-x11-shm-pixmap", info,
- shm_pixmap_info_destroy);
- }
-
- *pix = info->pix;
- *pict = info->pict;
- *mask = info->mask;
-
- return TRUE;
-}
-
-#ifdef USE_SHM
-/* Returns FALSE if drawing with ShmPixmaps is not possible */
-static gboolean
-draw_with_pixmaps (GdkDrawable *drawable,
- GdkGC *gc,
- GdkX11FormatType format_type,
- XRenderPictFormat *format,
- XRenderPictFormat *mask_format,
- guchar *src_rgb,
- gint src_rowstride,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height)
-{
- Display *xdisplay = GDK_SCREEN_XDISPLAY (GDK_DRAWABLE_IMPL_X11 (drawable)->screen);
- GdkImage *image;
- Pixmap pix;
- Picture pict;
- Picture dest_pict;
- Picture mask = None;
- gint x0, y0;
-
- dest_pict = gdk_x11_drawable_get_picture (drawable);
-
- for (y0 = 0; y0 < height; y0 += GDK_SCRATCH_IMAGE_HEIGHT)
- {
- gint height1 = MIN (height - y0, GDK_SCRATCH_IMAGE_HEIGHT);
- for (x0 = 0; x0 < width; x0 += GDK_SCRATCH_IMAGE_WIDTH)
- {
- gint xs0, ys0;
-
- gint width1 = MIN (width - x0, GDK_SCRATCH_IMAGE_WIDTH);
-
- image = _gdk_image_get_scratch (GDK_DRAWABLE_IMPL_X11 (drawable)->screen,
- width1, height1, 32, &xs0, &ys0);
- if (!get_shm_pixmap_for_image (xdisplay, image, format, mask_format, &pix, &pict, &mask))
- return FALSE;
-
- _gdk_x11_convert_to_format (src_rgb + y0 * src_rowstride + 4 * x0, src_rowstride,
- (guchar *)image->mem + ys0 * image->bpl + xs0 * image->bpp, image->bpl,
- format_type, image->byte_order,
- width1, height1);
-
- XRenderComposite (xdisplay, PictOpOver, pict, mask, dest_pict,
- xs0, ys0, xs0, ys0, x0 + dest_x, y0 + dest_y,
- width1, height1);
- }
- }
-
- return TRUE;
-}
-#endif
-
-static void
-gdk_x11_draw_pixbuf (GdkDrawable *drawable,
- GdkGC *gc,
- GdkPixbuf *pixbuf,
- gint src_x,
- gint src_y,
- gint dest_x,
- gint dest_y,
- gint width,
- gint height,
- GdkRgbDither dither,
- gint x_dither,
- gint y_dither)
-{
- GdkX11FormatType format_type;
- XRenderPictFormat *format, *mask_format;
- gint rowstride;
-#ifdef USE_SHM
- gboolean use_pixmaps = TRUE;
-#endif /* USE_SHM */
-
- format_type = select_format (gdk_drawable_get_display (drawable),
- &format, &mask_format);
-
- if (format_type == GDK_X11_FORMAT_NONE ||
- !gdk_pixbuf_get_has_alpha (pixbuf) ||
- gdk_drawable_get_depth (drawable) == 1 ||
- (dither == GDK_RGB_DITHER_MAX && gdk_drawable_get_depth (drawable) != 24) ||
- gdk_x11_drawable_get_picture (drawable) == None)
- {
- GdkDrawable *wrapper = GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper;
- GDK_DRAWABLE_CLASS (_gdk_drawable_impl_x11_parent_class)->draw_pixbuf (wrapper, gc, pixbuf,
- src_x, src_y, dest_x, dest_y,
- width, height,
- dither, x_dither, y_dither);
- return;
- }
-
- gdk_x11_drawable_update_picture_clip (drawable, gc);
-
- rowstride = gdk_pixbuf_get_rowstride (pixbuf);
-
-#ifdef USE_SHM
- if (use_pixmaps)
- {
- if (!draw_with_pixmaps (drawable, gc,
- format_type, format, mask_format,
- gdk_pixbuf_get_pixels (pixbuf) + src_y * rowstride + src_x * 4,
- rowstride,
- dest_x, dest_y, width, height))
- use_pixmaps = FALSE;
- }
-
- if (!use_pixmaps)
-#endif /* USE_SHM */
- draw_with_images (drawable, gc,
- format_type, format, mask_format,
- gdk_pixbuf_get_pixels (pixbuf) + src_y * rowstride + src_x * 4,
- rowstride,
- dest_x, dest_y, width, height);
-}
-
-static void
gdk_x11_cairo_surface_destroy (void *data)
{
GdkDrawableImplX11 *impl = data;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]