aboutsummaryrefslogtreecommitdiff
path: root/engines/avalanche/celer2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/avalanche/celer2.cpp')
-rw-r--r--engines/avalanche/celer2.cpp118
1 files changed, 19 insertions, 99 deletions
diff --git a/engines/avalanche/celer2.cpp b/engines/avalanche/celer2.cpp
index 52b57b3725..be925ed767 100644
--- a/engines/avalanche/celer2.cpp
+++ b/engines/avalanche/celer2.cpp
@@ -47,6 +47,11 @@ Celer::Celer(AvalancheEngine *vm) {
num_chunks = 0;
}
+Celer::~Celer() {
+ for (byte i = 0; i < 40; i++)
+ memory[i].free();
+}
+
void Celer::pics_link() {
byte xx;
@@ -302,14 +307,14 @@ void Celer::load_chunks(Common::String xx) {
if (ch.natural) {
memos[fv].flavour = ch_natural_image; // We simply read from the screen and later, in display_it() we draw it right back.
memos[fv].size = memos[fv].xl * 8 * memos[fv].yl;
- memory[fv] = new byte[memos[fv].size]; // Celer::forget_chunks() deallocates it.
+ memory[fv].create(memos[fv].xl * 8, memos[fv].yl, ::Graphics::PixelFormat::createFormatCLUT8());
+
for (uint16 j = 0; j < memos[fv].yl; j++)
for (uint16 i = 0; i < memos[fv].xl * 8; i++)
- memory[fv][j * memos[fv].xl * 8 + i] = *_vm->_graphics->getPixel(memos[fv].x * 8 + i, memos[fv].y + j);
+ *(byte *)memory[fv].getBasePtr(i, j) = *_vm->_graphics->getPixel(memos[fv].x * 8 + i, memos[fv].y + j);
} else {
memos[fv].size = ch.size;
- memory[fv] = new byte[memos[fv].size]; // Celer::forget_chunks() deallocates it.
- f.read(memory[fv], ch.size);
+ memory[fv] = _vm->_graphics->loadPictureRow(f, memos[fv].xl * 8, memos[fv].yl + 1); // Celer::forget_chunks() deallocates it.
}
} else
memos[fv].x = on_disk;
@@ -320,80 +325,35 @@ void Celer::load_chunks(Common::String xx) {
void Celer::forget_chunks() {
for (byte fv = 0; fv < num_chunks; fv ++)
if (memos[fv].x > on_disk)
- delete[] memory[fv];
+ memory[fv].free();
memset(memos, 255, sizeof(memos)); /* x=-1, => on disk. */
}
-void Celer::display_it(int16 x, int16 y, int16 xl, int16 yl, flavourtype flavour, byte *p) {
+void Celer::display_it(int16 x, int16 y, int16 xl, int16 yl, flavourtype flavour, const ::Graphics::Surface &picture) {
r.x1 = x;
r.y1 = y;
r.y2 = y + yl;
switch (flavour) {
- case ch_natural_image: {
- r.x2 = x + xl + 1;
-
- x *= 8;
- xl *= 8;
-
- for (uint16 j = 0; j < yl; j++)
- for (uint16 i = 0; i < xl; i++)
- *_vm->_graphics->getPixel(x + i, y + j) = p[j * xl + i];
- }
- break;
+ case ch_natural_image: // Allow fallthorugh on purpose.
case ch_bgi : {
r.x2 = x + xl + 1;
-
- _vm->_graphics->drawPicture_old(p, x * 8, y);
- //putimage(x * 8, y, p, 0);
}
break;
case ch_ega : {
r.x2 = x + xl;
-
-
-
- x *= 8;
- xl *= 8;
-
-
-
- ::Graphics::Surface picture; // We make a Surface object for the picture itself.
-
- picture.create(xl, yl + 1, ::Graphics::PixelFormat::createFormatCLUT8());
-
- uint32 h = 0;
-
- // Produce the picture.
- for (int8 plane = 0; plane < 4; plane++) // The planes are in the opposite way.
- for (byte j = 0; j < yl + 1; j++)
- for (uint16 i = 0; i < xl; i += 8) {
- byte pixel = p[h++];
- for (byte bit = 0; bit < 8; bit++) {
- byte pixelBit = (pixel >> bit) & 1;
- *(byte *)picture.getBasePtr(i + 7 - bit, j) += (pixelBit << plane);
- }
- }
-
- // Copy the picture to a given place on the screen.
- for (uint16 j = 0; j < picture.h; j++)
- for (uint16 i = 0; i < picture.w; i++)
- *_vm->_graphics->getPixel(i + x, j + y) = *(byte *)picture.getBasePtr(i, j);
-
- picture.free();
-
-
_vm->_lucerna->blitfix();
}
break;
}
+
+ _vm->_graphics->drawPicture(picture, x * 8, y);
}
void Celer::show_one(byte which) {
chunkblocktype ch;
- byte *p;
//setactivepage(3);
warning("STUB: Celer::show_one()");
@@ -417,12 +377,11 @@ void Celer::show_one(byte which) {
ch.natural = f.readByte();
ch.memorise = f.readByte();
- p = new byte[ch.size];
- f.read(p, ch.size);
+ ::Graphics::Surface picture = _vm->_graphics->loadPictureRow(f, ch.xl * 8, ch.yl + 1); // There'll may be problems with the width!
- display_it(ch.x, ch.y, ch.xl, ch.yl, ch.flavour, p);
+ display_it(ch.x, ch.y, ch.xl, ch.yl, ch.flavour, picture);
- delete[] p;
+ picture.free();
f.close();
}
@@ -435,51 +394,12 @@ void Celer::show_one(byte which) {
-void Celer::display_it_at(int16 xl, int16 yl, flavourtype flavour, void *p, int16 &xxx, int16 &yyy) {
- warning("STUB: Celer::display_it1()");
+void Celer::display_it_at(int16 xl, int16 yl, flavourtype flavour, const ::Graphics::Surface &picture, int16 &xxx, int16 &yyy) {
+ warning("STUB: Celer::display_it_at()");
}
void Celer::show_one_at(byte which, int16 xxx, int16 yyy) {
- chunkblocktype ch;
- byte *p;
-
- //setactivepage(3);
warning("STUB: Celer::show_one_at()");
-
- if (memos[which].x > on_disk) {
- display_it_at(memos[which].xl, memos[which].yl, memos[which].flavour, memory[which], xxx, yyy);
- } else {
- if (!f.open(filename)) { /* Filename was set in load_chunks() */
- warning("AVALANCHE: Celer: File not found: %s", filename.c_str());
- return;
- }
-
- f.seek(offsets[which]);
- ch.flavour = flavourtype(f.readByte());
- ch.x = f.readSint16LE();
- ch.y = f.readSint16LE();
- ch.xl = f.readSint16LE();
- ch.yl = f.readSint16LE();
- ch.size = f.readSint32LE();
- ch.natural = f.readByte();
- ch.memorise = f.readByte();
-
- {
- p = new byte[ch.size];
- f.read(p, ch.size);
-
- display_it_at(ch.xl, ch.yl, ch.flavour, p, xxx, yyy);
-
- delete[] p;
- f.close();
- }
- }
-
- //setactivepage(1 - cp);
- warning("STUB: Celer::show_one_at()");
-
- for (byte fv = 0; fv < 2; fv ++)
- _vm->_trip->getset[fv].remember(r);
}