summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdk/gdkgltexture.c14
-rw-r--r--gdk/gdkmemorytexture.c38
-rw-r--r--gdk/gdktexture.c28
-rw-r--r--gdk/gdktextureprivate.h5
4 files changed, 69 insertions, 16 deletions
diff --git a/gdk/gdkgltexture.c b/gdk/gdkgltexture.c
index e2f51c12d6..6a0185626a 100644
--- a/gdk/gdkgltexture.c
+++ b/gdk/gdkgltexture.c
@@ -68,9 +68,10 @@ gdk_gl_texture_dispose (GObject *object)
}
static void
-gdk_gl_texture_download (GdkTexture *texture,
- guchar *data,
- gsize stride)
+gdk_gl_texture_download (GdkTexture *texture,
+ const GdkRectangle *area,
+ guchar *data,
+ gsize stride)
{
GdkGLTexture *self = GDK_GL_TEXTURE (texture);
cairo_surface_t *surface;
@@ -78,7 +79,7 @@ gdk_gl_texture_download (GdkTexture *texture,
surface = cairo_image_surface_create_for_data (data,
CAIRO_FORMAT_ARGB32,
- texture->width, texture->height,
+ area->width, area->height,
stride);
cr = cairo_create (surface);
@@ -93,8 +94,9 @@ gdk_gl_texture_download (GdkTexture *texture,
GdkWindow *window;
window = gdk_gl_context_get_window (self->context);
- gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1, 0, 0,
- texture->width, texture->height);
+ gdk_cairo_draw_from_gl (cr, window, self->id, GL_TEXTURE, 1,
+ area->x, area->y,
+ area->width, area->height);
}
cairo_destroy (cr);
diff --git a/gdk/gdkmemorytexture.c b/gdk/gdkmemorytexture.c
index f44dff2139..7a84e3962f 100644
--- a/gdk/gdkmemorytexture.c
+++ b/gdk/gdkmemorytexture.c
@@ -38,6 +38,30 @@ struct _GdkMemoryTextureClass
G_DEFINE_TYPE (GdkMemoryTexture, gdk_memory_texture, GDK_TYPE_TEXTURE)
+static gsize
+gdk_memory_format_bytes_per_pixel (GdkMemoryFormat format)
+{
+ switch (format)
+ {
+ case GDK_MEMORY_B8G8R8A8_PREMULTIPLIED:
+ case GDK_MEMORY_A8R8G8B8_PREMULTIPLIED:
+ case GDK_MEMORY_B8G8R8A8:
+ case GDK_MEMORY_A8R8G8B8:
+ case GDK_MEMORY_R8G8B8A8:
+ case GDK_MEMORY_A8B8G8R8:
+ return 4;
+
+ case GDK_MEMORY_R8G8B8:
+ case GDK_MEMORY_B8G8R8:
+ return 3;
+
+ case GDK_MEMORY_N_FORMATS:
+ default:
+ g_assert_not_reached ();
+ return 4;
+ }
+}
+
static void
gdk_memory_texture_dispose (GObject *object)
{
@@ -49,17 +73,21 @@ gdk_memory_texture_dispose (GObject *object)
}
static void
-gdk_memory_texture_download (GdkTexture *texture,
- guchar *data,
- gsize stride)
+gdk_memory_texture_download (GdkTexture *texture,
+ const GdkRectangle *area,
+ guchar *data,
+ gsize stride)
{
GdkMemoryTexture *self = GDK_MEMORY_TEXTURE (texture);
gdk_memory_convert (data, stride,
GDK_MEMORY_CAIRO_FORMAT_ARGB32,
- g_bytes_get_data (self->bytes, NULL), self->stride,
+ (guchar *) g_bytes_get_data (self->bytes, NULL)
+ + area->x * gdk_memory_format_bytes_per_pixel (self->format)
+ + area->y * self->stride,
+ self->stride,
self->format,
- texture->width, texture->height);
+ area->width, area->height);
}
static void
diff --git a/gdk/gdktexture.c b/gdk/gdktexture.c
index 616b0cbb8b..6e42f0a952 100644
--- a/gdk/gdktexture.c
+++ b/gdk/gdktexture.c
@@ -77,9 +77,10 @@ G_DEFINE_ABSTRACT_TYPE (GdkTexture, gdk_texture, G_TYPE_OBJECT)
g_critical ("Texture of type '%s' does not implement GdkTexture::" # method, G_OBJECT_TYPE_NAME (obj))
static void
-gdk_texture_real_download (GdkTexture *self,
- guchar *data,
- gsize stride)
+gdk_texture_real_download (GdkTexture *self,
+ const GdkRectangle *area,
+ guchar *data,
+ gsize stride)
{
GDK_TEXTURE_WARN_NOT_IMPLEMENTED_METHOD (self, download);
}
@@ -431,7 +432,21 @@ gdk_texture_download_surface (GdkTexture *texture)
return GDK_TEXTURE_GET_CLASS (texture)->download_surface (texture);
}
-/**
+void
+gdk_texture_download_area (GdkTexture *texture,
+ const GdkRectangle *area,
+ guchar *data,
+ gsize stride)
+{
+ g_assert (area->x >= 0);
+ g_assert (area->y >= 0);
+ g_assert (area->x + area->width <= texture->width);
+ g_assert (area->y + area->height <= texture->height);
+
+ return GDK_TEXTURE_GET_CLASS (texture)->download (texture, area, data, stride);
+}
+
+/*
* gdk_texture_download:
* @texture: a #GdkTexture
* @data: (array): pointer to enough memory to be filled with the
@@ -466,7 +481,10 @@ gdk_texture_download (GdkTexture *texture,
g_return_if_fail (data != NULL);
g_return_if_fail (stride >= gdk_texture_get_width (texture) * 4);
- return GDK_TEXTURE_GET_CLASS (texture)->download (texture, data, stride);
+ gdk_texture_download_area (texture,
+ &(GdkRectangle) { 0, 0, texture->width, texture->height },
+ data,
+ stride);
}
gboolean
diff --git a/gdk/gdktextureprivate.h b/gdk/gdktextureprivate.h
index f9e5fbe908..07cb5436a3 100644
--- a/gdk/gdktextureprivate.h
+++ b/gdk/gdktextureprivate.h
@@ -25,6 +25,7 @@ struct _GdkTextureClass {
GObjectClass parent_class;
void (* download) (GdkTexture *texture,
+ const GdkRectangle *area,
guchar *data,
gsize stride);
cairo_surface_t * (* download_surface) (GdkTexture *texture);
@@ -35,6 +36,10 @@ gpointer gdk_texture_new (const GdkTextureClass
int height);
GdkTexture * gdk_texture_new_for_surface (cairo_surface_t *surface);
cairo_surface_t * gdk_texture_download_surface (GdkTexture *texture);
+void gdk_texture_download_area (GdkTexture *texture,
+ const GdkRectangle *area,
+ guchar *data,
+ gsize stride);
gboolean gdk_texture_set_render_data (GdkTexture *self,
gpointer key,