+ACLOCAL_AMFLAGS = -I m4
+
SUBDIRS = data src proj
MAINTAINERCLEANFILES = Makefile.in aclocal.m4 config.guess \
AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_ISC_POSIX
+AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE(evas, 0.9.9.026)
AM_CONFIG_HEADER(config.h)
## Automatic check...
PKG_CHECK_MODULES(
XCB,
- xcb xcb-image xcb-icccm,
+ xcb xcb-shm xcb-image xcb-icccm,
[AC_CHECK_HEADER(
X11/X.h,
[have_evas_software_xcb="yes"],
PKG_CHECK_MODULES(
XCB,
- xcb xcb-image xcb-icccm,
+ xcb xcb-shm xcb-aux xcb-image xcb-icccm,
[AC_DEFINE(BUILD_ENGINE_SOFTWARE_XCB, 1, [Software XCB Rendering Backend])
xcb_cflags=$XCB_CFLAGS
xcb_libs=$XCB_LIBS
## Automatic check...
PKG_CHECK_MODULES(
- XCB,
- xcb xcb-image xcb-icccm,
+ XCBRENDER,
+ xcb xcb-shm xcb-render xcb-image xcb-icccm,
[AC_CHECK_HEADER(
X11/X.h,
[have_evas_xrender_xcb="yes"],
AC_PATH_XTRA
PKG_CHECK_MODULES(
- XCB,
- xcb xcb-image xcb-icccm,
+ XCBRENDER,
+ xcb xcb-shm xcb-render xcb-image xcb-icccm,
[AC_DEFINE(BUILD_ENGINE_XRENDER_XCB, 1, [Xrender XCB Rendering Backend])
- xcb_cflags=$XCB_CFLAGS
- xcb_libs=$XCB_LIBS
+ xcbrender_cflags=$XCBRENDER_CFLAGS
+ xcbrender_libs=$XCBRENDER_LIBS
ENGINE_XRENDER_XCB_PRG="evas_xrender_xcb_test"],
[AC_MSG_RESULT(disabling xrender XCB engine)
have_evas_xrender_xcb="no"])
AC_SUBST(xcb_cflags)
AC_SUBST(xcb_libs)
+AC_SUBST(xcbrender_cflags)
+AC_SUBST(xcbrender_libs)
AC_SUBST(gl_cflags)
AC_SUBST(gl_libs)
evas_xrender_x11_test_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
evas_xrender_xcb_test_SOURCES = evas_test_main.h evas_test_main.c evas_xrender_xcb_main.c
-evas_xrender_xcb_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @xcb_libs@
-evas_xrender_xcb_test_CFLAGS = $(CFLAGS) @xcb_cflags@
+evas_xrender_xcb_test_LDADD = $(top_builddir)/src/lib/libevas.la -lm @xcbrender_libs@
+evas_xrender_xcb_test_CFLAGS = $(CFLAGS) @xcbrender_cflags@
evas_xrender_xcb_test_DEPENDENCIES = $(top_builddir)/src/lib/libevas.la
EXTRA_DIST = evas_software_qtopia_main.h evas_software_qtopia_main.cpp
evas_blend_pixel_mul_pixel.c \
evas_blend_pixel_pixel.c \
evas_blit_main.c \
+evas_circle_main.c \
evas_convert_color.c \
evas_convert_gry_1.c \
evas_convert_gry_4.c \
}
}
return 0;
-}
\ No newline at end of file
+}
evas_xcb_buffer.c \
evas_xcb_color.c \
evas_xcb_main.c \
-Evas_Engine_Software_Xcb.h
\ No newline at end of file
+Evas_Engine_Software_Xcb.h
return re;
}
-static XCBSCREEN *
-_screen_get(XCBConnection *conn, int screen)
-{
- XCBSCREENIter i;
- int cur;
-
- if (!conn) return NULL;
-
- i = XCBConnSetupSuccessRepRootsIter(XCBGetSetup(conn));
- if (screen > i.rem - 1) return NULL; /* screen must be between 0 and i.rem - 1 */
- for (cur = 0; cur <= screen; XCBSCREENNext(&i), ++cur);
-
- return i.data;
-}
-
static XCBVISUALTYPE *
_best_visual_get(XCBConnection *conn, int screen)
{
XCBSCREEN *scr;
- XCBDEPTH *d;
- XCBVISUALTYPEIter iter;
- int cur;
if (!conn) return NULL;
- scr = _screen_get(conn, screen);
+ scr = XCBAuxGetScreen(conn, screen);
if (!scr) return NULL;
- d = XCBSCREENAllowedDepthsIter(scr).data;
- if (!d) return NULL;
-
- iter = XCBDEPTHVisualsIter(d);
- for (cur = 0 ; cur < iter.rem ; XCBVISUALTYPENext(&iter), ++cur)
- if (scr->root_visual.id == iter.data->visual_id.id)
- return iter.data;
- return NULL;
+ return XCBAuxGetVisualtype (conn, screen, scr->root_visual);
}
static XCBCOLORMAP
c.xid = 0;
if (!conn) return c;
- scr = _screen_get(conn, screen);
+ scr = XCBAuxGetScreen(conn, screen);
if (!scr) return c;
return scr->default_colormap;
XCBSCREEN *scr;
if (!conn) return 0;
- scr = _screen_get(conn, screen);
+ scr = XCBAuxGetScreen(conn, screen);
if (!scr) return 0;
return scr->root_depth;
#ifndef EVAS_ENGINE_H
#define EVAS_ENGINE_H
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
#include <X11/XCB/xcb.h>
#include <X11/XCB/shm.h>
+#include <X11/XCB/xcb_aux.h>
#include <X11/XCB/xcb_image.h>
-#include <sys/ipc.h>
-#include <sys/shm.h>
typedef struct _Outbuf Outbuf;
typedef struct _Outbuf_Perf Outbuf_Perf;
strlen (type_str),
type_str),
NULL);
+ if (!rep) return;
+
type = rep->atom;
format = STRING;
strlen(str), str);
/* XSync(perf->x.disp, False); */
free(str);
+ free (rep);
}
Outbuf_Perf *
char *type_str;
XCBATOM type, format;
Outbuf_Perf *perf;
- char *retval;
- int retnum;
perf = evas_software_xcb_outbuf_perf_new_x(conn, draw, vis, cmap, x_depth);
NULL);
type = type_rep->atom;
format = STRING;
- retval = NULL;
cookie = XCBGetProperty(conn, 0, perf->x.root.window,
type, format,
0, 16384);
prop_rep = XCBGetPropertyReply(conn, cookie, NULL);
- retval = XCBGetPropertyValue(prop_rep);
- retnum = XCBGetPropertyValueLength(prop_rep);
- if (retval)
+ if ((prop_rep) &&
+ (prop_rep->format == 8) &&
+ (prop_rep->type.xid == type.xid))
{
- if ((prop_rep->format == 8) &&
- (prop_rep->type.xid == type.xid))
- {
- char *s;
+ char *retval;
+ int retnum;
- s = malloc(retnum + 1);
- strncpy(s, retval, retnum);
- s[retnum] = 0;
- evas_software_xcb_outbuf_perf_deserialize_x(perf, s);
- free(s);
- }
- /* FIXME: doesn't seem to be need (from valgrind) */
-/* free(retval); */
+ retval = XCBGetPropertyValue(prop_rep);
+ retnum = XCBGetPropertyValueLength(prop_rep);
+ retval[retnum] = '\0';
+ evas_software_xcb_outbuf_perf_deserialize_x(perf, retval);
}
+
+ if (prop_rep)
+ free(prop_rep);
+
return perf;
}
MAINTAINERCLEANFILES = Makefile.in
-INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/modules/engines @FREETYPE_CFLAGS@ @xcb_cflags@
+INCLUDES = -I. -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/lib/include -I$(top_srcdir)/src/modules/engines @FREETYPE_CFLAGS@ @xcbrender_cflags@
if BUILD_ENGINE_XRENDER_XCB
evas_engine_font.c \
evas_engine_gradient.c
-module_la_LIBADD = @xcb_libs@ $(top_builddir)/src/lib/libevas.la
+module_la_LIBADD = @xcbrender_libs@ $(top_builddir)/src/lib/libevas.la
module_la_LDFLAGS = -module -avoid-version -L$(top_builddir)/src/lib -L$(top_builddir)/src/lib/.libs
module_la_DEPENDENCIES = $(top_builddir)/config.h
{
Render_Engine *re;
Evas_Engine_Info_XRender_Xcb *info;
+ int resize = 1;
info = (Evas_Engine_Info_XRender_Xcb *)in;
if (!e->engine.data.output)
if (re->tb)
evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
e->engine.data.output = re;
+ resize = 0;
}
re = e->engine.data.output;
if (!re) return;
re->xcbinf = _xr_image_info_get(re->conn, re->win, re->vis);
if (re->output) _xr_render_surface_free(re->output);
- re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, 0);
- if (re->mask.xid)
- {
- XCBDRAWABLE draw;
-
- if (re->mask_output) _xr_render_surface_free(re->mask_output);
- draw.pixmap = re->mask;
- re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw,
- e->output.w, e->output.h,
- re->xcbinf->fmt1, 1);
- }
+ if (re->mask_output) _xr_render_surface_free(re->mask_output);
+ if (!re->mask.xid)
+ re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, re->destination_alpha);
+ else
+ re->output = _xr_render_surface_adopt(re->xcbinf, re->win, e->output.w, e->output.h, 0);
+ if (re->mask.xid) {
+ XCBDRAWABLE draw;
+
+ draw.pixmap = re->mask;
+ re->mask_output = _xr_render_surface_format_adopt(re->xcbinf, draw,
+ e->output.w, e->output.h,
+ re->xcbinf->fmt1, 1);
+ }
else
re->mask_output = NULL;
+ if (resize)
+ {
+ if (re->tb) evas_common_tilebuf_free(re->tb);
+ if ((e->output.w > 0) && (e->output.h > 0))
+ re->tb = evas_common_tilebuf_new(e->output.w, e->output.h);
+ else
+ re->tb = evas_common_tilebuf_new(1, 1);
+ if (re->tb)
+ evas_common_tilebuf_set_tile_size(re->tb, TILESIZE, TILESIZE);
+ }
}
static void
ww = w; hh = h;
RECTS_CLIP_TO_RECT(x, y, ww, hh, 0, 0, im->w, im->h);
old_surface = im->surface;
- im->surface = _xr_render_surface_new(old_surface->xcbinf, w, h, old_surface->fmt, old_surface->alpha);
+ im->surface = _xr_render_surface_new(old_surface->xcbinf,
+ w + 1, h + 1, old_surface->fmt, old_surface->alpha);
if (im->surface)
_xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, ww, hh);
_xr_render_surface_free(old_surface);
old_surface = im->surface;
im->surface = NULL;
if (im->alpha)
- im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt32, 1);
+ im->surface = _xr_render_surface_new(im->xcbinf,
+ im->w + 1, im->h + 1, im->xcbinf->fmt32, 1);
else
- im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt24, 0);
+ im->surface = _xr_render_surface_new(im->xcbinf,
+ im->w + 1, im->h + 1, im->xcbinf->fmt24, 0);
if (im->surface)
- _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w, im->h);
+ _xr_render_surface_copy(old_surface,
+ im->surface, 0, 0, 0, 0, im->w + 1, im->h + 1);
_xr_render_surface_free(old_surface);
}
if (im->updates)
}
if (im->alpha)
{
- im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt32, 1);
+ im->surface = _xr_render_surface_new(im->xcbinf,
+ im->w + 1, im->h + 1, im->xcbinf->fmt32, 1);
_xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h);
}
else
{
- im->surface = _xr_render_surface_new(im->xcbinf, im->w, im->h, im->xcbinf->fmt24, 0);
+ im->surface = _xr_render_surface_new(im->xcbinf,
+ im->w + 1, im->h + 1, im->xcbinf->fmt24, 0);
_xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h);
- }
+ }
+ /* fill right and bottom pixel so interpolation works right */
+ _xr_render_surface_copy(im->surface, im->surface,
+ im->w - 1, 0,
+ im->w, 0,
+ 1, im->h);
+ _xr_render_surface_copy(im->surface, im->surface,
+ 0, im->h - 1,
+ 0, im->h,
+ im->w, 1);
+ _xr_render_surface_copy(im->surface, im->surface,
+ im->w - 1, im->h - 1,
+ im->w, im->h,
+ 1, 1);
if ((im->im) && (!im->dirty))
{
evas_common_image_unref(im->im);
CARD32 mask;
CARD32 values[3];
- rs = calloc(1, sizeof(XCBrender_Surface));
-
fmt = XCBRenderFindVisualFormat(xcbinf->conn, xcbinf->vis);
+ if (!fmt) return NULL;
+ rs = calloc(1, sizeof(XCBrender_Surface));
rs->xcbinf = xcbinf;
rs->w = w;
rs->h = h;
void
_xr_render_surface_composite(XCBrender_Surface *srs, XCBrender_Surface *drs, RGBA_Draw_Context *dc, int sx, int sy, int sw, int sh, int x, int y, int w, int h, int smooth)
{
+ XCBrender_Surface *trs = NULL;
XCBRenderTRANSFORM xf;
XCBRenderPICTURE mask;
CARD32 value_mask;
int op;
if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
+ value_mask = XCBRenderCPClipMask;
+ value_list[0] = 0;
+ XCBRenderChangePicture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
+ XCBRenderChangePicture(srs->xcbinf->conn, drs->pic, value_mask, value_list);
+
+ op = XCBRenderPictOpSrc;
+ if (srs->alpha) op = XCBRenderPictOpOver;
+ mask.xid = 0;
+ if ((dc) && (dc->mul.use))
+ {
+ r = (int)(R_VAL(&dc->mul.col));
+ g = (int)(G_VAL(&dc->mul.col));
+ b = (int)(B_VAL(&dc->mul.col));
+ a = (int)(A_VAL(&dc->mul.col));
+ if ((r != 0xff) || (g != 0xff) || (b != 0xff) || (a != 0xff))
+ {
+ if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) ||
+ (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a))
+ {
+ srs->xcbinf->mul_r = r;
+ srs->xcbinf->mul_g = g;
+ srs->xcbinf->mul_b = b;
+ srs->xcbinf->mul_a = a;
+ _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul,
+ r,
+ g,
+ b,
+ a,
+ 0, 0, 1, 1);
+ }
+ op = XCBRenderPictOpOver;
+ value_mask = XCBRenderCPComponentAlpha;
+ value_list[0] = 1;
+ XCBRenderChangePicture(srs->xcbinf->conn, mask, value_mask, value_list);
+ if ((r == 0xff) && (g == 0xff) && (b == 0xff) && (a != 0xff))
+ {
+ }
+ else
+ {
+ xf.matrix11 = 1;
+ xf.matrix12 = 0;
+ xf.matrix13 = 0;
+
+ xf.matrix21 = 0;
+ xf.matrix22 = 1;
+ xf.matrix23 = 0;
+
+ xf.matrix31 = 0;
+ xf.matrix32 = 0;
+ xf.matrix33 = 1;
+ trs = _xr_render_surface_new(srs->xcbinf, sw, sh, srs->fmt, srs->alpha);
+ XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf);
+ XCBRenderComposite(srs->xcbinf->conn, XCBRenderPictOpSrc, srs->pic, mask, trs->pic,
+ sx, sy, 0, 0, 0, 0, sw, sh);
+ mask.xid = 0;
+ }
+ }
+ }
+
sf = MAX(sw, sh);
#define BMAX 26
xf.matrix32 = 0;
xf.matrix33 = sf;
- op = XCBRenderPictOpSrc;
- if (srs->alpha) op = XCBRenderPictOpOver;
- mask.xid = 0;
- if ((dc) && (dc->mul.use))
+ _xr_render_surface_clips_set(drs, dc, x, y, w, h);
+ if (trs)
{
- r = (int)(R_VAL(&dc->mul.col));
- g = (int)(G_VAL(&dc->mul.col));
- b = (int)(B_VAL(&dc->mul.col));
- a = (int)(A_VAL(&dc->mul.col));
- if ((r != 0xff) || (g != 0xff) || (b != 0xff) || (a != 0xff))
- {
- if ((srs->xcbinf->mul_r != r) || (srs->xcbinf->mul_g != g) ||
- (srs->xcbinf->mul_b != b) || (srs->xcbinf->mul_a != a))
- {
- srs->xcbinf->mul_r = r;
- srs->xcbinf->mul_g = g;
- srs->xcbinf->mul_b = b;
- srs->xcbinf->mul_a = a;
- _xr_render_surface_solid_rectangle_set(srs->xcbinf->mul, r, g, b, a, 0, 0, 1, 1);
- }
- op = XCBRenderPictOpOver;
- mask = srs->xcbinf->mul->pic;
- }
+ if (smooth)
+ XCBRenderSetPictureFilter (trs->xcbinf->conn, trs->pic, strlen ("best"), "best", 0, NULL);
+ else
+ XCBRenderSetPictureFilter (trs->xcbinf->conn, trs->pic, strlen ("nearest"), "nearest", 0, NULL);
+ XCBRenderSetPictureTransform(trs->xcbinf->conn, trs->pic, xf);
+
+ XCBRenderComposite(srs->xcbinf->conn, op, trs->pic, mask, drs->pic,
+ 0, 0, 0, 0, x, y, w, h);
+ _xr_render_surface_free(trs);
}
-
- XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf);
- value_mask = XCBRenderCPClipMask;
- value_list[0] = 0;
- XCBRenderChangePicture(srs->xcbinf->conn, srs->pic, value_mask, value_list);
- XCBRenderChangePicture(srs->xcbinf->conn, drs->pic, value_mask, value_list);
-
- if (smooth) XCBRenderSetPictureFilter(srs->xcbinf->conn, srs->pic, strlen("best"), "best", 0, NULL);
- else XCBRenderSetPictureFilter(srs->xcbinf->conn, srs->pic, strlen("nearest"), "nearest", 0, NULL);
-
- _xr_render_surface_clips_set(drs, dc, x, y, w, h);
- XCBRenderComposite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic,
- ((sx * w) + (sw / 2)) / sw,
- ((sy * h) + (sh / 2)) / sh,
- 0, 0, x, y, w, h);
+ else
+ {
+ if (smooth)
+ XCBRenderSetPictureFilter (srs->xcbinf->conn, srs->pic, strlen ("best"), "best", 0, NULL);
+ else
+ XCBRenderSetPictureFilter (srs->xcbinf->conn, srs->pic, strlen ("nearest"), "nearest", 0, NULL);
+ XCBRenderSetPictureTransform(srs->xcbinf->conn, srs->pic, xf);
+
+ XCBRenderComposite(srs->xcbinf->conn, op, srs->pic, mask, drs->pic,
+ ((sx * w) + (sw / 2)) / sw,
+ ((sy * h) + (sh / 2)) / sh,
+ 0, 0, x, y, w, h);
+ }
}
void
CARD32 value_mask;
CARD32 value_list[1];
- if ((w <= 0) || (h <= 0)) return;
+ if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
xf.matrix11 = 1;
xf.matrix12 = 0;
xf.matrix13 = 0;
uint32 num_pixels;
int fd;
uint16 magic_number;
-
+
if (!file)
return 0;