https://bugs.kde.org/show_bug.cgi?id=455570
Dmitry Kazakov <dimul...@gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
      Latest Commit|https://invent.kde.org/grap |https://invent.kde.org/grap
                   |hics/krita/commit/bef36adac |hics/krita/commit/2130f06ac
                   |9ed3934c68431da838045041fa4 |829aa8bedb4f9c85956aa246e75
                   |a31d                        |ca44

--- Comment #13 from Dmitry Kazakov <dimul...@gmail.com> ---
Git commit 2130f06ac829aa8bedb4f9c85956aa246e75ca44 by Dmitry Kazakov.
Committed on 01/07/2022 at 09:03.
Pushed by dkazakov into branch 'master'.

Fix extremely slow outline rendering with fuzzy brushes

If the brush is very fuzzy, then it may generate too many polygons,
which would make QPainterPath::toSubpathPolygons() extremely slow
(especially on Windows due to slow memory allocations). And since
we call this function on every frame render it may make Krita GUI
stutter a lot.

To workaround this issue this patch implements a special class
KisOptimizedBrushOutline. Its main purpose is to make sure that
the brush outline cache is stored in already prepared format
of QVector<QPolygonF>, so that we wouldn't have to convert
QPainterPath into polygons on every frame generation.

The class also makes sure that the original set of polygons is
immutable, so no extra allocations happen while the outline is
passed from the brush to the GUI rendering code. It is implemented
via storing the transformation and extra paths in separate objects.

M  +2    -1    libs/brush/kis_auto_brush.cpp
M  +1    -1    libs/brush/kis_auto_brush.h
M  +5    -4    libs/brush/kis_brush.cpp
M  +2    -1    libs/brush/kis_brush.h
M  +2    -2    libs/brush/kis_imagepipe_brush.cpp
M  +1    -1    libs/brush/kis_imagepipe_brush.h
M  +1    -0    libs/image/CMakeLists.txt
A  +135  -0    libs/image/brushengine/KisOptimizedBrushOutline.cpp  *
A  +110  -0    libs/image/brushengine/KisOptimizedBrushOutline.h  *
M  +4    -3    libs/image/brushengine/kis_paintop_settings.cpp
M  +3    -2    libs/image/brushengine/kis_paintop_settings.h
M  +4    -4    libs/ui/opengl/KisOpenGLCanvasRenderer.cpp
M  +2    -1    libs/ui/opengl/KisOpenGLCanvasRenderer.h
M  +1    -1    libs/ui/opengl/kis_opengl_canvas2.cpp
M  +2    -1    libs/ui/opengl/kis_opengl_canvas2.h
M  +15   -2    libs/ui/tool/kis_tool.cc
M  +4    -1    libs/ui/tool/kis_tool.h
M  +3    -2    libs/ui/tool/kis_tool_freehand.cc
M  +3    -3    libs/ui/tool/kis_tool_freehand.h
M  +6    -5    libs/ui/tool/kis_tool_freehand_helper.cpp
M  +4    -4    libs/ui/tool/kis_tool_freehand_helper.h
M  +17   -11   libs/ui/tool/kis_tool_paint.cc
M  +6    -5    libs/ui/tool/kis_tool_paint.h
M  +12   -7   
plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.cpp
M  +1    -1   
plugins/paintops/defaultpaintops/duplicate/kis_duplicateop_settings.h
M  +3    -2    plugins/paintops/deform/kis_deform_paintop_settings.cpp
M  +1    -1    plugins/paintops/deform/kis_deform_paintop_settings.h
M  +3    -1    plugins/paintops/experiment/kis_experiment_paintop_settings.cpp
M  +1    -1    plugins/paintops/experiment/kis_experiment_paintop_settings.h
M  +5    -4    plugins/paintops/gridbrush/kis_grid_paintop_settings.cpp
M  +1    -1    plugins/paintops/gridbrush/kis_grid_paintop_settings.h
M  +2    -1    plugins/paintops/hairy/kis_hairy_paintop_settings.cpp
M  +1    -1    plugins/paintops/hairy/kis_hairy_paintop_settings.h
M  +5    -4    plugins/paintops/libpaintop/kis_brush_based_paintop_settings.cpp
M  +2    -2    plugins/paintops/libpaintop/kis_brush_based_paintop_settings.h
M  +3    -9    plugins/paintops/libpaintop/kis_current_outline_fetcher.cpp
M  +10   -8    plugins/paintops/libpaintop/kis_current_outline_fetcher.h
M  +3    -3    plugins/paintops/mypaint/MyPaintPaintOpSettings.cpp
M  +1    -1    plugins/paintops/mypaint/MyPaintPaintOpSettings.h
M  +3    -3    plugins/paintops/roundmarker/kis_roundmarkerop_settings.cpp
M  +1    -1    plugins/paintops/roundmarker/kis_roundmarkerop_settings.h
M  +4    -4    plugins/paintops/sketch/kis_sketch_paintop_settings.cpp
M  +1    -1    plugins/paintops/sketch/kis_sketch_paintop_settings.h
M  +3    -2    plugins/paintops/spray/kis_spray_paintop_settings.cpp
M  +1    -1    plugins/paintops/spray/kis_spray_paintop_settings.h
M  +1    -0    plugins/tools/basictools/kis_tool_move.cc
M  +1    -1    plugins/tools/selectiontools/KisToolSelectMagnetic.cc
M  +1    -0    plugins/tools/selectiontools/kis_tool_select_path.cc
M  +4    -4   
plugins/tools/tool_enclose_and_fill/subtools/KisToolBasicBrushBase.cpp
M  +1    -1   
plugins/tools/tool_enclose_and_fill/subtools/KisToolBasicBrushBase.h
M  +1    -0    plugins/tools/tool_transform2/kis_tool_transform.cc

The files marked with a * at the end have a non valid license. Please read:
https://community.kde.org/Policies/Licensing_Policy and use the headers which
are listed at that page.


https://invent.kde.org/graphics/krita/commit/2130f06ac829aa8bedb4f9c85956aa246e75ca44

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to