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_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);

View File

@ -3,29 +3,180 @@
#include <stdlib.h>
#include <unistd.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_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);
}

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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)
{