Опубликован: 22.12.2015 | Уровень: для всех | Доступ: платный
Лекция 19:

Отображение градиента на холсте

< Лекция 18 || Лекция 19 || Лекция 20 >
Ключевые слова: файл, API, объект, пространство

Создание холста и рисование градиента

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);

Запустите пример


< Лекция 18 || Лекция 19 || Лекция 20 >