diff --git a/colorchecker.h b/colorchecker.h index eec63ec..9967e04 100644 --- a/colorchecker.h +++ b/colorchecker.h @@ -74,20 +74,15 @@ int32_t ScoreLut(const Image& image, const LutBase& lut) { Array diff; diff.fill(INT32_MAX); - for (int32_t y = 0; y < Y; ++y) { - const auto& row = image.at(y); - - for (int32_t x = 0; x < X; ++x) { - const auto pixel = lut.MapColor(row.at(x)); - - for (int32_t cc = 0; cc < kColorCheckerSrgb.ssize(); ++cc) { - auto pixel_diff = pixel.AbsDiff(kColorCheckerSrgb.at(cc)); - if (pixel_diff < diff.at(cc)) { - diff.at(cc) = pixel_diff; - } + image.ForEach([&diff, &lut](const RgbColor& color) { + const auto pixel = lut.MapColor(color); + for (int32_t cc = 0; cc < kColorCheckerSrgb.ssize(); ++cc) { + auto pixel_diff = pixel.AbsDiff(kColorCheckerSrgb.at(cc)); + if (pixel_diff < diff.at(cc)) { + diff.at(cc) = pixel_diff; } } - } + }); return std::accumulate(diff.begin(), diff.end(), 0); } diff --git a/image.h b/image.h index cfec073..3e97693 100644 --- a/image.h +++ b/image.h @@ -9,11 +9,27 @@ #include "color.h" #include "coord.h" +class ImageBase {}; + + +template +class ImageColorBase : public ImageBase { + public: + ImageColorBase() = default; + ImageColorBase(const ImageColorBase&) = default; + virtual ~ImageColorBase() = default; + + virtual void ForEach(std::function callback) const = 0; +}; + + template -class Image : public Array, Y> { +class Image : public Array, Y>, ImageColorBase { public: constexpr const C& GetPixel(const Coord<2>& coord) const; + void ForEach(std::function callback) const override; + void SetPixel(const Coord<2>& coord, const C& color); void DrawXLine(const Coord<2>& start, const C& color, int32_t length); void DrawYLine(const Coord<2>& start, const C& color, int32_t length); @@ -28,6 +44,16 @@ constexpr const C& Image::GetPixel(const Coord<2>& coord) const { return this->at(coord.at(1)).at(coord.at(0)); } +template +void Image::ForEach(std::function callback) const { + for (int32_t y = 0; y < Y; ++y) { + const auto& row = this->at(y); + for (int32_t x = 0; x < X; ++x) { + callback(row.at(x)); + } + } +} + template void Image::SetPixel(const Coord<2>& coord, const C& color) { if (coord.at(0) >= X || coord.at(1) >= Y) {