mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
68 lines
1.4 KiB
C++
68 lines
1.4 KiB
C++
#include "ScanLine.h"
|
|
|
|
struct SolidFiller : Rasterizer::Target {
|
|
RGBA *t;
|
|
RGBA c;
|
|
|
|
void Start(int minx, int maxx) { t += minx; }
|
|
void Render(int val) { AlphaBlendCover8(*t++, c, val); }
|
|
void Render(int val, int len);
|
|
};
|
|
|
|
void SolidFiller::Render(int val, int len)
|
|
{
|
|
if(val == 0) {
|
|
t += len;
|
|
return;
|
|
}
|
|
if(((val - 256) | (c.a - 255)) == 0) {
|
|
while(len >= 16) {
|
|
t[0] = c; t[1] = c; t[2] = c; t[3] = c;
|
|
t[4] = c; t[5] = c; t[6] = c; t[7] = c;
|
|
t[8] = c; t[9] = c; t[10] = c; t[11] = c;
|
|
t[12] = c; t[13] = c; t[14] = c; t[15] = c;
|
|
t += 16;
|
|
len -= 16;
|
|
}
|
|
switch(len) {
|
|
case 15: t[14] = c;
|
|
case 14: t[13] = c;
|
|
case 13: t[12] = c;
|
|
case 12: t[11] = c;
|
|
case 11: t[10] = c;
|
|
case 10: t[9] = c;
|
|
case 9: t[8] = c;
|
|
case 8: t[7] = c;
|
|
case 7: t[6] = c;
|
|
case 6: t[5] = c;
|
|
case 5: t[4] = c;
|
|
case 4: t[3] = c;
|
|
case 3: t[2] = c;
|
|
case 2: t[1] = c;
|
|
case 1: t[0] = c;
|
|
}
|
|
t += len;
|
|
}
|
|
else {
|
|
RGBA c1;
|
|
if(val != 256)
|
|
c1 = Mul8(c, val);
|
|
else
|
|
c1 = c;
|
|
RGBA *e = t + len;
|
|
while(t < e)
|
|
AlphaBlend(*t++, c1);
|
|
}
|
|
}
|
|
|
|
void Render(ImageBuffer& ib, Rasterizer& r, const RGBA& color, bool evenodd)
|
|
{
|
|
Size sz = ib.GetSize();
|
|
SolidFiller f;
|
|
f.c = color;
|
|
for(int y = r.MinY(); y <= r.MaxY(); y++) {
|
|
f.t = ib[y];
|
|
r.Render(y, f, evenodd);
|
|
}
|
|
r.Reset();
|
|
}
|