From 87f4bedb81df1e7062aff124d25c6dcd5635f3aa Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 7 Apr 2008 23:07:23 +0000 Subject: [PATCH] if xrender is on a 16bpp target - do some "faster" paths - i hope. SVN revision: 34216 --- .../modules/engines/xrender_x11/evas_engine.c | 2 +- .../modules/engines/xrender_x11/evas_engine.h | 1 + .../engines/xrender_x11/evas_engine_font.c | 13 ++- .../engines/xrender_x11/evas_engine_image.c | 24 +++++- .../engines/xrender_x11/evas_engine_ximage.c | 7 +- .../engines/xrender_x11/evas_engine_xrender.c | 84 ++++++++++++------- 6 files changed, 94 insertions(+), 37 deletions(-) diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c index 967c68595f..8a6f768662 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.c @@ -251,7 +251,7 @@ eng_output_redraws_next_update_get(void *data, int *x, int *y, int *w, int *h, i _xr_render_surface_solid_rectangle_set(surface, 0, 0, 0, 0, 0, 0, uw, uh); return surface; } - return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmt24, 0); + return _xr_render_surface_new(re->xinf, uw, uh, re->xinf->fmtdef, 0); } static void diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h index 40683e7483..08be33486a 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine.h @@ -28,6 +28,7 @@ struct _Ximage_Info XRenderPictFormat *fmt8; XRenderPictFormat *fmt4; XRenderPictFormat *fmt1; + XRenderPictFormat *fmtdef; unsigned char mul_r, mul_g, mul_b, mul_a; Xrender_Surface *mul; int references; diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_font.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_font.c index 76cd93c930..557fb79f05 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_font.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_font.c @@ -12,6 +12,7 @@ _xre_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg) DATA8 *data; int w, h, j; XRenderPictureAttributes att; + XRenderPictFormat *fmt; Ximage_Image *xim; Evas_Hash *pool; char buf[256], buf2[256]; @@ -52,14 +53,18 @@ _xre_font_surface_new(Ximage_Info *xinf, RGBA_Font_Glyph *fg) snprintf(buf2, sizeof(buf2), "%p", fg); pool = evas_hash_add(pool, buf2, fs); _xr_fg_pool = evas_hash_add(_xr_fg_pool, buf, pool); - - fs->draw = XCreatePixmap(xinf->disp, xinf->root, w, h, xinf->fmt8->depth); + + /* FIXME: maybe use fmt4? */ + fmt = xinf->fmt8; + fs->draw = XCreatePixmap(xinf->disp, xinf->root, w, h,fmt->depth); att.dither = 0; att.component_alpha = 0; att.repeat = 0; - fs->pic = XRenderCreatePicture(xinf->disp, fs->draw, xinf->fmt8, CPRepeat | CPDither | CPComponentAlpha, &att); + fs->pic = XRenderCreatePicture(xinf->disp, fs->draw,fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); - xim = _xr_image_new(fs->xinf, w, h, xinf->fmt8->depth); + /* FIXME: handle if fmt->depth != 8 */ + xim = _xr_image_new(fs->xinf, w, h,fmt->depth); if ((fg->glyph_out->bitmap.num_grays == 256) && (fg->glyph_out->bitmap.pixel_mode == ft_pixel_mode_grays)) { diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c index 34c8136bb1..68b09093b3 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_image.c @@ -490,7 +490,16 @@ _xre_image_alpha_set(XR_Image *im, int alpha) if (im->alpha) im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt32, 1); else - im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + { + /* FIXME: if im->depth == 16, use xinf->fmtdef */ + if ((im->xinf->depth == 16) && + (im->xinf->vis->red_mask == 0xf800) && + (im->xinf->vis->green_mask == 0x07e0) && + (im->xinf->vis->blue_mask == 0x001f)) + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmtdef, 0); + else + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + } if (im->surface) _xr_render_surface_copy(old_surface, im->surface, 0, 0, 0, 0, im->w + 2, im->h + 2); _xr_render_surface_free(old_surface); @@ -597,6 +606,8 @@ _xre_image_surface_gen(XR_Image *im) if (im->alpha) _xr_render_surface_argb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); else + /* FIXME: if im->depth == 16 - convert to 16bpp then + * upload */ _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, rx, ry, rw, rh, 1, 1); } evas_common_tilebuf_free_render_rects(rects); @@ -614,7 +625,16 @@ _xre_image_surface_gen(XR_Image *im) } else { - im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + /* FIXME: if im->xinf->depth == 16, use xinf->fmtdef */ + if ((im->xinf->depth == 16) && + (im->xinf->vis->red_mask == 0xf800) && + (im->xinf->vis->green_mask == 0x07e0) && + (im->xinf->vis->blue_mask == 0x001f)) + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmtdef, 0); + else + im->surface = _xr_render_surface_new(im->xinf, im->w + 2, im->h + 2, im->xinf->fmt24, 0); + /* FIXME: if im->depth == 16 - convert to 16bpp then + * upload */ _xr_render_surface_rgb_pixels_fill(im->surface, im->w, im->h, data, 0, 0, im->w, im->h, 1, 1); } /* fill borders */ diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_ximage.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_ximage.c index 64f92075a7..81470bb83c 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_ximage.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_ximage.c @@ -37,13 +37,18 @@ _xr_image_info_get(Display *disp, Drawable draw, Visual *vis) xinf->references = 1; xinf->disp = disp; xinf->draw = draw; - XGetGeometry(xinf->disp, xinf->draw, &(xinf->root), &di, &di, &dui, &dui, &dui, &dui); + XGetGeometry(xinf->disp, xinf->draw, &(xinf->root), + &di, &di, &dui, &dui, &dui, &dui); xinf->vis = vis; xinf->fmt32 = XRenderFindStandardFormat(xinf->disp, PictStandardARGB32); xinf->fmt24 = XRenderFindStandardFormat(xinf->disp, PictStandardRGB24); xinf->fmt8 = XRenderFindStandardFormat(xinf->disp, PictStandardA8); xinf->fmt4 = XRenderFindStandardFormat(xinf->disp, PictStandardA4); xinf->fmt1 = XRenderFindStandardFormat(xinf->disp, PictStandardA1); + + /* find fmt for default visual */ + xinf->fmtdef = XRenderFindVisualFormat(xinf->disp, xinf->vis); + xinf->mul = _xr_render_surface_new(xinf, 1, 1, xinf->fmt32, 1); _xr_render_surface_repeat_set(xinf->mul, 1); xinf->mul_r = xinf->mul_g = xinf->mul_b = xinf->mul_a = 0xff; diff --git a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c index e9bb7c31fb..edb3d66154 100644 --- a/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c +++ b/legacy/evas/src/modules/engines/xrender_x11/evas_engine_xrender.c @@ -46,10 +46,11 @@ _xr_render_surface_new(Ximage_Info *xinf, int w, int h, XRenderPictFormat *fmt, return NULL; } rs->xinf->references++; - att.dither = 0; + att.dither = 1; att.component_alpha = 0; att.repeat = 0; - rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att); + rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); if (rs->pic == None) { XFreePixmap(rs->xinf->disp, rs->draw); @@ -82,10 +83,11 @@ _xr_render_surface_adopt(Ximage_Info *xinf, Drawable draw, int w, int h, int alp rs->allocated = 0; rs->draw = draw; rs->xinf->references++; - att.dither = 0; + att.dither = 1; att.component_alpha = 0; att.repeat = 0; - rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, CPRepeat | CPDither | CPComponentAlpha, &att); + rs->pic = XRenderCreatePicture(xinf->disp, rs->draw, fmt, + CPRepeat | CPDither | CPComponentAlpha, &att); if (rs->pic == None) { rs->xinf->references--; @@ -223,38 +225,62 @@ _xr_render_surface_rgb_pixels_fill(Xrender_Surface *rs, int sw, int sh, void *pi if (!xim) return; p = (unsigned int *)xim->data; sp = ((unsigned int *)pixels) + (y * sw) + x; - jump = ((xim->line_bytes / 4) - w); sjump = sw - w; spe = sp + ((h - 1) * sw) + w; - if -#ifdef WORDS_BIGENDIAN - (xim->xim->byte_order == LSBFirst) -#else - (xim->xim->byte_order == MSBFirst) -#endif + if (rs->depth == 16) { - while (sp < spe) - { - sple = sp + w; - while (sp < sple) - { - *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff; -// *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; - sp++; - } - p += jump; - sp += sjump; - } + jump = ((xim->line_bytes / 2) - w); + /* FIXME: if rs->depth == 16 - convert */ + Gfx_Func_Convert conv_func; + int swap; + +#ifdef WORDS_BIGENDIAN + swap = (int)(xim->xim->byte_order == LSBFirst); +#else + swap = (int)(xim->xim->byte_order == MSBFirst); +#endif + /* FIXME: swap not handled */ + conv_func = evas_common_convert_func_get(sp, w, h, rs->depth, + rs->xinf->vis->red_mask, + rs->xinf->vis->green_mask, + rs->xinf->vis->blue_mask, + PAL_MODE_NONE, 0); + if (conv_func) + conv_func(sp, p, sjump, jump, w, h, x, y, NULL); } else { - while (sp < spe) + jump = ((xim->line_bytes / 4) - w); + if +#ifdef WORDS_BIGENDIAN + (xim->xim->byte_order == LSBFirst) +#else + (xim->xim->byte_order == MSBFirst) +#endif + { + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + { + *p++ = (*sp << 24) + ((*sp << 8) & 0xff0000) + ((*sp >> 8) & 0xff00) + 0xff; +// *p++ = ((B_VAL(sp)) << 24) | ((G_VAL(sp)) << 16) | ((R_VAL(sp)) << 8) | 0x000000ff; + sp++; + } + p += jump; + sp += sjump; + } + } + else { - sple = sp + w; - while (sp < sple) - *p++ = 0xff000000 | *sp++; - p += jump; - sp += sjump; + while (sp < spe) + { + sple = sp + w; + while (sp < sple) + *p++ = 0xff000000 | *sp++; + p += jump; + sp += sjump; + } } } _xr_image_put(xim, rs->draw, x + ox, y + oy, w, h);