1 #include "evas_common.h"
2 #include "evas_private.h"
3 #include "evas_engine.h"
4 #include "Evas_Engine_Software_DDraw.h"
6 /* function tables - filled in later (func and parent func) */
7 static Evas_Func func, pfunc;
9 /* engine struct data */
10 typedef struct _Render_Engine Render_Engine;
17 Evas_Object_List *cur_rect;
23 _output_setup(int width,
31 re = calloc(1, sizeof(Render_Engine));
35 /* if we haven't initialized - init (automatic abort if already done) */
36 evas_common_cpu_init();
38 evas_common_blend_init();
39 evas_common_image_init();
40 evas_common_convert_init();
41 evas_common_scale_init();
42 evas_common_rectangle_init();
43 evas_common_gradient_init();
44 evas_common_polygon_init();
45 evas_common_line_init();
46 evas_common_font_init();
47 evas_common_draw_init();
48 evas_common_tilebuf_init();
50 evas_software_ddraw_outbuf_init();
52 re->ob = evas_software_ddraw_outbuf_setup(width, height, rot,
61 /* for updates return 1 big buffer, but only use portions of it, also cache
62 it and keepit around until an idle_flush */
63 /* disable for now - i am hunting down why some expedite tests are slower,
64 * as well as shaped stuff is broken and probable non-32bpp is broken as
65 * convert funcs dont do the right thing
70 re->tb = evas_common_tilebuf_new(width, height);
73 evas_software_ddraw_outbuf_free(re->ob);
77 /* in preliminary tests 16x16 gave highest framerates */
78 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
84 /* engine api this module provides */
89 Evas_Engine_Info_Software_DDraw *info;
91 info = calloc(1, sizeof(Evas_Engine_Info_Software_DDraw));
92 if (!info) return NULL;
93 info->magic.magic = rand();
99 eng_info_free(Evas *e, void *info)
101 Evas_Engine_Info_Software_DDraw *in;
103 in = (Evas_Engine_Info_Software_DDraw *)info;
108 eng_setup(Evas *e, void *in)
111 Evas_Engine_Info_Software_DDraw *info;
113 info = (Evas_Engine_Info_Software_DDraw *)in;
114 if (!e->engine.data.output)
115 e->engine.data.output = _output_setup(e->output.w,
124 re = e->engine.data.output;
125 ponebuf = re->ob->onebuf;
126 evas_software_ddraw_outbuf_free(re->ob);
127 re->ob = evas_software_ddraw_outbuf_setup(e->output.w,
130 OUTBUF_DEPTH_INHERIT,
133 re->ob->onebuf = ponebuf;
135 if (!e->engine.data.output) return;
136 if (!e->engine.data.context)
137 e->engine.data.context = e->engine.func->context_new(e->engine.data.output);
139 re = e->engine.data.output;
143 eng_output_free(void *data)
149 re = (Render_Engine *)data;
150 evas_software_ddraw_outbuf_free(re->ob);
151 evas_common_tilebuf_free(re->tb);
152 if (re->rects) evas_common_tilebuf_free_render_rects(re->rects);
155 evas_common_font_shutdown();
156 evas_common_image_shutdown();
160 eng_output_resize(void *data, int width, int height)
164 re = (Render_Engine *)data;
165 evas_software_ddraw_outbuf_reconfigure(re->ob,
168 evas_software_ddraw_outbuf_rot_get(re->ob),
169 OUTBUF_DEPTH_INHERIT);
170 evas_common_tilebuf_free(re->tb);
171 re->tb = evas_common_tilebuf_new(width, height);
173 evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
177 eng_output_tile_size_set(void *data, int w, int h)
181 re = (Render_Engine *)data;
182 evas_common_tilebuf_set_tile_size(re->tb, w, h);
186 eng_output_redraws_rect_add(void *data, int x, int y, int w, int h)
190 re = (Render_Engine *)data;
191 evas_common_tilebuf_add_redraw(re->tb, x, y, w, h);
195 eng_output_redraws_rect_del(void *data, int x, int y, int w, int h)
199 re = (Render_Engine *)data;
200 evas_common_tilebuf_del_redraw(re->tb, x, y, w, h);
204 eng_output_redraws_clear(void *data)
208 re = (Render_Engine *)data;
209 evas_common_tilebuf_clear(re->tb);
213 eng_output_redraws_next_update_get(void *data,
231 re = (Render_Engine *)data;
239 re->rects = evas_common_tilebuf_get_render_rects(re->tb);
240 re->cur_rect = (Evas_Object_List *)re->rects;
242 if (!re->cur_rect) return NULL;
243 rect = (Tilebuf_Rect *)re->cur_rect;
248 re->cur_rect = re->cur_rect->next;
251 evas_common_tilebuf_free_render_rects(re->rects);
256 surface = evas_software_ddraw_outbuf_new_region_for_update(re->ob,
275 eng_output_redraws_next_update_push(void *data, void *surface, int x, int y, int w, int h)
279 re = (Render_Engine *)data;
280 evas_common_pipe_begin(surface);
281 evas_common_pipe_flush(surface);
282 evas_software_ddraw_outbuf_push_updated_region(re->ob, surface, x, y, w, h);
283 evas_software_ddraw_outbuf_free_region_for_update(re->ob, surface);
284 evas_common_cpu_end_opt();
288 eng_output_flush(void *data)
292 re = (Render_Engine *)data;
293 evas_software_ddraw_outbuf_flush(re->ob);
297 eng_output_idle_flush(void *data)
301 re = (Render_Engine *)data;
302 evas_software_ddraw_outbuf_idle_flush(re->ob);
306 /* module advertising code */
308 module_open(Evas_Module *em)
311 /* get whatever engine module we inherit from */
312 if (!_evas_module_engine_inherit(&pfunc, "software_generic")) return 0;
313 /* store it for later use */
315 /* now to override methods */
316 #define ORD(f) EVAS_API_OVERRIDE(f, &func, eng_)
322 ORD(output_tile_size_set);
323 ORD(output_redraws_rect_add);
324 ORD(output_redraws_rect_del);
325 ORD(output_redraws_clear);
326 ORD(output_redraws_next_update_get);
327 ORD(output_redraws_next_update_push);
329 ORD(output_idle_flush);
330 /* now advertise out own api */
331 em->functions = (void *)(&func);
340 EAPI Evas_Module_Api evas_modapi =
342 EVAS_MODULE_API_VERSION,
343 EVAS_MODULE_TYPE_ENGINE,