|
|
|
@ -3,10 +3,25 @@ |
|
|
|
|
void |
|
|
|
|
e_background_free(E_Background *bg) |
|
|
|
|
{ |
|
|
|
|
IF_FREE(bg->image); |
|
|
|
|
if ((bg->evas) && (bg->obj)) |
|
|
|
|
evas_del_object(bg->evas, bg->obj); |
|
|
|
|
FREE(bg); |
|
|
|
|
Evas_List l; |
|
|
|
|
|
|
|
|
|
if (bg->layers) |
|
|
|
|
{ |
|
|
|
|
for (l = bg->layers; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
|
|
|
|
|
bl = l->data; |
|
|
|
|
if (bl->color_class) FREE(bl->color_class); |
|
|
|
|
if (bl->file) FREE(bl->file); |
|
|
|
|
if (bl->obj) evas_del_object(bg->evas, bl->obj); |
|
|
|
|
FREE(bl); |
|
|
|
|
} |
|
|
|
|
evas_list_free(bg->layers); |
|
|
|
|
} |
|
|
|
|
if (bg->file) FREE (bg->file); |
|
|
|
|
if (bg->base_obj) evas_del_object(bg->evas, bg->base_obj); |
|
|
|
|
FREE(bg);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
E_Background * |
|
|
|
@ -21,23 +36,214 @@ e_background_new(void) |
|
|
|
|
return bg; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
E_Background * |
|
|
|
|
e_background_load(char *file) |
|
|
|
|
{ |
|
|
|
|
E_Background *bg; |
|
|
|
|
E_DB_File *db; |
|
|
|
|
int i, num; |
|
|
|
|
|
|
|
|
|
db = e_db_open_read(file); |
|
|
|
|
if (!db) return NULL; |
|
|
|
|
num = 0; |
|
|
|
|
e_db_int_get(db, "/type/bg", &num); |
|
|
|
|
if (num != 1) |
|
|
|
|
{ |
|
|
|
|
e_db_close(db); |
|
|
|
|
e_db_flush(); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
e_db_int_get(db, "/layers/count", &num); |
|
|
|
|
|
|
|
|
|
bg = e_background_new(); |
|
|
|
|
bg->file = strdup(file); |
|
|
|
|
for (i = 0; i < num; i++) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
char buf[4096]; |
|
|
|
|
|
|
|
|
|
bl = NEW(E_Background_Layer, 1); |
|
|
|
|
ZERO(bl, E_Background_Layer, 1); |
|
|
|
|
bg->layers = evas_list_append(bg->layers, bl); |
|
|
|
|
|
|
|
|
|
sprintf(buf, "/layers/%i/type", i); e_db_int_get(db, buf, &(bl->type)); |
|
|
|
|
sprintf(buf, "/layers/%i/inlined", i); e_db_int_get(db, buf, &(bl->inlined)); |
|
|
|
|
sprintf(buf, "/layers/%i/color_class", i); bl->color_class = e_db_str_get(db, buf); |
|
|
|
|
if (bl->inlined) |
|
|
|
|
{ |
|
|
|
|
sprintf(buf, "%s:/layers/%i/image", file, i); bl->file = strdup(buf); |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
sprintf(buf, "/layers/%i/file", i); bl->file = e_db_str_get(db, buf); |
|
|
|
|
} |
|
|
|
|
sprintf(buf, "/layers/%i/scroll.x", i); e_db_float_get(db, buf, &(bl->scroll.x)); |
|
|
|
|
sprintf(buf, "/layers/%i/scroll.y", i); e_db_float_get(db, buf, &(bl->scroll.y)); |
|
|
|
|
sprintf(buf, "/layers/%i/pos.x", i); e_db_float_get(db, buf, &(bl->pos.x)); |
|
|
|
|
sprintf(buf, "/layers/%i/pos.y", i); e_db_float_get(db, buf, &(bl->pos.y)); |
|
|
|
|
sprintf(buf, "/layers/%i/size.w", i); e_db_float_get(db, buf, &(bl->size.w)); |
|
|
|
|
sprintf(buf, "/layers/%i/size.h", i); e_db_float_get(db, buf, &(bl->size.h)); |
|
|
|
|
sprintf(buf, "/layers/%i/size.orig.w", i); e_db_int_get(db, buf, &(bl->size.orig.w)); |
|
|
|
|
sprintf(buf, "/layers/%i/size.orig.h", i); e_db_int_get(db, buf, &(bl->size.orig.h)); |
|
|
|
|
sprintf(buf, "/layers/%i/fill.w", i); e_db_float_get(db, buf, &(bl->fill.w)); |
|
|
|
|
sprintf(buf, "/layers/%i/fill.h", i); e_db_float_get(db, buf, &(bl->fill.h)); |
|
|
|
|
sprintf(buf, "/layers/%i/fill.orig.w", i); e_db_int_get(db, buf, &(bl->fill.orig.w)); |
|
|
|
|
sprintf(buf, "/layers/%i/fill.orig.h", i); e_db_int_get(db, buf, &(bl->fill.orig.h)); |
|
|
|
|
sprintf(buf, "/layers/%i/angle", i); e_db_float_get(db, buf, &(bl->angle)); |
|
|
|
|
sprintf(buf, "/layers/%i/fg.r", i); e_db_int_get(db, buf, &(bl->fg.r)); |
|
|
|
|
sprintf(buf, "/layers/%i/fg.g", i); e_db_int_get(db, buf, &(bl->fg.g)); |
|
|
|
|
sprintf(buf, "/layers/%i/fg.b", i); e_db_int_get(db, buf, &(bl->fg.b)); |
|
|
|
|
sprintf(buf, "/layers/%i/fg.a", i); e_db_int_get(db, buf, &(bl->fg.a)); |
|
|
|
|
sprintf(buf, "/layers/%i/bg.r", i); e_db_int_get(db, buf, &(bl->bg.r)); |
|
|
|
|
sprintf(buf, "/layers/%i/bg.g", i); e_db_int_get(db, buf, &(bl->bg.g)); |
|
|
|
|
sprintf(buf, "/layers/%i/bg.b", i); e_db_int_get(db, buf, &(bl->bg.b)); |
|
|
|
|
sprintf(buf, "/layers/%i/bg.a", i); e_db_int_get(db, buf, &(bl->bg.a)); |
|
|
|
|
} |
|
|
|
|
return bg; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
e_background_realize(E_Background *bg, Evas evas) |
|
|
|
|
{ |
|
|
|
|
Evas_Object o; |
|
|
|
|
int iw, ih; |
|
|
|
|
|
|
|
|
|
Evas_List l; |
|
|
|
|
int ww, hh, count; |
|
|
|
|
|
|
|
|
|
if (bg->evas) return; |
|
|
|
|
/* FIXME: boring for now - just a scaled image */ |
|
|
|
|
bg->evas = evas; |
|
|
|
|
bg->obj = evas_add_image_from_file(bg->evas, bg->image); |
|
|
|
|
evas_set_layer(bg->evas, bg->obj, 0); |
|
|
|
|
evas_move(bg->evas, bg->obj, 0, 0); |
|
|
|
|
evas_resize(bg->evas, bg->obj, bg->geom.w, bg->geom.h); |
|
|
|
|
evas_set_image_fill(bg->evas, bg->obj, 0, 0, bg->geom.w, bg->geom.h);
|
|
|
|
|
evas_show(bg->evas, bg->obj); |
|
|
|
|
o = evas_add_image_from_file(bg->evas, PACKAGE_DATA_DIR"/data/images/e_logo.png"); |
|
|
|
|
evas_get_image_size(bg->evas, o, &iw, &ih); |
|
|
|
|
evas_move(bg->evas, o, (bg->geom.w - iw) / 2, (bg->geom.h - ih) / 2); |
|
|
|
|
evas_show(bg->evas, o); |
|
|
|
|
if (!bg->evas) return; |
|
|
|
|
for (count = 0, l = bg->layers; l; l = l->next, count++) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
|
|
|
|
|
bl = l->data; |
|
|
|
|
if (bl->type == 0) /* 0 == image */ |
|
|
|
|
{ |
|
|
|
|
bl->obj = evas_add_image_from_file(bg->evas, bl->file); |
|
|
|
|
evas_set_layer(bg->evas, bl->obj, 0); |
|
|
|
|
evas_show(bg->evas, bl->obj); |
|
|
|
|
if (evas_get_image_alpha(bg->evas, bl->obj)) |
|
|
|
|
{ |
|
|
|
|
bg->base_obj = evas_add_rectangle(bg->evas); |
|
|
|
|
evas_lower(bg->evas, bg->base_obj); |
|
|
|
|
evas_move(bg->evas, bg->base_obj, 0, 0); |
|
|
|
|
evas_resize(bg->evas, bg->base_obj, 999999999, 999999999); |
|
|
|
|
evas_set_color(bg->evas, bg->base_obj, 255, 255, 255, 255); |
|
|
|
|
evas_show(bg->evas, bg->base_obj); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (bl->type == 1) /* 1 == gradient */ |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
else if (bl->type == 2) /* 2 == solid */ |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
ww = bg->geom.w; |
|
|
|
|
hh = bg->geom.h; |
|
|
|
|
bg->geom.w = 0; |
|
|
|
|
bg->geom.h = 0; |
|
|
|
|
e_background_set_size(bg, ww, hh); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
e_background_set_scroll(E_Background *bg, int sx, int sy) |
|
|
|
|
{ |
|
|
|
|
Evas_List l; |
|
|
|
|
|
|
|
|
|
if ((bg->geom.sx == sx) && (bg->geom.sy == sy)) return; |
|
|
|
|
bg->geom.sx = sx; |
|
|
|
|
bg->geom.sy = sy; |
|
|
|
|
if (!bg->evas) return; |
|
|
|
|
for (l = bg->layers; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
|
|
|
|
|
bl = l->data; |
|
|
|
|
if (bl->type == 0) /* 0 == image */ |
|
|
|
|
{ |
|
|
|
|
evas_set_image_fill(bg->evas, bl->obj,
|
|
|
|
|
(double)bg->geom.sx * bl->scroll.x,
|
|
|
|
|
(double)bg->geom.sy * bl->scroll.y, |
|
|
|
|
bl->fw, bl->fh); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
e_background_set_size(E_Background *bg, int w, int h) |
|
|
|
|
{ |
|
|
|
|
Evas_List l; |
|
|
|
|
|
|
|
|
|
if ((bg->geom.w == w) && (bg->geom.h == h)) return; |
|
|
|
|
bg->geom.w = w; |
|
|
|
|
bg->geom.h = h; |
|
|
|
|
for (l = bg->layers; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
double x, y, w, h, fw, fh; |
|
|
|
|
int iw, ih; |
|
|
|
|
|
|
|
|
|
bl = l->data; |
|
|
|
|
iw = 0; |
|
|
|
|
ih = 0; |
|
|
|
|
if (bg->evas) evas_get_image_size(bg->evas, bl->obj, &iw, &ih); |
|
|
|
|
w = bl->size.w * (double)bg->geom.w; |
|
|
|
|
h = bl->size.h * (double)bg->geom.h; |
|
|
|
|
if (bl->size.orig.w) w = (double)iw * bl->size.w; |
|
|
|
|
if (bl->size.orig.h) h = (double)ih * bl->size.h; |
|
|
|
|
fw = bl->fill.w * w; |
|
|
|
|
fh = bl->fill.h * h; |
|
|
|
|
if (bl->fill.orig.w) fw = (double)iw * bl->fill.w; |
|
|
|
|
if (bl->fill.orig.h) fh = (double)ih * bl->fill.h; |
|
|
|
|
x = ((double)bg->geom.w - w + 1) * bl->pos.x; |
|
|
|
|
y = ((double)bg->geom.h - h + 1) * bl->pos.y; |
|
|
|
|
bl->x = x; |
|
|
|
|
bl->y = y; |
|
|
|
|
bl->w = w; |
|
|
|
|
bl->h = h; |
|
|
|
|
bl->fw = fw; |
|
|
|
|
bl->fh = fh; |
|
|
|
|
if (bg->evas) |
|
|
|
|
{ |
|
|
|
|
evas_move(bg->evas, bl->obj, bl->x, bl->y); |
|
|
|
|
evas_resize(bg->evas, bl->obj, bl->w, bl->h); |
|
|
|
|
if (bl->type == 0) /* 0 == image */ |
|
|
|
|
{ |
|
|
|
|
evas_set_image_fill(bg->evas, bl->obj, |
|
|
|
|
(double)bg->geom.sx * bl->scroll.x, |
|
|
|
|
(double)bg->geom.sy * bl->scroll.y, |
|
|
|
|
bl->fw, bl->fh); |
|
|
|
|
} |
|
|
|
|
else if (bl->type == 1) /* 1 == gradient */ |
|
|
|
|
{ |
|
|
|
|
evas_set_angle(bg->evas, bl->obj, bl->angle); |
|
|
|
|
} |
|
|
|
|
else if (bl->type == 2) /* 2 == solid */ |
|
|
|
|
{ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
e_background_set_color_class(E_Background *bg, char *cc, int r, int g, int b, int a) |
|
|
|
|
{ |
|
|
|
|
Evas_List l; |
|
|
|
|
|
|
|
|
|
for (l = bg->layers; l; l = l->next) |
|
|
|
|
{ |
|
|
|
|
E_Background_Layer *bl; |
|
|
|
|
|
|
|
|
|
bl = l->data; |
|
|
|
|
if ((bl->color_class) && (cc) && (!strcmp(bl->color_class, cc))) |
|
|
|
|
{ |
|
|
|
|
if (bg->evas) |
|
|
|
|
{ |
|
|
|
|
if ((l == bg->layers) && (bg->base_obj)) |
|
|
|
|
evas_set_color(bg->evas, bl->obj, r, g, b, 255); |
|
|
|
|
else |
|
|
|
|
evas_set_color(bg->evas, bl->obj, r, g, b, a); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|