From 841e7182f28471ffda0ecd0c692649f58fd3aea8 Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Sun, 5 Nov 2017 02:59:22 +0000 Subject: SUPERNOVA: Reduce memory usage to store sections and simplify code Each section was store dusing the full image size. Now it only uses the section size, which should reduce considerably the amout of memory used for each image. Also when a section has one or more next section, they were all drawn on the surface for this section, but then they were drawn again on their own surface. And while this should not cause any issue, this was really unnecessary (and prevented optimizing the surface size for each section). So now this is no longer the case and the surface for a section only contains this section. --- engines/supernova/graphics.cpp | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) (limited to 'engines/supernova/graphics.cpp') diff --git a/engines/supernova/graphics.cpp b/engines/supernova/graphics.cpp index 87485e0edc..ee2bfe8e3a 100644 --- a/engines/supernova/graphics.cpp +++ b/engines/supernova/graphics.cpp @@ -203,12 +203,10 @@ bool MSNImageDecoder::loadSections() { for (int section = 0; section < _numSections; ++section) { Graphics::Surface *surface = new Graphics::Surface; _sectionSurfaces.push_back(surface); - surface->create(imageWidth, - imageHeight, - g_system->getScreenFormat()); - byte *surfacePixels = static_cast(surface->getPixels()); if (isNewspaper) { + surface->create(imageWidth, imageHeight, g_system->getScreenFormat()); + byte *surfacePixels = static_cast(surface->getPixels()); for (int i = 0; i < imageWidth * imageHeight / 8; ++i) { *surfacePixels++ = (_encodedImage[i] & 0x80) ? kColorWhite63 : kColorBlack; *surfacePixels++ = (_encodedImage[i] & 0x40) ? kColorWhite63 : kColorBlack; @@ -220,24 +218,15 @@ bool MSNImageDecoder::loadSections() { *surfacePixels++ = (_encodedImage[i] & 0x01) ? kColorWhite63 : kColorBlack; } } else { - uint image = section; - do { - uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow; - if (offset == kInvalidAddress || _section[image].x2 == 0) { - return false; - } - int width = _section[image].x2 - _section[image].x1 + 1; - int height = _section[image].y2 - _section[image].y1 + 1; - uint32 destAddress = imageWidth * _section[image].y1 + _section[image].x1; - while (height) { - Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress); - offset += width; - destAddress += imageWidth; - --height; - } - - image = _section[image].next; - } while (image != 0); + uint32 offset = (_section[section].addressHigh << 16) + _section[section].addressLow; + if (offset == kInvalidAddress || _section[section].x2 == 0) { + return false; + } + int width = _section[section].x2 - _section[section].x1 + 1; + int height = _section[section].y2 - _section[section].y1 + 1; + surface->create(width, height, g_system->getScreenFormat()); + byte *surfacePixels = static_cast(surface->getPixels()); + Common::copy(_encodedImage + offset, _encodedImage + offset + width * height, surfacePixels); } } -- cgit v1.2.3