more code & work on ejde. started on edje_cc.

SVN revision: 7001
This commit is contained in:
Carsten Haitzler 2003-06-09 11:31:33 +00:00
parent bfe9b1fa8e
commit c2137f09bb
5 changed files with 658 additions and 39 deletions

View File

@ -11,7 +11,7 @@ INCLUDES = \
-I/usr/local/include \
@my_includes@
bin_PROGRAMS = edje
bin_PROGRAMS = edje edje_cc
edje_SOURCES = \
edje_main.c
@ -20,3 +20,11 @@ edje_LDADD = \
$(top_builddir)/src/lib/libedje.la
edje_DEPENDENCIES = $(top_builddir)/src/lib/libedje.la
edje_cc_SOURCES = \
edje_cc.c
edje_cc_LDADD = \
$(top_builddir)/src/lib/libedje.la
edje_cc_DEPENDENCIES = $(top_builddir)/src/lib/libedje.la

View File

@ -1,4 +1,7 @@
#include <Evas.h>
#include <Ecore.h>
#include <Ecore_Evas.h>
/* ... only for testing */
#include "edje_private.h"
/* ... end testing */
#include "Edje.h"

View File

@ -0,0 +1,434 @@
#include "edje.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
Evas_List *img_dirs = NULL;
char *file_in = NULL;
char *file_out = NULL;
char *progname = NULL;
int line = 0;
Evas_List *stack = NULL;
Evas_List *params = NULL;
void new_object(void);
void new_statement(void);
int isdelim(char c);
char *next_token(char *p, char *end, char **new_p, int *delim);
char *stack_id(void);
void stack_chop_top(void);
void parse(char *data, off_t size);
void compile(void);
void main_help(void);
typedef struct _New_Object_Handler New_Object_Handler;
typedef struct _New_Statement_Handler New_Statement_Handler;
struct _New_Object_Handler
{
char *type;
void (*func)(void);
};
struct _New_Statement_Handler
{
char *type;
void (*func)(void);
};
void
ob_images(void)
{
printf("create images struct\n");
}
void
ob_images_image(void)
{
printf("create new image\n");
}
void
st_images_image(void)
{
printf("fill in new image using params\n");
}
New_Object_Handler object_handlers[] =
{
{"images", ob_images},
{"images.image", ob_images_image}
};
New_Statement_Handler statement_handlers[] =
{
{"images.image", st_images_image}
};
void
new_object(void)
{
char *id;
int i;
id = stack_id();
// printf("+++: %s\n", id);
for (i = 0; i < (sizeof(object_handlers) / sizeof (New_Object_Handler)); i++)
{
if (!strcmp(object_handlers[i].type, id))
{
if (object_handlers[i].func) object_handlers[i].func();
}
}
free(id);
}
void
new_statement(void)
{
char *id;
int i;
id = stack_id();
// {
// Evas_List *l;
// printf("===: %s", id);
// for (l = params; l; l = l->next) printf(" [%s]", l->data);
// printf("\n");
// }
for (i = 0; i < (sizeof(statement_handlers) / sizeof (New_Object_Handler)); i++)
{
if (!strcmp(statement_handlers[i].type, id))
{
if (statement_handlers[i].func) statement_handlers[i].func();
}
}
free(id);
}
int
isdelim(char c)
{
const char *delims = "{},;";
char *d;
d = (char *)delims;
while (*d)
{
if (c == *d) return 1;
d++;
}
return 0;
}
char *
next_token(char *p, char *end, char **new_p, int *delim)
{
char *tok_start = NULL, *tok_end = NULL, *tok = NULL, *sa_start = NULL;
int in_tok = 0;
int in_quote = 0;
int in_comment_ss = 0;
int in_comment_sa = 0;
int had_quote = 0;
*delim = 0;
if (p >= end) return NULL;
while (p < end)
{
if (*p == '\n')
{
in_comment_ss = 0;
line++;
}
if ((!in_comment_ss) && (!in_comment_sa))
{
if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '/'))
in_comment_ss = 1;
if ((!in_quote) && (*p == '/') && (p < (end - 1)) && (*(p + 1) == '*'))
{
in_comment_sa = 1;
sa_start = p;
}
}
if ((!in_comment_ss) && (!in_comment_sa))
{
if (!in_tok)
{
if (!in_quote)
{
if (!isspace(*p))
{
if (*p == '"')
{
in_quote = 1;
had_quote = 1;
}
in_tok = 1;
tok_start = p;
if (isdelim(*p)) *delim = 1;
}
}
}
else
{
if (in_quote)
{
if (((*p) == '"') && (*(p - 1) != '\\'))
{
in_quote = 0;
had_quote = 1;
}
}
else
{
if (*p == '"')
{
in_quote = 1;
had_quote = 1;
}
if (
(isspace(*p)) ||
((*delim) && (!isdelim(*p))) ||
(isdelim(*p))
)
{
in_tok = 0;
tok_end = p - 1;
goto done;
}
}
}
}
if (in_comment_sa)
{
if ((*p == '/') && (*(p - 1) == '*') && ((p - sa_start) > 2))
in_comment_sa = 0;
}
p++;
}
if (!in_tok) return NULL;
tok_end = p - 1;
done:
*new_p = p;
tok = malloc(tok_end - tok_start + 2);
if (!tok)
{
fprintf(stderr, "%s: Error. memory allocation of %i bytes failed. %s\n",
progname, tok_end - tok_start + 2, strerror(errno));
exit(-1);
}
strncpy(tok, tok_start, tok_end - tok_start + 1);
tok[tok_end - tok_start + 1] = 0;
if (had_quote)
{
p = tok;
while (*p)
{
if (*p == '"')
strcpy(p, p + 1);
else if ((*p == '\\') && (*(p + 1) == '"'))
strcpy(p, p + 1);
else if ((*p == '\\') && (*(p + 1) == '\\'))
strcpy(p, p + 1);
p++;
}
}
return tok;
}
char *
stack_id(void)
{
char *id;
int len;
Evas_List *l;
len = 0;
for (l = stack; l; l = l->next)
len += strlen(l->data) + 1;
id = malloc(len);
if (!id)
{
fprintf(stderr, "%s: Error. memory allocation of %i bytes failed. %s\n",
progname, len, strerror(errno));
exit(-1);
}
id[0] = 0;
for (l = stack; l; l = l->next)
{
strcat(id, l->data);
if (l->next) strcat(id, ".");
}
return id;
}
void
stack_chop_top(void)
{
char *top;
/* remove top from stack */
top = evas_list_data(evas_list_last(stack));
if (top)
{
free(top);
stack = evas_list_remove(stack, top);
}
else
{
fprintf(stderr, "%s: Error. parse error %s:%i. } marker without matching { marker\n",
progname, file_in, line);
exit(-1);
}
}
void
parse(char *data, off_t size)
{
char *p, *end, *token;
int delim = 0;
int do_params = 0;
p = data;
end = data + size;
line = 1;
while ((token = next_token(p, end, &p, &delim)) != NULL)
{
if (delim)
{
if (!strcmp(token, ",")) do_params = 1;
else if (!strcmp(token, "}"))
{
if (do_params)
{
fprintf(stderr, "%s: Error. parse error %s:%i. } marker before ; marker\n",
progname, file_in, line);
exit(-1);
}
else
stack_chop_top();
}
else if (!strcmp(token, ";"))
{
do_params = 0;
new_statement();
/* clear out params */
while (params)
{
free(params->data);
params = evas_list_remove(params, params->data);
}
/* remove top from stack */
stack_chop_top();
}
free(token);
}
else
{
if (do_params)
params = evas_list_append(params, token);
else
{
stack = evas_list_append(stack, token);
new_object();
}
}
}
}
void
compile(void)
{
int fd;
off_t size;
char *data;
fd = open(file_in, O_RDONLY);
if (fd < 0)
{
fprintf(stderr, "%s: Error. cannot open file %s for input. %s\n",
progname, file_in, strerror(errno));
exit(-1);
}
size = lseek(fd, 0, SEEK_END);
lseek(fd, 0, SEEK_SET);
data = mmap(NULL, size, PROT_READ, MAP_PRIVATE, fd, 0);
if (data)
{
parse(data, size);
munmap(data, size);
}
else
{
fprintf(stderr, "%s: Error. cannot mmap file %s for input. %s\n",
progname, file_in, strerror(errno));
exit(-1);
}
close(fd);
}
void
main_help(void)
{
printf
("Usage:\n"
"\t%s [OPTIONS] input_file.edc output_file.eet\n"
"\n"
"Where OPTIONS is one or more of:\n"
"\n"
"-id image/directory Add a directory to look in for relative path images\n"
,progname);
}
int
main(int argc, char **argv)
{
int i;
progname = argv[0];
for (i = 1; i < argc; i++)
{
if (!strcmp(argv[i], "-h"))
{
main_help();
exit(0);
}
else if ((!strcmp(argv[i], "-id")) && (i < (argc - 1)))
{
i++;
img_dirs = evas_list_append(img_dirs, argv[i]);
}
else if (!file_in)
file_in = argv[i];
else if (!file_out)
file_out = argv[i];
}
if (!file_in)
{
fprintf(stderr, "%s: Error: no input file specified.\n", progname);
main_help();
exit(-1);
}
if (!file_out)
{
fprintf(stderr, "%s: Error: no output file specified.\n", progname);
main_help();
exit(-1);
}
compile();
return 0;
}

