we have a new rendering target for evas - an imlib image buffer.


			
			
				devs/devilhorns/wayland_egl
			
			
		
Carsten Haitzler 23 years ago
parent 3a1fb0355c
commit a751ec1b21
  1. 13
      legacy/evas/src/Evas.h
  2. 2
      legacy/evas/src/Makefile.am
  3. 46
      legacy/evas/src/evas_gl_routines.c
  4. 14
      legacy/evas/src/evas_gl_routines.h
  5. 24
      legacy/evas/src/evas_gradient.c
  6. 2
      legacy/evas/src/evas_image.c
  7. 825
      legacy/evas/src/evas_image_routines.c
  8. 111
      legacy/evas/src/evas_image_routines.h
  9. 22
      legacy/evas/src/evas_imlib_routines.c
  10. 14
      legacy/evas/src/evas_imlib_routines.h
  11. 2
      legacy/evas/src/evas_line.c
  12. 25
      legacy/evas/src/evas_misc.c
  13. 119
      legacy/evas/src/evas_object.c
  14. 2
      legacy/evas/src/evas_rectangle.c
  15. 70
      legacy/evas/src/evas_render.c
  16. 141
      legacy/evas/src/evas_text.c
  17. 356
      legacy/evas/test/evas_test.c

@ -28,7 +28,8 @@ typedef struct _Evas_Object_Gradient_Box * Evas_Object_Gradient_Box;
#define RENDER_METHOD_BASIC_HARDWARE 1
#define RENDER_METHOD_3D_HARDWARE 2
#define RENDER_METHOD_ALPHA_HARDWARE 3
#define RENDER_METHOD_COUNT 4
#define RENDER_METHOD_IMAGE 4
#define RENDER_METHOD_COUNT 5
#define CALLBACK_MOUSE_IN 0
#define CALLBACK_MOUSE_OUT 1
@ -61,7 +62,8 @@ struct _Evas
Visual *visual;
Colormap colormap;
int screen;
Imlib_Image image;
int drawable_width, drawable_height;
struct {
@ -246,6 +248,7 @@ void evas_get_viewport(Evas e, double *x, double *y, double *w, double *h);
/* the output settings */
void evas_set_output(Evas e, Display *disp, Drawable d, Visual *v, Colormap c);
void evas_set_output_image(Evas e, Imlib_Image image);
void evas_set_output_size(Evas e, int w, int h);
void evas_set_output_viewport(Evas e, double x, double y, double w, double h);
void evas_set_output_method(Evas e, Evas_Render_Method method);
@ -308,6 +311,12 @@ void evas_move(Evas e, Evas_Object o, double x, double y);
void evas_resize(Evas e, Evas_Object o, double w, double h);
void evas_get_geometry(Evas e, Evas_Object o, double *x, double *y, double *w, double *h);
/* object query */
Evas_List evas_objects_in_rect(Evas e, double x, double y, double w, double h);
Evas_List evas_objects_at_position(Evas e, double x, double y);
Evas_Object evas_object_in_rect(Evas e, double x, double y, double w, double h);
Evas_Object evas_object_at_position(Evas e, double x, double y);
/* object visibility */
void evas_show(Evas e, Evas_Object o);
void evas_hide(Evas e, Evas_Object o);

@ -35,6 +35,7 @@ evas_events.c \
evas_gl_routines.c \
evas_gradient.c \
evas_image.c \
evas_image_routines.c \
evas_imlib_routines.c \
evas_line.c \
evas_list.c \
@ -44,6 +45,7 @@ evas_rectangle.c \
evas_render.c \
evas_text.c \
evas_gl_routines.h \
evas_image_routines.h \
evas_imlib_routines.h \
Evas.h

@ -451,7 +451,7 @@ __evas_gl_image_cache_flush(Display *disp)
void
__evas_gl_image_draw(Evas_GL_Image *im,
Display *disp, Window w, int win_w, int win_h,
Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h,
int src_x, int src_y, int src_w, int src_h,
int dst_x, int dst_y, int dst_w, int dst_h)
{
@ -561,33 +561,33 @@ __evas_gl_image_draw(Evas_GL_Image *im,
bt = (int)dh / 2;
bb = (int)dh - bt;
}
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
0, 0, bl, bt,
dx, dy, bl, bt);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
bl, 0, im->w - bl - br, bt,
dx + bl, dy, dw - bl - br, bt);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
im->w - br, 0, br, bt,
dx + dw - br, dy, br, bt);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
0, bt, bl, im->h - bt - bb,
dx, dy + bt, bl, dh - bt - bb);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
bl, bt, im->w - bl - br, im->h - bt - bb,
dx + bl, dy + bt, dw - bl - br, dh - bt - bb);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
im->w - br, bt, br, im->h - bt - bb,
dx + dw - br, dy + bt, br, dh - bt - bb);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
0, im->h - bb, bl, bb,
dx, dy + dh - bb, bl, bb);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
bl, im->h - bb, im->w - bl - br, bb,
dx + bl, dy + dh - bb, dw - bl - br, bb);
__evas_gl_image_draw(im, disp, w, win_w, win_h,
__evas_gl_image_draw(im, disp, dstim, w, win_w, win_h,
im->w - br, im->h - bb, br, bb,
dx + dw - br, dy + dh - bb, br, bb);
im->direct = 0;
@ -1554,7 +1554,7 @@ __evas_gl_text_cache_get_size(Display *disp)
}
void
__evas_gl_text_draw(Evas_GL_Font *fn, Display *disp, Window win,
__evas_gl_text_draw(Evas_GL_Font *fn, Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int x, int y, char *text,
int r, int g, int b, int a)
{
@ -1687,7 +1687,7 @@ __evas_gl_text_get_character_number(Evas_GL_Font *fn, char *text, int num, int *
/* rectangle externals *******************************************************/
/*****************************************************************************/
void __evas_gl_rectangle_draw(Display *disp, Window win,
void __evas_gl_rectangle_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h,
int x, int y, int w, int h,
int r, int g, int b, int a)
@ -1763,7 +1763,7 @@ void __evas_gl_rectangle_draw(Display *disp, Window win,
/* line externals ************************************************************/
/*****************************************************************************/
void __evas_gl_line_draw(Display *disp, Window win,
void __evas_gl_line_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h,
int x1, int y1, int x2, int y2,
int r, int g, int b, int a)
@ -2047,7 +2047,7 @@ __evas_gl_gradient_color_add(Evas_GL_Graident *gr, int r, int g, int b,
void
__evas_gl_gradient_draw(Evas_GL_Graident *gr,
Display *disp, Window win, int win_w, int win_h,
Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h,
int x, int y, int w, int h, double angle)
{
int i;
@ -2152,7 +2152,7 @@ __evas_gl_sync(Display *disp)
}
void
__evas_gl_flush_draw(Display *disp, Window win)
__evas_gl_flush_draw(Display *disp, Imlib_Image dstim, Window win)
{
if ((__evas_current_win != win) || (__evas_current_disp != disp))
{
@ -2226,7 +2226,7 @@ __evas_gl_init(Display *disp, int screen)
}
void
__evas_gl_draw_add_rect(Display *disp, Window win,
__evas_gl_draw_add_rect(Display *disp, Imlib_Image dstim, Window win,
int x, int y, int w, int h)
{
return;
@ -2246,7 +2246,7 @@ int __evas_gl_image_get_width(Evas_GL_Image *im){return 0;}
int __evas_gl_image_get_height(Evas_GL_Image *im){return 0;}
void __evas_gl_image_set_borders(Evas_GL_Image *im, int left, int right, int top, int bottom){}
void __evas_gl_image_set_smooth_scaling(int on){}
void __evas_gl_image_draw(Evas_GL_Image *im, Display *disp, Window w, int win_w, int win_h, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h){}
void __evas_gl_image_draw(Evas_GL_Image *im, Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h){}
/********/
/* text */
@ -2262,17 +2262,17 @@ int __evas_gl_text_cache_get_size(Display *disp){return 0;}
void __evas_gl_text_get_size(Evas_GL_Font *fn, char *text, int *w, int *h){}
int __evas_gl_text_get_character_at_pos(Evas_GL_Font *fn, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch){return 0;}
void __evas_gl_text_get_character_number(Evas_GL_Font *fn, char *text, int num, int *cx, int *cy, int *cw, int *ch){}
void __evas_gl_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 __evas_gl_text_draw(Evas_GL_Font *fn, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, char *text, int r, int g, int b, int a){}
/**************/
/* rectangles */
/**************/
void __evas_gl_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 __evas_gl_rectangle_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, int r, int g, int b, int a){}
/*********/
/* lines */
/*********/
void __evas_gl_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 __evas_gl_line_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x1, int y1, int x2, int y2, int r, int g, int b, int a){}
/*************/
/* gradients */
@ -2280,18 +2280,18 @@ void __evas_gl_line_draw(Display *disp, Window win, int win_w, int win
Evas_GL_Graident *__evas_gl_gradient_new(Display *disp){return NULL;}
void __evas_gl_gradient_free(Evas_GL_Graident *gr){}
void __evas_gl_gradient_color_add(Evas_GL_Graident *gr, int r, int g, int b, int a, int dist){}
void __evas_gl_gradient_draw(Evas_GL_Graident *gr, Display *disp, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle){}
void __evas_gl_gradient_draw(Evas_GL_Graident *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle){}
/***********/
/* drawing */
/***********/
void __evas_gl_init(Display *disp, int screen){}
int __evas_gl_capable(Display *disp){return 0;}
void __evas_gl_flush_draw(Display *disp, Window win){}
void __evas_gl_flush_draw(Display *disp, Imlib_Image dstim, Window win){}
void __evas_gl_sync(Display *disp){}
Visual *__evas_gl_get_visual(Display *disp, int screen){return NULL;}
XVisualInfo *__evas_gl_get_visual_info(Display *disp, int screen){return NULL;}
Colormap __evas_gl_get_colormap(Display *disp, int screen){return 0;}
void __evas_gl_draw_add_rect(Display *disp, Window win, int x, int y, int w, int h){}
void __evas_gl_draw_add_rect(Display *disp, Imlib_Image dstim, Window win, int x, int y, int w, int h){}
#endif

@ -151,7 +151,7 @@ int __evas_gl_image_get_width(Evas_GL_Image *im);
int __evas_gl_image_get_height(Evas_GL_Image *im);
void __evas_gl_image_set_borders(Evas_GL_Image *im, int left, int right, int top, int bottom);
void __evas_gl_image_set_smooth_scaling(int on);
void __evas_gl_image_draw(Evas_GL_Image *im, Display *disp, Window w, int win_w, int win_h, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h);
void __evas_gl_image_draw(Evas_GL_Image *im, Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h);
/********/
/* text */
@ -173,17 +173,17 @@ int __evas_gl_text_cache_get_size(Display *disp);
void __evas_gl_text_get_size(Evas_GL_Font *fn, char *text, int *w, int *h);
int __evas_gl_text_get_character_at_pos(Evas_GL_Font *fn, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
void __evas_gl_text_get_character_number(Evas_GL_Font *fn, char *text, int num, int *cx, int *cy, int *cw, int *ch);
void __evas_gl_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 __evas_gl_text_draw(Evas_GL_Font *fn, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, char *text, int r, int g, int b, int a);
/**************/
/* rectangles */
/**************/
void __evas_gl_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 __evas_gl_rectangle_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, int r, int g, int b, int a);
/*********/
/* lines */
/*********/
void __evas_gl_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 __evas_gl_line_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x1, int y1, int x2, int y2, int r, int g, int b, int a);
/*************/
/* gradients */
@ -191,16 +191,16 @@ void __evas_gl_line_draw(Display *disp, Window win, int win_w, int win
Evas_GL_Graident *__evas_gl_gradient_new(Display *disp);
void __evas_gl_gradient_free(Evas_GL_Graident *gr);
void __evas_gl_gradient_color_add(Evas_GL_Graident *gr, int r, int g, int b, int a, int dist);
void __evas_gl_gradient_draw(Evas_GL_Graident *gr, Display *disp, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle);
void __evas_gl_gradient_draw(Evas_GL_Graident *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle);
/***********/
/* drawing */
/***********/
void __evas_gl_init(Display *disp, int screen);
int __evas_gl_capable(Display *disp);
void __evas_gl_flush_draw(Display *disp, Window win);
void __evas_gl_flush_draw(Display *disp, Imlib_Image dstim, Window win);
void __evas_gl_sync(Display *disp);
Visual *__evas_gl_get_visual(Display *disp, int screen);
XVisualInfo *__evas_gl_get_visual_info(Display *disp, int screen);
Colormap __evas_gl_get_colormap(Display *disp, int screen);
void __evas_gl_draw_add_rect(Display *disp, Window win, int x, int y, int w, int h);
void __evas_gl_draw_add_rect(Display *disp, Imlib_Image dstim, Window win, int x, int y, int w, int h);

@ -5,6 +5,7 @@
#include <string.h>
#include "evas_gl_routines.h"
#include "evas_imlib_routines.h"
#include "evas_image_routines.h"
static void
_evas_free_gradient_box(Evas_Object o)
@ -36,6 +37,10 @@ _evas_free_gradient_box_renderer_data(Evas e, Evas_Object o)
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
case RENDER_METHOD_IMAGE:
if (o->renderer_data.method[e->current.render_method])
__evas_image_gradient_free(o->renderer_data.method[e->current.render_method]);
break;
default:
break;
}
@ -133,6 +138,25 @@ evas_set_gradient(Evas e, Evas_Object o, Evas_Gradient grad)
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
case RENDER_METHOD_IMAGE:
if (o->renderer_data.method[e->current.render_method])
__evas_image_gradient_free(o->renderer_data.method[e->current.render_method]);
{
Evas_Image_Graident *g;
Evas_List l;
g = __evas_image_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_image_gradient_color_add(g, col->r, col->g, col->b,
col->a, col->distance);
}
}
break;
default:
break;
}

@ -27,6 +27,8 @@ _evas_free_image_renderer_data(Evas e, Evas_Object o)
break;
case RENDER_METHOD_ALPHA_HARDWARE:
break;
case RENDER_METHOD_IMAGE:
break;
default:
break;
}

@ -0,0 +1,825 @@
#include "evas_image_routines.h"
static void __evas_image_image_cache_flush(Display *disp);
static int __evas_anti_alias = 1;
static Evas_List drawable_list = NULL;
/*****************************************************************************/
/* image internals ***********************************************************/
/*****************************************************************************/
static void
__evas_image_image_cache_flush(Display *disp)
{
int size;
size = imlib_get_cache_size();
imlib_set_cache_size(0);
imlib_set_cache_size(size);
}
/*****************************************************************************/
/* image externals ***********************************************************/
/*****************************************************************************/
Evas_Image_Image *
__evas_image_image_new_from_file(Display *disp, char *file)
{
return (Evas_Image_Image *)imlib_load_image(file);
}
void
__evas_image_image_free(Evas_Image_Image *im)
{
imlib_context_set_image((Imlib_Image)im);
imlib_free_image();
}
void
__evas_image_image_cache_empty(Display *disp)
{
int size;
size = imlib_get_cache_size();
imlib_set_cache_size(0);
imlib_set_cache_size(size);
}
void
__evas_image_image_cache_set_size(Display *disp, int size)
{
imlib_set_cache_size(size);
}
int
__evas_image_image_cache_get_size(Display *disp)
{
return imlib_get_cache_size();
}
void
__evas_image_image_draw(Evas_Image_Image *im,
Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h,
int src_x, int src_y, int src_w, int src_h,
int dst_x, int dst_y, int dst_w, int dst_h)
{
Evas_List l;
imlib_context_set_angle(0.0);
imlib_context_set_blend(1);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(__evas_anti_alias);
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
/* if image intersects image update - render */
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
dst_x, dst_y, dst_w, dst_h))
{
if (!up->image)
{
DATA32 *data;
up->image = imlib_create_image(up->w, up->h);
if (up->image)
{
imlib_context_set_image(up->image);
data = imlib_image_get_data();
memset(data, 0, up->w * up->h * sizeof(DATA32));
imlib_image_put_back_data(data);
imlib_image_set_has_alpha(1);
}
}
if (up->image)
{
imlib_context_set_image(up->image);
imlib_blend_image_onto_image(im, 1,
src_x, src_y, src_w, src_h,
dst_x - up->x, dst_y - up->y, dst_w, dst_h);
}
}
}
}
}
}
int
__evas_image_image_get_width(Evas_Image_Image *im)
{
imlib_context_set_image((Imlib_Image)im);
return imlib_image_get_width();
}
int
__evas_image_image_get_height(Evas_Image_Image *im)
{
imlib_context_set_image((Imlib_Image)im);
return imlib_image_get_height();
}
void
__evas_image_image_set_borders(Evas_Image_Image *im, int left, int right,
int top, int bottom)
{
Imlib_Border bd;
imlib_context_set_image((Imlib_Image)im);
bd.left = left;
bd.right = right;
bd.top = top;
bd.bottom = bottom;
imlib_image_set_border(&bd);
}
void
__evas_image_image_set_smooth_scaling(int on)
{
__evas_anti_alias = on;
}
/*****************************************************************************/
/* font internals ************************************************************/
/*****************************************************************************/
/*****************************************************************************/
/* font externals ************************************************************/
/*****************************************************************************/
Evas_Image_Font *
__evas_image_text_font_new(Display *disp, char *font, int size)
{
char buf[4096];
sprintf(buf, "%s/%i", font, size);
return (Evas_Image_Font *)imlib_load_font(buf);
}
void
__evas_image_text_font_free(Evas_Image_Font *fn)
{
imlib_context_set_font((Imlib_Font)fn);
imlib_free_font();
}
int
__evas_image_text_font_get_ascent(Evas_Image_Font *fn)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_get_font_ascent();
}
int
__evas_image_text_font_get_descent(Evas_Image_Font *fn)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_get_font_descent();
}
int
__evas_image_text_font_get_max_ascent(Evas_Image_Font *fn)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_get_maximum_font_ascent();
}
int
__evas_image_text_font_get_max_descent(Evas_Image_Font *fn)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_get_maximum_font_descent();
}
void
__evas_image_text_font_get_advances(Evas_Image_Font *fn, char *text,
int *advance_horiz,
int *advance_vert)
{
imlib_context_set_font((Imlib_Font)fn);
imlib_get_text_advance(text, advance_horiz, advance_vert);
}
int
__evas_image_text_font_get_first_inset(Evas_Image_Font *fn, char *text)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_get_text_inset(text);
}
void
__evas_image_text_font_add_path(char *path)
{
imlib_add_path_to_font_path(path);
}
void
__evas_image_text_font_del_path(char *path)
{
imlib_remove_path_from_font_path(path);
}
char **
__evas_image_text_font_list_paths(int *count)
{
return imlib_list_font_path(count);
}
void
__evas_image_text_cache_empty(Display *disp)
{
int size;
size = imlib_get_font_cache_size();
imlib_set_font_cache_size(0);
imlib_set_font_cache_size(size);
}
void
__evas_image_text_cache_set_size(Display *disp, int size)
{
imlib_set_font_cache_size(size);
}
int
__evas_image_text_cache_get_size(Display *disp)
{
return imlib_get_font_cache_size();
}
void
__evas_image_text_draw(Evas_Image_Font *fn, Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int x, int y, char *text,
int r, int g, int b, int a)
{
Evas_List l;
int w, h;
if ((!fn) || (!text)) return;
imlib_context_set_color(r, g, b, a);
imlib_context_set_font((Imlib_Font)fn);
imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(1);
imlib_context_set_blend(1);
imlib_get_text_size(text, &w, &h);
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
/* if image intersects image update - render */
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h))
{
if (!up->image)
{
DATA32 *data;
up->image = imlib_create_image(up->w, up->h);
if (up->image)
{
imlib_context_set_image(up->image);
data = imlib_image_get_data();
memset(data, 0, up->w * up->h * sizeof(DATA32));
imlib_image_put_back_data(data);
imlib_image_set_has_alpha(1);
}
}
imlib_context_set_image(up->image);
imlib_text_draw(x - up->x, y - up->y, text);
}
}
}
}
}
void
__evas_image_text_get_size(Evas_Image_Font *fn, char *text, int *w, int *h)
{
if ((!fn) || (!text))
{
*w = 0; *h = 0;
return;
}
imlib_context_set_font((Imlib_Font)fn);
imlib_get_text_size(text, w, h);
}
int
__evas_image_text_get_character_at_pos(Evas_Image_Font *fn, char *text,
int x, int y,
int *cx, int *cy, int *cw, int *ch)
{
imlib_context_set_font((Imlib_Font)fn);
return imlib_text_get_index_and_location(text, x, y, cx, cy, cw, ch);
}
void
__evas_image_text_get_character_number(Evas_Image_Font *fn, char *text,
int num,
int *cx, int *cy, int *cw, int *ch)
{
imlib_context_set_font((Imlib_Font)fn);
imlib_text_get_location_at_index(text, num, cx, cy, cw, ch);
}
/*****************************************************************************/
/* rectangle externals *******************************************************/
/*****************************************************************************/
void __evas_image_rectangle_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h,
int x, int y, int w, int h,
int r, int g, int b, int a)
{
Evas_List l;
imlib_context_set_color(r, g, b, a);
imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(__evas_anti_alias);
imlib_context_set_blend(1);
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
/* if image intersects image update - render */
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h))
{
if (!up->image)
{
DATA32 *data;
up->image = imlib_create_image(up->w, up->h);
if (up->image)
{
imlib_context_set_image(up->image);
data = imlib_image_get_data();
memset(data, 0, up->w * up->h * sizeof(DATA32));
imlib_image_put_back_data(data);
imlib_image_set_has_alpha(1);
}
}
if (up->image)
{
imlib_context_set_image(up->image);
imlib_image_fill_rectangle(x - up->x, y - up->y, w, h);
}
}
}
}
}
}
/*****************************************************************************/
/* rectangle externals *******************************************************/
/*****************************************************************************/
void __evas_image_line_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h,
int x1, int y1, int x2, int y2,
int r, int g, int b, int a)
{
Evas_List l;
int x, y, w, h;
imlib_context_set_color(r, g, b, a);
imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(1);
imlib_context_set_blend(1);
w = x2 - x1;
if (w < 0) w = -w;
h = y2 - y1;
if (h < 0) h = -h;
if (x1 < x2) x = x1;
else x = x2;
if (y1 < y2) y = y1;
else y = y2;
w++; h++;
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
/* if image intersects image update - render */
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h))
{
if (!up->image)
{
DATA32 *data;
up->image = imlib_create_image(up->w, up->h);
if (up->image)
{
imlib_context_set_image(up->image);
data = imlib_image_get_data();
memset(data, 0, up->w * up->h * sizeof(DATA32));
imlib_image_put_back_data(data);
imlib_image_set_has_alpha(1);
}
}
if (up->image)
{
imlib_context_set_image(up->image);
imlib_image_draw_line(x1 - up->x, y1 - up->y, x2 - up->x, y2 - up->y, 0);
}
}
}
}
}
}
/*****************************************************************************/
/* gradient externals ********************************************************/
/*****************************************************************************/
Evas_Image_Graident *
__evas_image_gradient_new(Display *disp)
{
return (Evas_Image_Graident *)imlib_create_color_range();
}
void
__evas_image_gradient_free(Evas_Image_Graident *gr)
{
imlib_context_set_color_range((Imlib_Color_Range)gr);
imlib_free_color_range();
}
void
__evas_image_gradient_color_add(Evas_Image_Graident *gr, int r, int g, int b, int a, int dist)
{
imlib_context_set_color_range((Imlib_Color_Range)gr);
imlib_context_set_color(r, g, b, a);
imlib_add_color_to_color_range(dist);
}
void
__evas_image_gradient_draw(Evas_Image_Graident *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle)
{
Evas_List l;
imlib_context_set_angle(angle);
imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_color_range((Imlib_Color_Range)gr);
imlib_context_set_anti_alias(1);
imlib_context_set_blend(1);
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
/* if image intersects image update - render */
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h))
{
if (!up->image)
{
DATA32 *data;
up->image = imlib_create_image(up->w, up->h);
if (up->image)
{
imlib_context_set_image(up->image);
data = imlib_image_get_data();
memset(data, 0, up->w * up->h * sizeof(DATA32));
imlib_image_put_back_data(data);
imlib_image_set_has_alpha(1);
}
}
if (up->image)
{
imlib_context_set_image(up->image);
imlib_image_fill_color_range_rectangle(x - up->x, y - up->y, w, h, angle);
}
}
}
}
}
}
/*****************************************************************************/
/* general externals *********************************************************/
/*****************************************************************************/
static Visual *__evas_visual;
static Colormap __evas_cmap;
void
__evas_image_sync(Display *disp)
{
XSync(disp, False);
}
void
__evas_image_flush_draw(Display *disp, Imlib_Image dstim, Window win)
{
Evas_List l;
imlib_context_set_display(disp);
imlib_context_set_visual(__evas_visual);
imlib_context_set_colormap(__evas_cmap);
imlib_context_set_drawable(win);
imlib_context_set_dither(1);
imlib_context_set_blend(1);
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_List ll;
for (ll = dr->tmp_images; ll; ll = ll->next)
{
Evas_Image_Update *up;
up = ll->data;
if (up->image)
{
int w, h;
imlib_context_set_image(dr->im);
imlib_blend_image_onto_image(up->image, 1,
0, 0, w, h,
up->x, up->y, w, h);
imlib_context_set_image(up->image);
imlib_free_image();
}
free(up);
}
if (dr->tmp_images)
dr->tmp_images = evas_list_free(dr->tmp_images);
}
free(dr);
}
if (drawable_list)
drawable_list = evas_list_free(drawable_list);
drawable_list = NULL;
}
int
__evas_image_capable(Display *disp)
{
return 1;
}
Visual *
__evas_image_get_visual(Display *disp, int screen)
{
int depth;
__evas_visual = imlib_get_best_visual(disp, screen, &depth);
return __evas_visual;
}
XVisualInfo *
__evas_image_get_visual_info(Display *disp, int screen)
{
static XVisualInfo *vi = NULL;
XVisualInfo vi_template;
int n;
if (vi) return vi;
vi_template.visualid = (__evas_image_get_visual(disp, screen))->visualid;
vi_template.screen = screen;
vi = XGetVisualInfo(disp, VisualIDMask | VisualScreenMask, &vi_template ,&n);
return vi;
}
Colormap
__evas_image_get_colormap(Display *disp, int screen)
{
__evas_cmap = DefaultColormap(disp, screen);
return __evas_cmap;
}
void
__evas_image_init(Display *disp, int screen)
{
imlib_set_font_cache_size(1024 * 1024);
imlib_set_cache_size(8 * 1024 * 1024);
imlib_set_color_usage(128);
__evas_image_get_visual(disp, screen);
__evas_image_get_visual(disp, screen);
__evas_image_get_colormap(disp, screen);
}
void
__evas_image_draw_add_rect(Display *disp, Imlib_Image dstim, Window win,
int x, int y, int w, int h)
{
Evas_List l;
for(l = drawable_list; l; l = l->next)
{
Evas_Image_Drawable *dr;
dr = l->data;
if ((dr->im == dstim) && (dr->disp == disp))
{
Evas_Image_Update *up;
up = malloc(sizeof(Evas_Image_Update));
up->x = x;
up->y = y;
up->w = w;
up->h = h;
up->image = NULL;
dr->tmp_images = evas_list_append(dr->tmp_images, up);
}
return;
}
{
Evas_Image_Drawable *dr;
Evas_Image_Update *up;
dr = malloc(sizeof(Evas_Image_Drawable));
dr->im = dstim;
dr->disp = disp;
dr->tmp_images = NULL;
up = malloc(sizeof(Evas_Image_Update));
up->x = x;
up->y = y;
up->w = w;
up->h = h;
up->image = NULL;
drawable_list = evas_list_append(drawable_list, dr);
dr->tmp_images = evas_list_append(dr->tmp_images, up);
}
}

