gradients added and work

SVN revision: 3114
This commit is contained in:
Carsten Haitzler 2000-08-14 06:37:51 +00:00
parent 842031ebaa
commit 0a73a07edf
7 changed files with 212 additions and 20 deletions

View File

@ -196,6 +196,7 @@ struct _Evas_Object_Gradient_Box
struct _Evas_Object_Any object; struct _Evas_Object_Any object;
struct { struct {
Evas_Gradient gradient; Evas_Gradient gradient;
int new_gradient;
double angle; double angle;
} current, previous; } 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_angle(Evas e, Evas_Object o, double angle);
void evas_set_zoom_scale(Evas e, Evas_Object o, int scale); 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_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); void evas_set_font_cache(Evas e, int size);
int evas_get_font_cache(Evas e); int evas_get_font_cache(Evas e);
void evas_flush_font_cache(Evas e); void evas_flush_font_cache(Evas e);
void evas_set_image_cache(Evas e, int size); void evas_set_image_cache(Evas e, int size);
int evas_get_image_cache(Evas e); int evas_get_image_cache(Evas e);
void evas_flush_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_add_path(Evas e, char *path);
void evas_font_del_path(Evas e, char *path); void evas_font_del_path(Evas e, char *path);

View File

@ -3,29 +3,180 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#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_Object
evas_add_gradient_box(Evas e) 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 void
evas_set_gradient(Evas e, Evas_Object o, Evas_Gradient grad) 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 */ /* gradient creating / deletion / modification */
Evas_Gradient Evas_Gradient
evas_gradient_new(void) evas_gradient_new(void)
{ {
Evas_Gradient gr;
gr = malloc(sizeof(struct _Evas_Gradient));
gr->color_points = NULL;
return gr;
} }
void void
evas_gradient_free(Evas_Gradient grad) 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 void
evas_gradient_add_color(Evas_Gradient grad, int r, int g, int b, int a, int dist) 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);
} }

View File

@ -7,7 +7,7 @@
static void static void
_evas_free_line(Evas_Object o) _evas_free_line(Evas_Object o)
{ {
Evas_Object_Rectangle oo; Evas_Object_Line oo;
oo = o; oo = o;
if (o->callbacks) evas_list_free(o->callbacks); if (o->callbacks) evas_list_free(o->callbacks);

View File

@ -290,6 +290,7 @@ evas_get_font_cache(Evas e)
return; return;
break; break;
} }
return 0;
} }
void void
@ -353,6 +354,7 @@ evas_get_image_cache(Evas e)
return; return;
break; break;
} }
return 0;
} }
void void

View File

