evas: Change internal function image_data_direct
authorJean-Philippe Andre <jp.andre@samsung.com>
Fri, 2 Sep 2016 08:55:33 +0000 (17:55 +0900)
committerJean-Philippe Andre <jp.andre@samsung.com>
Tue, 6 Sep 2016 07:54:54 +0000 (16:54 +0900)
src/lib/evas/canvas/efl_canvas_image.c
src/lib/evas/canvas/evas_object_image.c
src/lib/evas/common/evas_image.h
src/lib/evas/common/evas_image_main.c
src/lib/evas/include/evas_private.h
src/modules/evas/engines/gl_generic/evas_engine.c
src/modules/evas/engines/software_generic/evas_engine.c

index 419a464..d1932d3 100644 (file)
@@ -732,33 +732,16 @@ _efl_canvas_image_efl_gfx_buffer_buffer_managed_get(Eo *eo_obj, void *_pd EINA_U
    Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS);
    Evas_Image_Data *o = efl_data_scope_get(eo_obj, EFL_CANVAS_IMAGE_INTERNAL_CLASS);
    Evas_Colorspace cspace = EVAS_COLORSPACE_ARGB8888;
-   int w = 0, h = 0;
-   void *pixels;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(slice, EINA_FALSE);
 
    slice->len = 0;
    slice->mem = NULL;
 
-   if (plane)
-     {
-        ERR("planar formats not supported yet!");
-        return EINA_FALSE;
-     }
-
-   if (!o->buffer_data_set || !o->engine_data || !ENFN->image_data_direct)
+   if (!o->buffer_data_set || !o->engine_data || !ENFN->image_data_direct_get)
      return EINA_FALSE;
 
-   pixels = ENFN->image_data_direct(ENDT, o->engine_data, &cspace);
-   if (!pixels) return EINA_FALSE;
-
-   slice->mem = pixels;
-
-   // note: length may not be same as what was originally given
-   ENFN->image_size_get(ENDT, o->engine_data, &w, &h);
-   slice->len = _evas_common_rgba_image_surface_size(w, h, cspace, NULL, NULL, NULL, NULL);
-
-   return EINA_TRUE;
+   return ENFN->image_data_direct_get(ENDT, o->engine_data, plane, slice, &cspace);
 }
 
 EOLIAN static Eina_Bool
index 975c34f..2dca630 100644 (file)
@@ -920,11 +920,12 @@ _efl_canvas_image_internal_efl_file_save(const Eo *eo_obj, Evas_Image_Data *o, c
           }
      }
 