@ -0,0 +1,111 @@
#include "config.h"
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sys/time.h>
#include <unistd.h>
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <X11/Xutil.h>
#include "Evas.h"
#include <Imlib2.h>
#define SPANS_COMMON(x1, w1, x2, w2) \
(!((((x2) + (w2)) <= (x1)) || ((x2) >= ((x1) + (w1)))))
#define RECTS_INTERSECT(x, y, w, h, xx, yy, ww, hh) \
((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh))))
typedef void Evas_Image_Image;
typedef void Evas_Image_Font;
typedef void Evas_Image_Graident;
typedef struct _evas_image_drawable Evas_Image_Drawable;
typedef struct _evas_image_update Evas_Image_Update;
struct _evas_image_drawable
{
Display *disp;
Imlib_Image im;
Evas_List tmp_images;
};
struct _evas_image_update
{
Imlib_Image image;
int x, y, w, h;
};
/***************/
/* image stuff */
/***************/
Evas_Image_Image *__evas_image_image_new_from_file(Display *disp, char *file);
void __evas_image_image_free(Evas_Image_Image *im);
void __evas_image_image_cache_empty(Display *disp);
void __evas_image_image_cache_set_size(Display *disp, int size);
int __evas_image_image_cache_get_size(Display *disp);
int __evas_image_image_get_width(Evas_Image_Image *im);
int __evas_image_image_get_height(Evas_Image_Image *im);
void __evas_image_image_set_borders(Evas_Image_Image *im, int left, int right, int top, int bottom);
void __evas_image_image_set_smooth_scaling(int on);
void __evas_image_image_draw(Evas_Image_Image *im, Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h, int src_x, int src_y, int src_w, int src_h, int dst_x, int dst_y, int dst_w, int dst_h);
/********/
/* text */
/********/
Evas_Image_Font *__evas_image_text_font_new(Display *disp, char *font, int size);
void __evas_image_text_font_free(Evas_Image_Font *fn);
int __evas_image_text_font_get_ascent(Evas_Image_Font *fn);
int __evas_image_text_font_get_descent(Evas_Image_Font *fn);
int __evas_image_text_font_get_max_ascent(Evas_Image_Font *fn);
int __evas_image_text_font_get_max_descent(Evas_Image_Font *fn);
void __evas_image_text_font_get_advances(Evas_Image_Font *fn, char *text, int *advance_horiz, int *advance_vert);
int __evas_image_text_font_get_first_inset(Evas_Image_Font *fn, char *text);
void __evas_image_text_font_add_path(char *path);
void __evas_image_text_font_del_path(char *path);
char **__evas_image_text_font_list_paths(int *count);
void __evas_image_text_cache_empty(Display *disp);
void __evas_image_text_cache_set_size(Display *disp, int size);
int __evas_image_text_cache_get_size(Display *disp);
void __evas_image_text_get_size(Evas_Image_Font *fn, char *text, int *w, int *h);
int __evas_image_text_get_character_at_pos(Evas_Image_Font *fn, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch);
void __evas_image_text_get_character_number(Evas_Image_Font *fn, char *text, int num, int *cx, int *cy, int *cw, int *ch);
void __evas_image_text_draw(Evas_Image_Font *fn, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, char *text, int r, int g, int b, int a);
/**************/
/* rectangles */
/**************/
void __evas_image_rectangle_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, int r, int g, int b, int a);
/*********/
/* lines */
/*********/
void __evas_image_line_draw(Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x1, int y1, int x2, int y2, int r, int g, int b, int a);
/*************/
/* gradients */
/*************/
Evas_Image_Graident *__evas_image_gradient_new(Display *disp);
void __evas_image_gradient_free(Evas_Image_Graident *gr);
void __evas_image_gradient_color_add(Evas_Image_Graident *gr, int r, int g, int b, int a, int dist);
void __evas_image_gradient_draw(Evas_Image_Graident *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle);
/***********/
/* drawing */
/***********/
void __evas_image_init(Display *disp, int screen);
int __evas_image_capable(Display *disp);
void __evas_image_flush_draw(Display *disp, Imlib_Image dstim, Window win);
void __evas_image_sync(Display *disp);
Visual *__evas_image_get_visual(Display *disp, int screen);
XVisualInfo *__evas_image_get_visual_info(Display *disp, int screen);
Colormap __evas_image_get_colormap(Display *disp, int screen);
void __evas_image_draw_add_rect(Display *disp, Imlib_Image dstim, Window win, int x, int y, int w, int h);

