diff options
author | Eugene Sandulenko | 2016-09-02 23:39:32 +0200 |
---|---|---|
committer | GitHub | 2016-09-02 23:39:32 +0200 |
commit | b1657f47483c3ad4fe653fe7ddd837842c07a708 (patch) | |
tree | 59b414b14c5dc83d982d0b9dea5c270b83a18dd2 /graphics | |
parent | d4f9c0e361cb85d9674e44c6762722ac84be0d2d (diff) | |
parent | ec6bb1431eb3e54f4a1dddd051cb9b8dfa14f43d (diff) | |
download | scummvm-rg350-b1657f47483c3ad4fe653fe7ddd837842c07a708.tar.gz scummvm-rg350-b1657f47483c3ad4fe653fe7ddd837842c07a708.tar.bz2 scummvm-rg350-b1657f47483c3ad4fe653fe7ddd837842c07a708.zip |
Merge pull request #816 from blorente/macgui-fix
GRAPHICS: [GSoC] Fix leaks and bugs in MacGui
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/macgui/macwindow.cpp | 15 | ||||
-rw-r--r-- | graphics/macgui/macwindowborder.cpp | 9 | ||||
-rw-r--r-- | graphics/macgui/macwindowborder.h | 4 | ||||
-rw-r--r-- | graphics/macgui/macwindowmanager.cpp | 1 | ||||
-rw-r--r-- | graphics/nine_patch.cpp | 19 |
5 files changed, 28 insertions, 20 deletions
diff --git a/graphics/macgui/macwindow.cpp b/graphics/macgui/macwindow.cpp index dbb600ba82..975d52639e 100644 --- a/graphics/macgui/macwindow.cpp +++ b/graphics/macgui/macwindow.cpp @@ -317,26 +317,27 @@ void MacWindow::setScroll(float scrollPos, float scrollSize) { void MacWindow::loadBorder(Common::SeekableReadStream &file, bool active, int lo, int ro, int to, int bo) { Image::BitmapDecoder bmpDecoder; - Graphics::Surface source; + Graphics::Surface *source; Graphics::TransparentSurface *surface = new Graphics::TransparentSurface(); bmpDecoder.loadStream(file); - source = *(bmpDecoder.getSurface()); + source = bmpDecoder.getSurface()->convertTo(surface->getSupportedPixelFormat(), bmpDecoder.getPalette()); - source.convertToInPlace(surface->getSupportedPixelFormat(), bmpDecoder.getPalette()); - surface->create(source.w, source.h, source.format); - surface->copyFrom(source); + surface->create(source->w, source->h, surface->getSupportedPixelFormat()); + surface->copyFrom(*source); surface->applyColorKey(255, 0, 255, false); if (active) - _macBorder.addActiveBorder(*surface); + _macBorder.addActiveBorder(surface); else - _macBorder.addInactiveBorder(*surface); + _macBorder.addInactiveBorder(surface); if (!_macBorder.hasOffsets()) _macBorder.setOffsets(lo, ro, to, bo); updateInnerDims(); + source->free(); + delete source; } void MacWindow::setCloseable(bool closeable) { diff --git a/graphics/macgui/macwindowborder.cpp b/graphics/macgui/macwindowborder.cpp index b77fa35603..f47f8a3b2a 100644 --- a/graphics/macgui/macwindowborder.cpp +++ b/graphics/macgui/macwindowborder.cpp @@ -71,15 +71,15 @@ bool MacWindowBorder::hasBorder(bool active) { return active ? _activeInitialized : _inactiveInitialized; } -void MacWindowBorder::addActiveBorder(TransparentSurface &source) { +void MacWindowBorder::addActiveBorder(TransparentSurface *source) { assert(!_activeBorder); - _activeBorder = new NinePatchBitmap(&source, false); + _activeBorder = new NinePatchBitmap(source, true); _activeInitialized = true; } -void MacWindowBorder::addInactiveBorder(TransparentSurface &source) { +void MacWindowBorder::addInactiveBorder(TransparentSurface *source) { assert(!_inactiveBorder); - _inactiveBorder = new NinePatchBitmap(&source, false); + _inactiveBorder = new NinePatchBitmap(source, true); _inactiveInitialized = true; } @@ -112,6 +112,7 @@ void MacWindowBorder::blitBorderInto(ManagedSurface &destination, bool active) { src->blit(srf, 0, 0, srf.w, srf.h, palette, kColorCount); destination.transBlitFrom(srf, kColorGreen2); + srf.free(); } } // End of namespace Graphics diff --git a/graphics/macgui/macwindowborder.h b/graphics/macgui/macwindowborder.h index 54938e5143..6a1b55c5e3 100644 --- a/graphics/macgui/macwindowborder.h +++ b/graphics/macgui/macwindowborder.h @@ -86,14 +86,14 @@ public: * Will fail if there is already an active border. * @param The surface that will be displayed. */ - void addActiveBorder(TransparentSurface &source); + void addActiveBorder(TransparentSurface *source); /** * Add the given surface as the display of the border in the inactive state. * Will fail if there is already an inactive border. * @param The surface that will be displayed. */ - void addInactiveBorder(TransparentSurface &source); + void addInactiveBorder(TransparentSurface *source); /** * Accessor function for the custom offsets. diff --git a/graphics/macgui/macwindowmanager.cpp b/graphics/macgui/macwindowmanager.cpp index d19e40781f..413d9b2b97 100644 --- a/graphics/macgui/macwindowmanager.cpp +++ b/graphics/macgui/macwindowmanager.cpp @@ -322,6 +322,7 @@ void MacWindowManager::removeMarked() { } _windowsToRemove.clear(); _needsRemoval = false; + _lastId = _windows.size(); } void MacWindowManager::removeFromStack(BaseMacWindow *target) { diff --git a/graphics/nine_patch.cpp b/graphics/nine_patch.cpp index fa2ef20a6e..56e1202be3 100644 --- a/graphics/nine_patch.cpp +++ b/graphics/nine_patch.cpp @@ -230,25 +230,28 @@ void NinePatchBitmap::blit(Graphics::Surface &target, int dx, int dy, int dw, in if (!palette) warning("Trying to blit into a surface with 1bpp, you need the palette."); - Surface srf; - srf.create(target.w, target.h, _bmp->format); + Surface *srf = new Surface(); + srf->create(target.w, target.h, _bmp->format); - drawRegions(srf, dx, dy, dw, dh); + drawRegions(*srf, dx, dy, dw, dh); //TODO: This can be further optimized by keeping the data between draws, // and using a unique identifier for each palette, so that it only gets // recalculated when the palette changes. _cached_colors.clear(); - for (uint i = 0; i < srf.w; ++i) { - for (uint j = 0; j < srf.h; ++j) { - uint32 color = *(uint32*)srf.getBasePtr(i, j); + for (uint i = 0; i < srf->w; ++i) { + for (uint j = 0; j < srf->h; ++j) { + uint32 color = *(uint32*)srf->getBasePtr(i, j); if (color > 0) { *((byte *)target.getBasePtr(i, j)) = closestGrayscale(color, palette, numColors); } } } + srf->free(); + delete srf; + return; } @@ -257,8 +260,10 @@ void NinePatchBitmap::blit(Graphics::Surface &target, int dx, int dy, int dw, in } NinePatchBitmap::~NinePatchBitmap() { - if (_destroy_bmp) + if (_destroy_bmp) { + _bmp->free(); delete _bmp; + } } void NinePatchBitmap::drawRegions(Graphics::Surface &target, int dx, int dy, int dw, int dh) { |