mirror of
https://github.com/aseprite/aseprite.git
synced 2025-04-10 03:44:16 +00:00
Remove pimpl idiom from PixelsMovement class as it is used in just one file.
This commit is contained in:
parent
aedaf7e5b8
commit
d82507df9a
@ -18,276 +18,199 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "widgets/editor/pixels_movement.h"
|
||||||
|
|
||||||
#include "app.h"
|
#include "app.h"
|
||||||
#include "document.h"
|
#include "document.h"
|
||||||
#include "document_wrappers.h"
|
|
||||||
#include "modules/gui.h"
|
#include "modules/gui.h"
|
||||||
#include "raster/cel.h"
|
#include "raster/cel.h"
|
||||||
#include "raster/image.h"
|
#include "raster/image.h"
|
||||||
#include "raster/mask.h"
|
#include "raster/mask.h"
|
||||||
#include "raster/sprite.h"
|
#include "raster/sprite.h"
|
||||||
#include "undo_transaction.h"
|
|
||||||
#include "util/expand_cel_canvas.h"
|
#include "util/expand_cel_canvas.h"
|
||||||
#include "widgets/editor/pixels_movement.h"
|
|
||||||
|
|
||||||
using namespace gfx;
|
using namespace gfx;
|
||||||
|
|
||||||
class PixelsMovementImpl
|
PixelsMovement::PixelsMovement(Document* document, Sprite* sprite, const Image* moveThis, int initial_x, int initial_y, int opacity)
|
||||||
|
: m_documentReader(document)
|
||||||
|
, m_sprite(sprite)
|
||||||
|
, m_undoTransaction(document, "Pixels Movement")
|
||||||
|
, m_initial_x(initial_x)
|
||||||
|
, m_initial_y(initial_y)
|
||||||
|
, m_firstDrop(true)
|
||||||
|
, m_isDragging(false)
|
||||||
{
|
{
|
||||||
const DocumentReader m_documentReader;
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
Sprite* m_sprite;
|
documentWriter->prepareExtraCel(initial_x, initial_y, moveThis->w, moveThis->h, opacity);
|
||||||
UndoTransaction m_undoTransaction;
|
|
||||||
int m_initial_x, m_initial_y;
|
|
||||||
int m_catch_x, m_catch_y;
|
|
||||||
bool m_firstDrop;
|
|
||||||
bool m_isDragging;
|
|
||||||
|
|
||||||
public:
|
Image* extraImage = documentWriter->getExtraCelImage();
|
||||||
PixelsMovementImpl(Document* document, Sprite* sprite, const Image* moveThis, int initial_x, int initial_y, int opacity)
|
image_copy(extraImage, moveThis, 0, 0);
|
||||||
: m_documentReader(document)
|
|
||||||
, m_sprite(sprite)
|
|
||||||
, m_undoTransaction(document, "Pixels Movement")
|
|
||||||
, m_initial_x(initial_x)
|
|
||||||
, m_initial_y(initial_y)
|
|
||||||
, m_firstDrop(true)
|
|
||||||
, m_isDragging(false)
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
documentWriter->prepareExtraCel(initial_x, initial_y, moveThis->w, moveThis->h, opacity);
|
|
||||||
|
|
||||||
Image* extraImage = documentWriter->getExtraCelImage();
|
|
||||||
image_copy(extraImage, moveThis, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
~PixelsMovementImpl()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void cutMask()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
m_undoTransaction.clearMask(app_get_color_to_clear_layer(m_sprite->getCurrentLayer()));
|
|
||||||
}
|
|
||||||
|
|
||||||
copyMask();
|
|
||||||
}
|
|
||||||
|
|
||||||
void copyMask()
|
|
||||||
{
|
|
||||||
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
|
|
||||||
Mask emptyMask;
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
documentWriter->generateMaskBoundaries(&emptyMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
update_screen_for_document(m_documentReader);
|
|
||||||
}
|
|
||||||
|
|
||||||
void catchImage(int x, int y)
|
|
||||||
{
|
|
||||||
m_catch_x = x;
|
|
||||||
m_catch_y = y;
|
|
||||||
m_isDragging = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void catchImageAgain(int x, int y)
|
|
||||||
{
|
|
||||||
// Create a new UndoTransaction to move the pixels to other position
|
|
||||||
const Cel* cel = m_documentReader->getExtraCel();
|
|
||||||
m_initial_x = cel->getX();
|
|
||||||
m_initial_y = cel->getY();
|
|
||||||
m_isDragging = true;
|
|
||||||
|
|
||||||
m_catch_x = x;
|
|
||||||
m_catch_y = y;
|
|
||||||
|
|
||||||
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
|
|
||||||
Mask emptyMask;
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
documentWriter->generateMaskBoundaries(&emptyMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
update_screen_for_document(m_documentReader);
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect moveImage(int x, int y)
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
Cel* cel = documentWriter->getExtraCel();
|
|
||||||
Image* image = documentWriter->getExtraCelImage();
|
|
||||||
int x1, y1, x2, y2;
|
|
||||||
int u1, v1, u2, v2;
|
|
||||||
|
|
||||||
x1 = cel->getX();
|
|
||||||
y1 = cel->getY();
|
|
||||||
x2 = cel->getX() + image->w;
|
|
||||||
y2 = cel->getY() + image->h;
|
|
||||||
|
|
||||||
int new_x = m_initial_x + x - m_catch_x;
|
|
||||||
int new_y = m_initial_y + y - m_catch_y;
|
|
||||||
|
|
||||||
// No movement
|
|
||||||
if (cel->getX() == new_x && cel->getY() == new_y)
|
|
||||||
return Rect();
|
|
||||||
|
|
||||||
cel->setPosition(new_x, new_y);
|
|
||||||
|
|
||||||
u1 = cel->getX();
|
|
||||||
v1 = cel->getY();
|
|
||||||
u2 = cel->getX() + image->w;
|
|
||||||
v2 = cel->getY() + image->h;
|
|
||||||
|
|
||||||
return Rect(MIN(x1, u1), MIN(y1, v1),
|
|
||||||
MAX(x2, u2) - MIN(x1, u1) + 1,
|
|
||||||
MAX(y2, v2) - MIN(y1, v1) + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dropImageTemporarily()
|
|
||||||
{
|
|
||||||
m_isDragging = false;
|
|
||||||
|
|
||||||
const Cel* cel = m_documentReader->getExtraCel();
|
|
||||||
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
|
|
||||||
// Show the mask again in the new position
|
|
||||||
if (m_firstDrop) {
|
|
||||||
m_firstDrop = false;
|
|
||||||
m_undoTransaction.setMaskPosition(cel->getX(), cel->getY());
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
documentWriter->getMask()->x = cel->getX();
|
|
||||||
documentWriter->getMask()->y = cel->getY();
|
|
||||||
}
|
|
||||||
documentWriter->generateMaskBoundaries();
|
|
||||||
}
|
|
||||||
|
|
||||||
update_screen_for_document(m_documentReader);
|
|
||||||
}
|
|
||||||
|
|
||||||
void dropImage()
|
|
||||||
{
|
|
||||||
m_isDragging = false;
|
|
||||||
|
|
||||||
const Cel* cel = m_documentReader->getExtraCel();
|
|
||||||
const Image* image = m_documentReader->getExtraCelImage();
|
|
||||||
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
{
|
|
||||||
// Expand the canvas to paste the image in the fully visible
|
|
||||||
// portion of sprite.
|
|
||||||
ExpandCelCanvas expandCelCanvas(documentWriter, m_sprite,
|
|
||||||
m_sprite->getCurrentLayer(), TILED_NONE);
|
|
||||||
|
|
||||||
image_merge(expandCelCanvas.getDestCanvas(), image,
|
|
||||||
cel->getX()-expandCelCanvas.getCel()->getX(),
|
|
||||||
cel->getY()-expandCelCanvas.getCel()->getY(),
|
|
||||||
cel->getOpacity(), BLEND_MODE_NORMAL);
|
|
||||||
|
|
||||||
expandCelCanvas.commit();
|
|
||||||
}
|
|
||||||
m_undoTransaction.commit();
|
|
||||||
|
|
||||||
documentWriter->destroyExtraCel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isDragging()
|
|
||||||
{
|
|
||||||
return m_isDragging;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rect getImageBounds()
|
|
||||||
{
|
|
||||||
const Cel* cel = m_documentReader->getExtraCel();
|
|
||||||
const Image* image = m_documentReader->getExtraCelImage();
|
|
||||||
|
|
||||||
ASSERT(cel != NULL);
|
|
||||||
ASSERT(image != NULL);
|
|
||||||
|
|
||||||
return Rect(cel->getX(), cel->getY(), image->w, image->h);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setMaskColor(uint32_t mask_color)
|
|
||||||
{
|
|
||||||
{
|
|
||||||
DocumentWriter documentWriter(m_documentReader);
|
|
||||||
Image* image = documentWriter->getExtraCelImage();
|
|
||||||
|
|
||||||
ASSERT(image != NULL);
|
|
||||||
|
|
||||||
image->mask_color = mask_color;
|
|
||||||
}
|
|
||||||
|
|
||||||
update_screen_for_document(m_documentReader);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////
|
|
||||||
// PixelsMovement
|
|
||||||
|
|
||||||
PixelsMovement::PixelsMovement(Document* document, Sprite* sprite, const Image* moveThis, int x, int y, int opacity)
|
|
||||||
{
|
|
||||||
m_impl = new PixelsMovementImpl(document, sprite, moveThis, x, y, opacity);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PixelsMovement::~PixelsMovement()
|
PixelsMovement::~PixelsMovement()
|
||||||
{
|
{
|
||||||
delete m_impl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::cutMask()
|
void PixelsMovement::cutMask()
|
||||||
{
|
{
|
||||||
m_impl->cutMask();
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
m_undoTransaction.clearMask(app_get_color_to_clear_layer(m_sprite->getCurrentLayer()));
|
||||||
|
}
|
||||||
|
|
||||||
|
copyMask();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::copyMask()
|
void PixelsMovement::copyMask()
|
||||||
{
|
{
|
||||||
m_impl->copyMask();
|
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
|
||||||
|
Mask emptyMask;
|
||||||
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
documentWriter->generateMaskBoundaries(&emptyMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_screen_for_document(m_documentReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::catchImage(int x, int y)
|
void PixelsMovement::catchImage(int x, int y)
|
||||||
{
|
{
|
||||||
m_impl->catchImage(x, y);
|
m_catch_x = x;
|
||||||
|
m_catch_y = y;
|
||||||
|
m_isDragging = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::catchImageAgain(int x, int y)
|
void PixelsMovement::catchImageAgain(int x, int y)
|
||||||
{
|
{
|
||||||
return m_impl->catchImageAgain(x, y);
|
// Create a new UndoTransaction to move the pixels to other position
|
||||||
|
const Cel* cel = m_documentReader->getExtraCel();
|
||||||
|
m_initial_x = cel->getX();
|
||||||
|
m_initial_y = cel->getY();
|
||||||
|
m_isDragging = true;
|
||||||
|
|
||||||
|
m_catch_x = x;
|
||||||
|
m_catch_y = y;
|
||||||
|
|
||||||
|
// Hide the mask (do not deselect it, it will be moved them using m_undoTransaction.setMaskPosition)
|
||||||
|
Mask emptyMask;
|
||||||
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
documentWriter->generateMaskBoundaries(&emptyMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
update_screen_for_document(m_documentReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect PixelsMovement::moveImage(int x, int y)
|
Rect PixelsMovement::moveImage(int x, int y)
|
||||||
{
|
{
|
||||||
return m_impl->moveImage(x, y);
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
Cel* cel = documentWriter->getExtraCel();
|
||||||
|
Image* image = documentWriter->getExtraCelImage();
|
||||||
|
int x1, y1, x2, y2;
|
||||||
|
int u1, v1, u2, v2;
|
||||||
|
|
||||||
|
x1 = cel->getX();
|
||||||
|
y1 = cel->getY();
|
||||||
|
x2 = cel->getX() + image->w;
|
||||||
|
y2 = cel->getY() + image->h;
|
||||||
|
|
||||||
|
int new_x = m_initial_x + x - m_catch_x;
|
||||||
|
int new_y = m_initial_y + y - m_catch_y;
|
||||||
|
|
||||||
|
// No movement
|
||||||
|
if (cel->getX() == new_x && cel->getY() == new_y)
|
||||||
|
return Rect();
|
||||||
|
|
||||||
|
cel->setPosition(new_x, new_y);
|
||||||
|
|
||||||
|
u1 = cel->getX();
|
||||||
|
v1 = cel->getY();
|
||||||
|
u2 = cel->getX() + image->w;
|
||||||
|
v2 = cel->getY() + image->h;
|
||||||
|
|
||||||
|
return Rect(MIN(x1, u1), MIN(y1, v1),
|
||||||
|
MAX(x2, u2) - MIN(x1, u1) + 1,
|
||||||
|
MAX(y2, v2) - MIN(y1, v1) + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::dropImageTemporarily()
|
void PixelsMovement::dropImageTemporarily()
|
||||||
{
|
{
|
||||||
return m_impl->dropImageTemporarily();
|
m_isDragging = false;
|
||||||
|
|
||||||
|
const Cel* cel = m_documentReader->getExtraCel();
|
||||||
|
|
||||||
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
|
||||||
|
// Show the mask again in the new position
|
||||||
|
if (m_firstDrop) {
|
||||||
|
m_firstDrop = false;
|
||||||
|
m_undoTransaction.setMaskPosition(cel->getX(), cel->getY());
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
documentWriter->getMask()->x = cel->getX();
|
||||||
|
documentWriter->getMask()->y = cel->getY();
|
||||||
|
}
|
||||||
|
documentWriter->generateMaskBoundaries();
|
||||||
|
}
|
||||||
|
|
||||||
|
update_screen_for_document(m_documentReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::dropImage()
|
void PixelsMovement::dropImage()
|
||||||
{
|
{
|
||||||
m_impl->dropImage();
|
m_isDragging = false;
|
||||||
|
|
||||||
|
const Cel* cel = m_documentReader->getExtraCel();
|
||||||
|
const Image* image = m_documentReader->getExtraCelImage();
|
||||||
|
|
||||||
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
{
|
||||||
|
// Expand the canvas to paste the image in the fully visible
|
||||||
|
// portion of sprite.
|
||||||
|
ExpandCelCanvas expandCelCanvas(documentWriter, m_sprite,
|
||||||
|
m_sprite->getCurrentLayer(), TILED_NONE);
|
||||||
|
|
||||||
|
image_merge(expandCelCanvas.getDestCanvas(), image,
|
||||||
|
cel->getX()-expandCelCanvas.getCel()->getX(),
|
||||||
|
cel->getY()-expandCelCanvas.getCel()->getY(),
|
||||||
|
cel->getOpacity(), BLEND_MODE_NORMAL);
|
||||||
|
|
||||||
|
expandCelCanvas.commit();
|
||||||
|
}
|
||||||
|
m_undoTransaction.commit();
|
||||||
|
|
||||||
|
documentWriter->destroyExtraCel();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PixelsMovement::isDragging()
|
bool PixelsMovement::isDragging()
|
||||||
{
|
{
|
||||||
return m_impl->isDragging();
|
return m_isDragging;
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect PixelsMovement::getImageBounds()
|
Rect PixelsMovement::getImageBounds()
|
||||||
{
|
{
|
||||||
return m_impl->getImageBounds();
|
const Cel* cel = m_documentReader->getExtraCel();
|
||||||
|
const Image* image = m_documentReader->getExtraCelImage();
|
||||||
|
|
||||||
|
ASSERT(cel != NULL);
|
||||||
|
ASSERT(image != NULL);
|
||||||
|
|
||||||
|
return Rect(cel->getX(), cel->getY(), image->w, image->h);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PixelsMovement::setMaskColor(uint32_t mask_color)
|
void PixelsMovement::setMaskColor(uint32_t mask_color)
|
||||||
{
|
{
|
||||||
m_impl->setMaskColor(mask_color);
|
{
|
||||||
|
DocumentWriter documentWriter(m_documentReader);
|
||||||
|
Image* image = documentWriter->getExtraCelImage();
|
||||||
|
|
||||||
|
ASSERT(image != NULL);
|
||||||
|
|
||||||
|
image->mask_color = mask_color;
|
||||||
|
}
|
||||||
|
|
||||||
|
update_screen_for_document(m_documentReader);
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,9 @@
|
|||||||
#ifndef WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
|
#ifndef WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
|
||||||
#define WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
|
#define WIDGETS_EDITOR_PIXELS_MOVEMENT_H_INCLUDED
|
||||||
|
|
||||||
|
#include "document_wrappers.h"
|
||||||
|
#include "undo_transaction.h"
|
||||||
|
|
||||||
class Document;
|
class Document;
|
||||||
class Image;
|
class Image;
|
||||||
class Sprite;
|
class Sprite;
|
||||||
@ -34,7 +37,12 @@ public:
|
|||||||
void copyMask();
|
void copyMask();
|
||||||
void catchImage(int x, int y);
|
void catchImage(int x, int y);
|
||||||
void catchImageAgain(int x, int y);
|
void catchImageAgain(int x, int y);
|
||||||
|
|
||||||
|
// Moves the image to the new position (relative to the start
|
||||||
|
// position given in the ctor). Returns the rectangle that should be
|
||||||
|
// redrawn.
|
||||||
gfx::Rect moveImage(int x, int y);
|
gfx::Rect moveImage(int x, int y);
|
||||||
|
|
||||||
void dropImageTemporarily();
|
void dropImageTemporarily();
|
||||||
void dropImage();
|
void dropImage();
|
||||||
bool isDragging();
|
bool isDragging();
|
||||||
@ -44,7 +52,13 @@ public:
|
|||||||
void setMaskColor(uint32_t mask_color);
|
void setMaskColor(uint32_t mask_color);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class PixelsMovementImpl* m_impl;
|
const DocumentReader m_documentReader;
|
||||||
|
Sprite* m_sprite;
|
||||||
|
UndoTransaction m_undoTransaction;
|
||||||
|
int m_initial_x, m_initial_y;
|
||||||
|
int m_catch_x, m_catch_y;
|
||||||
|
bool m_firstDrop;
|
||||||
|
bool m_isDragging;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user