diff --git a/legacy/evas/src/Evas.h b/legacy/evas/src/Evas.h index f6172bab31..ad1ea0e2a4 100644 --- a/legacy/evas/src/Evas.h +++ b/legacy/evas/src/Evas.h @@ -165,6 +165,11 @@ struct _Evas_Object_Text struct _Evas_Object_Any object; struct { char *text; + char *font; + int size; + struct { + int w, h; + } string; int r, g, b, a; } current, previous; }; @@ -236,10 +241,20 @@ void evas_set_image_file(Evas e, Evas_Object o, char *file); void evas_set_image_data(Evas e, Evas_Object o, void *data, Evas_Image_Format format, int w, int h); void evas_set_image_fill(Evas e, Evas_Object o, double x, double y, double w, double h); void evas_set_color(Evas e, Evas_Object o, int r, int g, int b, int a); +void evas_set_text(Evas e, Evas_Object o, char *text); +void evas_set_font(Evas e, Evas_Object o, char *font, int size); void evas_set_gradient(Evas e, Evas_Object o, Evas_Gradient grad); void evas_set_angle(Evas e, Evas_Object o, double angle); void evas_set_zoom_scale(Evas e, Evas_Object o, int scale); void evas_set_line_xy(Evas e, Evas_Object o, double x1, double y1, double x2, double y2); +void evas_set_font_cache(Evas e, int size); +int evas_get_font_cache(Evas e); +void evas_flush_font_cache(Evas e); +void evas_set_image_cache(Evas e, int size); +int evas_get_image_cache(Evas e); +void evas_flush_image_cache(Evas e); +void evas_font_add_path(Evas e, char *path); +void evas_font_del_path(Evas e, char *path); /* layer stacking for object */ void evas_set_layer(Evas e, Evas_Object o, int l); diff --git a/legacy/evas/src/evas_gl_routines.c b/legacy/evas/src/evas_gl_routines.c index 3e137a5b9b..6f01e184e7 100644 --- a/legacy/evas/src/evas_gl_routines.c +++ b/legacy/evas/src/evas_gl_routines.c @@ -769,7 +769,7 @@ __evas_gl_text_paste(Evas_GL_Font *f, char *text, TT_Glyph_Metrics metrics; float rr, gg, bb, aa; GLuint last_tex; - + j = text[0]; TT_Get_Glyph_Metrics(f->glyphs[j], &metrics); x_offset = (-metrics.bearingX) / 64; diff --git a/legacy/evas/src/evas_image.c b/legacy/evas/src/evas_image.c index ee34814148..6d4c73928f 100644 --- a/legacy/evas/src/evas_image.c +++ b/legacy/evas/src/evas_image.c @@ -58,17 +58,17 @@ evas_add_image_from_file(Evas e, char *file) imlib_context_set_image(im); oo->current.image.w = imlib_image_get_width(); oo->current.image.h = imlib_image_get_height(); - o->current.x = 0; - o->current.y = 0; - o->current.w = (double)oo->current.image.w; - o->current.h = (double)oo->current.image.h; - oo->current.fill.x = 0; - oo->current.fill.y = 0; - oo->current.fill.w = (double)oo->current.image.w; - oo->current.fill.h = (double)oo->current.image.h; imlib_free_image(); } } + oo->current.fill.x = 0; + oo->current.fill.y = 0; + oo->current.fill.w = (double)oo->current.image.w; + oo->current.fill.h = (double)oo->current.image.h; + o->current.x = 0; + o->current.y = 0; + o->current.w = (double)oo->current.image.w; + o->current.h = (double)oo->current.image.h; for (l = e->layers; l; l = l->next) { diff --git a/legacy/evas/src/evas_misc.c b/legacy/evas/src/evas_misc.c index 174b80b940..46a53fa855 100644 --- a/legacy/evas/src/evas_misc.c +++ b/legacy/evas/src/evas_misc.c @@ -3,6 +3,8 @@ #include #include #include +#include "evas_gl_routines.h" +#include "evas_imlib_routines.h" Evas evas_new(void) @@ -85,6 +87,141 @@ evas_set_color(Evas e, Evas_Object o, int r, int g, int b, int a) } } +void +evas_set_text(Evas e, Evas_Object o, char *text) +{ + switch (o->type) + { + case OBJECT_TEXT: + { + Evas_Object_Text oo; + + oo = (Evas_Object_Text)o; + if (oo->current.text) free(oo->current.text); + oo->current.text = strdup(text); + oo->previous.text = NULL; + { + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + { + Evas_Imlib_Font *fn; + + fn = __evas_imlib_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_imlib_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_imlib_text_font_free(fn); + } + } + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + { + Evas_GL_Font *fn; + + fn = __evas_gl_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_gl_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_gl_text_font_free(fn); + } + } + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } + } + o->current.w = (double)oo->current.string.w; + o->current.h = (double)oo->current.string.h; + } + o->changed = 1; + e->changed = 1; + break; + default: + break; + } +} + +void +evas_set_font(Evas e, Evas_Object o, char *font, int size) +{ + switch (o->type) + { + case OBJECT_TEXT: + { + Evas_Object_Text oo; + + oo = (Evas_Object_Text)o; + if (oo->current.font) free(oo->current.font); + oo->current.font = strdup(font); + oo->previous.font = NULL; + oo->current.size = size; + { + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + { + Evas_Imlib_Font *fn; + + fn = __evas_imlib_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_imlib_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_imlib_text_font_free(fn); + } + } + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + { + Evas_GL_Font *fn; + + fn = __evas_gl_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_gl_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_gl_text_font_free(fn); + } + } + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } + } + o->current.w = (double)oo->current.string.w; + o->current.h = (double)oo->current.string.h; + } + o->changed = 1; + e->changed = 1; + break; + default: + break; + } +} + void evas_set_angle(Evas e, Evas_Object o, double angle) { @@ -112,3 +249,172 @@ evas_set_zoom_scale(Evas e, Evas_Object o, int scale) o->changed = 1; e->changed = 1; } + +void +evas_set_font_cache(Evas e, int size) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_text_cache_set_size(e->current.display, size); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_text_cache_set_size(e->current.display, size); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +int +evas_get_font_cache(Evas e) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + return __evas_imlib_text_cache_get_size(e->current.display); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + return __evas_gl_text_cache_get_size(e->current.display); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +void +evas_flush_font_cache(Evas e) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_text_cache_empty(e->current.display); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_text_cache_empty(e->current.display); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +void +evas_set_image_cache(Evas e, int size) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_image_cache_set_size(e->current.display, size); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_image_cache_set_size(e->current.display, size); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +int +evas_get_image_cache(Evas e) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + return __evas_imlib_image_cache_get_size(e->current.display); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + return __evas_gl_image_cache_get_size(e->current.display); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +void +evas_flush_image_cache(Evas e) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_image_cache_empty(e->current.display); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_image_cache_empty(e->current.display); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +void +evas_font_add_path(Evas e, char *path) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_text_font_add_path(path); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_text_font_add_path(path); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + +void +evas_font_del_path(Evas e, char *path) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + __evas_imlib_text_font_del_path(path); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + __evas_gl_text_font_del_path(path); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + return; + break; + } +} + diff --git a/legacy/evas/src/evas_object.c b/legacy/evas/src/evas_object.c index 0227467352..dfca712b93 100644 --- a/legacy/evas/src/evas_object.c +++ b/legacy/evas/src/evas_object.c @@ -206,10 +206,13 @@ evas_move(Evas e, Evas_Object o, double x, double y) void evas_resize(Evas e, Evas_Object o, double w, double h) { - o->current.w = w; - o->current.h = h; - o->changed = 1; - e->changed = 1; + if (o->type != OBJECT_TEXT) + { + o->current.w = w; + o->current.h = h; + o->changed = 1; + e->changed = 1; + } } void diff --git a/legacy/evas/src/evas_render.c b/legacy/evas/src/evas_render.c index f3b01ac504..a7ddb152d3 100644 --- a/legacy/evas/src/evas_render.c +++ b/legacy/evas/src/evas_render.c @@ -85,6 +85,9 @@ evas_render(Evas e) void (*func_init) (Display *disp, Window w); int (*func_image_get_width) (void *im); int (*func_image_get_height) (void *im); + void * (*func_text_font_new) (Display *disp, char *font, int size); + void (*func_text_font_free) (Evas_GL_Font *fn); + void (*func_text_draw) (Evas_GL_Font *fn, Display *disp, Window win, int win_w, int win_h, int x, int y, char *text, int r, int g, int b, int a); if ((!e->changed) || (!e->current.display) || @@ -106,6 +109,9 @@ evas_render(Evas e) func_init = __evas_imlib_init; func_image_get_width = __evas_imlib_image_get_width; func_image_get_height = __evas_imlib_image_get_height; + func_text_font_new = __evas_imlib_text_font_new; + func_text_font_free = __evas_imlib_text_font_free; + func_text_draw = __evas_imlib_text_draw; break; case RENDER_METHOD_BASIC_HARDWARE: break; @@ -118,6 +124,9 @@ evas_render(Evas e) func_init = __evas_gl_init; func_image_get_width = __evas_gl_image_get_width; func_image_get_height = __evas_gl_image_get_height; + func_text_font_new = __evas_gl_text_font_new; + func_text_font_free = __evas_gl_text_font_free; + func_text_draw = __evas_gl_text_draw; break; case RENDER_METHOD_ALPHA_HARDWARE: break; @@ -190,7 +199,14 @@ evas_render(Evas e) Evas_Object_Text oo; oo = o; - if (1) + if (((oo->current.text) && (!oo->previous.text)) || + ((oo->current.font) && (!oo->previous.font)) || + (oo->current.size != oo->previous.size) || + (oo->current.r != oo->previous.r) || + (oo->current.g != oo->previous.g) || + (oo->current.b != oo->previous.b) || + (oo->current.a != oo->previous.a) + ) real_change = 1; oo->previous = oo->current; } @@ -451,8 +467,26 @@ evas_render(Evas e) case OBJECT_TEXT: { Evas_Object_Text oo; + void *fn; oo = o; + fn = func_text_font_new(e->current.display, oo->current.font, oo->current.size); + if (fn) + { + func_text_draw(fn, + e->current.display, + e->current.drawable, + e->current.drawable_width, + e->current.drawable_height, + o->current.x, + o->current.y, + oo->current.text, + oo->current.r, + oo->current.g, + oo->current.b, + oo->current.a); + func_text_font_free(fn); + } } break; case OBJECT_RECTANGLE: @@ -609,7 +643,7 @@ evas_set_scale_smoothness(Evas e, int smooth) case RENDER_METHOD_ALPHA_HARDWARE: break; default: - return 0; + return; break; } } diff --git a/legacy/evas/src/evas_text.c b/legacy/evas/src/evas_text.c index c90bbb8e99..4795ce5111 100644 --- a/legacy/evas/src/evas_text.c +++ b/legacy/evas/src/evas_text.c @@ -3,8 +3,119 @@ #include #include #include +#include "evas_gl_routines.h" +#include "evas_imlib_routines.h" + +static void +_evas_free_text(Evas_Object o) +{ + Evas_Object_Text oo; + + oo = o; + if (o->callbacks) evas_list_free(o->callbacks); + if (oo->current.text) free(oo->current.text); + free(o); +} + +static void +_evas_free_text_renderer_data(Evas e, Evas_Object o) +{ + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } +} Evas_Object evas_add_text(Evas e, char *font, int size, char *text) { + Evas_Object_Text oo; + Evas_Object_Any o; + Evas_List l; + Evas_Layer layer; + + o = oo = malloc(sizeof(struct _Evas_Object_Text)); + memset(o, 0, sizeof(struct _Evas_Object_Text)); + o->type = OBJECT_TEXT; + o->object_free = _evas_free_text; + o->object_renderer_data_free = _evas_free_text_renderer_data; + + oo->current.text = strdup(text); + oo->current.font = strdup(font); + oo->current.size = size; + + { + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + { + Evas_Imlib_Font *fn; + + fn = __evas_imlib_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_imlib_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_imlib_text_font_free(fn); + } + } + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + { + Evas_GL_Font *fn; + + fn = __evas_gl_text_font_new (e->current.display, + oo->current.font, + oo->current.size); + if (fn) + { + __evas_gl_text_get_size(fn, oo->current.text, + &oo->current.string.w, + &oo->current.string.h); + __evas_gl_text_font_free(fn); + } + } + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } + } + + o->current.x = 0; + o->current.y = 0; + o->current.w = (double)oo->current.string.w; + o->current.h = (double)oo->current.string.h; + + for (l = e->layers; l; l = l->next) + { + layer = l->data; + if (layer->layer == o->current.layer) + { + layer->objects = evas_list_append(layer->objects, o); + return o; + } + } + + layer = malloc(sizeof(struct _Evas_Layer)); + memset(layer, 0, sizeof(struct _Evas_Layer)); + e->layers = evas_list_append(e->layers, layer); + layer->objects = evas_list_append(layer->objects, o); + + return o; } diff --git a/legacy/evas/test/evas_test.c b/legacy/evas/test/evas_test.c index e8f876710d..cdba6b51ad 100644 --- a/legacy/evas/test/evas_test.c +++ b/legacy/evas/test/evas_test.c @@ -1,5 +1,7 @@ #include #include +#include +#include #include int @@ -63,6 +65,7 @@ main(int argc, char **argv) XMapWindow(d, win); XSync(d, False); } + evas_font_add_path(e, "./fnt"); evas_set_output(e, d, win, vis, cmap); evas_set_output_size(e, win_w, win_h); evas_set_output_viewport(e, 0, 0, win_w, win_h); @@ -75,10 +78,18 @@ main(int argc, char **argv) h /= 2; evas_show(e, o[1]); - for (i = 2 ; i < 128; i++) + for (i = 2 ; i < 100; i++) { o[i] = evas_add_image_from_file(e, "img/mush.png"); evas_show(e, o[i]); + evas_set_layer(e, o[i], 100); + } + for (i = 100; i < 128; i++) + { + o[i] = evas_add_text(e, "notepad", 20, imgs[i & 0x7]); + evas_set_color(e, o[i], rand()&0xff, rand()&0xff, rand()&0xff, 255); + evas_show(e, o[i]); + evas_set_layer(e, o[i], 100); } evas_raise(e, o[1]); @@ -107,6 +118,7 @@ main(int argc, char **argv) mouse_x = ev.xbutton.x; mouse_y = ev.xbutton.y; evas_move(e, o[1], mouse_x - w, mouse_y - h); + evas_set_layer(e, o[1], 200); } break; case ButtonRelease: @@ -118,6 +130,7 @@ main(int argc, char **argv) mouse_x = ev.xbutton.x; mouse_y = ev.xbutton.y; evas_move(e, o[1], mouse_x - w, mouse_y - h); + evas_set_layer(e, o[1], 1); } break; case MotionNotify: @@ -148,7 +161,8 @@ main(int argc, char **argv) k = (i * -60) - (i * 2); x = (win_w + (cos((double)(a + j) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; y = (win_h + (sin((double)(a + k) * 2 * 3.141592654 / 1000) * (win_h - 100))) / 2; - evas_set_image_file(e, o[i], imgs[(i) & 0x7]); + if (i < 100) + evas_set_image_file(e, o[i], imgs[(i) & 0x7]); evas_move(e, o[i], x, y); } evas_render(e);