cogl-texture: Add a new constructor to turn CoglBuffers into textures
authorDamien Lespiau <damien.lespiau@intel.com>
Fri, 22 Jan 2010 15:07:27 +0000 (15:07 +0000)
committerDamien Lespiau <damien.lespiau@intel.com>
Mon, 8 Feb 2010 17:14:49 +0000 (17:14 +0000)
The only goal of using COGL buffers is to use them to create
textures. cogl_texture_new_from_buffer() is the new symbol to create
textures out of buffers.

clutter/cogl/cogl/cogl-texture.c
clutter/cogl/cogl/cogl-texture.h
doc/reference/cogl/cogl-sections.txt

index ec69aca..f0093f0 100644 (file)
@@ -35,6 +35,7 @@
 #include "cogl-util.h"
 #include "cogl-bitmap.h"
 #include "cogl-bitmap-private.h"
+#include "cogl-buffer-private.h"
 #include "cogl-texture-private.h"
 #include "cogl-texture-driver.h"
 #include "cogl-texture-2d-sliced-private.h"
@@ -452,6 +453,60 @@ cogl_texture_new_from_sub_texture (CoglHandle full_texture,
                                 sub_width, sub_height);
 }
 
+CoglHandle
+cogl_texture_new_from_buffer_EXP (CoglHandle       buffer,
+                                  guint            width,
+                                  guint            height,
+                                  CoglTextureFlags flags,
+                                  CoglPixelFormat  format,
+                                  CoglPixelFormat  internal_format,
+                                  guint            rowstride,
+                                  const guint      offset)
+{
+  CoglHandle texture;
+  CoglBitmap bitmap;
+  CoglBuffer *cogl_buffer;
+  CoglPixelBuffer *pixel_buffer;
+
+  g_return_val_if_fail (cogl_is_buffer (buffer), COGL_INVALID_HANDLE);
+
+  if (format == COGL_PIXEL_FORMAT_ANY)
+    return COGL_INVALID_HANDLE;
+
+  cogl_buffer = COGL_BUFFER (buffer);
+  pixel_buffer = COGL_PIXEL_BUFFER (buffer);
+
+  /* Rowstride from width if not given */
+  if (rowstride == 0)
+    rowstride = width * _cogl_get_format_bpp (format);
+
+  /* use the CoglBuffer height and width as last resort */
+  if (width == 0)
+    width = pixel_buffer->width;
+  if (height == 0)
+    height = pixel_buffer->height;
+  if (width == 0 || height == 0)
+    {
+      /* no width or height specified, neither at creation time (because the
+       * buffer was created by cogl_pixel_buffer_new()) nor when calling this
+       * function */
+      return COGL_INVALID_HANDLE;
+    }
+
+  /* Wrap the data into a bitmap */
+  bitmap.width = width;
+  bitmap.height = height;
+  bitmap.data = GUINT_TO_POINTER (offset);
+  bitmap.format = format;
+  bitmap.rowstride = rowstride;
+
+  _cogl_buffer_bind (cogl_buffer, GL_PIXEL_UNPACK_BUFFER);
+  texture =  cogl_texture_new_from_bitmap (&bitmap, flags, internal_format);
+  _cogl_buffer_bind (NULL, GL_PIXEL_UNPACK_BUFFER);
+
+  return texture;
+}
+
 guint
 cogl_texture_get_width (CoglHandle handle)
 {
index c0becf9..15aad68 100644 (file)
@@ -344,6 +344,66 @@ CoglHandle      cogl_texture_new_from_sub_texture
                                                gint       sub_width,
                                                gint       sub_height);
 
+#if defined (COGL_ENABLE_EXPERIMENTAL_API)
+
+/**
+ * cogl_texture_new_from_buffer:
+ * @buffer: the #CoglHandle of a pixel buffer
+ * @width: width of texture in pixels or 0
+ * @height: height of texture in pixels or 0
+ * @flags: optional flags for the texture, or %COGL_TEXTURE_NONE
+ * @format: the #CoglPixelFormat the buffer is stored in in RAM
+ * @internal_format: the #CoglPixelFormat that will be used for storing
+ *    the buffer on the GPU. If %COGL_PIXEL_FORMAT_ANY is given then a
+ *    premultiplied format similar to the format of the source data will
+ *    be used. The default blending equations of Cogl expect premultiplied
+ *    color data; the main use of passing a non-premultiplied format here
+ *    is if you have non-premultiplied source data and are going to adjust
+ *    the blend mode (see cogl_material_set_blend()) or use the data for
+ *    something other than straight blending
+ * @rowstride: the memory offset in bytes between the starts of
+ *    scanlines in @data. If 0 is given the row stride will be deduced from
+ *    @width and @format or the stride given by cogl_pixel_buffer_new_for_size()
+ * @offset: offset in bytes in @buffer from where the texture data starts
+ *
+ * Creates a new texture using the buffer specified by @handle. If the buffer
+ * has been created using cogl_pixel_buffer_new_for_size() it's possible to omit
+ * the height and width values already specified at creation time.
+ *
+ * Return value: a #CoglHandle to the new texture or %COGL_INVALID_HANDLE on
+ *    failure
+ *
+ * Since: 1.2
+ * Stability: Unstable
+ */
+CoglHandle      cogl_texture_new_from_buffer  (CoglHandle       buffer,
+                                               guint            width,
+                                               guint            height,
+                                               CoglTextureFlags flags,
+                                               CoglPixelFormat  format,
+                                               CoglPixelFormat  internal_format,
+                                               guint            rowstride,
+                                               guint            offset);
+
+/* the function above is experimental, the actual symbol is suffixed by _EXP so
+ * we can ensure ABI compatibility and leave the cogl_buffer namespace free for
+ * future use. A bunch of defines translates the symbols documented above into
+ * the real symbols */
+
+CoglHandle      cogl_texture_new_from_buffer_EXP
+                                              (CoglHandle       buffer,
+                                               guint            width,
+                                               guint            height,
+                                               CoglTextureFlags flags,
+                                               CoglPixelFormat  format,
+                                               CoglPixelFormat  internal_format,
+                                               guint            rowstride,
+                                               guint            offset);
+
+#define cogl_texture_new_from_buffer cogl_texture_new_from_buffer_EXP
+
+#endif
+
 #ifndef COGL_DISABLE_DEPRECATED
 
 /**
index 90b1740..c2678dc 100644 (file)
@@ -494,4 +494,7 @@ cogl_pixel_buffer_new
 cogl_pixel_buffer_new_for_size
 cogl_is_pixel_buffer
 
+<SUBSECTION>
+cogl_texture_new_from_buffer
+
 </SECTION>