Created attachment 124750 [details] Backtrace SUMMARY I pressed undo and Krita crashed. Since the crash log is different from the common transform tool crash recently (all logs had the reference to boost), I believe it's a different issue. STEPS TO REPRODUCE I don't know how to reproduce it (yet). I only know that I: - made a selection - transformed the content - deselected - clicked to transform again - undid seeing that I don't have selection now and it crashed. SOFTWARE/OS VERSIONS Krita master cf3682662b4d6c7796b2c248b20d3fe9077a5658 Krita Version: 4.3.0-prealpha (git cf36826) Languages: pl, pl_PL, pl Hidpi: true Qt Version (compiled): 5.11.1 Version (loaded): 5.11.1 OS Information Build ABI: x86_64-little_endian-lp64 Build CPU: x86_64 CPU: x86_64 Kernel Type: linux Kernel Version: 5.3.7-050307-generic Pretty Productname: Linux Mint 19.2 Product Type: linuxmint Product Version: 19.2 OpenGL Info Vendor: "Intel Open Source Technology Center" Renderer: "Mesa DRI Intel(R) Iris(R) Plus Graphics (Ice Lake 8x8 GT2) " Version: "3.0 Mesa 19.0.8" Shading language: "1.30" Requested format: QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(DoubleBuffer), swapInterval 0, colorSpace QSurfaceFormat::ColorSpace(DefaultColorSpace), profile QSurfaceFormat::OpenGLContextProfile(CompatibilityProfile)) Current format: QSurfaceFormat(version 3.0, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::SwapBehavior(DoubleBuffer), swapInterval 0, colorSpace QSurfaceFormat::ColorSpace(DefaultColorSpace), profile QSurfaceFormat::OpenGLContextProfile(NoProfile)) Version: 3.0 Supports deprecated functions true is OpenGL ES: false QPA OpenGL Detection Info supportsDesktopGL: true supportsOpenGLES: true isQtPreferOpenGLES: false Hardware Information GPU Acceleration: auto Memory: 15633 Mb Number of Cores: 8 Swap Location: /tmp Current Settings Current Swap Location: /tmp Undo Enabled: 1 Undo Stack Limit: 30 Use OpenGL: 1 Use OpenGL Texture Buffer: 1 Use AMD Vectorization Workaround: 0 Canvas State: OPENGL_SUCCESS Autosave Interval: 180 Use Backup Files: 1 Number of Backups Kept: 1 Backup File Suffix: ~ Backup Location: Same Folder as the File Use Win8 Pointer Input: 0 Use RightMiddleTabletButton Workaround: 0 Levels of Detail Enabled: 1 Use Zip64: 0 ADDITIONAL INFORMATION Relevant parts of the backtrace: Thread 2346 "Thread (pooled)" received signal SIGABRT, Aborted. [Switching to Thread 0x7fffa8f57700 (LWP 17853)] __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 50 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory. (gdb) thread apply all bt Thread 2346 (Thread 0x7fffa8f57700 (LWP 17853)): #0 0x00007ffff4262077 in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50 #1 0x00007ffff4243535 in __GI_abort () at abort.c:79 #2 0x00007ffff46318d7 in () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #3 0x00007ffff4630d59 in qt_assert_x(char const*, char const*, char const*, int) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #4 0x00007ffff5a15528 in KisStroke::addJob(KisStrokeJobData*) (this=<optimized out>, data=<optimized out>) at /home/tymon/devsec/krita/libs/image/kis_stroke.cpp:84 #5 0x00007ffff5c828e2 in KisStrokesQueue::addJob(QWeakPointer<KisStroke>, KisStrokeJobData*) (this=<optimized out>, id=..., data=0x7fff70097800) at /home/tymon/devsec/krita/libs/image/kis_strokes_queue.cpp:339 #6 0x00007ffff5c8fbc0 in KisUpdateScheduler::addJob(QWeakPointer<KisStroke>, KisStrokeJobData*) (this=0x555575891c30, id=..., data=<optimized out>) at /usr/include/c++/8/bits/atomic_base.h:295 #7 0x00007ffff5cb8e2f in non-virtual thunk to KisImage::addJob(QWeakPointer<KisStroke>, KisStrokeJobData*) () at /usr/include/c++/8/bits/atomic_base.h:295 #8 0x00007ffff5b75bb2 in KisSavedMacroCommand::addCommands(QWeakPointer<KisStroke>, bool) (this=0x7fff581aef10, id=..., undo=<optimized out>) at /usr/include/c++/8/bits/atomic_base.h:295 #9 0x00007ffff5b74802 in KisSavedMacroCommand::performCancel(QWeakPointer<KisStroke>, bool) (this=<optimized out>, id=..., strokeUndo=<optimized out>) at /usr/include/c++/8/bits/atomic_base.h:295 #10 0x00007ffff5c7de85 in KisStrokeStrategyUndoCommandBased::cancelStrokeCallback() (this=0x5555724738a0) at /usr/include/c++/8/bits/atomic_base.h:295 #11 0x00007fffd495c2d5 in TransformStrokeStrategy::<lambda()>::operator() (__closure=0x7fff7001b568, __closure=0x7fff7001b568) at /home/tymon/devsec/krita/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp:686 #12 0x00007fffd495c2d5 in std::_Function_handler<void (), TransformStrokeStrategy::finishStrokeImpl(bool, ToolTransformArgs const&)::{lambda()#1}>::_M_invoke(std::_Any_data const&) (__functor=...) at /usr/include/c++/8/bits/std_function.h:297 #13 0x00007ffff5c7e05b in KisStrokeStrategyUndoCommandBased::doStrokeCallback(KisStrokeJobData*) (this=0x5555724738a0, data=0x7fff7001b540) at /home/tymon/devsec/krita/libs/image/kis_stroke_strategy_undo_command_based.cpp:131 #14 0x00007fffd49605cc in TransformStrokeStrategy::doStrokeCallback(KisStrokeJobData*) (this=0x555572473890, data=0x7fff7001b540) at /home/tymon/devsec/krita/plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp:350 #15 0x00007ffff5e988cc in non-virtual thunk to KisUpdateJobItem::run() () at /usr/include/c++/8/bits/atomic_base.h:295 #16 0x00007ffff466af71 in () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #17 0x00007ffff4672c87 in () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #18 0x00007ffff206e164 in start_thread (arg=<optimized out>) at pthread_create.c:486 #19 0x00007ffff433bdef in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95 Thread 1 (Thread 0x7fffeb496800 (LWP 10725)): #0 0x00007ffff43313c7 in ioctl () at ../sysdeps/unix/syscall-template.S:78 #1 0x00007fffe67431e8 in drmIoctl () at /usr/lib/x86_64-linux-gnu/libdrm.so.2 #2 0x00007fffe503888e in () at /usr/lib/x86_64-linux-gnu/dri/i965_dri.so #3 0x00007fffe502af04 in () at /usr/lib/x86_64-linux-gnu/dri/i965_dri.so #4 0x00007fffe5151441 in () at /usr/lib/x86_64-linux-gnu/dri/i965_dri.so #5 0x00007ffff6e3acb5 in Sync::getSync() () at /home/tymon/devsec/krita/libs/ui/opengl/kis_opengl_canvas2_p.h:96 #6 0x00007ffff6e3acb5 in KisOpenGLCanvas2::paintGL() (this=0x555575a26390) at /home/tymon/devsec/krita/libs/ui/opengl/kis_opengl_canvas2.cpp:411 #7 0x00007ffff5238ead in () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #8 0x00007ffff52187d8 in QWidget::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #9 0x00007ffff51da4a1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #10 0x00007ffff51e1ae0 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #11 0x00007ffff7005507 in KisApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x555575a26390, event=0x7fffffffbc10) at /home/tymon/devsec/krita/libs/ui/KisApplication.cpp:653 #12 0x00007ffff481b499 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #13 0x00007ffff521137a in QWidgetPrivate::sendPaintEvent(QRegion const&) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #14 0x00007ffff5211c37 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #15 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #16 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #17 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #18 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #19 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #20 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #21 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #22 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #23 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #24 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #25 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #26 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #27 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #28 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #29 0x00007ffff5212831 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #30 0x00007ffff52118bc in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, int, QPainter*, QWidgetBackingStore*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #31 0x00007ffff51e987c in () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #32 0x00007ffff51e9a29 in () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #33 0x00007ffff5200af5 in QWidgetPrivate::syncBackingStore() () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #34 0x00007ffff5218908 in QWidget::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #35 0x00007ffff531ef34 in QMainWindow::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #36 0x00007ffff587f13b in KMainWindow::event(QEvent*) (this=this@entry=0x55555acb4570, ev=ev@entry=0x5555915a5b50) at /home/tymon/devsec/krita/libs/widgetutils/xmlgui/kmainwindow.cpp:765 ---Type <return> to continue, or q <return> to quit--- #37 0x00007ffff58c0839 in KXmlGuiWindow::event(QEvent*) (this=0x55555acb4570, ev=0x5555915a5b50) at /home/tymon/devsec/krita/libs/widgetutils/xmlgui/kxmlguiwindow.cpp:125 #38 0x00007ffff51da4a1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #39 0x00007ffff51e1ae0 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 #40 0x00007ffff7005507 in KisApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x55555acb4570, event=0x5555915a5b50) at /home/tymon/devsec/krita/libs/ui/KisApplication.cpp:653 #41 0x00007ffff481b499 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #42 0x00007ffff481e48b in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #43 0x00007ffff486db23 in () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #44 0x00007ffff0dded5e in g_main_context_dispatch () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #45 0x00007ffff0ddeff8 in () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #46 0x00007ffff0ddf08c in g_main_context_iteration () at /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 #47 0x00007ffff486d143 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #48 0x00007fffeabace51 in () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5 #49 0x00007ffff481a16b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #50 0x00007ffff48222e2 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 #51 0x0000555555e4e4ed in main (argc=<optimized out>, argv=0x7fffffffdfe8) at /home/tymon/devsec/krita/krita/main.cc:586 #52 0x00007ffff424509b in __libc_start_main (main=0x555555e4d0e0 <main>, argc=1, argv=0x7fffffffdfe8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffdfd8) at ../csu/libc-start.c:308 #53 0x0000555555e4f84a in _start () at /home/tymon/devsec/krita/krita/main.cc:461
Created attachment 124751 [details] Full backtrace
Git commit 69bc2897bf9fb6b88ef4bb2754f877057c0a3ea7 by Boudewijn Rempt. Committed on 08/01/2020 at 10:05. Pushed by rempt into branch 'master'. Convert Q_ASSERT to KIS_SAFE_ASSERT This doesn't properly fix bug 415625, but the assert here in addJob shouldn't be fatal. M +3 -3 libs/image/kis_stroke.cpp https://invent.kde.org/kde/krita/commit/69bc2897bf9fb6b88ef4bb2754f877057c0a3ea7
Git commit 5e5ded75c9f107ff5e1601f7d3137ce558503901 by Boudewijn Rempt. Committed on 08/01/2020 at 13:34. Pushed by rempt into branch 'krita/4.2'. Convert Q_ASSERT to KIS_SAFE_ASSERT This doesn't properly fix bug 415625, but the assert here in addJob shouldn't be fatal. (cherry picked from commit 69bc2897bf9fb6b88ef4bb2754f877057c0a3ea7) M +3 -3 libs/image/kis_stroke.cpp https://invent.kde.org/kde/krita/commit/5e5ded75c9f107ff5e1601f7d3137ce558503901
Git commit 8ef04427c4b8e63265ab4bb3456659cf4b0d39a4 by Agata Cacko. Committed on 14/01/2020 at 22:14. Pushed by tymond into branch 'master'. Initialize transform tool args when ending stroke Before this commit, transform tool would get an assert when switching to another tool without any changes. This commit removes trying to cancel the stroke in the finishStrokeCallback() call and initializes m_savedTransformArgs so the finishing can happen as always. WARNING: it probably isn't the "proper" solution for this issue. It does work correctly, but it adds an unnecessary undo step in the situation when cancelling should be used instead of finishing the stroke (for example when the user switches to transform tool and then immediately to another tool without making any changes). Related: bug 414672 M +25 -0 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/8ef04427c4b8e63265ab4bb3456659cf4b0d39a4
Git commit dcae8c7860efeddd5254aa6377ce75d4c9070b36 by Dmitry Kazakov. Committed on 15/01/2020 at 12:56. Pushed by dkazakov into branch 'master'. Revert "Initialize transform tool args when ending stroke" This reverts commit 8ef04427c4b8e63265ab4bb3456659cf4b0d39a4. The patch introduces a data-loss in the following usecase: 1) Select transform tool 2) Click on the canvas to activate it 3) Press Enter to apply 4) Click again 5) Press Enter to apply again 4) Click again 5) Press Esc to cancel 6) Click again The layer data is lost, it becomes completely blank. M +0 -25 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/dcae8c7860efeddd5254aa6377ce75d4c9070b36
Git commit a5d92c04c715e8c2a8a45567f17c40df4c3e1e8e by Dmitry Kazakov. Committed on 15/01/2020 at 15:30. Pushed by dkazakov into branch 'master'. Fix safe assert when resetting continued transform When we reapply the previous transform via m_initialTransformArgs we should still make sure we initialize m_savedTransformArgs. It might be related to a reverted commit 8ef04427c4b8e63265. M +2 -0 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/a5d92c04c715e8c2a8a45567f17c40df4c3e1e8e
Git commit f88c8b3529816be7f2be60528955e83483a22a1b by Dmitry Kazakov. Committed on 15/01/2020 at 15:27. Pushed by dkazakov into branch 'master'. Fix assert when the stroke is cancelled in endStrokeCallback() The patch basically deprecates cancelStrokeId() functionality, which is now replaced with MutatedStrokeJobsInterface. We can add new jobs via normal addJob() interface only before the stroke is finished. After finishing, only addMutatedJob() is available. M +0 -5 libs/image/commands_new/kis_saved_commands.cpp M +0 -2 libs/image/commands_new/kis_saved_commands.h M +1 -1 libs/image/kis_stroke.cpp M +0 -15 libs/image/kis_stroke_strategy.h M +4 -1 libs/image/kis_stroke_strategy_undo_command_based.cpp M +0 -4 libs/image/kis_strokes_queue.cpp https://invent.kde.org/kde/krita/commit/f88c8b3529816be7f2be60528955e83483a22a1b
Git commit 4aab942697147c1e3496fa7d4d16e5dd1a8fe99c by Boudewijn Rempt, on behalf of Dmitry Kazakov. Committed on 28/01/2020 at 09:09. Pushed by rempt into branch 'krita/4.2'. Fix assert when the stroke is cancelled in endStrokeCallback() The patch basically deprecates cancelStrokeId() functionality, which is now replaced with MutatedStrokeJobsInterface. We can add new jobs via normal addJob() interface only before the stroke is finished. After finishing, only addMutatedJob() is available. (cherry picked from commit f88c8b3529816be7f2be60528955e83483a22a1b) M +0 -5 libs/image/commands_new/kis_saved_commands.cpp M +0 -2 libs/image/commands_new/kis_saved_commands.h M +1 -1 libs/image/kis_stroke.cpp M +0 -15 libs/image/kis_stroke_strategy.h M +4 -1 libs/image/kis_stroke_strategy_undo_command_based.cpp M +0 -4 libs/image/kis_strokes_queue.cpp https://invent.kde.org/kde/krita/commit/4aab942697147c1e3496fa7d4d16e5dd1a8fe99c
Git commit 4ec9beafc1d40205b82aa50dc6f981cc10891d0f by Boudewijn Rempt, on behalf of Agata Cacko. Committed on 28/01/2020 at 09:09. Pushed by rempt into branch 'krita/4.2'. Initialize transform tool args when ending stroke Before this commit, transform tool would get an assert when switching to another tool without any changes. This commit removes trying to cancel the stroke in the finishStrokeCallback() call and initializes m_savedTransformArgs so the finishing can happen as always. WARNING: it probably isn't the "proper" solution for this issue. It does work correctly, but it adds an unnecessary undo step in the situation when cancelling should be used instead of finishing the stroke (for example when the user switches to transform tool and then immediately to another tool without making any changes). Related: bug 414672 (cherry picked from commit 8ef04427c4b8e63265ab4bb3456659cf4b0d39a4) M +25 -0 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/4ec9beafc1d40205b82aa50dc6f981cc10891d0f
Git commit de397bec02778e3613ec29d9af8ad419f9738df0 by Boudewijn Rempt, on behalf of Dmitry Kazakov. Committed on 28/01/2020 at 09:09. Pushed by rempt into branch 'krita/4.2'. Fix safe assert when resetting continued transform When we reapply the previous transform via m_initialTransformArgs we should still make sure we initialize m_savedTransformArgs. It might be related to a reverted commit 8ef04427c4b8e63265. (cherry picked from commit a5d92c04c715e8c2a8a45567f17c40df4c3e1e8e) M +2 -0 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/de397bec02778e3613ec29d9af8ad419f9738df0
Git commit 0c2d7094d66c6777759b079960cde8302f4e8e5a by Boudewijn Rempt, on behalf of Dmitry Kazakov. Committed on 28/01/2020 at 09:09. Pushed by rempt into branch 'krita/4.2'. Revert "Initialize transform tool args when ending stroke" This reverts commit 8ef04427c4b8e63265ab4bb3456659cf4b0d39a4. The patch introduces a data-loss in the following usecase: 1) Select transform tool 2) Click on the canvas to activate it 3) Press Enter to apply 4) Click again 5) Press Enter to apply again 4) Click again 5) Press Esc to cancel 6) Click again The layer data is lost, it becomes completely blank. (cherry picked from commit dcae8c7860efeddd5254aa6377ce75d4c9070b36) M +0 -25 plugins/tools/tool_transform2/strokes/transform_stroke_strategy.cpp https://invent.kde.org/kde/krita/commit/0c2d7094d66c6777759b079960cde8302f4e8e5a
*** Bug 417176 has been marked as a duplicate of this bug. ***