diff options
author | David Walter Seikel | 2012-04-22 09:19:23 +1000 |
---|---|---|
committer | David Walter Seikel | 2012-04-22 09:19:23 +1000 |
commit | c963d75dfdeec11f82e79e727062fbf89afa2c04 (patch) | |
tree | 895633dbf641110be46f117c29890c49b3ffc0bd /libraries/evas/src/modules/engines/buffer/evas_engine.c | |
parent | Adding the new extantz viewer and grid manager. (diff) | |
download | SledjHamr-c963d75dfdeec11f82e79e727062fbf89afa2c04.zip SledjHamr-c963d75dfdeec11f82e79e727062fbf89afa2c04.tar.gz SledjHamr-c963d75dfdeec11f82e79e727062fbf89afa2c04.tar.bz2 SledjHamr-c963d75dfdeec11f82e79e727062fbf89afa2c04.tar.xz |
Update EFL to latest beta.
Diffstat (limited to 'libraries/evas/src/modules/engines/buffer/evas_engine.c')
-rw-r--r-- | libraries/evas/src/modules/engines/buffer/evas_engine.c | 69 |
1 files changed, 55 insertions, 14 deletions
diff --git a/libraries/evas/src/modules/engines/buffer/evas_engine.c b/libraries/evas/src/modules/engines/buffer/evas_engine.c index e8dff7a..758ef10 100644 --- a/libraries/evas/src/modules/engines/buffer/evas_engine.c +++ b/libraries/evas/src/modules/engines/buffer/evas_engine.c | |||
@@ -25,11 +25,12 @@ struct _Render_Engine | |||
25 | Outbuf *ob; | 25 | Outbuf *ob; |
26 | Tilebuf_Rect *rects; | 26 | Tilebuf_Rect *rects; |
27 | Eina_Inlist *cur_rect; | 27 | Eina_Inlist *cur_rect; |
28 | Eina_Inarray previous_rects; | ||
28 | int end : 1; | 29 | int end : 1; |
29 | }; | 30 | }; |
30 | 31 | ||
31 | /* prototypes we will use here */ | 32 | /* prototypes we will use here */ |
32 | 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)); | 33 | 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); |
33 | 34 | ||
34 | static void *eng_info(Evas *e __UNUSED__); | 35 | static void *eng_info(Evas *e __UNUSED__); |
35 | static void eng_info_free(Evas *e __UNUSED__, void *info); | 36 | static void eng_info_free(Evas *e __UNUSED__, void *info); |
@@ -58,7 +59,9 @@ _output_setup(int w, | |||
58 | int color_key_g, | 59 | int color_key_g, |
59 | int color_key_b, | 60 | int color_key_b, |
60 | void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes), | 61 | void *(*new_update_region) (int x, int y, int w, int h, int *row_bytes), |
61 | void (*free_update_region) (int x, int y, int w, int h, void *data) | 62 | void (*free_update_region) (int x, int y, int w, int h, void *data), |
63 | void *(*switch_buffer) (void *data, void *dest_buffer), | ||
64 | void *switch_data | ||
62 | ) | 65 | ) |
63 | { | 66 | { |
64 | Render_Engine *re; | 67 | Render_Engine *re; |
@@ -81,7 +84,7 @@ _output_setup(int w, | |||
81 | evas_common_tilebuf_init(); | 84 | evas_common_tilebuf_init(); |
82 | 85 | ||
83 | evas_buffer_outbuf_buf_init(); | 86 | evas_buffer_outbuf_buf_init(); |
84 | 87 | ||
85 | { | 88 | { |
86 | Outbuf_Depth dep; | 89 | Outbuf_Depth dep; |
87 | DATA32 color_key = 0; | 90 | DATA32 color_key = 0; |
@@ -110,10 +113,13 @@ _output_setup(int w, | |||
110 | color_key, | 113 | color_key, |
111 | alpha_threshold, | 114 | alpha_threshold, |
112 | new_update_region, | 115 | new_update_region, |
113 | free_update_region); | 116 | free_update_region, |
117 | switch_buffer, | ||
118 | switch_data); | ||
114 | } | 119 | } |
115 | re->tb = evas_common_tilebuf_new(w, h); | 120 | re->tb = evas_common_tilebuf_new(w, h); |
116 | evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); | 121 | evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE); |
122 | eina_inarray_setup(&re->previous_rects, sizeof (Eina_Rectangle), 8); | ||
117 | return re; | 123 | return re; |
118 | } | 124 | } |
119 | 125 | ||
@@ -155,7 +161,9 @@ eng_setup(Evas *e, void *in) | |||
155 | info->info.color_key_g, | 161 | info->info.color_key_g, |
156 | info->info.color_key_b, | 162 | info->info.color_key_b, |
157 | info->info.func.new_update_region, | 163 | info->info.func.new_update_region, |
158 | info->info.func.free_update_region); | 164 | info->info.func.free_update_region, |
165 | info->info.func.switch_buffer, | ||
166 | info->info.switch_data); | ||
159 | if (e->engine.data.output) | 167 | if (e->engine.data.output) |
160 | eng_output_free(e->engine.data.output); | 168 | eng_output_free(e->engine.data.output); |
161 | e->engine.data.output = re; | 169 | e->engine.data.output = re; |
@@ -195,6 +203,8 @@ eng_output_resize(void *data, int w, int h) | |||
195 | char use_color_key; | 203 | char use_color_key; |
196 | void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes); | 204 | void * (*new_update_region) (int x, int y, int w, int h, int *row_bytes); |
197 | void (*free_update_region) (int x, int y, int w, int h, void *data); | 205 | void (*free_update_region) (int x, int y, int w, int h, void *data); |
206 | void * (*switch_buffer) (void *switch_data, void *dest); | ||
207 | void *switch_data; | ||
198 | 208 | ||
199 | depth = re->ob->depth; | 209 | depth = re->ob->depth; |
200 | dest = re->ob->dest; | 210 | dest = re->ob->dest; |
@@ -204,6 +214,8 @@ eng_output_resize(void *data, int w, int h) | |||
204 | use_color_key = re->ob->use_color_key; | 214 | use_color_key = re->ob->use_color_key; |
205 | new_update_region = re->ob->func.new_update_region; | 215 | new_update_region = re->ob->func.new_update_region; |
206 | free_update_region = re->ob->func.free_update_region; | 216 | free_update_region = re->ob->func.free_update_region; |
217 | switch_buffer = re->ob->func.switch_buffer; | ||
218 | switch_data = re->ob->switch_data; | ||
207 | evas_buffer_outbuf_buf_free(re->ob); | 219 | evas_buffer_outbuf_buf_free(re->ob); |
208 | re->ob = evas_buffer_outbuf_buf_setup_fb(w, | 220 | re->ob = evas_buffer_outbuf_buf_setup_fb(w, |
209 | h, | 221 | h, |
@@ -214,7 +226,9 @@ eng_output_resize(void *data, int w, int h) | |||
214 | color_key, | 226 | color_key, |
215 | alpha_level, | 227 | alpha_level, |
216 | new_update_region, | 228 | new_update_region, |
217 | free_update_region); | 229 | free_update_region, |
230 | switch_buffer, | ||
231 | switch_data); | ||
218 | } | 232 | } |
219 | evas_common_tilebuf_free(re->tb); | 233 | evas_common_tilebuf_free(re->tb); |
220 | re->tb = evas_common_tilebuf_new(w, h); | 234 | re->tb = evas_common_tilebuf_new(w, h); |
@@ -275,6 +289,37 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i | |||
275 | if (!re->rects) | 289 | if (!re->rects) |
276 | { | 290 | { |
277 | re->rects = evas_common_tilebuf_get_render_rects(re->tb); | 291 | re->rects = evas_common_tilebuf_get_render_rects(re->tb); |
292 | |||
293 | /* handle double buffering */ | ||
294 | if (re->ob->func.switch_buffer) | ||
295 | { | ||
296 | Eina_Rectangle *pushing; | ||
297 | |||
298 | if (re->ob->first_frame && !re->previous_rects.len) | ||
299 | { | ||
300 | evas_common_tilebuf_add_redraw(re->tb, 0, 0, re->ob->w, re->ob->h); | ||
301 | re->ob->first_frame = 0; | ||
302 | } | ||
303 | |||
304 | /* push previous frame */ | ||
305 | EINA_INARRAY_FOREACH(&re->previous_rects, pushing) | ||
306 | evas_common_tilebuf_add_redraw(re->tb, pushing->x, pushing->y, pushing->w, pushing->h); | ||
307 | eina_inarray_flush(&re->previous_rects); | ||
308 | |||
309 | /* save current list of damage */ | ||
310 | EINA_INLIST_FOREACH(re->rects, rect) | ||
311 | { | ||
312 | Eina_Rectangle local; | ||
313 | |||
314 | EINA_RECTANGLE_SET(&local, rect->x, rect->y, rect->w, rect->h); | ||
315 | eina_inarray_append(&re->previous_rects, &local); | ||
316 | } | ||
317 | |||
318 | /* and regenerate the damage list by tacking into account the damage over two frames */ | ||
319 | evas_common_tilebuf_free_render_rects(re->rects); | ||
320 | re->rects = evas_common_tilebuf_get_render_rects(re->tb); | ||
321 | } | ||
322 | |||
278 | re->cur_rect = EINA_INLIST_GET(re->rects); | 323 | re->cur_rect = EINA_INLIST_GET(re->rects); |
279 | } | 324 | } |
280 | if (!re->cur_rect) return NULL; | 325 | if (!re->cur_rect) return NULL; |
@@ -306,7 +351,7 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int | |||
306 | re = (Render_Engine *)data; | 351 | re = (Render_Engine *)data; |
307 | #ifdef BUILD_PIPE_RENDER | 352 | #ifdef BUILD_PIPE_RENDER |
308 | evas_common_pipe_map_begin(surface); | 353 | evas_common_pipe_map_begin(surface); |
309 | #endif | 354 | #endif |
310 | evas_buffer_outbuf_buf_push_updated_region(re->ob, surface, x, y, w, h); | 355 | evas_buffer_outbuf_buf_push_updated_region(re->ob, surface, x, y, w, h); |
311 | evas_buffer_outbuf_buf_free_region_for_update(re->ob, surface); | 356 | evas_buffer_outbuf_buf_free_region_for_update(re->ob, surface); |
312 | evas_common_cpu_end_opt(); | 357 | evas_common_cpu_end_opt(); |
@@ -315,17 +360,13 @@ eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int | |||
315 | static void | 360 | static void |
316 | eng_output_flush(void *data) | 361 | eng_output_flush(void *data) |
317 | { | 362 | { |
318 | Render_Engine *re; | 363 | Render_Engine *re = (Render_Engine *)data; |
319 | 364 | evas_buffer_outbuf_buf_switch_buffer(re->ob); | |
320 | re = (Render_Engine *)data; | ||
321 | } | 365 | } |
322 | 366 | ||
323 | static void | 367 | static void |
324 | eng_output_idle_flush(void *data) | 368 | eng_output_idle_flush(void *data __UNUSED__) |
325 | { | 369 | { |
326 | Render_Engine *re; | ||
327 | |||
328 | re = (Render_Engine *)data; | ||
329 | } | 370 | } |
330 | 371 | ||
331 | static Eina_Bool | 372 | static Eina_Bool |