hostile-takeover/game/drawscan.cpp
2016-01-03 23:19:26 -08:00

172 lines
3.9 KiB
C++

#include "game/ht.h"
#include "game/ops.h"
namespace wi {
int YClipToScan(int yClip, int cx, byte*& pop, byte*& pbSrc, word*& psc) {
if (yClip == 0) {
return 0;
}
int offset = 0;
int y = 0;
while (true) {
int op = (int)(word)*pop++;
if (op == kopAlign) {
pbSrc++;
continue;
}
if (op >= kopEvenData1 && op <= kopEvenData48) {
int cb = op - kopEvenData1 + 1;
offset += cb;
pbSrc += cb;
continue;
}
if (op >= kopOddData1 && op <= kopOddData48) {
int cb = op - kopOddData1 + 1;
offset += cb;
pbSrc += cb;
continue;
}
if (op >= kopEvenSide1 && op <= kopEvenSide16) {
int cb = op - kopEvenSide1 + 1;
offset += cb;
psc += (cb >> 2);
psc += ((cb & 2) >> 1);
psc += (cb & 1);
continue;
}
if (op >= kopOddSide1 && op <= kopOddSide16) {
int cb = op - kopOddSide1 + 1;
offset += cb;
psc++;
cb--;
psc += (cb >> 2);
psc += ((cb & 2) >> 1);
psc += (cb & 1);
continue;
}
if (op >= kopShadow1 && op <= kopShadow24) {
offset += (op - kopShadow1 + 1);
continue;
}
if (op >= kopTransparent1 && op <= kopTransparent32) {
offset += (op - kopTransparent1 + 1);
continue;
}
if (op >= kopNextScan0 && op <= kopNextScan48) {
offset += ((op - kopNextScan0) - cx);
y++;
if (y == yClip) {
break;
}
continue;
}
if (op == kopEnd) {
break;
}
}
return offset;
}
int DrawScan(byte *pbDst, int cx, byte*& pbSrc, byte*& pop, word*& psc,
dword *mpscaiclr, byte *mpiclriclrShadow) {
byte *pbDstStart = pbDst;
while (true) {
int op = (int)(word)*pop++;
if (op == kopAlign) {
pbSrc++;
continue;
}
if (op >= kopEvenData1 && op <= kopEvenData48) {
int cb = op - kopEvenData1 + 1;
for (; cb >= 2; cb -= 2) {
*((word *)pbDst) = *((word *)pbSrc);
pbDst += 2;
pbSrc += 2;
}
if (cb != 0)
*pbDst++ = *pbSrc++;
continue;
}
if (op >= kopOddData1 && op <= kopOddData48) {
int cb = op - kopOddData1 + 1;
*pbDst++ = *pbSrc++;
cb--;
for (; cb >= 2; cb -= 2) {
*((word *)pbDst) = *((word *)pbSrc);
pbDst += 2;
pbSrc += 2;
}
if (cb != 0)
*pbDst++ = *pbSrc++;
continue;
}
if (op >= kopEvenSide1 && op <= kopEvenSide16) {
int cb = op - kopEvenSide1 + 1;
for (; cb >= 4; cb -= 4) {
word *pwSrc = (word *)(((byte *)mpscaiclr) + (*psc));
*((word *)pbDst) = *pwSrc++;
pbDst += 2;
*((word *)pbDst) = *pwSrc++;
pbDst += 2;
psc++;
}
for (; cb >= 2; cb -= 2) {
*((word *)pbDst) = *((word *)(((byte *)mpscaiclr) + (*psc)));
psc++;
pbDst += 2;
}
if (cb != 0) {
*pbDst++ = *((byte *)(((byte *)mpscaiclr) + (*psc)));
psc++;
}
continue;
}
if (op >= kopOddSide1 && op <= kopOddSide16) {
int cb = op - kopOddSide1 + 1;
*pbDst++ = *((byte *)(((byte *)mpscaiclr) + (*psc)));
psc++;
cb--;
for (; cb >= 4; cb -= 4) {
word *pwSrc = (word *)(((byte *)mpscaiclr) + (*psc));
*((word *)pbDst) = *pwSrc++;
pbDst += 2;
*((word *)pbDst) = *pwSrc++;
pbDst += 2;
psc++;
}
for (; cb >= 2; cb -= 2) {
*((word *)pbDst) = *((word *)(((byte *)mpscaiclr) + (*psc)));
psc++;
pbDst += 2;
}
if (cb != 0) {
*pbDst++ = *((byte *)(((byte *)mpscaiclr) + (*psc)));
psc++;
}
continue;
}
if (op >= kopShadow1 && op <= kopShadow24) {
int cb = op - kopShadow1 + 1;
while (cb-- != 0) {
*pbDst = mpiclriclrShadow[*pbDst];
pbDst++;
}
continue;
}
if (op >= kopTransparent1 && op <= kopTransparent32) {
int cb = op - kopTransparent1 + 1;
pbDst += cb;
continue;
}
if (op >= kopNextScan0 && op <= kopNextScan48) {
return (int)(&pbDst[op - kopNextScan0] - pbDstStart);
}
if (op == kopEnd)
return 0;
}
}
} // namespace wi