View File

@ -82,11 +82,14 @@ static void
_edje_part_recalc_single(Edje *ed,
Edje_Real_Part *ep,
Edje_Part_Description *desc,
Edje_Part_Description *chosen_desc,
Edje_Real_Part *rel1_to,
Edje_Real_Part *rel2_to,
Edje_Real_Part *confine_to,
Edje_Calc_Params *params)
{
int minw, minh;
/* relative coords of top left & bottom right */
if (rel1_to)
{
@ -181,6 +184,62 @@ _edje_part_recalc_single(Edje *ed,
params->h = new_h;
}
}
minw = desc->min.w;
minh = desc->min.h;
/* if we have text that wants to make the min size the text size... */
if ((chosen_desc) && (ep->part->type == EDJE_PART_TYPE_TEXT))
{
char *text;
char *font;
int size;
double tw, th;
text = chosen_desc->text.text;
font = chosen_desc->text.font;
size = chosen_desc->text.size;
if (ep->text.text) text = ep->text.text;
if (ep->text.font) font = ep->text.font;
if (ep->text.size) size = ep->text.size;
evas_object_text_font_set(ep->object, font, size);
if ((chosen_desc->text.min_x) || (chosen_desc->text.min_y))
{
evas_object_text_text_set(ep->object, text);
evas_object_geometry_get(ep->object, NULL, NULL, &tw, &th);
if (chosen_desc->text.min_x)
{
minw = tw;
/* FIXME: account for effect */
/* for now just add 2 */
minw += 2;
}
if (chosen_desc->text.min_y)
{
minh = th;
/* FIXME: account for effect */
/* for now just add 2 */
minw += 2;
}
}
}
/* adjust for min size */
if (minw >= 0)
{
if (params->w < minw)
{
params->x = params->x +
((params->w - minw) * (1.0 - desc->align.x));
params->w = minw;
}
}
if (minh >= 0)
{
if (params->h < minh)
{
params->y = params->y +
((params->h - minh) * (1.0 - desc->align.y));
params->h = minh;
}
}
/* adjust for max size */
if (desc->max.w >= 0)
{
@ -200,25 +259,6 @@ _edje_part_recalc_single(Edje *ed,
params->h = desc->max.h;
}
}
/* adjust for min size */
if (desc->min.w >= 0)
{
if (params->w < desc->min.w)
{
params->x = params->x +
((params->w - desc->min.w) * (1.0 - desc->align.x));
params->w = desc->min.w;
}
}
if (desc->min.h >= 0)
{
if (params->h < desc->min.h)
{
params->y = params->y +
((params->h - desc->min.h) * (1.0 - desc->align.y));
params->h = desc->min.h;
}
}
/* confine */
if (confine_to)
{
@ -299,14 +339,14 @@ _edje_part_recalc_single(Edje *ed,
params->border.r = desc->border.r;
params->border.t = desc->border.t;
params->border.b = desc->border.b;
/* text */
/* FIXME: do */
}
static void
_edje_part_recalc(Edje *ed, Edje_Real_Part *ep)
{
Edje_Calc_Params p1, p2;
Edje_Calc_Params p1, p2, p3;
Edje_Part_Description *chosen_desc;
double pos;
if (ep->calculated) return;
if (ep->param1.rel1_to) _edje_part_recalc(ed, ep->param1.rel1_to);
@ -317,11 +357,115 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep)
if (ep->param2.confine_to) _edje_part_recalc(ed, ep->param2.confine_to);
/* actually calculate now */
if (ep->param1.description)
_edje_part_recalc_single(ed, ep, ep->param1.description, ep->param1.rel1_to, ep->param1.rel2_to, ep->param1.confine_to, &p1);
if (ep->param2.description)
_edje_part_recalc_single(ed, ep, ep->param1.description, ep->param2.rel1_to, ep->param2.rel2_to, ep->param2.confine_to, &p2);
if (ep->description_pos == 0.0)
chosen_desc = ep->param1.description;
else
chosen_desc = ep->param2.description;
if (ep->param1.description)
_edje_part_recalc_single(ed, ep, ep->param1.description, chosen_desc, ep->param1.rel1_to, ep->param1.rel2_to, ep->param1.confine_to, &p1);
if (ep->param2.description)
{
_edje_part_recalc_single(ed, ep, ep->param2.description, chosen_desc, ep->param2.rel1_to, ep->param2.rel2_to, ep->param2.confine_to, &p2);
/* FIXME: pos isnt just linear - depends on tween method */
pos = ep->description_pos;
/* visible is special */
if ((p1.visible) && (!p2.visible))
{
if (pos == 1.0)
p3.visible = 0;
else
p3.visible = 1;
}
else if ((!p1.visible) && (p2.visible))
{
if (pos == 0.0)
p3.visible = 0;
else
p3.visible = 1;
}
else
p3.visible = p1.visible;
p3.x = (p1.x * (1.0 - pos)) + (p2.x * (pos));
p3.y = (p1.y * (1.0 - pos)) + (p2.y * (pos));
p3.w = (p1.w * (1.0 - pos)) + (p2.w * (pos));
p3.h = (p1.h * (1.0 - pos)) + (p2.h * (pos));
p3.fill.x = (p1.fill.x * (1.0 - pos)) + (p2.fill.x * (pos));
p3.fill.y = (p1.fill.y * (1.0 - pos)) + (p2.fill.y * (pos));
p3.fill.w = (p1.fill.w * (1.0 - pos)) + (p2.fill.w * (pos));
p3.fill.h = (p1.fill.h * (1.0 - pos)) + (p2.fill.h * (pos));
p3.color.r = (p1.color.r * (1.0 - pos)) + (p2.color.r * (pos));
p3.color.g = (p1.color.g * (1.0 - pos)) + (p2.color.g * (pos));
p3.color.b = (p1.color.b * (1.0 - pos)) + (p2.color.b * (pos));
p3.color.a = (p1.color.a * (1.0 - pos)) + (p2.color.a * (pos));
p3.color2.r = (p1.color2.r * (1.0 - pos)) + (p2.color2.r * (pos));
p3.color2.g = (p1.color2.g * (1.0 - pos)) + (p2.color2.g * (pos));
p3.color2.b = (p1.color2.b * (1.0 - pos)) + (p2.color2.b * (pos));
p3.color2.a = (p1.color2.a * (1.0 - pos)) + (p2.color2.a * (pos));
p3.color3.r = (p1.color3.r * (1.0 - pos)) + (p2.color3.r * (pos));
p3.color3.g = (p1.color3.g * (1.0 - pos)) + (p2.color3.g * (pos));
p3.color3.b = (p1.color3.b * (1.0 - pos)) + (p2.color3.b * (pos));
p3.color3.a = (p1.color3.a * (1.0 - pos)) + (p2.color3.a * (pos));
p3.border.l = (p1.border.l * (1.0 - pos)) + (p2.border.l * (pos));
p3.border.r = (p1.border.r * (1.0 - pos)) + (p2.border.r * (pos));
p3.border.t = (p1.border.t * (1.0 - pos)) + (p2.border.t * (pos));
p3.border.b = (p1.border.b * (1.0 - pos)) + (p2.border.b * (pos));
}
else
p3 = p1;
if (ep->part->type == EDJE_PART_TYPE_RECTANGLE)
{
evas_object_move(ep->object, ed->x + p3.x, ed->y + p3.y);
evas_object_resize(ep->object, p3.w, p3.h);
}
else if (ep->part->type == EDJE_PART_TYPE_TEXT)
{
/* FIXME: if text object calculate text now */
/* FIXME: set other colors */
}
else if (ep->part->type == EDJE_PART_TYPE_IMAGE)
{
char buf[4096];
int image_id;
int image_count, image_num;
evas_object_move(ep->object, ed->x + p3.x, ed->y + p3.y);
evas_object_resize(ep->object, p3.w, p3.h);
evas_object_image_fill_set(ep->object, p3.fill.x, p3.fill.y, p3.fill.w, p3.fill.h);
evas_object_image_border_set(ep->object, p3.border.l, p3.border.r, p3.border.t, p3.border.b);
image_id = ep->param1.description->image.id;
image_count = 2;
if (ep->param2.description)
image_count += evas_list_count(ep->param2.description->image.tween_list);
image_num = (pos * ((double)image_count - 0.5));
if (image_num > (image_count - 1))
image_num = image_count - 1;
if (image_num == 0)
image_id = ep->param1.description->image.id;
else if (image_num == (image_count - 1))
image_id = ep->param2.description->image.id;
else
{
Edje_Part_Image_Id *imid;
imid = evas_list_nth(ep->param2.description->image.tween_list, image_num - 1);
if (imid) image_id = imid->image_id;
}
snprintf(buf, sizeof(buf), "/images/%i", image_id);
evas_object_image_file_set(ep->object, ed->file->path, buf);
}
if (p3.visible) evas_object_show(ep->object);
else evas_object_hide(ep->object);
evas_object_color_set(ep->object, p3.color.r, p3.color.g, p3.color.b, p3.color.a);
ep->calculated = 1;
ep->dirty = 0;
}
@ -364,6 +508,24 @@ _edje_fetch(Evas_Object *obj)
return ed;
}
/*
Edje_File *
_edje_add(Evas (evas)
{
Edje *ed;
ed = calloc(1, sizeof(Edje));
ed->evas = evas;
return ed;
}
void
_edje_free(Edje *ed)
{
free(ed);
}
*/
/* evas smart object methods - required by evas smart objects to do the */
/* dirty work on smrt objects */

