Improve PixelsMovement performance creating a smaller extra cel

This commit is contained in:
David Capello 2015-06-25 17:31:27 -03:00
parent adc4050201
commit 4aa56ff703
2 changed files with 23 additions and 22 deletions

View File

@ -72,16 +72,6 @@ PixelsMovement::PixelsMovement(Context* context,
// and its owner could destroy our new "extra cel".
ASSERT(!m_document->getExtraCel());
int t, opacity = static_cast<LayerImage*>(m_layer)->opacity();
Cel* cel = m_site.cel();
if (cel) opacity = MUL_UN8(opacity, cel->opacity(), t);
ContextWriter writer(m_reader, 500);
m_document->prepareExtraCel(m_sprite->bounds(), opacity);
m_document->setExtraCelType(render::ExtraType::PATCH);
m_document->setExtraCelBlendMode(
static_cast<LayerImage*>(m_layer)->blendMode());
redrawExtraImage();
m_initialMask = new Mask(*m_document->mask());
@ -440,7 +430,7 @@ Image* PixelsMovement::getDraggedImageCopy(gfx::Point& origin)
int height = rightBottom.y - leftTop.y;
base::UniquePtr<Image> image(Image::create(m_sprite->pixelFormat(), width, height));
drawImage(image, leftTop);
drawImage(image, leftTop, false);
origin = leftTop;
@ -469,8 +459,8 @@ void PixelsMovement::stampImage()
expand.getDestCanvas()->copy(
image, gfx::Clip(
-expand.getCel()->x(),
-expand.getCel()->y(),
cel->x()-expand.getCel()->x(),
cel->y()-expand.getCel()->y(),
image->bounds()));
expand.commit();
@ -588,11 +578,19 @@ void PixelsMovement::setMaskColor(color_t mask_color)
void PixelsMovement::redrawExtraImage()
{
ASSERT(m_document->getExtraCelImage());
int t, opacity = static_cast<LayerImage*>(m_layer)->opacity();
Cel* cel = m_site.cel();
if (cel) opacity = MUL_UN8(opacity, cel->opacity(), t);
gfx::Rect bounds = m_currentData.transformedBounds();
m_document->prepareExtraCel(bounds, opacity);
m_document->setExtraCelType(render::ExtraType::PATCH);
m_document->setExtraCelBlendMode(
static_cast<LayerImage*>(m_layer)->blendMode());
// Draw the transformed pixels in the extra-cel which is the chunk
// of pixels that the user is moving.
drawImage(m_document->getExtraCelImage(), gfx::Point(0, 0));
drawImage(m_document->getExtraCelImage(), bounds.getOrigin(), true);
}
void PixelsMovement::redrawCurrentMask()
@ -612,7 +610,7 @@ void PixelsMovement::redrawCurrentMask()
m_currentMask->unfreeze();
}
void PixelsMovement::drawImage(doc::Image* dst, const gfx::Point& pt)
void PixelsMovement::drawImage(doc::Image* dst, const gfx::Point& pt, bool renderOriginalLayer)
{
ASSERT(dst);
@ -620,12 +618,15 @@ void PixelsMovement::drawImage(doc::Image* dst, const gfx::Point& pt)
m_currentData.transformBox(corners);
dst->setMaskColor(m_sprite->transparentColor());
clear_image(dst, dst->maskColor());
render::Render().renderLayer(
dst, m_layer, m_site.frame(),
gfx::Clip(0, 0, dst->bounds()),
BlendMode::SRC);
gfx::Rect bounds = m_currentData.transformedBounds();
dst->clear(dst->maskColor());
if (renderOriginalLayer)
render::Render().renderLayer(
dst, m_layer, m_site.frame(),
gfx::Clip(bounds.x-pt.x, bounds.y-pt.y, bounds),
BlendMode::SRC);
m_originalImage->setMaskColor(m_maskColor);
drawParallelogram(dst, m_originalImage, corners, pt);

View File

@ -96,7 +96,7 @@ namespace app {
void onRotationAlgorithmChange();
void redrawExtraImage();
void redrawCurrentMask();
void drawImage(doc::Image* dst, const gfx::Point& pos);
void drawImage(doc::Image* dst, const gfx::Point& pos, bool renderOriginalLayer);
void drawParallelogram(doc::Image* dst, doc::Image* src,
const gfx::Transformation::Corners& corners,
const gfx::Point& leftTop);