示例#1
0
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;
}
示例#2
0
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;
}