Fix useTool() with images: brushes must be created like when we use the UI, with a mask

This commit is contained in:
David Capello 2019-04-29 10:25:44 -03:00
parent 640800259d
commit f97d76344d
3 changed files with 37 additions and 2 deletions

View File

@ -12,6 +12,7 @@
#include "app/script/luacpp.h" #include "app/script/luacpp.h"
#include "doc/brush.h" #include "doc/brush.h"
#include "doc/image.h" #include "doc/image.h"
#include "doc/mask.h"
#include <algorithm> #include <algorithm>
@ -70,8 +71,12 @@ BrushRef Brush_new(lua_State* L, int index)
lua_pop(L, 1); lua_pop(L, 1);
brush.reset(new Brush(type, size, angle)); brush.reset(new Brush(type, size, angle));
if (image) if (image) {
brush->setImage(image, nullptr); // TODO add a way to add a bitmap mask
doc::Mask mask;
mask.replace(image->bounds());
brush->setImage(image, mask.bitmap());
}
if (lua_getfield(L, index, "center") != LUA_TNIL) { if (lua_getfield(L, index, "center") != LUA_TNIL) {
gfx::Point center = convert_args_into_point(L, -1); gfx::Point center = convert_args_into_point(L, -1);

View File

@ -23,10 +23,14 @@
#include "doc/image.h" #include "doc/image.h"
#include "doc/primitives.h" #include "doc/primitives.h"
#include "doc/sprite.h" #include "doc/sprite.h"
#include "gfx/point_io.h"
#include "gfx/rect_io.h"
#include "gfx/region.h" #include "gfx/region.h"
#include <climits> #include <climits>
#define TOOL_TRACE(...) // TRACEARGS
namespace app { namespace app {
namespace tools { namespace tools {
@ -71,6 +75,8 @@ void ToolLoopManager::notifyToolLoopModifiersChange()
void ToolLoopManager::pressButton(const Pointer& pointer) void ToolLoopManager::pressButton(const Pointer& pointer)
{ {
TOOL_TRACE("ToolLoopManager::pressButton", pointer.point());
m_lastPointer = pointer; m_lastPointer = pointer;
if (isCanceled()) if (isCanceled())
@ -101,6 +107,8 @@ void ToolLoopManager::pressButton(const Pointer& pointer)
bool ToolLoopManager::releaseButton(const Pointer& pointer) bool ToolLoopManager::releaseButton(const Pointer& pointer)
{ {
TOOL_TRACE("ToolLoopManager::releaseButton", pointer.point());
m_lastPointer = pointer; m_lastPointer = pointer;
if (isCanceled()) if (isCanceled())
@ -125,6 +133,8 @@ bool ToolLoopManager::releaseButton(const Pointer& pointer)
void ToolLoopManager::movement(const Pointer& pointer) void ToolLoopManager::movement(const Pointer& pointer)
{ {
TOOL_TRACE("ToolLoopManager::movement", pointer.point());
m_lastPointer = pointer; m_lastPointer = pointer;
if (isCanceled()) if (isCanceled())
@ -215,6 +225,8 @@ void ToolLoopManager::doLoopStep(bool lastStep)
if (!m_dirtyArea.isEmpty()) if (!m_dirtyArea.isEmpty())
m_toolLoop->updateDirtyArea(m_dirtyArea); m_toolLoop->updateDirtyArea(m_dirtyArea);
TOOL_TRACE("ToolLoopManager::doLoopStep dirtyArea", m_dirtyArea.bounds());
} }
// Applies the grid settings to the specified sprite point. // Applies the grid settings to the specified sprite point.

View File

@ -26,6 +26,9 @@
#include "doc/layer.h" #include "doc/layer.h"
#include "doc/primitives.h" #include "doc/primitives.h"
#include "doc/sprite.h" #include "doc/sprite.h"
#include "gfx/rect_io.h"
#define EXP_TRACE(...) // TRACEARGS
namespace { namespace {
@ -141,6 +144,10 @@ ExpandCelCanvas::~ExpandCelCanvas()
void ExpandCelCanvas::commit() void ExpandCelCanvas::commit()
{ {
EXP_TRACE("ExpandCelCanvas::commit",
"validSrcRegion", m_validSrcRegion.bounds(),
"validDstRegion", m_validDstRegion.bounds());
ASSERT(!m_closed); ASSERT(!m_closed);
ASSERT(!m_committed); ASSERT(!m_committed);
@ -204,6 +211,8 @@ void ExpandCelCanvas::commit()
regionToPatch = &reduced; regionToPatch = &reduced;
} }
EXP_TRACE(" - regionToPatch", regionToPatch->bounds());
// Check that the region to copy or patch is not empty before we // Check that the region to copy or patch is not empty before we
// create the new cmd // create the new cmd
if (!regionToPatch->isEmpty()) { if (!regionToPatch->isEmpty()) {
@ -277,6 +286,8 @@ Image* ExpandCelCanvas::getDestCanvas()
void ExpandCelCanvas::validateSourceCanvas(const gfx::Region& rgn) void ExpandCelCanvas::validateSourceCanvas(const gfx::Region& rgn)
{ {
EXP_TRACE("ExpandCelCanvas::validateSourceCanvas", rgn.bounds());
getSourceCanvas(); getSourceCanvas();
gfx::Region rgnToValidate(rgn); gfx::Region rgnToValidate(rgn);
@ -309,6 +320,8 @@ void ExpandCelCanvas::validateSourceCanvas(const gfx::Region& rgn)
void ExpandCelCanvas::validateDestCanvas(const gfx::Region& rgn) void ExpandCelCanvas::validateDestCanvas(const gfx::Region& rgn)
{ {
EXP_TRACE("ExpandCelCanvas::validateDestCanvas", rgn.bounds());
Image* src; Image* src;
int src_x, src_y; int src_x, src_y;
if ((m_flags & NeedsSource) == NeedsSource) { if ((m_flags & NeedsSource) == NeedsSource) {
@ -355,11 +368,14 @@ void ExpandCelCanvas::validateDestCanvas(const gfx::Region& rgn)
void ExpandCelCanvas::invalidateDestCanvas() void ExpandCelCanvas::invalidateDestCanvas()
{ {
EXP_TRACE("ExpandCelCanvas::invalidateDestCanvas");
m_validDstRegion.clear(); m_validDstRegion.clear();
} }
void ExpandCelCanvas::invalidateDestCanvas(const gfx::Region& rgn) void ExpandCelCanvas::invalidateDestCanvas(const gfx::Region& rgn)
{ {
EXP_TRACE("ExpandCelCanvas::invalidateDestCanvas", rgn.bounds());
gfx::Region rgnToInvalidate(rgn); gfx::Region rgnToInvalidate(rgn);
rgnToInvalidate.offset(-m_bounds.origin()); rgnToInvalidate.offset(-m_bounds.origin());
m_validDstRegion.createSubtraction(m_validDstRegion, rgnToInvalidate); m_validDstRegion.createSubtraction(m_validDstRegion, rgnToInvalidate);
@ -367,6 +383,8 @@ void ExpandCelCanvas::invalidateDestCanvas(const gfx::Region& rgn)
void ExpandCelCanvas::copyValidDestToSourceCanvas(const gfx::Region& rgn) void ExpandCelCanvas::copyValidDestToSourceCanvas(const gfx::Region& rgn)
{ {
EXP_TRACE("ExpandCelCanvas::copyValidDestToSourceCanvas", rgn.bounds());
gfx::Region rgn2(rgn); gfx::Region rgn2(rgn);
rgn2.offset(-m_bounds.origin()); rgn2.offset(-m_bounds.origin());
rgn2.createIntersection(rgn2, m_validSrcRegion); rgn2.createIntersection(rgn2, m_validSrcRegion);