aboutsummaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
authorEugene Sandulenko2016-09-02 23:39:32 +0200
committerGitHub2016-09-02 23:39:32 +0200
commitb1657f47483c3ad4fe653fe7ddd837842c07a708 (patch)
tree59b414b14c5dc83d982d0b9dea5c270b83a18dd2 /graphics
parentd4f9c0e361cb85d9674e44c6762722ac84be0d2d (diff)
parentec6bb1431eb3e54f4a1dddd051cb9b8dfa14f43d (diff)
downloadscummvm-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.cpp15
-rw-r--r--graphics/macgui/macwindowborder.cpp9
-rw-r--r--graphics/macgui/macwindowborder.h4
-rw-r--r--graphics/macgui/macwindowmanager.cpp1
-rw-r--r--graphics/nine_patch.cpp19
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) {