diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2017-06-28 17:06:04 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2017-07-07 15:21:44 -0400 |
commit | 0c66472dd25d3ad6b47e598aba536ca6aded54fd (patch) | |
tree | 81fe5a08f7106b62a202c1271c3637cc48668a2c | |
parent | 72cc7b0561e76b1c087a9d5b364d6058f0b0d745 (diff) | |
download | efl-devs/discomfitor/rotation.tar.gz |
evas: add rotation support for buffer canvas in RGB modedevs/discomfitor/rotation
@feature
-rw-r--r-- | src/lib/ecore_evas/ecore_evas_buffer.c | 82 | ||||
-rw-r--r-- | src/lib/ecore_evas/ecore_evas_buffer.h | 1 | ||||
-rw-r--r-- | src/modules/evas/engines/buffer/Evas_Engine_Buffer.h | 2 | ||||
-rw-r--r-- | src/modules/evas/engines/buffer/evas_engine.c | 7 | ||||
-rw-r--r-- | src/modules/evas/engines/buffer/evas_engine.h | 10 | ||||
-rw-r--r-- | src/modules/evas/engines/buffer/evas_outbuf.c | 217 |
6 files changed, 266 insertions, 53 deletions
diff --git a/src/lib/ecore_evas/ecore_evas_buffer.c b/src/lib/ecore_evas/ecore_evas_buffer.c index dcb9fa13f1..e3a75c2577 100644 --- a/src/lib/ecore_evas/ecore_evas_buffer.c +++ b/src/lib/ecore_evas/ecore_evas_buffer.c @@ -30,8 +30,9 @@ _ecore_evas_buffer_free(Ecore_Evas *ee) } else { - bdata->free_func(bdata->data, - bdata->pixels); + bdata->free_func(bdata->data, bdata->pixels); + if (bdata->swap) + bdata->free_func(bdata->data, bdata->swap); } free(bdata); @@ -51,9 +52,18 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h) if ((w == ee->w) && (h == ee->h)) return; ee->w = w; ee->h = h; - evas_output_size_set(ee->evas, ee->w, ee->h); - evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); - evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + if (PORTRAIT_CHECK(ee->rotation)) + { + evas_output_size_set(ee->evas, ee->w, ee->h); + evas_output_viewport_set(ee->evas, 0, 0, ee->w, ee->h); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->w, ee->h); + } + else + { + evas_output_size_set(ee->evas, ee->h, ee->w); + evas_output_viewport_set(ee->evas, 0, 0, ee->h, ee->w); + evas_damage_rectangle_add(ee->evas, 0, 0, ee->h, ee->w); + } if (bdata->image) { @@ -63,11 +73,18 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h) else { if (bdata->pixels) - bdata->free_func(bdata->data, - bdata->pixels); - bdata->pixels = bdata->alloc_func(bdata->data, - ee->w * ee->h * sizeof(int)); - stride = ee->w * sizeof(int); + bdata->free_func(bdata->data, bdata->pixels); + if (bdata->swap) + bdata->free_func(bdata->data, bdata->swap); + bdata->pixels = bdata->alloc_func(bdata->data, ee->w * ee->h * sizeof(int)); + bdata->swap = NULL; + if (ee->rotation) + bdata->swap = bdata->alloc_func(bdata->data, ee->w * ee->h * sizeof(int)); + if (PORTRAIT_CHECK(ee->rotation)) + stride = ee->w; + else + stride = ee->h; + stride *= sizeof(int); } einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas); @@ -83,6 +100,7 @@ _ecore_evas_resize(Ecore_Evas *ee, int w, int h) einfo->info.alpha_threshold = 0; einfo->info.func.new_update_region = NULL; einfo->info.func.free_update_region = NULL; + einfo->info.render_buffer = bdata->swap; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); @@ -100,6 +118,47 @@ _ecore_evas_move_resize(Ecore_Evas *ee, int x EINA_UNUSED, int y EINA_UNUSED, in } static void +_ecore_evas_buffer_rotation_set(Ecore_Evas *ee, int rotation, int resize) +{ + Evas_Engine_Info_Buffer *einfo; + const Evas_Device *pointer; + Ecore_Evas_Cursor *cursor = NULL; + Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data; + + if (rotation == ee->rotation) return; + if (bdata->image) return; //parent canvas should rotate? + pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_TYPE_SEAT); + if (pointer) cursor = eina_hash_find(ee->prop.cursors, &pointer); + einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(ee->evas); + einfo->info.rotation = rotation; + if (!resize) + { + if ((!rotation) && bdata->swap) + { + bdata->free_func(bdata->data, bdata->swap); + bdata->swap = NULL; + } + if (rotation && (!bdata->swap)) + bdata->swap = bdata->alloc_func(bdata->data, ee->w * ee->h * sizeof(int)); + } + einfo->info.render_buffer = bdata->swap; + if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info*)einfo)) + { + ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); + } + ee->rotation = rotation; + if (resize) + { + int w = ee->w, h = ee->h; + ee->w = 0, ee->h = 0; + _ecore_evas_resize(ee, w, h); + } + if (!cursor) return; + _ecore_evas_mouse_move_process(ee, cursor->pos_x, cursor->pos_y, + (unsigned int)((unsigned long long)(ecore_time_get() * 1000.0) & 0xffffffff)); +} + +static void _ecore_evas_show(Ecore_Evas *ee) { Ecore_Evas_Engine_Buffer_Data *bdata = ee->engine.data; @@ -641,7 +700,7 @@ static Ecore_Evas_Engine_Func _ecore_buffer_engine_func = NULL, _ecore_evas_resize, _ecore_evas_move_resize, - NULL, + _ecore_evas_buffer_rotation_set, NULL, _ecore_evas_show, NULL, @@ -801,6 +860,7 @@ ecore_evas_buffer_allocfunc_new(int w, int h, einfo->info.alpha_threshold = 0; einfo->info.func.new_update_region = NULL; einfo->info.func.free_update_region = NULL; + einfo->info.switch_data = ee; if (!evas_engine_info_set(ee->evas, (Evas_Engine_Info *)einfo)) { ERR("evas_engine_info_set() for engine '%s' failed.", ee->driver); diff --git a/src/lib/ecore_evas/ecore_evas_buffer.h b/src/lib/ecore_evas/ecore_evas_buffer.h index e29dee335b..234fde3ed1 100644 --- a/src/lib/ecore_evas/ecore_evas_buffer.h +++ b/src/lib/ecore_evas/ecore_evas_buffer.h @@ -5,6 +5,7 @@ typedef struct _Ecore_Evas_Engine_Buffer_Data Ecore_Evas_Engine_Buffer_Data; struct _Ecore_Evas_Engine_Buffer_Data { void *pixels; + void *swap; Evas_Object *image; void (*free_func) (void *data, void *pix); void *(*alloc_func) (void *data, int size); diff --git a/src/modules/evas/engines/buffer/Evas_Engine_Buffer.h b/src/modules/evas/engines/buffer/Evas_Engine_Buffer.h index 0f23758079..933ab7b446 100644 --- a/src/modules/evas/engines/buffer/Evas_Engine_Buffer.h +++ b/src/modules/evas/engines/buffer/Evas_Engine_Buffer.h @@ -19,6 +19,7 @@ struct _Evas_Engine_Info_Buffer int depth_type; void *dest_buffer; + void *render_buffer; int dest_buffer_row_bytes; Eina_Bool use_color_key : 1; @@ -33,6 +34,7 @@ struct _Evas_Engine_Info_Buffer } func; void *switch_data; + int rotation; } info; /* non-blocking or blocking mode */ diff --git a/src/modules/evas/engines/buffer/evas_engine.c b/src/modules/evas/engines/buffer/evas_engine.c index bd6543bc74..e7334b4670 100644 --- a/src/modules/evas/engines/buffer/evas_engine.c +++ b/src/modules/evas/engines/buffer/evas_engine.c @@ -19,7 +19,6 @@ static Evas_Func func, pfunc; typedef Render_Engine_Software_Generic Render_Engine; /* prototypes we will use here */ -static void *_output_setup(int w, int h, void *dest_buffer, int dest_buffer_row_bytes, int depth_type, int use_color_key, int alpha_threshold, int color_key_r, int color_key_g, int color_key_b, void *(*new_update_region)(int x, int y, int w, int h, int *row_bytes), void (*free_update_region)(int x, int y, int w, int h, void *data), void *(*switch_buffer)(void *data, void *dest_buffer), void *switch_data); static void *eng_info(Evas *eo_e EINA_UNUSED); static void eng_info_free(Evas *eo_e EINA_UNUSED, void *info); @@ -29,7 +28,9 @@ static void eng_output_free(void *engine EINA_UNUSED, void *data); static void * _output_setup(int w, int h, + int rot, void *dest_buffer, + void *render_buffer, int dest_buffer_row_bytes, int depth_type, int use_color_key, @@ -70,8 +71,10 @@ _output_setup(int w, A_VAL(&color_key) = 0; ob = evas_buffer_outbuf_buf_setup_fb(w, h, + rot, dep, dest_buffer, + render_buffer, dest_buffer_row_bytes, use_color_key, color_key, @@ -132,7 +135,9 @@ eng_setup(void *engine EINA_UNUSED, void *in, unsigned int w, unsigned int h) return _output_setup(w, h, + info->info.rotation, info->info.dest_buffer, + info->info.render_buffer, info->info.dest_buffer_row_bytes, info->info.depth_type, info->info.use_color_key, diff --git a/src/modules/evas/engines/buffer/evas_engine.h b/src/modules/evas/engines/buffer/evas_engine.h index 4fcf2e451f..c840ea0916 100644 --- a/src/modules/evas/engines/buffer/evas_engine.h +++ b/src/modules/evas/engines/buffer/evas_engine.h @@ -39,11 +39,13 @@ struct _Outbuf Outbuf_Depth depth; void *dest; + void *rdest; unsigned int dest_row_bytes; void *switch_data; int alpha_level; DATA32 color_key; + int rotation; Eina_Bool use_color_key : 1; Eina_Bool first_frame : 1; @@ -54,7 +56,8 @@ struct _Outbuf } func; struct { - RGBA_Image *back_buf; + RGBA_Image *back_buf; //not actually the back buffer, just a cache entry for the front buffer + RGBA_Image *render_buf; } priv; }; @@ -64,9 +67,10 @@ void evas_buffer_outbuf_buf_init (void); void evas_buffer_outbuf_buf_free (Outbuf *buf); void evas_buffer_outbuf_buf_update_fb (Outbuf *buf, - int w, int h, + int w, int h, int rot, Outbuf_Depth depth, void *dest, + void *rdest, int dest_row_bytes, int use_color_key, DATA32 color_key, @@ -75,7 +79,7 @@ void evas_buffer_outbuf_buf_update_fb (Outbuf *buf, void (*free_update_region) (int x, int y, int w, int h, void *data), void * (*switch_buffer) (void *data, void *dest_buffer), void *switch_data); -Outbuf *evas_buffer_outbuf_buf_setup_fb (int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, +Outbuf *evas_buffer_outbuf_buf_setup_fb (int w, int h, int rot, Outbuf_Depth depth, void *dest, void *rdest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes), void (*free_update_region) (int x, int y, int w, int h, void *data), void * (*switch_buffer)(void *switch_data, void *dest), diff --git a/src/modules/evas/engines/buffer/evas_outbuf.c b/src/modules/evas/engines/buffer/evas_outbuf.c index a6c7152e68..968adb81ac 100644 --- a/src/modules/evas/engines/buffer/evas_outbuf.c +++ b/src/modules/evas/engines/buffer/evas_outbuf.c @@ -17,6 +17,15 @@ evas_buffer_outbuf_buf_init(void) void evas_buffer_outbuf_buf_free(Outbuf *buf) { + if (buf->priv.render_buf) + { +#ifdef EVAS_CSERVE2 + if (evas_cserve2_use_get()) + evas_cache2_image_close(&buf->priv.render_buf->cache_entry); + else +#endif + evas_cache_image_drop(&buf->priv.render_buf->cache_entry); + } if (buf->priv.back_buf) { #ifdef EVAS_CSERVE2 @@ -30,7 +39,7 @@ evas_buffer_outbuf_buf_free(Outbuf *buf) } void -evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, +evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, int rot, Outbuf_Depth depth, void *dest, void *rdest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, void * (*new_update_region)(int x, int y, int w, int h, int *row_bytes), void (*free_update_region)(int x, int y, int w, int h, void *data), void * (*switch_buffer)(void *data, void *dest_buffer), @@ -38,9 +47,11 @@ evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, Outbuf_Depth depth, { buf->w = w; buf->h = h; + buf->rotation = rot; buf->depth = depth; buf->dest = dest; + buf->rdest = rdest; buf->dest_row_bytes = dest_row_bytes; buf->alpha_level = alpha_level; @@ -59,37 +70,67 @@ evas_buffer_outbuf_buf_update_fb(Outbuf *buf, int w, int h, Outbuf_Depth depth, memset(buf->dest, 0, h * buf->dest_row_bytes); #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) - buf->priv.back_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), - w, h, - buf->dest, - 1, EVAS_COLORSPACE_ARGB8888); + { + buf->priv.back_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), + w, h, + buf->dest, + 1, EVAS_COLORSPACE_ARGB8888); + if (buf->rdest) + buf->priv.render_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), + w, h, + buf->rdest, + 1, EVAS_COLORSPACE_ARGB8888); + + } else #endif - buf->priv.back_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), - w, h, - buf->dest, - 1, EVAS_COLORSPACE_ARGB8888); + { + buf->priv.back_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->dest, + 1, EVAS_COLORSPACE_ARGB8888); + if (buf->rdest) + buf->priv.render_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->rdest, + 1, EVAS_COLORSPACE_ARGB8888); + } } else if ((buf->depth == OUTBUF_DEPTH_RGB_32BPP_888_8888) && (buf->dest) && (buf->dest_row_bytes == (buf->w * sizeof(DATA32)))) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) - buf->priv.back_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), - w, h, - buf->dest, - 0, EVAS_COLORSPACE_ARGB8888); + { + buf->priv.back_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), + w, h, + buf->dest, + 0, EVAS_COLORSPACE_ARGB8888); + if (buf->rdest) + buf->priv.render_buf = (RGBA_Image *)evas_cache2_image_data(evas_common_image_cache2_get(), + w, h, + buf->rdest, + 0, EVAS_COLORSPACE_ARGB8888); + + } else #endif - buf->priv.back_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), - w, h, - buf->dest, - 0, EVAS_COLORSPACE_ARGB8888); + { + buf->priv.back_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->dest, + 0, EVAS_COLORSPACE_ARGB8888); + if (buf->rdest) + buf->priv.render_buf = (RGBA_Image *)evas_cache_image_data(evas_common_image_cache_get(), + w, h, + buf->rdest, + 0, EVAS_COLORSPACE_ARGB8888); + } } } Outbuf * -evas_buffer_outbuf_buf_setup_fb(int w, int h, Outbuf_Depth depth, void *dest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, +evas_buffer_outbuf_buf_setup_fb(int w, int h, int rot, Outbuf_Depth depth, void *dest, void *rdest, int dest_row_bytes, int use_color_key, DATA32 color_key, int alpha_level, void * (*new_update_region)(int x, int y, int w, int h, int *row_bytes), void (*free_update_region)(int x, int y, int w, int h, void *data), void * (*switch_buffer)(void *data, void *dest_buffer), @@ -103,8 +144,10 @@ evas_buffer_outbuf_buf_setup_fb(int w, int h, Outbuf_Depth depth, void *dest, in evas_buffer_outbuf_buf_update_fb(buf, w, h, + rot, depth, dest, + rdest, dest_row_bytes, use_color_key, color_key, @@ -122,6 +165,11 @@ evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, i { RGBA_Image *im; + if (buf->priv.render_buf) + { + *cx = x; *cy = y; *cw = w; *ch = h; + return buf->priv.render_buf; + } if (buf->priv.back_buf) { *cx = x; *cy = y; *cw = w; *ch = h; @@ -158,7 +206,7 @@ evas_buffer_outbuf_buf_new_region_for_update(Outbuf *buf, int x, int y, int w, i void evas_buffer_outbuf_buf_free_region_for_update(Outbuf *buf, RGBA_Image *update) { - if (update != buf->priv.back_buf) + if ((update != buf->priv.back_buf) && (update != buf->priv.render_buf)) { #ifdef EVAS_CSERVE2 if (evas_cserve2_use_get()) @@ -175,6 +223,7 @@ evas_buffer_outbuf_buf_switch_buffer(Outbuf *buf, Tilebuf_Rect *surface_damage E if (buf->func.switch_buffer) { buf->dest = buf->func.switch_buffer(buf->switch_data, buf->dest); + if (buf->priv.back_buf) { #ifdef EVAS_CSERVE2 @@ -222,6 +271,39 @@ _update_24bpp_888_888(DATA8 *dst, DATA32 *src, int depth) void evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int x, int y, int w, int h) { + Eina_Rectangle r = {0}, pr; + int rx = 0, ry = 0; + + if (buf->rotation == 0) + { + r.x = x; + r.y = y; + } + else if (buf->rotation == 90) + { + r.x = y; + r.y = buf->w - x - w; + } + else if (buf->rotation == 180) + { + r.x = buf->w - x - w; + r.y = buf->h - y - h; + } + else if (buf->rotation == 270) + { + r.x = buf->h - y - h; + r.y = x; + } + if ((buf->rotation == 0) || (buf->rotation == 180)) + { + r.w = w; + r.h = h; + } + else if ((buf->rotation == 90) || (buf->rotation == 270)) + { + r.w = h; + r.h = w; + } /* copy update image to out buf & convert */ switch (buf->depth) { @@ -246,18 +328,32 @@ evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int dest = buf->func.new_update_region(x, y, w, h, &row_bytes); } if (!dest) break; - for (yy = 0; yy < h; yy++) + for (yy = 0; yy < update->cache_entry.h; yy++) { - dst = dest + (yy * row_bytes); - src = update->image.data + (yy * update->cache_entry.w); - for (xx = 0; xx < update->cache_entry.w; xx++) - { - if ((!buf->use_color_key) || (A_VAL(src) > thresh)) - dst = _update_24bpp_888_888(dst, src, buf->depth); - else - dst = _update_24bpp_888_888(dst, &colorkey, buf->depth); - src++; - } + dst = dest + (yy * row_bytes); + src = update->image.data + (yy * update->cache_entry.w); + for (xx = 0; xx < update->cache_entry.w; xx++) + { + if ((!buf->use_color_key) || (A_VAL(src) > thresh)) + dst = _update_24bpp_888_888(dst, src, buf->depth); + else + dst = _update_24bpp_888_888(dst, &colorkey, buf->depth); + src++; + } +/* FIXME: finish these... + case 90: + dst = dest + ((update->cache_entry.h - yy - 1) * row_bytes); + src = update->image.data + yy; + for (xx = 0; xx < update->cache_entry.h; xx++) + { + if ((!buf->use_color_key) || (A_VAL(src) > thresh)) + dst = _update_24bpp_888_888(dst, src, buf->depth); + else + dst = _update_24bpp_888_888(dst, &colorkey, buf->depth); + src += w; + } + break; +*/ } if (buf->func.free_update_region) { @@ -269,11 +365,12 @@ evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int case OUTBUF_DEPTH_RGB_32BPP_888_8888: case OUTBUF_DEPTH_ARGB_32BPP_8888_8888: { - DATA32 *dest, *src, *dst; + DATA32 *dest, *src; int yy, row_bytes; row_bytes = buf->dest_row_bytes; dest = (DATA32 *)((DATA8 *)(buf->dest) + (y * row_bytes) + (x * 4)); + src = update->image.data; if (buf->func.new_update_region) { dest = buf->func.new_update_region(x, y, w, h, &row_bytes); @@ -286,14 +383,54 @@ evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int func = evas_common_draw_func_copy_get(w, 0); if (func) { - for (yy = 0; yy < h; yy++) + for (yy = 0; yy < update->cache_entry.h; yy++) { + DATA32 *dst; src = update->image.data + (yy * update->cache_entry.w); dst = (DATA32 *)((DATA8 *)(buf->dest) + ((y + yy) * row_bytes)); func(src, dst, w); } } } + else if (buf->rotation) + { + Gfx_Func_Convert conv_func; + DATA8 *dst = buf->dest; + + conv_func = evas_common_convert_func_get(0, buf->w, buf->h, 32, + 0x00ff0000, 0x0000ff00, 0x000000ff, 0, buf->rotation); + if (buf->rotation == 180) + { + pr = r; + RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, buf->w, buf->h); + rx = pr.w - r.w; ry = pr.h - r.h; + src += (update->cache_entry.w * ry) + rx; + w -= rx; + } + else if (buf->rotation == 90) + { + pr = r; + RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, buf->w, buf->h); + rx = pr.w - r.w; ry = pr.h - r.h; + src += ry; + w -= ry; + } + else if (buf->rotation == 270) + { + pr = r; + RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, buf->w, buf->h); + rx = pr.w - r.w; ry = pr.h - r.h; + src += (update->cache_entry.w * rx); + w -= ry; + } + if (conv_func) + conv_func(src, dst, + update->cache_entry.w - w, + (row_bytes / 4) - r.w, + r.w, r.h, + x + rx, y + ry, + NULL); + } if (buf->func.free_update_region) { buf->func.free_update_region(x, y, w, h, dest); @@ -314,11 +451,12 @@ evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int { dest = buf->func.new_update_region(x, y, w, h, &row_bytes); } - for (yy = 0; yy < h; yy++) + /* FIXME: use evas convert functions with rotations */ + for (yy = 0; yy < update->cache_entry.h; yy++) { dst = (DATA32 *)(dest + (yy * row_bytes)); src = update->image.data + (yy * update->cache_entry.w); - for (xx = 0; xx < w; xx++) + for (xx = 0; xx < update->cache_entry.w; xx++) { A_VAL(dst) = B_VAL(src); R_VAL(dst) = G_VAL(src); @@ -340,9 +478,9 @@ evas_buffer_outbuf_buf_push_updated_region(Outbuf *buf, RGBA_Image *update, int } void -evas_buffer_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot EINA_UNUSED, Outbuf_Depth depth) +evas_buffer_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot, Outbuf_Depth depth) { - void *dest; + void *dest, *rdest; int dest_row_bytes; int alpha_level; DATA32 color_key; @@ -354,6 +492,7 @@ evas_buffer_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot EINA_UNUSED, Ou if (depth == OUTBUF_DEPTH_INHERIT) depth = ob->depth; dest = ob->dest; + rdest = ob->rdest; dest_row_bytes = ob->dest_row_bytes; alpha_level = ob->alpha_level; color_key = ob->color_key; @@ -366,8 +505,10 @@ evas_buffer_outbuf_reconfigure(Outbuf *ob, int w, int h, int rot EINA_UNUSED, Ou evas_buffer_outbuf_buf_update_fb(ob, w, h, + rot, depth, dest, + rdest, dest_row_bytes, use_color_key, color_key, @@ -386,8 +527,8 @@ evas_buffer_outbuf_buf_swap_mode_get(Outbuf *ob) } int -evas_buffer_outbuf_buf_rot_get(Outbuf *buf EINA_UNUSED) +evas_buffer_outbuf_buf_rot_get(Outbuf *buf) { - return 0; + return buf->rotation; } |