mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-04 15:40:10 +00:00
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:
parent
073a1d8794
commit
66af5a7db1
@ -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 {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user