evas: Change internal function image_data_direct

This commit is contained in:
Jean-Philippe Andre 2016-09-02 17:55:33 +09:00
parent 69132b5c1d
commit 2f737e8f3b
7 changed files with 176 additions and 32 deletions

View 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

View 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;

View 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);

View 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)
{

View 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);

View 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);

View 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,