[evas] cedric, stop influencing me to break builds.
authorglima <glima@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 4 Jul 2011 20:37:16 +0000 (20:37 +0000)
committerglima <glima@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 4 Jul 2011 20:37:16 +0000 (20:37 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@61022 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/examples/evas-text.c [new file with mode: 0644]

diff --git a/src/examples/evas-text.c b/src/examples/evas-text.c
new file mode 100644 (file)
index 0000000..e816e2c
--- /dev/null
@@ -0,0 +1,381 @@
+/**
+ * Simple Evas example illustrating text objects
+ *
+ * You'll need at least one engine built for it (excluding the buffer
+ * one). See stdout/stderr for output.
+ *
+ * @verbatim
+ * gcc -o evas-text evas-text.c `pkg-config --libs --cflags evas ecore ecore-evas`
+ * @endverbatim
+ */
+
+#ifdef HAVE_CONFIG_H
+
+#include "config.h"
+#else
+
+#define PACKAGE_EXAMPLES_DIR "."
+#define __UNUSED__
+
+#endif
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <stdio.h>
+#include <errno.h>
+
+#define WIDTH  (320)
+#define HEIGHT (240)
+
+#define POINTER_CYCLE(_ptr, _array)                             \
+  do                                                            \
+    {                                                           \
+       if ((unsigned)(((void *)(_ptr)) - ((void *)(_array))) >= \
+           sizeof(_array))                                      \
+         _ptr = _array;                                         \
+    }                                                           \
+  while(0)
+
+static const char *commands = \
+  "commands are:\n"
+  "\tt - change text's current style\n"
+  "\tz - change text's font size\n"
+  "\tf - change text's font family\n"
+  "\ts - change text's \'shadow\' color\n"
+  "\to - change text's \'outline\' color\n"
+  "\tw - change text's \'glow\' color\n"
+  "\tg - change text's \'glow 2\' color\n"
+  "\th - print help\n";
+
+static const char *border_img_path = PACKAGE_EXAMPLES_DIR "/red.png";
+
+struct color_tuple
+{
+   int r, g, b, a;
+};
+
+struct text_preset_data
+{
+   const char        **font_ptr;
+   const char         *font[3];
+
+   struct color_tuple *shadow_ptr;
+   struct color_tuple  shadow[3];
+
+   struct color_tuple *outline_ptr;
+   struct color_tuple  outline[3];
+
+   struct color_tuple *glow_ptr;
+   struct color_tuple  glow[3];
+
+   struct color_tuple *glow2_ptr;
+   struct color_tuple  glow2[3];
+};
+
+struct test_data
+{
+   Ecore_Evas             *ee;
+   Evas                   *evas;
+   struct text_preset_data t_data;
+   Evas_Object            *text, *bg, *border;
+};
+
+static struct test_data d = {0};
+
+static void
+_on_destroy(Ecore_Evas *ee __UNUSED__)
+{
+   ecore_main_loop_quit();
+}
+
+/* here just to keep our example's window size and background image's
+ * size in synchrony */
+static void
+_canvas_resize_cb(Ecore_Evas *ee)
+{
+   int w, h;
+
+   ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+   evas_object_resize(d.bg, w, h);
+}
+
+static const char *
+_text_style_type_to_str(Evas_Text_Style_Type mode)
+{
+   switch (mode)
+     {
+      case EVAS_TEXT_STYLE_PLAIN:
+        return "plain";
+
+      case EVAS_TEXT_STYLE_SHADOW:
+        return "shadow";
+
+      case EVAS_TEXT_STYLE_OUTLINE:
+        return "outline";
+
+      case EVAS_TEXT_STYLE_SOFT_OUTLINE:
+        return "soft outline";
+
+      case EVAS_TEXT_STYLE_GLOW:
+        return "glow";
+
+      case EVAS_TEXT_STYLE_OUTLINE_SHADOW:
+        return "outline shadow";
+
+      case EVAS_TEXT_STYLE_FAR_SHADOW:
+        return "far shadow";
+
+      case EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW:
+        return "outline soft shadow";
+
+      case EVAS_TEXT_STYLE_SOFT_SHADOW:
+        return "soft shadow";
+
+      case EVAS_TEXT_STYLE_FAR_SOFT_SHADOW:
+        return "far soft shadow";
+
+      default:
+        return "invalid";
+     }
+}
+
+static void
+_on_keydown(void        *data __UNUSED__,
+            Evas        *evas __UNUSED__,
+            Evas_Object *o __UNUSED__,
+            void        *einfo)
+{
+   Evas_Event_Key_Down *ev = einfo;
+
+   if (strcmp(ev->keyname, "h") == 0) /* print help */
+     {
+        fprintf(stdout, commands);
+        return;
+     }
+
+   if (strcmp(ev->keyname, "t") == 0) /* change text's current style */
+     {
+        Evas_Text_Style_Type type = evas_object_text_style_get(d.text);
+
+        type = (type + 1) % 10;
+
+        evas_object_text_style_set(d.text, type);
+
+        fprintf(stdout, "Changing text's style to \'%s\'\n",
+                _text_style_type_to_str(type));
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "f") == 0) /* change text's font */
+     {
+         int sz;
+
+        (d.t_data.font_ptr)++;
+
+        evas_object_text_font_get(d.text, NULL, &sz);
+
+        POINTER_CYCLE(d.t_data.font_ptr, d.t_data.font);
+
+        evas_object_text_font_set(d.text, *d.t_data.font_ptr, sz);
+
+        fprintf(stdout, "Changing text's font to %s\n", *d.t_data.font_ptr);
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "g") == 0) /* change text's glow 2 color */
+     {
+        (d.t_data.glow2_ptr)++;
+
+        POINTER_CYCLE(d.t_data.glow2_ptr, d.t_data.glow2);
+
+        evas_object_text_glow2_color_set(
+          d.text, d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
+          d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
+
+        fprintf(stdout, "Changing glow 2 color for text to (%d, %d, %d, %d)\n",
+                d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
+                d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "w") == 0) /* change text's glow color */
+     {
+        (d.t_data.glow_ptr)++;
+
+        POINTER_CYCLE(d.t_data.glow_ptr, d.t_data.glow);
+
+        evas_object_text_glow_color_set(
+          d.text, d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
+          d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
+
+        fprintf(stdout, "Changing glow color for text to (%d, %d, %d, %d)\n",
+                d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
+                d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "o") == 0) /* change text's outline color */
+     {
+        (d.t_data.outline_ptr)++;
+
+        POINTER_CYCLE(d.t_data.outline_ptr, d.t_data.outline);
+
+        evas_object_text_outline_color_set(
+          d.text, d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
+          d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
+
+        fprintf(stdout, "Changing outline color for text to (%d, %d, %d, %d)\n",
+                d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
+                d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "s") == 0) /* change text's shadow color */
+     {
+        (d.t_data.shadow_ptr)++;
+
+        POINTER_CYCLE(d.t_data.shadow_ptr, d.t_data.shadow);
+
+        evas_object_text_shadow_color_set(
+          d.text, d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
+          d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
+
+        fprintf(stdout, "Changing shadow color for text to (%d, %d, %d, %d)\n",
+                d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
+                d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
+
+        return;
+     }
+
+   if (strcmp(ev->keyname, "z") == 0) /* change text's font size */
+     {
+        const char *font;
+        int size;
+
+        evas_object_text_font_get(d.text, &font, &size);
+
+        size = (size + 10) % 50;
+        if (!size) size = 10;
+
+        evas_object_text_font_set(d.text, font, size);
+
+        fprintf(stdout, "Changing text's font size to %d\n", size);
+
+        return;
+     }
+}
+
+int
+main(void)
+{
+   int size;
+   const char *font;
+
+   if (!ecore_evas_init())
+     return EXIT_FAILURE;
+
+   /* init values one is going to cycle through while running this
+    * example */
+   struct text_preset_data init_data =
+   {
+      .font = {"DejaVu", "Courier", "Utopia"},
+      .shadow = {{255, 255, 255, 255}, {0, 0, 255, 255}, {255, 0, 100, 255}},
+      .outline = {{255, 255, 255, 255}, {255, 0, 0, 255}, {0, 255, 0, 255}},
+      .glow = {{255, 255, 255, 255}, {0, 0, 255, 255}, {255, 0, 255, 255}},
+      .glow2 = {{255, 255, 255, 255}, {255, 0, 0, 255}, {255, 255, 0, 255}}
+   };
+
+   d.t_data = init_data;
+
+   d.t_data.font_ptr = d.t_data.font;
+   d.t_data.glow_ptr = d.t_data.glow;
+   d.t_data.glow2_ptr = d.t_data.glow2;
+   d.t_data.outline_ptr = d.t_data.outline;
+   d.t_data.shadow_ptr = d.t_data.shadow;
+
+   /* this will give you a window with an Evas canvas under the first
+    * engine available */
+   d.ee = ecore_evas_new(NULL, 10, 10, WIDTH, HEIGHT, NULL);
+   if (!d.ee)
+     goto error;
+
+   ecore_evas_callback_destroy_set(d.ee, _on_destroy);
+   ecore_evas_callback_resize_set(d.ee, _canvas_resize_cb);
+   ecore_evas_show(d.ee);
+
+   /* the canvas pointer, de facto */
+   d.evas = ecore_evas_get(d.ee);
+
+   d.bg = evas_object_rectangle_add(d.evas);
+   evas_object_color_set(d.bg, 255, 255, 255, 255); /* white bg */
+   evas_object_move(d.bg, 0, 0); /* at canvas' origin */
+   evas_object_resize(d.bg, WIDTH, HEIGHT); /* covers full canvas */
+   evas_object_show(d.bg);
+
+   evas_object_focus_set(d.bg, EINA_TRUE);
+   evas_object_event_callback_add(
+     d.bg, EVAS_CALLBACK_KEY_DOWN, _on_keydown, NULL);
+
+   d.text = evas_object_text_add(d.evas);
+   evas_object_text_style_set(d.text, EVAS_TEXT_STYLE_PLAIN);
+
+   /* let the pre-set thingies be enforced */
+   evas_object_text_glow_color_set(
+     d.text, d.t_data.glow_ptr->r, d.t_data.glow_ptr->g,
+     d.t_data.glow_ptr->b, d.t_data.glow_ptr->a);
+
+   evas_object_text_glow2_color_set(
+     d.text, d.t_data.glow2_ptr->r, d.t_data.glow2_ptr->g,
+     d.t_data.glow2_ptr->b, d.t_data.glow2_ptr->a);
+
+   evas_object_text_outline_color_set(
+     d.text, d.t_data.outline_ptr->r, d.t_data.outline_ptr->g,
+     d.t_data.outline_ptr->b, d.t_data.outline_ptr->a);
+
+   evas_object_text_shadow_color_set(
+     d.text, d.t_data.shadow_ptr->r, d.t_data.shadow_ptr->g,
+     d.t_data.shadow_ptr->b, d.t_data.shadow_ptr->a);
+
+   evas_object_text_font_set(d.text, *d.t_data.font_ptr, 30);
+   evas_object_text_font_source_set(d.text, NULL);
+   evas_object_text_text_set(d.text, "problem?");
+
+   evas_object_color_set(d.text, 0, 0, 0, 255);
+   evas_object_resize(d.text, (3 * WIDTH) / 4, HEIGHT / 4);
+   evas_object_move(d.text, WIDTH / 8, (3 * HEIGHT) / 8);
+   evas_object_show(d.text);
+
+   evas_object_text_font_get(d.text, &font, &size);
+
+   fprintf(stdout, "Adding text object with font %s, size %d\n", font, size);
+
+   /* this is a border around the text object above, here just to
+    * emphasize its geometry */
+   d.border = evas_object_image_filled_add(d.evas);
+   evas_object_image_file_set(d.border, border_img_path, NULL);
+   evas_object_image_border_set(d.border, 3, 3, 3, 3);
+   evas_object_image_border_center_fill_set(d.border, EVAS_BORDER_FILL_NONE);
+
+   evas_object_resize(d.border, ((3 * WIDTH) / 4) + 3, (HEIGHT / 4) + 3);
+   evas_object_move(d.border, (WIDTH / 8) - 3, ((3 * HEIGHT) / 8) - 3);
+   evas_object_show(d.border);
+
+   fprintf(stdout, commands);
+   ecore_main_loop_begin();
+
+   ecore_evas_free(d.ee);
+   ecore_evas_shutdown();
+   return 0;
+
+error:
+   fprintf(stderr, "you got to have at least one evas engine built and linked"
+                   " up to ecore-evas for this example to run properly.\n");
+   ecore_evas_shutdown();
+   return -1;
+}
+