|
@@ -75,197 +75,8 @@ static bool _arrange(const SwImage* image, const SwBBox* region, int& yStart, in
|
|
|
|
|
|
static bool _rasterMaskedPolygonImageSegment(SwSurface* surface, const SwImage* image, const SwBBox* region, int yStart, int yEnd, AASpans* aaSpans, uint8_t opacity, uint8_t dirFlag = 0)
|
|
|
{
|
|
|
+ TVGERR("SW_ENGINE", "TODO: _rasterMaskedPolygonImageSegment()");
|
|
|
return false;
|
|
|
-
|
|
|
-#if 0 //Enable it when GRAYSCALE image is supported
|
|
|
- auto maskOp = _getMaskOp(surface->compositor->method);
|
|
|
- auto direct = _direct(surface->compositor->method);
|
|
|
- float _dudx = dudx, _dvdx = dvdx;
|
|
|
- float _dxdya = dxdya, _dxdyb = dxdyb, _dudya = dudya, _dvdya = dvdya;
|
|
|
- float _xa = xa, _xb = xb, _ua = ua, _va = va;
|
|
|
- auto sbuf = image->buf8;
|
|
|
- int32_t sw = static_cast<int32_t>(image->stride);
|
|
|
- int32_t sh = image->h;
|
|
|
- int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay;
|
|
|
- int32_t vv = 0, uu = 0;
|
|
|
- int32_t minx = INT32_MAX, maxx = 0;
|
|
|
- float dx, u, v, iptr;
|
|
|
- SwSpan* span = nullptr; //used only when rle based.
|
|
|
-
|
|
|
- if (!_arrange(image, region, yStart, yEnd)) return false;
|
|
|
-
|
|
|
- //Loop through all lines in the segment
|
|
|
- uint32_t spanIdx = 0;
|
|
|
-
|
|
|
- if (region) {
|
|
|
- minx = region->min.x;
|
|
|
- maxx = region->max.x;
|
|
|
- } else {
|
|
|
- span = image->rle->spans;
|
|
|
- while (span->y < yStart) {
|
|
|
- ++span;
|
|
|
- ++spanIdx;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- y = yStart;
|
|
|
-
|
|
|
- while (y < yEnd) {
|
|
|
- x1 = (int32_t)_xa;
|
|
|
- x2 = (int32_t)_xb;
|
|
|
-
|
|
|
- if (!region) {
|
|
|
- minx = INT32_MAX;
|
|
|
- maxx = 0;
|
|
|
- //one single row, could be consisted of multiple spans.
|
|
|
- while (span->y == y && spanIdx < image->rle->size) {
|
|
|
- if (minx > span->x) minx = span->x;
|
|
|
- if (maxx < span->x + span->len) maxx = span->x + span->len;
|
|
|
- ++span;
|
|
|
- ++spanIdx;
|
|
|
- }
|
|
|
- }
|
|
|
- if (x1 < minx) x1 = minx;
|
|
|
- if (x2 > maxx) x2 = maxx;
|
|
|
-
|
|
|
- //Anti-Aliasing frames
|
|
|
- ay = y - aaSpans->yStart;
|
|
|
- if (aaSpans->lines[ay].x[0] > x1) aaSpans->lines[ay].x[0] = x1;
|
|
|
- if (aaSpans->lines[ay].x[1] < x2) aaSpans->lines[ay].x[1] = x2;
|
|
|
-
|
|
|
- //Range allowed
|
|
|
- if ((x2 - x1) >= 1 && (x1 < maxx) && (x2 > minx)) {
|
|
|
-
|
|
|
- //Perform subtexel pre-stepping on UV
|
|
|
- dx = 1 - (_xa - x1);
|
|
|
- u = _ua + dx * _dudx;
|
|
|
- v = _va + dx * _dvdx;
|
|
|
-
|
|
|
- x = x1;
|
|
|
-
|
|
|
- auto cmp = &surface->compositor->image.buf8[y * surface->compositor->image.stride + x1];
|
|
|
- auto dst = &surface->buf8[y * surface->stride + x1];
|
|
|
-
|
|
|
- if (opacity == 255) {
|
|
|
- //Draw horizontal line
|
|
|
- while (x++ < x2) {
|
|
|
- uu = (int) u;
|
|
|
- if (uu >= sw) continue;
|
|
|
- vv = (int) v;
|
|
|
- if (vv >= sh) continue;
|
|
|
-
|
|
|
- ar = (int)(255 * (1 - modff(u, &iptr)));
|
|
|
- ab = (int)(255 * (1 - modff(v, &iptr)));
|
|
|
- iru = uu + 1;
|
|
|
- irv = vv + 1;
|
|
|
-
|
|
|
- px = *(sbuf + (vv * sw) + uu);
|
|
|
-
|
|
|
- /* horizontal interpolate */
|
|
|
- if (iru < sw) {
|
|
|
- /* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
- px = INTERPOLATE(px, px2, ar);
|
|
|
- }
|
|
|
- /* vertical interpolate */
|
|
|
- if (irv < sh) {
|
|
|
- /* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
-
|
|
|
- /* horizontal interpolate */
|
|
|
- if (iru < sw) {
|
|
|
- /* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
- px2 = INTERPOLATE(px2, px3, ar);
|
|
|
- }
|
|
|
- px = INTERPOLATE(px, px2, ab);
|
|
|
- }
|
|
|
- if (direct) {
|
|
|
- auto tmp = maskOp(px, *cmp, 0); //not use alpha
|
|
|
- *dst = tmp + MULTIPLY(*dst, ~tmp);
|
|
|
- ++dst;
|
|
|
- } else {
|
|
|
- *cmp = maskOp(px, *cmp, ~px);
|
|
|
- }
|
|
|
- ++cmp;
|
|
|
-
|
|
|
- //Step UV horizontally
|
|
|
- u += _dudx;
|
|
|
- v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
- }
|
|
|
- } else {
|
|
|
- //Draw horizontal line
|
|
|
- while (x++ < x2) {
|
|
|
- uu = (int) u;
|
|
|
- if (uu >= sw) continue;
|
|
|
- vv = (int) v;
|
|
|
- if (vv >= sh) continue;
|
|
|
-
|
|
|
- ar = (int)(255 * (1 - modff(u, &iptr)));
|
|
|
- ab = (int)(255 * (1 - modff(v, &iptr)));
|
|
|
- iru = uu + 1;
|
|
|
- irv = vv + 1;
|
|
|
-
|
|
|
- px = *(sbuf + (vv * sw) + uu);
|
|
|
-
|
|
|
- /* horizontal interpolate */
|
|
|
- if (iru < sw) {
|
|
|
- /* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
- px = INTERPOLATE(px, px2, ar);
|
|
|
- }
|
|
|
- /* vertical interpolate */
|
|
|
- if (irv < sh) {
|
|
|
- /* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
-
|
|
|
- /* horizontal interpolate */
|
|
|
- if (iru < sw) {
|
|
|
- /* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
- px2 = INTERPOLATE(px2, px3, ar);
|
|
|
- }
|
|
|
- px = INTERPOLATE(px, px2, ab);
|
|
|
- }
|
|
|
-
|
|
|
- if (direct) {
|
|
|
- auto tmp = maskOp(MULTIPLY(px, opacity), *cmp, 0);
|
|
|
- *dst = tmp + MULTIPLY(*dst, ~tmp);
|
|
|
- ++dst;
|
|
|
- } else {
|
|
|
- auto tmp = MULTIPLY(px, opacity);
|
|
|
- *cmp = maskOp(tmp, *cmp, ~px);
|
|
|
- }
|
|
|
- ++cmp;
|
|
|
-
|
|
|
- //Step UV horizontally
|
|
|
- u += _dudx;
|
|
|
- v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //Step along both edges
|
|
|
- _xa += _dxdya;
|
|
|
- _xb += _dxdyb;
|
|
|
- _ua += _dudya;
|
|
|
- _va += _dvdya;
|
|
|
-
|
|
|
- if (!region && spanIdx >= image->rle->size) break;
|
|
|
-
|
|
|
- ++y;
|
|
|
- }
|
|
|
- xa = _xa;
|
|
|
- xb = _xb;
|
|
|
- ua = _ua;
|
|
|
- va = _va;
|
|
|
-
|
|
|
- return true;
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
|
|
@@ -276,9 +87,8 @@ static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage
|
|
|
float _xa = xa, _xb = xb, _ua = ua, _va = va;
|
|
|
auto sbuf = image->buf32;
|
|
|
auto dbuf = surface->buf32;
|
|
|
- int32_t sw = static_cast<int32_t>(image->stride);
|
|
|
- int32_t sh = image->h;
|
|
|
- int32_t dw = surface->stride;
|
|
|
+ int32_t sw = static_cast<int32_t>(image->w);
|
|
|
+ int32_t sh = static_cast<int32_t>(image->h);
|
|
|
int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay;
|
|
|
int32_t vv = 0, uu = 0;
|
|
|
int32_t minx = INT32_MAX, maxx = 0;
|
|
@@ -335,7 +145,7 @@ static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage
|
|
|
u = _ua + dx * _dudx;
|
|
|
v = _va + dx * _dvdx;
|
|
|
|
|
|
- buf = dbuf + ((y * dw) + x1);
|
|
|
+ buf = dbuf + ((y * surface->stride) + x1);
|
|
|
|
|
|
x = x1;
|
|
|
|
|
@@ -343,32 +153,32 @@ static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage
|
|
|
//Draw horizontal line
|
|
|
while (x++ < x2) {
|
|
|
uu = (int) u;
|
|
|
- if (uu >= sw) continue;
|
|
|
vv = (int) v;
|
|
|
- if (vv >= sh) continue;
|
|
|
+
|
|
|
+ if ((uint32_t) uu >= image->w || (uint32_t) vv >= image->h) continue;
|
|
|
|
|
|
ar = (int)(255 * (1 - modff(u, &iptr)));
|
|
|
ab = (int)(255 * (1 - modff(v, &iptr)));
|
|
|
iru = uu + 1;
|
|
|
irv = vv + 1;
|
|
|
|
|
|
- px = *(sbuf + (vv * sw) + uu);
|
|
|
+ px = *(sbuf + (vv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
+ int px2 = *(sbuf + (vv * image->stride) + iru);
|
|
|
px = INTERPOLATE(px, px2, ar);
|
|
|
}
|
|
|
/* vertical interpolate */
|
|
|
if (irv < sh) {
|
|
|
/* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
+ int px2 = *(sbuf + (irv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
+ int px3 = *(sbuf + (irv * image->stride) + iru);
|
|
|
px2 = INTERPOLATE(px2, px3, ar);
|
|
|
}
|
|
|
px = INTERPOLATE(px, px2, ab);
|
|
@@ -379,39 +189,37 @@ static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage
|
|
|
//Step UV horizontally
|
|
|
u += _dudx;
|
|
|
v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
}
|
|
|
} else {
|
|
|
//Draw horizontal line
|
|
|
while (x++ < x2) {
|
|
|
uu = (int) u;
|
|
|
- if (uu >= sw) continue;
|
|
|
vv = (int) v;
|
|
|
- if (vv >= sh) continue;
|
|
|
+
|
|
|
+ if ((uint32_t) uu >= image->w || (uint32_t) vv >= image->h) continue;
|
|
|
|
|
|
ar = (int)(255 * (1 - modff(u, &iptr)));
|
|
|
ab = (int)(255 * (1 - modff(v, &iptr)));
|
|
|
iru = uu + 1;
|
|
|
irv = vv + 1;
|
|
|
|
|
|
- px = *(sbuf + (vv * sw) + uu);
|
|
|
+ px = *(sbuf + (vv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
+ int px2 = *(sbuf + (vv * image->stride) + iru);
|
|
|
px = INTERPOLATE(px, px2, ar);
|
|
|
}
|
|
|
/* vertical interpolate */
|
|
|
if (irv < sh) {
|
|
|
/* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
+ int px2 = *(sbuf + (irv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
+ int px3 = *(sbuf + (irv * image->stride) + iru);
|
|
|
px2 = INTERPOLATE(px2, px3, ar);
|
|
|
}
|
|
|
px = INTERPOLATE(px, px2, ab);
|
|
@@ -423,8 +231,6 @@ static void _rasterBlendingPolygonImageSegment(SwSurface* surface, const SwImage
|
|
|
//Step UV horizontally
|
|
|
u += _dudx;
|
|
|
v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -453,9 +259,8 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
float _xa = xa, _xb = xb, _ua = ua, _va = va;
|
|
|
auto sbuf = image->buf32;
|
|
|
auto dbuf = surface->buf32;
|
|
|
- int32_t sw = static_cast<int32_t>(image->stride);
|
|
|
- int32_t sh = image->h;
|
|
|
- int32_t dw = surface->stride;
|
|
|
+ int32_t sw = static_cast<int32_t>(image->w);
|
|
|
+ int32_t sh = static_cast<int32_t>(image->h);
|
|
|
int32_t x1, x2, x, y, ar, ab, iru, irv, px, ay;
|
|
|
int32_t vv = 0, uu = 0;
|
|
|
int32_t minx = INT32_MAX, maxx = 0;
|
|
@@ -517,7 +322,7 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
u = _ua + dx * _dudx;
|
|
|
v = _va + dx * _dvdx;
|
|
|
|
|
|
- buf = dbuf + ((y * dw) + x1);
|
|
|
+ buf = dbuf + ((y * surface->stride) + x1);
|
|
|
|
|
|
x = x1;
|
|
|
|
|
@@ -527,32 +332,32 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
//Draw horizontal line
|
|
|
while (x++ < x2) {
|
|
|
uu = (int) u;
|
|
|
- if (uu >= sw) continue;
|
|
|
vv = (int) v;
|
|
|
- if (vv >= sh) continue;
|
|
|
+
|
|
|
+ if ((uint32_t) uu >= image->w || (uint32_t) vv >= image->h) continue;
|
|
|
|
|
|
ar = (int)(255.0f * (1.0f - modff(u, &iptr)));
|
|
|
ab = (int)(255.0f * (1.0f - modff(v, &iptr)));
|
|
|
iru = uu + 1;
|
|
|
irv = vv + 1;
|
|
|
|
|
|
- px = *(sbuf + (vv * sw) + uu);
|
|
|
+ px = *(sbuf + (vv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
+ int px2 = *(sbuf + (vv * image->stride) + iru);
|
|
|
px = INTERPOLATE(px, px2, ar);
|
|
|
}
|
|
|
/* vertical interpolate */
|
|
|
if (irv < sh) {
|
|
|
/* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
+ int px2 = *(sbuf + (irv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
+ int px3 = *(sbuf + (irv * image->stride) + iru);
|
|
|
px2 = INTERPOLATE(px2, px3, ar);
|
|
|
}
|
|
|
px = INTERPOLATE(px, px2, ab);
|
|
@@ -570,8 +375,6 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
//Step UV horizontally
|
|
|
u += _dudx;
|
|
|
v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
}
|
|
|
} else {
|
|
|
//Draw horizontal line
|
|
@@ -579,30 +382,30 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
uu = (int) u;
|
|
|
vv = (int) v;
|
|
|
|
|
|
+ if ((uint32_t) uu >= image->w || (uint32_t) vv >= image->h) continue;
|
|
|
+
|
|
|
ar = (int)(255.0f * (1.0f - modff(u, &iptr)));
|
|
|
ab = (int)(255.0f * (1.0f - modff(v, &iptr)));
|
|
|
iru = uu + 1;
|
|
|
irv = vv + 1;
|
|
|
|
|
|
- if (vv >= sh) continue;
|
|
|
-
|
|
|
px = *(sbuf + (vv * sw) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* right pixel */
|
|
|
- int px2 = *(sbuf + (vv * sw) + iru);
|
|
|
+ int px2 = *(sbuf + (vv * image->stride) + iru);
|
|
|
px = INTERPOLATE(px, px2, ar);
|
|
|
}
|
|
|
/* vertical interpolate */
|
|
|
if (irv < sh) {
|
|
|
/* bottom pixel */
|
|
|
- int px2 = *(sbuf + (irv * sw) + uu);
|
|
|
+ int px2 = *(sbuf + (irv * image->stride) + uu);
|
|
|
|
|
|
/* horizontal interpolate */
|
|
|
if (iru < sw) {
|
|
|
/* bottom right pixel */
|
|
|
- int px3 = *(sbuf + (irv * sw) + iru);
|
|
|
+ int px3 = *(sbuf + (irv * image->stride) + iru);
|
|
|
px2 = INTERPOLATE(px2, px3, ar);
|
|
|
}
|
|
|
px = INTERPOLATE(px, px2, ab);
|
|
@@ -620,8 +423,6 @@ static void _rasterPolygonImageSegment(SwSurface* surface, const SwImage* image,
|
|
|
//Step UV horizontally
|
|
|
u += _dudx;
|
|
|
v += _dvdx;
|
|
|
- //range over?
|
|
|
- if ((uint32_t)v >= image->h) break;
|
|
|
}
|
|
|
}
|
|
|
}
|