add text effect shadow direction support.

SVN revision: 58548
This commit is contained in:
Carsten Haitzler 2011-04-11 12:08:03 +00:00
parent bb03df9625
commit 0b0d51c5cf
7 changed files with 155 additions and 54 deletions

View File

@ -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.

View File

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

View File

@ -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);
}
}
/**

View File

@ -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)
{

View File

@ -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

View File

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

View File

@ -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