diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/surface.cpp | 60 | ||||
-rw-r--r-- | graphics/surface.h | 16 |
2 files changed, 76 insertions, 0 deletions
diff --git a/graphics/surface.cpp b/graphics/surface.cpp index 67ed942b0b..8e5a22aec6 100644 --- a/graphics/surface.cpp +++ b/graphics/surface.cpp @@ -498,4 +498,64 @@ Graphics::Surface *Surface::convertTo(const PixelFormat &dstFormat, const byte * return surface; } +FloodFill::FloodFill(Graphics::Surface *surface, uint32 oldColor, uint32 fillColor) { + _surface = surface; + _oldColor = oldColor; + _fillColor = fillColor; + _w = surface->w; + _h = surface->h; + + _visited = (byte *)calloc(_w * _h, 1); +} + +FloodFill::~FloodFill() { + while(!_queue.empty()) { + Common::Point *p = _queue.front(); + + delete p; + _queue.pop_front(); + } + + free(_visited); +} + +void FloodFill::addSeed(int x, int y) { + if (x >= 0 && x < _w && y >= 0 && y < _h) { + if (!_visited[y * _w + x]) { + _visited[y * _w + x] = 1; + void *p = _surface->getBasePtr(x, y); + + if (_surface->format.bytesPerPixel == 1) { + if (*((byte *)p) == _oldColor) + *((byte *)p) = _fillColor; + } else if (_surface->format.bytesPerPixel == 2) { + if (READ_UINT16(p) == _oldColor) + WRITE_UINT16(p, _fillColor); + } else if (_surface->format.bytesPerPixel == 4) { + if (READ_UINT32(p) == _oldColor) + WRITE_UINT32(p, _fillColor); + } else { + error("Unsupported bpp in FloodFill"); + } + + Common::Point *pt = new Common::Point(x, y); + + _queue.push_back(pt); + } + } +} + +void FloodFill::fill() { + while (!_queue.empty()) { + Common::Point *p = _queue.front(); + _queue.pop_front(); + addSeed(p->x , p->y - 1); + addSeed(p->x - 1, p->y ); + addSeed(p->x , p->y + 1); + addSeed(p->x + 1, p->y ); + + delete p; + } +} + } // End of namespace Graphics diff --git a/graphics/surface.h b/graphics/surface.h index aaa386b168..e5685bf997 100644 --- a/graphics/surface.h +++ b/graphics/surface.h @@ -24,9 +24,11 @@ #define GRAPHICS_SURFACE_H #include "common/scummsys.h" +#include "common/list.h" namespace Common { struct Rect; +struct Point; } #include "graphics/pixelformat.h" @@ -341,6 +343,20 @@ struct SharedPtrSurfaceDeleter { } }; +class FloodFill { +public: + FloodFill(Surface *surface, uint32 oldColor, uint32 fillColor); + ~FloodFill(); + void addSeed(int x, int y); + void fill(); + +private: + Common::List<Common::Point *> _queue; + Surface *_surface; + uint32 _oldColor, _fillColor; + byte *_visited; + int _w, _h; +}; } // End of namespace Graphics |