mirror of
https://github.com/spiffcode/hostile-takeover.git
synced 2025-12-16 12:08:36 +00:00
172 lines
3.9 KiB
C++
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
|