aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBorja Lorente2016-07-31 18:25:02 +0200
committerBorja Lorente2016-08-02 08:33:50 +0200
commit02a18134c380acbddd8a7d3fa11a19fff3f21a55 (patch)
tree210738947c66127350289921172c677c9928f9de
parent03f2d9b01ed392488269647d557b25f41a86fc84 (diff)
downloadscummvm-rg350-02a18134c380acbddd8a7d3fa11a19fff3f21a55.tar.gz
scummvm-rg350-02a18134c380acbddd8a7d3fa11a19fff3f21a55.tar.bz2
scummvm-rg350-02a18134c380acbddd8a7d3fa11a19fff3f21a55.zip
GRAPHICS: Add basic caching to 9patch colors
-rw-r--r--graphics/nine_patch.cpp26
-rw-r--r--graphics/nine_patch.h4
2 files changed, 20 insertions, 10 deletions
diff --git a/graphics/nine_patch.cpp b/graphics/nine_patch.cpp
index f89a0f2df7..fa2ef20a6e 100644
--- a/graphics/nine_patch.cpp
+++ b/graphics/nine_patch.cpp
@@ -235,6 +235,11 @@ void NinePatchBitmap::blit(Graphics::Surface &target, int dx, int dy, int dw, in
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);
@@ -334,18 +339,21 @@ static inline uint32 dist(uint32 a, uint32 b) {
}
byte NinePatchBitmap::closestGrayscale(uint32 color, byte* palette, byte paletteLength) {
- byte target = grayscale(color);
- byte bestNdx = 0;
- byte bestColor = grayscale(palette[0], palette[1], palette[2]);
- for (byte i = 1; i < paletteLength; ++i) {
- byte current = grayscale(palette[i * 3], palette[(i * 3) + 1], palette[(i * 3) + 2]);
- if (dist(target, bestColor) >= dist(target, current)) {
- bestColor = current;
- bestNdx = i;
+ if (!_cached_colors.contains(color)) {
+ byte target = grayscale(color);
+ byte bestNdx = 0;
+ byte bestColor = grayscale(palette[0], palette[1], palette[2]);
+ for (byte i = 1; i < paletteLength; ++i) {
+ byte current = grayscale(palette[i * 3], palette[(i * 3) + 1], palette[(i * 3) + 2]);
+ if (dist(target, bestColor) >= dist(target, current)) {
+ bestColor = current;
+ bestNdx = i;
+ }
}
+ _cached_colors[color] = bestNdx;
}
- return bestNdx;
+ return _cached_colors[color];
}
} // end of namespace Graphics
diff --git a/graphics/nine_patch.h b/graphics/nine_patch.h
index b40f3bf980..aa81a2fc1f 100644
--- a/graphics/nine_patch.h
+++ b/graphics/nine_patch.h
@@ -48,6 +48,7 @@
#include "common/array.h"
#include "common/rect.h"
+#include "common/hashmap.h"
namespace Graphics {
@@ -81,6 +82,7 @@ class NinePatchBitmap {
bool _destroy_bmp;
int _width, _height;
int _cached_dw, _cached_dh;
+ Common::HashMap<uint32, int> _cached_colors;
public:
NinePatchBitmap(Graphics::TransparentSurface *bmp, bool owns_bitmap);
@@ -88,7 +90,7 @@ public:
void blit(Graphics::Surface &target, int dx, int dy, int dw, int dh, byte *palette = NULL, byte numColors = 0);
void blitClip(Graphics::Surface &target, Common::Rect clip, int dx, int dy, int dw, int dh);
-
+
int getWidth() { return _width; }
int getHeight() { return _height; }
int getMinWidth() { return _h._fix; }