* rewrote GL engine for evas - vast speed improvements and cleanliness

improvements - MUCH better
* fixed imlib and x11 engines - much faster x11 engine. much better imlib
engine
* added clipping ability to evas (you can clip one object by another for now
only rectangles are supported)
* you will need to use cvs imlib2 - i fixed the clipping in it to apply to
images, text and gradients too.
* almost done with x11 engine - just fonts to go (mostly done)
* clipping rects rgba color modifies what they clip
* gl, imlib and x11 engines modified to do clipping
* still need to add border scaling supporty to gl engine
* maybe some other stuff i don't remember - i've been sick over christmas


SVN revision: 4039
This commit is contained in:
Carsten Haitzler 2000-12-27 20:51:39 +00:00
parent deb3a7cc06
commit ce2f4fe9f1
17 changed files with 3954 additions and 2661 deletions

View File

@ -99,7 +99,13 @@ 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_viewport(Evas e, double x, double y, double w, double h);
void evas_set_output_method(Evas e, Evas_Render_Method method); void evas_set_output_method(Evas e, Evas_Render_Method method);
void evas_set_scale_smoothness(Evas e, int smooth); void evas_set_scale_smoothness(Evas e, int smooth);
/* clipping - for now you can only use rectangles as clip objects */
void evas_set_clip(Evas e, Evas_Object o, Evas_Object clip);
void evas_unset_clip(Evas e, Evas_Object o);
Evas_Object evas_get_clip_object(Evas e, Evas_Object o);
Evas_List evas_get_clip_list(Evas e, Evas_Object o);
/* deleting objects */ /* deleting objects */
void evas_del_object(Evas e, Evas_Object o); void evas_del_object(Evas e, Evas_Object o);

View File

@ -34,6 +34,40 @@ typedef struct _Evas_Object_Poly * Evas_Object_Poly;
#define IF_OBJ(_o, _t) if (((Evas_Object)_o)->type != _t) #define IF_OBJ(_o, _t) if (((Evas_Object)_o)->type != _t)
#define INTERSECTS(x, y, w, h, xx, yy, ww, hh) \
((x < (xx + ww)) && \
(y < (yy + hh)) && \
((x + w) > xx) && \
((y + h) > yy))
#define CLIP_TO(_x, _y, _w, _h, _cx, _cy, _cw, _ch) \
{ \
if (INTERSECTS(_x, _y, _w, _h, _cx, _cy, _cw, _ch)) \
{ \
if (_x < _cx) \
{ \
_w += _x - _cx; \
_x = _cx; \
if (_w < 0) _w = 0; \
} \
if ((_x + _w) > (_cx + _cw)) \
_w = _cx + _cw - _x; \
if (_y < _cy) \
{ \
_h += _y - _cy; \
_y = _cy; \
if (_h < 0) _h = 0; \
} \
if ((_y + _h) > (_cy + _ch)) \
_h = _cy + _ch - _y; \
} \
else \
{ \
_w = 0; _h = 0; \
} \
}
#include "Evas.h" #include "Evas.h"
struct _Evas_Render_Data struct _Evas_Render_Data
{ {
@ -151,6 +185,12 @@ struct _Evas_Object_Any
Evas_List callbacks; Evas_List callbacks;
Evas_List data; Evas_List data;
struct {
Evas_List list;
Evas_Object object;
int changed;
} clip;
Evas_Render_Data renderer_data; Evas_Render_Data renderer_data;
char *name; char *name;

View File

@ -5,71 +5,24 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
int
_evas_point_in_object(Evas e, Evas_Object o, int x, int y)
{
int ox, oy, ow, oh;
if (o->delete_me) return 0;
_evas_object_get_current_translated_coords(e, o, &ox, &oy, &ow, &oh);
if ((x >= ox) && (x < (ox + ow)) && (y >= oy) && (y < (oy + oh)))
return 1;
return 0;
}
Evas_Object Evas_Object
_evas_highest_object_at_point(Evas e, int x, int y) _evas_highest_object_at_point(Evas e, int x, int y)
{ {
Evas_List l, ll; double cx, cy;
Evas_Layer layer;
Evas_Object o;
o = NULL; cx = evas_screen_x_to_world(e, x);
for (l = e->layers; l ; l = l->next) cy = evas_screen_x_to_world(e, y);
{ return evas_object_at_position(e, cx, cy);
layer = l->data;
for (ll = layer->objects; ll; ll = ll->next)
{
Evas_Object ob;
ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me))
{
if (_evas_point_in_object(e, ob, x, y))
{
o = ob;
}
}
}
}
return o;
} }
Evas_List Evas_List
_evas_objects_at_point(Evas e, int x, int y) _evas_objects_at_point(Evas e, int x, int y)
{ {
Evas_List l, ll, objs; double cx, cy;
Evas_Layer layer;
objs = NULL; cx = evas_screen_x_to_world(e, x);
for (l = e->layers; l ; l = l->next) cy = evas_screen_x_to_world(e, y);
{ return evas_objects_at_position(e, cx, cy);
layer = l->data;
for (ll = layer->objects; ll; ll = ll->next)
{
Evas_Object ob;
ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me))
{
if (_evas_point_in_object(e, ll->data, x, y))
objs = evas_list_prepend(objs, ll->data);
}
}
}
return objs;
} }
void void

File diff suppressed because it is too large Load Diff

View File

