diff --git a/krita/data/actions/ReferencesTool.action b/krita/data/actions/ReferencesTool.action
index 31ff084bea..3edc976500 100644
--- a/krita/data/actions/ReferencesTool.action
+++ b/krita/data/actions/ReferencesTool.action
@@ -1,596 +1,596 @@
References ToolInsert footnote with auto numberInsert footnote with auto numberInsert footnote with auto numberfalseconfigureInsert Custom...Insert a custom Table of Contents into the document.Insert CustomfalseInsert Labeled FootnoteInsert Labeled FootnoteInsert Labeled Footnotefalse
-
-
+ edit-paste
+ PastefalseconfigureSettings...SettingsSettingsfalseChange text directionChange writing directionChange text directionCtrl+Shift+DfalseInsert Paragraph between sectionsInsert Paragraph between sectionsInsert Paragraph between sectionsfalseRepaintRepaintRepaintfalseInsert LinkInsert a weblink or link to a bookmark.Insert LinkfalseManage BookmarksManage your Bookmarks. Check where are they pointing to, Delete or Rename.Manage BookmarksfalseStyle Manager...<p>Change font and paragraph attributes of styles.</p><p>Multiple styles can be changed using the dialog box.</p>Change attributes of stylesStyle ManagerCtrl+Alt+SfalseFont...Change the attributes of the currently selected characters.Change character size, font, boldface, italics etc.FontCtrl+Alt+FfalseFont SizeFont SizeFont Sizefalse
-
+ Text ColorfalseAlign BlockAlign BlockAlign BlockCtrl+Alt+RfalseInsert BibliographyInsert a bibliography into the document.Insert BibliographyfalseInsert endnote with auto numberInsert endnote with auto numberInsert endnote with auto numberfalseconfigureSettings...SettingsSettingsfalseBookmarksDisplay a pop up that hosts the options to add new Bookmark or handle existing BookmarksBookmarksfalseNumbered listNumbered listNumbered listfalseSubscriptSubscriptSubscriptCtrl+Shift+BfalseDecrease Font SizeDecrease Font SizeDecrease Font SizeCtrl+<falseInsert CitationInsert a citation into the document.Insert CitationfalseConfigure current sectionConfigure current sectionConfigure current sectionfalseInsert IndexInsert IndexInsert IndexCtrl+TfalseItalicItalicItalicCtrl+IfalseStrikethroughStrikethroughStrikethroughfalseInsert Custom BibliographyInsert a custom Bibliography into the document.Insert Custom BibliographyfalseStyles DebugStyles DebugStyles DebugCtrl+Alt+Shift+SfalseBullet listBullet listBullet listfalseUnderlineUnderlineUnderlineCtrl+UfalseAlign CenterAlign CenterAlign CenterCtrl+Alt+CfalseShrink To FitShrink To FitShrink To FittrueSelect &AllSelect AllSelect AllCtrl+AfalseIncrease IndentIncrease IndentIncrease IndentfalseInsertInsert a Table of Contents into the document.InsertfalseParagraph DebugParagraph DebugParagraph DebugCtrl+Alt+Shift+PfalseInsert Labeled EndnoteInsert Labeled EndnoteInsert Labeled EndnotefalseParagraph...<p>Change paragraph margins, text flow, borders, bullets, numbering etc.</p><p>Select text in multiple paragraphs to change the formatting of all selected paragraphs.</p><p>If no text is selected, the paragraph where the cursor is located will be changed.</p>Change paragraph margins, text flow, borders, bullets, numbering etc.ParagraphCtrl+Alt+PfalseInsert Non-Breaking SpaceInsert Non-Breaking SpaceInsert Non-Breaking SpaceCtrl+SpacefalseInsert Soft HyphenInsert Soft HyphenInsert Soft HyphenfalseAlign RightAlign RightAlign RightCtrl+Alt+RfalseInsert Non-Breaking HyphenInsert Non-Breaking HyphenInsert Non-Breaking HyphenCtrl+Shift+-falseConfigure...Configure the Table of ContentsConfigurefalseSpecial Character...Insert one or more symbols or characters not found on the keyboard.Insert one or more symbols or characters not found on the keyboardSpecial CharacterAlt+Shift+CfalseBoldBoldBoldCtrl+BfalseSuperscriptSuperscriptSuperscriptCtrl+Shift+PfalseConfigureConfigure the bibliographyConfigurefalseInsert new sectionInsert new sectionInsert new sectionfalseDecrease IndentDecrease IndentDecrease IndentfalseIncrease Font SizeIncrease Font SizeIncrease Font SizeCtrl+>falseGrow To Fit HeightGrow To Fit HeightGrow To Fit HeighttrueAlign LeftAlign LeftAlign LeftfalseAdd BookmarkInsert a Bookmark. This is useful to create links that point to areas within the documentAdd BookmarkfalseVariableVariableVariablefalseGrow To Fit WidthGrow To Fit WidthGrow To Fit WidthtrueFont FamilyFont FamilyFont FamilyfalseInsert CommentInsert CommentInsert CommentCtrl+Shift+Cfalse
-
+ Background Colorfalse
diff --git a/krita/data/brushes/A_eroded_circle.gih b/krita/data/brushes/A_eroded_circle.gih
new file mode 100644
index 0000000000..6e5fb3c3c3
Binary files /dev/null and b/krita/data/brushes/A_eroded_circle.gih differ
diff --git a/krita/data/brushes/CMakeLists.txt b/krita/data/brushes/CMakeLists.txt
index faa1b8aaaf..bb2ac97739 100644
--- a/krita/data/brushes/CMakeLists.txt
+++ b/krita/data/brushes/CMakeLists.txt
@@ -1,51 +1,52 @@
install( FILES
3_brush.png
3_dotted-flat.png
3_eroded.gih
3_splat.png
3_texture.png
A_bamboo-leaves.gih
A_distant-mountain.gih
A_eroded-cercle-anim.gih
+A_eroded_circle.gih
A_grass-floor.gih
A_pin.gih
A_smoke.gbr
A_snow-pack.gih
A_sparkle1.gbr
A_sparkle2.gbr
A_sparkle3.gbr
A_splat2.gih
A_starfield2.gbr
A_wall-texture.gih
cazu-chalk.gbr
cazu-freckles.gbr
cazu-reptile.gbr
cazu-smear-paint.gbr
cazu-spines.gbr
-cazu-smear-ink.gih
cazu_watercolor2.gih
double_special6.gih
dub1.gbr
dub6.gbr
Flat_textured1.gih
knife3.gbr
LJF_Water_Brush_02.gih
+leaves-scattered.svg
M_Pipe_1.gbr
MZ_leaves.gbr
N_Grass_2.gih
oil_bristle.gbr
oil_knife.gbr
P_Graphite_Pencil_grain.gih
Rect_textured1.gih
Rect_textured2.gih
Rect_textured3.gih
round_textured1.gbr
R_Rake2.gbr
R_Rake4.gbr
rock2.gbr
S_splats_02.gih
scribbles.gbr
texture51.gbr
w_hearts.gih
z_study_pencil_2H.gih
DESTINATION ${DATA_INSTALL_DIR}/krita/brushes)
diff --git a/krita/data/brushes/cazu-smear-ink.gih b/krita/data/brushes/cazu-smear-ink.gih
deleted file mode 100644
index 6b3bd21d4b..0000000000
Binary files a/krita/data/brushes/cazu-smear-ink.gih and /dev/null differ
diff --git a/krita/data/brushes/leaves-scattered.svg b/krita/data/brushes/leaves-scattered.svg
new file mode 100644
index 0000000000..04f52fd6c7
--- /dev/null
+++ b/krita/data/brushes/leaves-scattered.svg
@@ -0,0 +1,63 @@
+
+
+
+
diff --git a/krita/data/kritarc b/krita/data/kritarc
index 49c5c12f0a..bda07e9226 100644
--- a/krita/data/kritarc
+++ b/krita/data/kritarc
@@ -1,469 +1,468 @@
favoriteCompositeOps=normal,erase,multiply,burn,darken,add,dodge,screen,overlay,soft_light_svg,luminize,lighten,saturation,color
ArtColorSel.ColorSpace=0
ArtColorSel.InversedSaturation=false
ArtColorSel.Light=0.5
ArtColorSel.LightPieces=19
ArtColorSel.NumRings=11
ArtColorSel.RelativeLight=false
ArtColorSel.RingAngles=0,0,0,0,0,0,0,0,0,0,0
ArtColorSel.RingPieces=12
ArtColorSel.SelColorA=1
ArtColorSel.SelColorH=0
ArtColorSel.SelColorS=0
ArtColorSel.SelColorX=0.5
BackgroundColorForNewImage=255,255,255
BackgroundOpacityForNewImage=255
BackgroundStyleForNewImage=0
Krita/Ocio/OcioColorManagementMode=0
Krita/Ocio/OcioLockColorVisualRepresentation=false
Krita/Ocio/UseOcio=false
LastBackGroundColor=\n\n \n\n
LastForeGroundColor=\n\n \n\n
LastPreset=Basic_circle
LastPreset_-1=Basic_circle
LineSmoothingDelayDistance=50
LineSmoothingDistance=50
LineSmoothingFinishStabilizedCurve=true
LineSmoothingStabilizeSensors=true
LineSmoothingTailAggressiveness=0.14999999999999999
LineSmoothingType=1
LineSmoothingUseDelayDistance=true
NumberOfLayersForNewImage=2
PaintopPopupDetached=false
SpecificColorSelector/ShowColorSpaceSelector=false
baseLength=50
colorDepthDef=U8
colorModelDef=RGBA
colorProfileDef=sRGB-elle-V2-srgbtrc.icc
favoritePresetsTag=demo
globalSnapBoundingBox=false
globalSnapExtension=false
globalSnapImageBounds=true
globalSnapImageCenter=true
globalSnapIntersection=false
globalSnapNode=false
globalSnapOrthogonal=false
gridmaincolor=99,99,99
gridmainstyle=0
gridsubdivisioncolor=150,150,150
gridsubdivisionstyle=1
guidesColor=99,99,99
guidesLineStyle=0
imageHeightDef=1200
imageResolutionDef=300
imageWidthDef=1600
levelOfDetailEnabled=true
numberOfOnionSkins=10
oninSkinTintColorForward=0,255,0
onionSkinOpacity_-1=173
onionSkinOpacity_-10=22
onionSkinOpacity_-2=163
onionSkinOpacity_-3=147
onionSkinOpacity_-4=127
onionSkinOpacity_-5=107
onionSkinOpacity_-6=84
onionSkinOpacity_-7=63
onionSkinOpacity_-8=48
onionSkinOpacity_-9=33
onionSkinOpacity_0=175
onionSkinOpacity_1=173
onionSkinOpacity_10=22
onionSkinOpacity_2=163
onionSkinOpacity_3=147
onionSkinOpacity_4=127
onionSkinOpacity_5=107
onionSkinOpacity_6=84
onionSkinOpacity_7=63
onionSkinOpacity_8=48
onionSkinOpacity_9=33
onionSkinState_-1=true
onionSkinState_-10=false
onionSkinState_-2=true
onionSkinState_-3=false
onionSkinState_-4=false
onionSkinState_-5=false
onionSkinState_-6=false
onionSkinState_-7=false
onionSkinState_-8=false
onionSkinState_-9=false
onionSkinState_0=true
onionSkinState_1=true
onionSkinState_10=false
onionSkinState_2=true
onionSkinState_3=false
onionSkinState_4=false
onionSkinState_5=false
onionSkinState_6=false
onionSkinState_7=false
onionSkinState_8=false
onionSkinState_9=false
onionSkinTintColorBackward=255,0,0
onionSkinTintFactor=191
presethistory=Basic_tip_default
showAdditionalOnionSkinsSettings=true
toolbarslider_1=opacity
toolbarslider_2=size
toolbarslider_3=flow
[advancedColorSelector]
allowHorizontalLayout=true
colorSelectorConfiguration=3|0|5|0
commonColorsAlignment=false
commonColorsAutoUpdate=false
commonColorsCount=12
commonColorsHeight=16
commonColorsNumCols=1
commonColorsNumRows=1
commonColorsScrolling=false
commonColorsShow=true
commonColorsWidth=16
customColorSpaceDepthID=U8
customColorSpaceModel=RGBA
customColorSpaceProfile=sRGB built-in
lastUsedColorsAlignment=true
lastUsedColorsCount=20
lastUsedColorsHeight=16
lastUsedColorsNumCols=1
lastUsedColorsNumRows=1
lastUsedColorsScrolling=true
lastUsedColorsShow=true
lastUsedColorsWidth=16
minimalShadeSelectorAsGradient=true
minimalShadeSelectorLineConfig=0|0.2|0|0|0|0|0;1|0|1|1|0|0|0;2|0|-1|1|0|0|0;
minimalShadeSelectorLineHeight=10
minimalShadeSelectorPatchCount=10
popupOnMouseClick=true
popupOnMouseOver=false
shadeSelectorHideable=false
shadeSelectorType=Minimal
shadeSelectorUpdateOnBackground=true
shadeSelectorUpdateOnForeground=true
shadeSelectorUpdateOnLeftClick=false
shadeSelectorUpdateOnRightClick=false
useCustomColorSpace=false
zoomSize=280
[DockWidget sharedtooldocker]
TabbedMode=false
[KisToolTransform]
filterId=Bicubic
[MainWindow]
Height 1080=720
Width 1920=1256
ko_geometry=AdnQywACAAAAAAE6AAAAtAAABikAAAOkAAABPgAAANEAAAYlAAADoAAAAAAAAAAAB4A=
-ko_windowstate=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TQBpAHgAZQByAAAAAAD/////AAAAkQD////7AAAADgBIAGkAcwB0AG8AcgB5AAAAA5AAAAC0AAAAWgD////7AAAATgBLAHIAaQB0AGEARgBpAGwAbAAvAEsAaQBzAFQAbwBvAGwARwByAGEAZABpAGUAbgB0ACAAbwBwAHQAaQBvAG4AIAB3AGkAZABnAGUAdAAAAAQoAAAAHAAAAAAAAAAA+wAAAEYASwByAGkAdABhAEYAaQBsAGwALwBLAGkAcwBUAG8AbwBsAEYAaQBsAGwAIABvAHAAdABpAG8AbgAgAHcAaQBkAGcAZQB0AAAAA1AAAAAcAAAAAAAAAAD7AAAANgBLAHIAaQB0AGEAUwBoAGEAcABlAC8ASwBpAHMAVABvAG8AbABSAGUAYwB0AGEAbgBnAGwAZQAAAAMFAAAAZwAAAAAAAAAA+wAAACIAQwBvAG0AcABvAHMAaQB0AGkAbwBuAEQAbwBjAGsAZQByAAAAAAD/////AAAAegD////7AAAAKgBBAHIAdABpAHMAdABpAGMAQwBvAGwAbwByAFMAZQBsAGUAYwB0AG8AcgAAAAAA/////wAAAHgA////+wAAABoAUABhAHQAdABlAHIAbgBEAG8AYwBrAGUAcgAAAALZAAABSQAAAT8A////+wAAABoAVABhAHMAawBzAGUAdABEAG8AYwBrAGUAcgAAAAAA/////wAAAHoA////+wAAACgAUwBuAGEAcABHAHUAaQBkAGUAIABQAHIAbwBwAGUAcgB0AGkAZQBzAAAAAAD/////AAAAAAAAAAD7AAAAOABUAGUAeAB0AEQAbwBjAHUAbQBlAG4AdABJAG4AcwBwAGUAYwB0AGkAbwBuAEQAbwBjAGsAZQByAgAABJoAAAIVAAABKgAAAK77AAAAEgBMAHUAdABEAG8AYwBrAGUAcgAAAAAA/////wAAATkA////+wAAABwATwB2AGUAcgB2AGkAZQB3AEQAbwBjAGsAZQByAAAAAAD/////AAAASAD////7AAAAGgBQAGEAbABlAHQAdABlAEQAbwBjAGsAZQByAAAAAAD/////AAAAPwD////7AAAAGgBQAHIAZQBzAGUAdABIAGkAcwB0AG8AcgB5AAAAAAD/////AAAAWgD////7AAAAFABHAHIAaQBkAEQAbwBjAGsAZQByAAAAAAD/////AAABLgD////7AAAAHgBIAGkAcwB0AG8AZwByAGEAbQBEAG8AYwBrAGUAcgAAAAAA/////wAAAEgA////+wAAACoAQQBuAGkAbQBhAHQAaQBvAG4AQwB1AHIAdgBlAHMARABvAGMAawBlAHIAAAAAAP////8AAAB5AP///wAAAAIAAAeAAAAAvPwBAAAAAfsAAAAaAFQAbwBvAGwAQgBhAHIARABvAGMAawBlAHIAAAAAAP////8AAAAAAAAAAAAAAAMAAAAAAAAAAPwBAAAABPsAAAAcAEYAbABpAHAAYgBvAG8AawBEAG8AYwBrAGUAcgAAAAAA/////wAAAAAAAAAA+wAAAB4AQQBuAGkAbQBhAHQAaQBvAG4ARABvAGMAawBlAHIAAAAAAP////8AAAELAP////sAAAAgAE8AbgBpAG8AbgBTAGsAaQBuAHMARABvAGMAawBlAHIAAAAAAP////8AAAEtAP////sAAAAcAFQAaQBtAGUAbABpAG4AZQBEAG8AYwBrAGUAcgAAAAAA/////wAAAH0A////AAADhAAAAnYAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAACAAAAAgAAABYAbQBhAGkAbgBUAG8AbwBsAEIAYQByAAAAAAD/////AAAAAAAAAAAAAAAeAEIAcgB1AHMAaABlAHMAQQBuAGQAUwB0AHUAZgBmAQAAAAD/////AAAAAAAAAAA=
[advancedColorSelector]
gamma=2.2000000000000002
hidePopupOnClickCheck=false
hsxSettingType=0
lumaB=0.0722
lumaG=0.71519999999999995
lumaR=0.21260000000000001
onDockerResize=0
shadeMyPaintType=HSV
zoomSelectorOptions=0
[calligra]
ColorSpaceExtensionsPlugins=\\0
ColorSpaceExtensionsPluginsDisabled=
ColorSpacePlugins=\\0
ColorSpacePluginsDisabled=
DockerPlugins=\\0
DockerPluginsDisabled=textdocumentinspection
FlakePlugins=,
ShapePlugins=,
ToolsBlacklist=CreatePathTool,KoPencilTool,ConnectionTool,KarbonFilterEffectsTool,KritaShape/KisToolText,ArtisticTextTool,TextTool
ToolPlugins=,,
ToolPluginsDisabled=
[KoShapeCollection]
QuickShapes=ArtisticText,TextShapeID,EllipseShape,RectangleShape
[colorhotkeys]
steps_blueyellow=10
steps_hue=36
steps_lightness=10
steps_redgreen=10
steps_saturation=10
[crashprevention]
CreatingCanvas=false
[hsxColorSlider]
hsiH=false
hsiI=false
hsiS=false
hslH=true
hslL=true
hslS=true
hsvH=false
hsvS=false
hsvV=false
hsyH=false
hsyS=false
hsyY=false
[krita]
-State=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TQBpAHgAZQByAAAAAAD/////AAAAkQD////7AAAADgBIAGkAcwB0AG8AcgB5AAAAA5AAAAC0AAAAWgD////7AAAATgBLAHIAaQB0AGEARgBpAGwAbAAvAEsAaQBzAFQAbwBvAGwARwByAGEAZABpAGUAbgB0ACAAbwBwAHQAaQBvAG4AIAB3AGkAZABnAGUAdAAAAAQoAAAAHAAAAAAAAAAA+wAAAEYASwByAGkAdABhAEYAaQBsAGwALwBLAGkAcwBUAG8AbwBsAEYAaQBsAGwAIABvAHAAdABpAG8AbgAgAHcAaQBkAGcAZQB0AAAAA1AAAAAcAAAAAAAAAAD7AAAANgBLAHIAaQB0AGEAUwBoAGEAcABlAC8ASwBpAHMAVABvAG8AbABSAGUAYwB0AGEAbgBnAGwAZQAAAAMFAAAAZwAAAAAAAAAA+wAAACIAQwBvAG0AcABvAHMAaQB0AGkAbwBuAEQAbwBjAGsAZQByAAAAAAD/////AAAAegD////7AAAAKgBBAHIAdABpAHMAdABpAGMAQwBvAGwAbwByAFMAZQBsAGUAYwB0AG8AcgAAAAAA/////wAAAHgA////+wAAABoAUABhAHQAdABlAHIAbgBEAG8AYwBrAGUAcgAAAALZAAABSQAAAT8A////+wAAABoAVABhAHMAawBzAGUAdABEAG8AYwBrAGUAcgAAAAAA/////wAAAHoA////+wAAACgAUwBuAGEAcABHAHUAaQBkAGUAIABQAHIAbwBwAGUAcgB0AGkAZQBzAAAAAAD/////AAAAAAAAAAD7AAAAOABUAGUAeAB0AEQAbwBjAHUAbQBlAG4AdABJAG4AcwBwAGUAYwB0AGkAbwBuAEQAbwBjAGsAZQByAgAABJoAAAIVAAABKgAAAK77AAAAEgBMAHUAdABEAG8AYwBrAGUAcgAAAAAA/////wAAATkA////+wAAABwATwB2AGUAcgB2AGkAZQB3AEQAbwBjAGsAZQByAAAAAAD/////AAAASAD////7AAAAGgBQAGEAbABlAHQAdABlAEQAbwBjAGsAZQByAAAAAAD/////AAAAPwD////7AAAAGgBQAHIAZQBzAGUAdABIAGkAcwB0AG8AcgB5AAAAAAD/////AAAAWgD////7AAAAFABHAHIAaQBkAEQAbwBjAGsAZQByAAAAAAD/////AAABLgD////7AAAAHgBIAGkAcwB0AG8AZwByAGEAbQBEAG8AYwBrAGUAcgAAAAAA/////wAAAEgA////+wAAACoAQQBuAGkAbQBhAHQAaQBvAG4AQwB1AHIAdgBlAHMARABvAGMAawBlAHIAAAAAAP////8AAAB5AP///wAAAAIAAAeAAAAAvPwBAAAAAfsAAAAaAFQAbwBvAGwAQgBhAHIARABvAGMAawBlAHIAAAAAAP////8AAAAAAAAAAAAAAAMAAAAAAAAAAPwBAAAABPsAAAAcAEYAbABpAHAAYgBvAG8AawBEAG8AYwBrAGUAcgAAAAAA/////wAAAAAAAAAA+wAAAB4AQQBuAGkAbQBhAHQAaQBvAG4ARABvAGMAawBlAHIAAAAAAP////8AAAELAP////sAAAAgAE8AbgBpAG8AbgBTAGsAaQBuAHMARABvAGMAawBlAHIAAAAAAP////8AAAEtAP////sAAAAcAFQAaQBtAGUAbABpAG4AZQBEAG8AYwBrAGUAcgAAAAAA/////wAAAH0A////AAADhAAAAnYAAAAEAAAABAAAAAgAAAAI/AAAAAEAAAACAAAAAgAAABYAbQBhAGkAbgBUAG8AbwBsAEIAYQByAAAAAAD/////AAAAAAAAAAAAAAAeAEIAcgB1AHMAaABlAHMAQQBuAGQAUwB0AHUAZgBmAQAAAAD/////AAAAAAAAAAA=
-ToolBarsMovable=Disabled
+State=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
+ToolBarsMovable=Enabled
[krita][DockWidget AnimationCurvesDocker]
Collapsed=false
DockArea=2
Locked=false
height=421
width=448
xPosition=0
yPosition=0
[krita][DockWidget AnimationDocker]
Collapsed=false
DockArea=8
Locked=false
height=160
width=280
xPosition=0
yPosition=0
[krita][DockWidget ArtisticColorSelector]
Collapsed=false
DockArea=2
Locked=false
height=294
width=337
xPosition=0
yPosition=0
[krita][DockWidget ChannelDocker]
Collapsed=false
DockArea=2
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget ColorSelectorNg]
Collapsed=false
DockArea=2
Locked=false
height=176
width=281
xPosition=0
yPosition=20
[krita][DockWidget ColorSlider]
Collapsed=false
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][DockWidget CompositionDocker]
Collapsed=false
DockArea=2
Locked=false
height=300
width=400
xPosition=0
yPosition=0
[krita][DockWidget DigitalMixer]
Collapsed=false
DockArea=2
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget GridDocker]
Collapsed=false
DockArea=2
Locked=false
height=342
width=441
xPosition=0
yPosition=0
[krita][DockWidget HistogramDocker]
Collapsed=false
DockArea=2
Locked=false
height=91
width=281
xPosition=0
yPosition=20
[krita][DockWidget History]
Collapsed=false
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][DockWidget ImageDocker]
Collapsed=false
DockArea=2
Locked=false
height=300
width=399
xPosition=0
yPosition=0
[krita][DockWidget KisLayerBox]
DockArea=2
Locked=false
height=358
width=281
xPosition=0
yPosition=20
[krita][DockWidget LutDocker]
Collapsed=false
DockArea=2
Locked=false
height=286
width=357
xPosition=0
yPosition=0
[krita][DockWidget OnionSkinsDocker]
Collapsed=false
DockArea=8
Locked=false
height=210
width=356
xPosition=0
yPosition=0
[krita][DockWidget OverviewDocker]
Collapsed=false
DockArea=2
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget PaletteDocker]
Collapsed=false
DockArea=2
Locked=false
height=219
width=256
xPosition=0
yPosition=0
[krita][DockWidget PatternDocker]
Collapsed=false
DockArea=2
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget PresetDocker]
Collapsed=false
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][DockWidget PresetHistory]
Collapsed=false
DockArea=2
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget Shape Properties]
DockArea=2
Locked=false
height=480
width=640
xPosition=0
yPosition=0
[krita][DockWidget ShapeCollectionDocker]
Collapsed=false
DockArea=2
Locked=false
height=0
width=0
xPosition=0
yPosition=20
[krita][DockWidget SmallColorSelector]
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][DockWidget SpecificColorSelector]
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][DockWidget TasksetDocker]
Collapsed=false
DockArea=2
Locked=false
height=300
width=400
xPosition=0
yPosition=0
[krita][DockWidget TimelineDocker]
Collapsed=false
DockArea=8
Locked=false
height=30
width=100
xPosition=0
yPosition=0
[krita][DockWidget ToolBox]
DockArea=1
Locked=false
height=610
width=63
xPosition=0
yPosition=20
[krita][DockWidget sharedtooldocker]
Collapsed=false
DockArea=2
Locked=false
height=460
width=640
xPosition=0
yPosition=20
[krita][Toolbar mainToolBar]
ToolButtonStyle=IconOnly
[TemplateChooserDialog]
ShowCustomDocumentWidgetByDefault=true
LastReturnType=Custom Document
[theme]
Theme=Krita dark
diff --git a/krita/data/paintoppresets/Basic_Chisel_Smooth.kpp b/krita/data/paintoppresets/Basic_Chisel_Smooth.kpp
index 8c94f94851..e2c79035b5 100644
Binary files a/krita/data/paintoppresets/Basic_Chisel_Smooth.kpp and b/krita/data/paintoppresets/Basic_Chisel_Smooth.kpp differ
diff --git a/krita/data/paintoppresets/CMakeLists.txt b/krita/data/paintoppresets/CMakeLists.txt
index 96840acf7e..06dac6e4f4 100644
--- a/krita/data/paintoppresets/CMakeLists.txt
+++ b/krita/data/paintoppresets/CMakeLists.txt
@@ -1,75 +1,79 @@
install( FILES
Airbrush_Soft.kpp
Basic_Chisel_Smooth.kpp
Basic_Flow.kpp
Basic_tip_default.kpp
Blender_Basic.kpp
Blender_Blur.kpp
Blender_Mover.kpp
Blender_Rake.kpp
Blender_Textured.kpp
Blender_Water.kpp
Clone_Tool.kpp
Clone_Tool_Textured.kpp
Distort_Grow.kpp
Distort_Move.kpp
Distort_Shrink.kpp
Dry_Bristles_Eroded.kpp
Dry_Bristles.kpp
Dry_Bristles_Smooth.kpp
Dry_Marker.kpp
Dry_Textured_Creases.kpp
Dry_Textured_Rough.kpp
Dry_Textured_Scribbles.kpp
Dry_Textured_Soft.kpp
Eraser_Airbrush.kpp
Eraser_Circle.kpp
Eraser_Hard.kpp
Eraser_Screentone.kpp
Eraser_Soft.kpp
Fill_Large_Quick.kpp
Fill_Screentones.kpp
Fill_Shape.kpp
FX_Glow_Add.kpp
FX_Image_Blur.kpp
FX_Image_Sharpen.kpp
FX_Smoke_Particles.kpp
FX_Starfield.kpp
FX_Value_Burn.kpp
FX_Value_Dodge.kpp
Ink_Brush.kpp
Ink_Brush_Rough.kpp
Ink_Fineliner.kpp
Ink_Precision.kpp
Ink_Tough.kpp
Normal_Map.kpp
Pixel_Art.kpp
Pixel_Art_Dithering.kpp
Sketch_2B.kpp
+Sketch_6B.kpp
Sketch_Chrome.kpp
Sketch_Hatch_Noisy.kpp
Spray_Smoke.kpp
Spray_Watercolor.kpp
Stamp_Clouds.kpp
Stamp_Freckles.kpp
Stamp_Grass.kpp
Stamp_Grass_Patch.kpp
Stamp_Hearts.kpp
Stamp_Leaves.kpp
Stamp_Mountains_Distant.kpp
Stamp_Scales.kpp
Stamp_Shoujo_Bubbles.kpp
Stamp_Spines.kpp
Stamp_Watercolor.kpp
Stamp_Water.kpp
+Waterpaint_Hard_Edges.kpp
+Waterpaint_Soft_Edges.kpp
+Waterpaint_Soft.kpp
Wet_Bristles.kpp
Wet_Bristles_Rough.kpp
Wet_Circle.kpp
Wet_Soft_Tilted.kpp
Wet_Smear.kpp
DESTINATION ${DATA_INSTALL_DIR}/krita/paintoppresets)
install( FILES
kis_paintoppresets_tags.xml
DESTINATION ${DATA_INSTALL_DIR}/krita/tags)
diff --git a/krita/data/paintoppresets/Sketch_6B.kpp b/krita/data/paintoppresets/Sketch_6B.kpp
new file mode 100644
index 0000000000..646e82fb9b
Binary files /dev/null and b/krita/data/paintoppresets/Sketch_6B.kpp differ
diff --git a/krita/data/paintoppresets/Stamp_Grass.kpp b/krita/data/paintoppresets/Stamp_Grass.kpp
index bf98d58f81..9d54fbdeeb 100644
Binary files a/krita/data/paintoppresets/Stamp_Grass.kpp and b/krita/data/paintoppresets/Stamp_Grass.kpp differ
diff --git a/krita/data/paintoppresets/Stamp_Grass_Patch.kpp b/krita/data/paintoppresets/Stamp_Grass_Patch.kpp
index 939a2fe29e..b7be94542c 100644
Binary files a/krita/data/paintoppresets/Stamp_Grass_Patch.kpp and b/krita/data/paintoppresets/Stamp_Grass_Patch.kpp differ
diff --git a/krita/data/paintoppresets/Stamp_Leaves.kpp b/krita/data/paintoppresets/Stamp_Leaves.kpp
index 91e0d8081f..a8de3bbd55 100644
Binary files a/krita/data/paintoppresets/Stamp_Leaves.kpp and b/krita/data/paintoppresets/Stamp_Leaves.kpp differ
diff --git a/krita/data/paintoppresets/Stamp_Watercolor.kpp b/krita/data/paintoppresets/Stamp_Watercolor.kpp
index c589ef2521..2ffccd766d 100644
Binary files a/krita/data/paintoppresets/Stamp_Watercolor.kpp and b/krita/data/paintoppresets/Stamp_Watercolor.kpp differ
diff --git a/krita/data/paintoppresets/Waterpaint_Hard_Edges.kpp b/krita/data/paintoppresets/Waterpaint_Hard_Edges.kpp
new file mode 100644
index 0000000000..379b5f5ecf
Binary files /dev/null and b/krita/data/paintoppresets/Waterpaint_Hard_Edges.kpp differ
diff --git a/krita/data/paintoppresets/Waterpaint_Soft.kpp b/krita/data/paintoppresets/Waterpaint_Soft.kpp
new file mode 100644
index 0000000000..ecc8dd5afe
Binary files /dev/null and b/krita/data/paintoppresets/Waterpaint_Soft.kpp differ
diff --git a/krita/data/paintoppresets/Waterpaint_Soft_Edges.kpp b/krita/data/paintoppresets/Waterpaint_Soft_Edges.kpp
new file mode 100644
index 0000000000..6b01f2e9d3
Binary files /dev/null and b/krita/data/paintoppresets/Waterpaint_Soft_Edges.kpp differ
diff --git a/krita/data/workspaces/Default.kws b/krita/data/workspaces/Default.kws
index 0d10953067..c7ba2fab69 100644
--- a/krita/data/workspaces/Default.kws
+++ b/krita/data/workspaces/Default.kws
@@ -1,4 +1,4 @@
-
-
+
+
diff --git a/krita/krita4.xmlgui b/krita/krita4.xmlgui
index dcab970b53..9a4bb38a0d 100644
--- a/krita/krita4.xmlgui
+++ b/krita/krita4.xmlgui
@@ -1,387 +1,387 @@
&View&Canvas&Snap To&Image&Rotate&LayerNew&Import/ExportImport&Convert&Select&Group&Transform&RotateS&plitS&plit Alpha&SelectFilte&r&ToolsRecordingMacrosSetti&ngs&HelpFile
-
+ Brushes and Stuff
diff --git a/krita/main.cc b/krita/main.cc
index c04f117819..2027d8b4d6 100644
--- a/krita/main.cc
+++ b/krita/main.cc
@@ -1,315 +1,321 @@
/*
* Copyright (c) 1999 Matthias Elter
* Copyright (c) 2002 Patrick Julien
* Copyright (c) 2015 Boudewijn Rempt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
+#include
#include
#include
#include
#include
#include
#include "data/splash/splash_screen.xpm"
#include "data/splash/splash_holidays.xpm"
#include "KisDocument.h"
#include "kis_splash_screen.h"
#include "KisPart.h"
#include "KisApplicationArguments.h"
#include
#include "input/KisQtWidgetsTweaker.h"
#if defined Q_OS_WIN
#include
#include
#include
#include
#include
#elif defined HAVE_X11
#include
#include
#endif
#if defined HAVE_KCRASH
#include
#elif defined USE_DRMINGW
namespace
{
void tryInitDrMingw()
{
wchar_t path[MAX_PATH];
QString pathStr = QCoreApplication::applicationDirPath().replace(L'/', L'\\') + QStringLiteral("\\exchndl.dll");
if (pathStr.size() > MAX_PATH - 1) {
return;
}
int pathLen = pathStr.toWCharArray(path);
path[pathLen] = L'\0'; // toWCharArray doesn't add NULL terminator
HMODULE hMod = LoadLibraryW(path);
if (!hMod) {
return;
}
// No need to call ExcHndlInit since the crash handler is installed on DllMain
auto myExcHndlSetLogFileNameA = reinterpret_cast(GetProcAddress(hMod, "ExcHndlSetLogFileNameA"));
if (!myExcHndlSetLogFileNameA) {
return;
}
// Set the log file path to %LocalAppData%\kritacrash.log
QString logFile = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation).replace(L'/', L'\\') + QStringLiteral("\\kritacrash.log");
myExcHndlSetLogFileNameA(logFile.toLocal8Bit());
}
} // namespace
#endif
extern "C" int main(int argc, char **argv)
{
// The global initialization of the random generator
qsrand(time(0));
bool runningInKDE = !qgetenv("KDE_FULL_SESSION").isEmpty();
#if defined HAVE_X11
qputenv("QT_QPA_PLATFORM", "xcb");
#endif
KisLoggingManager::initialize();
// A per-user unique string, without /, because QLocalServer cannot use names with a / in it
QString key = "Krita3" + QStandardPaths::writableLocation(QStandardPaths::HomeLocation).replace("/", "_");
key = key.replace(":", "_").replace("\\","_");
QCoreApplication::setAttribute(Qt::AA_ShareOpenGLContexts, true);
QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps, true);
const QString configPath = QStandardPaths::writableLocation(QStandardPaths::GenericConfigLocation);
bool singleApplication = true;
bool enableOpenGLDebug = false;
bool openGLDebugSynchronous = false;
{
QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
singleApplication = kritarc.value("EnableSingleApplication", true).toBool();
#if QT_VERSION >= 0x050600
if (kritarc.value("EnableHiDPI", false).toBool()) {
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
if (!qgetenv("KRITA_HIDPI").isEmpty()) {
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
}
#endif
if (!qgetenv("KRITA_OPENGL_DEBUG").isEmpty()) {
enableOpenGLDebug = true;
} else {
enableOpenGLDebug = kritarc.value("EnableOpenGLDebug", false).toBool();
}
if (enableOpenGLDebug && (qgetenv("KRITA_OPENGL_DEBUG") == "sync" || kritarc.value("OpenGLDebugSynchronous", false).toBool())) {
openGLDebugSynchronous = true;
}
KisOpenGL::setDefaultFormat(enableOpenGLDebug, openGLDebugSynchronous);
#ifdef Q_OS_WIN
QString preferredOpenGLRenderer = kritarc.value("OpenGLRenderer", "auto").toString();
// Force ANGLE to use Direct3D11. D3D9 doesn't support OpenGL ES 3 and WARP
// might get weird crashes atm.
qputenv("QT_ANGLE_PLATFORM", "d3d11");
// Probe QPA auto OpenGL detection
KisOpenGL::probeWindowsQpaOpenGL(argc, argv, preferredOpenGLRenderer);
#endif
}
KLocalizedString::setApplicationDomain("krita");
// first create the application so we can create a pixmap
KisApplication app(key, argc, argv);
#ifdef Q_OS_LINUX
+ // We must have the XDG environment to run.
+ if (qgetenv("XDG_DATA_DIRS").isEmpty()) {
+ QMessageBox::critical(0, i18nc("@title:window", "Krita"), i18n("XDG_DATA_DIRS is not set. Krita cannot run."));
+ return 1;
+ }
qputenv("XDG_DATA_DIRS", QFile::encodeName(KoResourcePaths::getApplicationRoot() + "share") + ":" + qgetenv("XDG_DATA_DIRS"));
#else
qputenv("XDG_DATA_DIRS", QFile::encodeName(KoResourcePaths::getApplicationRoot() + "share"));
#endif
qDebug() << "Setting XDG_DATA_DIRS" << qgetenv("XDG_DATA_DIRS");
qDebug() << "Available translations" << KLocalizedString::availableApplicationTranslations();
qDebug() << "Available domain translations" << KLocalizedString::availableDomainTranslations("krita");
// Now that the paths are set, set the language. First check the override from the language
// selection dialog.
{
QSettings languageoverride(configPath + QStringLiteral("/klanguageoverridesrc"), QSettings::IniFormat);
languageoverride.beginGroup(QStringLiteral("Language"));
QString language = languageoverride.value(qAppName(), "").toString();
qDebug() << "Override language:" << language;
if (!language.isEmpty()) {
KLocalizedString::setLanguages(language.split(":"));
// And override Qt's locale, too
qputenv("LANG", language.split(":").first().toUtf8());
QLocale locale(language.split(":").first());
QLocale::setDefault(locale);
qDebug() << "Qt ui languages" << locale.uiLanguages();
}
else {
// And if there isn't one, check the one set by the system.
// XXX: This doesn't work, for some !@#$% reason.
QLocale locale = QLocale::system();
if (locale.name() != QStringLiteral("en")) {
qDebug() << "Setting Krita's language to:" << locale;
qputenv("LANG", locale.name().toLatin1());
KLocalizedString::setLanguages(QStringList() << locale.name());
}
}
}
#ifdef Q_OS_WIN
QDir appdir(KoResourcePaths::getApplicationRoot());
QString path = qgetenv("PATH");
qputenv("PATH", QFile::encodeName(appdir.absolutePath() + "/bin" + ";"
+ appdir.absolutePath() + "/lib" + ";"
+ appdir.absolutePath() + "/Frameworks" + ";"
+ appdir.absolutePath() + ";"
+ path));
qDebug() << "PATH" << qgetenv("PATH");
#endif
if (qApp->applicationDirPath().contains(KRITA_BUILD_DIR)) {
qFatal("FATAL: You're trying to run krita from the build location. You can only run Krita from the installation location.");
}
#if defined HAVE_KCRASH
KCrash::initialize();
#elif defined USE_DRMINGW
tryInitDrMingw();
#endif
// If we should clear the config, it has to be done as soon as possible after
// KisApplication has been created. Otherwise the config file may have been read
// and stored in a KConfig object we have no control over.
app.askClearConfig();
KisApplicationArguments args(app);
if (singleApplication && app.isRunning()) {
// only pass arguments to main instance if they are not for batch processing
// any batch processing would be done in this separate instance
const bool batchRun = (args.print() || args.exportAs() || args.exportAsPdf());
if (!batchRun) {
QByteArray ba = args.serialize();
if (app.sendMessage(ba)) {
return 0;
}
}
}
if (!runningInKDE) {
// Icons in menus are ugly and distracting
app.setAttribute(Qt::AA_DontShowIconsInMenus);
}
#if defined HAVE_X11
app.installNativeEventFilter(KisXi2EventFilter::instance());
#endif
app.installEventFilter(KisQtWidgetsTweaker::instance());
if (!args.noSplash()) {
// then create the pixmap from an xpm: we cannot get the
// location of our datadir before we've started our components,
// so use an xpm.
QDate currentDate = QDate::currentDate();
QWidget *splash = 0;
if (currentDate > QDate(currentDate.year(), 12, 4) ||
currentDate < QDate(currentDate.year(), 1, 9)) {
splash = new KisSplashScreen(app.applicationVersion(), QPixmap(splash_holidays_xpm));
}
else {
splash = new KisSplashScreen(app.applicationVersion(), QPixmap(splash_screen_xpm));
}
app.setSplashScreen(splash);
}
#if defined Q_OS_WIN
{
KisConfig cfg;
bool isUsingWin8PointerInput = false;
if (cfg.useWin8PointerInput()) {
KisTabletSupportWin8 *penFilter = new KisTabletSupportWin8();
if (penFilter->init()) {
// penFilter.registerPointerDeviceNotifications();
app.installNativeEventFilter(penFilter);
isUsingWin8PointerInput = true;
qDebug() << "Using Win8 Pointer Input for tablet support";
} else {
qDebug() << "No Win8 Pointer Input available";
delete penFilter;
}
}
if (!isUsingWin8PointerInput) {
KisTabletSupportWin::init();
// app.installNativeEventFilter(new KisTabletSupportWin());
}
}
#endif
if (!app.start(args)) {
return 1;
}
#if QT_VERSION >= 0x050700
app.setAttribute(Qt::AA_CompressHighFrequencyEvents, false);
#endif
// Set up remote arguments.
QObject::connect(&app, SIGNAL(messageReceived(QByteArray,QObject*)),
&app, SLOT(remoteArguments(QByteArray,QObject*)));
QObject::connect(&app, SIGNAL(fileOpenRequest(QString)),
&app, SLOT(fileOpenRequested(QString)));
int state = app.exec();
{
QSettings kritarc(configPath + QStringLiteral("/kritadisplayrc"), QSettings::IniFormat);
kritarc.setValue("canvasState", "OPENGL_SUCCESS");
}
return state;
}
diff --git a/libs/brush/kis_auto_brush_factory.h b/libs/brush/kis_auto_brush_factory.h
index e52385b4ca..1d00b102eb 100644
--- a/libs/brush/kis_auto_brush_factory.h
+++ b/libs/brush/kis_auto_brush_factory.h
@@ -1,58 +1,58 @@
/*
* Copyright (c) 2008 Boudewijn Rempt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_AUTO_BRUSH_FACTORY
#define KIS_AUTO_BRUSH_FACTORY
#include
#include
#include
#include
#include "kis_brush.h"
#include "kis_brush_factory.h"
#include "kis_fixed_paint_device.h"
/**
* A brush factory can create a new brush instance based
* on a properties object that contains a serialized representation
* of the object.
*/
class BRUSH_EXPORT KisAutoBrushFactory : public KisBrushFactory
{
public:
KisAutoBrushFactory() {}
~KisAutoBrushFactory() override {}
QString id() const override {
return "auto_brush";
}
/**
- * Create a a new brush from the given data or return an existing KisBrush
+ * Create a new brush from the given data or return an existing KisBrush
* object. If this call leads to the creation of a resource, it should be
* added to the resource provider, too.
*/
KisBrushSP createBrush(const QDomElement& brushDefinition) override;
};
#endif
diff --git a/libs/brush/kis_brush.cpp b/libs/brush/kis_brush.cpp
index 0a8c45ff1b..8a0f787edd 100644
--- a/libs/brush/kis_brush.cpp
+++ b/libs/brush/kis_brush.cpp
@@ -1,643 +1,643 @@
/*
* Copyright (c) 1999 Matthias Elter
* Copyright (c) 2003 Patrick Julien
* Copyright (c) 2004-2008 Boudewijn Rempt
* Copyright (c) 2004 Adrian Page
* Copyright (c) 2005 Bart Coppens
* Copyright (c) 2007 Cyrille Berger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "kis_brush.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "kis_datamanager.h"
#include "kis_paint_device.h"
#include "kis_global.h"
#include "kis_boundary.h"
#include "kis_image.h"
#include "kis_iterator_ng.h"
#include "kis_brush_registry.h"
#include
#include
#include
#include
#include
KisBrush::ColoringInformation::~ColoringInformation()
{
}
KisBrush::PlainColoringInformation::PlainColoringInformation(const quint8* color) : m_color(color)
{
}
KisBrush::PlainColoringInformation::~PlainColoringInformation()
{
}
const quint8* KisBrush::PlainColoringInformation::color() const
{
return m_color;
}
void KisBrush::PlainColoringInformation::nextColumn()
{
}
void KisBrush::PlainColoringInformation::nextRow()
{
}
KisBrush::PaintDeviceColoringInformation::PaintDeviceColoringInformation(const KisPaintDeviceSP source, int width)
: m_source(source)
, m_iterator(m_source->createHLineConstIteratorNG(0, 0, width))
{
}
KisBrush::PaintDeviceColoringInformation::~PaintDeviceColoringInformation()
{
}
const quint8* KisBrush::PaintDeviceColoringInformation::color() const
{
return m_iterator->oldRawData();
}
void KisBrush::PaintDeviceColoringInformation::nextColumn()
{
m_iterator->nextPixel();
}
void KisBrush::PaintDeviceColoringInformation::nextRow()
{
m_iterator->nextRow();
}
struct KisBrush::Private {
Private()
: boundary(0)
, angle(0)
, scale(1.0)
, hasColor(false)
, brushType(INVALID)
, autoSpacingActive(false)
, autoSpacingCoeff(1.0)
, threadingAllowed(true)
{}
~Private() {
delete boundary;
}
mutable KisBoundary* boundary;
qreal angle;
qreal scale;
bool hasColor;
enumBrushType brushType;
qint32 width;
qint32 height;
double spacing;
QPointF hotSpot;
mutable QSharedPointer brushPyramid;
QImage brushTipImage;
bool autoSpacingActive;
qreal autoSpacingCoeff;
bool threadingAllowed;
};
KisBrush::KisBrush()
: KoResource(QString())
, d(new Private)
{
}
KisBrush::KisBrush(const QString& filename)
: KoResource(filename)
, d(new Private)
{
}
KisBrush::KisBrush(const KisBrush& rhs)
: KoResource(QString())
, KisShared()
, d(new Private)
{
setBrushTipImage(rhs.brushTipImage());
d->brushType = rhs.d->brushType;
d->width = rhs.d->width;
d->height = rhs.d->height;
d->spacing = rhs.d->spacing;
d->hotSpot = rhs.d->hotSpot;
d->hasColor = rhs.d->hasColor;
d->angle = rhs.d->angle;
d->scale = rhs.d->scale;
d->autoSpacingActive = rhs.d->autoSpacingActive;
d->autoSpacingCoeff = rhs.d->autoSpacingCoeff;
d->threadingAllowed = rhs.d->threadingAllowed;
setFilename(rhs.filename());
/**
* Be careful! The pyramid is shared between two brush objects,
* therefore you cannot change it, only recreate! That i sthe
* reason why it is defined as const!
*/
d->brushPyramid = rhs.d->brushPyramid;
// don't copy the boundary, it will be regenerated -- see bug 291910
}
KisBrush::~KisBrush()
{
delete d;
}
QImage KisBrush::brushTipImage() const
{
if (d->brushTipImage.isNull()) {
const_cast(this)->load();
}
return d->brushTipImage;
}
qint32 KisBrush::width() const
{
return d->width;
}
void KisBrush::setWidth(qint32 width)
{
d->width = width;
}
qint32 KisBrush::height() const
{
return d->height;
}
void KisBrush::setHeight(qint32 height)
{
d->height = height;
}
void KisBrush::setHotSpot(QPointF pt)
{
double x = pt.x();
double y = pt.y();
if (x < 0)
x = 0;
else if (x >= width())
x = width() - 1;
if (y < 0)
y = 0;
else if (y >= height())
y = height() - 1;
d->hotSpot = QPointF(x, y);
}
QPointF KisBrush::hotSpot(KisDabShape const& shape, const KisPaintInformation& info) const
{
Q_UNUSED(info);
QSizeF metric = characteristicSize(shape);
qreal w = metric.width();
qreal h = metric.height();
// The smallest brush we can produce is a single pixel.
if (w < 1) {
w = 1;
}
if (h < 1) {
h = 1;
}
// XXX: This should take d->hotSpot into account, though it
// isn't specified by gimp brushes so it would default to the center
// anyway.
QPointF p(w / 2, h / 2);
return p;
}
bool KisBrush::hasColor() const
{
return d->hasColor;
}
void KisBrush::setHasColor(bool hasColor)
{
d->hasColor = hasColor;
}
bool KisBrush::isPiercedApprox() const
{
QImage image = brushTipImage();
qreal w = image.width();
qreal h = image.height();
qreal xPortion = qMin(0.1, 5.0 / w);
qreal yPortion = qMin(0.1, 5.0 / h);
int x0 = std::floor((0.5 - xPortion) * w);
int x1 = std::ceil((0.5 + xPortion) * w);
int y0 = std::floor((0.5 - yPortion) * h);
int y1 = std::ceil((0.5 + yPortion) * h);
const int maxNumSamples = (x1 - x0 + 1) * (y1 - y0 + 1);
const int failedPixelsThreshold = 0.1 * maxNumSamples;
const int thresholdValue = 0.95 * 255;
int failedPixels = 0;
for (int y = y0; y <= y1; y++) {
for (int x = x0; x <= x1; x++) {
QRgb pixel = image.pixel(x,y);
if (qRed(pixel) > thresholdValue) {
failedPixels++;
}
}
}
return failedPixels > failedPixelsThreshold;
}
bool KisBrush::canPaintFor(const KisPaintInformation& /*info*/)
{
return true;
}
void KisBrush::setBrushTipImage(const QImage& image)
{
d->brushTipImage = image;
if (!image.isNull()) {
if (image.width() > 128 || image.height() > 128) {
KoResource::setImage(image.scaled(128, 128, Qt::KeepAspectRatio, Qt::SmoothTransformation));
}
else {
KoResource::setImage(image);
}
setWidth(image.width());
setHeight(image.height());
}
clearBrushPyramid();
}
void KisBrush::setBrushType(enumBrushType type)
{
d->brushType = type;
}
enumBrushType KisBrush::brushType() const
{
return d->brushType;
}
void KisBrush::predefinedBrushToXML(const QString &type, QDomElement& e) const
{
e.setAttribute("type", type);
e.setAttribute("filename", shortFilename());
e.setAttribute("spacing", QString::number(spacing()));
e.setAttribute("useAutoSpacing", QString::number(autoSpacingActive()));
e.setAttribute("autoSpacingCoeff", QString::number(autoSpacingCoeff()));
e.setAttribute("angle", QString::number(angle()));
e.setAttribute("scale", QString::number(scale()));
}
void KisBrush::toXML(QDomDocument& /*document*/ , QDomElement& element) const
{
element.setAttribute("BrushVersion", "2");
}
KisBrushSP KisBrush::fromXML(const QDomElement& element)
{
KisBrushSP brush = KisBrushRegistry::instance()->createBrush(element);
if (brush && element.attribute("BrushVersion", "1") == "1") {
brush->setScale(brush->scale() * 2.0);
}
return brush;
}
QSizeF KisBrush::characteristicSize(KisDabShape const& shape) const
{
KisDabShape normalizedShape(
shape.scale() * d->scale,
shape.ratio(),
normalizeAngle(shape.rotation() + d->angle));
return KisQImagePyramid::characteristicSize(
QSize(width(), height()), normalizedShape);
}
qint32 KisBrush::maskWidth(KisDabShape const& shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation& info) const
{
Q_UNUSED(info);
qreal angle = normalizeAngle(shape.rotation() + d->angle);
qreal scale = shape.scale() * d->scale;
return KisQImagePyramid::imageSize(QSize(width(), height()),
KisDabShape(scale, shape.ratio(), angle),
subPixelX, subPixelY).width();
}
qint32 KisBrush::maskHeight(KisDabShape const& shape, qreal subPixelX, qreal subPixelY, const KisPaintInformation& info) const
{
Q_UNUSED(info);
qreal angle = normalizeAngle(shape.rotation() + d->angle);
qreal scale = shape.scale() * d->scale;
return KisQImagePyramid::imageSize(QSize(width(), height()),
KisDabShape(scale, shape.ratio(), angle),
subPixelX, subPixelY).height();
}
double KisBrush::maskAngle(double angle) const
{
return normalizeAngle(angle + d->angle);
}
quint32 KisBrush::brushIndex(const KisPaintInformation& info) const
{
Q_UNUSED(info);
return 0;
}
void KisBrush::setSpacing(double s)
{
if (s < 0.02) s = 0.02;
d->spacing = s;
}
double KisBrush::spacing() const
{
return d->spacing;
}
void KisBrush::setAutoSpacing(bool active, qreal coeff)
{
d->autoSpacingCoeff = coeff;
d->autoSpacingActive = active;
}
bool KisBrush::autoSpacingActive() const
{
return d->autoSpacingActive;
}
qreal KisBrush::autoSpacingCoeff() const
{
return d->autoSpacingCoeff;
}
void KisBrush::notifyStrokeStarted()
{
}
void KisBrush::notifyCachedDabPainted(const KisPaintInformation& info)
{
Q_UNUSED(info);
}
void KisBrush::prepareForSeqNo(const KisPaintInformation &info, int seqNo)
{
Q_UNUSED(info);
Q_UNUSED(seqNo);
}
void KisBrush::setThreadingAllowed(bool value)
{
d->threadingAllowed = value;
}
bool KisBrush::threadingAllowed() const
{
return d->threadingAllowed;
}
void KisBrush::clearBrushPyramid()
{
d->brushPyramid.reset(new KisSharedQImagePyramid());
}
void KisBrush::mask(KisFixedPaintDeviceSP dst, const KoColor& color, KisDabShape const& shape, const KisPaintInformation& info, double subPixelX, double subPixelY, qreal softnessFactor) const
{
PlainColoringInformation pci(color.data());
generateMaskAndApplyMaskOrCreateDab(dst, &pci, shape, info, subPixelX, subPixelY, softnessFactor);
}
void KisBrush::mask(KisFixedPaintDeviceSP dst, const KisPaintDeviceSP src, KisDabShape const& shape, const KisPaintInformation& info, double subPixelX, double subPixelY, qreal softnessFactor) const
{
PaintDeviceColoringInformation pdci(src, maskWidth(shape, subPixelX, subPixelY, info));
generateMaskAndApplyMaskOrCreateDab(dst, &pdci, shape, info, subPixelX, subPixelY, softnessFactor);
}
void KisBrush::generateMaskAndApplyMaskOrCreateDab(KisFixedPaintDeviceSP dst,
ColoringInformation* coloringInformation,
KisDabShape const& shape,
const KisPaintInformation& info_,
double subPixelX, double subPixelY, qreal softnessFactor) const
{
- Q_ASSERT(valid());
+ KIS_SAFE_ASSERT_RECOVER_RETURN(valid());
Q_UNUSED(info_);
Q_UNUSED(softnessFactor);
QImage outputImage = d->brushPyramid->pyramid(this)->createImage(KisDabShape(
shape.scale() * d->scale, shape.ratio(),
-normalizeAngle(shape.rotation() + d->angle)),
subPixelX, subPixelY);
qint32 maskWidth = outputImage.width();
qint32 maskHeight = outputImage.height();
dst->setRect(QRect(0, 0, maskWidth, maskHeight));
dst->lazyGrowBufferWithoutInitialization();
quint8* color = 0;
if (coloringInformation) {
if (dynamic_cast(coloringInformation)) {
color = const_cast(coloringInformation->color());
}
}
const KoColorSpace *cs = dst->colorSpace();
qint32 pixelSize = cs->pixelSize();
quint8 *dabPointer = dst->data();
quint8 *rowPointer = dabPointer;
quint8 *alphaArray = new quint8[maskWidth];
bool hasColor = this->hasColor();
for (int y = 0; y < maskHeight; y++) {
const quint8* maskPointer = outputImage.constScanLine(y);
if (coloringInformation) {
for (int x = 0; x < maskWidth; x++) {
if (color) {
memcpy(dabPointer, color, pixelSize);
}
else {
memcpy(dabPointer, coloringInformation->color(), pixelSize);
coloringInformation->nextColumn();
}
dabPointer += pixelSize;
}
}
if (hasColor) {
const quint8 *src = maskPointer;
quint8 *dst = alphaArray;
for (int x = 0; x < maskWidth; x++) {
const QRgb *c = reinterpret_cast(src);
*dst = KoColorSpaceMaths::multiply(255 - qGray(*c), qAlpha(*c));
src += 4;
dst++;
}
}
else {
const quint8 *src = maskPointer;
quint8 *dst = alphaArray;
for (int x = 0; x < maskWidth; x++) {
const QRgb *c = reinterpret_cast(src);
*dst = KoColorSpaceMaths::multiply(255 - *src, qAlpha(*c));
src += 4;
dst++;
}
}
cs->applyAlphaU8Mask(rowPointer, alphaArray, maskWidth);
rowPointer += maskWidth * pixelSize;
dabPointer = rowPointer;
if (!color && coloringInformation) {
coloringInformation->nextRow();
}
}
delete[] alphaArray;
}
KisFixedPaintDeviceSP KisBrush::paintDevice(const KoColorSpace * colorSpace,
KisDabShape const& shape,
const KisPaintInformation& info,
double subPixelX, double subPixelY) const
{
Q_ASSERT(valid());
Q_UNUSED(info);
double angle = normalizeAngle(shape.rotation() + d->angle);
double scale = shape.scale() * d->scale;
QImage outputImage = d->brushPyramid->pyramid(this)->createImage(
KisDabShape(scale, shape.ratio(), -angle), subPixelX, subPixelY);
KisFixedPaintDeviceSP dab = new KisFixedPaintDevice(colorSpace);
Q_CHECK_PTR(dab);
dab->convertFromQImage(outputImage, "");
return dab;
}
void KisBrush::resetBoundary()
{
delete d->boundary;
d->boundary = 0;
}
void KisBrush::generateBoundary() const
{
KisFixedPaintDeviceSP dev;
KisDabShape inverseTransform(1.0 / scale(), 1.0, -angle());
if (brushType() == IMAGE || brushType() == PIPE_IMAGE) {
dev = paintDevice(KoColorSpaceRegistry::instance()->rgb8(),
inverseTransform, KisPaintInformation());
}
else {
const KoColorSpace* cs = KoColorSpaceRegistry::instance()->rgb8();
dev = new KisFixedPaintDevice(cs);
mask(dev, KoColor(Qt::black, cs), inverseTransform, KisPaintInformation());
}
d->boundary = new KisBoundary(dev);
d->boundary->generateBoundary();
}
const KisBoundary* KisBrush::boundary() const
{
if (!d->boundary)
generateBoundary();
return d->boundary;
}
void KisBrush::setScale(qreal _scale)
{
d->scale = _scale;
}
qreal KisBrush::scale() const
{
return d->scale;
}
void KisBrush::setAngle(qreal _rotation)
{
d->angle = _rotation;
}
qreal KisBrush::angle() const
{
return d->angle;
}
QPainterPath KisBrush::outline() const
{
return boundary()->path();
}
void KisBrush::lodLimitations(KisPaintopLodLimitations *l) const
{
if (spacing() > 0.5) {
l->limitations << KoID("huge-spacing", i18nc("PaintOp instant preview limitation", "Spacing > 0.5, consider disabling Instant Preview"));
}
}
diff --git a/libs/brush/kis_brush_factory.h b/libs/brush/kis_brush_factory.h
index ca1b329959..1201e12674 100644
--- a/libs/brush/kis_brush_factory.h
+++ b/libs/brush/kis_brush_factory.h
@@ -1,54 +1,54 @@
/*
* Copyright (c) 2008 Boudewijn Rempt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_BRUSH_FACTORY
#define KIS_BRUSH_FACTORY
#include "kis_brush.h"
class QDomElement;
/**
* A brush factory can create a new brush instance based
* on a properties object that contains a serialized representation
* of the object.
*/
class BRUSH_EXPORT KisBrushFactory
{
public:
KisBrushFactory() {}
virtual ~KisBrushFactory() {}
virtual QString id() const = 0;
virtual QString name() const {
return QString();
}
/**
- * Create a a new brush from the given data or return an existing KisBrush
+ * Create a new brush from the given data or return an existing KisBrush
* object. If this call leads to the creation of a resource, it should be
* added to the resource provider, too.
*/
virtual KisBrushSP createBrush(const QDomElement& element) = 0;
};
#endif
diff --git a/libs/brush/kis_text_brush_factory.h b/libs/brush/kis_text_brush_factory.h
index 0ee2501253..c7f8af0c83 100644
--- a/libs/brush/kis_text_brush_factory.h
+++ b/libs/brush/kis_text_brush_factory.h
@@ -1,54 +1,54 @@
/*
* Copyright (c) 2008 Boudewijn Rempt
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef KIS_TEXT_BRUSH_FACTORY
#define KIS_TEXT_BRUSH_FACTORY
#include
#include
#include "kis_brush_factory.h"
#include "kis_brush.h"
/**
* A brush factory can create a new brush instance based
* on a properties object that contains a serialized representation
* of the object.
*/
class BRUSH_EXPORT KisTextBrushFactory : public KisBrushFactory
{
public:
KisTextBrushFactory() {}
~KisTextBrushFactory() override {}
QString id() const override {
return "kis_text_brush";
}
/**
- * Create a a new brush from the given data or return an existing KisBrush
+ * Create a new brush from the given data or return an existing KisBrush
* object. If this call leads to the creation of a resource, it should be
* added to the resource provider, too.
*/
KisBrushSP createBrush(const QDomElement& brushDefinition) override;
};
#endif
diff --git a/libs/flake/svg/SvgParser.cpp b/libs/flake/svg/SvgParser.cpp
index 13fb57cf2a..01eb28ca17 100644
--- a/libs/flake/svg/SvgParser.cpp
+++ b/libs/flake/svg/SvgParser.cpp
@@ -1,1813 +1,1813 @@
/* This file is part of the KDE project
* Copyright (C) 2002-2005,2007 Rob Buis
* Copyright (C) 2002-2004 Nicolas Goutte
* Copyright (C) 2005-2006 Tim Beaulen
* Copyright (C) 2005-2009 Jan Hambrecht
* Copyright (C) 2005,2007 Thomas Zander
* Copyright (C) 2006-2007 Inge Wallin
* Copyright (C) 2007-2008,2010 Thorsten Zachmann
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "SvgParser.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "KoFilterEffectStack.h"
#include "KoFilterEffectLoadingContext.h"
#include
#include
#include
#include "SvgUtil.h"
#include "SvgShape.h"
#include "SvgGraphicContext.h"
#include "SvgFilterHelper.h"
#include "SvgGradientHelper.h"
#include "SvgClipPathHelper.h"
#include "parsers/SvgTransformParser.h"
#include "kis_pointer_utils.h"
#include
#include
#include
#include
#include "kis_dom_utils.h"
#include "kis_debug.h"
#include "kis_global.h"
#include
struct SvgParser::DeferredUseStore {
struct El {
El(const KoXmlElement* ue, const QString& key) :
m_useElement(ue), m_key(key) {
}
const KoXmlElement* m_useElement;
QString m_key;
};
DeferredUseStore(SvgParser* p) :
m_parse(p) {
}
void add(const KoXmlElement* useE, const QString& key) {
m_uses.push_back(El(useE, key));
}
bool empty() const {
return m_uses.empty();
}
void checkPendingUse(const KoXmlElement &b, QList& shapes) {
KoShape* shape = 0;
const QString id = b.attribute("id");
if (id.isEmpty())
return;
// qDebug() << "Checking id: " << id;
auto i = std::partition(m_uses.begin(), m_uses.end(),
[&](const El& e) -> bool {return e.m_key != id;});
while (i != m_uses.end()) {
const El& el = m_uses.back();
if (m_parse->m_context.hasDefinition(el.m_key)) {
// qDebug() << "Found pending use for id: " << el.m_key;
shape = m_parse->resolveUse(*(el.m_useElement), el.m_key);
if (shape) {
shapes.append(shape);
}
}
m_uses.pop_back();
}
}
~DeferredUseStore() {
while (!m_uses.empty()) {
const El& el = m_uses.back();
debugFlake << "WARNING: could not find path in