View File

@ -184,6 +184,7 @@ struct _Edje_Part
{
char *name; /* the name if any of the part */
unsigned char type; /* what type (image, rect, text) */
unsigned char mouse_events; /* it will affect/respond to mouse events */
int id; /* its id number */
char *color_class; /* how to modify the color */
char *text_class; /* how to apply/modify the font */
@ -269,12 +270,19 @@ struct _Edje_Part_Description
struct {
char *text; /* if "" or NULL, then leave text unchanged */
char *font; /* if a specific font is asked for */
int size; /* 0 = use user set size */
unsigned char effect; /* 0 = plain... */
unsigned char fit_x; /* resize font size down to fit in x dir */
unsigned char fit_y; /* resize font size down to fit in y dir */
unsigned char min_x; /* if text size should be part min size */
unsigned char min_y; /* if text size should be part min size */
struct {
double x, y; /* text alignment within bounds */
} align;
} text;
};
@ -291,6 +299,7 @@ typedef struct _Edje_Real_Part Edje_Real_Part;
struct _Edje
{
char *part;
int layer;
int x, y, w, h;
unsigned char dirty : 1;
@ -304,15 +313,20 @@ struct _Edje
struct _Edje_Real_Part
{
int x, y, w, h;
Evas_Object *object;
unsigned char calculated : 1;
unsigned char dirty : 1;
Edje_Part *part;
int x, y, w, h;
Evas_Object *object;
unsigned char calculated : 1;
unsigned char dirty : 1;
Edje_Part *part;
struct {
int x, y;
} drag;
double description_pos;
struct {
char *text;
char *font;
int size;
} text;
double description_pos;
struct {
Edje_Part_Description *description;
Edje_Real_Part *rel1_to;
@ -325,19 +339,17 @@ typedef struct _Edje_Calc_Params Edje_Calc_Params;
struct _Edje_Calc_Params
{
double x, y, w, h;
double x, y, w, h;
char visible : 1;
struct {
double x, y, w, h;
double x, y, w, h;
} fill;
struct {
unsigned char r, g, b, a;
} color, color2, color3;
struct {
int l, r, t, b;
int l, r, t, b;
} border;
char visible : 1;
};
#endif