From: Enlightenment C. <no...@cv...> - 2007-06-04 18:31:33
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/include Modified Files: evas_common.h Log Message: Add branch prediction fixes =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/include/evas_common.h,v retrieving revision 1.82 retrieving revision 1.83 diff -u -3 -r1.82 -r1.83 --- evas_common.h 3 Jun 2007 05:28:12 -0000 1.82 +++ evas_common.h 4 Jun 2007 18:31:30 -0000 1.83 @@ -69,6 +69,11 @@ // BROKEN in gcc 4 on amd64 //# pragma GCC visibility push(hidden) # endif +#define LIKELY(x) __builtin_expect(!!(x), 1) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define LIKELY(x) (x) +#define UNLIKELY(x) (x) #endif /*****************************************************************************/ |
From: Enlightenment C. <no...@cv...> - 2007-06-04 18:32:02
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_render.c Log Message: Add branch prediction fixes =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_render.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -3 -r1.23 -r1.24 --- evas_render.c 22 Jan 2007 12:44:57 -0000 1.23 +++ evas_render.c 4 Jun 2007 18:31:30 -0000 1.24 @@ -265,13 +265,13 @@ Evas_Object *obj; obj = (Evas_Object *)(ll->data); - if (evas_object_is_opaque(obj) && - evas_object_is_visible(obj) && - (!obj->clip.clipees) && - (obj->cur.visible) && - (!obj->delete_me) && - (obj->cur.cache.clip.visible) && - (!obj->smart.smart)) + if (UNLIKELY(evas_object_is_opaque(obj) && + evas_object_is_visible(obj) && + (!obj->clip.clipees) && + (obj->cur.visible) && + (!obj->delete_me) && + (obj->cur.cache.clip.visible) && + (!obj->smart.smart))) obscuring_objects = evas_list_append(obscuring_objects, obj); } /* save this list */ |
From: Enlightenment C. <no...@cv...> - 2007-06-04 18:32:58
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/include Modified Files: evas_common.h Log Message: Use memory pool for rect_node_t =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/include/evas_common.h,v retrieving revision 1.83 retrieving revision 1.84 diff -u -3 -r1.83 -r1.84 --- evas_common.h 4 Jun 2007 18:31:30 -0000 1.83 +++ evas_common.h 4 Jun 2007 18:32:57 -0000 1.84 @@ -571,6 +571,10 @@ struct rect rect; }; +void rect_list_node_pool_set_max(int max); +void rect_list_node_pool_flush(void); +list_node_t *rect_list_node_pool_get(void); +void rect_list_node_pool_put(list_node_t *node); void rect_init(rect_t *r, int x, int y, int w, int h); void rect_list_append_node(list_t *rects, list_node_t *node); |
From: Enlightenment C. <no...@cv...> - 2007-06-04 18:32:58
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/engines/common Modified Files: evas_tiler.c Log Message: Use memory pool for rect_node_t =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/engines/common/evas_tiler.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- evas_tiler.c 4 Jun 2007 09:48:28 -0000 1.13 +++ evas_tiler.c 4 Jun 2007 18:32:57 -0000 1.14 @@ -5,6 +5,81 @@ static const list_node_t list_node_zeroed = {.next = NULL}; static const list_t list_zeroed = {.head = NULL, .tail = NULL}; + +typedef struct list_node_pool +{ + list_node_t *node; + int len; + int max; +} list_node_pool_t; + +static list_node_pool_t list_node_pool = { + .node = NULL, .len = 0, .max = 1024 +}; + +void +rect_list_node_pool_set_max(int max) +{ + int diff; + + diff = list_node_pool.len - max; + for (; diff > 0 && list_node_pool.node != NULL; diff--) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + free(node); + } + + list_node_pool.max = max; +} + +void +rect_list_node_pool_flush(void) +{ + while (list_node_pool.node) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + free(node); + } +} + +inline list_node_t * +rect_list_node_pool_get(void) +{ + if (list_node_pool.node) + { + list_node_t *node; + + node = list_node_pool.node; + list_node_pool.node = node->next; + list_node_pool.len--; + + return node; + } + else return malloc(sizeof(rect_node_t)); +} + +inline void +rect_list_node_pool_put(list_node_t *node) +{ + if (list_node_pool.len < list_node_pool.max) + { + node->next = list_node_pool.node; + list_node_pool.node = node; + list_node_pool.len++; + } + else free(node); +} + inline void rect_init(rect_t *r, int x, int y, int w, int h) { @@ -73,7 +148,7 @@ { rect_node_t *rect_node; - rect_node = malloc(sizeof(rect_node_t)); + rect_node = (rect_node_t *)rect_list_node_pool_get(); rect_node->rect = r; rect_node->_lst = list_node_zeroed; @@ -135,7 +210,7 @@ list_node_t *node; node = rect_list_unlink_next(rects, parent_node); - free(node); + rect_list_node_pool_put(node); } void @@ -149,7 +224,7 @@ list_node_t *aux; aux = node->next; - free(node); + rect_list_node_pool_put(node); node = aux; } *rects = list_zeroed; @@ -654,8 +729,8 @@ } } - if (keep_dirty) rect_list_append_node(rects, d_node); - else free(d_node); + if (UNLIKELY(keep_dirty)) rect_list_append_node(rects, d_node); + else rect_list_node_pool_put(d_node); } return old_last; @@ -844,7 +919,7 @@ h += 2; h >>= 1; - rn = malloc(sizeof(rect_node_t)); + rn = (rect_node_t *)rect_list_node_pool_get(); rn->_lst = list_node_zeroed; rect_init(&rn->rect, x, y, w, h); //fprintf(stderr, "ACCOUNTING: add_redraw: %4d,%4d %3dx%3d\n", x, y, w, h); |
From: Enlightenment C. <no...@cv...> - 2007-06-05 03:30:14
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/engines/common Modified Files: evas_tiler.c Log Message: Be polite and flush cache when tilebuf is free()d. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/engines/common/evas_tiler.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -3 -r1.14 -r1.15 --- evas_tiler.c 4 Jun 2007 18:32:57 -0000 1.14 +++ evas_tiler.c 5 Jun 2007 03:30:05 -0000 1.15 @@ -881,6 +881,7 @@ evas_common_regionbuf_free(tb->rb); #elif defined(EVAS_RECT_SPLIT) rect_list_clear(&tb->rects); + rect_list_node_pool_flush(); #else if (tb->tiles.tiles) free(tb->tiles.tiles); #endif |
From: Enlightenment C. <no...@cv...> - 2007-06-08 00:03:59
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/engines/common Modified Files: evas_tiler.c Log Message: Restrict rectangles to be inside the screen at evas_tiler =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/engines/common/evas_tiler.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -3 -r1.15 -r1.16 --- evas_tiler.c 5 Jun 2007 03:30:05 -0000 1.15 +++ evas_tiler.c 8 Jun 2007 00:03:56 -0000 1.16 @@ -1115,23 +1115,31 @@ for (n = tb->rects.head; n != NULL; n = n->next) { rect_t cur; - Tilebuf_Rect *r; cur = ((rect_node_t *)n)->rect; - r = malloc(sizeof(Tilebuf_Rect)); - r->_list_data.next = NULL; - r->_list_data.prev = NULL; - r->_list_data.last = NULL; - r->x = cur.left << 1; - r->y = cur.top << 1; - r->w = cur.width << 1; - r->h = cur.height << 1; + cur.left <<= 1; + cur.top <<= 1; + cur.width <<= 1; + cur.height <<= 1; -/* fprintf(stderr, "\tclear: %4d,%4d %3dx%3d\n", */ -/* r->x, r->y, r->w, r->h); */ + RECTS_CLIP_TO_RECT(cur.left, cur.top, cur.width, cur.height, + 0, 0, tb->outbuf_w, tb->outbuf_h); + if ((cur.width > 0) && (cur.height > 0)) + { + Tilebuf_Rect *r; - rects = evas_object_list_append(rects, r); + r = malloc(sizeof(Tilebuf_Rect)); + r->_list_data.next = NULL; + r->_list_data.prev = NULL; + r->_list_data.last = NULL; + r->x = cur.left; + r->y = cur.top; + r->w = cur.width; + r->h = cur.height; + + rects = evas_object_list_append(rects, r); + } } return rects; |
From: Enlightenment C. <no...@cv...> - 2007-06-18 16:47:39
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16_x11 Modified Files: evas_engine.c Log Message: Use a single XShmImage and XShmPutImage with clip region. By using a single XShmImage we avoid round trips to X and avoid having kernel to allocate (and zero) memory on every redraw. This also enable us to issue a single XShmPutImage() with the whole XShmImage just by using X Region and setting it as clip on Graphics Context (GC). On Nokia N800, expedite gains is about 10fps, while my other test with fewer objects (and thus drawing areas) I could go from 50fps to 160fps. Drawback is that we hold XShmImage until evas is resized or destroyed, we need a new API to flush engine memory so when it is idle for time we flush this memory, but it is kept alive during animations. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16_x11/evas_engine.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine.c 17 Jun 2007 02:56:58 -0000 1.2 +++ evas_engine.c 18 Jun 2007 16:47:36 -0000 1.3 @@ -20,6 +20,7 @@ Tilebuf_Rect *rects; Tilebuf_Rect *cur_rect; X_Output_Buffer *shbuf; + Region clip_rects; unsigned char end : 1; unsigned char shm : 1; }; @@ -143,6 +144,8 @@ Render_Engine *re; re = (Render_Engine *)data; + if (re->shbuf) evas_software_x11_x_output_buffer_free(re->shbuf, 0); + if (re->clip_rects) XDestroyRegion(re->clip_rects); if (re->gc) XFreeGC(re->disp, re->gc); if (re->tb) evas_common_tilebuf_free(re->tb); if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); @@ -158,12 +161,25 @@ Render_Engine *re; re = (Render_Engine *)data; + + if ((re->w == w) && (re->h == h)) return; + evas_common_tilebuf_free(re->tb); re->w = w; re->h = h; re->tb = evas_common_tilebuf_new(w, h); if (re->tb) evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); + if (re->shbuf) + { + evas_software_x11_x_output_buffer_free(re->shbuf, 0); + re->shbuf = NULL; + } + if (re->clip_rects) + { + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } } static void @@ -206,48 +222,31 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, int *cx, int *cy, int *cw, int *ch) { Render_Engine *re; - Soft16_Image *surface = NULL; Tilebuf_Rect *rect; int ux, uy, uw, uh; re = (Render_Engine *)data; if (re->end) { - if (re->shbuf) - { - evas_software_x11_x_output_buffer_free(re->shbuf, 0); - re->shbuf = NULL; - } re->end = 0; return NULL; } if (!re->rects) { - int mw, mh; - - mw = 0; - mh = 0; re->rects = evas_common_tilebuf_get_render_rects(re->tb); + if (!re->rects) return NULL; + re->cur_rect = re->rects; - for (rect = re->cur_rect; rect; rect = (Tilebuf_Rect *)(rect->_list_data.next)) - { - if (rect->w > mw) mw = rect->w; - if (rect->h > mh) mh = rect->h; - } - if (re->rects) + if (!re->shbuf) re->shbuf = evas_software_x11_x_output_buffer_new (re->disp, DefaultVisual(re->disp, DefaultScreen(re->disp)), - DefaultDepth(re->disp, DefaultScreen(re->disp)), mw, mh, 1, NULL); + DefaultDepth(re->disp, DefaultScreen(re->disp)), + re->w, re->h, 1, NULL); } - if ((!re->cur_rect) || (!re->shbuf)) + if (!re->cur_rect) { if (re->rects) evas_common_tilebuf_free_render_rects(re->rects); re->rects = NULL; - if (re->shbuf) - { - evas_software_x11_x_output_buffer_free(re->shbuf, 0); - re->shbuf = NULL; - } return NULL; } rect = re->cur_rect; @@ -259,26 +258,28 @@ re->rects = NULL; re->end = 1; } - surface = re->shbuf; - surface->w = uw; - surface->h = uh; - *cx = 0; *cy = 0; *cw = uw; *ch = uh; + *cx = ux; *cy = uy; *cw = uw; *ch = uh; *x = ux; *y = uy; *w = uw; *h = uh; - return surface; + return &re->shbuf->im; } static void eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h) { Render_Engine *re; + XRectangle r; re = (Render_Engine *)data; - evas_software_x11_x_output_buffer_paste(surface, re->draw, re->gc, - x, y, w, h, 1); -// evas_software_x11_outbuf_push_updated_region(re->ob, surface, x, y, w, h); -// evas_software_x11_outbuf_free_region_for_update(re->ob, surface); -// evas_common_cpu_end_opt(); + + if (!re->clip_rects) + re->clip_rects = XCreateRegion(); + + r.x = x; + r.y = y; + r.width = w; + r.height = h; + XUnionRectWithRegion(&r, re->clip_rects, re->clip_rects); } static void @@ -287,9 +288,17 @@ Render_Engine *re; re = (Render_Engine *)data; - /* FIXME: later on defer the eng_output_redraws_next_update_push() until - * flush and keep a list */ -// evas_software_x11_outbuf_flush(re->ob); + if (re->clip_rects) + { + XSetRegion(re->disp, re->gc, re->clip_rects); + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } + else return; + + evas_software_x11_x_output_buffer_paste(re->shbuf, re->draw, re->gc, + 0, 0, re->w, re->h, 0); + XSetClipMask(re->disp, re->gc, None); } static void |
From: Enlightenment C. <no...@cv...> - 2007-06-18 16:48:37
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_main.c Log Message: Clean up and optimize, step 1: unscaled operations. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_main.c 29 Apr 2007 15:45:40 -0000 1.1 +++ evas_soft16_main.c 18 Jun 2007 16:48:34 -0000 1.2 @@ -2,82 +2,135 @@ #include "evas_private.h" #include "evas_soft16.h" -#define BLEND(s, a, d) \ - { DATA32 wsp, wdp; \ - wsp = (*s | (*s << 16)) & 0x07e0f81f; \ - wdp = (*d | (*d << 16)) & 0x07e0f81f; \ - wdp = (((wdp * (32 - *a)) >> 5) & 0x07e0f81f) + wsp; \ - *d = wdp | (wdp >> 16); \ - } +#define RGB_565_UNPACKED_MASK 0x07e0f81f +#define RGB_565_UNPACK(rgb) \ + (((rgb) | ((rgb) << 16)) & RGB_565_UNPACKED_MASK) +#define RGB_565_PACK(rgb) \ + ((((rgb) & RGB_565_UNPACKED_MASK) | \ + ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff) +#define RGB_565_UNPACKED_BLEND(a, b, alpha) \ + ((b) + ((((a) - (b)) * (alpha)) >> 5)) + +#define RGB_565_FROM_COMPONENTS(r, g, b) \ + (((((r) >> 3) & 0x1f) << 11) | \ + ((((g) >> 2) & 0x3f) << 5) | \ + (((b) >> 3) & 0x1f)) + +#if defined(__ARMEL__) +/* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ +#define pld(addr, off) \ + __asm__("pld [%[address], %[offset]]":: \ + [address] "r" (addr), [offset] "i" (off)) +#else +#define pld(addr, off) +#endif /* __ARMEL__ */ -typedef void (*Scanline_Func) (DATA16 *s, DATA8 *a, DATA8 *m, DATA32 c, DATA16 *d, int l); -static void -_soft16_image_rgba32_import(Soft16_Image *im, DATA32 *src); -static void -_soft16_image_draw_sampled_int(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); -static void -_soft16_scanline_blend(DATA16 *s, DATA8 *a, DATA8 *m, DATA32 c, DATA16 *d, int l); -static void -_soft16_scanline_copy(DATA16 *s, DATA8 *a, DATA8 *m, DATA32 c, DATA16 *d, int l); +#define IMG_BYTE_SIZE(stride, height, has_alpha) \ + ((stride) * (height) * (!(has_alpha) ? 2 : 3)) + + +static inline void _soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size); +static inline void _soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size); + static Evas_Hash *_soft16_image_cache_hash = NULL; -Soft16_Image * -soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, int copy) +static inline int +_calc_stride(int w) +{ + int pad; + + pad = w % 4; + if (!pad) return w; + else return w + 4 - pad; +} + +static void +soft16_image_alloc_pixels(Soft16_Image *im) +{ + if (im->pixels) return; + + im->pixels = malloc(IMG_BYTE_SIZE(im->stride, im->h, im->have_alpha)); + if (!im->pixels) return; + if (im->have_alpha) im->alpha = (DATA8 *)(im->pixels + (im->stride * im->h)); + im->free_pixels = 1; +} + +static Soft16_Image * +soft16_image_alloc(int w, int h, int stride, int have_alpha, int have_pixels) { Soft16_Image *im; - + im = calloc(1, sizeof(Soft16_Image)); if (!im) return NULL; + im->w = w; im->h = h; - im->stride = w; - if (copy) + im->stride = stride; + im->have_alpha = have_alpha; + im->references = 1; + if (!have_pixels) return im; + + soft16_image_alloc_pixels(im); + if (!im->pixels) { - if (have_alpha) - { - im->pixels = malloc((im->stride * im->h * sizeof(DATA16)) + - (im->stride * im->h * sizeof(DATA8))); - if (!im->pixels) - { - free(im); - return NULL; - } - im->alpha = (DATA8 *)(im->pixels + (im->stride * im->h)); - if (pixels) - memcpy(im->pixels, pixels, - (im->stride * im->h * sizeof(DATA16)) + - (im->stride * im->h * sizeof(DATA8))); - } - else - { - im->pixels = malloc(im->stride * im->h * sizeof(DATA16)); - if (!im->pixels) - { - free(im); - return NULL; - } - if (pixels) - memcpy(im->pixels, pixels, - im->stride * im->h * sizeof(DATA16)); - } - im->free_pixels = 1; + free(im); + return NULL; } + + return im; +} + +Soft16_Image * +soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, + int copy) +{ + Soft16_Image *im; + + 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 { im->pixels = pixels; - if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (im->stride * im->h)); + if (have_alpha) im->alpha = (DATA8 *)(im->pixels + (stride * h)); } - im->references = 1; return im; } +static void +soft16_image_cache_key(const Evas_Image_Load_Opts *lo, const char *key, + const char *file, char *buf, unsigned bufsize) +{ + if ((!lo) || + ((lo->scale_down_by == 0) && (lo->dpi == 0.0) && + ((lo->w == 0) || (lo->h == 0)))) + { + if (key) snprintf(buf, bufsize, "%s//://%s", file, key); + else strncpy(buf, file, bufsize); + } + else + { + if (key) + snprintf(buf, bufsize, "//@/%i/%1.5f/%ix%i//%s//://%s", + lo->scale_down_by, lo->dpi, lo->w, lo->h, + file, key); + else + snprintf(buf, bufsize, "//@/%i/%1.5f/%ix%i//%s", + lo->scale_down_by, lo->dpi, lo->w, lo->h, + file); + } +} + +static inline void +soft16_image_cache_key_from_img(const Soft16_Image *im, char *buf, + unsigned bufsize) +{ + soft16_image_cache_key(&im->lo, im->key, im->file, buf, bufsize); +} + void soft16_image_free(Soft16_Image *im) { @@ -87,26 +140,7 @@ if (im->file) { char buf[4096 + 1024]; - - if ((im->lo.scale_down_by == 0) && (im->lo.dpi == 0.0) && - ((im->lo.w == 0) || (im->lo.h == 0))) - { - if (im->key) - snprintf(buf, sizeof(buf), "%s//://%s", im->file, im->key); - else - snprintf(buf, sizeof(buf), "%s", im->file); - } - else - { - if (im->key) - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//%s//://%s", - im->lo.scale_down_by, im->lo.dpi, im->lo.w, im->lo.h, - im->file, im->key); - else - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//%s", - im->lo.scale_down_by, im->lo.dpi, im->lo.w, im->lo.h, - im->file); - } + soft16_image_cache_key_from_img(im, buf, sizeof(buf)); _soft16_image_cache_hash = evas_hash_del(_soft16_image_cache_hash, buf, im); } @@ -118,133 +152,129 @@ #define STAT_GAP 2 -Soft16_Image * -soft16_image_load(const char *file, const char *key, int *error, - Evas_Image_Load_Opts *lo) +static Soft16_Image * +soft16_image_cache_get(const char *cache_key) { Soft16_Image *im; - RGBA_Image *sim; - char buf[4096 + 1024]; - struct stat st; - static time_t laststat = 0; - time_t t, mt = 0; - *error = 0; - if (!(lo) || - ((lo->scale_down_by == 0) && (lo->dpi == 0.0) && - ((lo->w == 0) || (lo->h == 0)))) - { - if (key) - snprintf(buf, sizeof(buf), "%s//://%s", file, key); - else - snprintf(buf, sizeof(buf), "%s", file); - } - else - { - if (key) - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//%s//://%s", - lo->scale_down_by, lo->dpi, lo->w, lo->h, file, key); - else - snprintf(buf, sizeof(buf), "//@/%i/%1.5f/%ix%i//%s", - lo->scale_down_by, lo->dpi, lo->w, lo->h, file); - } - im = evas_hash_find(_soft16_image_cache_hash, buf); + im = evas_hash_find(_soft16_image_cache_hash, cache_key); if (im) { - if ((t - im->laststat) < STAT_GAP) - { - im->references++; - return im; - } - else + time_t t; + + t = time(NULL); + if ((t - im->laststat) > STAT_GAP) { - struct stat st; - - if (stat(file, &st) < 0) return NULL; - mt = st.st_mtime; - if (mt == im->timestamp) - { - im->laststat = t; - laststat = t; - im->references++; - return im; - } + struct stat st; + + if (stat(im->file, &st) < 0) return NULL; + if (st.st_mtime != im->timestamp) return NULL; + + im->laststat = t; } + im->references++; } + + return im; +} + +static Soft16_Image * +soft16_image_load_new(const char *file, const char *key, + Evas_Image_Load_Opts *lo) +{ + Soft16_Image *im; + RGBA_Image *sim; + int have_alpha; + sim = evas_common_load_image_from_file(file, key, lo); if (!sim) return NULL; - im = calloc(1, sizeof(Soft16_Image)); + + have_alpha = !!(sim->flags & RGBA_IMAGE_HAS_ALPHA); + im = soft16_image_alloc(sim->image->w, sim->image->h, + _calc_stride(sim->image->w), have_alpha, 0); if (!im) { evas_common_image_unref(sim); return NULL; } + im->source_im = sim; - im->w = im->source_im->image->w; - im->h = im->source_im->image->h; - im->stride = im->w; im->timestamp = im->source_im->timestamp; im->laststat = im->source_im->laststat; + if (lo) im->lo = *lo; if (file) im->file = evas_stringshare_add(file); if (key) im->key = evas_stringshare_add(key); - if (im->source_im->flags & RGBA_IMAGE_HAS_ALPHA) im->have_alpha = 1; - im->references = 1; - _soft16_image_cache_hash = evas_hash_add(_soft16_image_cache_hash, buf, im); + return im; } +Soft16_Image * +soft16_image_load(const char *file, const char *key, int *error, + Evas_Image_Load_Opts *lo) +{ + Soft16_Image *im; + char buf[4096 + 1024]; + + *error = 0; + soft16_image_cache_key(lo, key, file, buf, sizeof(buf)); + im = soft16_image_cache_get(buf); + if (im) return im; + + im = soft16_image_load_new(file, key, lo); + if (im) _soft16_image_cache_hash = evas_hash_add(_soft16_image_cache_hash, buf, im); + + return im; +} static void _soft16_image_rgba32_import(Soft16_Image *im, DATA32 *src) { - DATA32 *sp, r, g, b, a; - DATA16 *dp, *dpl; - DATA8 *da, *dal; - int x, y; - + DATA32 *sp; + DATA16 *dpl; + /* FIXME: dither and optimize */ sp = src; dpl = im->pixels; - dal = im->alpha; - if (dal) + if (im->alpha) { + DATA8 *dal; + dal = im->alpha; + int y; + for (y = 0; y < im->h; y++) { + DATA16 *dp, *dp_end; + DATA8 *da; + dp = dpl; + dp_end = dp + im->w; da = dal; - for (x = 0; x < im->w; x++) + + for (; dp < dp_end; da++, dp++, sp++) { - a = (A_VAL(sp) * 32) / 255; - r = (R_VAL(sp) >> 3); - g = (G_VAL(sp) >> 2); - b = (B_VAL(sp) >> 3); - /* FIXME: not sure about this yet - also need to check alpha is not letss that G when alpha is upscaled to 6bits */ - *da = a; /* scale 0-32 - yes, 1 over 5bits - makes bitshift math later work better */ - if ((*da << 1) < g) g--; - *dp = (r << 11) | (g << 5) | (b); - dp++; - da++; - sp++; + *da = A_VAL(sp) >> 3; + *dp = RGB_565_FROM_COMPONENTS(R_VAL(sp), G_VAL(sp), B_VAL(sp)); } + dpl += im->stride; dal += im->stride; } } else { + int y; + for (y = 0; y < im->h; y++) { + DATA16 *dp, *dp_end; + dp = dpl; - for (x = 0; x < im->w; x++) - { - *dp = - ((R_VAL(sp) >> 3) << 11) | - ((G_VAL(sp) >> 2) << 5 ) | - ((B_VAL(sp) >> 3) ); - dp++; - sp++; - } + dp_end = dp + im->w; + + for (; dp < dp_end; dp++, sp++) + *dp = RGB_565_FROM_COMPONENTS(R_VAL(sp), G_VAL(sp), B_VAL(sp)); + dpl += im->stride; } } @@ -256,258 +286,310 @@ if (!im) return; if (im->pixels) return; if (!im->source_im) return; - + evas_common_load_image_data_from_file(im->source_im); if (im->source_im->image->data) { - if (im->source_im->flags & RGBA_IMAGE_HAS_ALPHA) - { - im->pixels = malloc((im->stride * im->h * sizeof(DATA16)) + - (im->stride * im->h * sizeof(DATA8))); - if (!im->pixels) goto done; - im->alpha = (DATA8 *)(im->pixels + (im->stride * im->h)); - } - else - { - im->pixels = malloc(im->stride * im->h * sizeof(DATA16)); - if (!im->pixels) goto done; - } - _soft16_image_rgba32_import(im, im->source_im->image->data); - im->free_pixels = 1; + if (!im->pixels) soft16_image_alloc_pixels(im); + if (im->pixels) _soft16_image_rgba32_import(im, im->source_im->image->data); } - done: evas_common_image_unref(im->source_im); im->source_im = NULL; } -static void -_soft16_image_draw_sampled_int(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) +static inline void +_get_clip(const RGBA_Draw_Context *dc, const Soft16_Image *im, + Evas_Rectangle *clip) { - Scanline_Func func; - int x, y; - int *lin_ptr; - DATA16 *buf, *dptr; - DATA16 **row_ptr = NULL; - DATA16 *ptr, *dst_ptr, *src_data, *dst_data; - DATA8 *bufa, *daptr; - DATA8 **rowa_ptr = NULL; - DATA8 *aptr, *dsta_ptr, *srca_data, *dsta_data; - int dst_jump, dst_stride, src_stride; - int dst_clip_x, dst_clip_y, dst_clip_w, dst_clip_h; - int src_w, src_h, dst_w, dst_h; - - - if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->w, dst->h))) - return; - if (!(RECTS_INTERSECT(src_region_x, src_region_y, src_region_w, src_region_h, 0, 0, src->w, src->h))) - return; - - src_w = src->w; - src_h = src->h; - dst_w = dst->w; - dst_h = dst->h; - if (dc->clip.use) { - dst_clip_x = dc->clip.x; - dst_clip_y = dc->clip.y; - dst_clip_w = dc->clip.w; - dst_clip_h = dc->clip.h; - if (dst_clip_x < 0) - { - dst_clip_w += dst_clip_x; - dst_clip_x = 0; + clip->x = dc->clip.x; + clip->y = dc->clip.y; + clip->w = dc->clip.w; + clip->h = dc->clip.h; + if (clip->x < 0) + { + clip->w += clip->x; + clip->x = 0; } - if (dst_clip_y < 0) + if (clip->y < 0) { - dst_clip_h += dst_clip_y; - dst_clip_y = 0; + clip->h += clip->y; + clip->y = 0; } - if ((dst_clip_x + dst_clip_w) > dst_w) - dst_clip_w = dst_w - dst_clip_x; - if ((dst_clip_y + dst_clip_h) > dst_h) - dst_clip_h = dst_h - dst_clip_y; + if ((clip->x + clip->w) > im->w) clip->w = im->w - clip->x; + if ((clip->y + clip->h) > im->h) clip->h = im->h - clip->y; } else { - dst_clip_x = 0; - dst_clip_y = 0; - dst_clip_w = dst_w; - dst_clip_h = dst_h; - } - - if (dst_clip_x < dst_region_x) - { - dst_clip_w += dst_clip_x - dst_region_x; - dst_clip_x = dst_region_x; - } - if ((dst_clip_x + dst_clip_w) > (dst_region_x + dst_region_w)) - dst_clip_w = dst_region_x + dst_region_w - dst_clip_x; - if (dst_clip_y < dst_region_y) - { - dst_clip_h += dst_clip_y - dst_region_y; - dst_clip_y = dst_region_y; - } - if ((dst_clip_y + dst_clip_h) > (dst_region_y + dst_region_h)) - dst_clip_h = dst_region_y + dst_region_h - dst_clip_y; - - if ((src_region_w <= 0) || (src_region_h <= 0) || - (dst_region_w <= 0) || (dst_region_h <= 0) || - (dst_clip_w <= 0) || (dst_clip_h <= 0)) - return; - - /* sanitise x */ - if (src_region_x < 0) - { - dst_region_x -= (src_region_x * dst_region_w) / src_region_w; - dst_region_w += (src_region_x * dst_region_w) / src_region_w; - src_region_w += src_region_x; - src_region_x = 0; + clip->x = 0; + clip->y = 0; + clip->w = im->w; + clip->h = im->h; } - if (src_region_x >= src_w) return; - if ((src_region_x + src_region_w) > src_w) +} + +static inline int +_is_empty_rectangle(const Evas_Rectangle *r) +{ + return (r->w < 1) || (r->h < 1); +} + +static inline void +_shrink(int *s_pos, int *s_size, int pos, int size) +{ + int d; + + d = (*s_pos) - pos; + if (d < 0) { - dst_region_w = (dst_region_w * (src_w - src_region_x)) / (src_region_w); - src_region_w = src_w - src_region_x; + (*s_size) += d; + (*s_pos) = pos; } - if (dst_region_w <= 0) return; - if (src_region_w <= 0) return; - if (dst_clip_x < 0) + + d = size + pos - (*s_pos); + if ((*s_size) > d) + (*s_size) = d; +} + +static int +_soft16_adjust_areas(Evas_Rectangle *src, + int src_max_x, int src_max_y, + Evas_Rectangle *dst, + int dst_max_x, int dst_max_y, + Evas_Rectangle *dst_clip) +{ + if (_is_empty_rectangle(src) || + _is_empty_rectangle(dst) || + _is_empty_rectangle(dst_clip)) + return 0; + + /* shrink clip */ + _shrink(&dst_clip->x, &dst_clip->w, dst->x, dst->w); + _shrink(&dst_clip->y, &dst_clip->h, dst->y, dst->h); + if (_is_empty_rectangle(dst_clip)) return 0; + + /* sanitise x */ + if (src->x < 0) { - dst_clip_w += dst_clip_x; - dst_clip_x = 0; + dst->x -= (src->x * dst->w) / src->w; + dst->w += (src->x * dst->w) / src->w; + src->w += src->x; + src->x = 0; } - if (dst_clip_w <= 0) return; - if (dst_clip_x >= dst_w) return; - if (dst_clip_x < dst_region_x) + if (src->x >= src_max_x) return 0; + if ((src->x + src->w) > src_max_x) { - dst_clip_w += (dst_clip_x - dst_region_x); - dst_clip_x = dst_region_x; + dst->w = (dst->w * (src_max_x - src->x)) / (src->w); + src->w = src_max_x - src->x; } - if ((dst_clip_x + dst_clip_w) > dst_w) + if (dst->w <= 0) return 0; + if (src->w <= 0) return 0; + if (dst_clip->x < 0) { - dst_clip_w = dst_w - dst_clip_x; + dst_clip->w += dst_clip->x; + dst_clip->x = 0; } - if (dst_clip_w <= 0) return; - + if (dst_clip->w <= 0) return 0; + if (dst_clip->x >= dst_max_x) return 0; + + _shrink(&dst_clip->x, &dst_clip->w, dst->x, dst_max_x); + if (dst_clip->w <= 0) return 0; + /* sanitise y */ - if (src_region_y < 0) + if (src->y < 0) { - dst_region_y -= (src_region_y * dst_region_h) / src_region_h; - dst_region_h += (src_region_y * dst_region_h) / src_region_h; - src_region_h += src_region_y; - src_region_y = 0; + dst->y -= (src->y * dst->h) / src->h; + dst->h += (src->y * dst->h) / src->h; + src->h += src->y; + src->y = 0; } - if (src_region_y >= src_h) return; - if ((src_region_y + src_region_h) > src_h) + if (src->y >= src_max_y) return 0; + if ((src->y + src->h) > src_max_y) { - dst_region_h = (dst_region_h * (src_h - src_region_y)) / (src_region_h); - src_region_h = src_h - src_region_y; + dst->h = (dst->h * (src_max_y - src->y)) / (src->h); + src->h = src_max_y - src->y; } - if (dst_region_h <= 0) return; - if (src_region_h <= 0) return; - if (dst_clip_y < 0) + if (dst->h <= 0) return 0; + if (src->h <= 0) return 0; + if (dst_clip->y < 0) { - dst_clip_h += dst_clip_y; - dst_clip_y = 0; + dst_clip->h += dst_clip->y; + dst_clip->y = 0; } - if (dst_clip_h <= 0) return; - if (dst_clip_y >= dst_h) return; - if (dst_clip_y < dst_region_y) + if (dst_clip->h <= 0) return 0; + if (dst_clip->y >= dst_max_y) return 0; + + _shrink(&dst_clip->y, &dst_clip->h, dst->y, dst_max_y); + if (dst_clip->h <= 0) return 0; + + return 1; +} + +static void +_soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int w, int h) +{ + DATA16 *src_itr, *dst_itr; + int y; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) { - dst_clip_h += (dst_clip_y - dst_region_y); - dst_clip_y = dst_region_y; + _soft16_scanline_blend_solid_solid(src_itr, dst_itr, w); + src_itr += src->stride; + dst_itr += dst->stride; } - if ((dst_clip_y + dst_clip_h) > dst_h) - { - dst_clip_h = dst_h - dst_clip_y; +} + +static void +_soft16_image_draw_unscaled_transp_solid(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int w, int h) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid(src_itr, alpha_itr, dst_itr, w); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; } - if (dst_clip_h <= 0) return; +} + +static 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) +{ + int src_offset_rows, src_offset, dst_offset; + + src_offset_rows = (cr.y - dr.y) + sr.y; + src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x; + + dst_offset = cr.x + (cr.y * dst->stride); + + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_unscaled_transp_solid(src, dst, dc, + src_offset, dst_offset, + cr.w, cr.h); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_unscaled_solid_solid(src, dst, dc, + src_offset, dst_offset, + cr.w, cr.h); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->have_alpha=%d, " + "dst->have_alpha=%d\n", + src->have_alpha, dst->have_alpha); +} + +static void +_soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + Evas_Rectangle sr, Evas_Rectangle dr) +{ + Evas_Rectangle cr; +/* Scanline_Func func; */ + int x, y; + int *lin_ptr; + DATA16 *buf, *dptr; + DATA16 **row_ptr = NULL; + DATA16 *ptr, *dst_ptr, *src_data, *dst_data; + DATA8 *bufa, *daptr; + DATA8 **rowa_ptr = NULL; + DATA8 *aptr, *dsta_ptr, *srca_data, *dsta_data; + + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) + return; + if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->w, src->h))) + return; + + _get_clip(dc, dst, &cr); + if (!_soft16_adjust_areas(&sr, src->w, src->h, &dr, dst->w, dst->h, &cr)) + return; src_data = src->pixels; srca_data = src->alpha; dst_data = dst->pixels; dsta_data = dst->alpha; - - dst_stride = dst->stride; - src_stride = src->stride; - + /* figure out dest start ptr */ - dst_ptr = dst_data + dst_clip_x + (dst_clip_y * dst_stride); - dsta_ptr = dsta_data + dst_clip_x + (dst_clip_y * dst_stride); + dst_ptr = dst_data + cr.x + (cr.y * dst->stride); + dsta_ptr = dsta_data + cr.x + (cr.y * dst->stride); - func = _soft16_scanline_copy; - if (( src->alpha) && ( dst->alpha)) func = _soft16_scanline_blend; - else if (( src->alpha) && (!dst->alpha)) func = _soft16_scanline_blend; - else if ((!src->alpha) && ( dst->alpha)) func = _soft16_scanline_copy; - else if ((!src->alpha) && (!dst->alpha)) func = _soft16_scanline_copy; +/* func = _soft16_scanline_copy; */ +/* if (( src->alpha) && ( dst->alpha)) func = _soft16_scanline_blend; */ +/* else if (( src->alpha) && (!dst->alpha)) func = _soft16_scanline_blend; */ +/* else if ((!src->alpha) && ( dst->alpha)) func = _soft16_scanline_copy; */ +/* else if ((!src->alpha) && (!dst->alpha)) func = _soft16_scanline_copy; */ /* not being scaled at all */ - if ((dst_region_w == src_region_w) && (dst_region_h == src_region_h)) - { - ptr = src_data + ((dst_clip_y - dst_region_y + src_region_y) * src_stride) + (dst_clip_x - dst_region_x) + src_region_x; - aptr = srca_data + ((dst_clip_y - dst_region_y + src_region_y) * src_stride) + (dst_clip_x - dst_region_x) + src_region_x; - for (y = 0; y < dst_clip_h; y++) - { - /* * blend here [clip_w *] ptr -> dst_ptr * */ - func(ptr, aptr, NULL, dc->mul.col, dst_ptr, dst_clip_w); - ptr += src_stride; - aptr += src_stride; - dst_ptr += dst_stride; - } - } + if ((dr.w == sr.w) && (dr.h == sr.h)) + _soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); +#if 0 else { /* allocate scale lookup tables */ - lin_ptr = alloca(dst_clip_w * sizeof(int)); - row_ptr = alloca(dst_clip_h * sizeof(DATA16 *)); - rowa_ptr = alloca(dst_clip_h * sizeof(DATA8 *)); + lin_ptr = alloca(cr.w * sizeof(int)); + row_ptr = alloca(cr.h * sizeof(DATA16 *)); + rowa_ptr = alloca(cr.h * sizeof(DATA8 *)); /* fill scale tables */ - for (x = 0; x < dst_clip_w; x++) - lin_ptr[x] = (((x + dst_clip_x - dst_region_x) * src_region_w) / dst_region_w) + src_region_x; - for (y = 0; y < dst_clip_h; y++) + for (x = 0; x < cr.w; x++) + lin_ptr[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; + for (y = 0; y < cr.h; y++) { row_ptr[y] = src_data + - (((((y + dst_clip_y - dst_region_y) * src_region_h) / - dst_region_h) + src_region_y) * src_stride); + (((((y + cr.y - dr.y) * sr.h) / + dr.h) + sr.y) * src->stride); rowa_ptr[y] = srca_data + - (((((y + dst_clip_y - dst_region_y) * src_region_h) / - dst_region_h) + src_region_y) * src_stride); + (((((y + cr.y - dr.y) * sr.h) / + dr.h) + sr.y) * src->stride); } /* scale to dst */ dptr = dst_ptr; daptr = dsta_ptr; if ((!(src->alpha)) && (!(dst->alpha)) && (!dc->mul.use)) { - for (y = 0; y < dst_clip_h; y++) + for (y = 0; y < cr.h; y++) { dst_ptr = dptr; - for (x = 0; x < dst_clip_w; x++) + for (x = 0; x < cr.w; x++) { ptr = row_ptr[y] + lin_ptr[x]; *dst_ptr = *ptr; dst_ptr++; } - dptr += dst_stride; + dptr += dst->stride; } } else { /* a scanline buffer */ - buf = alloca(dst_clip_w * sizeof(DATA16) * 2); + buf = alloca(cr.w * sizeof(DATA16) * 2); if (src->alpha) { - bufa = alloca(dst_clip_w * sizeof(DATA8) * 2); - for (y = 0; y < dst_clip_h; y++) + bufa = alloca(cr.w * sizeof(DATA8) * 2); + for (y = 0; y < cr.h; y++) { dst_ptr = dptr; - for (x = 0; x < dst_clip_w; x++) + for (x = 0; x < cr.w; x++) { ptr = row_ptr[y] + lin_ptr[x]; aptr = rowa_ptr[y] + lin_ptr[x]; @@ -517,7 +599,7 @@ /* dst_ptr = buf; dsta_ptr = bufa; - for (x = 0; x < dst_clip_w; x++) + for (x = 0; x < cr.w; x++) { ptr = row_ptr[y] + lin_ptr[x]; *dst_ptr = *ptr; @@ -527,17 +609,17 @@ *dsta_ptr = *aptr; dsta_ptr++; } - func(buf, bufa, NULL, dc->mul.col, dptr, dst_clip_w); + func(buf, bufa, NULL, dc->mul.col, dptr, cr.w); */ - dptr += dst_stride; + dptr += dst->stride; } } else { - for (y = 0; y < dst_clip_h; y++) + for (y = 0; y < cr.h; y++) { dst_ptr = dptr; - for (x = 0; x < dst_clip_w; x++) + for (x = 0; x < cr.w; x++) { ptr = row_ptr[y] + lin_ptr[x]; *dst_ptr = *ptr; @@ -545,19 +627,20 @@ } /* dst_ptr = buf; - for (x = 0; x < dst_clip_w; x++) + for (x = 0; x < cr.w; x++) { ptr = row_ptr[y] + lin_ptr[x]; *dst_ptr = *ptr; dst_ptr++; } - func(buf, NULL, NULL, dc->mul.col, dptr, dst_clip_w); + func(buf, NULL, NULL, dc->mul.col, dptr, cr.w); */ - dptr += dst_stride; + dptr += dst->stride; } } } } +#endif } void @@ -569,25 +652,38 @@ int dst_region_w, int dst_region_h, int smooth) { + Evas_Rectangle sr, dr; Cutout_Rects *rects; Cutout_Rect *r; - int c, cx, cy, cw, ch; - int i; + int c, cx, cy, cw, ch; + int i; + /* handle cutouts here! */ - - if ((dst_region_w <= 0) || (dst_region_h <= 0)) return; - if (!(RECTS_INTERSECT(dst_region_x, dst_region_y, dst_region_w, dst_region_h, 0, 0, dst->w, dst->h))) + dr.x = dst_region_x; + dr.y = dst_region_y; + dr.w = dst_region_w; + dr.h = dst_region_h; + + if (_is_empty_rectangle(&dr)) return; + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) return; + + sr.x = src_region_x; + sr.y = src_region_y; + sr.w = src_region_w; + sr.h = src_region_h; + + if (_is_empty_rectangle(&sr)) return; + if (!(RECTS_INTERSECT(sr.x, sr.y, sr.w, sr.h, 0, 0, src->w, src->h))) + return; + /* no cutouts - cut right to the chase */ if (!dc->cutout.rects) { - _soft16_image_draw_sampled_int(src, dst, dc, - src_region_x, src_region_y, - src_region_w, src_region_h, - dst_region_x, dst_region_y, - dst_region_w, dst_region_h); + _soft16_image_draw_sampled_int(src, dst, dc, sr, dr); return; } + /* save out clip info */ c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; evas_common_draw_context_clip_clip(dc, 0, 0, dst->w, dst->h); @@ -603,12 +699,7 @@ { r = rects->rects + i; evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); - _soft16_image_draw_sampled_int(src, dst, dc, - src_region_x, src_region_y, - src_region_w, src_region_h, - dst_region_x, dst_region_y, - dst_region_w, dst_region_h); - + _soft16_image_draw_sampled_int(src, dst, dc, sr, dr); } evas_common_draw_context_apply_clear_cutouts(rects); /* restore clip info */ @@ -616,126 +707,76 @@ } -static void -_soft16_scanline_blend(DATA16 *s, DATA8 *a, DATA8 *m, DATA32 c, DATA16 *d, int l) +static inline void +_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size) { - DATA16 *e = d + l; - DATA32 wsp, wdp; - DATA32 xsp, xdp; - DATA32 ysp, ydp; - DATA32 zsp, zdp; - -/* - if (((unsigned long)(((DATA8 *)s)) & 0x3) == - (((unsigned long)((DATA8 *)d)) & 0x3)) - { - if (((unsigned long)(((DATA8 *)s)) & 0x3) == 2) - { - wsp = (*s | (*s << 16)) & 0x07e0f81f; - wdp = (*d | (*d << 16)) & 0x07e0f81f; - wdp = (((wdp * (32 - *a)) >> 5) & 0x07e0f81f) + wsp; - *d = wdp | (wdp >> 16); - s++; a++; d++; - } - e -= 3; - while (d < e) - { - wsp = (s[0] | (s[0] << 16)) & 0x07e0f81f; - xsp = (s[1] | (s[1] << 16)) & 0x07e0f81f; - ysp = (s[2] | (s[2] << 16)) & 0x07e0f81f; - zsp = (s[3] | (s[3] << 16)) & 0x07e0f81f; - wdp = (d[0] | (d[0] << 16)) & 0x07e0f81f; - xdp = (d[1] | (d[1] << 16)) & 0x07e0f81f; - ydp = (d[2] | (d[2] << 16)) & 0x07e0f81f; - zdp = (d[3] | (d[3] << 16)) & 0x07e0f81f; - wdp = (((wdp * (32 - a[0])) >> 5) & 0x07e0f81f) + wsp; - xdp = (((xdp * (32 - a[1])) >> 5) & 0x07e0f81f) + xsp; - ydp = (((ydp * (32 - a[2])) >> 5) & 0x07e0f81f) + ysp; - zdp = (((zdp * (32 - a[3])) >> 5) & 0x07e0f81f) + zsp; - *((DATA32 *)d) = - ((xdp | (xdp >> 16)) << 16) | - ((wdp | (wdp >> 16)) & 0x0000ffff); - d += 2; - *((DATA32 *)d) = - ((zdp | (zdp >> 16)) << 16) | - ((ydp | (ydp >> 16)) & 0x0000ffff); - d += 2; - s += 4; a += 4; - } - e += 3; - while (d < e) - { - wsp = (*s | (*s << 16)) & 0x07e0f81f; - wdp = (*d | (*d << 16)) & 0x07e0f81f; - wdp = (((wdp * (32 - *a)) >> 5) & 0x07e0f81f) + wsp; - *d = wdp | (wdp >> 16); - s++; a++; d++; - } + DATA16 *start, *end; + + pld(alpha, 0); + pld(src, 0); + start = dst; + end = start + (size & ~7); + +#define BLEND(dst, src, alpha) \ + if (UNLIKELY(alpha == 31)) \ + (dst) = (src); \ + else if (alpha != 0) \ + { \ + DATA32 a, b; \ + a = RGB_565_UNPACK(src); \ + b = RGB_565_UNPACK(dst); \ + b = RGB_565_UNPACKED_BLEND(a, b, alpha); \ + dst = RGB_565_PACK(b); \ } - else - */ + + /* work on 8 pixels per time, do data preload */ + while (start < end) { - while (d < e) - { - wsp = (*s | (*s << 16)) & 0x07e0f81f; - wdp = (*d | (*d << 16)) & 0x07e0f81f; - wdp = (((wdp * (32 - *a)) >> 5) & 0x07e0f81f) + wsp; - *d = wdp | (wdp >> 16); - s++; a++; d++; - } + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + /* empirical tests show these give the best performance */ + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + BLEND(start[-8], src[-8], alpha1); + + alpha1 = alpha[-6]; + BLEND(start[-7], src[-7], alpha2); + + alpha2 = alpha[-5]; + BLEND(start[-6], src[-6], alpha1); + + alpha1 = alpha[-4]; + BLEND(start[-5], src[-5], alpha2); + + alpha2 = alpha[-3]; + BLEND(start[-4], src[-4], alpha1); + + alpha1 = alpha[-2]; + BLEND(start[-3], src[-3], alpha2); + + alpha2 = alpha[-1]; + BLEND(start[-2], src[-2], alpha1); + + BLEND(start[-1], src[-1], alpha2); } -} -//#define MEMCPY 1 -//#define SIMPLE 1 + /* remaining pixels (up to 7) */ + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + BLEND(*start, *src, *alpha); +#undef BLEND +} -static void -_soft16_scanline_copy(DATA16 *s, DATA8 *a, DATA8 *m, DATA32 c, DATA16 *d, int l) +static inline void +_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size) { -#ifdef MEMCPY - memcpy(d, s, l * sizeof(DATA16)); -#else - DATA16 *e = d + l; - -#ifdef SIMPLE - while (d < e) - { - *d = *s; - d++; - s++; - } -#else - if (((unsigned long)(((DATA8 *)s)) & 0x3) == - (((unsigned long)((DATA8 *)d)) & 0x3)) - { - if (((unsigned long)(((DATA8 *)s)) & 0x3) == 2) - { - *d = *s; - d++; - s++; - } - e -= 1; - while (d < e) - { - *((DATA32 *)d) = *((DATA32 *)s); - d += 2; - s += 2; - } - e += 1; - if (d < e) - { - *d = *s; - } - } - else - { - while (d < e) - { - *d = *s; - d++; - s++; - } - } -#endif -#endif + memcpy(dst, src, size * sizeof(DATA16)); } |
From: Enlightenment C. <no...@cv...> - 2007-06-18 16:50:39
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_engine.c evas_soft16.h evas_soft16_main.c Log Message: More image blend and rectangle. Image blend not supports alpha and colorization. Rectangle operations are now implemented. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_engine.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_engine.c 17 Jun 2007 02:56:58 -0000 1.2 +++ evas_engine.c 18 Jun 2007 16:50:37 -0000 1.3 @@ -143,8 +143,7 @@ static void eng_rectangle_draw(void *data, void *context, void *surface, int x, int y, int w, int h) { -// evas_common_rectangle_draw(surface, context, x, y, w, h); -// evas_common_cpu_end_opt(); + soft16_rectangle_draw(surface, context, x, y, w, h); } static void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16.h 29 Apr 2007 15:45:40 -0000 1.1 +++ evas_soft16.h 18 Jun 2007 16:50:37 -0000 1.2 @@ -40,6 +40,7 @@ int dst_region_x, int dst_region_y, int dst_region_w, int dst_region_h, int smooth); - - + +void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h); #endif =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16_main.c 18 Jun 2007 16:48:34 -0000 1.2 +++ evas_soft16_main.c 18 Jun 2007 16:50:37 -0000 1.3 @@ -16,6 +16,12 @@ ((((g) >> 2) & 0x3f) << 5) | \ (((b) >> 3) & 0x1f)) +#define UNROLL2(op...) op op +#define UNROLL4(op...) UNROLL2(op) UNROLL2(op) +#define UNROLL8(op...) UNROLL4(op) UNROLL4(op) +#define UNROLL16(op...) UNROLL8(op) UNROLL8(op) + + #if defined(__ARMEL__) /* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ #define pld(addr, off) \ @@ -33,6 +39,17 @@ static inline void _soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size); static inline void _soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size); +static inline void _soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha); +static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha); + +static inline void _soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); +static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); + +static inline void _soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b); +static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b); + +static inline void _soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565); +static inline void _soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha); static Evas_Hash *_soft16_image_cache_hash = NULL; @@ -470,6 +487,231 @@ } } +static inline void +_soft16_image_draw_unscaled_no_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_unscaled_transp_solid(src, dst, dc, + src_offset, dst_offset, + width, height); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_unscaled_solid_solid(src, dst, dc, + src_offset, dst_offset, + width, height); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITHOUT COLOR MUL\n", + src->have_alpha, dst->have_alpha); +} + +static void +_soft16_image_draw_unscaled_solid_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h) +{ + DATA16 *src_itr, *dst_itr; + int y, rel_alpha; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, + rel_alpha); + src_itr += src->stride; + dst_itr += dst->stride; + } +} + +static void +_soft16_image_draw_unscaled_transp_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y, rel_alpha; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr, + dst_itr, w, rel_alpha); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } +} + +static inline void +_soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_unscaled_transp_solid_mul_alpha + (src, dst, dc, src_offset, dst_offset, width, height); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_unscaled_solid_solid_mul_alpha + (src, dst, dc, src_offset, dst_offset, width, height); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH ALPHA MUL %d\n", + src->have_alpha, dst->have_alpha, A_VAL(&dc->mul.col)); +} + +static void +_soft16_image_draw_unscaled_solid_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h) +{ + DATA16 *src_itr, *dst_itr; + int y, rel_alpha, r, g, b; + + src_itr = src->pixels + src_offset; + dst_itr = dst->pixels + dst_offset; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + if (rel_alpha == 31) + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_color_solid + (src_itr, dst_itr, w, r, g, b); + src_itr += src->stride; + dst_itr += dst->stride; + } + else + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_solid_solid_mul_color_transp + (src_itr, dst_itr, w, rel_alpha, r, g, b); + src_itr += src->stride; + dst_itr += dst->stride; + } +} + +static void +_soft16_image_draw_unscaled_transp_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, + int dst_offset, + int w, int h) + +{ + DATA16 *src_itr, *dst_itr; + DATA8 *alpha_itr; + int y, rel_alpha, r, g, b; + + src_itr = src->pixels + src_offset; + alpha_itr = src->alpha + src_offset; + dst_itr = dst->pixels + dst_offset; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + if (rel_alpha == 0) + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_color_solid + (src_itr, alpha_itr, dst_itr, w, r, g, b); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } + else + for (y = 0; y < h; y++) + { + _soft16_scanline_blend_transp_solid_mul_color_transp + (src_itr, alpha_itr, dst_itr, w, rel_alpha, r, g, b); + src_itr += src->stride; + alpha_itr += src->stride; + dst_itr += dst->stride; + } +} + +static inline void +_soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_unscaled_transp_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_unscaled_solid_solid_mul_color + (src, dst, dc, src_offset, dst_offset, width, height); + else + fprintf(stderr, + "Unsupported draw of unscaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH COLOR MUL 0x%08x\n", + src->have_alpha, dst->have_alpha, dc->mul.col); +} + +static inline void +_soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int src_offset, int dst_offset, + int width, int height) +{ + if ((A_VAL(&dc->mul.col) == R_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == G_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == B_VAL(&dc->mul.col))) + _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset, + dst_offset, width, height); + else + _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset, + dst_offset, width, height); +} + static void _soft16_image_draw_unscaled(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, @@ -484,19 +726,12 @@ dst_offset = cr.x + (cr.y * dst->stride); - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_unscaled_transp_solid(src, dst, dc, - src_offset, dst_offset, - cr.w, cr.h); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_unscaled_solid_solid(src, dst, dc, - src_offset, dst_offset, - cr.w, cr.h); - else - fprintf(stderr, - "Unsupported draw of unscaled images src->have_alpha=%d, " - "dst->have_alpha=%d\n", - src->have_alpha, dst->have_alpha); + if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) + _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset, + cr.w, cr.h); + else if (dc->mul.col != 0x00000000) + _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset, + cr.w, cr.h); } static void @@ -706,17 +941,214 @@ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; } +static inline void +_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, + int offset, int w, int h) +{ + DATA16 *dst_itr, rgb565; + int i; + + dst_itr = dst->pixels + offset; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + + for (i = 0; i < h; i++, dst_itr += dst->stride) + _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); +} static inline void +_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, + int offset, int w, int h) +{ + char alpha; + + alpha = A_VAL(&dc->col.col) >> 3; + if (alpha == 31) _soft16_rectangle_draw_solid_solid(dst, dc, offset, w, h); + else if (alpha != 0) + { + DATA16 *dst_itr; + DATA32 rgb565; + int i; + + dst_itr = dst->pixels + offset; + rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), + G_VAL(&dc->col.col), + B_VAL(&dc->col.col)); + rgb565 = RGB_565_UNPACK(rgb565); + + for (i = 0; i < h; i++, dst_itr += dst->stride) + _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565, alpha); + } +} + +static void +_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc, + Evas_Rectangle dr) +{ + int dst_offset; + + if (_is_empty_rectangle(&dr)) return; + RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h); + if (_is_empty_rectangle(&dr)) return; + + if (dc->clip.use) + RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x, + dc->clip.y, dc->clip.w, dc->clip.h); + if (_is_empty_rectangle(&dr)) return; + if (A_VAL(&dc->col.col) == 0) return; + + dst_offset = dr.x + (dr.y * dst->w); + + if (!dst->have_alpha) + { + if (A_VAL(&dc->col.col) == 255) + _soft16_rectangle_draw_solid_solid + (dst, dc, dst_offset, dr.w, dr.h); + else + _soft16_rectangle_draw_transp_solid + (dst, dc, dst_offset, dr.w, dr.h); + } + else + fprintf(stderr, + "Unsupported feature: drawing rectangle to non-opaque " + "destination.\n"); +} + +void +soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, + int x, int y, int w, int h) +{ + Evas_Rectangle dr; + Cutout_Rects *rects; + Cutout_Rect *r; + int c, cx, cy, cw, ch; + int i; + + /* handle cutouts here! */ + dr.x = x; + dr.y = y; + dr.w = w; + dr.h = h; + + if (_is_empty_rectangle(&dr)) return; + if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) + return; + + /* no cutouts - cut right to the chase */ + if (!dc->cutout.rects) + { + _soft16_rectangle_draw_int(dst, dc, dr); + return; + } + + /* save out clip info */ + c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + evas_common_draw_context_clip_clip(dc, 0, 0, dst->w, dst->h); + evas_common_draw_context_clip_clip(dc, x, y, w, h); + /* our clip is 0 size.. abort */ + if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) + { + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + return; + } + rects = evas_common_draw_context_apply_cutouts(dc); + for (i = 0; i < rects->active; ++i) + { + r = rects->rects + i; + evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); + _soft16_rectangle_draw_int(dst, dc, dr); + } + evas_common_draw_context_apply_clear_cutouts(rects); + /* restore clip info */ + dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; +} + + +/***************************************************************************** + * Scanline processing + * + * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]() + * + ****************************************************************************/ + +/*********************************************************************** + * fill operations + */ +static inline void +_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565) +{ + DATA16 *start, *end; + DATA32 rgb565_double; + + start = dst; + end = start + (size & ~7); + + rgb565_double = (rgb565 << 16) | rgb565; + + while (start < end) + { + DATA32 *p = (DATA32 *)start; + + p[0] = rgb565_double; + p[1] = rgb565_double; + p[2] = rgb565_double; + p[3] = rgb565_double; + + start += 8; + } + + end = start + (size & 7); + for (; start < end; start++) + *start = rgb565; +} + +static inline void +_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha) +{ + DATA16 *start, *end; + DATA32 a; + + start = dst; + pld(start, 0); + end = start + (size & ~7); + + while (start < end) { + pld(start, 32); + UNROLL8({ + DATA32 b; + b = RGB_565_UNPACK(*start); + b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); + *start = RGB_565_PACK(b); + start++; + }); + } + + size &= 7; + + while (size--) { + DATA32 b; + b = RGB_565_UNPACK(*start); + b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); + *start = RGB_565_PACK(b); + start++; + } +} + +/*********************************************************************** + * Regular blend operations + */ +static inline void _soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size) { DATA16 *start, *end; - pld(alpha, 0); - pld(src, 0); start = dst; end = start + (size & ~7); + pld(alpha, 0); + pld(src, 0); + #define BLEND(dst, src, alpha) \ if (UNLIKELY(alpha == 31)) \ (dst) = (src); \ @@ -771,7 +1203,7 @@ /* remaining pixels (up to 7) */ end = start + (size & 7); for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); + BLEND(*start, *src, *alpha); #undef BLEND } @@ -779,4 +1211,328 @@ _soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size) { memcpy(dst, src, size * sizeof(DATA16)); +} + +/*********************************************************************** + * Blend operations taking an extra alpha (fade in, out) + */ +static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + +#define BLEND(dst, src, alpha) \ + if (alpha > rel_alpha) \ + { \ + DATA32 a, b; \ + a = RGB_565_UNPACK(src); \ + b = RGB_565_UNPACK(dst); \ + b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); \ + dst = RGB_565_PACK(b); \ + } + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + BLEND(start[-8], src[-8], alpha1); + + alpha1 = alpha[-6]; + BLEND(start[-7], src[-7], alpha2); + + alpha2 = alpha[-5]; + BLEND(start[-6], src[-6], alpha1); + + alpha1 = alpha[-4]; + BLEND(start[-5], src[-5], alpha2); + + alpha2 = alpha[-3]; + BLEND(start[-4], src[-4], alpha1); + + alpha1 = alpha[-2]; + BLEND(start[-3], src[-3], alpha2); + + alpha2 = alpha[-1]; + BLEND(start[-2], src[-2], alpha1); + + BLEND(start[-1], src[-1], alpha2); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + BLEND(*start, *src, *alpha); +#undef BLEND +} + +static inline void +_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + +#define BLEND(dst, src) \ + { \ + DATA32 a, b; \ + a = RGB_565_UNPACK(src); \ + b = RGB_565_UNPACK(dst); \ + b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); \ + dst = RGB_565_PACK(b); \ + } + + while (start < end) + { + pld(src, 32); + UNROLL8({ + BLEND(*start, *src); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + BLEND(*start, *src); +#undef BLEND +} + +/*********************************************************************** + * Blend operations with extra alpha and multiply color + */ +static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + + /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ +#define BLEND(dst, src, alpha) \ + if ((alpha) > rel_alpha) \ + { \ + short r1, g1, b1; \ + int rgb, d; \ + r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ + g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ + b1 = (((src) & 0x1f) * b) >> 8; \ + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ + d = RGB_565_UNPACK(dst); \ + d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); \ + dst = RGB_565_PACK(d); \ + } + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(src, 32); + pld(start, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + BLEND(start[-8], src[-8], alpha1); + + alpha1 = alpha[-6]; + BLEND(start[-7], src[-7], alpha2); + + alpha2 = alpha[-5]; + BLEND(start[-6], src[-6], alpha1); + + alpha1 = alpha[-4]; + BLEND(start[-5], src[-5], alpha2); + + alpha2 = alpha[-3]; + BLEND(start[-4], src[-4], alpha1); + + alpha1 = alpha[-2]; + BLEND(start[-3], src[-3], alpha2); + + alpha2 = alpha[-1]; + BLEND(start[-2], src[-2], alpha1); + + BLEND(start[-1], src[-1], alpha2); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + BLEND(*start, *src, *alpha); +#undef BLEND +} + +static inline void +_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + +#define BLEND(dst, src) \ + { \ + short r1, g1, b1; \ + int rgb, d; \ + r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ + g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ + b1 = (((src) & 0x1f) * b) >> 8; \ + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ + d = RGB_565_UNPACK(dst); \ + d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); \ + dst = RGB_565_PACK(d); \ + } + + while (start < end) + { + pld(src, 32); + UNROLL8({ + BLEND(*start, *src); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + BLEND(*start, *src); +#undef BLEND +} + +/*********************************************************************** + * Blend operations with extra multiply color + */ +static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(alpha, 0); + pld(src, 0); + +#define BLEND(dst, src, alpha) \ + if (UNLIKELY(alpha == 31)) \ + { \ + short r1, g1, b1; \ + r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ + g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ + b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ + dst = ((r1 << 11) | (g1 << 5) | b1); \ + } \ + else if (alpha != 0) \ + { \ + short r1, g1, b1; \ + int rgb, d; \ + r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ + g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ + b1 = (((src) & 0x1f) * b) >> 8; \ + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ + d = RGB_565_UNPACK(dst); \ + d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); \ + dst = RGB_565_PACK(d); \ + } + + while (start < end) + { + DATA8 alpha1, alpha2; + + alpha1 = alpha[0]; + alpha += 8; + + pld(alpha, 8); + pld(src, 32); + + src += 8; + start += 8; + + alpha2 = alpha[-7]; + BLEND(start[-8], src[-8], alpha1); + + alpha1 = alpha[-6]; + BLEND(start[-7], src[-7], alpha2); + + alpha2 = alpha[-5]; + BLEND(start[-6], src[-6], alpha1); + + alpha1 = alpha[-4]; + BLEND(start[-5], src[-5], alpha2); + + alpha2 = alpha[-3]; + BLEND(start[-4], src[-4], alpha1); + + alpha1 = alpha[-2]; + BLEND(start[-3], src[-3], alpha2); + + alpha2 = alpha[-1]; + BLEND(start[-2], src[-2], alpha1); + + BLEND(start[-1], src[-1], alpha2); + } + + end = start + (size & 7); + for (; start < end; start++, src++, alpha++) + BLEND(*start, *src, *alpha); +#undef BLEND +} + +static inline void +_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b) +{ + DATA16 *start, *end; + + start = dst; + end = start + (size & ~7); + + pld(src, 0); + +#define BLEND(dst, src) \ + { \ + short r1, g1, b1; \ + r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ + g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ + b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ + dst = ((r1 << 11) | (g1 << 5) | b1); \ + } + + while (start < end) + { + pld(src, 32); + UNROLL8({ + BLEND(*start, *src); + start++; + src++; + }); + } + + end = start + (size & 7); + for (; start < end; start++, src++) + BLEND(*start, *src); +#undef BLEND } |
From: Enlightenment C. <no...@cv...> - 2007-06-18 17:48:18
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16_x11 Modified Files: evas_engine.c Log Message: idle_flush =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16_x11/evas_engine.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_engine.c 18 Jun 2007 16:47:36 -0000 1.3 +++ evas_engine.c 18 Jun 2007 17:48:14 -0000 1.4 @@ -307,8 +307,16 @@ Render_Engine *re; re = (Render_Engine *)data; - /* FIXME: clean up any resources kept around between renders in case - * we are animating a lot and want high fps */ + if (re->shbuf) + { + evas_software_x11_x_output_buffer_free(re->shbuf, 0); + re->shbuf = NULL; + } + if (re->clip_rects) + { + XDestroyRegion(re->clip_rects); + re->clip_rects = NULL; + } } |
From: Enlightenment C. <no...@cv...> - 2007-06-19 22:51:54
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_main.c Log Message: Improve _soft16_scanline_fill_transp_solid(), with bugfix. Author: Gustavo Sverzut Barbieri <bar...@gm...> =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_soft16_main.c 18 Jun 2007 16:50:37 -0000 1.3 +++ evas_soft16_main.c 19 Jun 2007 22:51:39 -0000 1.4 @@ -1106,33 +1106,32 @@ static inline void _soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha) { - DATA16 *start, *end; - DATA32 a; + DATA16 *start, *end; + DATA32 a; - start = dst; - pld(start, 0); - end = start + (size & ~7); + start = dst; + pld(start, 0); + end = start + (size & ~7); - while (start < end) { - pld(start, 32); - UNROLL8({ - DATA32 b; - b = RGB_565_UNPACK(*start); - b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); - *start = RGB_565_PACK(b); - start++; - }); - } +#define BLEND(dst) \ + { DATA32 b; \ + b = RGB_565_UNPACK(dst); \ + b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); \ + dst = RGB_565_PACK(b); } - size &= 7; + while (start < end) + { + pld(start, 32); + UNROLL8({ + BLEND(*start); + start++; + }); + } - while (size--) { - DATA32 b; - b = RGB_565_UNPACK(*start); - b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); - *start = RGB_565_PACK(b); - start++; - } + end = start + (size & 7); + for (; start < end; start++) + BLEND(*start); +#undef BLEND } /*********************************************************************** |
From: Enlightenment C. <no...@cv...> - 2007-06-19 22:52:14
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: Makefile.am evas_engine.c evas_soft16.h evas_soft16_main.c Added Files: evas_soft16_font.c Log Message: Add font/text support for software_16. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- Makefile.am 29 Apr 2007 15:45:40 -0000 1.1 +++ Makefile.am 19 Jun 2007 22:52:12 -0000 1.2 @@ -12,7 +12,8 @@ module_la_SOURCES = \ evas_engine.c \ evas_soft16.h \ -evas_soft16_main.c +evas_soft16_main.c \ +evas_soft16_font.c module_la_LIBADD = $(top_builddir)/src/lib/libevas.la module_la_LDFLAGS = -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs @@ -23,4 +24,5 @@ EXTRA_DIST = \ evas_engine.c \ evas_soft16.h \ -evas_soft16_main.c +evas_soft16_main.c \ +evas_soft16_font.c =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_engine.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_engine.c 18 Jun 2007 16:50:37 -0000 1.3 +++ evas_engine.c 19 Jun 2007 22:52:12 -0000 1.4 @@ -574,8 +574,28 @@ static void eng_font_draw(void *data, void *context, void *surface, void *font, int x, int y, int w, int h, int ow, int oh, const char *text) { -// evas_common_font_draw(surface, context, font, x, y, text); -// evas_common_cpu_end_opt(); + static RGBA_Image *im = NULL; + Soft16_Image *dst = surface; + + if (!im) + { + im = evas_common_image_new(); + im->image = evas_common_image_surface_new(im); + im->image->no_free = 1; + } + im->image->w = dst->w; + im->image->h = dst->h; + evas_common_draw_context_font_ext_set(context, + surface, + soft16_font_glyph_new, + soft16_font_glyph_free, + soft16_font_glyph_draw); + evas_common_font_draw(im, context, font, x, y, text); + evas_common_draw_context_font_ext_set(context, + NULL, + NULL, + NULL, + NULL); } static void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- evas_soft16.h 18 Jun 2007 16:50:37 -0000 1.2 +++ evas_soft16.h 19 Jun 2007 22:52:12 -0000 1.3 @@ -5,6 +5,35 @@ #include "evas_private.h" #include "evas_common.h" +#define RGB_565_UNPACKED_MASK 0x07e0f81f +#define RGB_565_UNPACK(rgb) \ + (((rgb) | ((rgb) << 16)) & RGB_565_UNPACKED_MASK) +#define RGB_565_PACK(rgb) \ + ((((rgb) & RGB_565_UNPACKED_MASK) | \ + ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff) +#define RGB_565_UNPACKED_BLEND(a, b, alpha) \ + ((b) + ((((a) - (b)) * (alpha)) >> 5)) + +#define RGB_565_FROM_COMPONENTS(r, g, b) \ + (((((r) >> 3) & 0x1f) << 11) | \ + ((((g) >> 2) & 0x3f) << 5) | \ + (((b) >> 3) & 0x1f)) + +#define UNROLL2(op...) op op +#define UNROLL4(op...) UNROLL2(op) UNROLL2(op) +#define UNROLL8(op...) UNROLL4(op) UNROLL4(op) +#define UNROLL16(op...) UNROLL8(op) UNROLL8(op) + + +#if defined(__ARMEL__) +/* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ +#define pld(addr, off) \ + __asm__("pld [%[address], %[offset]]":: \ + [address] "r" (addr), [offset] "i" (off)) +#else +#define pld(addr, off) +#endif /* __ARMEL__ */ + typedef struct _Soft16_Image Soft16_Image; struct _Soft16_Image @@ -43,4 +72,10 @@ void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); + + + +void *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg); +void soft16_font_glyph_free(void *ext_dat); +void soft16_font_glyph_draw(Soft16_Image *dst, void *data, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); #endif =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- evas_soft16_main.c 19 Jun 2007 22:51:39 -0000 1.4 +++ evas_soft16_main.c 19 Jun 2007 22:52:12 -0000 1.5 @@ -2,36 +2,6 @@ #include "evas_private.h" #include "evas_soft16.h" -#define RGB_565_UNPACKED_MASK 0x07e0f81f -#define RGB_565_UNPACK(rgb) \ - (((rgb) | ((rgb) << 16)) & RGB_565_UNPACKED_MASK) -#define RGB_565_PACK(rgb) \ - ((((rgb) & RGB_565_UNPACKED_MASK) | \ - ((rgb) & RGB_565_UNPACKED_MASK) >> 16) & 0xffff) -#define RGB_565_UNPACKED_BLEND(a, b, alpha) \ - ((b) + ((((a) - (b)) * (alpha)) >> 5)) - -#define RGB_565_FROM_COMPONENTS(r, g, b) \ - (((((r) >> 3) & 0x1f) << 11) | \ - ((((g) >> 2) & 0x3f) << 5) | \ - (((b) >> 3) & 0x1f)) - -#define UNROLL2(op...) op op -#define UNROLL4(op...) UNROLL2(op) UNROLL2(op) -#define UNROLL8(op...) UNROLL4(op) UNROLL4(op) -#define UNROLL16(op...) UNROLL8(op) UNROLL8(op) - - -#if defined(__ARMEL__) -/* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ -#define pld(addr, off) \ - __asm__("pld [%[address], %[offset]]":: \ - [address] "r" (addr), [offset] "i" (off)) -#else -#define pld(addr, off) -#endif /* __ARMEL__ */ - - #define IMG_BYTE_SIZE(stride, height, has_alpha) \ ((stride) * (height) * (!(has_alpha) ? 2 : 3)) |
From: Enlightenment C. <no...@cv...> - 2007-06-20 19:10:19
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: Makefile.am evas_soft16.h evas_soft16_font.c evas_soft16_main.c Added Files: evas_soft16_rectangle.c evas_soft16_scanline_blend.c evas_soft16_scanline_fill.c Log Message: Clean up structure, split into files. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/Makefile.am,v retrieving revision 1.2 retrieving revision 1.3 diff -u -3 -r1.2 -r1.3 --- Makefile.am 19 Jun 2007 22:52:12 -0000 1.2 +++ Makefile.am 20 Jun 2007 19:10:15 -0000 1.3 @@ -13,7 +13,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ -evas_soft16_font.c +evas_soft16_font.c \ +evas_soft16_rectangle.c module_la_LIBADD = $(top_builddir)/src/lib/libevas.la module_la_LDFLAGS = -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs @@ -25,4 +26,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ -evas_soft16_font.c +evas_soft16_font.c \ +evas_soft16_rectangle.c \ +evas_soft16_scanline_fill.c \ +evas_soft16_scanline_blend.c + =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- evas_soft16.h 19 Jun 2007 22:52:12 -0000 1.3 +++ evas_soft16.h 20 Jun 2007 19:10:15 -0000 1.4 @@ -2,8 +2,8 @@ #define EVAS_SOFT16_H #include "Evas.h" -#include "evas_private.h" #include "evas_common.h" +#include "evas_private.h" #define RGB_565_UNPACKED_MASK 0x07e0f81f #define RGB_565_UNPACK(rgb) \ @@ -35,7 +35,7 @@ #endif /* __ARMEL__ */ typedef struct _Soft16_Image Soft16_Image; - + struct _Soft16_Image { const char *file; // file source - optional @@ -50,31 +50,31 @@ RGBA_Image *source_im; // original source rgba image - if still reffed Evas_Image_Load_Opts lo; // load options - + unsigned char have_alpha : 1; // 1 if we have halpha unsigned char free_pixels : 1; // 1 if pixels should be freed unsigned char free_alpha : 1; // 1 if alpha mask should be freed }; -Soft16_Image *soft16_image_new(int w, int h, int stride, int have_alpha, - DATA16 *pixels, int copy); +/** + * Image (evas_soft16_main.c) + */ +Soft16_Image *soft16_image_new(int w, int h, int stride, int have_alpha, DATA16 *pixels, int copy); 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); +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_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); +/** + * Rectangle (evas_soft16_rectangle.c) + */ void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); - +/** + * Font (evas_soft16_font.c) + */ void *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg); void soft16_font_glyph_free(void *ext_dat); void soft16_font_glyph_draw(Soft16_Image *dst, void *data, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_font.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_font.c 19 Jun 2007 22:52:12 -0000 1.1 +++ evas_soft16_font.c 20 Jun 2007 19:10:15 -0000 1.2 @@ -1,5 +1,3 @@ -#include "evas_common.h" -#include "evas_private.h" #include "evas_soft16.h" static inline void =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- evas_soft16_main.c 19 Jun 2007 22:52:12 -0000 1.5 +++ evas_soft16_main.c 20 Jun 2007 19:10:15 -0000 1.6 @@ -1,26 +1,9 @@ -#include "evas_common.h" -#include "evas_private.h" #include "evas_soft16.h" +#include "evas_soft16_scanline_blend.c" #define IMG_BYTE_SIZE(stride, height, has_alpha) \ ((stride) * (height) * (!(has_alpha) ? 2 : 3)) - -static inline void _soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size); -static inline void _soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size); - -static inline void _soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha); -static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha); - -static inline void _soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); -static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b); - -static inline void _soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b); -static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b); - -static inline void _soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565); -static inline void _soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha); - static Evas_Hash *_soft16_image_cache_hash = NULL; static inline int @@ -911,597 +894,3 @@ dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; } -static inline void -_soft16_rectangle_draw_solid_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, - int offset, int w, int h) -{ - DATA16 *dst_itr, rgb565; - int i; - - dst_itr = dst->pixels + offset; - rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), - G_VAL(&dc->col.col), - B_VAL(&dc->col.col)); - - for (i = 0; i < h; i++, dst_itr += dst->stride) - _soft16_scanline_fill_solid_solid(dst_itr, w, rgb565); -} - -static inline void -_soft16_rectangle_draw_transp_solid(Soft16_Image *dst, RGBA_Draw_Context *dc, - int offset, int w, int h) -{ - char alpha; - - alpha = A_VAL(&dc->col.col) >> 3; - if (alpha == 31) _soft16_rectangle_draw_solid_solid(dst, dc, offset, w, h); - else if (alpha != 0) - { - DATA16 *dst_itr; - DATA32 rgb565; - int i; - - dst_itr = dst->pixels + offset; - rgb565 = RGB_565_FROM_COMPONENTS(R_VAL(&dc->col.col), - G_VAL(&dc->col.col), - B_VAL(&dc->col.col)); - rgb565 = RGB_565_UNPACK(rgb565); - - for (i = 0; i < h; i++, dst_itr += dst->stride) - _soft16_scanline_fill_transp_solid(dst_itr, w, rgb565, alpha); - } -} - -static void -_soft16_rectangle_draw_int(Soft16_Image *dst, RGBA_Draw_Context *dc, - Evas_Rectangle dr) -{ - int dst_offset; - - if (_is_empty_rectangle(&dr)) return; - RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h); - if (_is_empty_rectangle(&dr)) return; - - if (dc->clip.use) - RECTS_CLIP_TO_RECT(dr.x, dr.y, dr.w, dr.h, dc->clip.x, - dc->clip.y, dc->clip.w, dc->clip.h); - if (_is_empty_rectangle(&dr)) return; - if (A_VAL(&dc->col.col) == 0) return; - - dst_offset = dr.x + (dr.y * dst->w); - - if (!dst->have_alpha) - { - if (A_VAL(&dc->col.col) == 255) - _soft16_rectangle_draw_solid_solid - (dst, dc, dst_offset, dr.w, dr.h); - else - _soft16_rectangle_draw_transp_solid - (dst, dc, dst_offset, dr.w, dr.h); - } - else - fprintf(stderr, - "Unsupported feature: drawing rectangle to non-opaque " - "destination.\n"); -} - -void -soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, - int x, int y, int w, int h) -{ - Evas_Rectangle dr; - Cutout_Rects *rects; - Cutout_Rect *r; - int c, cx, cy, cw, ch; - int i; - - /* handle cutouts here! */ - dr.x = x; - dr.y = y; - dr.w = w; - dr.h = h; - - if (_is_empty_rectangle(&dr)) return; - if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) - return; - - /* no cutouts - cut right to the chase */ - if (!dc->cutout.rects) - { - _soft16_rectangle_draw_int(dst, dc, dr); - return; - } - - /* save out clip info */ - c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; - evas_common_draw_context_clip_clip(dc, 0, 0, dst->w, dst->h); - evas_common_draw_context_clip_clip(dc, x, y, w, h); - /* our clip is 0 size.. abort */ - if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) - { - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; - return; - } - rects = evas_common_draw_context_apply_cutouts(dc); - for (i = 0; i < rects->active; ++i) - { - r = rects->rects + i; - evas_common_draw_context_set_clip(dc, r->x, r->y, r->w, r->h); - _soft16_rectangle_draw_int(dst, dc, dr); - } - evas_common_draw_context_apply_clear_cutouts(rects); - /* restore clip info */ - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; -} - - -/***************************************************************************** - * Scanline processing - * - * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]() - * - ****************************************************************************/ - -/*********************************************************************** - * fill operations - */ -static inline void -_soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565) -{ - DATA16 *start, *end; - DATA32 rgb565_double; - - start = dst; - end = start + (size & ~7); - - rgb565_double = (rgb565 << 16) | rgb565; - - while (start < end) - { - DATA32 *p = (DATA32 *)start; - - p[0] = rgb565_double; - p[1] = rgb565_double; - p[2] = rgb565_double; - p[3] = rgb565_double; - - start += 8; - } - - end = start + (size & 7); - for (; start < end; start++) - *start = rgb565; -} - -static inline void -_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha) -{ - DATA16 *start, *end; - DATA32 a; - - start = dst; - pld(start, 0); - end = start + (size & ~7); - -#define BLEND(dst) \ - { DATA32 b; \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); \ - dst = RGB_565_PACK(b); } - - while (start < end) - { - pld(start, 32); - UNROLL8({ - BLEND(*start); - start++; - }); - } - - end = start + (size & 7); - for (; start < end; start++) - BLEND(*start); -#undef BLEND -} - -/*********************************************************************** - * Regular blend operations - */ -static inline void -_soft16_scanline_blend_transp_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - (dst) = (src); \ - else if (alpha != 0) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha); \ - dst = RGB_565_PACK(b); \ - } - - /* work on 8 pixels per time, do data preload */ - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - /* empirical tests show these give the best performance */ - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - /* remaining pixels (up to 7) */ - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid(DATA16 *src, DATA16 *dst, int size) -{ - memcpy(dst, src, size * sizeof(DATA16)); -} - -/*********************************************************************** - * Blend operations taking an extra alpha (fade in, out) - */ -static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (alpha > rel_alpha) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} - -/*********************************************************************** - * Blend operations with extra alpha and multiply color - */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - - /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ -#define BLEND(dst, src, alpha) \ - if ((alpha) > rel_alpha) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(src, 32); - pld(start, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} - -/*********************************************************************** - * Blend operations with extra multiply color - */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(alpha, 0); - pld(src, 0); - -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } \ - else if (alpha != 0) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); \ - dst = RGB_565_PACK(d); \ - } - - while (start < end) - { - DATA8 alpha1, alpha2; - - alpha1 = alpha[0]; - alpha += 8; - - pld(alpha, 8); - pld(src, 32); - - src += 8; - start += 8; - - alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); - - alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); - - alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); - - alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); - - alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); - - alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); - - alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); - - BLEND(start[-1], src[-1], alpha2); - } - - end = start + (size & 7); - for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND -} - -static inline void -_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b) -{ - DATA16 *start, *end; - - start = dst; - end = start + (size & ~7); - - pld(src, 0); - -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } - - while (start < end) - { - pld(src, 32); - UNROLL8({ - BLEND(*start, *src); - start++; - src++; - }); - } - - end = start + (size & 7); - for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND -} |
From: Enlightenment C. <no...@cv...> - 2007-06-20 20:50:41
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_scanline_blend.c evas_soft16_scanline_fill.c Log Message: Cleanup, remove macros and replace with static inline functions, this also provides soft16_pt_*() functions to paint individual pixels. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_scanline_blend.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_scanline_blend.c 20 Jun 2007 19:10:15 -0000 1.1 +++ evas_soft16_scanline_blend.c 20 Jun 2007 20:50:34 -0000 1.2 @@ -1,5 +1,9 @@ /** NOTE: This file is meant to be included by users **/ +/** NOTE2: r, g, b parameters are 16bits, so you can pass 0 to 256 inclusive. + ** this is due our division by 256 when multiplying the color. + **/ + /***************************************************************************** * Scanline processing * @@ -7,6 +11,20 @@ * ****************************************************************************/ +static inline void +_soft16_pt_blend_transp_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha) +{ + if (alpha == 31) *p_dst = src; + else if (alpha != 0) + { + DATA32 a, b; + a = RGB_565_UNPACK(src); + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha); + *p_dst = RGB_565_PACK(b); + } +} + /*********************************************************************** * Regular blend operations */ @@ -21,18 +39,6 @@ pld(alpha, 0); pld(src, 0); -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - (dst) = (src); \ - else if (alpha != 0) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha); \ - dst = RGB_565_PACK(b); \ - } - /* work on 8 pixels per time, do data preload */ while (start < end) { @@ -49,34 +55,39 @@ start += 8; alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); + _soft16_pt_blend_transp_solid(start - 8, src[-8], alpha1); alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); + _soft16_pt_blend_transp_solid(start - 7, src[-7], alpha2); alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); + _soft16_pt_blend_transp_solid(start - 6, src[-6], alpha1); alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); + _soft16_pt_blend_transp_solid(start - 5, src[-5], alpha2); alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); + _soft16_pt_blend_transp_solid(start - 4, src[-4], alpha1); alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); + _soft16_pt_blend_transp_solid(start - 3, src[-3], alpha2); alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); + _soft16_pt_blend_transp_solid(start - 2, src[-2], alpha1); - BLEND(start[-1], src[-1], alpha2); + _soft16_pt_blend_transp_solid(start - 1, src[-1], alpha2); } /* remaining pixels (up to 7) */ end = start + (size & 7); for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND + _soft16_pt_blend_transp_solid(start, *src, *alpha); +} + +static inline void +_soft16_pt_blend_solid_solid(DATA16 *p_dst, DATA16 src) +{ + *p_dst = src; } static inline void @@ -88,7 +99,23 @@ /*********************************************************************** * Blend operations taking an extra alpha (fade in, out) */ -static inline void _soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha) + +static inline void +_soft16_pt_blend_transp_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha) +{ + /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ + if (alpha > rel_alpha) + { + DATA32 a, b; + a = RGB_565_UNPACK(src); + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); + *p_dst = RGB_565_PACK(b); + } +} + +static inline void +_soft16_scanline_blend_transp_solid_mul_alpha(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, const DATA8 rel_alpha) { DATA16 *start, *end; @@ -98,16 +125,6 @@ pld(alpha, 0); pld(src, 0); -#define BLEND(dst, src, alpha) \ - if (alpha > rel_alpha) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, alpha - rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - while (start < end) { DATA8 alpha1, alpha2; @@ -122,37 +139,54 @@ start += 8; alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 8, src[-8], alpha1, rel_alpha); alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 7, src[-7], alpha2, rel_alpha); alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 6, src[-6], alpha1, rel_alpha); alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 5, src[-5], alpha2, rel_alpha); alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 4, src[-4], alpha1, rel_alpha); alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 3, src[-3], alpha2, rel_alpha); alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 2, src[-2], alpha1, rel_alpha); - BLEND(start[-1], src[-1], alpha2); + _soft16_pt_blend_transp_solid_mul_alpha + (start - 1, src[-1], alpha2, rel_alpha); } end = start + (size & 7); for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND + _soft16_pt_blend_transp_solid_mul_alpha(start, *src, *alpha, rel_alpha); } static inline void -_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, char rel_alpha) +_soft16_pt_blend_solid_solid_mul_alpha(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha) +{ + DATA32 a, b; + a = RGB_565_UNPACK(src); + b = RGB_565_UNPACK(*p_dst); + b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); + *p_dst = RGB_565_PACK(b); +} + +static inline void +_soft16_scanline_blend_solid_solid_mul_alpha(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha) { DATA16 *start, *end; @@ -161,20 +195,11 @@ pld(src, 0); -#define BLEND(dst, src) \ - { \ - DATA32 a, b; \ - a = RGB_565_UNPACK(src); \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(a, b, rel_alpha); \ - dst = RGB_565_PACK(b); \ - } - while (start < end) { pld(src, 32); UNROLL8({ - BLEND(*start, *src); + _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha); start++; src++; }); @@ -182,14 +207,33 @@ end = start + (size & 7); for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND + _soft16_pt_blend_solid_solid_mul_alpha(start, *src, rel_alpha); } /*********************************************************************** * Blend operations with extra alpha and multiply color */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) + +static inline void +_soft16_pt_blend_transp_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) +{ + /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ + if (alpha > rel_alpha) + { + int r1, g1, b1; + DATA32 rgb, d; + r1 = ((((src) >> 11) & 0x1f) * r) >> 8; + g1 = ((((src) >> 5) & 0x3f) * g) >> 8; + b1 = (((src) & 0x1f) * b) >> 8; + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); + *p_dst = RGB_565_PACK(d); + } +} + +static inline void +_soft16_scanline_blend_transp_solid_mul_color_transp(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) { DATA16 *start, *end; @@ -199,21 +243,6 @@ pld(alpha, 0); pld(src, 0); - /* rel_alpha is always > 0, so (alpha - rel_alpha) is always < 31 */ -#define BLEND(dst, src, alpha) \ - if ((alpha) > rel_alpha) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha - rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - while (start < end) { DATA8 alpha1, alpha2; @@ -228,37 +257,61 @@ start += 8; alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 8, src[-8], alpha1, rel_alpha, r, g, b); alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 7, src[-7], alpha2, rel_alpha, r, g, b); alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 6, src[-6], alpha1, rel_alpha, r, g, b); alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 5, src[-5], alpha2, rel_alpha, r, g, b); alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 4, src[-4], alpha1, rel_alpha, r, g, b); alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 3, src[-3], alpha2, rel_alpha, r, g, b); alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 2, src[-2], alpha1, rel_alpha, r, g, b); - BLEND(start[-1], src[-1], alpha2); + _soft16_pt_blend_transp_solid_mul_color_transp + (start - 1, src[-1], alpha2, rel_alpha, r, g, b); } end = start + (size & 7); for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND + _soft16_pt_blend_transp_solid_mul_color_transp + (start, *src, *alpha, rel_alpha, r, g, b); } static inline void -_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, char rel_alpha, short r, short g, short b) +_soft16_pt_blend_solid_solid_mul_color_transp(DATA16 *p_dst, DATA16 src, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) +{ + int r1, g1, b1; + DATA32 rgb, d; + + r1 = ((((src) >> 11) & 0x1f) * r) >> 8; + g1 = ((((src) >> 5) & 0x3f) * g) >> 8; + b1 = (((src) & 0x1f) * b) >> 8; + + rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); + *p_dst = RGB_565_PACK(d); +} + +static inline void +_soft16_scanline_blend_solid_solid_mul_color_transp(DATA16 *src, DATA16 *dst, int size, DATA8 rel_alpha, DATA16 r, DATA16 g, DATA16 b) { DATA16 *start, *end; @@ -267,24 +320,12 @@ pld(src, 0); -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, rel_alpha); \ - dst = RGB_565_PACK(d); \ - } - while (start < end) { pld(src, 32); UNROLL8({ - BLEND(*start, *src); + _soft16_pt_blend_solid_solid_mul_color_transp + (start, *src, rel_alpha, r, g, b); start++; src++; }); @@ -292,14 +333,38 @@ end = start + (size & 7); for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND + _soft16_pt_blend_solid_solid_mul_color_transp + (start, *src, rel_alpha, r, g, b); } /*********************************************************************** * Blend operations with extra multiply color */ -static inline void _soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, short r, short g, short b) +static inline void +_soft16_pt_blend_transp_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA8 alpha, DATA16 r, DATA16 g, DATA16 b) +{ + int r1, g1, b1; + + if (alpha == 0) return; + + r1 = ((((src >> 11) & 0x1f) * r) >> 8) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 8) & 0x3f; + b1 = (((src & 0x1f) * b) >> 8) & 0x1f; + + if (alpha == 31) *p_dst = (r1 << 11) | (g1 << 5) | b1; + else + { + DATA32 rgb_unpack, d; + + rgb_unpack = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; + d = RGB_565_UNPACK(*p_dst); + d = RGB_565_UNPACKED_BLEND(rgb_unpack, d, alpha); + *p_dst = RGB_565_PACK(d); + } +} + +static inline void +_soft16_scanline_blend_transp_solid_mul_color_solid(DATA16 *src, DATA8 *alpha, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b) { DATA16 *start, *end; @@ -309,28 +374,6 @@ pld(alpha, 0); pld(src, 0); -#define BLEND(dst, src, alpha) \ - if (UNLIKELY(alpha == 31)) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } \ - else if (alpha != 0) \ - { \ - short r1, g1, b1; \ - int rgb, d; \ - r1 = ((((src) >> 11) & 0x1f) * r) >> 8; \ - g1 = ((((src) >> 5) & 0x3f) * g) >> 8; \ - b1 = (((src) & 0x1f) * b) >> 8; \ - rgb = ((r1 << 11) | (g1 << 21) | b1) & RGB_565_UNPACKED_MASK; \ - d = RGB_565_UNPACK(dst); \ - d = RGB_565_UNPACKED_BLEND(rgb, d, alpha); \ - dst = RGB_565_PACK(d); \ - } - while (start < end) { DATA8 alpha1, alpha2; @@ -345,37 +388,57 @@ start += 8; alpha2 = alpha[-7]; - BLEND(start[-8], src[-8], alpha1); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 8, src[-8], alpha1, r, g, b); alpha1 = alpha[-6]; - BLEND(start[-7], src[-7], alpha2); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 7, src[-7], alpha2, r, g, b); alpha2 = alpha[-5]; - BLEND(start[-6], src[-6], alpha1); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 6, src[-6], alpha1, r, g, b); alpha1 = alpha[-4]; - BLEND(start[-5], src[-5], alpha2); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 5, src[-5], alpha2, r, g, b); alpha2 = alpha[-3]; - BLEND(start[-4], src[-4], alpha1); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 4, src[-4], alpha1, r, g, b); alpha1 = alpha[-2]; - BLEND(start[-3], src[-3], alpha2); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 3, src[-3], alpha2, r, g, b); alpha2 = alpha[-1]; - BLEND(start[-2], src[-2], alpha1); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 2, src[-2], alpha1, r, g, b); - BLEND(start[-1], src[-1], alpha2); + _soft16_pt_blend_transp_solid_mul_color_solid + (start - 1, src[-1], alpha2, r, g, b); } end = start + (size & 7); for (; start < end; start++, src++, alpha++) - BLEND(*start, *src, *alpha); -#undef BLEND + _soft16_pt_blend_transp_solid_mul_color_solid + (start, *src, *alpha, r, g, b); +} + +static inline void +_soft16_pt_blend_solid_solid_mul_color_solid(DATA16 *p_dst, DATA16 src, DATA16 r, DATA16 g, DATA16 b) +{ + int r1, g1, b1; + + r1 = ((((src >> 11) & 0x1f) * r) >> 8) & 0x1f; + g1 = ((((src >> 5) & 0x3f) * g) >> 8) & 0x3f; + b1 = (((src & 0x1f) * b) >> 8) & 0x1f; + + *p_dst = (r1 << 11) | (g1 << 5) | b1; } static inline void -_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, short r, short g, short b) +_soft16_scanline_blend_solid_solid_mul_color_solid(DATA16 *src, DATA16 *dst, int size, DATA16 r, DATA16 g, DATA16 b) { DATA16 *start, *end; @@ -384,20 +447,11 @@ pld(src, 0); -#define BLEND(dst, src) \ - { \ - short r1, g1, b1; \ - r1 = (((((src) >> 11) & 0x1f) * r) >> 8) & 0x1f; \ - g1 = (((((src) >> 5) & 0x3f) * g) >> 8) & 0x3f; \ - b1 = ((((src) & 0x1f) * b) >> 8) & 0x1f; \ - dst = ((r1 << 11) | (g1 << 5) | b1); \ - } - while (start < end) { pld(src, 32); UNROLL8({ - BLEND(*start, *src); + _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b); start++; src++; }); @@ -405,6 +459,5 @@ end = start + (size & 7); for (; start < end; start++, src++) - BLEND(*start, *src); -#undef BLEND + _soft16_pt_blend_solid_solid_mul_color_solid(start, *src, r, g, b); } =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_scanline_fill.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_scanline_fill.c 20 Jun 2007 19:10:15 -0000 1.1 +++ evas_soft16_scanline_fill.c 20 Jun 2007 20:50:34 -0000 1.2 @@ -1,12 +1,22 @@ /** NOTE: This file is meant to be included by users **/ /***************************************************************************** + * Point processing + * + * _soft16_pt_<description>_<src>_<dst>[_<modifier>]() + * * Scanline processing * * _soft16_scanline_<description>_<src>_<dst>[_<modifier>]() * ****************************************************************************/ static inline void +_soft16_pt_fill_solid_solid(DATA16 *dst, DATA16 rgb565) +{ + *dst = rgb565; +} + +static inline void _soft16_scanline_fill_solid_solid(DATA16 *dst, int size, DATA16 rgb565) { DATA16 *start, *end; @@ -35,7 +45,17 @@ } static inline void -_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, char alpha) +_soft16_pt_fill_transp_solid(DATA16 *dst, DATA32 rgb565_unpack, DATA8 alpha) +{ + DATA32 d; + + d = RGB_565_UNPACK(*dst); + d = RGB_565_UNPACKED_BLEND(rgb565_unpack, d, alpha); + *dst = RGB_565_PACK(d); +} + +static inline void +_soft16_scanline_fill_transp_solid(DATA16 *dst, int size, DATA32 rgb565_unpack, DATA8 alpha) { DATA16 *start, *end; DATA32 a; @@ -44,23 +64,16 @@ pld(start, 0); end = start + (size & ~7); -#define BLEND(dst) \ - { DATA32 b; \ - b = RGB_565_UNPACK(dst); \ - b = RGB_565_UNPACKED_BLEND(rgb565_unpack, b, alpha); \ - dst = RGB_565_PACK(b); } - while (start < end) - { - pld(start, 32); - UNROLL8({ - BLEND(*start); - start++; - }); - } + { + pld(start, 32); + UNROLL8({ + _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha); + start++; + }); + } end = start + (size & 7); for (; start < end; start++) - BLEND(*start); -#undef BLEND + _soft16_pt_fill_transp_solid(start, rgb565_unpack, alpha); } |
From: Enlightenment C. <no...@cv...> - 2007-06-21 19:56:37
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_main.c Log Message: Implement image scale. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- evas_soft16_main.c 20 Jun 2007 19:10:15 -0000 1.6 +++ evas_soft16_main.c 21 Jun 2007 19:56:32 -0000 1.7 @@ -396,6 +396,9 @@ return 1; } +/*********************************************************************** + * Unscaled + **********************************************************************/ static void _soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, @@ -687,21 +690,482 @@ cr.w, cr.h); } +/*********************************************************************** + * Scaled + ***********************************************************************/ +static void +_soft16_image_draw_scaled_solid_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); + } +} +static void +_soft16_image_draw_scaled_transp_solid(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]); + } +} + +static inline void +_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITHOUT COLOR MUL\n", + src->have_alpha, dst->have_alpha); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], rel_alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_alpha + (d, s[offset_x[x]], rel_alpha); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[off_x], a[off_x], rel_alpha); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_alpha + (d, s[offset_x[x]], a[offset_x[x]], rel_alpha); + } +} + +static inline void +_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH ALPHA MUL %d\n", + src->have_alpha, dst->have_alpha, A_VAL(&dc->mul.col)); +} + +static void +_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha, r, g, b; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (rel_alpha == 31) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_solid + (d, s[offset_x[x]], r, g, b); + } + else + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + int x; + + s = src->pixels + offset_y[y]; + pld(s, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(offset_x + x, 32); + + UNROLL8({ + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], rel_alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_solid_solid_mul_color_transp + (d, s[offset_x[x]], rel_alpha, r, g, b); + } +} + +static void +_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src, + Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + DATA16 *dst_itr; + int y, w_align, rel_alpha, r, g, b; + + rel_alpha = A_VAL(&dc->mul.col) >> 3; + if ((rel_alpha < 1) || (rel_alpha > 31)) return; + rel_alpha = 31 - rel_alpha; + + r = R_VAL(&dc->mul.col); + g = G_VAL(&dc->mul.col); + b = B_VAL(&dc->mul.col); + /* we'll divide by 256 to make it faster, try to improve things a bit */ + if (r > 127) r++; + if (g > 127) g++; + if (b > 127) b++; + + w_align = w & ~7; + + dst_itr = dst->pixels + dst_offset; + + if (rel_alpha == 0) + for (y = 0; y < h; y++, dst_itr += dst->stride) + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[off_x], a[off_x], r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_solid + (d, s[offset_x[x]], a[offset_x[x]], r, g, b); + } + else + { + DATA16 *d, *s; + DATA8 *a; + int x; + + s = src->pixels + offset_y[y]; + a = src->alpha + offset_y[y]; + pld(s, 0); + pld(a, 0); + pld(offset_x, 0); + + d = dst_itr; + x = 0; + while (x < w_align) + { + pld(s, 32); + pld(a, 8); + pld(offset_x + x, 32); + + UNROLL8({ + int off_x = offset_x[x]; + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[off_x], a[off_x], rel_alpha, r, g, b); + x++; + d++; + }); + } + + for (; x < w; x++, d++) + _soft16_pt_blend_transp_solid_mul_color_transp + (d, s[offset_x[x]], a[offset_x[x]], rel_alpha, r, g, b); + } +} + +static inline void +_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if (src->have_alpha && (!dst->have_alpha)) + _soft16_image_draw_scaled_transp_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else if ((!src->have_alpha) && (!dst->have_alpha)) + _soft16_image_draw_scaled_solid_solid_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + fprintf(stderr, + "Unsupported draw of scaled images src->have_alpha=%d, " + "dst->have_alpha=%d, WITH COLOR MUL 0x%08x\n", + src->have_alpha, dst->have_alpha, dc->mul.col); +} + +static inline void +_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + int dst_offset, int w, int h, + int *offset_x, int *offset_y) +{ + if ((A_VAL(&dc->mul.col) == R_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == G_VAL(&dc->mul.col)) && + (A_VAL(&dc->mul.col) == B_VAL(&dc->mul.col))) + _soft16_image_draw_scaled_mul_alpha + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); + else + _soft16_image_draw_scaled_mul_color + (src, dst, dc, dst_offset, w, h, offset_x, offset_y); +} + +static void +_soft16_image_draw_scaled(Soft16_Image *src, Soft16_Image *dst, + RGBA_Draw_Context *dc, + const Evas_Rectangle sr, + const Evas_Rectangle dr, + const Evas_Rectangle cr) +{ + int x, y, dst_offset, *offset_x, *offset_y; + + /* pre-calculated scale tables */ + offset_x = alloca(cr.w * sizeof(*offset_x)); + for (x = 0; x < cr.w; x++) + offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; + + offset_y = alloca(cr.h * sizeof(*offset_y)); + for (y = 0; y < cr.h; y++) + offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y) + * src->stride); + + dst_offset = cr.x + (cr.y * dst->stride); + + if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) + _soft16_image_draw_scaled_no_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); + else if (dc->mul.col != 0x00000000) + _soft16_image_draw_scaled_mul + (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); +} + static void _soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, Evas_Rectangle sr, Evas_Rectangle dr) { Evas_Rectangle cr; -/* Scanline_Func func; */ - int x, y; - int *lin_ptr; - DATA16 *buf, *dptr; - DATA16 **row_ptr = NULL; - DATA16 *ptr, *dst_ptr, *src_data, *dst_data; - DATA8 *bufa, *daptr; - DATA8 **rowa_ptr = NULL; - DATA8 *aptr, *dsta_ptr, *srca_data, *dsta_data; if (!(RECTS_INTERSECT(dr.x, dr.y, dr.w, dr.h, 0, 0, dst->w, dst->h))) return; @@ -712,128 +1176,15 @@ if (!_soft16_adjust_areas(&sr, src->w, src->h, &dr, dst->w, dst->h, &cr)) return; - src_data = src->pixels; - srca_data = src->alpha; - dst_data = dst->pixels; - dsta_data = dst->alpha; - - /* figure out dest start ptr */ - dst_ptr = dst_data + cr.x + (cr.y * dst->stride); - dsta_ptr = dsta_data + cr.x + (cr.y * dst->stride); - -/* func = _soft16_scanline_copy; */ -/* if (( src->alpha) && ( dst->alpha)) func = _soft16_scanline_blend; */ -/* else if (( src->alpha) && (!dst->alpha)) func = _soft16_scanline_blend; */ -/* else if ((!src->alpha) && ( dst->alpha)) func = _soft16_scanline_copy; */ -/* else if ((!src->alpha) && (!dst->alpha)) func = _soft16_scanline_copy; */ - - /* not being scaled at all */ if ((dr.w == sr.w) && (dr.h == sr.h)) _soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); -#if 0 else - { - /* allocate scale lookup tables */ - lin_ptr = alloca(cr.w * sizeof(int)); - row_ptr = alloca(cr.h * sizeof(DATA16 *)); - rowa_ptr = alloca(cr.h * sizeof(DATA8 *)); - - /* fill scale tables */ - for (x = 0; x < cr.w; x++) - lin_ptr[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; - for (y = 0; y < cr.h; y++) - { - row_ptr[y] = src_data + - (((((y + cr.y - dr.y) * sr.h) / - dr.h) + sr.y) * src->stride); - rowa_ptr[y] = srca_data + - (((((y + cr.y - dr.y) * sr.h) / - dr.h) + sr.y) * src->stride); - } - /* scale to dst */ - dptr = dst_ptr; - daptr = dsta_ptr; - if ((!(src->alpha)) && (!(dst->alpha)) && (!dc->mul.use)) - { - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - dptr += dst->stride; - } - } - else - { - /* a scanline buffer */ - buf = alloca(cr.w * sizeof(DATA16) * 2); - if (src->alpha) - { - bufa = alloca(cr.w * sizeof(DATA8) * 2); - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - aptr = rowa_ptr[y] + lin_ptr[x]; - BLEND(ptr, aptr, dst_ptr); - dst_ptr++; - } -/* - dst_ptr = buf; - dsta_ptr = bufa; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - - aptr = rowa_ptr[y] + lin_ptr[x]; - *dsta_ptr = *aptr; - dsta_ptr++; - } - func(buf, bufa, NULL, dc->mul.col, dptr, cr.w); - */ - dptr += dst->stride; - } - } - else - { - for (y = 0; y < cr.h; y++) - { - dst_ptr = dptr; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } -/* - dst_ptr = buf; - for (x = 0; x < cr.w; x++) - { - ptr = row_ptr[y] + lin_ptr[x]; - *dst_ptr = *ptr; - dst_ptr++; - } - func(buf, NULL, NULL, dc->mul.col, dptr, cr.w); - */ - dptr += dst->stride; - } - } - } - } -#endif + _soft16_image_draw_scaled(src, dst, dc, sr, dr, cr); } void soft16_image_draw(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, + 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, |
From: Enlightenment C. <no...@cv...> - 2007-06-21 19:58:08
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: Makefile.am evas_soft16.h evas_soft16_main.c Added Files: evas_soft16_image_scaled_sampled.c evas_soft16_image_unscaled.c Log Message: Clean up structure, split image operations into files. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/Makefile.am,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- Makefile.am 20 Jun 2007 19:10:15 -0000 1.3 +++ Makefile.am 21 Jun 2007 19:57:56 -0000 1.4 @@ -13,6 +13,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ +evas_soft16_image_unscaled.c \ +evas_soft16_image_scaled_sampled.c \ evas_soft16_font.c \ evas_soft16_rectangle.c @@ -26,6 +28,8 @@ evas_engine.c \ evas_soft16.h \ evas_soft16_main.c \ +evas_soft16_image_unscaled.c \ +evas_soft16_image_scaled_sampled.c \ evas_soft16_font.c \ evas_soft16_rectangle.c \ evas_soft16_scanline_fill.c \ =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- evas_soft16.h 20 Jun 2007 19:10:15 -0000 1.4 +++ evas_soft16.h 21 Jun 2007 19:57:56 -0000 1.5 @@ -65,11 +65,14 @@ 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_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); + + /** * Rectangle (evas_soft16_rectangle.c) */ -void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, - int x, int y, int w, int h); +void soft16_rectangle_draw(Soft16_Image *dst, RGBA_Draw_Context *dc, int x, int y, int w, int h); /** @@ -78,4 +81,5 @@ void *soft16_font_glyph_new(void *data, RGBA_Font_Glyph *fg); void soft16_font_glyph_free(void *ext_dat); void soft16_font_glyph_draw(Soft16_Image *dst, void *data, RGBA_Draw_Context *dc, RGBA_Font_Glyph *fg, int x, int y); + #endif =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -3 -r1.7 -r1.8 --- evas_soft16_main.c 21 Jun 2007 19:56:32 -0000 1.7 +++ evas_soft16_main.c 21 Jun 2007 19:57:56 -0000 1.8 @@ -1,5 +1,4 @@ #include "evas_soft16.h" -#include "evas_soft16_scanline_blend.c" #define IMG_BYTE_SIZE(stride, height, has_alpha) \ ((stride) * (height) * (!(has_alpha) ? 2 : 3)) @@ -396,770 +395,6 @@ return 1; } -/*********************************************************************** - * Unscaled - **********************************************************************/ -static void -_soft16_image_draw_unscaled_solid_solid(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int w, int h) -{ - DATA16 *src_itr, *dst_itr; - int y; - - src_itr = src->pixels + src_offset; - dst_itr = dst->pixels + dst_offset; - - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_solid_solid(src_itr, dst_itr, w); - src_itr += src->stride; - dst_itr += dst->stride; - } -} - -static void -_soft16_image_draw_unscaled_transp_solid(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int w, int h) - -{ - DATA16 *src_itr, *dst_itr; - DATA8 *alpha_itr; - int y; - - src_itr = src->pixels + src_offset; - alpha_itr = src->alpha + src_offset; - dst_itr = dst->pixels + dst_offset; - - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_transp_solid(src_itr, alpha_itr, dst_itr, w); - src_itr += src->stride; - alpha_itr += src->stride; - dst_itr += dst->stride; - } -} - -static inline void -_soft16_image_draw_unscaled_no_mul(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int width, int height) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_unscaled_transp_solid(src, dst, dc, - src_offset, dst_offset, - width, height); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_unscaled_solid_solid(src, dst, dc, - src_offset, dst_offset, - width, height); - else - fprintf(stderr, - "Unsupported draw of unscaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITHOUT COLOR MUL\n", - src->have_alpha, dst->have_alpha); -} - -static void -_soft16_image_draw_unscaled_solid_solid_mul_alpha(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, - int dst_offset, - int w, int h) -{ - DATA16 *src_itr, *dst_itr; - int y, rel_alpha; - - src_itr = src->pixels + src_offset; - dst_itr = dst->pixels + dst_offset; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_solid_solid_mul_alpha(src_itr, dst_itr, w, - rel_alpha); - src_itr += src->stride; - dst_itr += dst->stride; - } -} - -static void -_soft16_image_draw_unscaled_transp_solid_mul_alpha(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, - int dst_offset, - int w, int h) - -{ - DATA16 *src_itr, *dst_itr; - DATA8 *alpha_itr; - int y, rel_alpha; - - src_itr = src->pixels + src_offset; - alpha_itr = src->alpha + src_offset; - dst_itr = dst->pixels + dst_offset; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_transp_solid_mul_alpha(src_itr, alpha_itr, - dst_itr, w, rel_alpha); - src_itr += src->stride; - alpha_itr += src->stride; - dst_itr += dst->stride; - } -} - -static inline void -_soft16_image_draw_unscaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int width, int height) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_unscaled_transp_solid_mul_alpha - (src, dst, dc, src_offset, dst_offset, width, height); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_unscaled_solid_solid_mul_alpha - (src, dst, dc, src_offset, dst_offset, width, height); - else - fprintf(stderr, - "Unsupported draw of unscaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITH ALPHA MUL %d\n", - src->have_alpha, dst->have_alpha, A_VAL(&dc->mul.col)); -} - -static void -_soft16_image_draw_unscaled_solid_solid_mul_color(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, - int dst_offset, - int w, int h) -{ - DATA16 *src_itr, *dst_itr; - int y, rel_alpha, r, g, b; - - src_itr = src->pixels + src_offset; - dst_itr = dst->pixels + dst_offset; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - - r = R_VAL(&dc->mul.col); - g = G_VAL(&dc->mul.col); - b = B_VAL(&dc->mul.col); - /* we'll divide by 256 to make it faster, try to improve things a bit */ - if (r > 127) r++; - if (g > 127) g++; - if (b > 127) b++; - - if (rel_alpha == 31) - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_solid_solid_mul_color_solid - (src_itr, dst_itr, w, r, g, b); - src_itr += src->stride; - dst_itr += dst->stride; - } - else - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_solid_solid_mul_color_transp - (src_itr, dst_itr, w, rel_alpha, r, g, b); - src_itr += src->stride; - dst_itr += dst->stride; - } -} - -static void -_soft16_image_draw_unscaled_transp_solid_mul_color(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, - int dst_offset, - int w, int h) - -{ - DATA16 *src_itr, *dst_itr; - DATA8 *alpha_itr; - int y, rel_alpha, r, g, b; - - src_itr = src->pixels + src_offset; - alpha_itr = src->alpha + src_offset; - dst_itr = dst->pixels + dst_offset; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - r = R_VAL(&dc->mul.col); - g = G_VAL(&dc->mul.col); - b = B_VAL(&dc->mul.col); - /* we'll divide by 256 to make it faster, try to improve things a bit */ - if (r > 127) r++; - if (g > 127) g++; - if (b > 127) b++; - - if (rel_alpha == 0) - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_transp_solid_mul_color_solid - (src_itr, alpha_itr, dst_itr, w, r, g, b); - src_itr += src->stride; - alpha_itr += src->stride; - dst_itr += dst->stride; - } - else - for (y = 0; y < h; y++) - { - _soft16_scanline_blend_transp_solid_mul_color_transp - (src_itr, alpha_itr, dst_itr, w, rel_alpha, r, g, b); - src_itr += src->stride; - alpha_itr += src->stride; - dst_itr += dst->stride; - } -} - -static inline void -_soft16_image_draw_unscaled_mul_color(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int width, int height) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_unscaled_transp_solid_mul_color - (src, dst, dc, src_offset, dst_offset, width, height); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_unscaled_solid_solid_mul_color - (src, dst, dc, src_offset, dst_offset, width, height); - else - fprintf(stderr, - "Unsupported draw of unscaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITH COLOR MUL 0x%08x\n", - src->have_alpha, dst->have_alpha, dc->mul.col); -} - -static inline void -_soft16_image_draw_unscaled_mul(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int src_offset, int dst_offset, - int width, int height) -{ - if ((A_VAL(&dc->mul.col) == R_VAL(&dc->mul.col)) && - (A_VAL(&dc->mul.col) == G_VAL(&dc->mul.col)) && - (A_VAL(&dc->mul.col) == B_VAL(&dc->mul.col))) - _soft16_image_draw_unscaled_mul_alpha(src, dst, dc, src_offset, - dst_offset, width, height); - else - _soft16_image_draw_unscaled_mul_color(src, dst, dc, src_offset, - dst_offset, width, height); -} - -static 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) -{ - int src_offset_rows, src_offset, dst_offset; - - src_offset_rows = (cr.y - dr.y) + sr.y; - src_offset = (src_offset_rows * src->stride) + (cr.x - dr.x) + sr.x; - - dst_offset = cr.x + (cr.y * dst->stride); - - if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) - _soft16_image_draw_unscaled_no_mul(src, dst, dc, src_offset, dst_offset, - cr.w, cr.h); - else if (dc->mul.col != 0x00000000) - _soft16_image_draw_unscaled_mul(src, dst, dc, src_offset, dst_offset, - cr.w, cr.h); -} - -/*********************************************************************** - * Scaled - ***********************************************************************/ -static void -_soft16_image_draw_scaled_solid_solid(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - int x; - - s = src->pixels + offset_y[y]; - pld(s, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(offset_x + x, 32); - - UNROLL8({ - _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_solid_solid(d, s[offset_x[x]]); - } -} -static void -_soft16_image_draw_scaled_transp_solid(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - DATA8 *a; - int x; - - s = src->pixels + offset_y[y]; - a = src->alpha + offset_y[y]; - pld(s, 0); - pld(a, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(a, 8); - pld(offset_x + x, 32); - - UNROLL8({ - int off_x = offset_x[x]; - _soft16_pt_blend_transp_solid(d, s[off_x], a[off_x]); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_transp_solid(d, s[offset_x[x]], a[offset_x[x]]); - } -} - -static inline void -_soft16_image_draw_scaled_no_mul(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_scaled_transp_solid - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_scaled_solid_solid - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else - fprintf(stderr, - "Unsupported draw of scaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITHOUT COLOR MUL\n", - src->have_alpha, dst->have_alpha); -} - -static void -_soft16_image_draw_scaled_solid_solid_mul_alpha(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align, rel_alpha; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - int x; - - s = src->pixels + offset_y[y]; - pld(s, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(offset_x + x, 32); - - UNROLL8({ - _soft16_pt_blend_solid_solid_mul_alpha - (d, s[offset_x[x]], rel_alpha); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_solid_solid_mul_alpha - (d, s[offset_x[x]], rel_alpha); - } -} - -static void -_soft16_image_draw_scaled_transp_solid_mul_alpha(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align, rel_alpha; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - DATA8 *a; - int x; - - s = src->pixels + offset_y[y]; - a = src->alpha + offset_y[y]; - pld(s, 0); - pld(a, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(a, 8); - pld(offset_x + x, 32); - - UNROLL8({ - int off_x = offset_x[x]; - _soft16_pt_blend_transp_solid_mul_alpha - (d, s[off_x], a[off_x], rel_alpha); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_transp_solid_mul_alpha - (d, s[offset_x[x]], a[offset_x[x]], rel_alpha); - } -} - -static inline void -_soft16_image_draw_scaled_mul_alpha(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_scaled_transp_solid_mul_alpha - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_scaled_solid_solid_mul_alpha - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else - fprintf(stderr, - "Unsupported draw of scaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITH ALPHA MUL %d\n", - src->have_alpha, dst->have_alpha, A_VAL(&dc->mul.col)); -} - -static void -_soft16_image_draw_scaled_solid_solid_mul_color(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align, rel_alpha, r, g, b; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - - r = R_VAL(&dc->mul.col); - g = G_VAL(&dc->mul.col); - b = B_VAL(&dc->mul.col); - /* we'll divide by 256 to make it faster, try to improve things a bit */ - if (r > 127) r++; - if (g > 127) g++; - if (b > 127) b++; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - - if (rel_alpha == 31) - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - int x; - - s = src->pixels + offset_y[y]; - pld(s, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(offset_x + x, 32); - - UNROLL8({ - _soft16_pt_blend_solid_solid_mul_color_solid - (d, s[offset_x[x]], r, g, b); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_solid_solid_mul_color_solid - (d, s[offset_x[x]], r, g, b); - } - else - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - int x; - - s = src->pixels + offset_y[y]; - pld(s, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(offset_x + x, 32); - - UNROLL8({ - _soft16_pt_blend_solid_solid_mul_color_transp - (d, s[offset_x[x]], rel_alpha, r, g, b); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_solid_solid_mul_color_transp - (d, s[offset_x[x]], rel_alpha, r, g, b); - } -} - -static void -_soft16_image_draw_scaled_transp_solid_mul_color(Soft16_Image *src, - Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - DATA16 *dst_itr; - int y, w_align, rel_alpha, r, g, b; - - rel_alpha = A_VAL(&dc->mul.col) >> 3; - if ((rel_alpha < 1) || (rel_alpha > 31)) return; - rel_alpha = 31 - rel_alpha; - - r = R_VAL(&dc->mul.col); - g = G_VAL(&dc->mul.col); - b = B_VAL(&dc->mul.col); - /* we'll divide by 256 to make it faster, try to improve things a bit */ - if (r > 127) r++; - if (g > 127) g++; - if (b > 127) b++; - - w_align = w & ~7; - - dst_itr = dst->pixels + dst_offset; - - if (rel_alpha == 0) - for (y = 0; y < h; y++, dst_itr += dst->stride) - { - DATA16 *d, *s; - DATA8 *a; - int x; - - s = src->pixels + offset_y[y]; - a = src->alpha + offset_y[y]; - pld(s, 0); - pld(a, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(a, 8); - pld(offset_x + x, 32); - - UNROLL8({ - int off_x = offset_x[x]; - _soft16_pt_blend_transp_solid_mul_color_solid - (d, s[off_x], a[off_x], r, g, b); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_transp_solid_mul_color_solid - (d, s[offset_x[x]], a[offset_x[x]], r, g, b); - } - else - { - DATA16 *d, *s; - DATA8 *a; - int x; - - s = src->pixels + offset_y[y]; - a = src->alpha + offset_y[y]; - pld(s, 0); - pld(a, 0); - pld(offset_x, 0); - - d = dst_itr; - x = 0; - while (x < w_align) - { - pld(s, 32); - pld(a, 8); - pld(offset_x + x, 32); - - UNROLL8({ - int off_x = offset_x[x]; - _soft16_pt_blend_transp_solid_mul_color_transp - (d, s[off_x], a[off_x], rel_alpha, r, g, b); - x++; - d++; - }); - } - - for (; x < w; x++, d++) - _soft16_pt_blend_transp_solid_mul_color_transp - (d, s[offset_x[x]], a[offset_x[x]], rel_alpha, r, g, b); - } -} - -static inline void -_soft16_image_draw_scaled_mul_color(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - if (src->have_alpha && (!dst->have_alpha)) - _soft16_image_draw_scaled_transp_solid_mul_color - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else if ((!src->have_alpha) && (!dst->have_alpha)) - _soft16_image_draw_scaled_solid_solid_mul_color - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else - fprintf(stderr, - "Unsupported draw of scaled images src->have_alpha=%d, " - "dst->have_alpha=%d, WITH COLOR MUL 0x%08x\n", - src->have_alpha, dst->have_alpha, dc->mul.col); -} - -static inline void -_soft16_image_draw_scaled_mul(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - int dst_offset, int w, int h, - int *offset_x, int *offset_y) -{ - if ((A_VAL(&dc->mul.col) == R_VAL(&dc->mul.col)) && - (A_VAL(&dc->mul.col) == G_VAL(&dc->mul.col)) && - (A_VAL(&dc->mul.col) == B_VAL(&dc->mul.col))) - _soft16_image_draw_scaled_mul_alpha - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); - else - _soft16_image_draw_scaled_mul_color - (src, dst, dc, dst_offset, w, h, offset_x, offset_y); -} - -static void -_soft16_image_draw_scaled(Soft16_Image *src, Soft16_Image *dst, - RGBA_Draw_Context *dc, - const Evas_Rectangle sr, - const Evas_Rectangle dr, - const Evas_Rectangle cr) -{ - int x, y, dst_offset, *offset_x, *offset_y; - - /* pre-calculated scale tables */ - offset_x = alloca(cr.w * sizeof(*offset_x)); - for (x = 0; x < cr.w; x++) - offset_x[x] = (((x + cr.x - dr.x) * sr.w) / dr.w) + sr.x; - - offset_y = alloca(cr.h * sizeof(*offset_y)); - for (y = 0; y < cr.h; y++) - offset_y[y] = (((((y + cr.y - dr.y) * sr.h) / dr.h) + sr.y) - * src->stride); - - dst_offset = cr.x + (cr.y * dst->stride); - - if ((!dc->mul.use) || (dc->mul.col == 0xffffffff)) - _soft16_image_draw_scaled_no_mul - (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); - else if (dc->mul.col != 0x00000000) - _soft16_image_draw_scaled_mul - (src, dst, dc, dst_offset, cr.w, cr.h, offset_x, offset_y); -} - static void _soft16_image_draw_sampled_int(Soft16_Image *src, Soft16_Image *dst, RGBA_Draw_Context *dc, @@ -1174,12 +409,12 @@ _get_clip(dc, dst, &cr); if (!_soft16_adjust_areas(&sr, src->w, src->h, &dr, dst->w, dst->h, &cr)) - return; + return; if ((dr.w == sr.w) && (dr.h == sr.h)) - _soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); + soft16_image_draw_unscaled(src, dst, dc, sr, dr, cr); else - _soft16_image_draw_scaled(src, dst, dc, sr, dr, cr); + soft16_image_draw_scaled_sampled(src, dst, dc, sr, dr, cr); } void |
From: Enlightenment C. <no...@cv...> - 2007-06-21 20:10:25
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_main.c Log Message: Name clip structure, make it simple to save and restore clip info. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -3 -r1.8 -r1.9 --- evas_soft16_main.c 21 Jun 2007 19:57:56 -0000 1.8 +++ evas_soft16_main.c 21 Jun 2007 20:10:13 -0000 1.9 @@ -429,7 +429,7 @@ Evas_Rectangle sr, dr; Cutout_Rects *rects; Cutout_Rect *r; - int c, cx, cy, cw, ch; + struct RGBA_Draw_Context_clip clip_bkp; int i; /* handle cutouts here! */ @@ -459,13 +459,13 @@ } /* save out clip info */ - c = dc->clip.use; cx = dc->clip.x; cy = dc->clip.y; cw = dc->clip.w; ch = dc->clip.h; + clip_bkp = dc->clip; evas_common_draw_context_clip_clip(dc, 0, 0, dst->w, dst->h); evas_common_draw_context_clip_clip(dc, dst_region_x, dst_region_y, dst_region_w, dst_region_h); /* our clip is 0 size.. abort */ if ((dc->clip.w <= 0) || (dc->clip.h <= 0)) { - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + dc->clip = clip_bkp; return; } rects = evas_common_draw_context_apply_cutouts(dc); @@ -476,7 +476,6 @@ _soft16_image_draw_sampled_int(src, dst, dc, sr, dr); } evas_common_draw_context_apply_clear_cutouts(rects); - /* restore clip info */ - dc->clip.use = c; dc->clip.x = cx; dc->clip.y = cy; dc->clip.w = cw; dc->clip.h = ch; + dc->clip = clip_bkp; } |
From: Enlightenment C. <no...@cv...> - 2007-06-21 20:10:50
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/include Modified Files: evas_common.h Log Message: Name clip structure, make it simple to save and restore clip info. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/include/evas_common.h,v retrieving revision 1.84 retrieving revision 1.85 diff -u -3 -r1.84 -r1.85 --- evas_common.h 4 Jun 2007 18:32:57 -0000 1.84 +++ evas_common.h 21 Jun 2007 20:10:13 -0000 1.85 @@ -262,7 +262,7 @@ struct { DATA32 col; } col; - struct { + struct RGBA_Draw_Context_clip { char use : 1; int x, y, w, h; } clip; |
From: Enlightenment C. <no...@cv...> - 2007-07-10 15:01:54
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_engine.c Log Message: fix evas software 16 engine build and to add the missing image_data_get method. By Andre Magalhaes <andrunko/gmail.com> =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_engine.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- evas_engine.c 19 Jun 2007 22:52:12 -0000 1.4 +++ evas_engine.c 10 Jul 2007 15:01:52 -0000 1.5 @@ -320,12 +320,7 @@ static int eng_image_colorspace_get(void *data, void *image) { - Soft16_Image *im; - - if (!image) return EVAS_COLORSPACE_RGB565; - im = image; - if (im->have_alpha) return EVAS_COLORSPACE_RGB565_A5P; - return EVAS_COLORSPACE_RGB565; + return EVAS_COLORSPACE_RGB565_A5P; } static void * @@ -431,8 +426,31 @@ static void * eng_image_data_get(void *data, void *image, int to_write, DATA32 **image_data) { - // FIXME: implement - *image_data = NULL; + Soft16_Image *im; + + if (!image) + { + *image_data = NULL; + return NULL; + } + + im = image; + + if (to_write) + { + if (im->references > 1) + { + Soft16_Image *im_new; + + im_new = soft16_image_new(im->w, im->h, im->stride, im->have_alpha, im->pixels, 1); + if (!im_new) return im; + soft16_image_free(im); + im = im_new; + } + } + + if (image_data) *image_data = (DATA32 *) im->pixels; + return image; } |
From: Enlightenment C. <no...@cv...> - 2007-07-12 21:51:37
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_engine.c Log Message: Ensure data is loaded when data_get() is called. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_engine.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- evas_engine.c 10 Jul 2007 15:01:52 -0000 1.5 +++ evas_engine.c 12 Jul 2007 21:51:36 -0000 1.6 @@ -435,6 +435,7 @@ } im = image; + soft16_image_load_data(im); if (to_write) { |
From: Enlightenment C. <no...@cv...> - 2007-07-13 15:19:10
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16.h Log Message: Fix compile time CPU detection on ARM =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -3 -r1.5 -r1.6 --- evas_soft16.h 21 Jun 2007 19:57:56 -0000 1.5 +++ evas_soft16.h 13 Jul 2007 15:19:08 -0000 1.6 @@ -24,8 +24,30 @@ #define UNROLL8(op...) UNROLL4(op) UNROLL4(op) #define UNROLL16(op...) UNROLL8(op) UNROLL8(op) +#if defined(__ARM_ARCH_3M__) || defined(__ARM_ARCH_4__) || \ + defined(__ARM_ARCH_4T__) +# define __ARM_ARCH__ 4 +#endif -#if defined(__ARMEL__) +#if defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \ + defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) || \ + defined(__ARM_ARCH_5TEJ__) +# define __ARM_ARCH__ 5 +#endif + +#if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \ + defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || \ + defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) +# define __ARM_ARCH__ 6 +#endif + +#if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \ + defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) +# define __ARM_ARCH__ 7 +#endif + + +#if defined(__ARM_ARCH__) && (__ARM_ARCH__ >= 5) /* tested on ARMv6 (arm1136j-s), Nokia N800 CPU */ #define pld(addr, off) \ __asm__("pld [%[address], %[offset]]":: \ |
From: Enlightenment C. <no...@cv...> - 2007-07-20 00:18:10
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: Makefile.am evas_soft16.h evas_soft16_main.c Added Files: evas_soft16_dither_mask.c Log Message: Use dither mask when importing images. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/Makefile.am,v retrieving revision 1.4 retrieving revision 1.5 diff -u -3 -r1.4 -r1.5 --- Makefile.am 21 Jun 2007 19:57:56 -0000 1.4 +++ Makefile.am 20 Jul 2007 00:18:07 -0000 1.5 @@ -12,6 +12,7 @@ module_la_SOURCES = \ evas_engine.c \ evas_soft16.h \ +evas_soft16_dither_mask.c \ evas_soft16_main.c \ evas_soft16_image_unscaled.c \ evas_soft16_image_scaled_sampled.c \ @@ -27,6 +28,7 @@ EXTRA_DIST = \ evas_engine.c \ evas_soft16.h \ +evas_soft16_dither_mask.c \ evas_soft16_main.c \ evas_soft16_image_unscaled.c \ evas_soft16_image_scaled_sampled.c \ =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -3 -r1.6 -r1.7 --- evas_soft16.h 13 Jul 2007 15:19:08 -0000 1.6 +++ evas_soft16.h 20 Jul 2007 00:18:07 -0000 1.7 @@ -90,6 +90,10 @@ 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); +/* convert/dither functions */ +void soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src); +void soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src); + /** * Rectangle (evas_soft16_rectangle.c) =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_main.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -3 -r1.12 -r1.13 --- evas_soft16_main.c 16 Jul 2007 07:25:34 -0000 1.12 +++ evas_soft16_main.c 20 Jul 2007 00:18:07 -0000 1.13 @@ -203,51 +203,12 @@ DATA32 *sp; DATA16 *dpl; - /* FIXME: dither and optimize */ sp = src; dpl = im->pixels; if (im->alpha) - { - DATA8 *dal; - dal = im->alpha; - int y; - - for (y = 0; y < im->h; y++) - { - DATA16 *dp, *dp_end; - DATA8 *da; - - dp = dpl; - dp_end = dp + im->w; - da = dal; - - for (; dp < dp_end; da++, dp++, sp++) - { - *da = A_VAL(sp) >> 3; - *dp = RGB_565_FROM_COMPONENTS(R_VAL(sp), G_VAL(sp), B_VAL(sp)); - } - - dpl += im->stride; - dal += im->stride; - } - } + soft16_image_convert_from_rgba(im, src); else - { - int y; - - for (y = 0; y < im->h; y++) - { - DATA16 *dp, *dp_end; - - dp = dpl; - dp_end = dp + im->w; - - for (; dp < dp_end; dp++, sp++) - *dp = RGB_565_FROM_COMPONENTS(R_VAL(sp), G_VAL(sp), B_VAL(sp)); - - dpl += im->stride; - } - } + soft16_image_convert_from_rgb(im, src); } void |
From: Enlightenment C. <no...@cv...> - 2007-07-20 17:29:35
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/modules/engines/software_16 Modified Files: evas_soft16_dither_mask.c Log Message: Fix CPP warnings about DM_* macros, do loop unrolling for dither mask processing. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/modules/engines/software_16/evas_soft16_dither_mask.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- evas_soft16_dither_mask.c 20 Jul 2007 00:18:07 -0000 1.1 +++ evas_soft16_dither_mask.c 20 Jul 2007 17:29:31 -0000 1.2 @@ -1,12 +1,12 @@ #include "evas_soft16.h" -#define DM_SIZE 128 -#define DM_BITS 6 -#define DM_DIV 64 -#define DM_MSK (DM_SIZE - 1) -#define DM_SHF(_b) (DM_BITS - (8 - _b)) +#define S16_DM_SIZE 128 +#define S16_DM_BITS 6 +#define S16_DM_DIV 64 +#define S16_DM_MSK (S16_DM_SIZE - 1) +#define S16_DM_SHF(_b) (S16_DM_BITS - (8 - _b)) -static const DATA8 dither_table[DM_SIZE][DM_SIZE] = +static const DATA8 dither_table[S16_DM_SIZE][S16_DM_SIZE] = { { 0, 41, 23, 5, 17, 39, 7, 15, 62, 23, 40, 51, 31, 47, 9, 32, 52, 27, 57, 25, 6, 61, 27, 52, 37, 7, 40, 63, 18, 36, 10, 42, 25, 62, 45, 34, 20, 42, 37, 14, 35, 29, 50, 10, 61, 2, 40, 8, 37, 12, 58, 22, 5, 41, 10, 39, 0, 60, 11, 46, 2, 55, 38, 17, 36, 59, 13, 54, 37, 56, 8, 29, 16, 13, 63, 22, 41, 55, 7, 20, 49, 14, 23, 55, 37, 23, 19, 36, 15, 49, 23, 63, 30, 14, 38, 27, 53, 13, 22, 41, 19, 31, 7, 19, 50, 30, 49, 16, 3, 32, 56, 40, 29, 34, 8, 48, 19, 45, 4, 51, 12, 46, 35, 49, 16, 42, 12, 62 }, { 30, 57, 36, 54, 47, 34, 52, 27, 43, 4, 28, 7, 17, 36, 62, 13, 44, 7, 18, 48, 33, 21, 44, 14, 30, 47, 12, 33, 5, 55, 31, 58, 13, 30, 4, 17, 52, 10, 60, 26, 46, 0, 39, 27, 42, 22, 47, 25, 60, 32, 9, 38, 48, 17, 59, 30, 49, 18, 34, 25, 51, 19, 5, 48, 21, 8, 28, 46, 1, 32, 41, 19, 54, 47, 37, 18, 28, 11, 44, 30, 39, 56, 2, 33, 8, 42, 61, 28, 58, 8, 46, 9, 41, 4, 58, 7, 21, 48, 59, 10, 52, 14, 42, 57, 12, 25, 7, 53, 42, 24, 11, 50, 17, 59, 42, 2, 36, 60, 32, 17, 63, 29, 21, 7, 59, 32, 24, 39 }, @@ -142,7 +142,7 @@ _soft16_convert_from_rgba_pt(const DATA32 *src, DATA16 *dst, DATA8 *alpha, const int x, const int y) { - DATA8 orig_r, orig_g, orig_b, orig_a, r, g, b, a, dith5, dith6; + DATA8 orig_r, orig_g, orig_b, orig_a, r, g, b, a, dith5, dith6, dith; orig_r = R_VAL(src); orig_g = G_VAL(src); @@ -154,8 +154,9 @@ b = orig_b >> 3; a = orig_a >> 3; - dith5 = dither_table[x & DM_MSK][y & DM_MSK] >> DM_SHF(5); - dith6 = dither_table[x & DM_MSK][y & DM_MSK] >> DM_SHF(6); + dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; + dith5 = dith >> S16_DM_SHF(5); + dith6 = dith >> S16_DM_SHF(6); if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; @@ -166,29 +167,53 @@ *alpha = a; } +static inline void +_soft16_convert_from_rgba_scanline(const DATA32 *src, DATA16 *dst, + DATA8 *alpha, const int y, const int w) +{ + int x, m; + + m = (w & ~7); + x = 0; + pld(src, 0); + + while (x < m) + { + pld(src, 32); + UNROLL8({ + _soft16_convert_from_rgba_pt(src, dst, alpha, x, y); + src++; + dst++; + alpha++; + x++; + }); + } + + for (; x < w; x++, src++, dst++, alpha++) + _soft16_convert_from_rgba_pt(src, dst, alpha, x, y); +} + void soft16_image_convert_from_rgba(Soft16_Image *im, const DATA32 *src) { const DATA32 *sp; DATA16 *dp; DATA8 *ap; - int x, y, pad; + int y; sp = src; dp = im->pixels; ap = im->alpha; - pad = im->stride - im->w; - for (y = 0; y < im->h; y++, dp += pad, ap += pad) - for (x = 0; x < im->w; x++, sp++, dp++, ap++) - _soft16_convert_from_rgba_pt(sp, dp, ap, x, y); + for (y = 0; y < im->h; y++, sp += im->w, dp += im->stride, ap += im->stride) + _soft16_convert_from_rgba_scanline(sp, dp, ap, y, im->w); } static inline void _soft16_convert_from_rgb_pt(const DATA32 *src, DATA16 *dst, const int x, const int y) { - DATA8 orig_r, orig_g, orig_b, r, g, b, dith5, dith6; + DATA8 orig_r, orig_g, orig_b, r, g, b, dith5, dith6, dith; orig_r = R_VAL(src); orig_g = G_VAL(src); @@ -198,8 +223,9 @@ g = orig_g >> 2; b = orig_b >> 3; - dith5 = dither_table[x & DM_MSK][y & DM_MSK] >> DM_SHF(5); - dith6 = dither_table[x & DM_MSK][y & DM_MSK] >> DM_SHF(6); + dith = dither_table[x & S16_DM_MSK][y & S16_DM_MSK]; + dith5 = dith >> S16_DM_SHF(5); + dith6 = dith >> S16_DM_SHF(6); if (((orig_r - (r << 3)) >= dith5) && (r < 0x1f)) r++; if (((orig_g - (g << 2)) >= dith6) && (g < 0x3f)) g++; @@ -208,6 +234,31 @@ *dst = (r << 11) | (g << 5) | b; } +static inline void +_soft16_convert_from_rgb_scanline(const DATA32 *src, DATA16 *dst, const int y, + const int w) +{ + int x, m; + + m = (w & ~7); + x = 0; + pld(src, 0); + + while (x < m) + { + pld(src, 32); + UNROLL8({ + _soft16_convert_from_rgb_pt(src, dst, x, y); + src++; + dst++; + x++; + }); + } + + for (; x < w; x++, src++, dst++) + _soft16_convert_from_rgb_pt(src, dst, x, y); +} + void soft16_image_convert_from_rgb(Soft16_Image *im, const DATA32 *src) { @@ -219,7 +270,6 @@ dp = im->pixels; pad = im->stride - im->w; - for (y = 0; y < im->h; y++, dp += pad) - for (x = 0; x < im->w; x++, sp++, dp++) - _soft16_convert_from_rgb_pt(sp, dp, x, y); + for (y = 0; y < im->h; y++, sp += im->w, dp += im->stride) + _soft16_convert_from_rgb_scanline(sp, dp, y, im->w); } |
From: Enlightenment C. <no...@cv...> - 2007-07-20 22:30:14
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib/canvas Modified Files: evas_object_textblock.c Log Message: Fix bug introduced with r1.138, removed incorrect offset table. I changed evas_object_textblock_text_markup_get() to just return previously known contents, not try to recreate them set with other means, this was not used (at least in our CVS) and was slow and incorrect. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v retrieving revision 1.140 retrieving revision 1.141 diff -u -3 -r1.140 -r1.141 --- evas_object_textblock.c 28 Jun 2007 23:22:20 -0000 1.140 +++ evas_object_textblock.c 20 Jul 2007 22:30:12 -0000 1.141 @@ -627,48 +627,6 @@ "Ω\0\xce\xa9\0" ; -static const unsigned short escape_offsets[] = { - 0, 4, 5, 9, 10, 15, 16, 22, 23, 29, 30, 36, - 38, 43, 45, 53, 56, 64, 66, 74, 76, 84, 86, - 94, 96, 103, 105, 112, 114, 121, 123, 128, 130, - 135, 137, 144, 146, 153, 155, 160, 162, 167, - 169, 175, 177, 184, 186, 194, 196, 201, 203, - 209, 212, 218, 220, 226, 228, 235, 237, 244, - 246, 253, 255, 263, 265, 273, 275, 281, 283, - 289, 291, 298, 300, 306, 308, 315, 318, 323, - 326, 331, 334, 340, 343, 349, 352, 356, 359, - 364, 367, 374, 377, 381, 384, 392, 395, 402, - 405, 412, 415, 421, 424, 430, 433, 439, 442, - 448, 451, 457, 460, 466, 469, 475, 478, 486, - 488, 496, 498, 505, 507, 515, 517, 523, 525, - 531, 533, 539, 541, 549, 551, 559, 561, 569, - 571, 576, 578, 586, 588, 596, 598, 606, 608, - 616, 618, 626, 628, 636, 638, 646, 648, 656, - 658, 666, 668, 676, 678, 686, 688, 696, 698, - 705, 707, 714, 716, 723, 725, 732, 734, 741, - 743, 750, 752, 759, 761, 768, 770, 777, 779, - 786, 788, 796, 798, 806, 808, 816, 818, 826, - 828, 836, 838, 846, 848, 856, 858, 866, 868, - 876, 878, 886, 888, 894, 896, 902, 904, 910, - 912, 918, 920, 926, 928, 934, 936, 942, 944, - 950, 952, 958, 960, 966, 968, 976, 978, 986, - 988, 996, 998, 1006, 1008, 1015, 1017, 1024, 1026, - 1034, 1036, 1044, 1046, 1053, 1055, 1062, 1064, 1072, - 1074, 1082, 1084, 1092, 1094, 1102, 1104, 1111, 1113, - 1120, 1122, 1129, 1131, 1136, 1138, 1143, 1145, 1152, - 1154, 1160, 1162, 1169, 1171, 1178, 1180, 1189, 1191, - 1197, 1199, 1204, 1206, 1213, 1215, 1221, 1223, 1230, - 1232, 1240, 1242, 1246, 1248, 1252, 1254, 1263, 1265, - 1269, 1271, 1275, 1277, 1282, 1284, 1291, 1293, 1298, - 1300, 1309, 1311, 1316, 1318, 1323, 1325, 1330, 1332, - 1339, 1341, 1348, 1350, 1356, 1358, 1365, 1367, 1374, - 1376, 1385, 1387, 1393, 1395, 1400, 1402, 1409, 1411, - 1417, 1419, 1426, 1428, 1436, 1438, 1442, 1444, 1448, - 1450, 1459, 1461, 1465, 1467, 1471, 1473, 1478, 1480, - 1487, 1489, 1494, 1496, 1505, 1507, 1512, 1514, 1519, - 1521, 1526, 1528, 1535 -}; - static int _is_white(int c) @@ -2462,6 +2420,55 @@ return o->style; } +static inline void +_advance_after_end_of_string(const char **p_buf) +{ + while (**p_buf != '\0') + (*p_buf)++; + + if (**p_buf == '\0') + (*p_buf)++; +} + +static inline int +_is_eq_and_advance(const char *s, const char *s_end, + const char **p_m, const char *m_end) +{ + for (;((s < s_end) && (*p_m < m_end)); s++, (*p_m)++) + if (*s != **p_m) + { + _advance_after_end_of_string(p_m); + return 0; + } + + if (*p_m < m_end) + _advance_after_end_of_string(p_m); + + return s == s_end; +} + +static inline void +_append_escaped_char(Evas_Textblock_Cursor *cur, const char *s, + const char *s_end) +{ + const char *map_itr, *map_end; + + map_itr = escape_strings; + map_end = map_itr + sizeof(escape_strings); + + while (map_itr < map_end) + { + if (_is_eq_and_advance(s, s_end, &map_itr, map_end)) + { + evas_textblock_cursor_text_append(cur, map_itr); + return; + } + + if (map_itr < map_itr) + _advance_after_end_of_string(&map_itr); + } +} + EAPI void evas_object_textblock_text_markup_set(Evas_Object *obj, const char *text) { @@ -2535,19 +2542,7 @@ } else if (esc_end) { - int i; - - for (i = 0; i < (int)(sizeof(escape_offsets) / sizeof(escape_offsets[0])); i += 2) - { - const char *in = escape_strings + escape_offsets[i]; - const char *out = escape_strings + escape_offsets[i + 1]; - - if (!strncmp(in, esc_start, esc_end - esc_start + 1)) - { - evas_textblock_cursor_text_append(o->cursor, out); - break; - } - } + _append_escaped_char(o->cursor, esc_start, esc_end); esc_start = esc_end = NULL; } else if (*p == 0) @@ -2612,87 +2607,6 @@ evas_object_textblock_text_markup_get(Evas_Object *obj) { TB_HEAD_RETURN(NULL); - if (!o->markup_text) - { - Evas_Textblock_Cursor *cur; - int slen = 0; - int salloc = 0; - - cur = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_node_first(cur); - do - { - char *s, *p, *ps; - - s = (char *)evas_textblock_cursor_node_text_get(cur); - if (s) - { - p = s; - ps = p; - for (;;) - { - if (*p == 0) - { - o->markup_text = _strbuf_append(o->markup_text, - ps, - &slen, &salloc); - break; - } - else - { - int i; - - for (i = 1; i < (int)(sizeof(escape_offsets) / sizeof(escape_offsets[0])); i += 2) - { - const char *in = escape_strings + escape_offsets[i]; - const char *out = escape_strings + escape_offsets[i - 1]; - - if (!strncmp(in, p, strlen(in))) - { - o->markup_text = _strbuf_append_n(o->markup_text, - ps, p - ps, - &slen, &salloc); - o->markup_text = _strbuf_append(o->markup_text, - out, - &slen, &salloc); - ps = p + strlen(in); - p += strlen(in) - 1; - } - } - } - /* FIXME: strip extra whitespace ala HTML */ - p++; - } - } - else - { - s = (char *)evas_textblock_cursor_node_format_get(cur); - if (s) - { - char *stag; - - o->markup_text = _strbuf_append(o->markup_text, - "<", - &slen, &salloc); - stag = _style_match_replace(o->style, s); - if (stag) - o->markup_text = _strbuf_append(o->markup_text, - stag, - &slen, &salloc); - else - o->markup_text = _strbuf_append(o->markup_text, - s, - &slen, &salloc); - o->markup_text = _strbuf_append(o->markup_text, - ">", - &slen, &salloc); - } - } - - } - while (evas_textblock_cursor_node_next(cur)); - evas_textblock_cursor_free(cur); - } return o->markup_text; } |
From: Enlightenment C. <no...@cv...> - 2007-07-24 14:20:39
|
Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/evas Dir : e17/libs/evas/src/lib Modified Files: Evas.h Log Message: Support for selectable pointer_mode. Evas now support objects that do not grab mouse down event (NOGRAB) aside with the default (AUTOGRAB). API is meant to be extensible. =================================================================== RCS file: /cvs/e/e17/libs/evas/src/lib/Evas.h,v retrieving revision 1.101 retrieving revision 1.102 diff -u -3 -r1.101 -r1.102 --- Evas.h 23 Jul 2007 14:22:56 -0000 1.101 +++ Evas.h 24 Jul 2007 14:20:07 -0000 1.102 @@ -330,6 +330,12 @@ unsigned int timestamp; }; +typedef enum _Evas_Object_Pointer_Mode +{ + EVAS_OBJECT_POINTER_MODE_AUTOGRAB, /**< default, X11-like */ + EVAS_OBJECT_POINTER_MODE_NOGRAB +} Evas_Object_Pointer_Mode; + #ifdef __cplusplus extern "C" { #endif @@ -767,6 +773,9 @@ EAPI Evas_Bool evas_object_repeat_events_get (Evas_Object *obj); EAPI void evas_object_propagate_events_set (Evas_Object *obj, Evas_Bool prop); EAPI Evas_Bool evas_object_propagate_events_get (Evas_Object *obj); + EAPI void evas_object_pointer_mode_set (Evas_Object *obj, Evas_Object_Pointer_Mode setting); + EAPI Evas_Object_Pointer_Mode evas_object_pointer_mode_get(Evas_Object *obj); + EAPI void evas_object_precise_is_inside_set (Evas_Object *obj, Evas_Bool precise); EAPI Evas_Bool evas_object_precise_is_inside_get (Evas_Object *obj); |