Fix #2488 for fb too: sample pixel center when transforming.
This commit is contained in:
parent
ea5e0eabd1
commit
ed18d776f0
|
@ -2726,8 +2726,9 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 *
|
||||||
xFixed_32_32 l;
|
xFixed_32_32 l;
|
||||||
xFixed_48_16 dx, dy, a, b, off;
|
xFixed_48_16 dx, dy, a, b, off;
|
||||||
|
|
||||||
v.vector[0] = IntToxFixed(x);
|
/* reference point is the center of the pixel */
|
||||||
v.vector[1] = IntToxFixed(y);
|
v.vector[0] = IntToxFixed(x) + xFixed1/2;
|
||||||
|
v.vector[1] = IntToxFixed(y) + xFixed1/2;
|
||||||
v.vector[2] = xFixed1;
|
v.vector[2] = xFixed1;
|
||||||
if (pict->transform) {
|
if (pict->transform) {
|
||||||
if (!PictureTransformPoint3d (pict->transform, &v))
|
if (!PictureTransformPoint3d (pict->transform, &v))
|
||||||
|
@ -2793,8 +2794,9 @@ static void fbFetchSourcePict(PicturePtr pict, int x, int y, int width, CARD32 *
|
||||||
|
|
||||||
if (pict->transform) {
|
if (pict->transform) {
|
||||||
PictVector v;
|
PictVector v;
|
||||||
v.vector[0] = IntToxFixed(x);
|
/* reference point is the center of the pixel */
|
||||||
v.vector[1] = IntToxFixed(y);
|
v.vector[0] = IntToxFixed(x) + xFixed1/2;
|
||||||
|
v.vector[1] = IntToxFixed(y) + xFixed1/2;
|
||||||
v.vector[2] = xFixed1;
|
v.vector[2] = xFixed1;
|
||||||
if (!PictureTransformPoint3d (pict->transform, &v))
|
if (!PictureTransformPoint3d (pict->transform, &v))
|
||||||
return;
|
return;
|
||||||
|
@ -2914,8 +2916,9 @@ static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32
|
||||||
dx = pict->pDrawable->x;
|
dx = pict->pDrawable->x;
|
||||||
dy = pict->pDrawable->y;
|
dy = pict->pDrawable->y;
|
||||||
|
|
||||||
v.vector[0] = IntToxFixed(x - dx);
|
/* reference point is the center of the pixel */
|
||||||
v.vector[1] = IntToxFixed(y - dy);
|
v.vector[0] = IntToxFixed(x - dx) + xFixed1 / 2;
|
||||||
|
v.vector[1] = IntToxFixed(y - dy) + xFixed1 / 2;
|
||||||
v.vector[2] = xFixed1;
|
v.vector[2] = xFixed1;
|
||||||
|
|
||||||
/* when using convolution filters one might get here without a transform */
|
/* when using convolution filters one might get here without a transform */
|
||||||
|
@ -3020,6 +3023,12 @@ static void fbFetchTransformed(PicturePtr pict, int x, int y, int width, CARD32
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (pict->filter == PictFilterBilinear) {
|
} else if (pict->filter == PictFilterBilinear) {
|
||||||
|
/* adjust vector for maximum contribution at 0.5, 0.5 of each texel. */
|
||||||
|
v.vector[0] -= v.vector[2] / 2;
|
||||||
|
v.vector[1] -= v.vector[2] / 2;
|
||||||
|
unit.vector[0] -= unit.vector[2] / 2;
|
||||||
|
unit.vector[1] -= unit.vector[2] / 2;
|
||||||
|
|
||||||
if (pict->repeatType == RepeatNormal) {
|
if (pict->repeatType == RepeatNormal) {
|
||||||
if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
|
if (REGION_NUM_RECTS(pict->pCompositeClip) == 1) {
|
||||||
for (i = 0; i < width; ++i) {
|
for (i = 0; i < width; ++i) {
|
||||||
|
|
Loading…
Reference in New Issue