aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/evas/src/examples/evas-text.c
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/evas/src/examples/evas-text.c')
-rw-r--r--libraries/evas/src/examples/evas-text.c411
1 files changed, 411 insertions, 0 deletions
diff --git a/libraries/evas/src/examples/evas-text.c b/libraries/evas/src/examples/evas-text.c
new file mode 100644
index 0000000..ba55662
--- /dev/null
+++ b/libraries/evas/src/examples/evas-text.c
@@ -0,0 +1,411 @@
1/**
2 * Simple Evas example illustrating text objects
3 *
4 * You'll need at least one engine built for it (excluding the buffer
5 * one). See stdout/stderr for output.
6 *
7 * @verbatim
8 * gcc -o evas-text evas-text.c `pkg-config --libs --cflags evas ecore ecore-evas`
9 * @endverbatim
10 */
11
12#ifdef HAVE_CONFIG_H
13
14#include "config.h"
15#else
16
17#define PACKAGE_EXAMPLES_DIR "."
18#define __UNUSED__
19
20#endif
21
22#include <Ecore.h>
23#include <Ecore_Evas.h>
24#include <stdio.h>
25#include <errno.h>
26
27#define WIDTH (320)
28#define HEIGHT (240)
29
30#define GREY {190, 190, 190, 255}
31#define BLACK {0, 0, 0, 255}
32#define WHITE {255, 255, 255, 255}
33#define RED {255, 0, 0, 255}
34#define GREEN {0, 255, 0, 255}
35#define BLUE {0, 0, 255, 255}
36
37#define POINTER_CYCLE(_ptr, _array) \
38 do \
39 { \
40 if ((unsigned)(((void *)(_ptr)) - ((void *)(_array))) >= \
41 sizeof(_array)) \
42 _ptr = _array; \
43 } \
44 while(0)
45
46static const char *commands = \
47 "commands are:\n"
48 "\tt - change text's current style\n"
49 "\tz - change text's font size\n"
50 "\tf - change text's font family\n"
51 "\tb - change text's base color\n"
52 "\ts - change text's \'shadow\' color\n"
53 "\to - change text's \'outline\' color\n"
54 "\tw - change text's \'glow\' color\n"
55 "\tg - change text's \'glow 2\' color\n"
56 "\th - print help\n";
57
58static const char *border_img_path = PACKAGE_EXAMPLES_DIR "/red.png";
59
60struct color_tuple
61{
62 int r, g, b, a;
63};
64
65struct text_preset_data
66{
67 const char **font_ptr;
68 const char *font[3];
69
70 struct color_tuple *text_ptr;
71 struct color_tuple text[6];
72
73 struct color_tuple *shadow_ptr;
74 struct color_tuple shadow[4];
75
76 struct color_tuple *outline_ptr;
77 struct color_tuple outline[4];
78
79 struct color_tuple *glow_ptr;
80 struct color_tuple glow[4];
81
82 struct color_tuple *glow2_ptr;
83 struct color_tuple glow2[4];
84};
85
86struct test_data
87{
88 Ecore_Evas *ee;
89 Evas *evas;
90 struct text_preset_data t_data;
91 Evas_Object *text, *bg, *border;
92};
93
94static struct test_data d = {0};
95
96static void
97_on_destroy(Ecore_Evas *ee __UNUSED__)
98{
99 ecore_main_loop_quit();
100}
101
102/* here just to keep our example's window size and background image's
103 * size in synchrony */
104static void
105_canvas_resize_cb(Ecore_Evas *ee)
106{
107 int w, h;
108
109 ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
110 evas_object_resize(d.bg, w, h);
111}
112
113static const char *
114_text_style_type_to_str(Evas_Text_Style_Type mode)
115{
116 switch (mode)
117 {
118 case EVAS_TEXT_STYLE_PLAIN:
119 return "plain";
120
121 case EVAS_TEXT_STYLE_SHADOW:
122 return "shadow";
123
124 case EVAS_TEXT_STYLE_OUTLINE:
125 return "outline";
126
127 case EVAS_TEXT_STYLE_SOFT_OUTLINE:
128 return "soft outline";
129
130 case EVAS_TEXT_STYLE_GLOW:
131 return "glow";
132
133 case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
134 return "outline shadow";
135
136 case EVAS_TEXT_STYLE_FAR_SHADOW:
137 return "far shadow";
138
139 case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
140 return "outline soft shadow";
141
142 case EVAS_TEXT_STYLE_SOFT_SHADOW:
143 return "soft shadow";
144
145 case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
146 return "far soft shadow";
147
148 default:
149 return "invalid";
150 }
151}
152
153static void
154_on_keydown(void *data __UNUSED__,
155 Evas *evas __UNUSED__,
156 Evas_Object *o __UNUSED__,
157 void *einfo)
158{
159 Evas_Event_Key_Down *ev = einfo;
160
161 if (strcmp(ev->keyname, "h") == 0) /* print help */
162 {
163 fprintf(stdout, commands);
164 return;
165 }
166
167 if (strcmp(ev->keyname, "t") == 0) /* change text's current style */
168 {
169 Evas_Text_Style_Type type = evas_object_text_style_get(d.text);
170
171 type = (type + 1) % 10;
172
173 evas_object_text_style_set(d.text, type);
174
175 fprintf(stdout, "Changing text's style to \'%s\'\n",
176 _text_style_type_to_str(type));
177
178 return;
179 }
180
181 if (strcmp(ev->keyname, "f") == 0) /* change text's font */
182 {
183 int sz;
184
185 (d.t_data.font_ptr)++;
186
187 evas_object_text_font_get(d.text, NULL, &sz);
188
189 POINTER_CYCLE(d.t_data.font_ptr, d.t_data.font);
190
191 evas_object_text_font_set(d.text, *d.t_data.font_ptr, sz);
192
193 fprintf(stdout, "Changing text's font to %s\n", *d.t_data.font_ptr);
194
195 return;
196 }
197
198 if (strcmp(ev->keyname, "b") == 0) /* change text's base color */
199 {
200 (d.t_data.text_ptr)++;
201
202 POINTER_CYCLE(d.t_data.text_ptr, d.t_data.text);
203
204 evas_object_color_set(
205 d.text, d.t_data.text_ptr->r, d.t_data.text_ptr->g,
206 d.t_data.text_ptr->b, d.t_data.text_ptr->a);
207
208 fprintf(stdout, "Changing base color for text to (%d, %d, %d, %d)\n",
209 d.t_data.text_ptr->r, d.t_data.text_ptr->g,
210 d.t_data.text_ptr->b, d.t_data.text_ptr->a);
211
212 return;
213 }
214
215 if (strcmp(ev->keyname, "g") == 0) /* change text's glow 2 color */
216 {
217 (d.t_data.glow2_ptr)++;
218
219 POINTER_CYCLE(d.t_data.glow2_ptr, d.t_data.glow2);
220
221 evas_object_text_glow2_color_set(
222 d.text, d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
223 d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
224
225 fprintf(stdout, "Changing glow 2 color for text to (%d, %d, %d, %d)\n",
226 d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
227 d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
228
229 return;
230 }
231
232 if (strcmp(ev->keyname, "w") == 0) /* change text's glow color */
233 {
234 (d.t_data.glow_ptr)++;
235
236 POINTER_CYCLE(d.t_data.glow_ptr, d.t_data.glow);
237
238 evas_object_text_glow_color_set(
239 d.text, d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
240 d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
241
242 fprintf(stdout, "Changing glow color for text to (%d, %d, %d, %d)\n",
243 d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
244 d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
245
246 return;
247 }
248
249 if (strcmp(ev->keyname, "o") == 0) /* change text's outline color */
250 {
251 (d.t_data.outline_ptr)++;
252
253 POINTER_CYCLE(d.t_data.outline_ptr, d.t_data.outline);
254
255 evas_object_text_outline_color_set(
256 d.text, d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
257 d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
258
259 fprintf(stdout, "Changing outline color for text to (%d, %d, %d, %d)\n",
260 d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
261 d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
262
263 return;
264 }
265
266 if (strcmp(ev->keyname, "s") == 0) /* change text's shadow color */
267 {
268 (d.t_data.shadow_ptr)++;
269
270 POINTER_CYCLE(d.t_data.shadow_ptr, d.t_data.shadow);
271
272 evas_object_text_shadow_color_set(
273 d.text, d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
274 d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
275
276 fprintf(stdout, "Changing shadow color for text to (%d, %d, %d, %d)\n",
277 d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
278 d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
279
280 return;
281 }
282
283 if (strcmp(ev->keyname, "z") == 0) /* change text's font size */
284 {
285 const char *font;
286 int size;
287
288 evas_object_text_font_get(d.text, &font, &size);
289
290 size = (size + 10) % 50;
291 if (!size) size = 10;
292
293 evas_object_text_font_set(d.text, font, size);
294
295 fprintf(stdout, "Changing text's font size to %d\n", size);
296
297 return;
298 }
299}
300
301int
302main(void)
303{
304 int size;
305 const char *font;
306
307 if (!ecore_evas_init())
308 return EXIT_FAILURE;
309
310 /* init values one is going to cycle through while running this
311 * example */
312 struct text_preset_data init_data =
313 {
314 .font = {"DejaVu", "Courier", "Utopia"},
315 .text = {BLACK, WHITE, GREY, RED, GREEN, BLUE},
316 .shadow = {WHITE, BLUE, GREEN, RED},
317 .outline = {WHITE, RED, GREEN, BLUE},
318 .glow = {WHITE, BLUE, GREEN, RED},
319 .glow2 = {WHITE, RED, BLUE, GREEN}
320 };
321
322 d.t_data = init_data;
323 d.t_data.font_ptr = d.t_data.font;
324 d.t_data.text_ptr = d.t_data.text;
325 d.t_data.glow_ptr = d.t_data.glow;
326 d.t_data.glow2_ptr = d.t_data.glow2;
327 d.t_data.outline_ptr = d.t_data.outline;
328 d.t_data.shadow_ptr = d.t_data.shadow;
329
330 /* this will give you a window with an Evas canvas under the first
331 * engine available */
332 d.ee = ecore_evas_new(NULL, 10, 10, WIDTH, HEIGHT, NULL);
333 if (!d.ee)
334 goto error;
335
336 ecore_evas_callback_destroy_set(d.ee, _on_destroy);
337 ecore_evas_callback_resize_set(d.ee, _canvas_resize_cb);
338 ecore_evas_show(d.ee);
339
340 /* the canvas pointer, de facto */
341 d.evas = ecore_evas_get(d.ee);
342
343 d.bg = evas_object_rectangle_add(d.evas);
344 evas_object_color_set(d.bg, 255, 255, 255, 255); /* white bg */
345 evas_object_move(d.bg, 0, 0); /* at canvas' origin */
346 evas_object_resize(d.bg, WIDTH, HEIGHT); /* covers full canvas */
347 evas_object_show(d.bg);
348
349 evas_object_focus_set(d.bg, EINA_TRUE);
350 evas_object_event_callback_add(
351 d.bg, EVAS_CALLBACK_KEY_DOWN, _on_keydown, NULL);
352
353 d.text = evas_object_text_add(d.evas);
354 evas_object_text_style_set(d.text, EVAS_TEXT_STYLE_PLAIN);
355
356 /* let the pre-set thingies be enforced */
357 evas_object_color_set(
358 d.text, d.t_data.text_ptr->r, d.t_data.text_ptr->g,
359 d.t_data.text_ptr->b, d.t_data.text_ptr->a);
360
361 evas_object_text_glow_color_set(
362 d.text, d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
363 d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
364
365 evas_object_text_glow2_color_set(
366 d.text, d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
367 d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
368
369 evas_object_text_outline_color_set(
370 d.text, d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
371 d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
372
373 evas_object_text_shadow_color_set(
374 d.text, d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
375 d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
376
377 evas_object_text_font_set(d.text, *d.t_data.font_ptr, 30);
378 evas_object_text_text_set(d.text, "sample text");
379
380 evas_object_resize(d.text, (3 * WIDTH) / 4, HEIGHT / 4);
381 evas_object_move(d.text, WIDTH / 8, (3 * HEIGHT) / 8);
382 evas_object_show(d.text);
383
384 evas_object_text_font_get(d.text, &font, &size);
385 fprintf(stdout, "Adding text object with font %s, size %d\n", font, size);
386
387 /* this is a border around the text object above, here just to
388 * emphasize its geometry */
389 d.border = evas_object_image_filled_add(d.evas);
390 evas_object_image_file_set(d.border, border_img_path, NULL);
391 evas_object_image_border_set(d.border, 3, 3, 3, 3);
392 evas_object_image_border_center_fill_set(d.border, EVAS_BORDER_FILL_NONE);
393
394 evas_object_resize(d.border, ((3 * WIDTH) / 4) + 3, (HEIGHT / 4) + 3);
395 evas_object_move(d.border, (WIDTH / 8) - 3, ((3 * HEIGHT) / 8) - 3);
396 evas_object_show(d.border);
397
398 fprintf(stdout, commands);
399 ecore_main_loop_begin();
400
401 ecore_evas_free(d.ee);
402 ecore_evas_shutdown();
403 return 0;
404
405error:
406 fprintf(stderr, "you got to have at least one evas engine built and linked"
407 " up to ecore-evas for this example to run properly.\n");
408 ecore_evas_shutdown();
409 return -1;
410}
411