Compare commits

...

3 Commits

Author SHA1 Message Date
Gaspar Capello e20e896428
Merge 5afa9e6b82 into cf290b7679 2025-09-29 14:33:51 -03:00
Christian Kaiser cf290b7679 Check mask validity before pasting (fix #5361)
build / build (Debug, macos-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, macos-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, noscripts, cli) (push) Waiting to run Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Waiting to run Details
2025-09-29 11:32:39 -03:00
David Capello d7b2faca6d Fix crash painting deleted cels while applying filter (fix #4991)
build / build (Debug, macos-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, macos-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, ubuntu-latest, noscripts, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, lua, cli) (push) Waiting to run Details
build / build (Debug, windows-latest, noscripts, cli) (push) Waiting to run Details
build / build (RelWithDebInfo, macos-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, ubuntu-latest, lua, gui) (push) Waiting to run Details
build / build (RelWithDebInfo, windows-latest, lua, gui) (push) Waiting to run Details
build-auto / build-auto (Debug, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (Debug, windows-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, macos-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, ubuntu-latest) (push) Has been cancelled Details
build-auto / build-auto (RelWithDebInfo, windows-latest) (push) Has been cancelled Details
This could happen in the Editor::onPaint() or Timeline::onPaint().
2025-09-24 16:36:34 -03:00
7 changed files with 27 additions and 4 deletions

2
laf

@ -1 +1 @@
Subproject commit de781a5066732d700ac4520ee5fc9034e92875ad Subproject commit 39706c11063fb53cf4c8e865102c6f71e2606906

View File

@ -325,10 +325,15 @@ void FilterManagerImpl::applyToTarget()
void FilterManagerImpl::initTransaction() void FilterManagerImpl::initTransaction()
{ {
ASSERT(!m_tx); ASSERT(!m_tx);
m_writer.reset(new ContextWriter(m_reader)); m_writer = std::make_unique<ContextWriter>(m_reader);
m_tx.reset(new Tx(*m_writer, m_filter->getName(), ModifyDocument)); m_tx.reset(new Tx(*m_writer, m_filter->getName(), ModifyDocument));
} }
void FilterManagerImpl::updateWriterThread()
{
document()->updateWriterThread();
}
bool FilterManagerImpl::isTransaction() const bool FilterManagerImpl::isTransaction() const
{ {
return (m_tx != nullptr); return (m_tx != nullptr);

View File

@ -93,6 +93,7 @@ public:
void applyToTarget(); void applyToTarget();
void initTransaction(); void initTransaction();
void updateWriterThread();
bool isTransaction() const; bool isTransaction() const;
void commitTransaction(); void commitTransaction();

View File

@ -118,7 +118,13 @@ FilterWorker::~FilterWorker()
void FilterWorker::run() void FilterWorker::run()
{ {
// Initialize writting transaction // Initialize writing transaction from the main thread. This is
// required to get the activeSite() from the UIContext from
// CmdTransaction::calcSpritePosition().
//
// The document will keep the UI thread associated as the "writer"
// thread, but that will be updated later in
// applyFilterInBackground() with the worker thread ID.
m_filterMgr->initTransaction(); m_filterMgr->initTransaction();
std::thread thread; std::thread thread;
@ -182,6 +188,11 @@ bool FilterWorker::isCancelled()
void FilterWorker::applyFilterInBackground() void FilterWorker::applyFilterInBackground()
{ {
try { try {
// This background thread is the new writer. This is required to
// avoid read-locking from the UI thread from Editor and Timeline
// onPaint() events.
m_filterMgr->updateWriterThread();
// Apply the filter // Apply the filter
m_filterMgr->applyToTarget(); m_filterMgr->applyToTarget();

View File

@ -124,6 +124,11 @@ Doc::LockResult Doc::upgradeToWrite(int timeout)
return res; return res;
} }
void Doc::updateWriterThread()
{
m_rwLock.updateWriterThread();
}
void Doc::downgradeToRead(LockResult lockResult) void Doc::downgradeToRead(LockResult lockResult)
{ {
DOC_TRACE("DOC: downgradeToRead", this, (int)lockResult); DOC_TRACE("DOC: downgradeToRead", this, (int)lockResult);

View File

@ -82,6 +82,7 @@ public:
LockResult readLock(int timeout); LockResult readLock(int timeout);
LockResult writeLock(int timeout); LockResult writeLock(int timeout);
LockResult upgradeToWrite(int timeout); LockResult upgradeToWrite(int timeout);
void updateWriterThread();
void downgradeToRead(LockResult lockResult); void downgradeToRead(LockResult lockResult);
void unlock(LockResult lockResult); void unlock(LockResult lockResult);

View File

@ -2764,7 +2764,7 @@ void Editor::pasteImage(const Image* image, const Mask* mask, const gfx::Point*
ASSERT(image); ASSERT(image);
std::unique_ptr<Mask> temp_mask; std::unique_ptr<Mask> temp_mask;
if (!mask) { if (!mask || mask->bounds().isEmpty()) {
gfx::Rect visibleBounds = getVisibleSpriteBounds(); gfx::Rect visibleBounds = getVisibleSpriteBounds();
gfx::Rect imageBounds = image->bounds(); gfx::Rect imageBounds = image->bounds();