788 lines
17 KiB
C
788 lines
17 KiB
C
#include "evas_render_routines.h"
|
|
|
|
|
|
#ifdef HAVE_RENDER
|
|
|
|
static void __evas_render_image_cache_flush(Display *disp);
|
|
static int __evas_anti_alias = 1;
|
|
static Evas_List drawable_list = NULL;
|
|
|
|
/*****************************************************************************/
|
|
/* image internals ***********************************************************/
|
|
/*****************************************************************************/
|
|
|
|
static void
|
|
__evas_render_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_Render_Image *
|
|
__evas_render_image_new_from_file(Display *disp, char *file)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
__evas_render_image_free(Evas_Render_Image *im)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_image_cache_empty(Display *disp)
|
|
{
|
|
int size;
|
|
|
|
size = imlib_get_cache_size();
|
|
imlib_set_cache_size(0);
|
|
imlib_set_cache_size(size);
|
|
}
|
|
|
|
void
|
|
__evas_render_image_cache_set_size(Display *disp, int size)
|
|
{
|
|
imlib_set_cache_size(size);
|
|
}
|
|
|
|
int
|
|
__evas_render_image_cache_get_size(Display *disp)
|
|
{
|
|
return imlib_get_cache_size();
|
|
}
|
|
|
|
void
|
|
__evas_render_image_draw(Evas_Render_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,
|
|
int cr, int cg, int cb, int ca)
|
|
{
|
|
Evas_List l;
|
|
|
|
if (ca == 0) return;
|
|
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == w) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int
|
|
__evas_render_image_get_width(Evas_Render_Image *im)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
__evas_render_image_get_height(Evas_Render_Image *im)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
__evas_render_image_set_borders(Evas_Render_Image *im, int left, int right,
|
|
int top, int bottom)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_image_set_smooth_scaling(int on)
|
|
{
|
|
__evas_anti_alias = on;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* font internals ************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* font externals ************************************************************/
|
|
/*****************************************************************************/
|
|
|
|
Evas_Render_Font *
|
|
__evas_render_text_font_new(Display *disp, char *font, int size)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_font_free(Evas_Render_Font *fn)
|
|
{
|
|
}
|
|
|
|
int
|
|
__evas_render_text_font_get_ascent(Evas_Render_Font *fn)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
__evas_render_text_font_get_descent(Evas_Render_Font *fn)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
__evas_render_text_font_get_max_ascent(Evas_Render_Font *fn)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int
|
|
__evas_render_text_font_get_max_descent(Evas_Render_Font *fn)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_font_get_advances(Evas_Render_Font *fn, char *text,
|
|
int *advance_horiz,
|
|
int *advance_vert)
|
|
{
|
|
}
|
|
|
|
int
|
|
__evas_render_text_font_get_first_inset(Evas_Render_Font *fn, char *text)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_font_add_path(char *path)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_text_font_del_path(char *path)
|
|
{
|
|
}
|
|
|
|
char **
|
|
__evas_render_text_font_list_paths(int *count)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_cache_empty(Display *disp)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_text_cache_set_size(Display *disp, int size)
|
|
{
|
|
}
|
|
|
|
int
|
|
__evas_render_text_cache_get_size(Display *disp)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_draw(Evas_Render_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;
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void
|
|
__evas_render_text_get_size(Evas_Render_Font *fn, char *text, int *w, int *h)
|
|
{
|
|
if ((!fn) || (!text))
|
|
{
|
|
*w = 0; *h = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
int
|
|
__evas_render_text_get_character_at_pos(Evas_Render_Font *fn, char *text,
|
|
int x, int y,
|
|
int *cx, int *cy, int *cw, int *ch)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
void
|
|
__evas_render_text_get_character_number(Evas_Render_Font *fn, char *text,
|
|
int num,
|
|
int *cx, int *cy, int *cw, int *ch)
|
|
{
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* rectangle externals *******************************************************/
|
|
/*****************************************************************************/
|
|
|
|
void __evas_render_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;
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* rectangle externals *******************************************************/
|
|
/*****************************************************************************/
|
|
|
|
void __evas_render_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;
|
|
|
|
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_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************************/
|
|
/* gradient externals ********************************************************/
|
|
/*****************************************************************************/
|
|
|
|
|
|
Evas_Render_Graident *
|
|
__evas_render_gradient_new(Display *disp)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
void
|
|
__evas_render_gradient_free(Evas_Render_Graident *gr)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_gradient_color_add(Evas_Render_Graident *gr, int r, int g, int b, int a, int dist)
|
|
{
|
|
}
|
|
|
|
void
|
|
__evas_render_gradient_draw(Evas_Render_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;
|
|
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/************/
|
|
/* polygons */
|
|
/************/
|
|
void
|
|
__evas_render_poly_draw (Display *disp, Imlib_Image dstim, Window win,
|
|
int win_w, int win_h,
|
|
Evas_List points,
|
|
int r, int g, int b, int a)
|
|
{
|
|
Evas_List l, l2;
|
|
int x, y, w, h;
|
|
|
|
x = y = w = h = 0;
|
|
if (points)
|
|
{
|
|
Evas_Point p;
|
|
|
|
p = points->data;
|
|
x = p->x;
|
|
y = p->y;
|
|
w = 1;
|
|
h = 1;
|
|
}
|
|
for (l2 = points; l2; l2 = l2->next)
|
|
{
|
|
Evas_Point p;
|
|
|
|
p = l2->data;
|
|
if (p->x < x)
|
|
{
|
|
w += x - p->x;
|
|
x = p->x;
|
|
}
|
|
if (p->x > (x + w))
|
|
w = p->x - x;
|
|
if (p->y < y)
|
|
{
|
|
h += y - p->y;
|
|
y = p->y;
|
|
}
|
|
if (p->y > (y + h))
|
|
h = p->y - y;
|
|
}
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_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))
|
|
{
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
/* general externals *********************************************************/
|
|
/*****************************************************************************/
|
|
|
|
static Visual *__evas_visual = NULL;
|
|
static Colormap __evas_cmap = 0;
|
|
|
|
void
|
|
__evas_render_sync(Display *disp)
|
|
{
|
|
XSync(disp, False);
|
|
}
|
|
|
|
void
|
|
__evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win)
|
|
{
|
|
Evas_List l;
|
|
|
|
for(l = drawable_list; l; l = l->next)
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_List ll;
|
|
|
|
for (ll = dr->tmp_images; ll; ll = ll->next)
|
|
{
|
|
Evas_Render_Update *up;
|
|
|
|
up = ll->data;
|
|
|
|
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_render_capable(Display *disp)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
Visual *
|
|
__evas_render_get_visual(Display *disp, int screen)
|
|
{
|
|
int depth;
|
|
|
|
__evas_visual = imlib_get_best_visual(disp, screen, &depth);
|
|
return __evas_visual;
|
|
}
|
|
|
|
XVisualInfo *
|
|
__evas_render_get_visual_info(Display *disp, int screen)
|
|
{
|
|
static XVisualInfo *vi = NULL;
|
|
XVisualInfo vi_template;
|
|
int n;
|
|
|
|
if (vi) return vi;
|
|
vi_template.visualid = (__evas_render_get_visual(disp, screen))->visualid;
|
|
vi_template.screen = screen;
|
|
vi = XGetVisualInfo(disp, VisualIDMask | VisualScreenMask, &vi_template ,&n);
|
|
return vi;
|
|
}
|
|
|
|
Colormap
|
|
__evas_render_get_colormap(Display *disp, int screen)
|
|
{
|
|
Visual *v;
|
|
|
|
if (__evas_cmap) return __evas_cmap;
|
|
v = __evas_render_get_visual(disp, screen);
|
|
__evas_cmap = DefaultColormap(disp, screen);
|
|
return __evas_cmap;
|
|
__evas_cmap = XCreateColormap(disp, RootWindow(disp, screen), v, AllocNone);
|
|
return __evas_cmap;
|
|
}
|
|
|
|
void
|
|
__evas_render_init(Display *disp, int screen, int colors)
|
|
{
|
|
static int initted = 0;
|
|
|
|
if (!initted)
|
|
{
|
|
initted = 1;
|
|
}
|
|
}
|
|
|
|
void
|
|
__evas_render_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_Render_Drawable *dr;
|
|
|
|
dr = l->data;
|
|
|
|
if ((dr->win == win) && (dr->disp == disp))
|
|
{
|
|
Evas_Render_Update *up;
|
|
|
|
up = malloc(sizeof(Evas_Render_Update));
|
|
up->x = x;
|
|
up->y = y;
|
|
up->w = w;
|
|
up->h = h;
|
|
dr->tmp_images = evas_list_append(dr->tmp_images, up);
|
|
}
|
|
return;
|
|
}
|
|
{
|
|
Evas_Render_Drawable *dr;
|
|
Evas_Render_Update *up;
|
|
|
|
dr = malloc(sizeof(Evas_Render_Drawable));
|
|
dr->win = win;
|
|
dr->disp = disp;
|
|
dr->tmp_images = NULL;
|
|
up = malloc(sizeof(Evas_Render_Update));
|
|
up->x = x;
|
|
up->y = y;
|
|
up->w = w;
|
|
up->h = h;
|
|
drawable_list = evas_list_append(drawable_list, dr);
|
|
dr->tmp_images = evas_list_append(dr->tmp_images, up);
|
|
}
|
|
}
|
|
|
|
#else
|
|
|
|
/***************/
|
|
/* image stuff */
|
|
/***************/
|
|
Evas_Render_Image *__evas_render_image_new_from_file(Display *disp, char *file){return NULL;}
|
|
void __evas_render_image_free(Evas_Render_Image *im){}
|
|
void __evas_render_image_cache_empty(Display *disp){}
|
|
void __evas_render_image_cache_set_size(Display *disp, int size){}
|
|
int __evas_render_image_cache_get_size(Display *disp){return 0;}
|
|
int __evas_render_image_get_width(Evas_Render_Image *im){return 0;}
|
|
int __evas_render_image_get_height(Evas_Render_Image *im){return 0;}
|
|
void __evas_render_image_set_borders(Evas_Render_Image *im, int left, int right, int top, int bottom){}
|
|
void __evas_render_image_set_smooth_scaling(int on){}
|
|
void __evas_render_image_draw(Evas_Render_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, int cr, int cg, int cb, int ca){}
|
|
|
|
/********/
|
|
/* text */
|
|
/********/
|
|
Evas_Render_Font *__evas_render_text_font_new(Display *disp, char *font, int size){return NULL;}
|
|
void __evas_render_text_font_free(Evas_Render_Font *fn){}
|
|
void __evas_render_text_font_add_path(char *path){}
|
|
int __evas_render_text_font_get_ascent(Evas_Render_Font *fn){return 0;}
|
|
int __evas_render_text_font_get_descent(Evas_Render_Font *fn){return 0;}
|
|
int __evas_render_text_font_get_max_ascent(Evas_Render_Font *fn){return 0;}
|
|
int __evas_render_text_font_get_max_descent(Evas_Render_Font *fn){return 0;}
|
|
void __evas_render_text_font_get_advances(Evas_Render_Font *fn, char *text, int *advance_horiz, int *advance_vert){}
|
|
int __evas_render_text_font_get_first_inset(Evas_Render_Font *fn, char *text){return 0;}
|
|
void __evas_render_text_font_del_path(char *path){}
|
|
char **__evas_render_text_font_list_paths(int *count){return NULL;}
|
|
void __evas_render_text_cache_empty(Display *disp){}
|
|
void __evas_render_text_cache_set_size(Display *disp, int size){}
|
|
int __evas_render_text_cache_get_size(Display *disp){return 0;}
|
|
void __evas_render_text_get_size(Evas_Render_Font *fn, char *text, int *w, int *h){}
|
|
int __evas_render_text_get_character_at_pos(Evas_Render_Font *fn, char *text, int x, int y, int *cx, int *cy, int *cw, int *ch){return 0;}
|
|
void __evas_render_text_get_character_number(Evas_Render_Font *fn, char *text, int num, int *cx, int *cy, int *cw, int *ch){}
|
|
void __evas_render_text_draw(Evas_Render_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_render_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_render_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_Render_Graident *__evas_render_gradient_new(Display *disp){return NULL;}
|
|
void __evas_render_gradient_free(Evas_Render_Graident *gr){}
|
|
void __evas_render_gradient_color_add(Evas_Render_Graident *gr, int r, int g, int b, int a, int dist){}
|
|
void __evas_render_gradient_draw(Evas_Render_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){}
|
|
|
|
/************/
|
|
/* polygons */
|
|
/************/
|
|
void __evas_render_poly_draw (Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, Evas_List points, int r, int g, int b, int a) {}
|
|
|
|
/***********/
|
|
/* drawing */
|
|
/***********/
|
|
void __evas_render_init(Display *disp, int screen, int colors){}
|
|
int __evas_render_capable(Display *disp){return 0;}
|
|
void __evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win){}
|
|
void __evas_render_sync(Display *disp){}
|
|
Visual *__evas_render_get_visual(Display *disp, int screen){return NULL;}
|
|
XVisualInfo *__evas_render_get_visual_info(Display *disp, int screen){return NULL;}
|
|
Colormap __evas_render_get_colormap(Display *disp, int screen){return 0;}
|
|
void __evas_render_draw_add_rect(Display *disp, Imlib_Image dstim, Window win, int x, int y, int w, int h){}
|
|
|
|
#endif
|