forked from enlightenment/efl
Implement extra operations for image.
I tried to get those right, but I'd like someone else to review these. SVN revision: 31150
This commit is contained in:
parent
25acab7a37
commit
06c6b24a3e
|
@ -10,6 +10,11 @@
|
|||
*****
|
||||
*/
|
||||
|
||||
#define NOT_IMPLEMENTED() \
|
||||
fprintf(stderr, "NOT_IMPLEMENTED: %s() at %s:%d\n", \
|
||||
__FUNCTION__, __FILE__, __LINE__)
|
||||
|
||||
|
||||
static int cpunum = 0;
|
||||
|
||||
static void *
|
||||
|
@ -149,6 +154,7 @@ eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w
|
|||
static void
|
||||
eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2, int y2)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_line_draw(surface, context, x1, y1, x2, y2);
|
||||
// evas_common_cpu_end_opt();
|
||||
}
|
||||
|
@ -156,6 +162,7 @@ eng_line_draw(void *data, void *context, void *surface, int x1, int y1, int x2,
|
|||
static void *
|
||||
eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
return NULL;
|
||||
// return evas_common_polygon_point_add(polygon, x, y);
|
||||
}
|
||||
|
@ -163,6 +170,7 @@ eng_polygon_point_add(void *data, void *context, void *polygon, int x, int y)
|
|||
static void *
|
||||
eng_polygon_points_clear(void *data, void *context, void *polygon)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
return NULL;
|
||||
// return evas_common_polygon_points_clear(polygon);
|
||||
}
|
||||
|
@ -170,6 +178,7 @@ eng_polygon_points_clear(void *data, void *context, void *polygon)
|
|||
static void
|
||||
eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_polygon_draw(surface, context, polygon);
|
||||
// evas_common_cpu_end_opt();
|
||||
}
|
||||
|
@ -177,6 +186,7 @@ eng_polygon_draw(void *data, void *context, void *surface, void *polygon)
|
|||
static void *
|
||||
eng_gradient_new(void *data)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
return NULL;
|
||||
// return evas_common_gradient_new();
|
||||
}
|
||||
|
@ -184,84 +194,98 @@ eng_gradient_new(void *data)
|
|||
static void
|
||||
eng_gradient_free(void *data, void *gradient)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_free(gradient);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_color_stop_add(void *data, void *gradient, int r, int g, int b, int a, int delta)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_color_stop_add(gradient, r, g, b, a, delta);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_alpha_stop_add(void *data, void *gradient, int a, int delta)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_alpha_stop_add(gradient, a, delta);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_color_data_set(void *data, void *gradient, void *map, int len, int has_alpha)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_color_data_set(gradient, map, len, has_alpha);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_alpha_data_set(void *data, void *gradient, void *alpha_map, int len)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_alpha_data_set(gradient, alpha_map, len);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_clear(void *data, void *gradient)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_clear(gradient);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_fill_set(void *data, void *gradient, int x, int y, int w, int h)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_fill_set(gradient, x, y, w, h);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_fill_angle_set(void *data, void *gradient, double angle)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_fill_angle_set(gradient, angle);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_fill_spread_set(void *data, void *gradient, int spread)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_fill_spread_set(gradient, spread);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_angle_set(void *data, void *gradient, double angle)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_map_angle_set(gradient, angle);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_offset_set(void *data, void *gradient, float offset)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_map_offset_set(gradient, offset);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_direction_set(void *data, void *gradient, int direction)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_map_direction_set(gradient, direction);
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_type_set(void *data, void *gradient, char *name, char *params)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
// evas_common_gradient_type_set(gradient, name, params);
|
||||
}
|
||||
|
||||
static int
|
||||
eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y, int w, int h)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
return 0;
|
||||
// RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
|
||||
// RGBA_Gradient *gr = (RGBA_Gradient *)gradient;
|
||||
|
@ -274,6 +298,7 @@ eng_gradient_is_opaque(void *data, void *context, void *gradient, int x, int y,
|
|||
static int
|
||||
eng_gradient_is_visible(void *data, void *context, void *gradient, int x, int y, int w, int h)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
return 0;
|
||||
// RGBA_Draw_Context *dc = (RGBA_Draw_Context *)context;
|
||||
//
|
||||
|
@ -292,11 +317,13 @@ eng_gradient_render_pre(void *data, void *context, void *gradient)
|
|||
// gr->type.geometer->geom_set(gr);
|
||||
// len = gr->type.geometer->get_map_len(gr);
|
||||
// evas_common_gradient_map(dc, gr, len);
|
||||
NOT_IMPLEMENTED();
|
||||
}
|
||||
|
||||
static void
|
||||
eng_gradient_render_post(void *data, void *gradient)
|
||||
{
|
||||
NOT_IMPLEMENTED();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -304,13 +331,14 @@ eng_gradient_draw(void *data, void *context, void *surface, void *gradient, int
|
|||
{
|
||||
// evas_common_gradient_draw(surface, context, x, y, w, h, gradient);
|
||||
// evas_common_cpu_end_opt();
|
||||
NOT_IMPLEMENTED();
|
||||
}
|
||||
|
||||
static int
|
||||
eng_image_alpha_get(void *data, void *image)
|
||||
{
|
||||
Soft16_Image *im;
|
||||
|
||||
|
||||
if (!image) return 0;
|
||||
im = image;
|
||||
if (im->have_alpha) return 1;
|
||||
|
@ -324,9 +352,11 @@ eng_image_colorspace_get(void *data, void *image)
|
|||
}
|
||||
|
||||
static void *
|
||||
eng_image_alpha_set(void *data, void *image, int has_alpha)
|
||||
eng_image_alpha_set(void *data, void *image, int have_alpha)
|
||||
{
|
||||
// FIXME: implement
|
||||
if (!image) return NULL;
|
||||
have_alpha = !!have_alpha;
|
||||
soft16_image_alpha_set(image, have_alpha);
|
||||
return image;
|
||||
}
|
||||
|
||||
|
@ -356,7 +386,7 @@ eng_image_format_get(void *data, void *image)
|
|||
static void
|
||||
eng_image_colorspace_set(void *data, void *image, int cspace)
|
||||
{
|
||||
// FIXME: implement
|
||||
NOT_IMPLEMENTED();
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -379,15 +409,25 @@ eng_image_load(void *data, const char *file, const char *key, int *error, Evas_I
|
|||
static void *
|
||||
eng_image_new_from_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
|
||||
{
|
||||
// FIXME: implement
|
||||
return NULL;
|
||||
if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P))
|
||||
{
|
||||
fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n",
|
||||
cspace, __FUNCTION__, __FILE__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
return soft16_image_new(w, h, -1, alpha, (DATA16 *)image_data, 0);
|
||||
}
|
||||
|
||||
static void *
|
||||
eng_image_new_from_copied_data(void *data, int w, int h, DATA32 *image_data, int alpha, int cspace)
|
||||
{
|
||||
// FIXME: implement
|
||||
return NULL;
|
||||
if ((image_data) && (cspace != EVAS_COLORSPACE_RGB565_A5P))
|
||||
{
|
||||
fprintf(stderr, "Unsupported colorspace %d in %s() (%s:%d)\n",
|
||||
cspace, __FUNCTION__, __FILE__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
return soft16_image_new(w, h, -1, alpha, (DATA16 *)image_data, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -412,8 +452,13 @@ eng_image_size_get(void *data, void *image, int *w, int *h)
|
|||
static void *
|
||||
eng_image_size_set(void *data, void *image, int w, int h)
|
||||
{
|
||||
// FIXME: implement
|
||||
return image;
|
||||
if (!image) return NULL;
|
||||
if ((w <= 0) || (h <= 0))
|
||||
{
|
||||
soft16_image_free(image);
|
||||
return NULL;
|
||||
}
|
||||
return soft16_image_size_set(image, w, h);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -430,7 +475,8 @@ eng_image_stride_get(void *data, void *image, int *stride)
|
|||
static void *
|
||||
eng_image_dirty_region(void *data, void *image, int x, int y, int w, int h)
|
||||
{
|
||||
// FIXME: implement
|
||||
/* FIXME: is this required? */
|
||||
//NOT_IMPLEMENTED();
|
||||
return image;
|
||||
}
|
||||
|
||||
|
@ -469,8 +515,17 @@ eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data)
|
|||
static void *
|
||||
eng_image_data_put(void *data, void *image, DATA32 *image_data)
|
||||
{
|
||||
// FIXME: implement
|
||||
return image;
|
||||
Soft16_Image *old_im, *new_im;
|
||||
|
||||
if (!image) return NULL;
|
||||
|
||||
old_im = image;
|
||||
if ((DATA16 *)image_data == old_im->pixels) return old_im;
|
||||
|
||||
new_im = soft16_image_new(old_im->w, old_im->h, old_im->stride,
|
||||
old_im->have_alpha, (DATA16 *)image_data, 0);
|
||||
soft16_image_free(old_im);
|
||||
return new_im;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -805,10 +860,10 @@ module_close(void)
|
|||
{
|
||||
}
|
||||
|
||||
EAPI Evas_Module_Api evas_modapi =
|
||||
EAPI Evas_Module_Api evas_modapi =
|
||||
{
|
||||
EVAS_MODULE_API_VERSION,
|
||||
EVAS_MODULE_TYPE_ENGINE,
|
||||
"software_16",
|
||||
"none"
|
||||
EVAS_MODULE_API_VERSION,
|
||||
EVAS_MODULE_TYPE_ENGINE,
|
||||
"software_16",
|
||||
"none"
|
||||
};
|
||||
|
|
|
@ -86,6 +86,9 @@ void soft16_image_free(Soft16_Image *im);
|
|||
Soft16_Image *soft16_image_load(const char *file, const char *key, int *error, Evas_Image_Load_Opts *lo);
|
||||
void soft16_image_load_data(Soft16_Image *im);
|
||||
void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, int src_region_x, int src_region_y, int src_region_w, int src_region_h, int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, int smooth);
|
||||
void soft16_image_alpha_set(Soft16_Image *im, int have_alpha);
|
||||
Soft16_Image *soft16_image_size_set(Soft16_Image *im, int w, int h);
|
||||
|
||||
|
||||
void soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Evas_Rectangle sr, const Evas_Rectangle dr, const Evas_Rectangle cr);
|
||||
void soft16_image_draw_scaled_sampled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, const Evas_Rectangle sr, const Evas_Rectangle dr, const Evas_Rectangle cr);
|
||||
|
|
|
@ -57,14 +57,20 @@ soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels,
|
|||
{
|
||||
Soft16_Image *im;
|
||||
|
||||
if (stride < 0) stride = _calc_stride(w);
|
||||
|
||||
im = soft16_image_alloc(w, h, stride, have_alpha, copy);
|
||||
if (!im) return NULL;
|
||||
|
||||
if (copy) memcpy(im->pixels, pixels, IMG_BYTE_SIZE(stride, h, have_alpha));
|
||||
else
|
||||
if (pixels)
|
||||
{
|
||||
im->pixels = pixels;
|
||||
if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h));
|
||||
if (copy)
|
||||
memcpy(im->pixels, pixels, IMG_BYTE_SIZE(stride, h, have_alpha));
|
||||
else
|
||||
{
|
||||
im->pixels = pixels;
|
||||
if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h));
|
||||
}
|
||||
}
|
||||
return im;
|
||||
}
|
||||
|
@ -442,3 +448,81 @@ soft16_image_draw(Soft16_Image *src, Soft16_Image *dst,
|
|||
dc->clip = clip_bkp;
|
||||
}
|
||||
|
||||
void
|
||||
soft16_image_alpha_set(Soft16_Image *im, int have_alpha)
|
||||
{
|
||||
if (im->have_alpha == have_alpha) return;
|
||||
im->have_alpha = have_alpha;
|
||||
|
||||
if ((im->pixels) && (im->free_pixels))
|
||||
{
|
||||
int size;
|
||||
|
||||
size = im->stride * im->h;
|
||||
if (!im->have_alpha)
|
||||
{
|
||||
im->pixels = realloc(im->pixels, size * 2);
|
||||
im->alpha = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
im->pixels = realloc(im->pixels, size * 3);
|
||||
im->alpha = (DATA8*)(im->pixels + size);
|
||||
memset(im->alpha, 0x1f, size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Soft16_Image *
|
||||
soft16_image_size_set(Soft16_Image *old_im, int w, int h)
|
||||
{
|
||||
Soft16_Image *new_im;
|
||||
DATA16 *dp, *sp;
|
||||
int i, cw, ch, ew;
|
||||
|
||||
if ((old_im->w == w) && (old_im->h == h)) return old_im;
|
||||
|
||||
new_im = soft16_image_new(w, h, -1, old_im->have_alpha, NULL, 1);
|
||||
|
||||
if (old_im->w < new_im->w)
|
||||
cw = old_im->w;
|
||||
else
|
||||
cw = new_im->w;
|
||||
|
||||
ew = new_im->w - cw;
|
||||
|
||||
if (old_im->h < new_im->h)
|
||||
ch = old_im->h;
|
||||
else
|
||||
ch = new_im->h;
|
||||
|
||||
dp = new_im->pixels;
|
||||
sp = old_im->pixels;
|
||||
for (i = 0; i < ch; i++)
|
||||
{
|
||||
memcpy(dp, sp, cw * sizeof(DATA16));
|
||||
if (ew > 0) memset(dp, 0, ew * sizeof(DATA16));
|
||||
|
||||
dp += new_im->stride;
|
||||
sp += old_im->stride;
|
||||
}
|
||||
|
||||
if (old_im->have_alpha)
|
||||
{
|
||||
DATA8 *dp, *sp;
|
||||
|
||||
dp = new_im->alpha;
|
||||
sp = old_im->alpha;
|
||||
for (i = 0; i < ch; i++)
|
||||
{
|
||||
memcpy(dp, sp, cw * sizeof(DATA8));
|
||||
if (ew > 0) memset(dp, 0, ew * sizeof(DATA8));
|
||||
|
||||
dp += new_im->stride;
|
||||
sp += old_im->stride;
|
||||
}
|
||||
}
|
||||
|
||||
soft16_image_free(old_im);
|
||||
return new_im;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue