From 0b0d51c5cfa2bae9b92d386d43d1eb70f4b78c30 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 11 Apr 2011 12:08:03 +0000 Subject: [PATCH] add text effect shadow direction support. SVN revision: 58548 --- legacy/edje/ChangeLog | 5 + legacy/edje/src/bin/edje_cc.h | 1 + legacy/edje/src/bin/edje_cc_handlers.c | 29 +++++- legacy/edje/src/bin/edje_cc_parse.c | 6 ++ legacy/edje/src/lib/Edje.h | 18 +++- legacy/edje/src/lib/edje_calc.c | 24 ++++- legacy/edje/src/lib/edje_text.c | 126 ++++++++++++++++--------- 7 files changed, 155 insertions(+), 54 deletions(-) diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 672af80d38..511ee736a8 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -75,3 +75,8 @@ * text.align (only the vertical part) now works for textblock. +2011-04-1 Carsten Haitzler (The Rasterman) + + * Add Feature: Support explicit shadow direction with extra effect + param (optional). Default as before. + diff --git a/legacy/edje/src/bin/edje_cc.h b/legacy/edje/src/bin/edje_cc.h index 5245448e5b..2dea3bff10 100644 --- a/legacy/edje/src/bin/edje_cc.h +++ b/legacy/edje/src/bin/edje_cc.h @@ -135,6 +135,7 @@ int parse_int_range(int n, int f, int t); int parse_bool(int n); double parse_float(int n); double parse_float_range(int n, double f, double t); +int get_arg_count(void); void check_arg_count(int n); void check_min_arg_count(int n); diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index c262f2bbe3..13c8f51e75 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -2639,6 +2639,7 @@ st_collections_group_parts_part_source6(void) effect @parameters [EFFECT] + (optional) [SHADOW DIRECTION] @effect Causes Edje to draw the selected effect among: @li PLAIN @@ -2651,6 +2652,16 @@ st_collections_group_parts_part_source6(void) @li FAR_SHADOW @li FAR_SOFT_SHADOW @li GLOW + + Shadow directions (default if not given is BOTTOM_RIGHT): + @li BOTTOM_RIGHT + @li BOTTOM + @li BOTTOM_LEFT + @li LEFT + @li TOP_LEFT + @li TOP + @li TOP_RIGHT + @li RIGHT @endproperty */ static void @@ -2659,7 +2670,7 @@ st_collections_group_parts_part_effect(void) Edje_Part_Collection *pc; Edje_Part *ep; - check_arg_count(1); + check_min_arg_count(1); pc = eina_list_data_get(eina_list_last(edje_collections)); ep = pc->parts[pc->parts_count - 1]; @@ -2676,6 +2687,22 @@ st_collections_group_parts_part_effect(void) "FAR_SOFT_SHADOW", EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW, "GLOW", EDJE_TEXT_EFFECT_GLOW, NULL); + if (get_arg_count() >= 2) + { + unsigned char shadow; + + shadow = parse_enum(1, + "BOTTOM_RIGHT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT, + "BOTTOM", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM, + "BOTTOM_LEFT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT, + "LEFT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT, + "TOP_LEFT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT, + "TOP", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP, + "TOP_RIGHT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT, + "RIGHT", EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT, + NULL); + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_SET(ep->effect, shadow); + } } /** diff --git a/legacy/edje/src/bin/edje_cc_parse.c b/legacy/edje/src/bin/edje_cc_parse.c index 9aee3dbf31..76c4df2601 100644 --- a/legacy/edje/src/bin/edje_cc_parse.c +++ b/legacy/edje/src/bin/edje_cc_parse.c @@ -1063,6 +1063,12 @@ parse_float_range(int n, double f, double t) return i; } +int +get_arg_count(void) +{ + return eina_list_count (params); +} + void check_arg_count(int required_args) { diff --git a/legacy/edje/src/lib/Edje.h b/legacy/edje/src/lib/Edje.h index 32df4d7849..c21eaf358e 100644 --- a/legacy/edje/src/lib/Edje.h +++ b/legacy/edje/src/lib/Edje.h @@ -633,6 +633,9 @@ typedef enum _Edje_Part_Type typedef enum _Edje_Text_Effect { +#define EDJE_TEXT_EFFECT_MASK_BASIC 0xf +#define EDJE_TEXT_EFFECT_BASIC_SET(x, s) \ + do { x = ((x) & ~EDJE_TEXT_EFFECT_MASK_BASIC) | (s); } while (0) EDJE_TEXT_EFFECT_NONE = 0, EDJE_TEXT_EFFECT_PLAIN = 1, EDJE_TEXT_EFFECT_OUTLINE = 2, @@ -644,7 +647,20 @@ typedef enum _Edje_Text_Effect EDJE_TEXT_EFFECT_FAR_SHADOW = 8, EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW = 9, EDJE_TEXT_EFFECT_GLOW = 10, - EDJE_TEXT_EFFECT_LAST = 11 + + EDJE_TEXT_EFFECT_LAST = 11, + +#define EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION (0x7 << 4) +#define EDJE_TEXT_EFFECT_SHADOW_DIRECTION_SET(x, s) \ + do { x = ((x) & ~EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION) | (s); } while (0) + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT = (0x0 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM = (0x1 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT = (0x2 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT = (0x3 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT = (0x4 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP = (0x5 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT = (0x6 << 4), + EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT = (0x7 << 4) } Edje_Text_Effect; typedef enum _Edje_Action_Type diff --git a/legacy/edje/src/lib/edje_calc.c b/legacy/edje/src/lib/edje_calc.c index 5ad5921e2e..3c43580888 100644 --- a/legacy/edje/src/lib/edje_calc.c +++ b/legacy/edje/src/lib/edje_calc.c @@ -1030,7 +1030,9 @@ _edje_part_recalc_single_text(FLOAT_T sc, (chosen_desc->text.max_x) || (chosen_desc->text.max_y)) { int mw, mh; - Evas_Text_Style_Type style; + Evas_Text_Style_Type + style = EVAS_TEXT_STYLE_PLAIN, + shadow = EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT; const Evas_Text_Style_Type styles[] = { EVAS_TEXT_STYLE_PLAIN, EVAS_TEXT_STYLE_PLAIN, @@ -1044,12 +1046,24 @@ _edje_part_recalc_single_text(FLOAT_T sc, EVAS_TEXT_STYLE_FAR_SOFT_SHADOW, EVAS_TEXT_STYLE_GLOW }; + const Evas_Text_Style_Type shadows[] = { + EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT, + EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT + }; - if (ep->part->effect < EDJE_TEXT_EFFECT_LAST) + if ((ep->part->effect & EVAS_TEXT_STYLE_MASK_BASIC) + < EDJE_TEXT_EFFECT_LAST) style = styles[ep->part->effect]; - else - style = EVAS_TEXT_STYLE_PLAIN; - + shadow = shadows + [(ep->part->effect & EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION) >> 4]; + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET(style, shadow); + evas_object_text_style_set(ep->object, style); evas_object_text_text_set(ep->object, text); evas_object_geometry_get(ep->object, NULL, NULL, &tw, &th); diff --git a/legacy/edje/src/lib/edje_text.c b/legacy/edje/src/lib/edje_text.c index d067d6e117..5f4b04ed05 100644 --- a/legacy/edje/src/lib/edje_text.c +++ b/legacy/edje/src/lib/edje_text.c @@ -609,6 +609,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, else evas_object_hide(ep->object); { Evas_Text_Style_Type style; + Edje_Text_Effect effect; style = EVAS_TEXT_STYLE_PLAIN; @@ -617,50 +618,46 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, (params->color.g * params->color.a) / 255, (params->color.b * params->color.a) / 255, params->color.a); - - if ((ep->part->effect == EDJE_TEXT_EFFECT_NONE) || - (ep->part->effect == EDJE_TEXT_EFFECT_PLAIN)) - { + effect = ep->part->effect; + switch (effect & EDJE_TEXT_EFFECT_MASK_BASIC) + { + case EDJE_TEXT_EFFECT_NONE: + case EDJE_TEXT_EFFECT_PLAIN: style = EVAS_TEXT_STYLE_PLAIN; - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_OUTLINE) - { + break; + case EDJE_TEXT_EFFECT_OUTLINE: style = EVAS_TEXT_STYLE_OUTLINE; evas_object_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, (params->type.text.color2.g * params->type.text.color2.a) / 255, (params->type.text.color2.b * params->type.text.color2.a) / 255, params->type.text.color2.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_SOFT_OUTLINE) - { + break; + case EDJE_TEXT_EFFECT_SOFT_OUTLINE: style = EVAS_TEXT_STYLE_SOFT_OUTLINE; evas_object_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, (params->type.text.color2.g * params->type.text.color2.a) / 255, (params->type.text.color2.b * params->type.text.color2.a) / 255, params->type.text.color2.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_SHADOW: style = EVAS_TEXT_STYLE_SHADOW; evas_object_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_SOFT_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_SOFT_SHADOW: style = EVAS_TEXT_STYLE_SOFT_SHADOW; evas_object_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_OUTLINE_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_OUTLINE_SHADOW: style = EVAS_TEXT_STYLE_OUTLINE_SHADOW; evas_object_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, @@ -672,9 +669,8 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_OUTLINE_SOFT_SHADOW: style = EVAS_TEXT_STYLE_OUTLINE_SOFT_SHADOW; evas_object_text_outline_color_set(ep->object, (params->type.text.color2.r * params->type.text.color2.a) / 255, @@ -686,48 +682,84 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_FAR_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_FAR_SHADOW: style = EVAS_TEXT_STYLE_FAR_SHADOW; evas_object_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW) - { + break; + case EDJE_TEXT_EFFECT_FAR_SOFT_SHADOW: style = EVAS_TEXT_STYLE_FAR_SOFT_SHADOW; evas_object_text_shadow_color_set(ep->object, (params->type.text.color3.r * params->type.text.color3.a) / 255, (params->type.text.color3.g * params->type.text.color3.a) / 255, (params->type.text.color3.b * params->type.text.color3.a) / 255, params->type.text.color3.a); - } - else if (ep->part->effect == EDJE_TEXT_EFFECT_GLOW) - { + break; + case EDJE_TEXT_EFFECT_GLOW: style = EVAS_TEXT_STYLE_GLOW; evas_object_text_glow_color_set(ep->object, - (params->type.text.color2.r * params->type.text.color2.a) / 255, - (params->type.text.color2.g * params->type.text.color2.a) / 255, - (params->type.text.color2.b * params->type.text.color2.a) / 255, - params->type.text.color2.a); + (params->type.text.color2.r * params->type.text.color2.a) / 255, + (params->type.text.color2.g * params->type.text.color2.a) / 255, + (params->type.text.color2.b * params->type.text.color2.a) / 255, + params->type.text.color2.a); evas_object_text_glow2_color_set(ep->object, - (params->type.text.color3.r * params->type.text.color3.a) / 255, - (params->type.text.color3.g * params->type.text.color3.a) / 255, - (params->type.text.color3.b * params->type.text.color3.a) / 255, - params->type.text.color3.a); - } + (params->type.text.color3.r * params->type.text.color3.a) / 255, + (params->type.text.color3.g * params->type.text.color3.a) / 255, + (params->type.text.color3.b * params->type.text.color3.a) / 255, + params->type.text.color3.a); + break; + default: + style = EVAS_TEXT_STYLE_PLAIN; + break; + } + + switch (effect & EDJE_TEXT_EFFECT_MASK_SHADOW_DIRECTION) + { + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_RIGHT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_RIGHT); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_BOTTOM_LEFT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_BOTTOM_LEFT); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_LEFT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_LEFT); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_LEFT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_LEFT); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_TOP_RIGHT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_TOP_RIGHT); + break; + case EDJE_TEXT_EFFECT_SHADOW_DIRECTION_RIGHT: + EVAS_TEXT_STYLE_SHADOW_DIRECTION_SET + (style, EVAS_TEXT_STYLE_SHADOW_DIRECTION_RIGHT); + break; + default: + break; + } evas_object_text_style_set(ep->object, style); } - - if (free_text) - free((char *)text); - if (font2) - free(font2); - if (sfont) - free(sfont); + + if (free_text) free((char *)text); + if (font2) free(font2); + if (sfont) free(sfont); } Evas_Font_Size