Отображение градиента на холсте
Создание холста и рисование градиента
Evas — это холст, предоставляемый EFL. Все фигуры, нарисованные в Evas, становятся объектами. В данном примере мы поговорим о том, как рисовать линию на холсте.
Создайте новый проект 'DrawGradiationSample'. Откройте файл исходного кода и внесите в него следующие изменения:
typedef struct appdata { Evas_Object *win; Evas_Object *conform; //Evas_Object *label; Evas_Object *imgs[5]; } appdata_s; static Evas_Object * create_gradient_rect(appdata_s *ad) { /* Generate gradient data on the fly */ const int colors[2][4] = { /* red to blue */ { 255, 0, 0, 255 }, { 0, 0, 255, 255 }, }; Evas_Object *img; unsigned int *data32; /* Create image object, set its image data size & type */ Evas* canvas = evas_object_evas_get(ad->win); img = evas_object_image_filled_add(canvas); /* BGRA data */ evas_object_image_colorspace_set(img, EVAS_COLORSPACE_ARGB8888); /* Size is 255x1 */ evas_object_image_size_set(img, 255, 1); /* Mark image as having alpha */ evas_object_image_alpha_set(img, EINA_TRUE); /* get a writable data pointer */ data32 = evas_object_image_data_get(img, EINA_TRUE); for (unsigned x = 0; x < 255; x++) { int i, r, g, b, a; /* interpolate alpha */ a = (colors[i*2][3] * (255 - x) + colors[i*2+1][3] * x) / (2 * 255); /* interpolate red */ r = (colors[i*2][0] * colors[i*2][3] * (255 - x) + colors[i*2+1][0] * colors[i*2+1][3] * (x)) / (2 * 255 * 255); /* interpolate green */ g = (colors[i*2][1] * colors[i*2][3] * (255 - x) + colors[i*2+1][1] * colors[i*2+1][3] * (x)) / (2 * 255 * 255); /* interpolate blue */ b = (colors[i*2][2] * colors[i*2][3] * (255 - x) + colors[i*2+1][2] * colors[i*2+1][3] * (x)) / (2 * 255 * 255); /* write pixel value now */ data32[x] = (a << 24) | (r << 16) | (g << 8) | b; } /* very important: set data back */ evas_object_image_data_set(img, data32); evas_object_size_hint_weight_set(img, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(img, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(img); return img; }
evas_object_evas_get() - это API, который создает объект Evas.
evas_object_image_filled_add() - это API, который создает объект Image.
evas_object_image_colorspace_set() - это API, который определяет цветовое пространство объекта Image
evas_object_image_size_set() - это API, который задает размер объекта Image.
evas_object_image_alpha_set() - это API, который определяет обладает ли свойством полупрозрачности объект Image.
evas_object_image_data_get() - это API, который возвращает исходные данные объекта Image в виде массива.
Добавьте следующий код в функцию create_base_gui().
/* Conformant */ ad->conform = elm_conformant_add(ad->win); elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW); elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE); evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(ad->win, ad->conform); evas_object_show(ad->conform); Evas_Object *box = elm_box_add(ad->conform); elm_box_padding_set(box, ELM_SCALE_SIZE(10), ELM_SCALE_SIZE(10)); elm_object_content_set(ad->conform, box); evas_object_show(box); { ad->imgs[0] = create_gradient_rect(ad); elm_box_pack_end(box, ad->imgs[0]); } /* Show window after base gui is set up */ evas_object_show(ad->win);
Запустите пример