diff --git a/src/app/util/layer_boundaries.cpp b/src/app/util/layer_boundaries.cpp index 4eb1c548d..5c94a907d 100644 --- a/src/app/util/layer_boundaries.cpp +++ b/src/app/util/layer_boundaries.cpp @@ -37,63 +37,7 @@ void select_layer_boundaries(Layer* layer, const Cel* cel = layer->cel(frame); if (cel) { const Image* image = cel->image(); - if (image) { - newMask.replace(cel->bounds()); - newMask.freeze(); - { - LockImageBits maskBits(newMask.bitmap()); - auto maskIt = maskBits.begin(); - auto maskEnd = maskBits.end(); - - switch (image->pixelFormat()) { - - case IMAGE_RGB: { - LockImageBits rgbBits(image); - auto rgbIt = rgbBits.begin(); -#if _DEBUG - auto rgbEnd = rgbBits.end(); -#endif - for (; maskIt != maskEnd; ++maskIt, ++rgbIt) { - ASSERT(rgbIt != rgbEnd); - color_t c = *rgbIt; - *maskIt = (rgba_geta(c) >= 128); // TODO configurable threshold - } - break; - } - - case IMAGE_GRAYSCALE: { - LockImageBits grayBits(image); - auto grayIt = grayBits.begin(); -#if _DEBUG - auto grayEnd = grayBits.end(); -#endif - for (; maskIt != maskEnd; ++maskIt, ++grayIt) { - ASSERT(grayIt != grayEnd); - color_t c = *grayIt; - *maskIt = (graya_geta(c) >= 128); // TODO configurable threshold - } - break; - } - - case IMAGE_INDEXED: { - const doc::color_t maskColor = image->maskColor(); - LockImageBits idxBits(image); - auto idxIt = idxBits.begin(); -#if _DEBUG - auto idxEnd = idxBits.end(); -#endif - for (; maskIt != maskEnd; ++maskIt, ++idxIt) { - ASSERT(idxIt != idxEnd); - color_t c = *idxIt; - *maskIt = (c != maskColor); - } - break; - } - - } - } - newMask.unfreeze(); - } + newMask.fromImage(image, cel->bounds().origin()); } try { diff --git a/src/doc/mask.cpp b/src/doc/mask.cpp index baadd491a..140257fa0 100644 --- a/src/doc/mask.cpp +++ b/src/doc/mask.cpp @@ -10,9 +10,8 @@ #endif #include "doc/mask.h" - -#include "base/memory.h" #include "doc/image_impl.h" +#include "gfx/point.h" #include #include @@ -129,6 +128,67 @@ void Mask::copyFrom(const Mask* sourceMask) } } +void Mask::fromImage(const Image* image, const gfx::Point& maskOrigin) +{ + if (image) { + replace(image->bounds().setOrigin(maskOrigin)); + freeze(); + { + LockImageBits maskBits(bitmap()); + auto maskIt = maskBits.begin(); + auto maskEnd = maskBits.end(); + + switch (image->pixelFormat()) { + + case IMAGE_RGB: { + LockImageBits rgbBits(image); + auto rgbIt = rgbBits.begin(); +#if _DEBUG + auto rgbEnd = rgbBits.end(); +#endif + for (; maskIt != maskEnd; ++maskIt, ++rgbIt) { + ASSERT(rgbIt != rgbEnd); + color_t c = *rgbIt; + *maskIt = (rgba_geta(c) >= 128); // TODO configurable threshold + } + break; + } + + case IMAGE_GRAYSCALE: { + LockImageBits grayBits(image); + auto grayIt = grayBits.begin(); +#if _DEBUG + auto grayEnd = grayBits.end(); +#endif + for (; maskIt != maskEnd; ++maskIt, ++grayIt) { + ASSERT(grayIt != grayEnd); + color_t c = *grayIt; + *maskIt = (graya_geta(c) >= 128); // TODO configurable threshold + } + break; + } + + case IMAGE_INDEXED: { + const doc::color_t maskColor = image->maskColor(); + LockImageBits idxBits(image); + auto idxIt = idxBits.begin(); +#if _DEBUG + auto idxEnd = idxBits.end(); +#endif + for (; maskIt != maskEnd; ++maskIt, ++idxIt) { + ASSERT(idxIt != idxEnd); + color_t c = *idxIt; + *maskIt = (c != maskColor); + } + break; + } + + } + } + unfreeze(); + } +} + void Mask::offsetOrigin(int dx, int dy) { m_bounds.offset(dx, dy); diff --git a/src/doc/mask.h b/src/doc/mask.h index be6f0b8ee..e02465904 100644 --- a/src/doc/mask.h +++ b/src/doc/mask.h @@ -76,6 +76,7 @@ namespace doc { // Copies the data from the given mask. void copyFrom(const Mask* sourceMask); + void fromImage(const Image* image, const gfx::Point& maskOrigin); // Replace the whole mask with the given region. void replace(const gfx::Rect& bounds);