summaryrefslogtreecommitdiff
blob: bb1eab1ac68d1c46d5c83f8d0860f1423830e33e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
From b52949949fff009e1e681bbce8027785b5cc7ac6 Mon Sep 17 00:00:00 2001
From: Neil Roberts <neil@linux.intel.com>
Date: Wed, 17 Nov 2010 15:38:20 +0000
Subject: [PATCH] Add an internal _cogl_read_pixels_full

This is the same as _cogl_read_pixels except that it takes a rowstride
parameter for the destination buffer. Under OpenGL setting the
rowstride this will end up calling GL_ROW_LENGTH so that the buffer
region can be directly written to. Under GLES GL_ROW_LENGTH is not
supported so it will use an intermediate buffer as it does if the
format is not GL_RGBA.

cogl_read_pixels now just calls the full version of the function with
the rowstride set to width*bpp.

http://bugzilla.clutter-project.org/show_bug.cgi?id=2414
---
 clutter/cogl/cogl/cogl-private.h |   10 +++++++++
 clutter/cogl/cogl/cogl.c         |   39 +++++++++++++++++++++++++++----------
 2 files changed, 38 insertions(+), 11 deletions(-)

diff --git a/clutter/cogl/cogl/cogl-private.h b/clutter/cogl/cogl/cogl-private.h
index c2f6947..6c06cce 100644
--- a/clutter/cogl/cogl/cogl-private.h
+++ b/clutter/cogl/cogl/cogl-private.h
@@ -29,6 +29,16 @@ G_BEGIN_DECLS
 void
 _cogl_clear (const CoglColor *color, unsigned long buffers);
 
+void
+_cogl_read_pixels_full (int x,
+                        int y,
+                        int width,
+                        int height,
+                        CoglReadPixelsFlags source,
+                        CoglPixelFormat format,
+                        guint8 *pixels,
+                        int rowstride);
+
 G_END_DECLS
 
 #endif /* __COGL_PRIVATE_H__ */
diff --git a/clutter/cogl/cogl/cogl.c b/clutter/cogl/cogl/cogl.c
index b1882ef..67827f3 100644
--- a/clutter/cogl/cogl/cogl.c
+++ b/clutter/cogl/cogl/cogl.c
@@ -556,13 +556,14 @@ cogl_flush (void)
 }
 
 void
-cogl_read_pixels (int x,
-                  int y,
-                  int width,
-                  int height,
-                  CoglReadPixelsFlags source,
-                  CoglPixelFormat format,
-                  guint8 *pixels)
+_cogl_read_pixels_full (int x,
+                        int y,
+                        int width,
+                        int height,
+                        CoglReadPixelsFlags source,
+                        CoglPixelFormat format,
+                        guint8 *pixels,
+                        int rowstride)
 {
   CoglFramebuffer *framebuffer;
   int              framebuffer_height;
@@ -572,7 +573,6 @@ cogl_read_pixels (int x,
   GLenum           gl_format;
   GLenum           gl_type;
   CoglPixelFormat  bmp_format;
-  int              rowstride;
 
   _COGL_GET_CONTEXT (ctx, NO_RETVAL);
 
@@ -599,7 +599,6 @@ cogl_read_pixels (int x,
 
   /* Initialise the CoglBitmap */
   bpp = _cogl_get_format_bpp (format);
-  rowstride = bpp * width;
   bmp_format = format;
 
   if ((format & COGL_A_BIT))
@@ -630,9 +629,12 @@ cogl_read_pixels (int x,
      to be more clever and check if the requested type matches that
      but we would need some reliable functions to convert from GL
      types to Cogl types. For now, lets just always read in
-     GL_RGBA/GL_UNSIGNED_BYTE and convert if necessary */
+     GL_RGBA/GL_UNSIGNED_BYTE and convert if necessary. We also need
+     to use this intermediate buffer if the rowstride has padding
+     because GLES does not support setting GL_ROW_LENGTH */
 #ifndef COGL_HAS_GL
-  if (gl_format != GL_RGBA || gl_type != GL_UNSIGNED_BYTE)
+  if (gl_format != GL_RGBA || gl_type != GL_UNSIGNED_BYTE ||
+      rowstride != 4 * width)
     {
       CoglBitmap *tmp_bmp, *dst_bmp;
       guint8 *tmp_data = g_malloc (width * height * 4);
@@ -711,6 +713,21 @@ cogl_read_pixels (int x,
   cogl_object_unref (bmp);
 }
 
+void
+cogl_read_pixels (int x,
+                  int y,
+                  int width,
+                  int height,
+                  CoglReadPixelsFlags source,
+                  CoglPixelFormat format,
+                  guint8 *pixels)
+{
+  _cogl_read_pixels_full (x, y, width, height,
+                          source, format, pixels,
+                          /* rowstride */
+                          _cogl_get_format_bpp (format) * width);
+}
+
 static void
 _cogl_disable_other_texcoord_arrays_cb (int texcoord_array_num, gpointer data)
 {
-- 
1.7.3.16.g9464b