diff --git a/legacy/evas/src/modules/engines/software_16/evas_engine.c b/legacy/evas/src/modules/engines/software_16/evas_engine.c index 9269dfad04..fd546d2fa4 100644 --- a/legacy/evas/src/modules/engines/software_16/evas_engine.c +++ b/legacy/evas/src/modules/engines/software_16/evas_engine.c @@ -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" }; diff --git a/legacy/evas/src/modules/engines/software_16/evas_soft16.h b/legacy/evas/src/modules/engines/software_16/evas_soft16.h index 3357f9c400..745290f810 100644 --- a/legacy/evas/src/modules/engines/software_16/evas_soft16.h +++ b/legacy/evas/src/modules/engines/software_16/evas_soft16.h @@ -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); diff --git a/legacy/evas/src/modules/engines/software_16/evas_soft16_main.c b/legacy/evas/src/modules/engines/software_16/evas_soft16_main.c index 89eb70d42d..3301dc89f9 100644 --- a/legacy/evas/src/modules/engines/software_16/evas_soft16_main.c +++ b/legacy/evas/src/modules/engines/software_16/evas_soft16_main.c @@ -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; +}