[cogl/cogl-1.18] cogl-texture-2d: Add update_area equivalent for Wayland



commit af480a2b8b5450148ca4b969eec90ee330d5fd12
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Mon Nov 4 22:08:50 2013 -0500

    cogl-texture-2d: Add update_area equivalent for Wayland

 cogl/cogl-texture-2d.c     |   87 +++++++++++++++++++++++++++++++-------------
 cogl/cogl-wayland-server.h |    8 ++++
 2 files changed, 70 insertions(+), 25 deletions(-)
---
diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
index 2a497d3..c3682ee 100644
--- a/cogl/cogl-texture-2d.c
+++ b/cogl/cogl-texture-2d.c
@@ -292,6 +292,66 @@ _cogl_egl_texture_2d_new_from_image (CoglContext *ctx,
 #endif /* defined (COGL_HAS_EGL_SUPPORT) && defined (EGL_KHR_image_base) */
 
 #ifdef COGL_HAS_WAYLAND_EGL_SERVER_SUPPORT
+static void
+shm_buffer_get_cogl_pixel_format (struct wl_shm_buffer *shm_buffer,
+                                  CoglPixelFormat *format_out,
+                                  CoglPixelFormat *internal_format_out)
+{
+  CoglPixelFormat format;
+  CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY;
+
+  switch (wl_shm_buffer_get_format (shm_buffer))
+    {
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+    case WL_SHM_FORMAT_ARGB8888:
+      format = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
+      break;
+    case WL_SHM_FORMAT_XRGB8888:
+      format = COGL_PIXEL_FORMAT_ARGB_8888;
+      internal_format = COGL_PIXEL_FORMAT_RGB_888;
+      break;
+#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
+    case WL_SHM_FORMAT_ARGB8888:
+      format = COGL_PIXEL_FORMAT_BGRA_8888_PRE;
+      break;
+    case WL_SHM_FORMAT_XRGB8888:
+      format = COGL_PIXEL_FORMAT_BGRA_8888;
+      internal_format = COGL_PIXEL_FORMAT_BGR_888;
+      break;
+#endif
+    default:
+      g_warn_if_reached ();
+      format = COGL_PIXEL_FORMAT_ARGB_8888;
+    }
+
+  if (format_out)
+    *format_out = format;
+  if (internal_format_out)
+    *internal_format_out = internal_format;
+}
+
+void
+cogl_wayland_texture_2d_update_area (CoglTexture2D *texture,
+                                     struct wl_shm_buffer *shm_buffer,
+                                     int            x,
+                                     int            y,
+                                     int            width,
+                                     int            height)
+{
+  CoglPixelFormat format;
+
+  shm_buffer_get_cogl_pixel_format (shm_buffer, &format, NULL);
+
+  cogl_texture_set_region (COGL_TEXTURE (texture),
+                           x, y,
+                           x, y,
+                           width, height,
+                           width, height,
+                           format,
+                           wl_shm_buffer_get_stride (shm_buffer),
+                           wl_shm_buffer_get_data (shm_buffer));
+}
+
 CoglTexture2D *
 cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
                                          struct wl_resource *buffer,
@@ -304,34 +364,11 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
   if (shm_buffer)
     {
       int stride = wl_shm_buffer_get_stride (shm_buffer);
-      CoglPixelFormat format;
-      CoglPixelFormat internal_format = COGL_PIXEL_FORMAT_ANY;
       int width = wl_shm_buffer_get_width (shm_buffer);
       int height = wl_shm_buffer_get_height (shm_buffer);
+      CoglPixelFormat format, internal_format;
 
-      switch (wl_shm_buffer_get_format (shm_buffer))
-        {
-#if G_BYTE_ORDER == G_BIG_ENDIAN
-          case WL_SHM_FORMAT_ARGB8888:
-            format = COGL_PIXEL_FORMAT_ARGB_8888_PRE;
-            break;
-          case WL_SHM_FORMAT_XRGB8888:
-            format = COGL_PIXEL_FORMAT_ARGB_8888;
-            internal_format = COGL_PIXEL_FORMAT_RGB_888;
-            break;
-#elif G_BYTE_ORDER == G_LITTLE_ENDIAN
-          case WL_SHM_FORMAT_ARGB8888:
-            format = COGL_PIXEL_FORMAT_BGRA_8888_PRE;
-            break;
-          case WL_SHM_FORMAT_XRGB8888:
-            format = COGL_PIXEL_FORMAT_BGRA_8888;
-            internal_format = COGL_PIXEL_FORMAT_BGR_888;
-            break;
-#endif
-          default:
-            g_warn_if_reached ();
-            format = COGL_PIXEL_FORMAT_ARGB_8888;
-        }
+      shm_buffer_get_cogl_pixel_format (shm_buffer, &format, &internal_format);
 
       return cogl_texture_2d_new_from_data (ctx,
                                             width, height,
diff --git a/cogl/cogl-wayland-server.h b/cogl/cogl-wayland-server.h
index e56f5bd..bf0bc4c 100644
--- a/cogl/cogl-wayland-server.h
+++ b/cogl/cogl-wayland-server.h
@@ -79,6 +79,14 @@ cogl_wayland_texture_2d_new_from_buffer (CoglContext *ctx,
                                          struct wl_resource *buffer,
                                          CoglError **error);
 
+void
+cogl_wayland_texture_2d_update_area (CoglTexture2D *texture,
+                                     struct wl_shm_buffer *shm_buffer,
+                                     int x,
+                                     int y,
+                                     int width,
+                                     int height);
+
 COGL_END_DECLS
 
 #endif /* __COGL_WAYLAND_SERVER_H */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]