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/2130f06ac |hics/krita/commit/f58beab32
                   |829aa8bedb4f9c85956aa246e75 |9ecc38e2c2472bf69bc5a43bafe
                   |ca44                        |7e57

--- Comment #14 from Dmitry Kazakov <dimul...@gmail.com> ---
Git commit f58beab329ecc38e2c2472bf69bc5a43bafe7e57 by Dmitry Kazakov.
Committed on 01/07/2022 at 09:04.
Pushed by dkazakov into branch 'krita/5.1'.

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/f58beab329ecc38e2c2472bf69bc5a43bafe7e57

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

Reply via email to