Attached is another small test patch for evas' xrender engine.
jose.
Index: e17/libs/evas/src/lib/canvas/evas_object_image.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/lib/canvas/evas_object_image.c,v
retrieving revision 1.39
diff -u -r1.39 evas_object_image.c
--- e17/libs/evas/src/lib/canvas/evas_object_image.c 2 May 2006 07:28:46 -0000 1.39
+++ e17/libs/evas/src/lib/canvas/evas_object_image.c 16 May 2006 10:55:04 -0000
@@ -1389,6 +1389,9 @@
}
o->dirty_pixels = 0;
}
+ o->engine_data = obj->layer->evas->engine.func->image_border_set(output, o->engine_data,
+ o->cur.border.l, o->cur.border.r,
+ o->cur.border.t, o->cur.border.b);
idx = evas_object_image_figure_x_fill(obj, o->cur.fill.x, o->cur.fill.w, &idw);
idy = evas_object_image_figure_y_fill(obj, o->cur.fill.y, o->cur.fill.h, &idh);
if (idw < 1.0) idw = 1.0;
Index: e17/libs/evas/src/lib/include/evas_private.h
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/lib/include/evas_private.h,v
retrieving revision 1.69
diff -u -r1.69 evas_private.h
--- e17/libs/evas/src/lib/include/evas_private.h 2 May 2006 07:28:48 -0000 1.69
+++ e17/libs/evas/src/lib/include/evas_private.h 16 May 2006 10:55:10 -0000
@@ -570,6 +570,8 @@
void *(*image_data_put) (void *data, void *image, DATA32 *image_data);
void *(*image_alpha_set) (void *data, void *image, int has_alpha);
int (*image_alpha_get) (void *data, void *image);
+ void *(*image_border_set) (void *data, void *image, int l, int r, int t, int b);
+ void (*image_border_get) (void *data, void *image, int *l, int *r, int *t, int *b);
void (*image_draw) (void *data, void *context, void *surface, void *image, 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 smooth);
char *(*image_comment_get) (void *data, void *image, char *key);
char *(*image_format_get) (void *data, void *image);
Index: e17/libs/evas/src/modules/engines/cairo_x11/evas_engine.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/cairo_x11/evas_engine.c,v
retrieving revision 1.5
diff -u -r1.5 evas_engine.c
--- e17/libs/evas/src/modules/engines/cairo_x11/evas_engine.c 2 May 2006 07:28:48 -0000 1.5
+++ e17/libs/evas/src/modules/engines/cairo_x11/evas_engine.c 16 May 2006 10:55:14 -0000
@@ -69,6 +69,8 @@
static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
static int eng_image_alpha_get(void *data, void *image);
+static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
+static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
static void eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth);
static char *eng_image_comment_get(void *data, void *image, char *key);
static char *eng_image_format_get(void *data, void *image);
@@ -173,6 +175,8 @@
eng_image_data_put,
eng_image_alpha_set,
eng_image_alpha_get,
+ eng_image_border_set,
+ eng_image_border_get,
eng_image_draw,
eng_image_comment_get,
eng_image_format_get,
@@ -1036,6 +1040,24 @@
return 0;
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+ return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+ return;
+}
+
static void
eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth)
{
Index: e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb.c,v
retrieving revision 1.3
diff -u -r1.3 evas_engine_dfb.c
--- e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb.c 2 May 2006 07:28:48 -0000 1.3
+++ e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb.c 16 May 2006 10:55:20 -0000
@@ -69,6 +69,8 @@
evas_engine_directfb_image_data_put,
evas_engine_directfb_image_alpha_set,
evas_engine_directfb_image_alpha_get,
+ evas_engine_directfb_image_border_set,
+ evas_engine_directfb_image_border_get,
evas_engine_directfb_image_draw,
evas_engine_directfb_image_comment_get,
evas_engine_directfb_image_format_get,
Index: e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.c,v
retrieving revision 1.4
diff -u -r1.4 evas_engine_dfb_image_objects.c
--- e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.c 18 Jan 2006 07:57:46 -0000 1.4
+++ e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.c 16 May 2006 10:55:22 -0000
@@ -268,6 +268,22 @@
return 0;
}
+void *
+evas_engine_directfb_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ return image;
+}
+
+void
+evas_engine_directfb_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ Render_Engine *re;
+ RGBA_Image *im;
+
+ re = (Render_Engine *) data;
+ im = image;
+}
+
void
evas_engine_directfb_image_draw(void *data, void *context, void *surface,
void *image, int src_region_x, int src_region_y,
Index: e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.h
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.h,v
retrieving revision 1.1
diff -u -r1.1 evas_engine_dfb_image_objects.h
--- e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.h 14 Jan 2006 12:13:37 -0000 1.1
+++ e17/libs/evas/src/modules/engines/directfb/evas_engine_dfb_image_objects.h 16 May 2006 10:55:23 -0000
@@ -30,6 +30,12 @@
int has_alpha);
int evas_engine_directfb_image_alpha_get(void *data,
void *image);
+void *evas_engine_directfb_image_border_set(void *data,
+ void *image,
+ int l, int r, int t, int b);
+void evas_engine_directfb_image_border_get(void *data,
+ void *image,
+ int *l, int *r, int *t, int *b);
void evas_engine_directfb_image_draw(void *data, void *context,
void *surface, void *image,
int src_x, int src_y,
Index: e17/libs/evas/src/modules/engines/gl_x11/evas_engine.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/gl_x11/evas_engine.c,v
retrieving revision 1.11
diff -u -r1.11 evas_engine.c
--- e17/libs/evas/src/modules/engines/gl_x11/evas_engine.c 9 May 2006 11:40:10 -0000 1.11
+++ e17/libs/evas/src/modules/engines/gl_x11/evas_engine.c 16 May 2006 10:55:28 -0000
@@ -69,6 +69,8 @@
static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
static int eng_image_alpha_get(void *data, void *image);
+static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
+static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
static void eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth);
static char *eng_image_comment_get(void *data, void *image, char *key);
static char *eng_image_format_get(void *data, void *image);
@@ -179,6 +181,8 @@
eng_image_data_put,
eng_image_alpha_set,
eng_image_alpha_get,
+ eng_image_border_set,
+ eng_image_border_get,
eng_image_draw,
eng_image_comment_get,
eng_image_format_get,
@@ -998,6 +1002,24 @@
return 0;
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+ return image;
+}
+
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ Render_Engine *re;
+
+ re = (Render_Engine *)data;
+}
+
static void
eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth)
{
Index: e17/libs/evas/src/modules/engines/software_generic/evas_engine.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/software_generic/evas_engine.c,v
retrieving revision 1.3
diff -u -r1.3 evas_engine.c
--- e17/libs/evas/src/modules/engines/software_generic/evas_engine.c 2 May 2006 07:28:49 -0000 1.3
+++ e17/libs/evas/src/modules/engines/software_generic/evas_engine.c 16 May 2006 10:55:30 -0000
@@ -423,6 +423,23 @@
return 0;
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ RGBA_Image *im;
+
+ im = image;
+ return im;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ RGBA_Image *im;
+
+ im = image;
+}
+
static void
eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth)
{
@@ -723,6 +740,8 @@
eng_image_data_put,
eng_image_alpha_set,
eng_image_alpha_get,
+ eng_image_border_set,
+ eng_image_border_get,
eng_image_draw,
eng_image_comment_get,
eng_image_format_get,
Index: e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.c,v
retrieving revision 1.8
diff -u -r1.8 evas_engine.c
--- e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.c 2 May 2006 07:28:49 -0000 1.8
+++ e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.c 16 May 2006 10:55:34 -0000
@@ -76,6 +76,8 @@
static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
static int eng_image_alpha_get(void *data, void *image);
+static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
+static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
static void eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth);
static char *eng_image_comment_get(void *data, void *image, char *key);
static char *eng_image_format_get(void *data, void *image);
@@ -657,6 +659,21 @@
return _xre_image_alpha_get((XR_Image *)image);
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ if (!image) return image;
+ _xre_image_border_set((XR_Image *)image, l, r, t, b);
+ return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ if (!image) return;
+ _xre_image_border_get((XR_Image *)image, l, r, t, b);
+}
+
static void
eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth)
{
@@ -793,6 +810,8 @@
ORD(image_data_put);
ORD(image_alpha_set);
ORD(image_alpha_get);
+ ORD(image_border_set);
+ ORD(image_border_get);
ORD(image_draw);
ORD(image_comment_get);
ORD(image_format_get);
Index: e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.h
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.h,v
retrieving revision 1.2
diff -u -r1.2 evas_engine.h
--- e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.h 2 May 2006 07:28:49 -0000 1.2
+++ e17/libs/evas/src/modules/engines/xrender_x11/evas_engine.h 16 May 2006 10:55:35 -0000
@@ -55,6 +55,7 @@
Picture pic;
unsigned char alpha : 1;
unsigned char allocated : 1;
+ unsigned char bordered : 1;
};
/* ximage support calls (ximage vs xshmimage, cache etc.) */
@@ -117,6 +118,8 @@
void _xre_image_data_put(XR_Image *im, void *data);
void _xre_image_alpha_set(XR_Image *im, int alpha);
int _xre_image_alpha_get(XR_Image *im);
+void _xre_image_border_set(XR_Image *im, int l, int r, int t, int b);
+void _xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
void _xre_image_surface_gen(XR_Image *im);
void _xre_image_cache_set(int size);
int _xre_image_cache_get(void);
Index: e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_gradient.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_gradient.c,v
retrieving revision 1.3
diff -u -r1.3 evas_engine_gradient.c
--- e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_gradient.c 11 May 2006 12:48:22 -0000 1.3
+++ e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_gradient.c 16 May 2006 10:55:35 -0000
@@ -164,7 +164,7 @@
_xre_gradient_draw(Xrender_Surface *rs, RGBA_Draw_Context *dc, XR_Gradient *gr, int x, int y, int w, int h, double angle, int spread)
{
RGBA_Image *im;
- int mul_use;
+ int mul_use;
if ((w <= 0) || (h <= 0)) return;
if (!rs || !dc || !gr) return;
Index: e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_image.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_image.c,v
retrieving revision 1.4
diff -u -r1.4 evas_engine_image.c
--- e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_image.c 2 May 2006 07:28:49 -0000 1.4
+++ e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_image.c 16 May 2006 10:55:37 -0000
@@ -472,6 +472,29 @@
}
void
+_xre_image_border_set(XR_Image *im, int l, int r, int t, int b)
+{
+ if (!im) return;
+ _xre_image_surface_gen(im);
+ if (l < 1) l = 0;
+ if (r < 1) r = 0;
+ if (t < 1) t = 0;
+ if (b < 1) b = 0;
+ if (im->surface)
+ {
+ if (l | r | t | b)
+ im->surface->bordered = 1;
+ else
+ im->surface->bordered = 0;
+ }
+}
+
+void
+_xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b)
+{
+}
+
+void
_xre_image_surface_gen(XR_Image *im)
{
void *data = NULL;
Index: e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c,v
retrieving revision 1.11
diff -u -r1.11 evas_engine_xrender.c
--- e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c 16 May 2006 07:53:47 -0000 1.11
+++ e17/libs/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c 16 May 2006 10:55:40 -0000
@@ -336,18 +336,34 @@
_xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth)
{
Xrender_Surface *trs = NULL;
- XTransform xf;
+ XTransform xf, id;
XRenderPictureAttributes att;
Picture mask;
int r, g, b, a, op;
- int sf;
+ int e;
if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
+ e = 0;
+ if ((sw != w) || (sh != h))
+ e = 1;
+
att.clip_mask = None;
XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att);
XRenderChangePicture(srs->xinf->disp, drs->pic, CPClipMask, &att);
+ id.matrix[0][0] = 1 << 16;
+ id.matrix[0][1] = 0;
+ id.matrix[0][2] = 0;
+
+ id.matrix[1][0] = 0;
+ id.matrix[1][1] = 1 << 16;
+ id.matrix[1][2] = 0;
+
+ id.matrix[2][0] = 0;
+ id.matrix[2][1] = 0;
+ id.matrix[2][2] = 1 << 16;
+
op = PictOpSrc;
if (srs->alpha) op = PictOpOver;
mask = None;
@@ -367,86 +383,57 @@
srs->xinf->mul_b = b;
srs->xinf->mul_a = a;
_xr_render_surface_solid_rectangle_set(srs->xinf->mul,
- r,
- g,
- b,
- a,
+ r, g, b, a,
0, 0, 1, 1);
}
- att.component_alpha = 1;
op = PictOpOver;
mask = srs->xinf->mul->pic;
- XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
if ((r == g == b == 0xff) && (a != 0xff))
{
+ att.component_alpha = 0;
+ XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
}
else
{
- xf.matrix[0][0] = 1 << 16;
- xf.matrix[0][1] = 0;
- xf.matrix[0][2] = 0;
-
- xf.matrix[1][0] = 0;
- xf.matrix[1][1] = 1 << 16;
- xf.matrix[1][2] = 0;
-
- xf.matrix[2][0] = 0;
- xf.matrix[2][1] = 0;
- xf.matrix[2][2] = 1 << 16;
if ((srs->alpha) || (a != 0xff))
- trs = _xr_render_surface_new(srs->xinf, sw + 1, sh + 1,
-// trs = _xr_render_surface_new(srs->xinf, sw, sh,
+ trs = _xr_render_surface_new(srs->xinf, sw + e, sh + e,
srs->xinf->fmt32, 1);
else
- trs = _xr_render_surface_new(srs->xinf, sw + 1, sh + 1,
-// trs = _xr_render_surface_new(srs->xinf, sw, sh,
+ trs = _xr_render_surface_new(srs->xinf, sw + e, sh + e,
srs->fmt, srs->alpha);
- XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
+ if (!trs) return;
+
+ att.component_alpha = 1;
+ XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
+ XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &id);
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
/* fill right and bottom pixel so interpolation works right */
- XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
- trs->pic, sx + sw, sy, 0, 0, sw, 0, 1, sh);
- XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
- trs->pic, sx, sy + sh, 0, 0, 0, sh, sw + 1, 1);
-// XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
-// trs->pic, sx + sw, sy + sh, 0, 0, sw, sh, 1, 1);
- mask = 0;
+ if (e)
+ {
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
+ trs->pic, sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
+ trs->pic, sx, sy + sh - 1, 0, 0, 0, sh, sw, 1);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
+ trs->pic, sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1);
+ }
+ mask = None;
}
}
}
-/*
- sf = MAX(sw, sh);
-#define BMAX 26
- if (sf <= 8 ) sf = 1 << (BMAX - 3);
- else if (sf <= 16 ) sf = 1 << (BMAX - 4);
- else if (sf <= 32 ) sf = 1 << (BMAX - 5);
- else if (sf <= 64 ) sf = 1 << (BMAX - 6);
- else if (sf <= 128 ) sf = 1 << (BMAX - 7);
- else if (sf <= 256 ) sf = 1 << (BMAX - 8);
- else if (sf <= 512 ) sf = 1 << (BMAX - 9);
- else if (sf <= 1024 ) sf = 1 << (BMAX - 10);
- else if (sf <= 2048 ) sf = 1 << (BMAX - 11);
- else if (sf <= 4096 ) sf = 1 << (BMAX - 12);
- else if (sf <= 8192 ) sf = 1 << (BMAX - 13);
- else if (sf <= 16384) sf = 1 << (BMAX - 14);
- else sf = 1 << (BMAX - 15);
-*/
-
-// xf.matrix[0][0] = (sf * sw) / w;
+
xf.matrix[0][0] = (sw << 16) / w;
xf.matrix[0][1] = 0;
xf.matrix[0][2] = 0;
xf.matrix[1][0] = 0;
-// xf.matrix[1][1] = (sf * sh) / h;
xf.matrix[1][1] = (sh << 16) / h;
xf.matrix[1][2] = 0;
xf.matrix[2][0] = 0;
xf.matrix[2][1] = 0;
xf.matrix[2][2] = 1 << 16;
-// xf.matrix[2][2] = sf;
_xr_render_surface_clips_set(drs, dc, x, y, w, h);
if (trs)
@@ -463,18 +450,45 @@
}
else
{
- if (smooth)
- XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "best", NULL, 0);
- else
- XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "nearest", NULL, 0);
- XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
-
- XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic,
-// (sx * w) / sw,
-// (sy * h) / sh,
- ((sx * w) + (sw / 2)) / sw,
- ((sy * h) + (sh / 2)) / sh,
- 0, 0, x, y, w, h);
+ if (srs->bordered && e)
+ {
+ trs = _xr_render_surface_new(srs->xinf, sw + 1, sh + 1,
+ srs->fmt, srs->alpha);
+ if (!trs) return;
+
+ XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &id);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
+ trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
+ trs->pic, sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
+ trs->pic, sx, sy + sh - 1, 0, 0, 0, sh, sw, 1);
+ XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
+ trs->pic, sx + sw - 1, sy + sh - 1, 0, 0, sw, sh, 1, 1);
+
+ if (smooth)
+ XRenderSetPictureFilter(trs->xinf->disp, trs->pic, "best", NULL, 0);
+ else
+ XRenderSetPictureFilter(trs->xinf->disp, trs->pic, "nearest", NULL, 0);
+
+ XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf);
+ XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic,
+ 0, 0, 0, 0, x, y, w, h);
+ _xr_render_surface_free(trs);
+ }
+ else
+ {
+ if (smooth)
+ XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "best", NULL, 0);
+ else
+ XRenderSetPictureFilter(srs->xinf->disp, srs->pic, "nearest", NULL, 0);
+
+ XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
+ XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic,
+ ((sx * w) + (sw / 2)) / sw,
+ ((sy * h) + (sh / 2)) / sh,
+ 0, 0, x, y, w, h);
+ }
}
}
Index: e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.c,v
retrieving revision 1.4
diff -u -r1.4 evas_engine.c
--- e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.c 2 May 2006 07:28:49 -0000 1.4
+++ e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.c 16 May 2006 10:55:44 -0000
@@ -79,6 +79,8 @@
static void *eng_image_data_put(void *data, void *image, DATA32 *image_data);
static void *eng_image_alpha_set(void *data, void *image, int has_alpha);
static int eng_image_alpha_get(void *data, void *image);
+static void *eng_image_border_set(void *data, void *image, int l, int r, int t, int b);
+static void eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b);
static void eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth);
static char *eng_image_comment_get(void *data, void *image, char *key);
static char *eng_image_format_get(void *data, void *image);
@@ -667,6 +669,21 @@
return _xre_image_alpha_get((XR_Image *)image);
}
+static void *
+eng_image_border_set(void *data, void *image, int l, int r, int t, int b)
+{
+ if (!image) return image;
+ _xre_image_border_set((XR_Image *)image, l, r, t, b);
+ return image;
+}
+
+static void
+eng_image_border_get(void *data, void *image, int *l, int *r, int *t, int *b)
+{
+ if (!image) return;
+ _xre_image_border_get((XR_Image *)image, l, r, t, b);
+}
+
static void
eng_image_draw(void *data, void *context, void *surface, void *image, 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 smooth)
{
@@ -803,6 +820,8 @@
ORD(image_data_put);
ORD(image_alpha_set);
ORD(image_alpha_get);
+ ORD(image_border_set);
+ ORD(image_border_get);
ORD(image_draw);
ORD(image_comment_get);
ORD(image_format_get);
Index: e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.h
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.h,v
retrieving revision 1.3
diff -u -r1.3 evas_engine.h
--- e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.h 6 May 2006 06:22:57 -0000 1.3
+++ e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine.h 16 May 2006 10:55:45 -0000
@@ -61,6 +61,7 @@
XCBRenderPICTURE pic;
unsigned char alpha : 1;
unsigned char allocated : 1;
+ unsigned char bordered : 1;
};
/* ximage support calls (ximage vs xshmimage, cache etc.) */
@@ -123,6 +124,8 @@
void _xre_image_data_put(XR_Image *im, void *data);
void _xre_image_alpha_set(XR_Image *im, int alpha);
int _xre_image_alpha_get(XR_Image *im);
+void _xre_image_border_set(XR_Image *im, int l, int r, int t, int b);
+void _xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b);
void _xre_image_surface_gen(XR_Image *im);
void _xre_image_cache_set(int size);
int _xre_image_cache_get(void);
Index: e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_image.c
===================================================================
RCS file: /var/cvs/e/e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_image.c,v
retrieving revision 1.4
diff -u -r1.4 evas_engine_image.c
--- e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_image.c 2 May 2006 07:28:49 -0000 1.4
+++ e17/libs/evas/src/modules/engines/xrender_xcb/evas_engine_image.c 16 May 2006 10:55:47 -0000
@@ -476,6 +476,29 @@
}
void
+_xre_image_border_set(XR_Image *im, int l, int r, int t, int b)
+{
+ if (!im) return;
+ _xre_image_surface_gen(im);
+ if (l < 1) l = 0;
+ if (r < 1) r = 0;
+ if (t < 1) t = 0;
+ if (b < 1) b = 0;
+ if (im->surface)
+ {
+ if (l | r | t | b)
+ im->surface->bordered = 1;
+ else
+ im->surface->bordered = 0;
+ }
+}
+
+void
+_xre_image_border_get(XR_Image *im, int *l, int *r, int *t, int *b)
+{
+}
+
+void
_xre_image_surface_gen(XR_Image *im)
{
void *data = NULL;