@ -32,112 +32,166 @@ typedef int GLuint;
#include "Evas_private.h" #include "Evas_private.h"
#include "Evas.h" #include "Evas.h"
typedef struct _evas_gl_image Evas_GL_Image; typedef struct _evas_gl_image Evas_GL_Image;
typedef struct _evas_gl_font Evas_GL_Font; typedef struct _evas_gl_font Evas_GL_Font;
typedef struct _evas_gl_glyph_info Evas_GL_Glyph_Info; typedef struct _evas_gl_gradient Evas_GL_Graident;
typedef struct _evas_gl_gradient Evas_GL_Graident;
typedef struct _evas_gl_gradient_color Evas_GL_Graident_Color;
typedef enum _evas_gl_image_state Evas_GL_Image_State;
enum _evas_gl_image_state typedef struct _evas_gl_font_texture Evas_GL_Font_Texture;
typedef struct _evas_gl_glpyh_texture Evas_GL_Glyph_Texture;
typedef struct _evas_gl_glyph Evas_GL_Glyph;
typedef struct _evas_gl_gradient_texture Evas_GL_Graident_Texture;
typedef struct _evas_gl_window Evas_GL_Window;
typedef struct _evas_gl_context Evas_GL_Context;
typedef struct _evas_gl_rect Evas_GL_Rect;
typedef struct _evas_gl_texture Evas_GL_Texture;
typedef struct _evas_gl_texmesh Evas_GL_Texmesh;
struct _evas_gl_window
{ {
EVAS_STATE_DATA, Display *disp;
EVAS_STATE_TEXTURE Window win;
Window root;
int screen;
Evas_GL_Context *context;
Evas_List updates;
int w, h;
};
struct _evas_gl_context
{
Display *disp;
int screen;
GLXContext context;
Window win;
Window root;
XVisualInfo *visualinfo;
Visual *visual;
Colormap colormap;
int dither;
int blend;
int texture;
DATA32 color;
struct {
int active;
int x, y, w, h;
} clip;
GLenum read_buf;
GLenum write_buf;
Evas_GL_Texture *bound_texture;
int max_texture_depth;
int max_texture_size;
};
struct _evas_gl_rect
{
int x, y, w, h;
};
struct _evas_gl_texture
{
int w, h;
GLuint texture;
int smooth;
};
struct _evas_gl_texmesh
{
struct {
int x, y;
int x_edge, y_edge;
int x_left, y_left;
} tiles;
Evas_GL_Texture **textures;
Evas_GL_Window *window;
Evas_GL_Context *context;
}; };
struct _evas_gl_image struct _evas_gl_image
{ {
Evas_GL_Image_State state;
int w, h;
int direct;
int bl, br, bt, bb;
int alpha;
char *file; char *file;
/* data specific params */ Imlib_Image im;
DATA32 *data; int w, h;
/* common GL params */ struct {
GLXContext context; int l, r, t, b;
/* texture state specific params */ } border;
struct int has_alpha;
{ Evas_List textures;
int max_size;
int w, h;
int edge_w, edge_h;
GLuint *textures;
} texture;
/* buffer specific params */
struct
{
Display *display;
XVisualInfo *visual_info;
Colormap colormap;
Window window, dest;
int dest_w, dest_h;
} buffer;
int references; int references;
}; };
struct _evas_gl_font struct _evas_gl_gradient_texture
{ {
char *file; Evas_GL_Window *window;
int size; Evas_GL_Context *context;
Evas_GL_Texture *texture;
TT_Engine engine;
TT_Face face;
TT_Instance instance;
TT_Face_Properties properties;
int num_glyph;
TT_Glyph *glyphs;
Evas_GL_Glyph_Info *glyphinfo;
int max_descent;
int max_ascent;
int descent;
int ascent;
int mem_use;
GLXContext context;
int max_texture_size;
int num_textures;
GLuint *textures;
struct
{
Display *display;
XVisualInfo *visual_info;
Colormap colormap;
Window window, dest;
int dest_w, dest_h;
} buffer;
int references;
};
struct _evas_gl_glyph_info
{
GLuint texture;
int px, py, pw, ph;
double x1, y1, x2, y2;
};
struct _evas_gl_gradient_color
{
int r, g, b, a;
int dist;
}; };
struct _evas_gl_gradient struct _evas_gl_gradient
{ {
Evas_List colors; Imlib_Color_Range col_range;
GLXContext context; Evas_List textures;
int max_texture_size; };
int texture_w, texture_h;
GLuint texture; struct _evas_gl_glpyh_texture
struct {
{ struct {
Display *display; double x1, x2, y1, y2;
XVisualInfo *visual_info; } tex;
Colormap colormap; Evas_GL_Window *window;
Window window, dest; Evas_GL_Context *context;
int dest_w, dest_h; Evas_GL_Texture *texture;
} buffer; };
struct _evas_gl_glyph
{
int glyph_id;
TT_Glyph glyph;
TT_Glyph_Metrics metrics;
Evas_GL_Glyph_Texture *texture;
struct {
double x1, x2, y1, y2;
} tex;
Evas_List textures;
};
struct _evas_gl_font_texture
{
struct {
int x, y;
int row_h;
} cursor;
Evas_GL_Window *window;
Evas_GL_Context *context;
Evas_GL_Texture *texture;
};
struct _evas_gl_font
{
char *font;
int size;
TT_Engine engine;
TT_Face face;
TT_Instance instance;
TT_Face_Properties properties;
TT_CharMap char_map;
TT_Instance_Metrics metrics;
Evas_List glyphs[256];
Evas_List textures;
int ascent;
int descent;
int max_descent;
int max_ascent;
int references;
}; };
/***************/ /***************/
@ -202,6 +256,7 @@ void __evas_gl_poly_draw (Display *disp, Imlib_Image dstim, Window
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_gl_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a);
void __evas_gl_init(Display *disp, int screen, int colors); void __evas_gl_init(Display *disp, int screen, int colors);
int __evas_gl_capable(Display *disp); int __evas_gl_capable(Display *disp);
void __evas_gl_flush_draw(Display *disp, Imlib_Image dstim, Window win); void __evas_gl_flush_draw(Display *disp, Imlib_Image dstim, Window win);

View File

