Create Mask::fromImage method

Moved code from select_layer_boundaries to this new
Mask's method to create a mask from an image
This commit is contained in:
Martín Capello 2024-07-05 11:23:13 -03:00 committed by David Capello
parent 073a1d8794
commit 66af5a7db1
3 changed files with 64 additions and 59 deletions

View File

@ -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<BitmapTraits> maskBits(newMask.bitmap());
auto maskIt = maskBits.begin();
auto maskEnd = maskBits.end();
switch (image->pixelFormat()) {
case IMAGE_RGB: {
LockImageBits<RgbTraits> 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<GrayscaleTraits> 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<IndexedTraits> 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 {

View File

@ -10,9 +10,8 @@
#endif
#include "doc/mask.h"
#include "base/memory.h"
#include "doc/image_impl.h"
#include "gfx/point.h"
#include <cstdlib>
#include <cstring>
@ -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<BitmapTraits> maskBits(bitmap());
auto maskIt = maskBits.begin();
auto maskEnd = maskBits.end();
switch (image->pixelFormat()) {
case IMAGE_RGB: {
LockImageBits<RgbTraits> 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<GrayscaleTraits> 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<IndexedTraits> 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);

View File

@ -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);