diff --git a/legacy/evas/src/Evas.h b/legacy/evas/src/Evas.h index 106720b0a3..1918d18564 100644 --- a/legacy/evas/src/Evas.h +++ b/legacy/evas/src/Evas.h @@ -196,6 +196,7 @@ struct _Evas_Object_Gradient_Box struct _Evas_Object_Any object; struct { Evas_Gradient gradient; + int new_gradient; double angle; } current, previous; }; @@ -247,12 +248,16 @@ 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); + +/* cache settings for performance */ 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); + +/* font path */ void evas_font_add_path(Evas e, char *path); void evas_font_del_path(Evas e, char *path); diff --git a/legacy/evas/src/evas_gradient.c b/legacy/evas/src/evas_gradient.c index a0843dd25d..c6e01a1fcd 100644 --- a/legacy/evas/src/evas_gradient.c +++ b/legacy/evas/src/evas_gradient.c @@ -3,29 +3,180 @@ #include #include #include +#include "evas_gl_routines.h" +#include "evas_imlib_routines.h" + +static void +_evas_free_gradient_box(Evas_Object o) +{ + Evas_Object_Gradient_Box oo; + + oo = o; + if (o->callbacks) evas_list_free(o->callbacks); + if (oo->current.gradient) evas_gradient_free(oo->current.gradient); + free(o); +} + +static void +_evas_free_gradient_box_renderer_data(Evas e, Evas_Object o) +{ + Evas_Object_Gradient_Box oo; + + oo= o; + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + if (o->renderer_data.method[e->current.render_method]) + __evas_imlib_gradient_free(o->renderer_data.method[e->current.render_method]); + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + if (o->renderer_data.method[e->current.render_method]) + __evas_gl_gradient_free(o->renderer_data.method[e->current.render_method]); + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } +} Evas_Object evas_add_gradient_box(Evas e) { + Evas_Object_Gradient_Box oo; + Evas_Object_Any o; + Evas_List l; + Evas_Layer layer; + + o = oo = malloc(sizeof(struct _Evas_Object_Gradient_Box)); + memset(o, 0, sizeof(struct _Evas_Object_Gradient_Box)); + o->type = OBJECT_GRADIENT_BOX; + o->object_free = _evas_free_gradient_box; + o->object_renderer_data_free = _evas_free_gradient_box_renderer_data; + + o->current.x = 0; + o->current.y = 0; + o->current.w = 1; + o->current.h = 1; + + oo->current.angle = 0.0; + + 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; } void evas_set_gradient(Evas e, Evas_Object o, Evas_Gradient grad) { + Evas_Object_Gradient_Box oo; + + oo = o; + if (oo->current.gradient) + evas_gradient_free(oo->current.gradient); + oo->current.gradient = grad; + switch (e->current.render_method) + { + case RENDER_METHOD_ALPHA_SOFTWARE: + if (o->renderer_data.method[e->current.render_method]) + __evas_imlib_gradient_free(o->renderer_data.method[e->current.render_method]); + { + Evas_Imlib_Graident *g; + Evas_List l; + + g = __evas_imlib_gradient_new(e->current.display); + o->renderer_data.method[e->current.render_method] = g; + for (l = grad->color_points; l; l = l->next) + { + Evas_Color_Point col; + + col= l->data; + __evas_imlib_gradient_color_add(g, col->r, col->g, col->b, + col->a, col->distance); + } + } + break; + case RENDER_METHOD_BASIC_HARDWARE: + break; + case RENDER_METHOD_3D_HARDWARE: + if (o->renderer_data.method[e->current.render_method]) + __evas_gl_gradient_free(o->renderer_data.method[e->current.render_method]); + { + Evas_GL_Graident *g; + Evas_List l; + + g = __evas_gl_gradient_new(e->current.display); + o->renderer_data.method[e->current.render_method] = g; + for (l = grad->color_points; l; l = l->next) + { + Evas_Color_Point col; + + col= l->data; + __evas_gl_gradient_color_add(g, col->r, col->g, col->b, + col->a, col->distance); + } + } + break; + case RENDER_METHOD_ALPHA_HARDWARE: + break; + default: + break; + } + oo->current.new_gradient = 1; + o->changed = 1; + e->changed = 1; } /* gradient creating / deletion / modification */ Evas_Gradient evas_gradient_new(void) { + Evas_Gradient gr; + + gr = malloc(sizeof(struct _Evas_Gradient)); + gr->color_points = NULL; + return gr; } void evas_gradient_free(Evas_Gradient grad) { + Evas_List l; + + if (grad->color_points) + { + for (l = grad->color_points; l; l = l->next) + free(l->data); + evas_list_free(grad->color_points); + } + free(grad); } void evas_gradient_add_color(Evas_Gradient grad, int r, int g, int b, int a, int dist) { + Evas_Color_Point col; + + col = malloc(sizeof(struct _Evas_Color_Point)); + col->r = r; + col->g = g; + col->b = b; + col->a = a; + col->distance = dist; + grad->color_points = evas_list_append(grad->color_points, col); } diff --git a/legacy/evas/src/evas_line.c b/legacy/evas/src/evas_line.c index 647c1958c7..451e93743c 100644 --- a/legacy/evas/src/evas_line.c +++ b/legacy/evas/src/evas_line.c @@ -7,7 +7,7 @@ static void _evas_free_line(Evas_Object o) { - Evas_Object_Rectangle oo; + Evas_Object_Line oo; oo = o; if (o->callbacks) evas_list_free(o->callbacks); diff --git a/legacy/evas/src/evas_misc.c b/legacy/evas/src/evas_misc.c index 46a53fa855..1883bb4579 100644 --- a/legacy/evas/src/evas_misc.c +++ b/legacy/evas/src/evas_misc.c @@ -290,6 +290,7 @@ evas_get_font_cache(Evas e) return; break; } + return 0; } void @@ -353,6 +354,7 @@ evas_get_image_cache(Evas e) return; break; } + return 0; } void diff --git a/legacy/evas/src/evas_object.c b/legacy/evas/src/evas_object.c index dfca712b93..64c499eaa8 100644 --- a/legacy/evas/src/evas_object.c +++ b/legacy/evas/src/evas_object.c @@ -197,6 +197,7 @@ evas_stack_below(Evas e, Evas_Object o, Evas_Object above) void evas_move(Evas e, Evas_Object o, double x, double y) { + if ((o->type == OBJECT_LINE)) return; o->current.x = x; o->current.y = y; o->changed = 1; @@ -206,13 +207,11 @@ evas_move(Evas e, Evas_Object o, double x, double y) void evas_resize(Evas e, Evas_Object o, double w, double h) { - if (o->type != OBJECT_TEXT) - { - o->current.w = w; - o->current.h = h; - o->changed = 1; - e->changed = 1; - } + if ((o->type == OBJECT_TEXT) || (o->type == OBJECT_LINE)) return; + 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 dc35ee5a38..2a435e004b 100644 --- a/legacy/evas/src/evas_render.c +++ b/legacy/evas/src/evas_render.c @@ -86,10 +86,11 @@ evas_render(Evas e) 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); + void (*func_text_font_free) (void *fn); + void (*func_text_draw) (void *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); void (*func_rectangle_draw) (Display *disp, Window win, int win_w, int win_h, int x, int y, int w, int h, int r, int g, int b, int a); void (*func_line_draw) (Display *disp, Window win, int win_w, int win_h, int x1, int y1, int x2, int y2, int r, int g, int b, int a); + void (*func_gradient_draw) (void *gr, Display *disp, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle); if ((!e->changed) || (!e->current.display) || @@ -116,6 +117,7 @@ evas_render(Evas e) func_text_draw = __evas_imlib_text_draw; func_rectangle_draw = __evas_imlib_rectangle_draw; func_line_draw = __evas_imlib_line_draw; + func_gradient_draw = __evas_imlib_gradient_draw; break; case RENDER_METHOD_BASIC_HARDWARE: break; @@ -133,6 +135,7 @@ evas_render(Evas e) func_text_draw = __evas_gl_text_draw; func_rectangle_draw = __evas_gl_rectangle_draw; func_line_draw = __evas_gl_line_draw; + func_gradient_draw = __evas_gl_gradient_draw; break; case RENDER_METHOD_ALPHA_HARDWARE: break; @@ -197,6 +200,7 @@ evas_render(Evas e) (oo->current.fill.h != oo->previous.fill.h) ) real_change = 1; + oo->current.new_data = 0; oo->previous = oo->current; } break; @@ -254,8 +258,10 @@ evas_render(Evas e) Evas_Object_Gradient_Box oo; oo = o; - if (1) + if ((oo->current.new_gradient) || + (oo->current.angle != oo->previous.angle)) real_change = 1; + oo->current.new_gradient = 0; oo->previous = oo->current; } break; @@ -512,8 +518,7 @@ evas_render(Evas e) Evas_Object_Rectangle oo; oo = o; - func_rectangle_draw( - e->current.display, + func_rectangle_draw(e->current.display, e->current.drawable, e->current.drawable_width, e->current.drawable_height, @@ -532,8 +537,7 @@ evas_render(Evas e) Evas_Object_Line oo; oo = o; - func_line_draw( - e->current.display, + func_line_draw(e->current.display, e->current.drawable, e->current.drawable_width, e->current.drawable_height, @@ -552,6 +556,17 @@ evas_render(Evas e) Evas_Object_Gradient_Box oo; oo = o; + if (o->renderer_data.method[e->current.render_method]) + func_gradient_draw(o->renderer_data.method[e->current.render_method], + e->current.display, + e->current.drawable, + e->current.drawable_width, + e->current.drawable_height, + o->current.x, + o->current.y, + o->current.w, + o->current.h, + oo->current.angle); } break; default: diff --git a/legacy/evas/test/evas_test.c b/legacy/evas/test/evas_test.c index 2890e2aee1..c707b0e402 100644 --- a/legacy/evas/test/evas_test.c +++ b/legacy/evas/test/evas_test.c @@ -26,7 +26,8 @@ main(int argc, char **argv) int win_w, win_h; int i, a, w, h; Evas e; - Evas_Object o[128], o_rect; + Evas_Object o[128], o_rect, o_line, o_grad; + Evas_Gradient grad; int down; double t1, t2; char *imgs[8] = @@ -42,14 +43,14 @@ main(int argc, char **argv) }; win_w = 640; win_h = 480; - if (argc == 4) + if (argc >= 3) { win_w = atoi(argv[1]); win_h = atoi(argv[2]); } e = evas_new(); - if (!strcmp(argv[3], "software")) + if ((argc == 4) && (!strcmp(argv[3], "software"))) evas_set_output_method(e, RENDER_METHOD_ALPHA_SOFTWARE); else evas_set_output_method(e, RENDER_METHOD_3D_HARDWARE); @@ -99,7 +100,7 @@ main(int argc, char **argv) } for (i = 100; i < 128; i++) { - o[i] = evas_add_text(e, "notepad", 20, imgs[i & 0x7]); + o[i] = evas_add_text(e, "notepad", 16, 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); @@ -111,6 +112,24 @@ main(int argc, char **argv) evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120); evas_set_layer(e, o_rect, 150); + o_line = evas_add_line(e); + evas_show(e, o_line); + evas_set_line_xy(e, o_line, 10, 20, 100, 50); + evas_set_color(e, o_line, rand()&0xff, rand()&0xff, rand()&0xff, 120); + evas_set_layer(e, o_rect, 150); + + o_grad = evas_add_gradient_box(e); + evas_show(e, o_grad); + evas_move(e, o_grad, 300, 50); + evas_resize(e, o_grad, 300, 400); + evas_set_layer(e, o_grad, 150); + grad = evas_gradient_new(); + evas_gradient_add_color(grad, 255, 255, 255, 255, 8); + evas_gradient_add_color(grad, 255, 255, 0, 200, 8); + evas_gradient_add_color(grad, 255, 0 , 0, 150, 8); + evas_gradient_add_color(grad, 0 , 0 , 0, 0, 8); + evas_set_gradient(e, o_grad, grad); + evas_raise(e, o[1]); evas_move(e, o[0], 0, 0); evas_resize(e, o[0], win_w, win_h); @@ -185,13 +204,14 @@ main(int argc, char **argv) evas_set_image_file(e, o[i], imgs[(i) & 0x7]); evas_move(e, o[i], x, y); } + evas_set_angle(e, o_grad, (double)a * 360 / 1000); evas_render(e); a++; if ((a % 25) == 0) { t2 = get_time() - t1; t1 = get_time(); - printf("%3.3f fps\n", 25 / t2); + printf("%3.1f fps\n", 25 / t2); } if (a >= 1000) {