@ -4,6 +4,17 @@ static void __evas_image_image_cache_flush(Display *disp);
static int __evas_anti_alias = 1; static int __evas_anti_alias = 1;
static Evas_List drawable_list = NULL; static Evas_List drawable_list = NULL;
/* the current clip region and color */
static int __evas_clip = 0;
static int __evas_clip_x = 0;
static int __evas_clip_y = 0;
static int __evas_clip_w = 0;
static int __evas_clip_h = 0;
static int __evas_clip_r = 0;
static int __evas_clip_g = 0;
static int __evas_clip_b = 0;
static int __evas_clip_a = 0;
/*****************************************************************************/ /*****************************************************************************/
/* image internals ***********************************************************/ /* image internals ***********************************************************/
/*****************************************************************************/ /*****************************************************************************/
@ -806,6 +817,20 @@ __evas_image_poly_draw (Display *disp, Imlib_Image dstim, Window win,
static Visual *__evas_visual = NULL; static Visual *__evas_visual = NULL;
static Colormap __evas_cmap = 0; static Colormap __evas_cmap = 0;
void
__evas_image_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a)
{
__evas_clip = on;
__evas_clip_x = x;
__evas_clip_y = y;
__evas_clip_w = w;
__evas_clip_h = h;
__evas_clip_r = r;
__evas_clip_g = g;
__evas_clip_b = b;
__evas_clip_a = a;
}
void void
__evas_image_sync(Display *disp) __evas_image_sync(Display *disp)
{ {

View File

@ -108,6 +108,7 @@ void __evas_image_poly_draw (Display *disp, Imlib_Image dstim, W
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_image_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a);
void __evas_image_init(Display *disp, int screen, int colors); void __evas_image_init(Display *disp, int screen, int colors);
int __evas_image_capable(Display *disp); int __evas_image_capable(Display *disp);
void __evas_image_flush_draw(Display *disp, Imlib_Image dstim, Window win); void __evas_image_flush_draw(Display *disp, Imlib_Image dstim, Window win);

View File

@ -5,6 +5,17 @@ static void __evas_imlib_image_cache_flush(Display *disp);
static int __evas_anti_alias = 1; static int __evas_anti_alias = 1;
static Evas_List drawable_list = NULL; static Evas_List drawable_list = NULL;
/* the current clip region and color */
static int __evas_clip = 0;
static int __evas_clip_x = 0;
static int __evas_clip_y = 0;
static int __evas_clip_w = 0;
static int __evas_clip_h = 0;
static int __evas_clip_r = 0;
static int __evas_clip_g = 0;
static int __evas_clip_b = 0;
static int __evas_clip_a = 0;
/*****************************************************************************/ /*****************************************************************************/
/* image internals ***********************************************************/ /* image internals ***********************************************************/
/*****************************************************************************/ /*****************************************************************************/
@ -68,7 +79,14 @@ __evas_imlib_image_draw(Evas_Imlib_Image *im,
Evas_List l; Evas_List l;
Imlib_Color_Modifier cm = NULL; Imlib_Color_Modifier cm = NULL;
if (ca == 0) return; if (__evas_clip)
{
cr = (cr * __evas_clip_r) / 255;
cg = (cg * __evas_clip_g) / 255;
cb = (cb * __evas_clip_b) / 255;
ca = (ca * __evas_clip_a) / 255;
}
if (ca == 0) return;
if ((cr != 255) || (cg != 255) || (cb != 255) || (ca != 255)) if ((cr != 255) || (cg != 255) || (cb != 255) || (ca != 255))
{ {
DATA8 r[256], g[256], b[256], a[256]; DATA8 r[256], g[256], b[256], a[256];
@ -113,6 +131,13 @@ __evas_imlib_image_draw(Evas_Imlib_Image *im,
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h, if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
dst_x, dst_y, dst_w, dst_h)) dst_x, dst_y, dst_w, dst_h))
{ {
if (__evas_clip)
imlib_context_set_cliprect(__evas_clip_x - up->x,
__evas_clip_y - up->y,
__evas_clip_w,
__evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -301,13 +326,21 @@ __evas_imlib_text_cache_get_size(Display *disp)
void void
__evas_imlib_text_draw(Evas_Imlib_Font *fn, Display *disp, Imlib_Image dstim, 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 win_w, int win_h, int x, int y, char *text,
int r, int g, int b, int a) int cr, int cg, int cb, int ca)
{ {
Evas_List l; Evas_List l;
int w, h; int w, h;
if (__evas_clip)
{
cr = (cr * __evas_clip_r) / 255;
cg = (cg * __evas_clip_g) / 255;
cb = (cb * __evas_clip_b) / 255;
ca = (ca * __evas_clip_a) / 255;
}
if ((!fn) || (!text)) return; if ((!fn) || (!text)) return;
imlib_context_set_color(r, g, b, a); if (ca == 0) return;
imlib_context_set_color(cr, cg, cb, ca);
imlib_context_set_font((Imlib_Font)fn); imlib_context_set_font((Imlib_Font)fn);
imlib_context_set_angle(0.0); imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY); imlib_context_set_operation(IMLIB_OP_COPY);
@ -336,6 +369,12 @@ __evas_imlib_text_draw(Evas_Imlib_Font *fn, Display *disp, Imlib_Image dstim, Wi
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h, if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h)) x, y, w, h))
{ {
if (__evas_clip)
imlib_context_set_cliprect(__evas_clip_x - up->x,
__evas_clip_y - up->y,
__evas_clip_w,
__evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -407,11 +446,19 @@ __evas_imlib_text_get_character_number(Evas_Imlib_Font *fn, char *text,
void __evas_imlib_rectangle_draw(Display *disp, Imlib_Image dstim, Window win, void __evas_imlib_rectangle_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int win_w, int win_h,
int x, int y, int w, int h, int x, int y, int w, int h,
int r, int g, int b, int a) int cr, int cg, int cb, int ca)
{ {
Evas_List l; Evas_List l;
imlib_context_set_color(r, g, b, a); if (__evas_clip)
{
cr = (cr * __evas_clip_r) / 255;
cg = (cg * __evas_clip_g) / 255;
cb = (cb * __evas_clip_b) / 255;
ca = (ca * __evas_clip_a) / 255;
}
if (ca == 0) return;
imlib_context_set_color(cr, cg, cb, ca);
imlib_context_set_angle(0.0); imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY); imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL); imlib_context_set_color_modifier(NULL);
@ -438,6 +485,8 @@ void __evas_imlib_rectangle_draw(Display *disp, Imlib_Image dstim,
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h, if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h)) x, y, w, h))
{ {
if (__evas_clip) imlib_context_set_cliprect(__evas_clip_x - up->x, __evas_clip_y - up->y, __evas_clip_w, __evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -471,12 +520,20 @@ void __evas_imlib_rectangle_draw(Display *disp, Imlib_Image dstim,
void __evas_imlib_line_draw(Display *disp, Imlib_Image dstim, Window win, void __evas_imlib_line_draw(Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int win_w, int win_h,
int x1, int y1, int x2, int y2, int x1, int y1, int x2, int y2,
int r, int g, int b, int a) int cr, int cg, int cb, int ca)
{ {
Evas_List l; Evas_List l;
int x, y, w, h; int x, y, w, h;
imlib_context_set_color(r, g, b, a); if (__evas_clip)
{
cr = (cr * __evas_clip_r) / 255;
cg = (cg * __evas_clip_g) / 255;
cb = (cb * __evas_clip_b) / 255;
ca = (ca * __evas_clip_a) / 255;
}
if (ca == 0) return;
imlib_context_set_color(cr, cg, cb, ca);
imlib_context_set_angle(0.0); imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY); imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL); imlib_context_set_color_modifier(NULL);
@ -512,6 +569,8 @@ void __evas_imlib_line_draw(Display *disp, Imlib_Image dstim, Windo
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h, if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h)) x, y, w, h))
{ {
if (__evas_clip) imlib_context_set_cliprect(__evas_clip_x - up->x, __evas_clip_y - up->y, __evas_clip_w, __evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -546,36 +605,75 @@ void __evas_imlib_line_draw(Display *disp, Imlib_Image dstim, Windo
Evas_Imlib_Graident * Evas_Imlib_Graident *
__evas_imlib_gradient_new(Display *disp) __evas_imlib_gradient_new(Display *disp)
{ {
return (Evas_Imlib_Graident *)imlib_create_color_range(); Evas_Imlib_Graident *gr;
gr = malloc(sizeof(Evas_Imlib_Graident));
gr->colors = NULL;
} }
void void
__evas_imlib_gradient_free(Evas_Imlib_Graident *gr) __evas_imlib_gradient_free(Evas_Imlib_Graident *gr)
{ {
imlib_context_set_color_range((Imlib_Color_Range)gr); Evas_List l;
imlib_free_color_range();
if (gr->colors)
{
for (l = gr->colors; l; l = l->next)
{
free(l->data);
}
evas_list_free(gr->colors);
}
free(gr);
} }
void void
__evas_imlib_gradient_color_add(Evas_Imlib_Graident *gr, int r, int g, int b, int a, int dist) __evas_imlib_gradient_color_add(Evas_Imlib_Graident *gr, int r, int g, int b, int a, int dist)
{ {
imlib_context_set_color_range((Imlib_Color_Range)gr); Evas_Imlib_Color *cl;
imlib_context_set_color(r, g, b, a);
imlib_add_color_to_color_range(dist); cl = malloc(sizeof(Evas_Imlib_Color));
cl->r = r;
cl->g = g;
cl->b = b;
cl->a = a;
cl->dist = dist;
gr->colors = evas_list_append(gr->colors, cl);
} }
void void
__evas_imlib_gradient_draw(Evas_Imlib_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_imlib_gradient_draw(Evas_Imlib_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; Evas_List l;
Imlib_Color_Range cr;
if ((__evas_clip) && (__evas_clip_a == 0)) return;
imlib_context_set_angle(angle); imlib_context_set_angle(angle);
imlib_context_set_operation(IMLIB_OP_COPY); imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL); imlib_context_set_color_modifier(NULL);
imlib_context_set_direction(IMLIB_TEXT_TO_RIGHT); 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_anti_alias(1);
imlib_context_set_blend(1); imlib_context_set_blend(1);
cr = imlib_create_color_range();
imlib_context_set_color_range(cr);
{
Evas_List l;
for (l = gr->colors; l; l = l->next)
{
Evas_Imlib_Color *cl;
cl = l->data;
if (__evas_clip)
imlib_context_set_color((cl->r * __evas_clip_r) / 255,
(cl->g * __evas_clip_g) / 255,
(cl->b * __evas_clip_b) / 255,
(cl->a * __evas_clip_a) / 255);
else
imlib_context_set_color(cl->r, cl->g, cl->b, cl->a);
imlib_add_color_to_color_range(cl->dist);
}
}
for(l = drawable_list; l; l = l->next) for(l = drawable_list; l; l = l->next)
{ {
Evas_Imlib_Drawable *dr; Evas_Imlib_Drawable *dr;
@ -596,6 +694,8 @@ __evas_imlib_gradient_draw(Evas_Imlib_Graident *gr, Display *disp, Imlib_Image d
if (RECTS_INTERSECT(up->x, up->y, up->w, up->h, if (RECTS_INTERSECT(up->x, up->y, up->w, up->h,
x, y, w, h)) x, y, w, h))
{ {
if (__evas_clip) imlib_context_set_cliprect(__evas_clip_x - up->x, __evas_clip_y - up->y, __evas_clip_w, __evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -604,6 +704,7 @@ __evas_imlib_gradient_draw(Evas_Imlib_Graident *gr, Display *disp, Imlib_Image d
} }
} }
} }
imlib_free_color_range();
} }
@ -616,12 +717,20 @@ void
__evas_imlib_poly_draw (Display *disp, Imlib_Image dstim, Window win, __evas_imlib_poly_draw (Display *disp, Imlib_Image dstim, Window win,
int win_w, int win_h, int win_w, int win_h,
Evas_List points, Evas_List points,
int r, int g, int b, int a) int cr, int cg, int cb, int ca)
{ {
Evas_List l, l2; Evas_List l, l2;
int x, y, w, h; int x, y, w, h;
imlib_context_set_color(r, g, b, a); if (__evas_clip)
{
cr = (cr * __evas_clip_r) / 255;
cg = (cg * __evas_clip_g) / 255;
cb = (cb * __evas_clip_b) / 255;
ca = (ca * __evas_clip_a) / 255;
}
if (ca == 0) return;
imlib_context_set_color(cr, cg, cb, ca);
imlib_context_set_angle(0.0); imlib_context_set_angle(0.0);
imlib_context_set_operation(IMLIB_OP_COPY); imlib_context_set_operation(IMLIB_OP_COPY);
imlib_context_set_color_modifier(NULL); imlib_context_set_color_modifier(NULL);
@ -682,6 +791,9 @@ __evas_imlib_poly_draw (Display *disp, Imlib_Image dstim, Window win,
{ {
ImlibPolygon pol; ImlibPolygon pol;
if (__evas_clip) imlib_context_set_cliprect(__evas_clip_x - up->x, __evas_clip_y - up->y, __evas_clip_w, __evas_clip_h);
else imlib_context_set_cliprect(0, 0, 0, 0);
if (!up->image) if (!up->image)
up->image = imlib_create_image(up->w, up->h); up->image = imlib_create_image(up->w, up->h);
imlib_context_set_image(up->image); imlib_context_set_image(up->image);
@ -720,6 +832,20 @@ __evas_imlib_poly_draw (Display *disp, Imlib_Image dstim, Window win,
static Visual *__evas_visual = NULL; static Visual *__evas_visual = NULL;
static Colormap __evas_cmap = 0; static Colormap __evas_cmap = 0;
void
__evas_imlib_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a)
{
__evas_clip = on;
__evas_clip_x = x;
__evas_clip_y = y;
__evas_clip_w = w;
__evas_clip_h = h;
__evas_clip_r = r;
__evas_clip_g = g;
__evas_clip_b = b;
__evas_clip_a = a;
}
void void
__evas_imlib_sync(Display *disp) __evas_imlib_sync(Display *disp)
{ {

View File

@ -26,10 +26,11 @@
typedef void Evas_Imlib_Image; typedef void Evas_Imlib_Image;
typedef void Evas_Imlib_Font; typedef void Evas_Imlib_Font;
typedef void Evas_Imlib_Graident;
typedef struct _evas_imlib_drawable Evas_Imlib_Drawable; typedef struct _evas_imlib_drawable Evas_Imlib_Drawable;
typedef struct _evas_imlib_update Evas_Imlib_Update; typedef struct _evas_imlib_update Evas_Imlib_Update;
typedef struct _evas_imlib_color Evas_Imlib_Color;
typedef struct _evas_imlib_gradient Evas_Imlib_Graident;
struct _evas_imlib_drawable struct _evas_imlib_drawable
{ {
@ -44,6 +45,17 @@ struct _evas_imlib_update
int x, y, w, h; int x, y, w, h;
}; };
struct _evas_imlib_color
{
int r, g, b, a;
int dist;
};
struct _evas_imlib_gradient
{
Evas_List colors;
};
/***************/ /***************/
/* image stuff */ /* image stuff */
/***************/ /***************/
@ -108,6 +120,7 @@ void __evas_imlib_poly_draw (Display *disp, Imlib_Image dstim, W
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_imlib_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a);
void __evas_imlib_init(Display *disp, int screen, int colors); void __evas_imlib_init(Display *disp, int screen, int colors);
int __evas_imlib_capable(Display *disp); int __evas_imlib_capable(Display *disp);
void __evas_imlib_flush_draw(Display *disp, Imlib_Image dstim, Window win); void __evas_imlib_flush_draw(Display *disp, Imlib_Image dstim, Window win);

View File

@ -114,12 +114,139 @@ _evas_layer_free(Evas e, Evas_Layer layer)
free(layer); free(layer);
} }
void
_evas_cleanup_clip(Evas e, Evas_Object o)
{
if (o->clip.list)
{
Evas_List l;
for (l = o->clip.list; l; l = l->next)
{
Evas_Object o2;
o2 = l->data;
o2->clip.object = NULL;
o2->clip.changed = 1;
o2->changed = 1;
e->changed = 1;
}
evas_list_free(o->clip.list);
}
if (o->clip.object)
o->clip.object->clip.list = evas_list_remove(o->clip.object->clip.list, o);
}
void
_evas_get_current_clipped_geometry(Evas e, Evas_Object o, double *x, double *y, double *w, double *h)
{
if (!o->current.visible)
{
*x = 0.0;
*y = 0.0;
*w = 0.0;
*h = 0.0;
return;
}
if (o->clip.object)
_evas_get_current_clipped_geometry(e, o->clip.object, x, y, w, h);
CLIP_TO(*x, *y, *w, *h,
o->current.x, o->current.y, o->current.w, o->current.h);
}
void
_evas_get_previous_clipped_geometry(Evas e, Evas_Object o, double *x, double *y, double *w, double *h)
{
if (!o->previous.visible)
{
*x = 0.0;
*y = 0.0;
*w = 0.0;
*h = 0.0;
return;
}
if (o->clip.object)
_evas_get_current_clipped_geometry(e, o->clip.object, x, y, w, h);
CLIP_TO(*x, *y, *w, *h,
o->previous.x, o->previous.y, o->previous.w, o->previous.h);
}
int
_evas_point_in_object(Evas e, Evas_Object o, int x, int y)
{
double cx, cy;
double ox, oy, ow, oh;
if (o->delete_me) return 0;
cx = evas_screen_x_to_world(e, x);
cy = evas_screen_x_to_world(e, y);
ox = o->current.x; oy = o->current.y;
ow = o->current.w; oh = o->current.h;
_evas_get_current_clipped_geometry(e, o, &ox, &oy, &ow, &oh);
if ((cx >= ox) && (cx < (ox + ow)) && (cy >= oy) && (cy < (oy + oh)))
return 1;
return 0;
}
void
evas_set_clip(Evas e, Evas_Object o, Evas_Object clip)
{
if (!e) return;
if (!o) return;
if (!clip) return;
if (o->clip.object == clip) return;
e->changed = 1;
o->changed = 1;
o->clip.changed = 1;
if (o->clip.object)
o->clip.object->clip.list = evas_list_remove(o->clip.object->clip.list, o);
o->clip.object = clip;
clip->clip.list = evas_list_prepend(clip->clip.list, o);
}
void
evas_unset_clip(Evas e, Evas_Object o)
{
if (!e) return;
if (!o) return;
if (o->clip.object)
{
e->changed = 1;
o->changed = 1;
o->clip.changed = 1;
o->clip.object->clip.list = evas_list_remove(o->clip.object->clip.list, o);
o->clip.object = NULL;
}
}
Evas_Object
evas_get_clip_object(Evas e, Evas_Object o)
{
if (!e) return NULL;
if (!o) return NULL;
return o->clip.object;
}
Evas_List
evas_get_clip_list(Evas e, Evas_Object o)
{
if (!e) return NULL;
if (!o) return NULL;
return o->clip.list;
}
/* deleting objects */ /* deleting objects */
void void
evas_del_object(Evas e, Evas_Object o) evas_del_object(Evas e, Evas_Object o)
{ {
if (!e) return; if (!e) return;
if (!o) return; if (!o) return;
_evas_cleanup_clip(e, o);
e->changed = 1;
evas_hide(e, o); evas_hide(e, o);
o->delete_me = 1; o->delete_me = 1;
} }
@ -228,11 +355,14 @@ evas_objects_in_rect(Evas e, double x, double y, double w, double h)
Evas_Object ob; Evas_Object ob;
ob = ll->data; ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me)) if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me) && (!ob->clip.list))
{ {
if (RECTS_INTERSECT(x, y, w, h, double ox, oy, ow, oh;
ob->current.x, ob->current.y,
ob->current.w, ob->current.h)) ox = ob->current.x; oy = ob->current.y;
ow = ob->current.w; oh = ob->current.h;
_evas_get_current_clipped_geometry(e, ob, &ox, &oy, &ow, &oh);
if (RECTS_INTERSECT(x, y, w, h, ox, oy, ow, oh))
objs = evas_list_prepend(objs, ll->data); objs = evas_list_prepend(objs, ll->data);
} }
} }
@ -257,11 +387,14 @@ evas_objects_at_position(Evas e, double x, double y)
Evas_Object ob; Evas_Object ob;
ob = ll->data; ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me)) if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me) && (!ob->clip.list))
{ {
if (RECTS_INTERSECT(x, y, 1, 1, double ox, oy, ow, oh;
ob->current.x, ob->current.y,
ob->current.w, ob->current.h)) ox = ob->current.x; oy = ob->current.y;
ow = ob->current.w; oh = ob->current.h;
_evas_get_current_clipped_geometry(e, ob, &ox, &oy, &ow, &oh);
if (RECTS_INTERSECT(x, y, 1, 1, ox, oy, ow, oh))
objs = evas_list_prepend(objs, ll->data); objs = evas_list_prepend(objs, ll->data);
} }
} }
@ -287,11 +420,14 @@ evas_object_in_rect(Evas e, double x, double y, double w, double h)
Evas_Object ob; Evas_Object ob;
ob = ll->data; ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me)) if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me) && (!ob->clip.list))
{ {
if (RECTS_INTERSECT(x, y, w, h, double ox, oy, ow, oh;
ob->current.x, ob->current.y,
ob->current.w, ob->current.h)) ox = ob->current.x; oy = ob->current.y;
ow = ob->current.w; oh = ob->current.h;
_evas_get_current_clipped_geometry(e, ob, &ox, &oy, &ow, &oh);
if (RECTS_INTERSECT(x, y, w, h, ox, oy, ow, oh))
o = ob; o = ob;
} }
} }
@ -317,11 +453,14 @@ evas_object_at_position(Evas e, double x, double y)
Evas_Object ob; Evas_Object ob;
ob = ll->data; ob = ll->data;
if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me)) if ((ob->current.visible) && (!ob->pass_events) && (!ob->delete_me) && (!ob->clip.list))
{ {
if (RECTS_INTERSECT(x, y, 1, 1, double ox, oy, ow, oh;
ob->current.x, ob->current.y,
ob->current.w, ob->current.h)) ox = ob->current.x; oy = ob->current.y;
ow = ob->current.w; oh = ob->current.h;
_evas_get_current_clipped_geometry(e, ob, &ox, &oy, &ow, &oh);
if (RECTS_INTERSECT(x, y, 1.0, 1.0, ox, oy, ow, oh))
o = ob; o = ob;
} }
} }

