14#define FRAC(f, from, to) ((((f) - (from)) / (double)((to) - (from))))
15#define LERP(f, mi, ma) ((mi) + (f) * ((ma) - (mi)))
16#define CLAMP(v, mi, ma) (((v) < (mi)) ? (mi) : ((v) > (ma)) ? (ma) : (v))
17#define SIGN(x) ((x) >= 0 ? 1.0 : -1.0)
19#pragma GCC diagnostic push
20#pragma GCC diagnostic ignored "-Wcast-align"
23ScanRender::ScanRender(
void)
29void ScanRender::setBilinearInterpolationEnabled(
bool enable)
36bool ScanRender::isBilinearInterpolationEnabled()
43void ScanRender::resetScanPoly(
int sx,
int sy)
49 if (
sy >= MAX_BK_SCANLINES)
51 qDebug(
"ScanRender::resetScanPoly fail!");
60void ScanRender::scanLine(
int x1,
int y1,
int x2,
int y2)
86 float dy = (float)(y2 - y1);
93 float dx = (float)(x2 - x1) / dy;
104 float m = (float) -y1;
124 int fx = (int)(x * (
float)(1 <<
FP));
125 int fdx = (int)(dx * (
float)(1 <<
FP));
127 for (y = y1; y <= y2; y++)
129 scLR[y].scan[side] =
fx >>
FP;
135 for (y = y1; y <= y2; y++)
153void ScanRender::scanLine(
int x1,
int y1,
int x2,
int y2,
float u1,
float v1,
float u2,
float v2)
176 float dy = (float)(y2 - y1);
181 float dx = (float)(x2 - x1) / dy;
189 float uv[2] = {
u1,
v1};
196 float m = (float) -y1;
213 for (y = y1; y <= y2; y++)
215 scLR[y].scan[side] = (int)x;
216 scLR[y].uv[side][0] = uv[0];
217 scLR[y].uv[side][1] = uv[1];
231 quint32 c =
col.rgb();
232 quint32 *bits = (quint32 *)
dst->bits();
233 int dw =
dst->width();
234 bkScan_t *scan = scLR;
236 for (
int y = plMinY; y <= plMaxY; y++)
238 int px1 = scan[y].scan[0];
239 int px2 = scan[y].scan[1];
264 quint32 *
pDst = bits + (y * dw) +
px1;
265 for (
int x =
px1; x <
px2; x++)
278 quint32 c =
col.rgba();
279 quint32 *bits = (quint32 *)
dst->bits();
280 int dw =
dst->width();
281 bkScan_t *scan = scLR;
282 float a = qAlpha(c) / 256.0f;
287 for (
int y = plMinY; y <= plMaxY; y++)
289 int px1 = scan[y].scan[0];
290 int px2 = scan[y].scan[1];
307 quint32 *
pDst = bits + (y * dw) +
px1;
308 for (
int x =
px1; x <
px2; x++)
313 LERP(a, qGreen(
rgbd),
gc),
321void ScanRender::setOpacity(
float opacity)
331 renderPolygonBI(
dst, src);
333 renderPolygonNI(
dst, src);
345 resetScanPoly(
pDest->width(),
pDest->height());
346 scanLine(
pts[0].x(),
pts[0].y(),
pts[1].x(),
pts[1].y(), 1, 1, 1, 0);
347 scanLine(
pts[1].x(),
pts[1].y(),
pts[2].x(),
pts[2].y(), 1, 0, 0, 0);
348 scanLine(
pts[2].x(),
pts[2].y(),
pts[3].x(),
pts[3].y(), 0, 0, 0, 1);
349 scanLine(
pts[3].x(),
pts[3].y(),
pts[0].x(),
pts[0].y(), 0, 1, 1, 1);
389 resetScanPoly(
pDest->width(),
pDest->height());
408 int w =
dst->width();
415 bkScan_t *scan = scLR;
419 for (
int y = plMinY; y <= plMaxY; y++)
421 if (scan[y].scan[0] > scan[y].scan[1])
423 qSwap(scan[y].scan[0], scan[y].scan[1]);
424 qSwap(scan[y].uv[0][0], scan[y].uv[1][0]);
425 qSwap(scan[y].uv[0][1], scan[y].uv[1][1]);
428 int px1 = scan[y].scan[0];
429 int px2 = scan[y].scan[1];
438 duv[0] = (float)(scan[y].uv[1][0] - scan[y].uv[0][0]) / dx;
439 duv[1] = (float)(scan[y].uv[1][1] - scan[y].uv[0][1]) / dx;
441 uv[0] = scan[y].uv[0][0];
442 uv[1] = scan[y].uv[0][1];
446 float m = (float)-
px1;
467 fuv[0] = uv[0] * 65536;
468 fuv[1] = uv[1] * 65536;
473 fuv[0] = CLAMP(
fuv[0], 0, (
sw - 1) * 65536.);
474 fuv[1] = CLAMP(
fuv[1], 0, (
sh - 1) * 65536.);
478 for (
int x =
px1; x <
px2; x++)
490 for (
int x =
px1; x <
px2; x++)
492 int offset = (
fuv[0] >> 16) + ((
fuv[1] >> 16) *
sw);
495 *
pDst = (*pSrc) | (0xFF << 24);
511 int w =
dst->width();
519 bkScan_t *scan = scLR;
523 #pragma omp parallel for
525 for (
int y = plMinY; y <= plMaxY; y++)
527 if (scan[y].scan[0] > scan[y].scan[1])
529 qSwap(scan[y].scan[0], scan[y].scan[1]);
530 qSwap(scan[y].uv[0][0], scan[y].uv[1][0]);
531 qSwap(scan[y].uv[0][1], scan[y].uv[1][1]);
534 int px1 = scan[y].scan[0];
535 int px2 = scan[y].scan[1];
544 duv[0] = (float)(scan[y].uv[1][0] - scan[y].uv[0][0]) / dx;
545 duv[1] = (float)(scan[y].uv[1][1] - scan[y].uv[0][1]) / dx;
547 uv[0] = scan[y].uv[0][0];
548 uv[1] = scan[y].uv[0][1];
552 float m = (float)-
px1;
573 for (
int x =
px1; x <
px2; x++)
575 float x_diff = uv[0] -
static_cast<int>(uv[0]);
576 float y_diff = uv[1] -
static_cast<int>(uv[1]);
580 int index = ((int)uv[0] + ((
int)uv[1] *
sw));
591 ((((int)val)<<16)&0xff0000) |
592 ((((int)val)<<8)&0xff00) |
602 for (
int x =
px1; x <
px2; x++)
604 float x_diff = uv[0] -
static_cast<int>(uv[0]);
605 float y_diff = uv[1] -
static_cast<int>(uv[1]);
609 int index = ((int)uv[0] + ((
int)uv[1] *
sw));
612 quint32 b =
bitsSrc[(index + 1) % size];
613 quint32 c =
bitsSrc[(index +
sw) % size];
614 quint32 d =
bitsSrc[(index +
sw + 1) % size];
625 int green = (((a>>8)&0xff)*(
qxy1) + ((b>>8)&0xff)*(
qxy2) + ((c>>8)&0xff)*(
qyx1) + ((d>>8)&0xff)*(
qxy)) >> 16;
628 int red = (((a>>16)&0xff)*(
qxy1) + ((b>>16)&0xff)*(
qxy2) +((c>>16)&0xff)*(
qyx1) + ((d>>16)&0xff)*(
qxy)) >> 16;
630 *
pDst = 0xff000000 | (((
red)<<16)&0xff0000) | (((green)<<8)&0xff00) | (
blue);
644 renderPolygonAlphaBI(
dst, src);
646 renderPolygonAlphaNI(
dst, src);
652 int w =
dst->width();
659 bkScan_t *scan = scLR;
661 float opacity = (m_opacity / 65536.) * 0.00390625f;
664 #pragma omp parallel for shared(bitsDst, bitsSrc, scan, tsx, tsy, w, sw)
666 for (
int y = plMinY; y <= plMaxY; y++)
668 if (scan[y].scan[0] > scan[y].scan[1])
670 qSwap(scan[y].scan[0], scan[y].scan[1]);
671 qSwap(scan[y].uv[0][0], scan[y].uv[1][0]);
672 qSwap(scan[y].uv[0][1], scan[y].uv[1][1]);
675 int px1 = scan[y].scan[0];
676 int px2 = scan[y].scan[1];
685 duv[0] = (float)(scan[y].uv[1][0] - scan[y].uv[0][0]) / dx;
686 duv[1] = (float)(scan[y].uv[1][1] - scan[y].uv[0][1]) / dx;
688 uv[0] = scan[y].uv[0][0];
689 uv[1] = scan[y].uv[0][1];
693 float m = (float)-
px1;
746 for (
int x =
px1; x <
px2; x++)
748 float x_diff = uv[0] -
static_cast<int>(uv[0]);
749 float y_diff = uv[1] -
static_cast<int>(uv[1]);
753 int index = ((int)uv[0] + ((
int)uv[1] *
sw));
756 quint32 b =
bitsSrc[(index + 1) % size];
757 quint32 c =
bitsSrc[(index +
sw) % size];
758 quint32 d =
bitsSrc[(index +
sw + 1) % size];
765 float alpha = ((((a>>24)&0xff)*(
x1y1) + ((b>>24)&0xff)*(
xy1) +
766 ((c>>24)&0xff)*(
x1y) + ((d>>24)&0xff)*(xy)) * opacity);
768 if (alpha > 0.00390625f)
772 (c&0xff)*(
x1y) + (d&0xff)*(xy)) >> 16;
775 int green = (((a>>8)&0xff)*(
x1y1) + ((b>>8)&0xff)*(
xy1) +
776 ((c>>8)&0xff)*(
x1y) + ((d>>8)&0xff)*(xy)) >> 16;
779 int red = (((a>>16)&0xff)*(
x1y1) + ((b>>16)&0xff)*(
xy1) +
780 ((c>>16)&0xff)*(
x1y) + ((d>>16)&0xff)*(xy)) >> 16;
784 int bd = qBlue(*
pDst);
786 *
pDst = qRgb(LERP(alpha,
rd, red), LERP(alpha,
gd, green), LERP(alpha, bd, blue));
803 int w =
dst->width();
809 bkScan_t *scan = scLR;
810 float opacity = 0.00390625f * m_opacity;
813 #pragma omp parallel for shared(bitsDst, bitsSrc, scan, tsx, tsy, w, sw)
815 for (
int y = plMinY; y <= plMaxY; y++)
817 if (scan[y].scan[0] > scan[y].scan[1])
819 qSwap(scan[y].scan[0], scan[y].scan[1]);
820 qSwap(scan[y].uv[0][0], scan[y].uv[1][0]);
821 qSwap(scan[y].uv[0][1], scan[y].uv[1][1]);
824 int px1 = scan[y].scan[0];
825 int px2 = scan[y].scan[1];
834 duv[0] = (float)(scan[y].uv[1][0] - scan[y].uv[0][0]) / dx;
835 duv[1] = (float)(scan[y].uv[1][1] - scan[y].uv[0][1]) / dx;
837 uv[0] = scan[y].uv[0][0];
838 uv[1] = scan[y].uv[0][1];
842 float m = (float)-
px1;
860 for (
int x =
px1; x <
px2; x++)
862 const quint32 *
pSrc =
bitsSrc + ((int)(uv[0])) + ((
int)(uv[1]) *
sw);
865 float a = qAlpha(*
pSrc) * opacity;
870 LERP(a, qGreen(
rgbd), qGreen(
rgbs)),
882#pragma GCC diagnostic pop
const uchar * constBits() const const