forked from enlightenment/efl
parent
ab5d404765
commit
801bdf34d8
|
@ -923,14 +923,14 @@ evas_object_gradient_render_pre(Evas_Object *obj)
|
||||||
(obj->cur.color.g != obj->prev.color.g) ||
|
(obj->cur.color.g != obj->prev.color.g) ||
|
||||||
(obj->cur.color.b != obj->prev.color.b) ||
|
(obj->cur.color.b != obj->prev.color.b) ||
|
||||||
(obj->cur.color.a != obj->prev.color.a))
|
(obj->cur.color.a != obj->prev.color.a))
|
||||||
o->gradient_changed = 1;
|
{ o->gradient_changed = 1; o->changed = 1; }
|
||||||
if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) ||
|
if ((!o->gradient_changed) && ((obj->cur.cache.clip.r != obj->prev.cache.clip.r) ||
|
||||||
(obj->cur.cache.clip.g != obj->prev.cache.clip.g) ||
|
(obj->cur.cache.clip.g != obj->prev.cache.clip.g) ||
|
||||||
(obj->cur.cache.clip.b != obj->prev.cache.clip.b) ||
|
(obj->cur.cache.clip.b != obj->prev.cache.clip.b) ||
|
||||||
(obj->cur.cache.clip.a != obj->prev.cache.clip.a)))
|
(obj->cur.cache.clip.a != obj->prev.cache.clip.a)))
|
||||||
o->gradient_changed = 1;
|
{ o->gradient_changed = 1; o->changed = 1; }
|
||||||
if (!o->gradient_changed && (obj->cur.interpolation.color_space != obj->prev.interpolation.color_space))
|
if (!o->gradient_changed && (obj->cur.interpolation.color_space != obj->prev.interpolation.color_space))
|
||||||
o->gradient_changed = 1;
|
{ o->gradient_changed = 1; o->changed = 1; }
|
||||||
if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
|
if (!o->changed && (obj->cur.render_op != obj->prev.render_op))
|
||||||
o->changed = 1;
|
o->changed = 1;
|
||||||
if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
|
if (!o->changed && (obj->cur.anti_alias != obj->prev.anti_alias))
|
||||||
|
|
|
@ -384,7 +384,7 @@ linear_get_fill_func(RGBA_Gradient *gr, int op, unsigned char aa)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define AXIS_ALIGNED \
|
#define AXIS_ALIGNED \
|
||||||
( ((ayy == 0) || (ayx == 0)) && ((gdata->ca == 0.0) || (gdata->sa = 0.0)) )
|
( ((ayy == 0) || (ayx == 0)) && ((gdata->ca == 0.0) || (gdata->sa == 0.0)) )
|
||||||
|
|
||||||
#define SETUP_LINEAR_FILL \
|
#define SETUP_LINEAR_FILL \
|
||||||
if (gdata->at_angle) \
|
if (gdata->at_angle) \
|
||||||
|
|
|
@ -41,8 +41,14 @@
|
||||||
else
|
else
|
||||||
buf = pdst;
|
buf = pdst;
|
||||||
|
|
||||||
dsxx = (((srw == 1) ? (1 << 16) : ((srw - 1) << 16))) / ((drw == 1) ? 1 : (drw - 1));
|
if ((srw > 1) && (drw > 1))
|
||||||
dsyy = (((srh == 1) ? (1 << 16) : ((srh - 1) << 16))) / ((drh == 1) ? 1 : (drh - 1));
|
dsxx = ((srw - 1) << 16) / (drw - 1);
|
||||||
|
else
|
||||||
|
dsxx = (srw << 16) / drw;
|
||||||
|
if ((srh > 1) && (drh > 1))
|
||||||
|
dsyy = ((srh - 1) << 16) / (drh - 1);
|
||||||
|
else
|
||||||
|
dsyy = (srh << 16) / drh;
|
||||||
|
|
||||||
cx = dst_clip_x - drx;
|
cx = dst_clip_x - drx;
|
||||||
cy = dst_clip_y - dry;
|
cy = dst_clip_y - dry;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||||
*/
|
*/
|
||||||
#include "evas_common.h"
|
#include "evas_common.h"
|
||||||
#include "evas_macros.h"
|
//#include "evas_macros.h"
|
||||||
#include "evas_private.h"
|
#include "evas_private.h"
|
||||||
#include "evas_engine.h"
|
#include "evas_engine.h"
|
||||||
#include "Evas_Engine_XRender_X11.h"
|
#include "Evas_Engine_XRender_X11.h"
|
||||||
|
@ -307,7 +307,8 @@ _xr_render_surface_clips_set(Xrender_Surface *rs, RGBA_Draw_Context *dc, int rx,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* initialized the transform to the identity */
|
/* initialized the transform to the identity */
|
||||||
static void init_transform (XTransform *t)
|
static void
|
||||||
|
init_xtransform(XTransform *t)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
|
@ -316,6 +317,16 @@ static void init_transform (XTransform *t)
|
||||||
t->matrix[i][j] = XDoubleToFixed((i == j) ? 1 : 0);
|
t->matrix[i][j] = XDoubleToFixed((i == j) ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_xtransform_scale(XTransform *t, int sw, int sh, int w, int h)
|
||||||
|
{
|
||||||
|
if ((sw > 1) && (w > 1))
|
||||||
|
{ sw--; w--; }
|
||||||
|
if ((sh > 1) && (h > 1))
|
||||||
|
{ sh--; h--; }
|
||||||
|
t->matrix[0][0] = XDoubleToFixed((double)sw / (double)w);
|
||||||
|
t->matrix[1][1] = XDoubleToFixed((double)sh / (double)h);
|
||||||
|
}
|
||||||
|
|
||||||
// when color multiplier is used want: instead
|
// when color multiplier is used want: instead
|
||||||
// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check.
|
// CA src IN mask SRC temp; non-CA temp OVER dst. - i think. need to check.
|
||||||
|
@ -325,29 +336,45 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
Xrender_Surface *trs = NULL;
|
Xrender_Surface *trs = NULL;
|
||||||
XTransform xf;
|
XTransform xf;
|
||||||
XRenderPictureAttributes att;
|
XRenderPictureAttributes att;
|
||||||
Picture mask;
|
Picture mask = None;
|
||||||
int r, g, b, a, op;
|
int e, is_scaling, op;
|
||||||
int e, is_scaling;
|
|
||||||
|
|
||||||
if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
|
if ((sw <= 0) || (sh <= 0) || (w <= 0) || (h <= 0)) return;
|
||||||
|
|
||||||
is_scaling = (sw != w) || (sh != h);
|
is_scaling = e = ((sw != w) || (sh != h));
|
||||||
e = is_scaling ? 0 : 1;
|
|
||||||
|
|
||||||
att.clip_mask = None;
|
att.clip_mask = None;
|
||||||
XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att);
|
XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att);
|
||||||
XRenderChangePicture(srs->xinf->disp, drs->pic, CPClipMask, &att);
|
XRenderChangePicture(drs->xinf->disp, drs->pic, CPClipMask, &att);
|
||||||
|
|
||||||
op = PictOpSrc;
|
init_xtransform(&xf);
|
||||||
if (srs->alpha) op = PictOpOver;
|
|
||||||
mask = None;
|
op = PictOpOver;
|
||||||
|
if (dc->render_op == _EVAS_RENDER_BLEND)
|
||||||
|
{
|
||||||
|
if (!srs->alpha) op = PictOpSrc;
|
||||||
|
}
|
||||||
|
else if (dc->render_op == _EVAS_RENDER_BLEND_REL)
|
||||||
|
op = PictOpAtop;
|
||||||
|
else if (dc->render_op == _EVAS_RENDER_MUL)
|
||||||
|
op = PictOpIn;
|
||||||
|
else if (dc->render_op == _EVAS_RENDER_COPY)
|
||||||
|
op = PictOpSrc;
|
||||||
|
else if (dc->render_op == _EVAS_RENDER_COPY_REL)
|
||||||
|
op = PictOpIn;
|
||||||
|
else if (dc->render_op == _EVAS_RENDER_MASK)
|
||||||
|
op = PictOpInReverse;
|
||||||
|
|
||||||
if ((dc) && (dc->mul.use))
|
if ((dc) && (dc->mul.use))
|
||||||
{
|
{
|
||||||
r = (int)(R_VAL(&dc->mul.col));
|
int r, g, b, a;
|
||||||
g = (int)(G_VAL(&dc->mul.col));
|
|
||||||
b = (int)(B_VAL(&dc->mul.col));
|
if ((op == PictOpOver) && (!dc->mul.col)) return;
|
||||||
a = (int)(A_VAL(&dc->mul.col));
|
a = dc->mul.col >> 24;
|
||||||
if ((r != 0xff) || (g != 0xff) || (b != 0xff) || (a != 0xff))
|
r = (dc->mul.col >> 16) & 0xff;
|
||||||
|
g = (dc->mul.col >> 8) & 0xff;
|
||||||
|
b = dc->mul.col & 0xff;
|
||||||
|
if (dc->mul.col != 0xffffffff)
|
||||||
{
|
{
|
||||||
if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) ||
|
if ((srs->xinf->mul_r != r) || (srs->xinf->mul_g != g) ||
|
||||||
(srs->xinf->mul_b != b) || (srs->xinf->mul_a != a))
|
(srs->xinf->mul_b != b) || (srs->xinf->mul_a != a))
|
||||||
|
@ -360,9 +387,8 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
r, g, b, a,
|
r, g, b, a,
|
||||||
0, 0, 1, 1);
|
0, 0, 1, 1);
|
||||||
}
|
}
|
||||||
op = PictOpOver;
|
|
||||||
mask = srs->xinf->mul->pic;
|
mask = srs->xinf->mul->pic;
|
||||||
if ((r == 0xff) && (g == 0xff) && (b == 0xff) && (a != 0xff))
|
if (dc->mul.col == (a * 0x01010101))
|
||||||
{
|
{
|
||||||
att.component_alpha = 0;
|
att.component_alpha = 0;
|
||||||
XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
|
XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
|
||||||
|
@ -379,6 +405,7 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
|
|
||||||
att.component_alpha = 1;
|
att.component_alpha = 1;
|
||||||
XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
|
XRenderChangePicture(srs->xinf->disp, mask, CPComponentAlpha, &att);
|
||||||
|
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
||||||
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
|
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, mask,
|
||||||
trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
|
trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
|
||||||
/* fill right and bottom pixel so interpolation works right */
|
/* fill right and bottom pixel so interpolation works right */
|
||||||
|
@ -396,18 +423,19 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_transform(&xf);
|
|
||||||
xf.matrix[0][0] = XDoubleToFixed((double) sw / (double) w);
|
|
||||||
xf.matrix[1][1] = XDoubleToFixed((double) sh / (double) h);
|
|
||||||
|
|
||||||
_xr_render_surface_clips_set(drs, dc, x, y, w, h);
|
_xr_render_surface_clips_set(drs, dc, x, y, w, h);
|
||||||
if (trs)
|
if (trs)
|
||||||
{
|
{
|
||||||
if (is_scaling)
|
XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0);
|
||||||
XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0);
|
|
||||||
|
|
||||||
|
set_xtransform_scale(&xf, sw, sh, w, h);
|
||||||
XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf);
|
XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf);
|
||||||
|
|
||||||
|
att.component_alpha = 0;
|
||||||
|
if (dc->render_op == _EVAS_RENDER_MUL)
|
||||||
|
att.component_alpha = 1;
|
||||||
|
XRenderChangePicture(trs->xinf->disp, trs->pic, CPComponentAlpha, &att);
|
||||||
|
|
||||||
XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic,
|
XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic,
|
||||||
0, 0, 0, 0, x, y, w, h);
|
0, 0, 0, 0, x, y, w, h);
|
||||||
_xr_render_surface_free(trs);
|
_xr_render_surface_free(trs);
|
||||||
|
@ -420,8 +448,12 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
srs->fmt, srs->alpha);
|
srs->fmt, srs->alpha);
|
||||||
if (!trs) return;
|
if (!trs) return;
|
||||||
|
|
||||||
|
att.component_alpha = 0;
|
||||||
|
XRenderChangePicture(srs->xinf->disp, srs->pic, CPComponentAlpha, &att);
|
||||||
|
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
||||||
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
||||||
trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
|
trs->pic, sx, sy, 0, 0, 0, 0, sw, sh);
|
||||||
|
|
||||||
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
||||||
trs->pic, sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
|
trs->pic, sx + sw - 1, sy, 0, 0, sw, 0, 1, sh);
|
||||||
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None,
|
||||||
|
@ -431,17 +463,31 @@ _xr_render_surface_composite(Xrender_Surface *srs, Xrender_Surface *drs, RGBA_Dr
|
||||||
|
|
||||||
XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0);
|
XRenderSetPictureFilter(trs->xinf->disp, trs->pic, get_filter(smooth), NULL, 0);
|
||||||
|
|
||||||
|
set_xtransform_scale(&xf, sw, sh, w, h);
|
||||||
XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf);
|
XRenderSetPictureTransform(trs->xinf->disp, trs->pic, &xf);
|
||||||
|
|
||||||
|
if (dc->render_op == _EVAS_RENDER_MUL)
|
||||||
|
{
|
||||||
|
att.component_alpha = 1;
|
||||||
|
XRenderChangePicture(trs->xinf->disp, trs->pic, CPComponentAlpha, &att);
|
||||||
|
}
|
||||||
|
|
||||||
XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic,
|
XRenderComposite(trs->xinf->disp, op, trs->pic, mask, drs->pic,
|
||||||
0, 0, 0, 0, x, y, w, h);
|
0, 0, 0, 0, x, y, w, h);
|
||||||
_xr_render_surface_free(trs);
|
_xr_render_surface_free(trs);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (is_scaling)
|
XRenderSetPictureFilter(srs->xinf->disp, srs->pic, get_filter(smooth), NULL, 0);
|
||||||
XRenderSetPictureFilter(srs->xinf->disp, srs->pic, get_filter(smooth), NULL, 0);
|
|
||||||
|
|
||||||
|
set_xtransform_scale(&xf, sw, sh, w, h);
|
||||||
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
||||||
|
|
||||||
|
att.component_alpha = 0;
|
||||||
|
if (dc->render_op == _EVAS_RENDER_MUL)
|
||||||
|
att.component_alpha = 1;
|
||||||
|
XRenderChangePicture(srs->xinf->disp, srs->pic, CPComponentAlpha, &att);
|
||||||
|
|
||||||
XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic,
|
XRenderComposite(srs->xinf->disp, op, srs->pic, mask, drs->pic,
|
||||||
((sx * w) + (sw / 2)) / sw,
|
((sx * w) + (sw / 2)) / sw,
|
||||||
((sy * h) + (sh / 2)) / sh,
|
((sy * h) + (sh / 2)) / sh,
|
||||||
|
@ -458,21 +504,22 @@ _xr_render_surface_copy(Xrender_Surface *srs, Xrender_Surface *drs, int sx, int
|
||||||
|
|
||||||
if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
|
if ((w <= 0) || (h <= 0) || (!srs) || (!drs)) return;
|
||||||
|
|
||||||
|
init_xtransform(&xf);
|
||||||
#ifdef BROKEN_XORG_XRENDER
|
#ifdef BROKEN_XORG_XRENDER
|
||||||
/* FIXME: why do we need to change the identity matrix ifthe src surface
|
/* FIXME: why do we need to change the identity matrix ifthe src surface
|
||||||
* is 1 bit deep?
|
* is 1 bit deep?
|
||||||
*/
|
*/
|
||||||
if (srs->depth == 1)
|
if (srs->depth == 1)
|
||||||
{
|
{
|
||||||
init_transform(&xf);
|
|
||||||
xf.matrix[0][0] = xf.matrix[1][1] = xf.matrix[2][2] = 1;
|
xf.matrix[0][0] = xf.matrix[1][1] = xf.matrix[2][2] = 1;
|
||||||
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
XRenderSetPictureTransform(srs->xinf->disp, srs->pic, &xf);
|
||||||
|
// XRenderSetPictureFilter(srs->xinf->disp, srs->pic, FilterNearest, NULL, 0);
|
||||||
|
|
||||||
att.clip_mask = None;
|
att.clip_mask = None;
|
||||||
XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att);
|
XRenderChangePicture(srs->xinf->disp, srs->pic, CPClipMask, &att);
|
||||||
XRenderChangePicture(srs->xinf->disp, drs->pic, CPClipMask, &att);
|
XRenderChangePicture(drs->xinf->disp, drs->pic, CPClipMask, &att);
|
||||||
|
|
||||||
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None, drs->pic,
|
XRenderComposite(srs->xinf->disp, PictOpSrc, srs->pic, None, drs->pic,
|
||||||
sx, sy, 0, 0, x, y, w, h);
|
sx, sy, 0, 0, x, y, w, h);
|
||||||
|
|
Loading…
Reference in New Issue