@ -59,7 +59,7 @@ __evas_imlib_image_cache_get_size(Display *disp)
void
__evas_imlib_image_draw(Evas_Imlib_Image *im,
Display *disp, Window w, int win_w, int win_h,
Display *disp, Imlib_Image dstim, Window w, int win_w, int win_h,
int src_x, int src_y, int src_w, int src_h,
int dst_x, int dst_y, int dst_w, int dst_h)
{
@ -70,6 +70,7 @@ __evas_imlib_image_draw(Evas_Imlib_Image *im,
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(__evas_anti_alias);
imlib_context_set_blend(1);
for(l = drawable_list; l; l = l->next)
{
Evas_Imlib_Drawable *dr;
@ -271,7 +272,7 @@ __evas_imlib_text_cache_get_size(Display *disp)
}
void
__evas_imlib_text_draw(Evas_Imlib_Font *fn, Display *disp, Window win,
__evas_imlib_text_draw(Evas_Imlib_Font *fn, Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int x, int y, char *text,
int r, int g, int b, int a)
{
@ -286,6 +287,7 @@ __evas_imlib_text_draw(Evas_Imlib_Font *fn, Display *disp, Window win,
imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT);
imlib_context_set_anti_alias(1);
imlib_context_set_blend(1);
imlib_get_text_size(text, &w, &h);
for(l = drawable_list; l; l = l->next)
{
@ -375,7 +377,7 @@ __evas_imlib_text_get_character_number(Evas_Imlib_Font *fn, char *text,
/* rectangle externals *******************************************************/
/*****************************************************************************/
void __evas_imlib_rectangle_draw(Display *disp, Window win,
void __evas_imlib_rectangle_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h,