forked from enlightenment/efl
evas: Change internal function image_data_direct
This commit is contained in:
parent
69132b5c1d
commit
2f737e8f3b
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue