mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-05 00:39:50 +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);
|
const Cel* cel = layer->cel(frame);
|
||||||
if (cel) {
|
if (cel) {
|
||||||
const Image* image = cel->image();
|
const Image* image = cel->image();
|
||||||
if (image) {
|
newMask.fromImage(image, cel->bounds().origin());
|
||||||
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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -10,9 +10,8 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "doc/mask.h"
|
#include "doc/mask.h"
|
||||||
|
|
||||||
#include "base/memory.h"
|
|
||||||
#include "doc/image_impl.h"
|
#include "doc/image_impl.h"
|
||||||
|
#include "gfx/point.h"
|
||||||
|
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#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)
|
void Mask::offsetOrigin(int dx, int dy)
|
||||||
{
|
{
|
||||||
m_bounds.offset(dx, dy);
|
m_bounds.offset(dx, dy);
|
||||||
|
@ -76,6 +76,7 @@ namespace doc {
|
|||||||
|
|
||||||
// Copies the data from the given mask.
|
// Copies the data from the given mask.
|
||||||
void copyFrom(const Mask* sourceMask);
|
void copyFrom(const Mask* sourceMask);
|
||||||
|
void fromImage(const Image* image, const gfx::Point& maskOrigin);
|
||||||
|
|
||||||
// Replace the whole mask with the given region.
|
// Replace the whole mask with the given region.
|
||||||
void replace(const gfx::Rect& bounds);
|
void replace(const gfx::Rect& bounds);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user