mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-15 20:42:40 +00:00
Fix crash trying to move the selection from a empty cel
This commit is contained in:
parent
d1fc7f643a
commit
0b3ec08987
@ -118,8 +118,9 @@ void PixelsMovement::cutMask()
|
|||||||
{
|
{
|
||||||
{
|
{
|
||||||
ContextWriter writer(m_reader);
|
ContextWriter writer(m_reader);
|
||||||
m_document->getApi().clearMask(m_layer, writer.cel(),
|
if (writer.cel())
|
||||||
app_get_color_to_clear_layer(m_layer));
|
m_document->getApi().clearMask(m_layer, writer.cel(),
|
||||||
|
app_get_color_to_clear_layer(m_layer));
|
||||||
}
|
}
|
||||||
|
|
||||||
copyMask();
|
copyMask();
|
||||||
|
@ -225,17 +225,15 @@ bool StandbyState::onMouseDown(Editor* editor, MouseMessage* msg)
|
|||||||
if (editor->isInsideSelection() &&
|
if (editor->isInsideSelection() &&
|
||||||
currentTool->getInk(0)->isSelection() &&
|
currentTool->getInk(0)->isSelection() &&
|
||||||
msg->left()) {
|
msg->left()) {
|
||||||
|
if (!layer->isWritable()) {
|
||||||
|
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int x, y, opacity;
|
int x, y, opacity;
|
||||||
Image* image = location.image(&x, &y, &opacity);
|
Image* image = location.image(&x, &y, &opacity);
|
||||||
if (image) {
|
// Change to MovingPixelsState
|
||||||
if (!layer->isWritable()) {
|
transformSelection(editor, msg, MoveHandle);
|
||||||
Alert::show(PACKAGE "<<The layer is locked.||&Close");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Change to MovingPixelsState
|
|
||||||
transformSelection(editor, msg, MoveHandle);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,31 +52,32 @@ Image* NewImageFromMask(const DocumentLocation& location)
|
|||||||
ASSERT(srcSprite);
|
ASSERT(srcSprite);
|
||||||
ASSERT(srcMask);
|
ASSERT(srcMask);
|
||||||
ASSERT(srcMaskBitmap);
|
ASSERT(srcMaskBitmap);
|
||||||
ASSERT(src);
|
|
||||||
|
|
||||||
dst = Image::create(srcSprite->pixelFormat(), srcBounds.w, srcBounds.h);
|
dst = Image::create(srcSprite->pixelFormat(), srcBounds.w, srcBounds.h);
|
||||||
if (!dst)
|
if (!dst)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
// Clear the new image
|
// Clear the new image
|
||||||
dst->setMaskColor(src->maskColor());
|
dst->setMaskColor(src ? src->maskColor(): srcSprite->transparentColor());
|
||||||
clear_image(dst, dst->maskColor());
|
clear_image(dst, dst->maskColor());
|
||||||
|
|
||||||
// Copy the masked zones
|
// Copy the masked zones
|
||||||
const LockImageBits<BitmapTraits> maskBits(srcMaskBitmap, gfx::Rect(0, 0, srcBounds.w, srcBounds.h));
|
if (src) {
|
||||||
LockImageBits<BitmapTraits>::const_iterator mask_it = maskBits.begin();
|
const LockImageBits<BitmapTraits> maskBits(srcMaskBitmap, gfx::Rect(0, 0, srcBounds.w, srcBounds.h));
|
||||||
|
LockImageBits<BitmapTraits>::const_iterator mask_it = maskBits.begin();
|
||||||
|
|
||||||
for (v=0; v<srcBounds.h; ++v) {
|
for (v=0; v<srcBounds.h; ++v) {
|
||||||
for (u=0; u<srcBounds.w; ++u, ++mask_it) {
|
for (u=0; u<srcBounds.w; ++u, ++mask_it) {
|
||||||
ASSERT(mask_it != maskBits.end());
|
ASSERT(mask_it != maskBits.end());
|
||||||
|
|
||||||
if (*mask_it) {
|
if (*mask_it) {
|
||||||
getx = u+srcBounds.x-x;
|
getx = u+srcBounds.x-x;
|
||||||
gety = v+srcBounds.y-y;
|
gety = v+srcBounds.y-y;
|
||||||
|
|
||||||
if ((getx >= 0) && (getx < src->width()) &&
|
if ((getx >= 0) && (getx < src->width()) &&
|
||||||
(gety >= 0) && (gety < src->height()))
|
(gety >= 0) && (gety < src->height()))
|
||||||
dst->putPixel(u, v, src->getPixel(getx, gety));
|
dst->putPixel(u, v, src->getPixel(getx, gety));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user