[Scummvm-git-logs] scummvm master -> 40f671078cc435e5fdff8c360657e5ccecbf51ee

sev- noreply at scummvm.org
Sun Apr 27 12:31:32 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
40f671078c GRAPHICS: Add palette constructor for ownership of data


Commit: 40f671078cc435e5fdff8c360657e5ccecbf51ee
    https://github.com/scummvm/scummvm/commit/40f671078cc435e5fdff8c360657e5ccecbf51ee
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2025-04-27T20:31:29+08:00

Commit Message:
GRAPHICS: Add palette constructor for ownership of data

Changed paths:
    engines/mm/mm1/gfx/gfx.cpp
    graphics/palette.cpp
    graphics/palette.h


diff --git a/engines/mm/mm1/gfx/gfx.cpp b/engines/mm/mm1/gfx/gfx.cpp
index ce9774cdaec..0a9a7a15bbf 100644
--- a/engines/mm/mm1/gfx/gfx.cpp
+++ b/engines/mm/mm1/gfx/gfx.cpp
@@ -33,7 +33,7 @@ namespace Gfx {
 byte EGA_INDEXES[EGA_PALETTE_COUNT];
 
 void GFX::setEgaPalette() {
-	Graphics::Palette ega = Graphics::Palette::createEGAPalette();
+	const Graphics::Palette ega = Graphics::Palette::createEGAPalette();
 	g_system->getPaletteManager()->setPalette(ega);
 
 	uint32 c = 0xffffffff;
@@ -45,7 +45,7 @@ void GFX::setEgaPalette() {
 }
 
 void GFX::findPalette(const byte palette[256 * 3]) {
-	Graphics::Palette ega = Graphics::Palette::createEGAPalette();
+	const Graphics::Palette ega = Graphics::Palette::createEGAPalette();
 	const byte *data = ega.data();
 
 	for (int col = 0; col < 16; ++col) {
diff --git a/graphics/palette.cpp b/graphics/palette.cpp
index b21947253f1..575aade7f53 100644
--- a/graphics/palette.cpp
+++ b/graphics/palette.cpp
@@ -32,13 +32,13 @@ static const byte EGA_PALETTE[16][3] = {
 };
 
 
-Palette::Palette(uint size) : _data(nullptr), _size(size) {
+Palette::Palette(uint size) : _data(nullptr), _size(size), _disposeAfterUse(DisposeAfterUse::YES) {
 	if (_size > 0) {
 		_data = new byte[_size * 3]();
 	}
 }
 
-Palette::Palette(const byte *data, uint size) : _data(nullptr), _size(0) {
+Palette::Palette(const byte *data, uint size) : _data(nullptr), _size(0), _disposeAfterUse(DisposeAfterUse::YES) {
 	if (data && size > 0) {
 		_size = size;
 		_data = new byte[_size * 3]();
@@ -46,7 +46,10 @@ Palette::Palette(const byte *data, uint size) : _data(nullptr), _size(0) {
 	}
 }
 
-Palette::Palette(const Palette &p) : _data(nullptr), _size(p._size) {
+Palette::Palette(byte *data, uint size, DisposeAfterUse::Flag disposeAfterUse) : _data(data), _size(size), _disposeAfterUse(disposeAfterUse) {
+}
+
+Palette::Palette(const Palette &p) : _data(nullptr), _size(p._size), _disposeAfterUse(DisposeAfterUse::YES) {
 	if (_size > 0) {
 		_data = new byte[_size * 3]();
 		memcpy(_data, p._data, _size * 3);
@@ -54,21 +57,23 @@ Palette::Palette(const Palette &p) : _data(nullptr), _size(p._size) {
 }
 
 Palette::~Palette() {
-	delete[] _data;
+	if (_disposeAfterUse == DisposeAfterUse::YES)
+		delete[] _data;
 }
 
-Palette Palette::createEGAPalette() {
-	return Palette(&EGA_PALETTE[0][0], 16);
+const Palette Palette::createEGAPalette() {
+	return Palette(const_cast<byte *>(&EGA_PALETTE[0][0]), 16, DisposeAfterUse::NO);
 }
 
-
 Palette &Palette::operator=(const Palette &rhs) {
-	delete[] _data;
+	if (_disposeAfterUse == DisposeAfterUse::YES)
+		delete[] _data;
 	_data = nullptr;
 	_size = rhs._size;
 
 	if (_size > 0) {
 		_data = new byte[_size * 3]();
+		_disposeAfterUse = DisposeAfterUse::YES;
 		memcpy(_data, rhs._data, _size * 3);
 	}
 
@@ -84,7 +89,8 @@ bool Palette::contains(const Palette& p) const {
 }
 
 void Palette::clear() {
-	delete[] _data;
+	if (_disposeAfterUse == DisposeAfterUse::YES)
+		delete[] _data;
 	_data = nullptr;
 	_size = 0;
 }
@@ -95,8 +101,10 @@ void Palette::resize(uint newSize, bool preserve) {
 		if (_size > 0 && preserve)
 			memcpy(newData, _data, _size * 3);
 
-		delete[] _data;
+		if (_disposeAfterUse == DisposeAfterUse::YES)
+			delete[] _data;
 		_data = newData;
+		_disposeAfterUse = DisposeAfterUse::YES;
 	}
 	_size = newSize;
 }
diff --git a/graphics/palette.h b/graphics/palette.h
index e63299c7d52..90946032c15 100644
--- a/graphics/palette.h
+++ b/graphics/palette.h
@@ -23,6 +23,7 @@
 #define GRAPHICS_PALETTE_H
 
 #include "common/hashmap.h"
+#include "common/types.h"
 
 namespace Graphics {
 
@@ -51,6 +52,7 @@ constexpr int PALETTE_SIZE = (256 * 3);
 class Palette {
 	byte *_data;
 	uint16 _size;
+	DisposeAfterUse::Flag _disposeAfterUse;
 
 public:
 	static const uint16 npos = 0xFFFF;
@@ -63,13 +65,22 @@ public:
 	Palette(uint size);
 
 	/**
-	 * @brief Construct a new Palette object
+	 * @brief Construct a new Palette object with a copy of the palette data
 	 *
 	 * @param data   the palette data, in interleaved RGB format
 	 * @param size   the number of palette entries
 	 */
 	Palette(const byte *data, uint size);
 
+	/**
+	 * @brief Construct a new Palette object taking ownership of the palette data
+	 *
+	 * @param data   the palette data, in interleaved RGB format
+	 * @param size   the number of palette entries
+	 * @param disposeAfterUse    a flag indicating whether to dispose of the palette data
+	 */
+	Palette(byte *data, uint size, DisposeAfterUse::Flag disposeAfterUse);
+
 	Palette(const Palette &p);
 
 	~Palette();
@@ -77,7 +88,7 @@ public:
 	/**
 	 * Constructs a new palette containing the standarad EGA palette
 	 */
-	static Palette createEGAPalette();
+	static const Palette createEGAPalette();
 
 	Palette &operator=(const Palette &rhs);
 	bool operator==(const Palette &rhs) const { return equals(rhs); }




More information about the Scummvm-git-logs mailing list