aboutsummaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'graphics')
-rw-r--r--graphics/surface.cpp60
-rw-r--r--graphics/surface.h16
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