aboutsummaryrefslogtreecommitdiff
path: root/scumm/akos.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'scumm/akos.cpp')
-rw-r--r--scumm/akos.cpp42
1 files changed, 36 insertions, 6 deletions
diff --git a/scumm/akos.cpp b/scumm/akos.cpp
index 028b78e5d0..da4332d1b7 100644
--- a/scumm/akos.cpp
+++ b/scumm/akos.cpp
@@ -412,9 +412,7 @@ byte AkosRenderer::drawLimb(const Actor *a, int limb) {
result |= codec16(xmoveCur, ymoveCur);
break;
case 32:
- // TODO Add codec32
- warning("akos_drawLimb codec32");
- result = 1;
+ result |= codec32(xmoveCur, ymoveCur);
break;
default:
error("akos_drawLimb: invalid codec %d", codec);
@@ -491,9 +489,7 @@ byte AkosRenderer::drawLimb(const Actor *a, int limb) {
result |= codec16(xmoveCur, ymoveCur);
break;
case 32:
- // TODO Add codec32
- warning("akos_drawLimb: codec32 stub");
- result = 1;
+ result |= codec32(xmoveCur, ymoveCur);
break;
default:
error("akos_drawLimb: invalid codec %d", codec);
@@ -1223,6 +1219,40 @@ byte AkosRenderer::codec16(int xmoveCur, int ymoveCur) {
return 0;
}
+byte AkosRenderer::codec32(int xmoveCur, int ymoveCur) {
+ Common::Rect clip, src, dst;
+
+ debug(0, "codec32(%d, %d)", xmoveCur, ymoveCur);
+
+ if (!_mirror) {
+ dst.left = (_actorX - xmoveCur - _width) + 1;
+ } else {
+ dst.left = _actorX + xmoveCur;
+ }
+
+ src.top = src.left = 0;
+ src.right = _width - 1;
+ src.bottom = _height - 1;
+
+ clip.top = clip.left = 0;
+ clip.right = _outwidth - 1;
+ clip.bottom = _outheight - 1;
+
+ dst.top = _actorY + ymoveCur;
+ dst.right = dst.left + _width - 1;
+ dst.bottom = dst.top + _height - 1;
+
+ clip.clip(_clipOverride);
+ dst.clip(clip);
+
+ _vm->markRectAsDirty(kMainVirtScreen, dst, _actorID);
+
+ byte *dstptr = _outptr + dst.left + dst.top * _outwidth;
+
+ _vm->gdi.decompressImageHE(dstptr, _outwidth, &dst, _srcptr, &src);
+ return 0;
+}
+
bool ScummEngine::akos_increaseAnims(const byte *akos, Actor *a) {
const byte *aksq, *akfo;
int i;