2000-07-31 11:06:21 -07:00
|
|
|
#include "Evas.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <string.h>
|
2000-08-13 20:23:46 -07:00
|
|
|
#include "evas_gl_routines.h"
|
|
|
|
#include "evas_imlib_routines.h"
|
2000-09-13 15:36:46 -07:00
|
|
|
#include "evas_image_routines.h"
|
2000-07-31 11:06:21 -07:00
|
|
|
|
|
|
|
Evas
|
|
|
|
evas_new(void)
|
|
|
|
{
|
|
|
|
Evas e;
|
|
|
|
|
|
|
|
e = malloc(sizeof(struct _Evas));
|
|
|
|
memset(e, 0, sizeof(struct _Evas));
|
|
|
|
e->current.viewport.x = 0.0;
|
|
|
|
e->current.viewport.y = 0.0;
|
|
|
|
e->current.viewport.w = 0.0;
|
|
|
|
e->current.viewport.h = 0.0;
|
2000-09-15 08:04:48 -07:00
|
|
|
e->current.render_method = RENDER_METHOD_ALPHA_SOFTWARE;
|
|
|
|
e->current.colors = 128;
|
2000-07-31 11:06:21 -07:00
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_free(Evas e)
|
|
|
|
{
|
|
|
|
Evas_List l;
|
|
|
|
|
|
|
|
for (l = e->layers; l; l = l->next)
|
|
|
|
{
|
2000-08-13 17:14:22 -07:00
|
|
|
Evas_Layer layer;
|
|
|
|
|
|
|
|
layer = l->data;
|
2000-09-15 17:17:37 -07:00
|
|
|
/* FIXME: odd? can someine investigate? i'm stumped on this one */
|
|
|
|
/* this is odd - compile evas with -O0 no segv - otherwise a */
|
|
|
|
/* segv ....... ???? */
|
2000-08-13 17:14:22 -07:00
|
|
|
_evas_layer_free(layer);
|
2000-07-31 11:06:21 -07:00
|
|
|
}
|
|
|
|
if (e->layers) evas_list_free(e->layers);
|
2000-08-13 17:14:22 -07:00
|
|
|
if (e->updates) imlib_updates_free(e->updates);
|
2000-07-31 11:06:21 -07:00
|
|
|
free(e);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_set_color(Evas e, Evas_Object o, int r, int g, int b, int a)
|
|
|
|
{
|
2000-08-07 18:55:28 -07:00
|
|
|
switch (o->type)
|
|
|
|
{
|
2000-09-15 06:49:14 -07:00
|
|
|
case OBJECT_IMAGE:
|
|
|
|
{
|
|
|
|
Evas_Object_Image oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Image)o;
|
|
|
|
oo->current.color.r = r;
|
|
|
|
oo->current.color.g = g;
|
|
|
|
oo->current.color.b = b;
|
|
|
|
oo->current.color.a = a;
|
|
|
|
}
|
|
|
|
o->changed = 1;
|
|
|
|
e->changed = 1;
|
|
|
|
break;
|
2000-08-07 18:55:28 -07:00
|
|
|
case OBJECT_TEXT:
|
|
|
|
{
|
|
|
|
Evas_Object_Text oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Text)o;
|
|
|
|
oo->current.r = r;
|
|
|
|
oo->current.g = g;
|
|
|
|
oo->current.b = b;
|
|
|
|
oo->current.a = a;
|
|
|
|
}
|
|
|
|
o->changed = 1;
|
|
|
|
e->changed = 1;
|
|
|
|
break;
|
|
|
|
case OBJECT_RECTANGLE:
|
|
|
|
{
|
|
|
|
Evas_Object_Rectangle oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Rectangle)o;
|
|
|
|
oo->current.r = r;
|
|
|
|
oo->current.g = g;
|
|
|
|
oo->current.b = b;
|
|
|
|
oo->current.a = a;
|
|
|
|
}
|
|
|
|
o->changed = 1;
|
|
|
|
e->changed = 1;
|
|
|
|
break;
|
|
|
|
case OBJECT_LINE:
|
|
|
|
{
|
|
|
|
Evas_Object_Line oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Line)o;
|
|
|
|
oo->current.r = r;
|
|
|
|
oo->current.g = g;
|
|
|
|
oo->current.b = b;
|
|
|
|
oo->current.a = a;
|
|
|
|
}
|
|
|
|
o->changed = 1;
|
|
|
|
e->changed = 1;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2000-07-31 11:06:21 -07:00
|
|
|
}
|
|
|
|
|
2000-08-20 00:13:31 -07:00
|
|
|
void
|
|
|
|
evas_get_color(Evas e, Evas_Object o, int *r, int *g, int *b, int *a)
|
|
|
|
{
|
|
|
|
switch (o->type)
|
|
|
|
{
|
|
|
|
case OBJECT_TEXT:
|
|
|
|
{
|
|
|
|
Evas_Object_Text oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Text)o;
|
2000-08-26 18:54:14 -07:00
|
|
|
if (r) *r = oo->current.r;
|
|
|
|
if (g) *g = oo->current.g;
|
|
|
|
if (b) *b = oo->current.b;
|
|
|
|
if (a) *a = oo->current.a;
|
2000-08-20 00:13:31 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECT_RECTANGLE:
|
|
|
|
{
|
|
|
|
Evas_Object_Rectangle oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Rectangle)o;
|
2000-08-26 18:54:14 -07:00
|
|
|
if (r) *r = oo->current.r;
|
|
|
|
if (g) *g = oo->current.g;
|
|
|
|
if (b) *b = oo->current.b;
|
|
|
|
if (a) *a = oo->current.a;
|
2000-08-20 00:13:31 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case OBJECT_LINE:
|
|
|
|
{
|
|
|
|
Evas_Object_Line oo;
|
|
|
|
|
|
|
|
oo = (Evas_Object_Line)o;
|
2000-08-26 18:54:14 -07:00
|
|
|
if (r) *r = oo->current.r;
|
|
|
|
if (g) *g = oo->current.g;
|
|
|
|
if (b) *b = oo->current.b;
|
|
|
|
if (a) *a = oo->current.a;
|
2000-08-20 00:13:31 -07:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-07-31 11:06:21 -07:00
|
|
|
void
|
|
|
|
evas_set_zoom_scale(Evas e, Evas_Object o, int scale)
|
|
|
|
{
|
2000-08-07 18:55:28 -07:00
|
|
|
o->current.zoomscale = scale;
|
|
|
|
o->changed = 1;
|
|
|
|
e->changed = 1;
|
2000-07-31 11:06:21 -07:00
|
|
|
}
|
2000-08-13 20:23:46 -07:00
|
|
|
|
2000-08-21 20:45:58 -07:00
|
|
|
void
|
|
|
|
evas_set_pass_events(Evas e, Evas_Object o, int pass_events)
|
|
|
|
{
|
|
|
|
o->pass_events = 1;
|
|
|
|
}
|
|
|
|
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_text_cache_set_size(e->current.display, size);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
return __evas_image_text_cache_get_size(e->current.display);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
default:
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
2000-08-13 23:37:51 -07:00
|
|
|
return 0;
|
2000-08-13 20:23:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_text_cache_empty(e->current.display);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_image_cache_set_size(e->current.display, size);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
return __evas_image_image_cache_get_size(e->current.display);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
default:
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
2000-08-13 23:37:51 -07:00
|
|
|
return 0;
|
2000-08-13 20:23:46 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_image_cache_empty(e->current.display);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
default:
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
evas_font_add_path(Evas e, char *path)
|
|
|
|
{
|
2000-09-15 06:49:14 -07:00
|
|
|
evas_font_del_path(e, path);
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_text_font_add_path(path);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
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;
|
2000-09-13 15:36:46 -07:00
|
|
|
case RENDER_METHOD_IMAGE:
|
|
|
|
__evas_image_text_font_del_path(path);
|
|
|
|
break;
|
2000-08-13 20:23:46 -07:00
|
|
|
default:
|
|
|
|
return;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-08-14 00:01:00 -07:00
|
|
|
void
|
2000-08-20 00:13:31 -07:00
|
|
|
evas_put_data(Evas e, Evas_Object o, char *key, void *data)
|
2000-08-14 00:01:00 -07:00
|
|
|
{
|
2000-08-20 00:13:31 -07:00
|
|
|
Evas_Data d;
|
2000-08-20 14:49:41 -07:00
|
|
|
Evas_List l;
|
2000-08-20 00:13:31 -07:00
|
|
|
|
|
|
|
if (!key) return;
|
2000-08-20 14:49:41 -07:00
|
|
|
for (l = o->data; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_Data d;
|
|
|
|
|
|
|
|
d = l->data;
|
|
|
|
if (!strcmp(d->key, key))
|
|
|
|
{
|
|
|
|
d->data = data;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2000-08-20 00:13:31 -07:00
|
|
|
d = malloc(sizeof(struct _Evas_Data));
|
|
|
|
d->key = strdup(key);
|
|
|
|
d->data = data;
|
2000-08-20 14:49:41 -07:00
|
|
|
o->data = evas_list_prepend(o->data, d);
|
2000-08-14 00:01:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void *
|
2000-08-20 00:13:31 -07:00
|
|
|
evas_get_data(Evas e, Evas_Object o, char *key)
|
|
|
|
{
|
|
|
|
Evas_List l;
|
|
|
|
|
2000-08-20 14:49:41 -07:00
|
|
|
if (!key) return NULL;
|
2000-08-20 00:13:31 -07:00
|
|
|
for (l = o->data; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_Data d;
|
|
|
|
|
|
|
|
d = l->data;
|
|
|
|
if (!strcmp(d->key, key)) return d->data;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-08-20 14:49:41 -07:00
|
|
|
void *
|
|
|
|
evas_remove_data(Evas e, Evas_Object o, char *key)
|
|
|
|
{
|
|
|
|
Evas_List l;
|
|
|
|
|
|
|
|
if (!key) return NULL;
|
|
|
|
for (l = o->data; l; l = l->next)
|
|
|
|
{
|
|
|
|
Evas_Data d;
|
|
|
|
|
|
|
|
d = l->data;
|
|
|
|
if (!strcmp(d->key, key))
|
|
|
|
{
|
|
|
|
void *data;
|
|
|
|
|
|
|
|
o->data = evas_list_remove(o->data, l->data);
|
|
|
|
data = d->data;
|
|
|
|
free(d->key);
|
|
|
|
free(d);
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2000-08-20 00:13:31 -07:00
|
|
|
int
|
|
|
|
evas_world_x_to_screen(Evas e, double x)
|
|
|
|
{
|
|
|
|
return (int)((x - e->current.viewport.x) *
|
|
|
|
((double)e->current.drawable_width / e->current.viewport.w));
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
evas_world_y_to_screen(Evas e, double y)
|
|
|
|
{
|
|
|
|
return (int)((y - e->current.viewport.y) *
|
|
|
|
((double)e->current.drawable_height / e->current.viewport.h));
|
|
|
|
}
|
|
|
|
|
|
|
|
double
|
|
|
|
evas_screen_x_to_world(Evas e, int x)
|
2000-08-14 00:01:00 -07:00
|
|
|
{
|
2000-08-20 00:13:31 -07:00
|
|
|
return (double)((double)x * (e->current.viewport.w / (double)e->current.drawable_width));
|
|
|
|
+ e->current.viewport.x;
|
2000-08-14 00:01:00 -07:00
|
|
|
}
|
|
|
|
|
2000-08-20 00:13:31 -07:00
|
|
|
double
|
|
|
|
evas_screen_y_to_world(Evas e, int y)
|
|
|
|
{
|
|
|
|
return (double)((double)y * (e->current.viewport.h / (double)e->current.drawable_height));
|
|
|
|
+ e->current.viewport.y;
|
|
|
|
}
|