support an edje scaling factor. parts can selectively say "yes.. scale me!"

:)... this allows e etc. to adapt to massivelyt different dpi screens with
slickness that even svg can't get to... why? you scale just what NEEDS
scaling (text, button sizes, and other limiting elements). other bits like
borders, padding etc. can remain pixel-perfect and thus the look is amazing.
pixel-perfect drawing with scalable adapting.



SVN revision: 35895
This commit is contained in:
Carsten Haitzler 2008-09-09 14:13:34 +00:00
parent 780b865044
commit 23e2c9e035
7 changed files with 89 additions and 7 deletions

View File

@ -85,6 +85,7 @@ static void st_collections_group_parts_part_effect(void);
static void st_collections_group_parts_part_mouse_events(void);
static void st_collections_group_parts_part_repeat_events(void);
static void st_collections_group_parts_part_ignore_flags(void);
static void st_collections_group_parts_part_scale(void);
static void st_collections_group_parts_part_pointer_mode(void);
static void st_collections_group_parts_part_precise_is_inside(void);
static void st_collections_group_parts_part_use_alternate_font_metrics(void);
@ -226,6 +227,7 @@ New_Statement_Handler statement_handlers[] =
{"collections.group.parts.part.mouse_events", st_collections_group_parts_part_mouse_events},
{"collections.group.parts.part.repeat_events", st_collections_group_parts_part_repeat_events},
{"collections.group.parts.part.ignore_flags", st_collections_group_parts_part_ignore_flags},
{"collections.group.parts.part.scale", st_collections_group_parts_part_scale},
{"collections.group.parts.part.pointer_mode", st_collections_group_parts_part_pointer_mode},
{"collections.group.parts.part.precise_is_inside", st_collections_group_parts_part_precise_is_inside},
{"collections.group.parts.part.use_alternate_font_metrics", st_collections_group_parts_part_use_alternate_font_metrics},
@ -1440,6 +1442,7 @@ ob_collections_group_parts_part(void)
ep->mouse_events = 1;
ep->repeat_events = 0;
ep->ignore_flags = EVAS_EVENT_FLAG_NONE;
ep->scale = 0;
ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB;
ep->precise_is_inside = 0;
ep->use_alternate_font_metrics = 0;
@ -1610,6 +1613,35 @@ st_collections_group_parts_part_ignore_flags(void)
NULL);
}
/**
@page edcref
@property
scale
@parameters
[1 or 0]
@effect
Specifies whether the part will scale its size with an edje scaling
factor. By default scale is off (0) and the default scale factor is
1.0 - that means no scaling. This would be used to scale properties
such as font size, min/max size of the part, and possibly can be used
to scale based on DPI of the target device. The reason to be selective
is that some things work well being scaled, others do not, so the
designer gets to choose what works best.
@endproperty
*/
static void
st_collections_group_parts_part_scale(void)
{
Edje_Part_Collection *pc;
Edje_Part *ep;
check_arg_count(1);
pc = evas_list_data(evas_list_last(edje_collections));
ep = evas_list_data(evas_list_last(pc->parts));
ep->scale = parse_bool(0);
}
/**
@page edcref
@property

View File

@ -171,6 +171,8 @@ extern "C" {
EAPI void edje_thaw (void);
EAPI void edje_fontset_append_set (const char *fonts);
EAPI const char *edje_fontset_append_get (void);
EAPI void edje_scale_set (double scale);
EAPI double edje_scale_get (void);
/* edje_load.c */
EAPI Evas_List *edje_file_collection_list (const char *file);

View File

@ -280,6 +280,11 @@ _edje_part_recalc_single(Edje *ed,
else
maxw = MIN(ep->swallow_params.max.w, desc->max.w);
}
if (ep->part->scale)
{
minw *= _edje_scale;
maxw *= _edje_scale;
}
}
// if (flags & FLAG_Y)
{
@ -297,6 +302,11 @@ _edje_part_recalc_single(Edje *ed,
else
maxh = MIN(ep->swallow_params.max.h, desc->max.h);
}
if (ep->part->scale)
{
minh *= _edje_scale;
maxh *= _edje_scale;
}
}
/* relative coords of top left & bottom right */
if (flags & FLAG_X)
@ -588,6 +598,9 @@ _edje_part_recalc_single(Edje *ed,
stl = NULL;
}
if (ep->part->scale)
evas_object_scale_set(ep->object, _edje_scale);
if (stl)
{
const char *ptxt;
@ -716,6 +729,8 @@ _edje_part_recalc_single(Edje *ed,
inlined_font = 1;
}
}
if (ep->part->scale)
evas_object_scale_set(ep->object, _edje_scale);
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);

