#include #include #include #include "config.h" #include "e_mod_main.h" #include "e_mod_config.h" /* TODO List: * * * Add more palettes * * Change the icon * * Bad hack for ff->im and the evas object (see face_init) * */ /* module private routines */ static Flame *_flame_init (E_Module * m); static void _flame_shutdown (Flame * f); static void _flame_config_palette_set (Flame * f, Flame_Palette_Type type); static int _flame_face_init (Flame_Face * ff); static void _flame_face_free (Flame_Face * ff); static void _flame_face_anim_handle (Flame_Face * ff); static void _flame_palette_gold_set (Flame_Face * ff); static void _flame_palette_fire_set (Flame_Face * ff); static void _flame_palette_plasma_set (Flame_Face * ff); static void _flame_palette_matrix_set (Flame_Face * ff); static void _flame_palette_ice_set (Flame_Face * ff); static void _flame_palette_white_set (Flame_Face * ff); static void _flame_palette_custom_set (Flame_Face * ff); static void _flame_zero_set (Flame_Face * ff); static void _flame_base_random_set (Flame_Face * ff); static void _flame_base_random_modify (Flame_Face * ff); static void _flame_process (Flame_Face * ff); static Eina_Bool _flame_cb_draw (void *data); static Eina_Bool _flame_cb_event_container_resize (void *data, int type, void *event); static int powerof (unsigned int n); /* public module routines. all modules must have these */ EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Flame" }; EAPI E_Module *flame_module = NULL; EAPI void * e_modapi_init (E_Module * m) { Flame *f; char buf[4096]; /* Set up module's message catalogue */ snprintf (buf, sizeof (buf), "%s/locale", e_module_dir_get (m)); bindtextdomain (PACKAGE, buf); bind_textdomain_codeset (PACKAGE, "UTF-8"); snprintf (buf, sizeof (buf), "%s/e-module-flame.edj", e_module_dir_get (m)); e_configure_registry_category_add ("appearance", 10, D_ ("Look"), NULL, "preferences-look"); e_configure_registry_item_add ("appearance/flame", 150, D_ ("Flame"), NULL, buf, e_int_config_flame_module); f = _flame_init (m); f->module = m; flame_module = m; return f; } EAPI int e_modapi_shutdown (E_Module * m) { Flame *f; e_configure_registry_item_del ("appearance/flame"); e_configure_registry_category_del ("appearance"); f = m->data; if (f) { if (f->config_dialog) { e_object_del (E_OBJECT (f->config_dialog)); f->config_dialog = NULL; } _flame_shutdown (f); } return 1; } EAPI int e_modapi_save (E_Module * m) { Flame *f; f = m->data; if (f) e_config_domain_save ("module.flame", f->conf_edd, f->conf); return 1; } /* module private routines */ static Flame * _flame_init (E_Module * m) { Flame *f; Eina_List *zones = NULL, *l, *l2; E_Zone *zone; E_Desk *desk; f = calloc (1, sizeof (Flame)); if (!f) return NULL; /* Configuration */ f->conf_edd = E_CONFIG_DD_NEW ("Flame_Config", Config); #undef T #undef D #define T Config #define D f->conf_edd E_CONFIG_VAL (D, T, height, INT); E_CONFIG_VAL (D, T, hspread, INT); E_CONFIG_VAL (D, T, vspread, INT); E_CONFIG_VAL (D, T, variance, INT); E_CONFIG_VAL (D, T, vartrend, INT); E_CONFIG_VAL (D, T, residual, INT); E_CONFIG_VAL (D, T, palette_type, INT); E_CONFIG_VAL (D, T, r, INT); E_CONFIG_VAL (D, T, g, INT); E_CONFIG_VAL (D, T, b, INT); f->conf = e_config_domain_load ("module.flame", f->conf_edd); if (!f->conf) { f->conf = E_NEW (Config, 1); f->conf->height = 128; f->conf->hspread = 26; f->conf->vspread = 76; f->conf->variance = 5; f->conf->vartrend = 2; f->conf->residual = 68; f->conf->r = 160; f->conf->g = 40; f->conf->b = 0; f->conf->palette_type = GOLD_PALETTE; } E_CONFIG_LIMIT (f->conf->height, 4, 4096); E_CONFIG_LIMIT (f->conf->hspread, 1, 100); E_CONFIG_LIMIT (f->conf->vspread, 1, 100); E_CONFIG_LIMIT (f->conf->variance, 1, 100); E_CONFIG_LIMIT (f->conf->vartrend, 1, 100); E_CONFIG_LIMIT (f->conf->residual, 1, 100); E_CONFIG_LIMIT (f->conf->r, 0, 300); E_CONFIG_LIMIT (f->conf->g, 0, 300); E_CONFIG_LIMIT (f->conf->b, 0, 300); E_CONFIG_LIMIT (f->conf->palette_type, GOLD_PALETTE, CUSTOM_PALETTE); E_Comp *comp; // TODO add for all areas Flame_Face *ff; ff = calloc (1, sizeof (Flame_Face)); if (ff) { f->face = ff; ff->flame = f; ff->evas = e_comp->evas; if (!_flame_face_init(ff)) return NULL; } return f; } static void _flame_shutdown (Flame * f) { free (f->conf); f->conf = NULL; E_CONFIG_DD_FREE (f->conf_edd); _flame_face_free (f->face); f->module = NULL; free (f); f = NULL; } static void _flame_config_palette_set (Flame * f, Flame_Palette_Type type) { switch (type) { case GOLD_PALETTE: _flame_palette_gold_set (f->face); break; case FIRE_PALETTE: _flame_palette_fire_set (f->face); break; case PLASMA_PALETTE: _flame_palette_plasma_set (f->face); break; case MATRIX_PALETTE: _flame_palette_matrix_set (f->face); break; case ICE_PALETTE: _flame_palette_ice_set (f->face); break; case WHITE_PALETTE: _flame_palette_white_set (f->face); break; case CUSTOM_PALETTE: _flame_palette_custom_set (f->face); break; default: break; } } static int _flame_face_init (Flame_Face * ff) { Evas_Object *o; Evas_Coord ww, hh; int size; int flame_width, flame_height; // ff->ev_handler_container_resize = // ecore_event_handler_add (E_EVENT_CONTAINER_RESIZE, // _flame_cb_event_container_resize, ff); /* set up the flame object */ o = evas_object_image_add (ff->evas); evas_output_viewport_get (ff->evas, NULL, NULL, &ww, &hh); ff->ww = ww; evas_object_move (o, 0, hh - ff->flame->conf->height + 3); evas_object_resize (o, ff->ww, ff->flame->conf->height); evas_object_image_fill_set (o, 0, 0, ff->ww, ff->flame->conf->height); evas_object_pass_events_set (o, 1); evas_object_layer_set (o, 20); evas_object_image_alpha_set (o, 1); evas_object_show (o); ff->flame_object = o; /* Allocation of the flame arrays */ flame_width = ff->ww >> 1; flame_height = ff->flame->conf->height >> 1; ff->ws = powerof (flame_width); size = (1 << ff->ws) * flame_height * sizeof (int); ff->f_array1 = (unsigned int *) malloc (size); if (!ff->f_array1) return 0; ff->f_array2 = (unsigned int *) malloc (size); if (!ff->f_array2) return 0; /* allocation of the image */ ff->ims = powerof (ff->ww); evas_object_image_size_set (ff->flame_object, 1 << ff->ims, ff->flame->conf->height); evas_object_image_fill_set (o, 0, 0, 1 << ff->ims, ff->flame->conf->height); ff->im = (unsigned int *) evas_object_image_data_get (ff->flame_object, 1); /* initialization of the palette */ ff->palette = (unsigned int *) malloc (300 * sizeof (unsigned int)); if (!ff->palette) return 0; _flame_config_palette_set (ff->flame, ff->flame->conf->palette_type); /* set the flame array to ZERO */ _flame_zero_set (ff); /* set the base of the flame to something random */ _flame_base_random_set (ff); /* set the animator for generating and displaying flames */ _flame_face_anim_handle (ff); return 1; } static void _flame_face_free (Flame_Face * ff) { ecore_event_handler_del (ff->ev_handler_container_resize); evas_object_del (ff->flame_object); if (ff->anim) ecore_animator_del (ff->anim); if (ff->f_array1) free (ff->f_array1); if (ff->f_array2) free (ff->f_array2); if (ff->palette) free (ff->palette); free (ff); ff = NULL; } static void _flame_face_anim_handle (Flame_Face * ff) { if (!ff->anim) ff->anim = ecore_animator_add (_flame_cb_draw, ff); } static void _flame_palette_gold_set (Flame_Face * ff) { const unsigned char gold_cmap[300 * 4] = "\256\256\0\1\254i\24\3\312\2165\5" "\330\212<\7\340\244I\10\344\235R\12\332\236P\15\334\247P\17\340\242U\20\343" "\253X\22\340\253V\25\335\245U\27\344\254X\31\353\250[\32\352\254Y\34\346" "\251X\37\347\251Z!\351\255\\\"\351\253[$\345\253Z'\346\252\\)\347\253]+\347" "\256\\,\346\253\\/\344\253\\1\346\256]3\347\254\\4\351\256]6\351\253\\9\351" "\254^;\352\256\\=\352\255^>\350\255]A\350\254^C\350\255\\E\351\256^F\350" "\255^I\347\255^K\347\255]M\350\256]O\352\257^Q\351\255_S\352\256^U\352\255" "]W\352\255_X\351\256_[\351\255]]\351\256^_\351\256^a\351\256_c\350\256_e" "\350\256^g\351\256^i\351\256_k\350\255_m\352\256^o\352\256_q\353\257_s\352" "\257_u\351\255^w\351\256_y\352\256_{\352\256`}\350\256^\177\351\255_\201" "\351\257_\203\351\256_\205\351\256_\207\351\256_\211\352\256_\213\353\257" "_\215\352\256_\217\351\256_\221\352\257_\223\352\256_\225\352\257_\227\351" "\256_\231\351\256_\233\351\257_\235\352\256`\237\351\256_\241\351\257_\243" "\352\256_\245\353\257`\247\353\257`\251\352\256_\253\352\257_\255\352\256" "`\257\352\257`\261\351\257_\263\351\256_\265\352\257`\267\352\257`\271\352" "\257`\273\351\257_\275\352\256`\277\352\257`\301\352\256`\303\352\257_\305" "\352\257`\307\352\257`\311\352\257`\313\352\257_\315\352\256`\317\352\257" "`\321\352\257`\324\352\260a\326\352\261`\330\353\262b\332\353\262c\335\353" "\264c\337\353\265d\342\353\265e\344\354\266f\346\354\267f\350\354\270g\352" "\354\271g\354\354\272g\356\354\273i\360\355\274i\362\355\275j\364\355\275" "k\365\355\276k\367\355\277l\371\356\300l\372\356\301m\373\356\301m\375\356" "\301n\376\356\303o\376\357\304p\376\357\304p\377\357\305q\377\357\306q\377" "\357\307r\377\360\310s\377\360\311s\377\360\311t\377\360\312u\377\361\313" "v\377\361\314v\377\361\315w\377\361\316w\377\362\317x\377\362\320y\377\362" "\320y\377\362\321z\377\362\322{\377\363\323|\377\363\324|\377\363\325}\377" "\363\326~\377\364\327~\377\364\327\177\377\364\330\200\377\364\331\200\377" "\365\332\201\377\365\333\202\377\365\334\202\377\365\335\203\377\365\336" "\204\377\366\337\204\377\366\337\205\377\366\340\206\377\366\341\206\377" "\367\342\207\377\367\343\210\377\367\344\210\377\367\345\211\377\367\346" "\212\377\370\347\212\377\370\347\213\377\370\350\214\377\370\351\214\377" "\371\352\215\377\371\353\216\377\371\354\216\377\371\355\217\377\372\356" "\220\377\372\357\220\377\372\357\221\377\372\360\222\377\372\361\223\377" "\373\362\224\377\373\363\226\377\373\363\230\377\373\364\232\377\374\365" "\235\377\374\366\237\377\374\367\241\377\374\370\244\377\375\371\246\377" "\375\372\250\377\375\373\252\377\375\373\254\377\375\373\256\377\376\373" "\260\377\376\374\262\377\376\374\262\377\376\374\264\377\376\374\266\377" "\376\374\270\377\376\374\272\377\376\374\273\377\376\374\274\377\376\374" "\276\377\376\374\300\377\376\374\301\377\376\374\303\377\376\374\305\377" "\376\374\306\377\376\374\310\377\376\374\311\377\376\374\313\377\376\374" "\315\377\376\374\317\377\376\374\320\377\376\375\321\377\376\375\323\377" "\376\375\325\377\376\375\327\377\376\375\330\377\376\375\332\377\376\375" "\333\377\376\375\335\377\376\375\336\377\376\375\340\377\376\375\342\377" "\376\375\343\377\376\375\345\377\376\375\346\377\376\375\350\377\376\375" "\352\377\376\375\354\377\376\375\355\377\376\375\356\377\376\375\360\377" "\376\375\362\377\376\375\364\377\376\375\365\377\376\375\367\377\376\375" "\370\377\376\375\372\377\376\375\373\377\376\375\374\377\376\375\375\377" "\376\375\375\377\376\376\375\377\376\376\375\377\376\376\375\377\376\376" "\375\377\376\376\375\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" "\377\377\377\377"; int i; for (i = 0; i < 300; i++) { int r, g, b, a; a = gold_cmap[(i * 4) + 3]; r = gold_cmap[(i * 4) + 0]; g = gold_cmap[(i * 4) + 1]; b = gold_cmap[(i * 4) + 2]; evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } static void _flame_palette_fire_set (Flame_Face * ff) { int i, r, g, b, a; for (i = 0; i < 300; i++) { r = i * 3; g = (i - 80) * 3; b = (i - 160) * 3; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } /* set the plasma flame palette */ static void _flame_palette_plasma_set (Flame_Face * ff) { int i, r, g, b, a = 0; for (i = 0; i < 80; i++) { r = 0; g = 0; b = (i * 255) / 80; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } for (i = 80; i < 160; i++) { r = ((i - 80) * 186) / 80; g = ((i - 80) * 229) / 80; b = 255; if ((r * r + g * g + b * b) <= 100) a = (r * r + g * g + b * b); else a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } for (i = 160; i < 300; i++) { r = ((i - 160) * (255 - 186) + 186 * 139) / 139; g = ((i - 160) * (255 - 229) + 229 * 139) / 139; b = 255; if ((r * r + g * g + b * b) <= 100) a = r * r + g * g + b * b; else a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } static void _flame_palette_matrix_set (Flame_Face * ff) { int i, r, g, b, a; for (i = 0; i < 300; i++) { r = (i - 80) * 3; g = i * 3; b = (i - 160) * 3; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } static void _flame_palette_ice_set (Flame_Face * ff) { int i, r, g, b, a; for (i = 0; i < 300; i++) { r = (i - 160) * 3; g = (i - 40) * 3; b = i * 3; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } static void _flame_palette_white_set (Flame_Face * ff) { int i, r, g, b, a; for (i = 0; i < 300; i++) { r = 0; g = 0; b = 0; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } static void _flame_palette_custom_set (Flame_Face * ff) { int i, r, g, b, a; Flame *f; f = ff->flame; for (i = 0; i < 300; i++) { r = (i - f->conf->r) * 3; g = (i - f->conf->g) * 3; b = (i - f->conf->b) * 3; if (r < 0) r = 0; if (r > 255) r = 255; if (g < 0) g = 0; if (g > 255) g = 255; if (b < 0) b = 0; if (b > 255) b = 255; a = (int) ((r * 0.299) + (g * 0.587) + (b * 0.114)); evas_color_argb_premul (a, &r, &g, &b); ff->palette[i] = ((((unsigned char) a) << 24) | (((unsigned char) r) << 16) | (((unsigned char) g) << 8) | ((unsigned char) b)); } } /* set the flame array to zero */ static void _flame_zero_set (Flame_Face * ff) { int x, y; unsigned int *ptr; for (y = 0; y < (ff->flame->conf->height >> 1); y++) { for (x = 0; x < (ff->ww >> 1); x++) { ptr = ff->f_array1 + (y << ff->ws) + x; *ptr = 0; } } for (y = 0; y < (ff->flame->conf->height >> 1); y++) { for (x = 0; x < (ff->ww >> 1); x++) { ptr = ff->f_array2 + (y << ff->ws) + x; *ptr = 0; } } } /* set the base of the flame */ static void _flame_base_random_set (Flame_Face * ff) { int x, y; unsigned int *ptr; /* initialize a random number seed from the time, so we get random */ /* numbers each time */ // srand (time(NULL)); y = (ff->flame->conf->height >> 1) - 1; for (x = 0; x < (ff->ww >> 1); x++) { ptr = ff->f_array1 + (y << ff->ws) + x; *ptr = rand () % 300; } } /* modify the base of the flame with random values */ static void _flame_base_random_modify (Flame_Face * ff) { int x, y; unsigned int *ptr, val; y = (ff->flame->conf->height >> 1) - 1; for (x = 0; x < (ff->ww >> 1); x++) { ptr = ff->f_array1 + (y << ff->ws) + x; *ptr += ((rand () % ff->flame->conf->variance) - ff->flame->conf->vartrend); val = *ptr; if (val > 300) *ptr = 0; } } /* process entire flame array */ static void _flame_process (Flame_Face * ff) { int x, y; unsigned int *ptr, *p, tmp, val; for (y = ((ff->flame->conf->height >> 1) - 1); y >= 2; y--) { for (x = 1; x < ((ff->ww >> 1) - 1); x++) { ptr = ff->f_array1 + (y << ff->ws) + x; val = (int) *ptr; if (val > 300) *ptr = 300; val = (int) *ptr; if (val > 0) { tmp = (val * ff->flame->conf->vspread) >> 8; p = ptr - (2 << ff->ws); *p = *p + (tmp >> 1); p = ptr - (1 << ff->ws); *p = *p + tmp; tmp = (val * ff->flame->conf->hspread) >> 8; p = ptr - (1 << ff->ws) - 1; *p = *p + tmp; p = ptr - (1 << ff->ws) + 1; *p = *p + tmp; p = ptr - 1; *p = *p + (tmp >> 1); p = ptr + 1; *p = *p + (tmp >> 1); p = ff->f_array2 + (y << ff->ws) + x; *p = val; if (y < ((ff->flame->conf->height >> 1) - 1)) *ptr = (val * ff->flame->conf->residual) >> 8; } } } } /* draw a flame on the evas */ static Eina_Bool _flame_cb_draw (void *data) { Flame_Face *ff; unsigned int *ptr; int x, y, xx, yy; unsigned int cl, cl1, cl2, cl3, cl4; unsigned int *cptr; ff = (Flame_Face *) data; /* modify the base of the flame */ _flame_base_random_modify (ff); /* process the flame array, propagating the flames up the array */ _flame_process (ff); for (y = 0; y < ((ff->flame->conf->height >> 1) - 1); y++) { for (x = 0; x < ((ff->ww >> 1) - 1); x++) { xx = x << 1; yy = y << 1; ptr = ff->f_array2 + (y << ff->ws) + x; cl1 = cl = (unsigned int) *ptr; ptr = ff->f_array2 + (y << ff->ws) + x + 1; cl2 = (unsigned int) *ptr; ptr = ff->f_array2 + ((y + 1) << ff->ws) + x + 1; cl3 = (unsigned int) *ptr; ptr = ff->f_array2 + ((y + 1) << ff->ws) + x; cl4 = (unsigned int) *ptr; cptr = ff->im + (yy << ff->ims) + xx; *cptr = ff->palette[cl]; *(cptr + 1) = ff->palette[((cl1 + cl2) >> 1)]; *(cptr + 1 + (1 << ff->ims)) = ff->palette[((cl1 + cl3) >> 1)]; *(cptr + (1 << ff->ims)) = ff->palette[((cl1 + cl4) >> 1)]; } } evas_object_image_data_set (ff->flame_object, ff->im); evas_object_image_data_update_add (ff->flame_object, 0, 0, ff->ww, ff->flame->conf->height); /* we loop indefinitely */ return EINA_TRUE; } static Eina_Bool _flame_cb_event_container_resize (void *data, int type, void *event) { Flame_Face *ff; Evas_Object *o; Evas_Coord ww, hh; int size; int flame_width, flame_height; ff = data; evas_output_viewport_get (ff->evas, NULL, NULL, &ww, &hh); ff->ww = ww; o = ff->flame_object; evas_object_move (o, 0, hh - ff->flame->conf->height + 3); evas_object_resize (o, ff->ww, ff->flame->conf->height); evas_object_image_fill_set (o, 0, 0, ff->ww, ff->flame->conf->height); /* Allocation of the flame arrays */ flame_width = ff->ww >> 1; flame_height = ff->flame->conf->height >> 1; ff->ws = powerof (flame_width); size = (1 << ff->ws) * flame_height * sizeof (int); if (ff->f_array1) free (ff->f_array1); ff->f_array1 = (unsigned int *) malloc (size); if (!ff->f_array1) return EINA_FALSE; if (ff->f_array2) free (ff->f_array2); ff->f_array2 = (unsigned int *) malloc (size); if (!ff->f_array2) return EINA_FALSE; /* allocation of the image */ ff->ims = powerof (ff->ww); evas_object_image_size_set (ff->flame_object, 1 << ff->ims, ff->flame->conf->height); evas_object_image_fill_set (o, 0, 0, 1 << ff->ims, ff->flame->conf->height); ff->im = (unsigned int *) evas_object_image_data_get (ff->flame_object, 1); return EINA_TRUE; } /* return the power of a number (eg powerof(8)==3, powerof(256)==8, * powerof(1367)==11, powerof(2568)==12) */ static int powerof (unsigned int n) { int p = 32; if (n <= 0x80000000) p = 31; if (n <= 0x40000000) p = 30; if (n <= 0x20000000) p = 29; if (n <= 0x10000000) p = 28; if (n <= 0x08000000) p = 27; if (n <= 0x04000000) p = 26; if (n <= 0x02000000) p = 25; if (n <= 0x01000000) p = 24; if (n <= 0x00800000) p = 23; if (n <= 0x00400000) p = 22; if (n <= 0x00200000) p = 21; if (n <= 0x00100000) p = 20; if (n <= 0x00080000) p = 19; if (n <= 0x00040000) p = 18; if (n <= 0x00020000) p = 17; if (n <= 0x00010000) p = 16; if (n <= 0x00008000) p = 15; if (n <= 0x00004000) p = 14; if (n <= 0x00002000) p = 13; if (n <= 0x00001000) p = 12; if (n <= 0x00000800) p = 11; if (n <= 0x00000400) p = 10; if (n <= 0x00000200) p = 9; if (n <= 0x00000100) p = 8; if (n <= 0x00000080) p = 7; if (n <= 0x00000040) p = 6; if (n <= 0x00000020) p = 5; if (n <= 0x00000010) p = 4; if (n <= 0x00000008) p = 3; if (n <= 0x00000004) p = 2; if (n <= 0x00000002) p = 1; if (n <= 0x00000001) p = 0; return p; } void _flame_cb_config_updated (void *data) { Flame *f; f = (Flame *) data; if (!f) return; /* Update The Palette */ _flame_config_palette_set (f, f->conf->palette_type); }