-   if (!ENFN->image_data_direct)
+   if (!ENFN->image_data_direct_get)
      pixels = ENFN->image_data_get(ENDT, pixels, 0, &data, &o->load_error, &tofree);
    else
      {
-        if (ENFN->image_data_direct(ENDT, pixels, &cspace))
+        Eina_Slice slice;
+        if (ENFN->image_data_direct_get(ENDT, pixels, 0, &slice, &cspace))
           {
              if ((want_cspace != (int) cspace) && (want_cspace != -1))
                cspace = EVAS_COLORSPACE_ARGB8888;
index 910af43..e686ef7 100644 (file)
@@ -78,6 +78,7 @@ EAPI double evas_common_load_rgba_image_frame_duration_from_file(Image_Entry *im
 void _evas_common_rgba_image_post_surface(Image_Entry *ie);
 EAPI int _evas_common_rgba_image_surface_size(unsigned int w, unsigned int h, Evas_Colorspace cspace, /* inout */ int *l, int *r, int *t, int *b);
 EAPI int _evas_common_rgba_image_data_offset(int rx, int ry, int rw, int rh, int plane, const RGBA_Image *im);
+EAPI Eina_Bool _evas_common_rgba_image_plane_get(const RGBA_Image *im, int plane, Eina_Slice *slice);
 
 EAPI Eina_Bool evas_common_extension_can_load_get(const char *file);
 
index b0023c3..df2e5e2 100644 (file)
@@ -181,6 +181,161 @@ _evas_common_rgba_image_surface_size(unsigned int w, unsigned int h,
 #undef ALIGN_TO_PAGE
 }
 
+EAPI Eina_Bool
+_evas_common_rgba_image_plane_get(const RGBA_Image *im, int plane, Eina_Slice *slice)
+{
+   unsigned char **csdata;
+   Evas_Colorspace cs;
+   int w, h;
+
+   if (!im || !slice) return EINA_FALSE;
+   cs = im->cache_entry.space;
+   w = im->cache_entry.w;
+   h = im->cache_entry.h;
+
+   switch (cs)
+     {
+    case EVAS_COLORSPACE_YCBCR422P601_PL:
+    case EVAS_COLORSPACE_YCBCR422P709_PL:
+    case EVAS_COLORSPACE_YCBCR422601_PL:
+    case EVAS_COLORSPACE_YCBCR420NV12601_PL:
+    case EVAS_COLORSPACE_YCBCR420TM12601_PL:
+        if (!im->cs.data)
+          return EINA_FALSE;
+        csdata = im->cs.data;
+        break;
+
+      default:
+        if (!im->image.data)
+          return EINA_FALSE;
+        break;
+     }
+
+   switch (cs)
+     {
+      case EVAS_COLORSPACE_ARGB8888:
+        if (plane != 0) return EINA_FALSE;
+        slice->len = w * h * 4;
+        slice->mem = im->image.data;
+        return EINA_TRUE;
+
+      case EVAS_COLORSPACE_AGRY88:
+        if (plane != 0) return EINA_FALSE;
+        slice->len = w * h * 2;
+        slice->mem = im->image.data;
+        return EINA_TRUE;
+
+      case EVAS_COLORSPACE_GRY8:
+        if (plane != 0) return EINA_FALSE;
+        slice->len = w * h;
+        slice->mem = im->image.data;
+        return EINA_TRUE;
+
+      case EVAS_COLORSPACE_RGB565_A5P:
+        if (plane == 0)
+          {
+             slice->mem = im->image.data;
+             slice->len = w * h * 2;
+             return EINA_TRUE;
+          }
+        else if (plane == 1)
+          {
+             slice->mem = im->image.data8 + (w * h * 2);
+             slice->len = w * h;
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+
+        // YUV, assume contiguous memory within a plane (and no padding)
+        // single interleaved plane
+      case EVAS_COLORSPACE_YCBCR422601_PL:
+        if (plane != 0) return EINA_FALSE;
+        slice->mem = csdata[0];
+        slice->len = (w * h * 3) / 2;
+        return EINA_TRUE;
+
+        // 2 planes
+      case EVAS_COLORSPACE_YCBCR420NV12601_PL:
+      case EVAS_COLORSPACE_YCBCR420TM12601_PL:
+        if (plane == 0)
+          {
+             slice->mem = csdata[0];
+             slice->len = w * h;
+             return EINA_TRUE;
+          }
+        else if (plane == 1)
+          {
+             slice->mem = csdata[h];
+             slice->len = w * h / 4;
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+
+        // 3 planes
+      case EVAS_COLORSPACE_YCBCR422P601_PL:
+      case EVAS_COLORSPACE_YCBCR422P709_PL:
+        if (plane == 0)
+          {
+             slice->mem = csdata[0];
+             slice->len = w * h;
+             return EINA_TRUE;
+          }
+        else if (plane == 1)
+          {
+             slice->mem = csdata[h];
+             slice->len = w * h / 4;
+             return EINA_TRUE;
+          }
+        else if (plane == 2)
+          {
+             slice->mem = csdata[2 * h];
+             slice->len = w * h / 4;
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+
+        // ETC1/2 RGB, S3TC RGB
+      case EVAS_COLORSPACE_ETC1:
+      case EVAS_COLORSPACE_RGB8_ETC2:
+      case EVAS_COLORSPACE_RGB_S3TC_DXT1:
+        if (plane != 0) return EINA_FALSE;
+        slice->mem = im->image.data;
+        slice->len = (w * h * 8) / 16;
+        return EINA_TRUE;
+
+        // ETC2 ARGB, S3TC ARGB
+      case EVAS_COLORSPACE_RGBA8_ETC2_EAC:
+      case EVAS_COLORSPACE_RGBA_S3TC_DXT1:
+      case EVAS_COLORSPACE_RGBA_S3TC_DXT2:
+      case EVAS_COLORSPACE_RGBA_S3TC_DXT3:
+      case EVAS_COLORSPACE_RGBA_S3TC_DXT4:
+      case EVAS_COLORSPACE_RGBA_S3TC_DXT5:
+        if (plane != 0) return EINA_FALSE;
+        slice->mem = im->image.data;
+        slice->len = (w * h * 16) / 16;
+        return EINA_TRUE;
+
+        // ETC1+Alpha
+      case EVAS_COLORSPACE_ETC1_ALPHA:
+        if (plane == 0)
+          {
+             slice->mem = im->image.data;
+             slice->len = (w * h * 8) / 16;
+             return EINA_TRUE;
+          }
+        else if (plane == 1)
+          {
+             slice->mem = im->image.data8 + (w * h * 8) / 16;
+             slice->len = (w * h * 8) / 16;
+             return EINA_TRUE;
+          }
+        return EINA_FALSE;
+
+      default:
+        return EINA_FALSE;
+     }
+}
+
 EAPI int
 _evas_common_rgba_image_data_offset(int rx, int ry, int rw, int rh, int plane, const RGBA_Image *im)
 {
index ac1a901..243c1fe 100644 (file)
@@ -1355,7 +1355,7 @@ struct _Evas_Func
    void *(*image_dirty_region)             (void *data, void *image, int x, int y, int w, int h);
    void *(*image_data_get)                 (void *data, void *image, int to_write, DATA32 **image_data, int *err, Eina_Bool *tofree);
    void *(*image_data_put)                 (void *data, void *image, DATA32 *image_data);
-   void *(*image_data_direct)              (void *data, void *image, Evas_Colorspace *cspace);
+   Eina_Bool (*image_data_direct_get)      (void *data, void *image, int plane, Eina_Slice *slice, Evas_Colorspace *cspace);
    void  (*image_data_preload_request)     (void *data, void *image, const Eo *target);
    void  (*image_data_preload_cancel)      (void *data, void *image, const Eo *target);
    void *(*image_alpha_set)                (void *data, void *image, int has_alpha);
index de98757..f383326 100644 (file)
@@ -244,14 +244,16 @@ eng_image_file_colorspace_get(void *data EINA_UNUSED, void *image)
    return im->im->cache_entry.space;
 }
 
-static void *
-eng_image_data_direct(void *data EINA_UNUSED, void *image, Evas_Colorspace *cspace)
+static Eina_Bool
+eng_image_data_direct_get(void *data EINA_UNUSED, void *image, int plane, Eina_Slice *slice, Evas_Colorspace *cspace)
 {
    Evas_GL_Image *im = image;
 
-   if (!im || !im->im) return NULL;
+   if (!slice || !im || !im->im)
+     return EINA_FALSE;
+
    if (cspace) *cspace = im->im->cache_entry.space;
-   return im->im->image.data;
+   return _evas_common_rgba_image_plane_get(im->im, plane, slice);
 }
 
 static void
@@ -2940,7 +2942,7 @@ module_open(Evas_Module *em)
    ORD(image_dirty_region);
    ORD(image_data_get);
    ORD(image_data_put);
-   ORD(image_data_direct);
+   ORD(image_data_direct_get);
    ORD(image_data_preload_request);
    ORD(image_data_preload_cancel);
    ORD(image_alpha_set);
index 1544c5b..e34463c 100644 (file)
@@ -1067,14 +1067,16 @@ eng_image_file_colorspace_get(void *data EINA_UNUSED, void *image)
    return im->cache_entry.space;
 }
 
-static void *
-eng_image_data_direct(void *data EINA_UNUSED, void *image, Evas_Colorspace *cspace)
+static Eina_Bool
+eng_image_data_direct_get(void *data EINA_UNUSED, void *image, int plane, Eina_Slice *slice, Evas_Colorspace *cspace)
 {
    RGBA_Image *im = image;
 
-   if (!im) return NULL;
+   if (!slice || !im)
+     return EINA_FALSE;
+
    if (cspace) *cspace = im->cache_entry.space;
-   return im->image.data;
+   return _evas_common_rgba_image_plane_get(im, plane, slice);
 }
 
 static void
@@ -4432,7 +4434,7 @@ static Evas_Func func =
      eng_image_dirty_region,
      eng_image_data_get,
      eng_image_data_put,
-     eng_image_data_direct,
+     eng_image_data_direct_get,
      eng_image_data_preload_request,
      eng_image_data_preload_cancel,
      eng_image_alpha_set,