/**
 * @example enesim_renderer_path07.c
 * Example usage of a path renderer
 * @image html enesim_renderer_path07.png
 */
Enesim_Renderer * enesim_example_renderer_renderer_get(
		Enesim_Example_Renderer_Options *options)
{
	Enesim_Renderer *r;
	Enesim_Matrix m;
	Enesim_Path *p;

	r = enesim_renderer_path_new();
	enesim_renderer_shape_stroke_color_set(r, 0xff000000);
	enesim_renderer_shape_stroke_weight_set(r, 0.1);
	enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

	p = enesim_renderer_path_path_get(r);
	enesim_path_move_to(p, 0.3, 0.3);
	enesim_path_cubic_to(p, 0.6, 1.1, 1.0, 0.9, 1.4, 0.3);
	enesim_path_unref(p);

	enesim_matrix_scale(&m, options->width/2, options->height/2);
	enesim_renderer_transformation_set(r, &m);

	return r;
}
Beispiel #2
0
EAPI Enesim_Renderer *
echart_line_renderer_get(const Echart_Line *line)
{
    const Echart_Chart *chart;
    const Echart_Data *data;
    const Echart_Data_Item *absciss;
    const Echart_Data_Item *item;
    Enesim_Renderer *c;
    Enesim_Renderer *r;
    Enesim_Renderer *r_first;
    Enesim_Renderer_Compound_Layer *l;
    Enesim_Text_Font *f;
    Enesim_Text_Engine *e;
    Enesim_Rectangle geom;
    Enesim_Path *p;
    Enesim_Color color;
    Eina_Rectangle rect_first;
    Eina_Rectangle rect;
    const char *title;
    double avmin;
    double avmax;
    int grid_x_nbr;
    int grid_y_nbr;
    int sub_grid_x_nbr;
    int sub_grid_y_nbr;
    int x_area;
    int y_area;
    int w_area;
    int h_area;
    int w;
    int h;
    unsigned int i;
    unsigned int j;

    if (!line)
        return NULL;

    chart = line->chart;

    if (line->stacked)
      data = echart_data_stacked_get(echart_chart_data_get(chart));
    else
      data = echart_chart_data_get(chart);
    if (!data)
    {
        ERR("A chart must have at least a data");
        return NULL;
    }

    if (echart_data_items_count(data) < 2)
    {
        ERR("Data must have at least 2 items");
        return NULL;
    }

    echart_chart_size_get(chart, &w, &h);

    c = enesim_renderer_compound_new();

    e = enesim_text_engine_default_get();
    f = enesim_text_font_new_description_from(e, "arial", 16);
    enesim_text_engine_unref(e);

    /* background */
    r = enesim_renderer_rectangle_new();
    enesim_renderer_rectangle_position_set(r, 0, 0);
    enesim_renderer_rectangle_size_set(r, w, h);
    enesim_renderer_shape_fill_color_set(r, echart_chart_background_color_get(chart));
    enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_FILL);

    l = enesim_renderer_compound_layer_new();
    enesim_renderer_compound_layer_renderer_set(l, r);
    enesim_renderer_compound_layer_rop_set(l, ENESIM_ROP_FILL);
    enesim_renderer_compound_layer_add(c, l);

    /* title */
    h_area = 0;
    title = echart_data_title_get(data);
    if (title)
    {
        r = enesim_renderer_text_span_new();
        enesim_renderer_color_set(r, 0xff000000);
        enesim_renderer_text_span_text_set(r, title);
        enesim_renderer_text_span_font_set(r, f);

        enesim_renderer_shape_destination_geometry_get(r, &geom);
        enesim_renderer_origin_set(r, (w - geom.w) / 2, 0);
        enesim_rectangle_normalize(&geom, &rect);
        h_area = rect.h;

        ECHART_RENDERER_LAYER_ADD(c, l, r);
    }

    /* abscisses */

    absciss = echart_data_absciss_get(data);
    echart_data_item_interval_get(absciss, &avmin, &avmax);

    r_first = _echart_line_text_renderer_from_double(f, *(double *)eina_list_nth(echart_data_item_values_get(absciss), 0));

    enesim_renderer_shape_destination_geometry_get(r_first, &geom);
    enesim_renderer_origin_set(r_first, 0, h - geom.h);
    enesim_rectangle_normalize(&geom, &rect_first);
    x_area = rect_first.w / 2 + 1;
    y_area = rect_first.h;

    ECHART_RENDERER_LAYER_ADD(c, l, r_first);

    r = _echart_line_text_renderer_from_double(f, *(double *)eina_list_nth(echart_data_item_values_get(absciss), eina_list_count(echart_data_item_values_get(absciss)) - 1));

    enesim_renderer_shape_destination_geometry_get(r, &geom);
    enesim_renderer_origin_set(r, w - geom.w, h - geom.h);
    enesim_rectangle_normalize(&geom, &rect);
    w_area = w - (rect_first.w + rect.w) / 2;
    if (y_area < rect.h)
        y_area = rect.h;

    ECHART_RENDERER_LAYER_ADD(c, l, r);

    for (i = 1; i < eina_list_count(echart_data_item_values_get(absciss)) - 1; i++)
    {
        double d1;

        r = _echart_line_text_renderer_from_double(f, *(double *)eina_list_nth(echart_data_item_values_get(absciss), i));

        d1 = *(double *)eina_list_nth(echart_data_item_values_get(absciss), i);
        d1 = x_area + w_area * (d1 - avmin) / (avmax - avmin);

        enesim_renderer_shape_destination_geometry_get(r, &geom);
        enesim_renderer_origin_set(r, d1 - geom.w / 2, h - geom.h);
        enesim_rectangle_normalize(&geom, &rect);
        if (y_area < rect.h)
            y_area = rect.h;

        ECHART_RENDERER_LAYER_ADD(c, l, r);
    }
    h_area = h - y_area - h_area;

    /* grid */
    echart_chart_grid_nbr_get(chart, &grid_x_nbr, &grid_y_nbr);
    for (i = 0; i < (unsigned int)grid_x_nbr; i++)
    {
        r = enesim_renderer_line_new();
        enesim_renderer_line_coords_set(r,
                                        x_area + (i * w_area) / (double)(grid_x_nbr - 1), h - y_area,
                                        x_area + (i * w_area) / (double)(grid_x_nbr - 1), h - h_area - y_area);
        enesim_renderer_shape_stroke_weight_set(r, 1);
        if (i == 0)
            enesim_renderer_shape_stroke_color_set(r, 0xff000000);
        else
            enesim_renderer_shape_stroke_color_set(r, echart_chart_grid_color_get(chart));
        enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

        ECHART_RENDERER_LAYER_ADD(c, l, r);
    }

    for (i = 0; i < (unsigned int)grid_y_nbr; i++)
    {
        r = enesim_renderer_line_new();
        enesim_renderer_line_coords_set(r,
                                        x_area + 1, h - y_area - (i * h_area) / (double)(grid_y_nbr - 1),
                                        x_area + w_area, h - y_area - (i * h_area) / (double)(grid_y_nbr - 1));
        enesim_renderer_shape_stroke_weight_set(r, 1);
        if (i == 0)
            enesim_renderer_shape_stroke_color_set(r, 0xff000000);
        else
            enesim_renderer_shape_stroke_color_set(r, echart_chart_grid_color_get(chart));
        enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

        ECHART_RENDERER_LAYER_ADD(c, l, r);
    }

    /* sub grid */
    echart_chart_sub_grid_nbr_get(chart, &sub_grid_x_nbr, &sub_grid_y_nbr);
    for (i = 0; i < (unsigned int)grid_x_nbr; i++)
    {
        for (j = 1; (int)j < (sub_grid_x_nbr - 1); j++)
        {
            p = enesim_path_new();
            enesim_path_move_to(p, x_area + w_area * (j + i * (sub_grid_x_nbr - 1)) / (double)((grid_x_nbr - 1) * (sub_grid_x_nbr - 1)), h - h_area - y_area + 1);
            enesim_path_line_to(p, x_area + w_area * (j + i * (sub_grid_x_nbr - 1)) / (double)((grid_x_nbr - 1) * (sub_grid_x_nbr - 1)), h - y_area);

            r = enesim_renderer_path_new();
            enesim_renderer_path_path_set(r, p);
            enesim_renderer_shape_stroke_weight_set(r, 1);
            enesim_renderer_shape_stroke_dash_add_simple(r, 10, 8);
            enesim_renderer_shape_stroke_color_set(r, echart_chart_sub_grid_color_get(chart));
            enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

            ECHART_RENDERER_LAYER_ADD(c, l, r);
        }
    }

    for (i = 0; i < (unsigned int)grid_y_nbr; i++)
    {
        for (j = 1; (int)j < (sub_grid_y_nbr - 1); j++)
        {
            p = enesim_path_new();
            enesim_path_move_to(p, x_area + 1, h - y_area - h_area * (j + i * (sub_grid_y_nbr - 1)) / (double)((grid_y_nbr - 1) * (sub_grid_y_nbr - 1)));
            enesim_path_line_to(p, x_area + w_area, h - y_area - h_area * (j + i * (sub_grid_y_nbr - 1)) / (double)((grid_y_nbr - 1) * (sub_grid_y_nbr - 1)));

            r = enesim_renderer_path_new();
            enesim_renderer_path_path_set(r, p);
            enesim_renderer_shape_stroke_weight_set(r, 1);
            enesim_renderer_shape_stroke_dash_add_simple(r, 10, 8);
            enesim_renderer_shape_stroke_color_set(r, echart_chart_sub_grid_color_get(chart));
            enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

            ECHART_RENDERER_LAYER_ADD(c, l, r);
        }
    }

    /* area */
    if (line->area)
    {
        for (j = 1; j < echart_data_items_count(data); j++)
        {
            double vmin;
            double vmax;
            double d1;
            double d2;
            uint8_t ca, cr, cg, cb;

            item = echart_data_items_get(data, j);
            echart_data_item_interval_get(item, &vmin, &vmax);

            p = enesim_path_new();
            enesim_path_move_to(p, x_area + 1, h - y_area);
            for (i = 0; i < eina_list_count(echart_data_item_values_get(item)); i++)
            {
                d1 = *(double *)eina_list_nth(echart_data_item_values_get(absciss), i);
                d1 = x_area + 1 + (w_area - 1) * (d1 - avmin) / (avmax - avmin);
                d2 = *(double *)eina_list_nth(echart_data_item_values_get(item), i);
                d2 = (h_area - 1) * (d2 - vmin) / (vmax - vmin);
                enesim_path_line_to(p, d1, h - y_area - d2);
            }
            enesim_path_line_to(p, x_area + w_area, h - y_area);
            enesim_path_close(p);

            r = enesim_renderer_path_new();
            enesim_renderer_path_path_set(r, p);
            enesim_argb_components_to(echart_data_item_color_get(item).area, &ca, &cr, &cg, &cb);
            ca = 220;
            enesim_color_components_from(&color, ca, cr, cg, cb);
            enesim_renderer_shape_fill_color_set(r, color);
            enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_FILL);

            ECHART_RENDERER_LAYER_ADD(c, l, r);
        }
    }

    /* line */
    for (j = 1; j < echart_data_items_count(data); j++)
    {
        double vmin;
        double vmax;
        double d1;
        double d2;

        item = echart_data_items_get(data, j);
        echart_data_item_interval_get(item, &vmin, &vmax);
        printf("\n%d  %f  %f\n\n", j, vmin, vmax);

        p = enesim_path_new();
        for (i = 0; i < eina_list_count(echart_data_item_values_get(item)); i++)
        {
            d1 = *(double *)eina_list_nth(echart_data_item_values_get(absciss), i);
            d1 = x_area + 1 + (w_area - 1) * (d1 - avmin) / (avmax - avmin);
            d2 = *(double *)eina_list_nth(echart_data_item_values_get(item), i);
            d2 = h_area * (d2) / (vmax);
            if (i == 0)
                enesim_path_move_to(p, d1, h - y_area - d2);
            else
                enesim_path_line_to(p, d1, h - y_area - d2);
            printf("%d %d %f\n", j, i, h - y_area - d2);
        }

        r = enesim_renderer_path_new();
        enesim_renderer_path_path_set(r, p);
        enesim_renderer_shape_stroke_weight_set(r, 1);
        enesim_renderer_shape_stroke_color_set(r, echart_data_item_color_get(item).line);
        enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE);

        ECHART_RENDERER_LAYER_ADD(c, l, r);
    }

    return c;
}
#include "enesim_example_renderer.h"

/**
 * @example enesim_renderer_path03.c
 * Example usage of a path renderer
 * @image html enesim_renderer_path03.png
 */
Enesim_Renderer * enesim_example_renderer_renderer_get(Enesim_Example_Renderer_Options *options EINA_UNUSED)
{
	Enesim_Renderer *r;
	Enesim_Path *p;

	p = enesim_path_new();
	enesim_path_move_to(p, 50, 50);
	enesim_path_line_to(p, 150, 150);
	enesim_path_line_to(p, 50, 150);
	enesim_path_line_to(p, 150, 50);
	enesim_path_line_to(p, 50, 50);

	r = enesim_renderer_path_new();
	enesim_renderer_path_path_set(r, p);
	enesim_renderer_shape_stroke_weight_set(r, 18);
	enesim_renderer_shape_stroke_color_set(r, 0xffffff00);
	enesim_renderer_shape_fill_color_set(r, 0xffff0000);
	enesim_renderer_shape_draw_mode_set(r, ENESIM_RENDERER_SHAPE_DRAW_MODE_STROKE_FILL);
	return r;
}