static Eina_Bool _enesim_image_dom_provider_load(Enesim_Stream *data, Enesim_Buffer *buffer, void *options, Eina_Error *err) { Egueb_Dom_Node *doc = NULL; Egueb_Dom_Feature *window, *render, *io; Egueb_Dom_Feature_Window_Hint_Data wdata; Enesim_Surface *s; Eina_Bool ret = EINA_FALSE; Eina_Bool user_provided_size = EINA_FALSE; int w = _default_width; int h = _default_height; int hints; if (!egueb_dom_parser_parse(enesim_stream_ref(data), &doc)) { *err = ENESIM_IMAGE_ERROR_LOADING; goto err_parse; } if (options) { Enesim_Image_Svg_Options *o = options; w = o->container_width; h = o->container_height; user_provided_size = EINA_TRUE; } window = egueb_dom_node_feature_get(doc, EGUEB_DOM_FEATURE_WINDOW_NAME, NULL); if (!window) { *err = ENESIM_IMAGE_ERROR_LOADING; goto err_feature; } hints = egueb_dom_feature_window_hints_get(window, &wdata); if (!user_provided_size && (hints & EGUEB_DOM_FEATURE_WINDOW_HINT_PREFERRED)) { if (wdata.pref_width != -1) w = wdata.pref_width; if (wdata.pref_height != -1) h = wdata.pref_height; } if (hints & EGUEB_DOM_FEATURE_WINDOW_HINT_MIN_MAX) { if (wdata.min_width != -1 && w < wdata.min_width) w = wdata.min_width; if (wdata.min_height != -1 && h < wdata.min_height) h = wdata.min_height; if (wdata.max_width != -1 && w > wdata.max_width) w = wdata.max_width; if (wdata.max_height != -1 && h > wdata.max_height) h = wdata.max_height; } egueb_dom_feature_window_size_set(window, w, h); egueb_dom_feature_unref(window); io = egueb_dom_node_feature_get(doc, EGUEB_DOM_FEATURE_IO_NAME, NULL); if (io) { egueb_dom_feature_io_default_enable(io, EINA_TRUE); egueb_dom_feature_unref(io); } render = egueb_dom_node_feature_get(doc, EGUEB_DOM_FEATURE_RENDER_NAME, NULL); if (!render) { *err = ENESIM_IMAGE_ERROR_LOADING; goto err_feature; } s = enesim_surface_new_buffer_from(buffer); if (!s) { *err = ENESIM_IMAGE_ERROR_LOADING; goto err_surface; } egueb_dom_document_process(doc); if (!egueb_dom_feature_render_draw(render, s, ENESIM_ROP_FILL, NULL, 0, 0, NULL)) { *err = ENESIM_IMAGE_ERROR_LOADING; goto err_draw; } ret = EINA_TRUE; err_draw: enesim_surface_unref(s); err_surface: egueb_dom_feature_unref(render); err_feature: egueb_dom_node_unref(doc); err_parse: return ret; }
int main(void) { Enesim_Renderer *r; Enesim_Surface *s; Enesim_Draw_Cache *cache; Enesim_Buffer_Sw_Data sw_data_cache; Eina_Rectangle area, geom; uint8_t *dst; uint8_t *src; size_t stride; int i; enesim_init(); r = enesim_renderer_circle_new(); enesim_renderer_circle_x_set(r, 128); enesim_renderer_circle_y_set(r, 128); enesim_renderer_circle_radius_set(r, 64); enesim_renderer_shape_fill_color_set(r, 0xffff0000); enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_FILL); cache = enesim_draw_cache_new(); enesim_draw_cache_renderer_set(cache, r); /* try to map the area at 0, 0, 64, 64 */ eina_rectangle_coords_from(&area, 0, 0, 64, 64); if (!enesim_draw_cache_map_sw(cache, &area, &sw_data_cache, ENESIM_FORMAT_ARGB8888, NULL)) goto failed_mapping; /* try to map the area at 64, 64, 128, 128 */ eina_rectangle_coords_from(&area, 64, 64, 128, 128); if (!enesim_draw_cache_map_sw(cache, &area, &sw_data_cache, ENESIM_FORMAT_ARGB8888, NULL)) goto failed_mapping; /* now map again the first area, in theory we should not draw anymore */ eina_rectangle_coords_from(&area, 0, 0, 64, 64); if (!enesim_draw_cache_map_sw(cache, &area, &sw_data_cache, ENESIM_FORMAT_ARGB8888, NULL)) goto failed_mapping; src = sw_data_cache.argb8888.plane0; /* get the geometry */ enesim_draw_cache_geometry_get(cache, &geom); printf("creating a surface of size %d %d\n", geom.w, geom.h); s = enesim_surface_new(ENESIM_FORMAT_ARGB8888, geom.w, geom.h); enesim_surface_sw_data_get(s, (void **)&dst, &stride); for (i = 0; i < 128; i++) { memcpy(dst, src, stride); dst += stride; src += stride; } enesim_image_file_save("enesim_draw_cache01_0x0_64x64.png", s, NULL); enesim_surface_unref(s); failed_mapping: enesim_draw_cache_free(cache); enesim_shutdown(); return 0; }