View File

@ -357,13 +357,14 @@ _edje_edd_setup(void)
eet_data_descriptor3_new(&eddc);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "name", name, EET_T_STRING);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "id", id, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "type", type, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "ignore_flags", ignore_flags, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_CHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "scale", scale, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT);
EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "use_alternate_font_metrics", use_alternate_font_metrics, EET_T_UCHAR);
EET_DATA_DESCRIPTOR_ADD_SUB(_edje_edd_edje_part, Edje_Part, "default_desc", default_desc, _edje_edd_edje_part_description);

View File

@ -485,9 +485,10 @@ struct _Edje_Part
unsigned char mouse_events; /* it will affect/respond to mouse events */
unsigned char repeat_events; /* it will repeat events to objects below */
Evas_Event_Flags ignore_flags;
unsigned char scale; /* should certain properties scale with edje scale factor? */
unsigned char precise_is_inside;
unsigned char use_alternate_font_metrics;
char pointer_mode;
unsigned char pointer_mode;
};
struct _Edje_Part_Image_Id
@ -1003,6 +1004,7 @@ extern Evas_List *_edje_animators;
extern Evas_List *_edje_edjes;
extern char *_edje_fontset_append;
extern double _edje_scale;
void _edje_part_pos_set(Edje *ed, Edje_Real_Part *ep, int mode, double pos);
Edje_Part_Description *_edje_part_description_find(Edje *ed, Edje_Real_Part *rp, const char *name, double val);

View File

@ -158,6 +158,7 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep,
*free_text = 0;
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
evas_object_text_text_set(ep->object, text);
@ -419,6 +420,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
evas_object_text_text_set(ep->object, text);
part_get_geometry(ep, &tw, &th);
@ -435,6 +437,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
part_get_geometry(ep, &tw, &th);
if ((size > 0) && (tw == 0)) break;
@ -453,6 +456,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
part_get_geometry(ep, &tw, &th);
if ((size > 0) && (tw == 0)) break;
@ -470,6 +474,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
evas_object_text_text_set(ep->object, text);
part_get_geometry(ep, &tw, &th);
@ -490,6 +495,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
part_get_geometry(ep, &tw, &th);
if ((size > 0) && (th == 0)) break;
@ -500,6 +506,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
int current;
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, 10);
part_get_geometry(ep, &tw, &th);
@ -523,6 +530,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
current = (top + bottom) / 2;
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, current);
part_get_geometry(ep, &tw, &th);
@ -536,6 +544,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
{
current++;
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, current);
part_get_geometry(ep, &tw, &th);
} while (th <= sh);
@ -567,6 +576,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path);
else evas_object_text_font_source_set(ep->object, NULL);
if (ep->part->scale) evas_object_scale_set(ep->object, _edje_scale);
evas_object_text_font_set(ep->object, font, size);
evas_object_text_text_set(ep->object, text);
part_get_geometry(ep, &tw, &th);

View File

@ -11,6 +11,7 @@ static Evas_Hash *_edje_text_class_hash = NULL;
static Evas_Hash *_edje_text_class_member_hash = NULL;
char *_edje_fontset_append = NULL;
double _edje_scale = 1.0;
typedef struct _Edje_List_Foreach_Data Edje_List_Foreach_Data;
@ -37,6 +38,7 @@ edje_freeze(void)
{
Evas_List *l;
// FIXME: could just have a global freeze instead of per object
for (l = _edje_edjes; l; l = l->next)
edje_object_freeze((Evas_Object *)(l->data));
}
@ -50,6 +52,7 @@ edje_thaw(void)
{
Evas_List *l;
// FIXME: could just have a global freeze instead of per object
for (l = _edje_edjes; l; l = l->next)
edje_object_thaw((Evas_Object *)(l->data));
}
@ -70,6 +73,23 @@ edje_fontset_append_get(void)
return _edje_fontset_append;
}
EAPI void
edje_scale_set(double scale)
{
Evas_List *l;
if (_edje_scale == scale) return;
_edje_scale = scale;
for (l = _edje_edjes; l; l = l->next)
edje_object_calc_force((Evas_Object *)(l->data));
}
EAPI double
edje_scale_get(void)
{
return _edje_scale;
}
/* FIXDOC: Verify/Expand */
/** Get Edje object data
* @param obj A valid Evas_Object handle