From 02a18134c380acbddd8a7d3fa11a19fff3f21a55 Mon Sep 17 00:00:00 2001 From: Borja Lorente Date: Sun, 31 Jul 2016 18:25:02 +0200 Subject: GRAPHICS: Add basic caching to 9patch colors --- graphics/nine_patch.cpp | 26 +++++++++++++++++--------- graphics/nine_patch.h | 4 +++- 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 _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; } -- cgit v1.2.3