@ -197,6 +197,7 @@ evas_stack_below(Evas e, Evas_Object o, Evas_Object above)
void void
evas_move(Evas e, Evas_Object o, double x, double y) evas_move(Evas e, Evas_Object o, double x, double y)
{ {
if ((o->type == OBJECT_LINE)) return;
o->current.x = x; o->current.x = x;
o->current.y = y; o->current.y = y;
o->changed = 1; o->changed = 1;
@ -206,13 +207,11 @@ evas_move(Evas e, Evas_Object o, double x, double y)
void void
evas_resize(Evas e, Evas_Object o, double w, double h) evas_resize(Evas e, Evas_Object o, double w, double h)
{ {
if (o->type != OBJECT_TEXT) if ((o->type == OBJECT_TEXT) || (o->type == OBJECT_LINE)) return;
{ o->current.w = w;
o->current.w = w; o->current.h = h;
o->current.h = h; o->changed = 1;
o->changed = 1; e->changed = 1;
e->changed = 1;
}
} }
void void

View File

@ -86,10 +86,11 @@ evas_render(Evas e)
int (*func_image_get_width) (void *im); int (*func_image_get_width) (void *im);
int (*func_image_get_height) (void *im); int (*func_image_get_height) (void *im);
void * (*func_text_font_new) (Display *disp, char *font, int size); void * (*func_text_font_new) (Display *disp, char *font, int size);
void (*func_text_font_free) (Evas_GL_Font *fn); void (*func_text_font_free) (void *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_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_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_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) || if ((!e->changed) ||
(!e->current.display) || (!e->current.display) ||
@ -116,6 +117,7 @@ evas_render(Evas e)
func_text_draw = __evas_imlib_text_draw; func_text_draw = __evas_imlib_text_draw;
func_rectangle_draw = __evas_imlib_rectangle_draw; func_rectangle_draw = __evas_imlib_rectangle_draw;
func_line_draw = __evas_imlib_line_draw; func_line_draw = __evas_imlib_line_draw;
func_gradient_draw = __evas_imlib_gradient_draw;
break; break;
case RENDER_METHOD_BASIC_HARDWARE: case RENDER_METHOD_BASIC_HARDWARE:
break; break;
@ -133,6 +135,7 @@ evas_render(Evas e)
func_text_draw = __evas_gl_text_draw; func_text_draw = __evas_gl_text_draw;
func_rectangle_draw = __evas_gl_rectangle_draw; func_rectangle_draw = __evas_gl_rectangle_draw;
func_line_draw = __evas_gl_line_draw; func_line_draw = __evas_gl_line_draw;
func_gradient_draw = __evas_gl_gradient_draw;
break; break;
case RENDER_METHOD_ALPHA_HARDWARE: case RENDER_METHOD_ALPHA_HARDWARE:
break; break;
@ -197,6 +200,7 @@ evas_render(Evas e)
(oo->current.fill.h != oo->previous.fill.h) (oo->current.fill.h != oo->previous.fill.h)
) )
real_change = 1; real_change = 1;
oo->current.new_data = 0;
oo->previous = oo->current; oo->previous = oo->current;
} }
break; break;
@ -254,8 +258,10 @@ evas_render(Evas e)
Evas_Object_Gradient_Box oo; Evas_Object_Gradient_Box oo;
oo = o; oo = o;
if (1) if ((oo->current.new_gradient) ||
(oo->current.angle != oo->previous.angle))
real_change = 1; real_change = 1;
oo->current.new_gradient = 0;
oo->previous = oo->current; oo->previous = oo->current;
} }
break; break;
@ -512,8 +518,7 @@ evas_render(Evas e)
Evas_Object_Rectangle oo; Evas_Object_Rectangle oo;
oo = o; oo = o;
func_rectangle_draw( func_rectangle_draw(e->current.display,
e->current.display,
e->current.drawable, e->current.drawable,
e->current.drawable_width, e->current.drawable_width,
e->current.drawable_height, e->current.drawable_height,
@ -532,8 +537,7 @@ evas_render(Evas e)
Evas_Object_Line oo; Evas_Object_Line oo;
oo = o; oo = o;
func_line_draw( func_line_draw(e->current.display,
e->current.display,
e->current.drawable, e->current.drawable,
e->current.drawable_width, e->current.drawable_width,
e->current.drawable_height, e->current.drawable_height,
@ -552,6 +556,17 @@ evas_render(Evas e)
Evas_Object_Gradient_Box oo; Evas_Object_Gradient_Box oo;
oo = o; 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; break;
default: default:

View File

@ -26,7 +26,8 @@ main(int argc, char **argv)
int win_w, win_h; int win_w, win_h;
int i, a, w, h; int i, a, w, h;
Evas e; Evas e;
Evas_Object o[128], o_rect; Evas_Object o[128], o_rect, o_line, o_grad;
Evas_Gradient grad;
int down; int down;
double t1, t2; double t1, t2;
char *imgs[8] = char *imgs[8] =
@ -42,14 +43,14 @@ main(int argc, char **argv)
}; };
win_w = 640; win_h = 480; win_w = 640; win_h = 480;
if (argc == 4) if (argc >= 3)
{ {
win_w = atoi(argv[1]); win_w = atoi(argv[1]);
win_h = atoi(argv[2]); win_h = atoi(argv[2]);
} }
e = evas_new(); e = evas_new();
if (!strcmp(argv[3], "software")) if ((argc == 4) && (!strcmp(argv[3], "software")))
evas_set_output_method(e, RENDER_METHOD_ALPHA_SOFTWARE); evas_set_output_method(e, RENDER_METHOD_ALPHA_SOFTWARE);
else else
evas_set_output_method(e, RENDER_METHOD_3D_HARDWARE); evas_set_output_method(e, RENDER_METHOD_3D_HARDWARE);
@ -99,7 +100,7 @@ main(int argc, char **argv)
} }
for (i = 100; i < 128; i++) 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_set_color(e, o[i], rand()&0xff, rand()&0xff, rand()&0xff, 255);
evas_show(e, o[i]); evas_show(e, o[i]);
evas_set_layer(e, o[i], 100); 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_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120);
evas_set_layer(e, o_rect, 150); 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_raise(e, o[1]);
evas_move(e, o[0], 0, 0); evas_move(e, o[0], 0, 0);
evas_resize(e, o[0], win_w, win_h); 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_set_image_file(e, o[i], imgs[(i) & 0x7]);
evas_move(e, o[i], x, y); evas_move(e, o[i], x, y);
} }
evas_set_angle(e, o_grad, (double)a * 360 / 1000);
evas_render(e); evas_render(e);
a++; a++;
if ((a % 25) == 0) if ((a % 25) == 0)
{ {
t2 = get_time() - t1; t2 = get_time() - t1;
t1 = get_time(); t1 = get_time();
printf("%3.3f fps\n", 25 / t2); printf("%3.1f fps\n", 25 / t2);
} }
if (a >= 1000) if (a >= 1000)
{ {