mirror of https://github.com/aseprite/aseprite.git
Compare commits
3 Commits
f783c42f8d
...
e20e896428
Author | SHA1 | Date |
---|---|---|
|
e20e896428 | |
|
cf290b7679 | |
|
d7b2faca6d |
2
laf
2
laf
|
@ -1 +1 @@
|
||||||
Subproject commit de781a5066732d700ac4520ee5fc9034e92875ad
|
Subproject commit 39706c11063fb53cf4c8e865102c6f71e2606906
|
|
@ -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);
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue