diff --git a/engines/qdengine/qd_runtime.cpp b/engines/qdengine/qd_runtime.cpp index 9b6a4a400d58..746e58de503a 100644 --- a/engines/qdengine/qd_runtime.cpp +++ b/engines/qdengine/qd_runtime.cpp @@ -35,6 +35,7 @@ #include "qdengine/qdcore/util/ResourceDispatcher.h" #include "qdengine/qdcore/util/WinVideo.h" #include "qdengine/system/graphics/gr_dispatcher.h" +#include "qdengine/system/graphics/rle_compress.h" #include "qdengine/system/input/input_wndproc.h" #include "qdengine/system/input/mouse_input.h" #include "qdengine/system/input/keyboard_input.h" @@ -319,6 +320,8 @@ int QDEngineEngine::engineMain() { winVideo::done(); + RLEBuffer::releaseBuffers(); + return 0; } diff --git a/engines/qdengine/system/graphics/rle_compress.cpp b/engines/qdengine/system/graphics/rle_compress.cpp index 64a5a0145f0e..862bea95eb03 100644 --- a/engines/qdengine/system/graphics/rle_compress.cpp +++ b/engines/qdengine/system/graphics/rle_compress.cpp @@ -29,8 +29,18 @@ namespace QDEngine { -Std::vector RLEBuffer::_buffer0(4096); -Std::vector RLEBuffer::_buffer1(4096); +byte *g_buffer0 = nullptr; +byte *g_buffer1 = nullptr; +int g_buffersLen = 0; + +static void ensureBuffers() { + if (g_buffer0 == nullptr) { + g_buffer0 = (byte *)calloc(4096, 1); + g_buffer1 = (byte *)calloc(4096, 1); + + g_buffersLen = 4096; + } +} bool operator == (const RLEBuffer &buf1, const RLEBuffer &buf2) { if (!(buf1._header_offset == buf2._header_offset)) return false; @@ -49,6 +59,8 @@ RLEBuffer::RLEBuffer(const RLEBuffer &buf) : _header_offset(buf._header_offset), _header(buf._header), _data(buf._data), _bits_per_pixel(buf._bits_per_pixel) { + + ensureBuffers(); } RLEBuffer::~RLEBuffer() { @@ -59,6 +71,31 @@ RLEBuffer::~RLEBuffer() { _data.clear(); } +bool RLEBuffer::decode_line(int y, int buffer_id) const { + ensureBuffers(); + + if (buffer_id) + return decode_line(y, g_buffer1); + else + return decode_line(y, g_buffer0); +} + + const byte *RLEBuffer::get_buffer(int buffer_id) { + ensureBuffers(); + + if (buffer_id) + return g_buffer1; + else + return g_buffer0; +} + +void RLEBuffer::releaseBuffers() { + free(g_buffer0); + g_buffer0 = nullptr; + free(g_buffer1); + g_buffer1 = nullptr; +} + RLEBuffer &RLEBuffer::operator = (const RLEBuffer &buf) { if (this == &buf) return *this; @@ -258,10 +295,12 @@ bool RLEBuffer::convert_data(int bits_per_pixel) { void RLEBuffer::resize_buffers() { uint32 len = line_length() * sizeof(uint32); - if (_buffer0.size() < len) - _buffer0.resize(len); - if (_buffer1.size() < len) - _buffer1.resize(len); + if (g_buffersLen < len) { + if (!realloc(g_buffer0, len) || !realloc(g_buffer1, len)) + error("RLEBuffer::resize_buffers(): Cannot realloc buffers"); + + g_buffersLen = len; + } } int RLEBuffer::line_length() { diff --git a/engines/qdengine/system/graphics/rle_compress.h b/engines/qdengine/system/graphics/rle_compress.h index 50b454568db6..8196714f3ee3 100644 --- a/engines/qdengine/system/graphics/rle_compress.h +++ b/engines/qdengine/system/graphics/rle_compress.h @@ -38,19 +38,11 @@ class RLEBuffer { bool decode_line(int y, byte *out_buf) const; - inline bool decode_line(int y, int buffer_id = 0) const { - if (buffer_id) - return decode_line(y, &*_buffer1.begin()); - else - return decode_line(y, &*_buffer0.begin()); - } + bool decode_line(int y, int buffer_id = 0) const; bool decode_pixel(int x, int y, uint32 &pixel); - static inline const byte *get_buffer(int buffer_id) { - if (buffer_id) return &*_buffer1.begin(); - else return &*_buffer0.begin(); - } + static const byte *get_buffer(int buffer_id); void resize_buffers(); @@ -76,6 +68,8 @@ class RLEBuffer { bool convert_data(int bits_per_pixel = 16); + static void releaseBuffers(); + private: Std::vector _header_offset; Std::vector _data_offset; @@ -85,9 +79,6 @@ class RLEBuffer { int _bits_per_pixel; - static Std::vector _buffer0; - static Std::vector _buffer1; - friend bool operator == (const RLEBuffer &buf1, const RLEBuffer &buf2); };