View File

@ -17,43 +17,58 @@
((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh)))) ((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh))))
#endif #endif
void _evas_get_current_clipped_geometry(Evas e, Evas_Object o, double *x, double *y, double *w, double *h);
void _evas_get_previous_clipped_geometry(Evas e, Evas_Object o, double *x, double *y, double *w, double *h);
void void
_evas_object_get_current_translated_coords(Evas e, Evas_Object o, _evas_object_get_current_translated_coords(Evas e, Evas_Object o,
int *x, int *y, int *w, int *h) int *x, int *y, int *w, int *h, int clip)
{ {
double ox, oy, ow, oh;
ox = o->current.x; oy = o->current.y;
ow = o->current.w; oh = o->current.h;
if (clip)
_evas_get_current_clipped_geometry(e, o, &ox, &oy, &ow, &oh);
*x = (int) *x = (int)
(((o->current.x - e->current.viewport.x) * (((ox - e->current.viewport.x) *
(double)e->current.drawable_width) / (double)e->current.drawable_width) /
e->current.viewport.w); e->current.viewport.w);
*y = (int) *y = (int)
(((o->current.y - e->current.viewport.y) * (((oy - e->current.viewport.y) *
(double)e->current.drawable_height) / (double)e->current.drawable_height) /
e->current.viewport.h); e->current.viewport.h);
*w = (int) *w = (int)
((o->current.w * (double)e->current.drawable_width) / ((ow * (double)e->current.drawable_width) /
e->current.viewport.w); e->current.viewport.w);
*h = (int) *h = (int)
((o->current.h * (double)e->current.drawable_height) / ((oh * (double)e->current.drawable_height) /
e->current.viewport.h); e->current.viewport.h);
} }
void void
_evas_object_get_previous_translated_coords(Evas e, Evas_Object o, _evas_object_get_previous_translated_coords(Evas e, Evas_Object o,
int *x, int *y, int *w, int *h) int *x, int *y, int *w, int *h, int clip)
{ {
double ox, oy, ow, oh;
ox = o->previous.x; oy = o->previous.y;
ow = o->previous.w; oh = o->previous.h;
if (clip)
_evas_get_previous_clipped_geometry(e, o, &ox, &oy, &ow, &oh);
*x = (int) *x = (int)
(((o->previous.x - e->previous.viewport.x) * (((ox - e->previous.viewport.x) *
(double)e->previous.drawable_width) / (double)e->previous.drawable_width) /
e->previous.viewport.w); e->previous.viewport.w);
*y = (int) *y = (int)
(((o->previous.y - e->previous.viewport.y) * (((oy - e->previous.viewport.y) *
(double)e->previous.drawable_height) / (double)e->previous.drawable_height) /
e->previous.viewport.h); e->previous.viewport.h);
*w = (int) *w = (int)
((o->previous.w * (double)e->previous.drawable_width) / ((ow * (double)e->previous.drawable_width) /
e->previous.viewport.w); e->previous.viewport.w);
*h = (int) *h = (int)
((o->previous.h * (double)e->previous.drawable_height) / ((oh * (double)e->previous.drawable_height) /
e->previous.viewport.h); e->previous.viewport.h);
} }
@ -178,6 +193,7 @@ evas_render_updates(Evas e)
void (*func_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); void (*func_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);
void (*func_gradient_draw) (void *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle); void (*func_gradient_draw) (void *gr, Display *disp, Imlib_Image dstim, Window win, int win_w, int win_h, int x, int y, int w, int h, double angle);
void (*func_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); void (*func_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);
void (*func_set_clip_rect) (int on, int x, int y, int w, int h, int r, int g, int b, int a);
if (!e) return NULL; if (!e) return NULL;
if ((e->current.render_method == RENDER_METHOD_IMAGE) && if ((e->current.render_method == RENDER_METHOD_IMAGE) &&
@ -215,6 +231,7 @@ evas_render_updates(Evas e)
func_line_draw = __evas_imlib_line_draw; func_line_draw = __evas_imlib_line_draw;
func_gradient_draw = __evas_imlib_gradient_draw; func_gradient_draw = __evas_imlib_gradient_draw;
func_poly_draw = __evas_imlib_poly_draw; func_poly_draw = __evas_imlib_poly_draw;
func_set_clip_rect = __evas_imlib_set_clip_rect;
break; break;
case RENDER_METHOD_BASIC_HARDWARE: case RENDER_METHOD_BASIC_HARDWARE:
func_draw_add_rect = __evas_x11_draw_add_rect; func_draw_add_rect = __evas_x11_draw_add_rect;
@ -233,6 +250,7 @@ evas_render_updates(Evas e)
func_line_draw = __evas_x11_line_draw; func_line_draw = __evas_x11_line_draw;
func_gradient_draw = __evas_x11_gradient_draw; func_gradient_draw = __evas_x11_gradient_draw;
func_poly_draw = __evas_x11_poly_draw; func_poly_draw = __evas_x11_poly_draw;
func_set_clip_rect = __evas_x11_set_clip_rect;
break; break;
case RENDER_METHOD_3D_HARDWARE: case RENDER_METHOD_3D_HARDWARE:
func_draw_add_rect = __evas_gl_draw_add_rect; func_draw_add_rect = __evas_gl_draw_add_rect;
@ -251,6 +269,7 @@ evas_render_updates(Evas e)
func_line_draw = __evas_gl_line_draw; func_line_draw = __evas_gl_line_draw;
func_gradient_draw = __evas_gl_gradient_draw; func_gradient_draw = __evas_gl_gradient_draw;
func_poly_draw = __evas_gl_poly_draw; func_poly_draw = __evas_gl_poly_draw;
func_set_clip_rect = __evas_gl_set_clip_rect;
break; break;
case RENDER_METHOD_ALPHA_HARDWARE: case RENDER_METHOD_ALPHA_HARDWARE:
func_draw_add_rect = __evas_render_draw_add_rect; func_draw_add_rect = __evas_render_draw_add_rect;
@ -269,6 +288,7 @@ evas_render_updates(Evas e)
func_line_draw = __evas_render_line_draw; func_line_draw = __evas_render_line_draw;
func_gradient_draw = __evas_render_gradient_draw; func_gradient_draw = __evas_render_gradient_draw;
func_poly_draw = __evas_render_poly_draw; func_poly_draw = __evas_render_poly_draw;
func_set_clip_rect = __evas_render_set_clip_rect;
break; break;
case RENDER_METHOD_IMAGE: case RENDER_METHOD_IMAGE:
func_draw_add_rect = __evas_image_draw_add_rect; func_draw_add_rect = __evas_image_draw_add_rect;
@ -287,6 +307,7 @@ evas_render_updates(Evas e)
func_line_draw = __evas_image_line_draw; func_line_draw = __evas_image_line_draw;
func_gradient_draw = __evas_image_gradient_draw; func_gradient_draw = __evas_image_gradient_draw;
func_poly_draw = __evas_image_poly_draw; func_poly_draw = __evas_image_poly_draw;
func_set_clip_rect = __evas_image_set_clip_rect;
break; break;
default: default:
break; break;
@ -311,10 +332,11 @@ evas_render_updates(Evas e)
for (ll = layer->objects; ll; ll = ll->next) for (ll = layer->objects; ll; ll = ll->next)
{ {
Evas_Object_Any o; Evas_Object_Any o;
int real_change, prop_change; int real_change, prop_change, clip_change;
real_change = 0; real_change = 0;
prop_change = 0; prop_change = 0;
clip_change = 0;
o = ll->data; o = ll->data;
if (o->delete_me) if (o->delete_me)
@ -330,7 +352,8 @@ evas_render_updates(Evas e)
(o->current.h != o->previous.h) || (o->current.h != o->previous.h) ||
(o->current.zoomscale != o->previous.zoomscale) || (o->current.zoomscale != o->previous.zoomscale) ||
(o->current.layer != o->previous.layer) || (o->current.layer != o->previous.layer) ||
(o->current.stacking))) (o->current.stacking) ||
(o->clip.changed)))
) )
{ {
if (((o->current.visible != o->previous.visible) || if (((o->current.visible != o->previous.visible) ||
@ -353,8 +376,8 @@ evas_render_updates(Evas e)
prop_change = 1; prop_change = 1;
} }
real_change = 1; real_change = 1;
} clip_change = o->clip.changed;
}
o->current.stacking = 0; o->current.stacking = 0;
if ((!real_change) && (o->current.visible)) if ((!real_change) && (o->current.visible))
@ -490,10 +513,12 @@ evas_render_updates(Evas e)
_evas_object_get_previous_translated_coords(e, o, _evas_object_get_previous_translated_coords(e, o,
&x, &y, &x, &y,
&w, &h); &w, &h,
1 - clip_change);
_evas_object_get_current_translated_coords(e, o, _evas_object_get_current_translated_coords(e, o,
&xx, &yy, &xx, &yy,
&ww, &hh); &ww, &hh,
1 - clip_change);
rl = NULL; rl = NULL;
if (x < xx) if (x < xx)
{ {
@ -576,11 +601,13 @@ evas_render_updates(Evas e)
{ {
_evas_object_get_previous_translated_coords(e, o, _evas_object_get_previous_translated_coords(e, o,
&x, &y, &x, &y,
&w, &h); &w, &h,
1 - clip_change);
evas_update_rect(e, x, y, w, h); evas_update_rect(e, x, y, w, h);
_evas_object_get_current_translated_coords(e, o, _evas_object_get_current_translated_coords(e, o,
&x, &y, &x, &y,
&w, &h); &w, &h,
1 - clip_change);
evas_update_rect(e, x, y, w, h); evas_update_rect(e, x, y, w, h);
} }
} }
@ -637,12 +664,50 @@ evas_render_updates(Evas e)
_evas_object_get_current_translated_coords(e, o, _evas_object_get_current_translated_coords(e, o,
&x, &y, &x, &y,
&w, &h); &w, &h,
1 - o->clip.changed);
o->clip.changed = 0;
if (RECTS_INTERSECT(0, 0, if (RECTS_INTERSECT(0, 0,
e->current.drawable_width, e->current.drawable_width,
e->current.drawable_height, e->current.drawable_height,
x, y, w, h)) x, y, w, h) &&
(!o->clip.list))
{ {
if (!o->clip.changed)
_evas_object_get_current_translated_coords(e, o,
&x, &y,
&w, &h,
0);
if (o->clip.object)
{
Evas_Object_Rectangle oo;
int clr, clg, clb, cla;
int clx, cly, clw, clh;
clr = 255;
clg = 255;
clb = 255;
cla = 255;
if (o->clip.object->type == OBJECT_RECTANGLE)
{
oo = o->clip.object;
clr = oo->current.r;
clg = oo->current.g;
clb = oo->current.b;
cla = oo->current.a;
}
_evas_object_get_current_translated_coords(e, o,
&clx, &cly,
&clw, &clh,
1);
if ((clw > 1) && (clh > 1))
func_set_clip_rect(1, clx, cly, clw, clh, clr, clg, clb, cla);
else
func_set_clip_rect(1, e->current.drawable_width + 1, e->current.drawable_height + 1, 1, 1, 255, 255, 255, 255);
}
else
func_set_clip_rect(0, 0, 0, 0, 0, 255, 255, 255, 255);
switch (o->type) switch (o->type)
{ {
case OBJECT_IMAGE: case OBJECT_IMAGE:

View File

@ -7,6 +7,17 @@ static void __evas_render_image_cache_flush(Display *disp);
static int __evas_anti_alias = 1; static int __evas_anti_alias = 1;
static Evas_List drawable_list = NULL; static Evas_List drawable_list = NULL;
/* the current clip region and color */
static int __evas_clip = 0;
static int __evas_clip_x = 0;
static int __evas_clip_y = 0;
static int __evas_clip_w = 0;
static int __evas_clip_h = 0;
static int __evas_clip_r = 0;
static int __evas_clip_g = 0;
static int __evas_clip_b = 0;
static int __evas_clip_a = 0;
/*****************************************************************************/ /*****************************************************************************/
/* image internals ***********************************************************/ /* image internals ***********************************************************/
/*****************************************************************************/ /*****************************************************************************/
@ -611,6 +622,20 @@ __evas_render_poly_draw (Display *disp, Imlib_Image dstim, Window win,
static Visual *__evas_visual = NULL; static Visual *__evas_visual = NULL;
static Colormap __evas_cmap = 0; static Colormap __evas_cmap = 0;
void
__evas_render_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a)
{
__evas_clip = on;
__evas_clip_x = x;
__evas_clip_y = y;
__evas_clip_w = w;
__evas_clip_h = h;
__evas_clip_r = r;
__evas_clip_g = g;
__evas_clip_b = b;
__evas_clip_a = a;
}
void void
__evas_render_sync(Display *disp) __evas_render_sync(Display *disp)
{ {
@ -811,6 +836,7 @@ void __evas_render_poly_draw (Display *disp, Imlib_Image dstim, Win
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_render_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a) {}
void __evas_render_init(Display *disp, int screen, int colors){} void __evas_render_init(Display *disp, int screen, int colors){}
int __evas_render_capable(Display *disp){return 0;} int __evas_render_capable(Display *disp){return 0;}
void __evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win){} void __evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win){}

View File

@ -131,6 +131,7 @@ void __evas_render_poly_draw (Display *disp, Imlib_Image dstim,
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_render_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a);
void __evas_render_init(Display *disp, int screen, int colors); void __evas_render_init(Display *disp, int screen, int colors);
int __evas_render_capable(Display *disp); int __evas_render_capable(Display *disp);
void __evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win); void __evas_render_flush_draw(Display *disp, Imlib_Image dstim, Window win);

File diff suppressed because it is too large Load Diff

View File

@ -12,6 +12,12 @@
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <X11/Xutil.h> #include <X11/Xutil.h>
#ifdef HAVE_FREETYPE_FREETYPE_H
#include <freetype/freetype.h>
#else
#include <freetype.h>
#endif
#include "Evas_private.h" #include "Evas_private.h"
#include "Evas.h" #include "Evas.h"
@ -24,12 +30,14 @@
((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh)))) ((SPANS_COMMON((x), (w), (xx), (ww))) && (SPANS_COMMON((y), (h), (yy), (hh))))
#endif #endif
typedef void Evas_X11_Image; typedef struct _evas_x11_image Evas_X11_Image;
typedef void Evas_X11_Font; typedef struct _evas_x11_font Evas_X11_Font;
typedef void Evas_X11_Graident; typedef struct _evas_x11_gradient Evas_X11_Graident;
typedef struct _evas_x11_color Evas_X11_Color;
typedef struct _evas_x11_glyph Evas_X11_Glyph;
typedef struct _evas_x11_drawable Evas_X11_Drawable; typedef struct _evas_x11_drawable Evas_X11_Drawable;
typedef struct _evas_x11_update Evas_X11_Update; typedef struct _evas_x11_update Evas_X11_Update;
struct _evas_x11_drawable struct _evas_x11_drawable
{ {
@ -46,6 +54,67 @@ struct _evas_x11_update
int x, y, w, h; int x, y, w, h;
}; };
struct _evas_x11_image
{
GC gc;
Display *disp;
Window win;
int pw, ph, pr, pg, pb, pa;
Pixmap pmap;
Pixmap mask;
int w, h;
int has_alpha;
char *file;
Imlib_Image image;
int references;
};
struct _evas_x11_glyph
{
int glyph_id;
TT_Glyph glyph;
TT_Glyph_Metrics metrics;
int pw, ph;
Pixmap pmap;
};
struct _evas_x11_font
{
char *font;
int size;
Display *disp;
TT_Engine engine;
TT_Face face;
TT_Instance instance;
TT_Face_Properties properties;
TT_CharMap char_map;
TT_Instance_Metrics metrics;
Evas_List glyphs[256];
int ascent;
int descent;
int max_descent;
int max_ascent;
int references;
};
struct _evas_x11_gradient
{
Evas_List colors;
};
struct _evas_x11_color
{
int r, g, b, a;
int dist;
};
/***************/ /***************/
/* image stuff */ /* image stuff */
/***************/ /***************/
@ -110,6 +179,7 @@ void __evas_x11_poly_draw (Display *disp, Imlib_Image dstim, Wi
/***********/ /***********/
/* drawing */ /* drawing */
/***********/ /***********/
void __evas_x11_set_clip_rect(int on, int x, int y, int w, int h, int r, int g, int b, int a);
void __evas_x11_init(Display *disp, int screen, int colors); void __evas_x11_init(Display *disp, int screen, int colors);
int __evas_x11_capable(Display *disp); int __evas_x11_capable(Display *disp);
void __evas_x11_flush_draw(Display *disp, Imlib_Image dstim, Window win); void __evas_x11_flush_draw(Display *disp, Imlib_Image dstim, Window win);

View File

@ -1147,6 +1147,7 @@ animate(double val)
fps = (double)framecount / (val - last_time); fps = (double)framecount / (val - last_time);
sprintf(buf, "FPS: %3.2f", fps); sprintf(buf, "FPS: %3.2f", fps);
printf("%s\n", buf);
evas_set_text(evas_view, o_fps, buf); evas_set_text(evas_view, o_fps, buf);
framecount = -1; framecount = -1;
last_time = val; last_time = val;

View File

@ -212,6 +212,25 @@ main(int argc, char **argv)
h /= 2; h /= 2;
evas_show(e, o[1]); evas_show(e, o[1]);
o_rect = evas_add_rectangle(e);
evas_show(e, o_rect);
evas_move(e, o_rect, 100, 80);
evas_resize(e, o_rect, 120, 120);
evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 200);
evas_set_layer(e, o_rect, 180);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_DOWN, mouse_down, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_UP, mouse_up, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_MOVE, mouse_move, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_IN, mouse_in, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_OUT, mouse_out, NULL);
o_rect = evas_add_rectangle(e);
evas_show(e, o_rect);
evas_move(e, o_rect, 200, 100);
evas_resize(e, o_rect, 300, 200);
evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 200);
evas_set_layer(e, o_rect, 150);
for (i = 2 ; i < 120; i++) for (i = 2 ; i < 120; i++)
{ {
o[i] = evas_add_image_from_file(e, IMGDIR"mush.png"); o[i] = evas_add_image_from_file(e, IMGDIR"mush.png");
@ -222,6 +241,7 @@ main(int argc, char **argv)
evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL); evas_callback_add(e, o[i], CALLBACK_MOUSE_MOVE, mouse_move, NULL);
evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL);
evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL);
evas_set_clip(e, o[i], o_rect);
} }
for (i = 120; i < 128; i++) for (i = 120; i < 128; i++)
{ {
@ -235,17 +255,6 @@ main(int argc, char **argv)
evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL); evas_callback_add(e, o[i], CALLBACK_MOUSE_IN, mouse_in, NULL);
evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL); evas_callback_add(e, o[i], CALLBACK_MOUSE_OUT, mouse_out, NULL);
} }
o_rect = evas_add_rectangle(e);
evas_show(e, o_rect);
evas_move(e, o_rect, 100, 100);
evas_resize(e, o_rect, 200, 100);
evas_set_color(e, o_rect, rand()&0xff, rand()&0xff, rand()&0xff, 120);
evas_set_layer(e, o_rect, 150);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_DOWN, mouse_down, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_UP, mouse_up, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_MOVE, mouse_move, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_IN, mouse_in, NULL);
evas_callback_add(e, o_rect, CALLBACK_MOUSE_OUT, mouse_out, NULL);
o_poly = evas_add_poly(e); o_poly = evas_add_poly(e);
evas_show(e, o_poly); evas_show(e, o_poly);
@ -267,7 +276,7 @@ main(int argc, char **argv)
o_line = evas_add_line(e); o_line = evas_add_line(e);
evas_show(e, o_line); evas_show(e, o_line);
evas_set_line_xy(e, o_line, 10, 20, 100, 50); 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_color(e, o_line, rand()&0xff, rand()&0xff, rand()&0xff, 140);
evas_set_layer(e, o_rect, 150); evas_set_layer(e, o_rect, 150);
evas_callback_add(e, o_line, CALLBACK_MOUSE_DOWN, mouse_down, NULL); evas_callback_add(e, o_line, CALLBACK_MOUSE_DOWN, mouse_down, NULL);
evas_callback_add(e, o_line, CALLBACK_MOUSE_UP, mouse_up, NULL); evas_callback_add(e, o_line, CALLBACK_MOUSE_UP, mouse_up, NULL);
@ -278,7 +287,7 @@ main(int argc, char **argv)
o_grad = evas_add_gradient_box(e); o_grad = evas_add_gradient_box(e);
evas_show(e, o_grad); evas_show(e, o_grad);
evas_move(e, o_grad, 300, 50); evas_move(e, o_grad, 300, 50);
evas_resize(e, o_grad, 200, 200); evas_resize(e, o_grad, 300, 300);
evas_set_layer(e, o_grad, 150); evas_set_layer(e, o_grad, 150);
grad = evas_gradient_new(); grad = evas_gradient_new();
evas_gradient_add_color(grad, 255, 255, 255, 255, 8); evas_gradient_add_color(grad, 255, 255, 255, 255, 8);
@ -291,6 +300,7 @@ main(int argc, char **argv)
evas_callback_add(e, o_grad, CALLBACK_MOUSE_MOVE, mouse_move, NULL); evas_callback_add(e, o_grad, CALLBACK_MOUSE_MOVE, mouse_move, NULL);
evas_callback_add(e, o_grad, CALLBACK_MOUSE_IN, mouse_in, NULL); evas_callback_add(e, o_grad, CALLBACK_MOUSE_IN, mouse_in, NULL);
evas_callback_add(e, o_grad, CALLBACK_MOUSE_OUT, mouse_out, NULL); evas_callback_add(e, o_grad, CALLBACK_MOUSE_OUT, mouse_out, NULL);
/* evas_set_clip(e, o_grad, o_rect);*/
o_text = evas_add_text(e, "grunge", 14, "Click and Drag Objects..."); o_text = evas_add_text(e, "grunge", 14, "Click and Drag Objects...");
evas_set_color(e, o_text, 0, 0, 0, 160); evas_set_color(e, o_text, 0, 0, 0, 160);
@ -304,7 +314,7 @@ main(int argc, char **argv)
evas_callback_add(e, o_text, CALLBACK_MOUSE_OUT, mouse_out, NULL); evas_callback_add(e, o_text, CALLBACK_MOUSE_OUT, mouse_out, NULL);
o_fps = evas_add_text(e, "morpheus", 16, "FPS..."); o_fps = evas_add_text(e, "morpheus", 16, "FPS...");
evas_set_color(e, o_fps, 255, 255, 255, 120); evas_set_color(e, o_fps, 255, 255, 255, 140);
evas_move(e, o_fps, win_w, win_h); evas_move(e, o_fps, win_w, win_h);
evas_show(e, o_fps); evas_show(e, o_fps);
evas_set_layer(e, o_fps, 500); evas_set_layer(e, o_fps, 500);
@ -388,9 +398,9 @@ main(int argc, char **argv)
if (i < 100) if (i < 100)
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);
ww = ((1.2 + cos((double)(a + j + m) * 2 * 3.141592654 / 1000)) * 48);
hh = ww;
/* /*
ww = ((1.2 + cos((double)(a + j + m) * 2 * 3.141592654 / 1000)) * 24);
hh = ww;
evas_resize(e, o[i], ww, hh); evas_resize(e, o[i], ww, hh);
evas_set_image_fill(e, o[i], 0, 0, ww, hh); evas_set_image_fill(e, o[i], 0, 0, ww, hh);
evas_set_color(e, o[i], 255, 255, 255, evas_set_color(e, o[i], 255, 255, 255,