浏览代码

separating vectorial fill interface, move grad/tex points as vector icon

Unknown 6 年之前
父节点
当前提交
4390a57814

二进制
lazpaint/buttons/vector/movegradpoint32.lzp


+ 260 - 0
vectoredit/fillimages16.lrs

@@ -0,0 +1,260 @@
+LazarusResources.Add('fillimages16','PNG',[
+  #137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0#16#0#0#1#128#8#6#0#0#0#164#226#226
+  +#150#0#0#23#179'IDATx'#156#237'\'#9'\'#141#217#251#127'ni'#213'f'#172'mJ'#163
+  +#17#147'5d_b0'#155'm'#132'a'#16'!j'#198#190'dI'#141'-K'#182'&'#218'PY'#187'D'
+  +#168#9'c'#16'2'#25'L'#182'0e'#140'(e)K'#163'R'#221#238#247#127#206']r'#235'v'
+  +'['#228#255'k'#22#143#207#215#189#239'{'#206#243'='#207'{'#158#231'<'#239#185
+  +#239'yOD'#10#242#169#157#157'N'#223'V'#173'4H'#133#204''''#210'p'''#210'-'
+  +#179'pn'#179'f-CLM#'#127'05];'#220#210#178'N'#233'roMM'#131'hKK'#239#159#173
+  +#173#143'l'#214#211'kW'#162'pz'#243#230'-'#133#150#150#191#166#142#31#143'+'
+  +#253#250#137#252#140#141#3'F'#154#153#25#201#203#189'tu'#245'#'#27'7'#246#253
+  +#221#201#169#240#201#178'e'#136#183#179'K'#8#208#214#150#146#180#238#211'G'''
+  +#152#181#252#240#171#175#144#19#27#139#23#225#225#184#212#189#187'h'#11'#'
+  +#249#198#216#216'p'#137#145#145#222'>'#166'|u'#240#224#194#231#145#145'xu'
+  +#246','#158'/Y'#130#147#205#154#253#212#135#200#136't>'#253#180#214#218#198
+  +#141'}'#174#217#219#23'='#243#241'A'#214#142#29'x'#180'j'#21#226':t'#16#5#152
+  +#152#132#236'07'#15#138#239#213#171' '#131#151#133#133#225#153#191'?'#238#143
+  +#29#139'P3'#179#157'fDz'#18'+'#250#216#218#26#249#152#154#6'\n'#213'J'#148
+  +#238#230#134't'#15#15#220#155'2'#5#167'mm'#197#167'['#183#22#223'suE'#250#226
+  +#197'H'#159'3'#7'I'#3#7#138#183'3'#139'Y'#235'f%'#250'a@'#243#230'F'#27#204
+  +#204#2'.X['#139#254#252#252's'#164#140#24#129#223'?'#251'L'#130#148#225#195
+  +'qw'#232'P\'#237#209'C'#28#200#148#29#136#204#203#244#196'g'#214#214#134#155
+  +#204#205'C'#206#155#153#225#150#173'-'#146#218#182'ER'#155'6'#184#201'p'#137
+  +'a'#139#137'It7'#129#192#172'Le.cZ'#183#214#219'bi'#25'tZ_'#31#177#154#154'8'
+  +#166#171#139#163#134#134'8ab'#130's'#205#155'c'#151#185#249#158'i'#2#129'a'
+  +#153#202'#'#237#236#244#183'XX'#248#254#162#167'Wx'#137#8'1'#12';'#25#194#180
+  +#181'q'#168'Q#'#156'e'#4#191#217#217#137#14'YZ'#6#204#229#189#175'(C:u'#210
+  +#255#193#210#210#247'r'#237#218#133#201'L'#233'W'#134'c'#2#1'"'#141#140#16
+  +#217#176'!'#142#24#27'#'#214#198#6#215':u'#194'm'#230#226#31#155'4'#9'p'#151
+  +#147#232#14#27#166#190#177'I'#19#239#235#186#186#162#12#166#152#196'p'#137')'
+  +'3'#211#197#222#198#198#209#254#204#236#227'VV'#133'g'#25#193'U{{'#220#31'0'
+  +#0#15#6#12'('#138#177#180#220#216#134'H'#139'Z:8'#232#4#152#153#29'N'#171'U'
+  +#11#156#128'['#16#171#175'/^fl'#28'ig``6'#213#192#192'p'#167#133'E@'#156#173
+  +#173#136'['#144#210#191'?2'#153'G'#162'>'#250'('#174#19'Q='#137#21#19'ml'#218
+  +#237'j'#216'0'#225#142#134#6#226#245#244#196#223'3'#229'vu'#234#20#187#202'U'
+  +'G'#199'('#156']'#251#149#142#29'E'#247#250#246#197'q['#219#187#223'ji'#245
+  +'/'#209#15'S'#172#173#237'6'#155#152#156#240'06'#222#217#182'n]%?'#207#212
+  +#212'4b'#227'e'#227'>+'#171#243#140#176#127#233'r'#137'477'#175'c^'#175#158
+  +#190'*7'#127'B'#164#211'Ej'#182'@U'#29'%ii'#235#172#197'?'#251'm'#205'l`'#187
+  +#247#5#232#211'5'#205'+'#173'<a'#145#175's'#192#246']'#144#31#155#207#207#0
+  +#217'OiS)'#229#254#147'=z'#134#28':'#129#140#180't<'#188'z'#236'2?W'#127'N2'
+  +#168#131#203#199#21'*w'#28'1'#183#231#242'-'#187#19#143#158#142#199#145#232
+  +'8<{'#156#141#135#175'n'#167'6'#154#255'S'#22'5uS='#22#184't'#27#179#176#167
+  +#187#207#182'D'#255#144#8#156#187'p'#29#9'wR'#145#146#254#10'W'#210#242#160
+  +#230't'#18#221#237#29'U'#247'A'#183#177#238'='#231'2'#229'='#135'O"4'#226#4
+  +#246'G'#197#226#233#203#28'\KJG'#196#241#4'L'#216#246#19'~'#222#181#243#254
+  +#183#135#16#214#238#160#200#170#132#242#160#169#222'=g,'#247'O'#12#14#143#198
+  +#225'cq'#184#194#148#174#221'~'#136']'#7'N'#224'RB'#18#162'bOb'#239'.!.'#7
+  +#251'cQ'#196#31'0'#243#188#155'['#172#236#180'x'#139#195#218#192#189#8#11#143
+  +#130#240#200'i\'#190'q'#15')'#25#175'p'#249#250#3#236#138'<'#133#213#155'B'
+  +#17'{'#238'2'#2'|C'#225'9'#199#13'N'#171#194'`'#178#232'6'#4#223#132#185#145
+  +#189#203#218#166'K'#253#195'q'#238#252'e'#156#138#191#134'+7'#31' '#249#193
+  +'s\H'#248#3'G'#142#199'#d'#223'q'#248'l'#217#141#133'+'#253#17#17#19#139#229
+  +#179#23'c'#210#132'i/'#27'{\'#129#192')'#196#143#27#160#209'k'#248#212#128
+  +#131'G'#207#227#241#147'\'#220'g-s'#229'}'#209'g'#16#178'7'#6'[B'#14'b'#133
+  +'O0'#166'/Z'#11#215'9+'#176#218'cM'#220#231#29#190#208'7Y~'#1'z'#19'B'#252
+  +#229'W'#161#195'H\B'#14#198'>JO'#203#194#201#243'Wp'#224'H'#28'6'#5#9#177#148
+  +')'#207#243#218#136#137#211'=1x'#194#220'T'#185#130#229#146#211#208's'#14#9
+  +'R'#236'G'#29#135#17'n.?'#236#136'~'#20'{.'#17'a'#7'b'#176#209'w;f{'#172#147
+  +'(;'#186'xdw'#24'2'#214']^'#217'd^T'#142#225#164#144#224#210#158#212#233#237
+  +#232#234#178't['#204#163#208#189#135#177't'#237'6Lf'#202'C]'#220#31'w'#31'2'
+  +#133'e2*'#30'h'#198'sb`4i'#199#201#178#194'A'#183#251#176#201'.'#235'|w'#194
+  +'s'#201'j|;w'#25':'#13'tr!'#249'MD&'#13'|'#211#31#25#185#237'/T'#21'S'#181
+  +#186#14#158#232':'#193#221#15']'#6':'#187#242#227#210#21#234'y^'#154'Ww'#193
+  +#153';'#170#8#184#232#155#182#237'=F'#209'lEQ3kUO'#205#196#182'Ay'#4#255';'
+  +#25#196'0'#254'-'#193'ui'#188#165#165'%'#218#181'k'#135#190','#227#14'g7'#210
+  ,#169'S'#167'b'#209#162'EX'#183'n'#29'BCCq'#228#200#17#196#197#197#225#214#173
+  +'[x'#244#232#17#10#10#10#192'EF'#242#158#224'='#193#187'!'#24']'#141'P'#30
+  +#253'.'#198#210#191'A'#222'M>'#232#213#171#23#156#156#156#224#229#229'%q],'
+  +#251#237#144#146#146'"q'#23#255#228#199#252'</'#231#245'x}R'#140#131#247#4
+  +#239#9#170'K'#240'>'#31#188#3#169'~>@)'#17#139#197'HNNFLL'#140#228#147#31#151
+  +'%$'#143#131#210#5'r'#229'M'#155'6'#21#147'T'#154'@Q'#249#187#239#190'+'#151
+  +#164#4#129#162#217'r'#229#1#236'gni'#18#197#203')AP'#150'r'#211#166'M'#203'$'
+  +'Q"P'#165#204#202#202'%yw'#22#188#147'>'#168#182#23#170#19#7#239#243#193';'
+  +#144#234#231#3#6#232#233#233#193#198#198#6#189'{'#247#134#163#163'#'#156#157
+  +#157#225#226#226'"'#249#228#199#252'</'#231#245'x}'#25#198#23#19'XYYI*'#141
+  +#29';'#22#243#230#205#131#183#183#183'd'#158#200'?'#249'1?'#207#203'y=%'#2'C'
+  +'CC'#216#217#217'IZ'#226#149#253#252#252#176'o'#223'>DEEI>'#249'1?'#207#203
+  +'y=^'#191#4'A'#163'F'#141#208#163'G'#15#137#185#188'E'#174't'#241#226'E$%%I>'
+  +#249'1?'#207#203'y=^'#191#4#129#169#169#169#196'<~'#205#220'l'#222'2W'#230
+  +#194'?'#249'1?'#207#203'y=^'#255#221'ZP'#237'>'#168#182#23#222'I'#28#200'Ix'
+  +#11#220'L~'#173'\'#137#127#242'c~'#190#148#242#191''''#31'L>'#12#26'/,'#134
+  +'p'#231#140#18'P,+].%'#224#5#190'('#6'r'#133'%'#160'XV'#186'\JR'#227#4#252
+  +#191#202'*('#149#243#198#255#5#4'5'#239#133#154''''#168'y/T'#223#141'L*;|'
+  +#149#202'y*'#248'GJ'''#134#167#12#207#25#30'VU'#185'3'#195'#'#6#190'H'#195
+  +#151#204'jWE'#185#139'L'#185'_U['#229#210#149#225'qu'#149'?y'#27#229'n'#213
+  +'Q'#238#206#240#132#161#239#219'*'#243#150#251#188#141'r'#15#153#178#195#219
+  +'('#247'$'#169#217'UR'#230'k'#233'<('#250#202'Z'#238'U'#213'VSH'#26#150'i2'
+  +#11#222'K'#213'D'#171#188'B['#134'?I'#245#242'(_:MS'#165#172#198#240#11#131
+  +#152#228'K'#195#202#18#198#176'V'#21#1'_'#217'9'#195'p'#139#161#172#21'N'#30
+  +'h'#247'HEB1%i4'#218'0'#240#133#168#210#227'A'#155'!'#137#225'KU'#173#31'd'
+  +#240#146'}'#223#205'0'#170'T'#249#247#12#17#170#148#135#202#204#214#148#29
+  +#175'g'#152#165'P'#222'Lf'#157'iY'#202'|<'#240#213#188#238#10#231#230'3'#172
+  +#146'}'#231#222'8'#205#240#157#170#214'73'#4#150':'#231#196#16'"'#251#206#231
+  +#198#23'I'#234'!%'#225#25#151#231'x'#163'R'#231#7'0'#28'%'#169'+3'#24#218#150
+  +#165#204#175#247#6#195#240'2'#202#184'B'#130#204#138'u'#170'L_'#200'pDE'#153
+  +'1'#195'k'#146#14'y'#149'7'#17'^X'#246'k!'#210'eB'#190#166#168#210#231'\'#202
+  +#236#20#5'iZA'#249#223'\>$'#233#152'x+'#225#238'Md'#224#235#170':oC'#192#7#13
+  +#31'X;'#169#156'q'#175'JZ'#146't'#208#152#208#155'('#236'XYeu'#146#198#252'D'
+  +#133's_3\'#167'7'#163#180'\'#153#195'p'#130#148's!'#143'V'#207#138#148'y'#175
+  +'s'#211#155#148'Q&'#207'T*_'#226#224'-'#158'b'#152'YN'#3'|'#9'='#158#164#151
+  +#169'$'#147'e'#133#229#133#182'<'#169'(5R'#161'y'#10#194#199#6#159''''#150'x'
+  +#137#227'0U'#162#131#20#132#191'JP'#220#209'r'#23#169'|'''#175#12#145#187#218
+  +#153#31#252#198#208#161#10#202'r'#225#193'vD'#206#246'^'#164'b'#201'p'#155
+  +#225#10')'#223#31'*'#20'm'#153'"'#127#219'i0CdU'#9'f0lP8'#230'w'#163#1'Ui'
+  +#157'O'#22#26')'#156'k#'#179#168'R'#226'Don'#160#138#194#7'V'#167#202#16'ps'
+  +#203#202#188#21#245#5#183#216#187'<'#226#178'.MQ'#184#213'N'#21'YW'#186's'
+  +#229'R'#233'>Re'#5#191#180#193#149'!'#224#194#223'AR'#188'V'#249#164#163#210
+  +'"'#15'2'#222#209#150#178#239#170#250'E'#165'pE~)'#252#6'S'#185'w'#243#222'K'
+  +#21#228#176#192#8#194#218#134#16'6'#212#135#208#138#161#149#30#132#157'jC'
+  +#216'W'#7#194'A'#12#163#180' '#156#196'0S'#3#194#197#12#222#234#16#250#170'A'
+  +#184']'#128#195#135#9'$$C'#160'N'#3#192#170#158#24'vu'#129#190'u'#196'p4'#2
+  +'&'#27#136'1_'#31'XU'#27#8#212#5#246'i'#3'''4'#129#203#26#192#221'Z'#192'3F"'
+  +#148#19'|'#208'@'#12#171#250'@'#251#186'bF'#0#12'7'#18'3'#2'('#19'h'#201#8
+  +#212'K'#17'T'#218#2#173'2,'#16#200#8'>'#148#17'|RLPU'#11#234#191#177'`xU,('
+  +#238#131'z'#178'>'#248#0#204#2#21'}'#160'Y'#201'>x'#11#11#164#4#237'Ktb'#229
+  +#250#224'0'#201#3#201'@'#26'H-Y'#16'u'#174'('#144#212#223#4#210'{'#249';'#136
+  +#196#141'V'#204#141#237#153#27#29#152#27#191'd'#248#154#229#4'g'#230#202'o'
+  +#25#230#234'B'#232#193#220#185'B'#27#194'u'#204#157'~'#154#16#6'3w'#238'PW'
+  +#200#7#237'Y '#13'd'#195#217#153#133#243'\'#22'L+Y8of'#195'z'''#11#168'C'#172
+  +#252'$'#11#170'_'#245#128'D'#22'T):'#192'S'#22'P9'#26#10#145'X'#154'`Ei'#2'}'
+  +')'#193'M'#22#145#247#24#193#147#138#8#148','#208'/iA'#213#9#12#222'XP'#173
+  +'K'#224#22'T'#235#18#228#22#188#245'%'#252#191'x'#161'J'#129#228'SF '#253#11
+  +#165#133#22#12#186#11#176'x'#20'!v6'#225#254'J'#194#221#141#132#200'-'#132'O'
+  +'+T6o'#8'?'#27'm'#20'u'#17'@<'#130' '#158#203#224#195#16'L'#16#237'%'#252'u'
+  +#144'p'#235#0#161's'#153#202'zv'#136'md'#14'4e'#174#238#160#6#12'#'#192#157
+  +#193#159'!'#146#196#136#165'"'#252'B'#133'E'#167')?k?'#189'^\BY'#253'3'#4#233
+  +'t'#5#234'~'#4'X2'#247#219'i '#210'^'#16'>T'#131'j;k'#146#174#171#11#173#24
+  +#151'L'#185#145#247#232'9n'#208#19#4#211#185#188#237#148#229','#213#158#134
+  +#214#130'o '#214#248#28'0'#232#8#152#153'c6;;'#142#129#239#14'P\c'#14'{H'#151
+  ,#231']'#165'cp'#160#222#136#166#132#23'R'#130#149#8#16#204#3#212'&'#1#218#131
+  +#193#159'X'#180'g( '#233#211'L'#254#139'6'#148#225'/'#25#201#142'>'#212'2'
+  +#181'#5e'#150#4#138'.P'#144#27#169#5'"Y'#205#151#17#172#1'j-'#6#223#167'uTVY'
+  +'q'#146#205#207'g'#203#173#177#19#212#197#11#173#209#226'L'#205#209'''I#'#2#5
+  +#12#208#136#148#188#26#243#1#131#136'!'#143#222#252#240#226#191#230'?g'#184
+  +'&''hYK'#7'"'#211#246#226'B'#147#246#169#164's'#161#168'@'#251#162#8'Z'#215
+  +#11'xa'#27'Y'#165'D'#185's'#24'V0'#220#148#17'K'#8#172'u'#216#205#181#167'1'
+  +#208#195'$'#141#180#31'd''k=|'#1#205'''O'#161'~6'#198'A'#214'yE$}'#186#169'('
+  +#252'!~'#231'^'#13#212#215#187#183'`'#4'#'#181#197#24#161's'#142'4^'#221#14
+  +#208#200#185#1#173#215#23'P'#187#240#232#1#146'N'#239'!k'#209#189#20#9#193'M'
+  +#16#137')'#2'`'#146'@'#132#9'j3IG'#20#217'F'#175'h'#143#184'n'#209'fX'#137
+  +#221#209#3'C'#248#227#128'E2+8Q'#151'b'#229#149'4'#27#158','#178#22'0'#204
+  +#162#151#197#172#22#152#17'l'#139#17'p'#128'=&'#195'X'#228#11#205'mV'#173#200
+  +#145#21#249'0h'#228'%P'#235#162'(:'#136#237'L'#145#13#12'x'#179#176#244#162
+  +#217#197#4#29#209'A'#167#31#172#206#142#129#17'<'#161#129'0'#8#16#7#18#223')'
+  +'"q'#198'+'#18'g'#167#16#10#227#217#160'8'#196#148#183#178#184#222'HQ'#165'/'
+  +#141#198'B[g.'#212#131#215'C '#14#7#225'<C'#146#152#144#150'Ox'#246#148#240
+  +':'#145'Pt'#138')'#239'U'#253'hT"'#1#160'6'#17#160#128'xPr2'#168'0'#181#144
+  +#10'3'#159'Sr'#238#29#10#16#197'K'#30#216#151'/'#255#224'|'#160#213#246'v'
+  +#137'|`+'#240#30#167#193'r'#129#22#203#9#223#211#158#161#138#249#224'8='#206
+  +'Q'#202#7#130'FC'#161#215'&'#3#166'f'#217#243'H'#186#248#160#152#11'xx'#143
+  +'{I'#183'g'#167#211'e$'#208'E'#229'|@'#141#186'A'#173'A'#191#7#236#204#14#153
+  +#18#207#1#161'$'#205#9'<7'#240#28#209#254#21#237#140'Lg'#190'R'#202#7'd'#214
+  +'^'#177'E>'#246#21'7'#130'n'#144#157'?*'#210#152#213'=Ok'#156'r> '#139#150
+  +#138#4'|'#236#243#28' '#127#178#199's'#3#207#17#162#207#180#234#27#139'M'#237
+  +#149#243#129#192#194'Z'#145#128#143'D'#158#3'x.'#144'o'#193#225'9'#2#141#181
+  +'juDO'#19#229'|'#160'6m:'#4#157';'#240#167#183#220#207#165'7'#195#242#220#192
+  +'Gg'#238#213#1#218#253#241#181'v'#185#249#160#180#184#211#155'l'#228'^'#217
+  +'| '#151'.2E'#222#250#162'*'#229#131'XP}'#146'>c'#244#25#210#135#166#252#151
+  +#242#1#151#239'F'#228#206'_'#253#169#232#183#128#222#226#215'!'#221#138'r'
+  +#246#180#207';'#21#221#244'I'#233'4'#175',-'#150#164#15#238'2'#247#201#157#17
+  +#147'^dz'#12'~'#253'ls'#31'Q'#214#142'N'#5#153#145#31'?'#127#28'k'#252#231
+  +#157'+'#186'W'#206#220'V'#139'/;'#31#24#172#186'7'#245#131#149')I'#22'^'#169
+  +'Y]g='#206#152':'#234#213#141#245#159#20#156#13#183'{'#21#247#147#229#195#219
+  +#23#13#19#31#222#212#248#245'a'#146' '#238'j'#18#197'M('#161#172#190#230#207
+  +#30#181#214#220#189#174#177#230'n'#150#190#247#189#135'M<'#210#248'sc'#190
+  +#143#145#223#230#249#19#239#150'74/y'#253#174'v>3'#137#206'=;D'#219'o'#253'N'
+  +'g'#219#23#19#8'|'#146'~eH'#19#248'$'#167#214'Z'#251'G[R1?'#136#167#195'}'
+  +#207#211#190'L'#7#178'g}'#26'qJ'#170#189#225'7g'#218#144#240#144#214'_e'#184
+  +#193#147'I'#185#243#131#182#212#244'z;'#178#204'O#'#143#228#12#154'4'#144#232
+  +#135'S'#241#244#195#233'W'#228'{F'#190'o'#175#194#249'AK2*'#200#166#238#207
+  +'r'#168#197#207'D'#155'c'#242#24#10'i'#243'Q'#190#0'['#169#249#129#141#154'F'
+  +#225#171#218#245#242'su'#245#152'e['#142#20#144#255'a'#17#5#28#224#4#149#154
+  +#31'Xh'#8'Di'#214#234#162#140#166#130#215'D'#254#7'oR'#224#238'|'#10#14'L'''
+  +#233'.'#186'r'#231#7#2'"'#215#175'?'#162#215#231#7#145#232#215'/'#5#140'8('
+  +#212#139#182#173#205#166#176#185'Y'#180'k<_"(w~'#176'o'#26#173'9'#240'-'#229
+  +#28'r'#165#156#168')'#130#229'R7'#238'tK'#18#236#30#158'I{'#251'?'#17#132#247
+  +#226'K'#166'e'#206#15#2'='#200'n'#251#2'z'#18'6'#159'^'#236#158'Gw'#139'Y'
+  +#213#246#14#254'\-'#188'o'#146' '#188'G'#182' '#188'['#166'fx'#23'~'#231#225
+  +#175#140'H'#230#7#188#206'r'#31'rY'#183#130#238#249'y'#209'3F'#148#180'}!}Q'
+  +#194#180'Z'#194#238'3'#212#133#221#238'h'#238#235#146'i$'#236#240#232#195'='
+  +#205#147'z'#134#214#191#228#184'U'#243#226#20#127#193'u'#247'Mto'#249'ZJ]'
+  +#187#146'nnXF'#211'J_'#154'D'#180#247'w'#25'lt'#192#254#166'ED'#235#244'v{'
+  +#154'<'#235#23'j'#248#194'1X#{B '#189#152#229'G'#25'^'#27'('#193'{m%^f'#233
+  +#28#253#225#212'~'#194#250#241#131'Bur'#135'oU/'#24#23'DW'#166#5#210#244#10
+  +#21#229#242#15#205#7#234'3'#163#147'J'#229#3#190#138#195's'#1#31#218'f'#138
+  +#249#128'!A)'#31'P'#139#222'y'#2#143's'#233#181#22#159#227#235#138'e'#206#15
+  +#146#233'l'#175';t'#242#201#29#138'y'#160#156#15',Z'#229#147#249#199'|'#149
+  +#187#220#249'A'#10#237#246'z@'#190#233#202#249#192#204#186#128'*1?'#224#7#207
+  +#5#195'R'#149#243#129'q'#227'B'#170#196#252#128#225#131#236#218#22'i'#202#249
+  +#160'~CE'#2#149#243#3#134'6'#15#154'i>R'#206#7#253'>yE'#210#151'7'#202#157#31
+  +#232'k'#146#193#217#161#244#188#188'|PZJ'#204#15'*'#155#15#228'Rb~P'#213'|'
+  +#192'E2?`'#232#247'_'#203#7#255'uY'#189'|4'#150','#252#170#24'4`'#201#27#12
+  +'\]'#241's#'#174#164#242#181'RN'#242#247''''#144'TR'#241#166#172#164'O'#254#1
+  ,#4#220'U'#10#174'St)wq'#197#4#239#229'?)'#229#142#255'R'#129'Tf~(w'#244'U'
+  +#244#218'9'''#169'y'#130#242'F_E'#132#210#209'Y'#243#4#229#140#255#138#220
+  +#250'>?'#168#146'j'''#213#154#191'/T'#151#160#230#239#206'5OP'#243'^'#168'y'
+  +#130#154#247'B'#181#9#170'>'#213'}'#191#191#241'o'#176'-'#173#230#9'j'#222#11
+  +'5OP'#243'^'#248#219#239'ol'#200#16#192#208#184#194'LT'#134#240#23#255#249
+  +#158#29#254#28'-'#133'J'#189'f^'#25#225'o'#131#242#247#248#249'#0'#190'{'#230
+  +#15#170#202#159'~'#148'Y@2'#2'-'#133#227#242'E)'#169'6'#180#1#245#247#168#240
+  +#249#1#223'%'#20#203#191#188'MZ'#231'='#156#194'0'#182#146#4#2'Yc'#197#239
+  +#249#159'c'#200'g'#224'O'#247#159'7'#183'1'#173#140#5'#I'#186'yHB'#194#159'L'
+  +#241#245'S'#254'G'#246#12#169#255'b'#149#145#216#181's3N'#240'\'#6#254#252
+  +#241#182#220#138#174'2F'#195#242#238#206#11#230#14#230#4#22#12#195#24#248'j'
+  +#223#231#138'}!'#221#224'Q'#241#237#157#247#193#159#165#149#223#136#226'T'
+  +#183'I'#23'x,'#24'Z'#214'T'#183'R'#187'I'#184#200#131#168#202#18'G'#210#189
+  +#142#156#128#239'4'#253#141#170#24#198'\'#153#239#182#228#207'R'#249#222#14
+  +#21#215'[1'#201#163#183'U'#254#31'J|'#128#186#231#133'@5'#148#6'?_)'#130'sAu'
+  +'P'#248'z'#19#139#152#224'b'#240#227'+'#7'mq'#234#7#237#18'8'#233#171#163'Lz'
+  +#220#175#17#178#254#152#132#204'd'#167#18'x'#250#251'8<'#185#245'M12'#174#13
+  +#199#241#141'z'#202#195'y'#191'w}i'#171'9K'#145#255'r1r'#159#206#193#179#187
+  +'Nxrs'#24#146#206#244#195#181#163'=q,'#232'c'#8'W6T'#194#222#21#141#6#209#142
+  +#165#166#18#11'R'#206#180'G'#242'O'#173#16#185#209#10#161#223#155'c'#207'jk'
+  +#28#11#235#134'S'#225'}'#145#149#177#172#196'%r\'#137#253#134#215#139#164#128
+  +#197'V'#200#205#242'B'#250#229'n'#136#14'l'#137'S'#7#6'I*'#136#197'A'#12#1'R'
+  +#20'ma'#216#252#6#226'@'#156#140#24#12#255'E'#31'N'#167#13#243'lp'#255'|o'
+  +#220#138#178#196#186'y'#205#241':'#247#7#136'^'#175#129'(o'#149'Jpr'#191'%m'
+  +#176'a'#190#141#5#173#152#217#10#15'/'#127#129#147'a-'#176'o'#219#16#136'E~('
+  +#200'^'#168#18#133#185'+'#144#145#230#141#229'3ZK'#247'/,r'#235#128#223#163
+  +#172#177'uYs'#252#22'?'#7#5#175#188#144#151#249#157'J'#20#230'y#z'#255#4',t'
+  +#235' ]'#147#157'5'#185#171#132'`'#254#212#206#200#205#241'C'#238#227#201#200
+  +#201#24#167#18'E'#204#194#181'K'#7#130#233#181#150#16#184#142#239#133#195#190
+  +#214#240#223'4'#6#162#252'u'#248#235#254'P'#149#200'}<'#17'O'#159'l'#196#20
+  +''''#135'{'#197'q0yl'#31#248'.'#252#24#7'#f*'#185#170','#4#249#187'`'#220#168
+  +#254'o'#150#148'G8~'#233#233'2'#206#1#142#195#6'V'#10#195#29#7'F~='#226#203
+  +#178#255#210#245'[I'#244#213#136'Y.{'#199#231'u'#222'd'#3#135#205'6'#232#19
+  +'l'#133'A!6p'#220'a'#131#209#187#164#24#17'f'#131'A[m'#240'i'#128#13'z'#250
+  +#218#192'~'#157#13#166#237#155#154#183#231'B'#216'l'#26#181'}T'#222#129#132#3
+  +#216'}q7'#130#207#7'c['#204'6'#4#199#6'c'#247#133#221'*!'#188'('#196#161'+'
+  +#135'02hT'#30'Y,4'#193#250'S'#235#177#234#216'*'#236#138#222#133'Gw'#30'!'
+  +#234#151'('#172#255'y='#252'N'#249'a'#243#169#205'e"'#248'L0:'#175#232#12'j0'
+  +#187#14'f'#31#152#141#192#131#129'(x\'#128#162#151'E'#8'9'#31#130#5#7#23'H'
+  +#224'y'#196#19'^G'#188'J`'#197#143'+'#176#225#196#6't]'#214#21'T'#219'E'#27
+  +'A'#7#131#144#255'<'#31#143#211#31#195#127#159'?\'#215#185'b^'#224'<,'#221
+  +#186#20#158'A'#158'p'#219#225#134'Y'#194'Y'#197#152#31'1_B'#220#217#139'Y'
+  +#208'wio'#22#190#5#200#201#204'Ajj*'#238#254'y'#23#217#169#217#236'V'#198#220
+  +'.'#146#254'A'#173#13#199'7`L'#232#24'8ow'#198#196#176#137#152#184's"f'#132
+  +#207'@'#175#165#189'@-'#23#180#192#141#212#235#248#235#241'_'#18#156'O<'#143
+  +#152#196#24'$'#220'O'#192#173#151#183'p3'#243'&\'#142#184'`h'#200'P'#140#12
+  +#28#137'!'#1'C0z'#235'h'#184#133#187#161#135'Ww'#144#197'TS'#12#11'r'#196#185
+  +#27#231#128'W'#192#143'g~'#132#237'F[8'#236'u'#192#128'}'#3'0 b'#128#228's'
+  +#211#169'M'#200#184#157#129#137#155''''#194#138#229#144#6's'#26#128#134#18'H'
+  +'o'#140#22#216#204#0#245'f'#213'CbJ'#162#196#228#253'W'#247#131#252#9#6#219
+  +#13'@'#219'Y%?'#194#172#11#179#164#215#195#174#206'f&'#155'7'#141'$)A'#195#9
+  +'Fl'#198#201#190#204'$'#152#173'6'#131#240#186#16#237#15#180#7#5#17't'#183
+  +#232#194#208#223#16#180#150#149'/%,='#187#20#226#2'1'#18'/&'#194#193#179'/'
+  +#200#145#157'7'#159'T'#23'j'#223#10'@'#238#236'`9'#195'F'#146#180#218#237'X7'
+  +#224'%k1'#135'!'#11'H'#248'#'#1#151'n]'#194#203#167'/'#145#157#149'-'#177#196
+  +'~Fk6'#5#152'\'#15#181#166#171#131#22'1'#197'5'#12#1#12'{'#8'_\'#252#162#196
+  +#159'6{'#206#254#165'e'#166'!+-'#139'e'#165'B'#201#185'^'#139';'#128#154'Oi'
+  +#0#245'ij%'#9#246'2'#252#200'p'#150#225#28'C$'#195'j'#194#240#160#225#200#201
+  +#202'ANn'#14#236'}:'#194'`'#2';o'#235#214#0'j'#174#236#18#22#144#244'ZY'#231
+  +#209#14#134#8#134#163'2"F'#232#17#179#26#200'g'#205#22#1#29#253';'#130#190'%'
+  +#152'Nb'#157#220'ga'#139#252'z'#211#245#160'='#191#22#180'W1'#248'1lc'#216
+  +#201' d'#216#195#16#162#134#153#167#230#3#175#129#222'!'#157'%'#214'j'#204
+  +#212'D'#203#239#140#243'i'#168'g'#23#239'>'#243#26#231'w'#153']'#23']'#230'2'
+  +#184'3'#204#175#139'N'#236#216'~:'#131'k]4'#155'b '#197#28#134#25'R'#180#153
+  ,'e'#156#223'f'#178#201#138#255#3'-s'#246'K'#6'1'#168#255#0#0#0#0'IEND'#174'B'
+  +'`'#130
+]);

二进制
vectoredit/fillimages16.png


+ 41 - 1
vectoredit/lctoolbars.pas

@@ -11,17 +11,19 @@ function CreateToolBar(AImages: TImageList; AOwner: TComponent = nil): TToolbar;
 function GetToolbarSize(AToolbar: TToolbar; APadding: integer = 1): TSize;
 procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList);
 procedure EnableDisableToolButtons(AButtons: array of TToolButton; AEnabled: boolean);
+procedure ShowAppendToolButtons(AButtons: array of TControl);
 function AddToolbarCheckButton(AToolbar: TToolbar; ACaption: string; AImageIndex: integer;
           AOnClick: TNotifyEvent; ADown: boolean; AGrouped: boolean = true; ATag: PtrInt = 0): TToolButton;
 function AddToolbarButton(AToolbar: TToolbar; ACaption: string; AImageIndex: integer;
           AOnClick: TNotifyEvent; ATag: PtrInt = 0): TToolButton;
+procedure AddToolbarControl(AToolbar: TToolbar; AControl: TControl);
 function GetResourceStream(AFilename: string): TLazarusResourceStream;
 function GetResourceString(AFilename: string): string;
 procedure LoadToolbarImage(AImages: TImageList; AIndex: integer; AFilename: string);
 
 implementation
 
-uses BGRALazPaint, BGRABitmap, BGRABitmapTypes;
+uses BGRALazPaint, BGRABitmap, BGRABitmapTypes, math;
 
 function CreateToolBar(AImages: TImageList; AOwner: TComponent): TToolbar;
 begin
@@ -31,6 +33,7 @@ begin
   result.ShowHint:= true;
   result.ShowCaptions:= false;
   result.Images := AImages;
+  result.ParentColor := false;
 end;
 
 function GetToolbarSize(AToolbar: TToolbar; APadding: integer = 1): TSize;
@@ -40,6 +43,7 @@ var
 begin
   result := Size(APadding,APadding);
   for i := 0 to AToolbar.ControlCount-1 do
+  if AToolbar.Controls[i].Visible then
   begin
     r := AToolbar.Controls[i].BoundsRect;
     if r.Right > result.cx then result.cx := r.Right;
@@ -114,6 +118,7 @@ begin
   btn.Down:= ADown;
   btn.Grouped := AGrouped;
   btn.OnClick:= AOnClick;
+  btn.Left:= AToolbar.ButtonCount*AToolbar.ButtonWidth;
   btn.Parent := AToolbar;
   btn.Tag:= ATag;
   result := btn;
@@ -130,11 +135,18 @@ begin
   btn.Hint := ACaption;
   btn.ImageIndex := AImageIndex;
   btn.OnClick:= AOnClick;
+  btn.Left:= AToolbar.ControlCount*AToolbar.ButtonWidth;
   btn.Parent := AToolbar;
   btn.Tag:= ATag;
   result := btn;
 end;
 
+procedure AddToolbarControl(AToolbar: TToolbar; AControl: TControl);
+begin
+  AControl.Left := AToolbar.ControlCount*AToolbar.ButtonWidth;
+  AToolbar.InsertControl(AControl);
+end;
+
 procedure EnableDisableToolButtons(AButtons: array of TToolButton; AEnabled: boolean);
 var
   i: Integer;
@@ -143,5 +155,33 @@ begin
     AButtons[i].Enabled:= AEnabled;
 end;
 
+procedure ShowAppendToolButtons(AButtons: array of TControl);
+var btnCount,x,y, i: integer;
+  toolbar: TToolBar;
+begin
+  if length(AButtons) = 0 then exit;
+  toolbar := AButtons[0].Parent as TToolBar;
+  x := 0;
+  y := 0;
+  btnCount := 0;
+  for i := 0 to toolbar.ControlCount-1 do
+    if toolbar.Controls[i].Visible then
+    begin
+      x := max(toolbar.Controls[i].Left+toolbar.Controls[i].Width,x);
+      y := max(toolbar.Controls[i].Top+toolbar.Controls[i].Height,y);
+      inc(btnCount);
+    end;
+
+  toolbar.BeginUpdate;
+  x:= max(btnCount * toolbar.ButtonWidth,x);
+  for i := 0 to high(AButtons) do
+  begin
+    AButtons[i].Left := x;
+    AButtons[i].Visible:= true;
+    x += toolbar.ButtonWidth;
+  end;
+  toolbar.EndUpdate;
+end;
+
 end.
 

+ 827 - 0
vectoredit/lcvectorialfillinterface.pas

@@ -0,0 +1,827 @@
+unit LCVectorialFillInterface;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, Types,
+  Controls, StdCtrls, ComCtrls, Menus, Dialogs, ExtDlgs, ExtCtrls,
+  BGRAImageList, BCTrackbarUpdown,
+  BGRABitmap, BGRABitmapTypes, LCVectorialFill,
+  BGRAGradientScanner, Graphics, BGRAGraphics;
+
+const
+  ImageListWidth = 16;
+  ImageListHeight = 16;
+
+const
+  GradTypeToStr : array[TGradientType] of string = ('Linear','Reflected','Diamond','Radial');
+  GradRepetitionToStr : array[TBGRAGradientRepetition] of string = ('Pad', 'Repeat', 'Reflect', 'Sine');
+  ColorInterpToStr : array[TBGRAColorInterpolation] of string = ('sRGB', 'RGB', 'HSL CW', 'HSL CCW', 'Corr. HSL CW', 'Corr. HSL CCW');
+  TextureRepetitionToStr: array[TTextureRepetition] of string = ('No repetition', 'Repeat X', 'Repeat Y', 'Repeat both');
+
+type
+
+  { TVectorialFillInterface }
+
+  TVectorialFillInterface = class(TComponent)
+  protected
+    FFillType: TVectorialFillType;
+    FSolidColor: TBGRAPixel;
+
+    FGradStartColor, FGradEndColor: TBGRAPixel;
+    FGradType: TGradientType;
+    FGradRepetition: TBGRAGradientRepetition;
+    FGradInterp: TBGRAColorInterpolation;
+
+    FTexRepetition: TTextureRepetition;
+    FTexture: TBGRABitmap;
+    FTexOpacity: byte;
+
+    //interface
+    FContainer: TWinControl;
+
+    FButtonFillNone, FButtonFillSolid,
+    FButtonFillGradient, FButtonFillTexture: TToolButton;
+    FOnFillChange, FOnFillTypeChange: TNotifyEvent;
+
+    FSolidColorInterfaceCreated: boolean;
+    FShapeSolidColor: TShape;
+    FUpDownSolidAlpha: TBCTrackbarUpdown;
+    FSolidColorChange: TNotifyEvent;
+
+    FTextureInterfaceCreated: boolean;
+    FCanAdjustToShape: boolean;
+    FButtonAdjustToTexture, FButtonTexRepeat, FButtonLoadTexture: TToolButton;
+    FUpDownTexAlpha: TBCTrackbarUpdown;
+    FTexturePreview: TImage;
+    FOnAdjustToShape, FOnTextureChange: TNotifyEvent;
+
+    FGradientInterfaceCreated: boolean;
+    FShapeStartColor, FShapeEndColor: TShape;
+    FUpDownStartAlpha, FUpDownEndAlpha: TBCTrackbarUpdown;
+    FButtonSwapColor, FButtonGradRepetition, FButtonGradInterp: TToolButton;
+    FGradTypeMenu, FGradRepetitionMenu, FGradInterpMenu: TPopupMenu;
+
+    FColorDlg: TColorDialog;
+    FOpenPictureDlg: TOpenPictureDialog;
+    FTexRepetitionMenu: TPopupMenu;
+
+    FToolbar: TToolBar;
+    FImageList: TBGRAImageList;
+
+    procedure AdjustToShapeClick(Sender: TObject);
+    procedure ButtonFillChange(Sender: TObject);
+    procedure ButtonFillGradClick(Sender: TObject);
+    procedure ButtonFillTexClick(Sender: TObject);
+    procedure ButtonGradInterpClick(Sender: TObject);
+    procedure ButtonGradRepetitionClick(Sender: TObject);
+    procedure ButtonLoadTextureClick(Sender: TObject);
+    procedure ButtonSwapColorClick(Sender: TObject);
+    procedure ButtonTexRepeatClick(Sender: TObject);
+    procedure LoadImageList;
+    procedure Changed;
+    procedure OnClickBackGradType(ASender: TObject);
+    procedure OnClickBackTexRepeat(ASender: TObject);
+    procedure OnClickGradInterp(ASender: TObject);
+    procedure OnClickGradRepeat(ASender: TObject);
+    function GetPreferredSize: TSize;
+    procedure SetCanAdjustToShape(AValue: boolean);
+    procedure SetContainer(AValue: TWinControl);
+    procedure SetFillType(AValue: TVectorialFillType);
+    procedure SetSolidColor(AValue: TBGRAPixel);
+    procedure SetGradientType(AValue: TGradientType);
+    procedure SetGradEndColor(AValue: TBGRAPixel);
+    procedure SetGradStartColor(AValue: TBGRAPixel);
+    procedure SetGradRepetition(AValue: TBGRAGradientRepetition);
+    procedure SetGradInterpolation(AValue: TBGRAColorInterpolation);
+    procedure SetTexture(AValue: TBGRABitmap);
+    procedure SetTextureRepetition(AValue: TTextureRepetition);
+    procedure SetTextureOpacity(AValue: byte);
+    procedure ShapeEndColorMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure ShapeSolidColorMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure ShapeStartColorMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
+    procedure UpdateAccordingToFillType;
+    procedure UpdateShapeSolidColor;
+    procedure UpdateTextureParams;
+    procedure UpdateTextureThumbnail;
+    procedure UpdateGradientParams;
+    procedure UpDownEndAlphaChange(Sender: TObject; AByUser: boolean);
+    procedure UpDownSolidAlphaChange(Sender: TObject; AByUser: boolean);
+    procedure UpDownStartAlphaChange(Sender: TObject; AByUser: boolean);
+    procedure UpDownTexAlphaChange(Sender: TObject; AByUser: boolean);
+    function ChooseColor(AColor: TColor): TColor;
+    procedure CreateSolidColorInterface;
+    procedure CreateGradientInterface;
+    procedure CreateTextureInterface;
+    procedure HideSolidColorInterface;
+    procedure HideGradientInterface;
+    procedure HideTextureInterface;
+  public
+    constructor Create(AOwner: TComponent); override;
+    destructor Destroy; override;
+    procedure LoadTexture;
+    procedure AdjustControlSize;
+    function GetTextureThumbnail(AWidth, AHeight: integer; ABackColor: TColor): TBitmap;
+    property FillType: TVectorialFillType read FFillType write SetFillType;
+    property SolidColor: TBGRAPixel read FSolidColor write SetSolidColor;
+    property GradientType: TGradientType read FGradType write SetGradientType;
+    property GradStartColor: TBGRAPixel read FGradStartColor write SetGradStartColor;
+    property GradEndColor: TBGRAPixel read FGradEndColor write SetGradEndColor;
+    property GradRepetition: TBGRAGradientRepetition read FGradRepetition write SetGradRepetition;
+    property GradInterpolation: TBGRAColorInterpolation read FGradInterp write SetGradInterpolation;
+    property Texture: TBGRABitmap read FTexture write SetTexture;
+    property TextureRepetition: TTextureRepetition read FTexRepetition write SetTextureRepetition;
+    property TextureOpacity: byte read FTexOpacity write SetTextureOpacity;
+    property OnFillChange: TNotifyEvent read FOnFillChange write FOnFillChange;
+    property OnTextureChange: TNotifyEvent read FOnTextureChange write FOnTextureChange;
+    property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
+    property CanAdjustToShape: boolean read FCanAdjustToShape write SetCanAdjustToShape;
+    property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
+    property Container: TWinControl read FContainer write SetContainer;
+    property PreferredSize: TSize read GetPreferredSize;
+  end;
+
+implementation
+
+uses LCToolbars, Toolwin, BGRAThumbnail, LResources;
+
+{ TVectorialFillInterface }
+
+procedure TVectorialFillInterface.LoadImageList;
+var
+  allImages: TBGRABitmap;
+  oneImage: TBGRABitmap;
+  r: TRect;
+  i: Integer;
+  res: TLazarusResourceStream;
+begin
+  if FImageList = nil then FImageList := TBGRAImageList.Create(self);
+  FImageList.Clear;
+  FImageList.Width := ImageListWidth;
+  FImageList.Height := ImageListHeight;
+
+  allImages := nil;
+  oneImage := nil;
+  try
+    res := TLazarusResourceStream.Create('fillimages16','PNG');
+    allImages := TBGRABitmap.Create(res);
+    res.Free;
+    oneImage := TBGRABitmap.Create(ImageListWidth,ImageListHeight);
+    r := rect(0,0,ImageListWidth,ImageListHeight);
+    for i := 0 to (allImages.Height div ImageListHeight) -1 do
+    begin
+      oneImage.PutImagePart(0,0, allImages, r, dmSet);
+      FImageList.Add(oneImage.Bitmap,nil);
+      OffsetRect(r, 0, ImageListHeight);
+    end;
+  except
+    //ignore
+  end;
+  oneImage.Free;
+  allImages.Free;
+end;
+
+procedure TVectorialFillInterface.Changed;
+begin
+  if Assigned(FOnFillChange) then
+    FOnFillChange(self);
+end;
+
+procedure TVectorialFillInterface.OnClickBackGradType(ASender: TObject);
+begin
+  GradientType:= TGradientType((ASender as TMenuItem).Tag);
+  FillType := vftGradient;
+end;
+
+procedure TVectorialFillInterface.OnClickBackTexRepeat(ASender: TObject);
+begin
+  TextureRepetition := TTextureRepetition((ASender as TMenuItem).Tag);
+end;
+
+procedure TVectorialFillInterface.OnClickGradInterp(ASender: TObject);
+begin
+  GradInterpolation:= TBGRAColorInterpolation((ASender as TMenuItem).Tag);
+end;
+
+procedure TVectorialFillInterface.OnClickGradRepeat(ASender: TObject);
+begin
+  GradRepetition:= TBGRAGradientRepetition((ASender as TMenuItem).Tag);
+end;
+
+procedure TVectorialFillInterface.SetTexture(AValue: TBGRABitmap);
+begin
+  if FTexture=AValue then Exit;
+
+  if Assigned(FTexture) then
+  begin
+    FTexture.FreeReference;
+    FTexture := nil;
+  end;
+  if Assigned(AValue) then
+    FTexture := AValue.NewReference as TBGRABitmap;
+
+  UpdateTextureThumbnail;
+  if Assigned(FOnTextureChange) then FOnTextureChange(self);
+  if FFillType = vftTexture then Changed;
+end;
+
+procedure TVectorialFillInterface.LoadTexture;
+var
+  newTex: TBGRABitmap;
+begin
+  if FOpenPictureDlg.Execute then
+  begin
+    try
+      newTex := TBGRABitmap.Create(FOpenPictureDlg.FileName, true);
+      Texture := newTex;
+      newTex.FreeReference;
+      FillType:= vftTexture;
+    except
+      on ex: exception do
+        ShowMessage(ex.Message);
+    end;
+  end;
+end;
+
+procedure TVectorialFillInterface.AdjustControlSize;
+begin
+  with PreferredSize do
+  begin
+    if Assigned(Container) then
+    begin
+      Container.Width := cx;
+      Container.Height := cy;
+    end;
+    FToolbar.Height := cy;
+  end;
+end;
+
+procedure TVectorialFillInterface.SetFillType(AValue: TVectorialFillType);
+begin
+  if FFillType=AValue then Exit;
+  FFillType:=AValue;
+  UpdateAccordingToFillType;
+  if Assigned(FOnFillTypeChange) then FOnFillTypeChange(self);
+  Changed;
+end;
+
+procedure TVectorialFillInterface.ShapeSolidColorMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var
+  newColor: TColor;
+begin
+  newColor := ChooseColor(FShapeSolidColor.Brush.Color);
+  if newColor <> clNone then
+  begin
+    if SolidColor.alpha <> 0 then
+      SolidColor := ColorToBGRA(newColor, SolidColor.alpha)
+    else
+      SolidColor := newColor;
+  end;
+end;
+
+procedure TVectorialFillInterface.ShapeStartColorMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var
+  newColor: TColor;
+begin
+  newColor := ChooseColor(FShapeStartColor.Brush.Color);
+  if newColor <> clNone then
+  begin
+    if GradStartColor.alpha <> 0 then
+      GradStartColor := ColorToBGRA(newColor, GradStartColor.alpha)
+    else
+      GradStartColor := newColor;
+  end;
+end;
+
+procedure TVectorialFillInterface.UpdateAccordingToFillType;
+begin
+  FButtonFillNone.Down := FillType = vftNone;
+  FButtonFillSolid.Down := FillType = vftSolid;
+  FButtonFillGradient.Down := FillType = vftGradient;
+  FButtonFillTexture.Down := FillType = vftTexture;
+
+  if FillType <> vftSolid then HideSolidColorInterface;
+  if FillType <> vftGradient then HideGradientInterface;
+  if FillType <> vftTexture then HideTextureInterface;
+
+  case FillType of
+    vftSolid: begin
+      CreateSolidColorInterface;
+      UpdateShapeSolidColor;
+      ShowAppendToolButtons([FShapeSolidColor,FUpDownSolidAlpha]);
+    end;
+    vftGradient: begin
+      CreateGradientInterface;
+      UpdateGradientParams;
+      ShowAppendToolButtons([FShapeStartColor,FUpDownStartAlpha,FButtonSwapColor,
+                           FShapeEndColor,FUpDownEndAlpha,FButtonGradRepetition,FButtonGradInterp]);
+    end;
+    vftTexture: begin
+      CreateTextureInterface;
+      UpdateTextureParams;
+      ShowAppendToolButtons([FButtonAdjustToTexture,FButtonTexRepeat,FUpDownTexAlpha,
+                           FButtonLoadTexture,FTexturePreview]);
+    end;
+  end;
+
+  AdjustControlSize;
+end;
+
+procedure TVectorialFillInterface.UpdateShapeSolidColor;
+var
+  c: TBGRAPixel;
+begin
+  c := SolidColor;
+  c.alpha := 255;
+  if Assigned(FShapeSolidColor) then FShapeSolidColor.Brush.Color := c;
+  if Assigned(FUpDownSolidAlpha) then FUpDownSolidAlpha.Value := SolidColor.alpha;
+end;
+
+procedure TVectorialFillInterface.UpdateTextureParams;
+begin
+  if Assigned(FButtonTexRepeat) then FButtonTexRepeat.ImageIndex := 17 + ord(TextureRepetition);
+  if Assigned(FUpDownTexAlpha) then FUpDownTexAlpha.Value := TextureOpacity;
+end;
+
+procedure TVectorialFillInterface.UpdateTextureThumbnail;
+var
+  bmpThumb: TBitmap;
+begin
+  if not Assigned(FTexturePreview) then exit;
+  if Assigned(Texture) then
+  begin
+    bmpThumb := GetTextureThumbnail(FTexturePreview.Width,FTexturePreview.Height,clBtnFace);
+    FTexturePreview.Picture.Assign(bmpThumb);
+    bmpThumb.Free;
+  end else
+  begin
+    FTexturePreview.Picture.Clear;
+  end;
+end;
+
+procedure TVectorialFillInterface.UpdateGradientParams;
+var
+  c: TBGRAPixel;
+begin
+  c := GradStartColor;
+  c.alpha := 255;
+  if Assigned(FShapeStartColor) then FShapeStartColor.Brush.Color := c;
+  if Assigned(FUpDownStartAlpha) then FUpDownStartAlpha.Value := GradStartColor.alpha;
+  c := GradEndColor;
+  c.alpha := 255;
+  if Assigned(FShapeEndColor) then FShapeEndColor.Brush.Color := c;
+  if Assigned(FUpDownEndAlpha) then FUpDownEndAlpha.Value := GradEndColor.alpha;
+end;
+
+procedure TVectorialFillInterface.UpDownEndAlphaChange(Sender: TObject;
+  AByUser: boolean);
+begin
+  if AByUser then
+    GradEndColor:= ColorToBGRA(FShapeEndColor.Brush.Color, FUpDownEndAlpha.Value);
+end;
+
+procedure TVectorialFillInterface.UpDownSolidAlphaChange(Sender: TObject;
+  AByUser: boolean);
+begin
+  if AByUser then
+    SolidColor:= ColorToBGRA(FShapeSolidColor.Brush.Color, FUpDownSolidAlpha.Value);
+end;
+
+procedure TVectorialFillInterface.UpDownStartAlphaChange(Sender: TObject;
+  AByUser: boolean);
+begin
+  if AByUser then
+    GradStartColor:= ColorToBGRA(FShapeStartColor.Brush.Color, FUpDownStartAlpha.Value);
+end;
+
+procedure TVectorialFillInterface.UpDownTexAlphaChange(Sender: TObject;
+  AByUser: boolean);
+begin
+  if AByUser then
+  begin
+    FTexOpacity:= FUpDownTexAlpha.Value;
+    if FillType = vftTexture then Changed;
+  end;
+end;
+
+function TVectorialFillInterface.ChooseColor(AColor: TColor): TColor;
+begin
+  FColorDlg.Color := AColor;
+  if FColorDlg.Execute then
+    result := FColorDlg.Color
+  else
+    result := clNone;
+end;
+
+procedure TVectorialFillInterface.CreateSolidColorInterface;
+begin
+  if FSolidColorInterfaceCreated then exit;
+  FSolidColorInterfaceCreated := true;
+
+  //solid color interface
+  FShapeSolidColor := TShape.Create(FToolbar);
+  FShapeSolidColor.Width := FToolbar.ButtonWidth;
+  FShapeSolidColor.Height := FToolbar.ButtonHeight;
+  FShapeSolidColor.OnMouseUp:= @ShapeSolidColorMouseUp;
+  AddToolbarControl(FToolbar, FShapeSolidColor);
+  FUpDownSolidAlpha := TBCTrackbarUpdown.Create(FToolbar);
+  FUpDownSolidAlpha.Width := FToolbar.ButtonWidth*2;
+  FUpDownSolidAlpha.Height := FToolbar.ButtonHeight;
+  FUpDownSolidAlpha.MinValue := 0;
+  FUpDownSolidAlpha.MaxValue := 255;
+  FUpDownSolidAlpha.OnChange:=@UpDownSolidAlphaChange;
+  AddToolbarControl(FToolbar, FUpDownSolidAlpha);
+end;
+
+procedure TVectorialFillInterface.CreateGradientInterface;
+var
+  gr: TBGRAGradientRepetition;
+  ci: TBGRAColorInterpolation;
+  item: TMenuItem;
+begin
+  if FGradientInterfaceCreated then exit;
+  FGradientInterfaceCreated := true;
+
+  FShapeStartColor := TShape.Create(FToolbar);
+  FShapeStartColor.Width := FToolbar.ButtonWidth;
+  FShapeStartColor.Height := FToolbar.ButtonHeight;
+  FShapeStartColor.OnMouseUp:=@ShapeStartColorMouseUp;
+  AddToolbarControl(FToolbar, FShapeStartColor);
+  FUpDownStartAlpha := TBCTrackbarUpdown.Create(FToolbar);
+  FUpDownStartAlpha.Width := FToolbar.ButtonWidth*2;
+  FUpDownStartAlpha.Height := FToolbar.ButtonHeight;
+  FUpDownStartAlpha.MinValue := 0;
+  FUpDownStartAlpha.MaxValue := 255;
+  FUpDownStartAlpha.OnChange:=@UpDownStartAlphaChange;
+  AddToolbarControl(FToolbar, FUpDownStartAlpha);
+  FButtonSwapColor := AddToolbarButton(FToolbar, 'Swap colors', 23, @ButtonSwapColorClick);
+  FShapeEndColor := TShape.Create(FToolbar);
+  FShapeEndColor.Width := FToolbar.ButtonWidth;
+  FShapeEndColor.Height := FToolbar.ButtonHeight;
+  FShapeEndColor.OnMouseUp:=@ShapeEndColorMouseUp;
+  AddToolbarControl(FToolbar, FShapeEndColor);
+  FUpDownEndAlpha := TBCTrackbarUpdown.Create(FToolbar);
+  FUpDownEndAlpha.Width := FToolbar.ButtonWidth*2;
+  FUpDownEndAlpha.Height := FToolbar.ButtonHeight;
+  FUpDownEndAlpha.MinValue := 0;
+  FUpDownEndAlpha.MaxValue := 255;
+  FUpDownEndAlpha.OnChange:=@UpDownEndAlphaChange;
+  AddToolbarControl(FToolbar, FUpDownEndAlpha);
+  FButtonGradRepetition := AddToolbarButton(FToolbar, 'Gradient repetition...', 7+ord(FGradRepetition), @ButtonGradRepetitionClick);
+  FButtonGradInterp := AddToolbarButton(FToolbar, 'Color interpolation...', 11+ord(FGradInterp), @ButtonGradInterpClick);
+
+  FGradRepetitionMenu := TPopupMenu.Create(self);
+  FGradRepetitionMenu.Images := FImageList;
+  for gr := low(TBGRAGradientRepetition) to high(TBGRAGradientRepetition) do
+  begin
+    item := TMenuItem.Create(FGradRepetitionMenu);  item.Caption := GradRepetitionToStr[gr];
+    item.OnClick:=@OnClickGradRepeat;               item.Tag := ord(gr);
+    item.ImageIndex:= 7+ord(gr);
+    FGradRepetitionMenu.Items.Add(item);
+  end;
+
+  FGradInterpMenu := TPopupMenu.Create(self);
+  FGradInterpMenu.Images := FImageList;
+  for ci := low(TBGRAColorInterpolation) to high(TBGRAColorInterpolation) do
+  begin
+    item := TMenuItem.Create(FGradInterpMenu);  item.Caption := ColorInterpToStr[ci];
+    item.OnClick:=@OnClickGradInterp;           item.Tag := ord(ci);
+    item.ImageIndex:= 11+ord(ci);
+    FGradInterpMenu.Items.Add(item);
+  end;
+end;
+
+procedure TVectorialFillInterface.CreateTextureInterface;
+var
+  tr: TTextureRepetition;
+  item: TMenuItem;
+begin
+  if FTextureInterfaceCreated then exit;
+  FTextureInterfaceCreated := true;
+
+  FButtonAdjustToTexture := AddToolbarButton(FToolbar, 'Adjust to shape', 21, @AdjustToShapeClick);
+  FButtonAdjustToTexture.Enabled := FCanAdjustToShape;
+  FButtonTexRepeat := AddToolbarButton(FToolbar, 'Texture repetition...', -1, @ButtonTexRepeatClick);
+  FUpDownTexAlpha := TBCTrackbarUpdown.Create(FToolbar);
+  FUpDownTexAlpha.Width := FToolbar.ButtonWidth*2;
+  FUpDownTexAlpha.Height := FToolbar.ButtonHeight;
+  FUpDownTexAlpha.MinValue := 0;
+  FUpDownTexAlpha.MaxValue := 255;
+  FUpDownTexAlpha.OnChange:=@UpDownTexAlphaChange;
+  AddToolbarControl(FToolbar, FUpDownTexAlpha);
+  FButtonLoadTexture := AddToolbarButton(FToolbar, 'Load texture...', 22, @ButtonLoadTextureClick);
+  FTexturePreview := TImage.Create(FToolbar);
+  FTexturePreview.Width := FToolbar.ButtonWidth;
+  FTexturePreview.Height := FToolbar.ButtonHeight;
+  UpdateTextureThumbnail;
+  AddToolbarControl(FToolbar, FTexturePreview);
+
+  FTexRepetitionMenu := TPopupMenu.Create(self);
+  FTexRepetitionMenu.Images := FImageList;
+  for tr := low(TTextureRepetition) to high(TTextureRepetition) do
+  begin
+    item := TMenuItem.Create(FTexRepetitionMenu);  item.Caption := TextureRepetitionToStr[tr];
+    item.OnClick:=@OnClickBackTexRepeat;           item.Tag := ord(tr);
+    item.ImageIndex:= 17+ord(tr);
+    FTexRepetitionMenu.Items.Add(item);
+  end;
+end;
+
+procedure TVectorialFillInterface.HideSolidColorInterface;
+begin
+  if not FSolidColorInterfaceCreated then exit;
+  FShapeSolidColor.Visible := false;
+  FUpDownSolidAlpha.Visible := false;
+end;
+
+procedure TVectorialFillInterface.HideGradientInterface;
+begin
+  if not FGradientInterfaceCreated then exit;
+  FShapeStartColor.Visible := false;
+  FUpDownStartAlpha.Visible := false;
+  FButtonSwapColor.Visible := false;
+  FShapeEndColor.Visible := false;
+  FUpDownEndAlpha.Visible := false;
+  FButtonGradRepetition.Visible := false;
+  FButtonGradInterp.Visible := false;
+end;
+
+procedure TVectorialFillInterface.HideTextureInterface;
+begin
+  if not FTextureInterfaceCreated then exit;
+  FButtonAdjustToTexture.Visible := false;
+  FButtonTexRepeat.Visible := false;
+  FUpDownTexAlpha.Visible := false;
+  FButtonLoadTexture.Visible := false;
+  FTexturePreview.Visible := false;
+end;
+
+procedure TVectorialFillInterface.SetSolidColor(AValue: TBGRAPixel);
+begin
+  if FSolidColor=AValue then Exit;
+  FSolidColor:=AValue;
+  UpdateShapeSolidColor;
+  If FillType = vftSolid then Changed;
+end;
+
+procedure TVectorialFillInterface.ButtonFillChange(Sender: TObject);
+begin
+  if Sender = FButtonFillNone then FillType:= vftNone
+  else if Sender = FButtonFillSolid then FillType:= vftSolid;
+end;
+
+procedure TVectorialFillInterface.SetTextureRepetition(
+  AValue: TTextureRepetition);
+begin
+  if FTexRepetition=AValue then Exit;
+  FTexRepetition:=AValue;
+  UpdateTextureParams;
+  If FillType = vftTexture then Changed;
+end;
+
+procedure TVectorialFillInterface.SetTextureOpacity(AValue: byte);
+begin
+  if FTexOpacity=AValue then Exit;
+  FTexOpacity:=AValue;
+  FUpDownTexAlpha.Value := AValue;
+  If FillType = vftTexture then Changed;
+end;
+
+procedure TVectorialFillInterface.ShapeEndColorMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+var
+  newColor: TColor;
+begin
+  newColor := ChooseColor(FShapeEndColor.Brush.Color);
+  if newColor <> clNone then
+  begin
+    if GradEndColor.alpha <> 0 then
+      GradEndColor := ColorToBGRA(newColor, GradEndColor.alpha)
+    else
+      GradEndColor := newColor;
+  end;
+end;
+
+procedure TVectorialFillInterface.SetGradientType(AValue: TGradientType);
+begin
+  if FGradType=AValue then Exit;
+  FGradType:=AValue;
+  FButtonFillGradient.ImageIndex := 2+ord(GradientType);
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.SetGradEndColor(AValue: TBGRAPixel);
+begin
+  if CompareMem(@FGradEndColor,@AValue,sizeof(TBGRAPixel)) then Exit;
+  FGradEndColor:=AValue;
+  UpdateGradientParams;
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.SetGradStartColor(AValue: TBGRAPixel);
+begin
+  if CompareMem(@FGradStartColor,@AValue,sizeof(TBGRAPixel)) then Exit;
+  FGradStartColor:=AValue;
+  UpdateGradientParams;
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.SetGradRepetition(AValue: TBGRAGradientRepetition);
+begin
+  if FGradRepetition=AValue then Exit;
+  FGradRepetition:=AValue;
+  UpdateGradientParams;
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.SetGradInterpolation(
+  AValue: TBGRAColorInterpolation);
+begin
+  if FGradInterp=AValue then Exit;
+  FGradInterp:=AValue;
+  UpdateGradientParams;
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.SetContainer(AValue: TWinControl);
+begin
+  if FContainer=AValue then Exit;
+  if Assigned(FContainer) then FContainer.RemoveControl(FToolbar);
+  FContainer:=AValue;
+  if Assigned(FContainer) then
+  begin
+    FContainer.InsertControl(FToolBar);
+    FToolbar.Align:= alTop;
+    FToolbar.Height := FContainer.Height;
+  end;
+end;
+
+function TVectorialFillInterface.GetPreferredSize: TSize;
+begin
+  result := GetToolbarSize(FToolbar,0);
+end;
+
+procedure TVectorialFillInterface.SetCanAdjustToShape(AValue: boolean);
+begin
+  if FCanAdjustToShape=AValue then Exit;
+  FCanAdjustToShape:=AValue;
+  if FTextureInterfaceCreated then
+    FButtonAdjustToTexture.Enabled := AValue;
+end;
+
+procedure TVectorialFillInterface.AdjustToShapeClick(Sender: TObject);
+begin
+  if Assigned(FOnAdjustToShape) then FOnAdjustToShape(self);
+end;
+
+procedure TVectorialFillInterface.ButtonFillGradClick(Sender: TObject);
+begin
+  if Assigned(FGradTypeMenu) then
+    with FButtonFillGradient.ClientToScreen(Point(0,FButtonFillGradient.Height)) do
+      FGradTypeMenu.PopUp(X,Y);
+  FButtonFillGradient.Down := (FillType = vftGradient);
+end;
+
+procedure TVectorialFillInterface.ButtonFillTexClick(Sender: TObject);
+begin
+  if FFillType = vftTexture then
+  begin
+    FButtonFillTexture.Down := true;
+    exit;
+  end;
+
+  if Assigned(FTexture) then FillType := vftTexture
+  else LoadTexture;
+end;
+
+procedure TVectorialFillInterface.ButtonGradInterpClick(Sender: TObject);
+begin
+  if Assigned(FGradInterpMenu) then
+    with FButtonGradInterp.ClientToScreen(Point(0,FButtonGradInterp.Height)) do
+      FGradInterpMenu.PopUp(X,Y);
+end;
+
+procedure TVectorialFillInterface.ButtonGradRepetitionClick(Sender: TObject);
+begin
+  if Assigned(FGradRepetitionMenu) then
+    with FButtonGradRepetition.ClientToScreen(Point(0,FButtonGradRepetition.Height)) do
+      FGradRepetitionMenu.PopUp(X,Y);
+end;
+
+procedure TVectorialFillInterface.ButtonLoadTextureClick(Sender: TObject);
+begin
+  LoadTexture;
+end;
+
+procedure TVectorialFillInterface.ButtonSwapColorClick(Sender: TObject);
+var
+  temp: TBGRAPixel;
+begin
+  temp := GradStartColor;
+  FGradStartColor := GradEndColor;
+  FGradEndColor := temp;
+  UpdateGradientParams;
+  if FillType = vftGradient then Changed;
+end;
+
+procedure TVectorialFillInterface.ButtonTexRepeatClick(Sender: TObject);
+begin
+  if Assigned(FTexRepetitionMenu) then
+    with FButtonTexRepeat.ClientToScreen(Point(0,FButtonTexRepeat.Height)) do
+      FTexRepetitionMenu.PopUp(X,Y);
+end;
+
+constructor TVectorialFillInterface.Create(AOwner: TComponent);
+var
+  gt: TGradientType;
+  item: TMenuItem;
+begin
+  inherited Create(AOwner);
+  FContainer := nil;
+
+  FFillType:= vftSolid;
+  FSolidColor:= BGRAWhite;
+  FGradStartColor:= CSSRed;
+  FGradEndColor:= CSSYellow;
+  FGradType:= gtLinear;
+  FGradRepetition:= grPad;
+  FGradInterp:= ciLinearRGB;
+  FTexture:= nil;
+  FTexRepetition:= trRepeatBoth;
+  FTexOpacity:= 255;
+  FCanAdjustToShape:= true;
+
+  FImageList := nil;
+  LoadImageList;
+
+  FOpenPictureDlg := TOpenPictureDialog.Create(self);
+  FColorDlg:= TColorDialog.Create(self);
+
+  FOnFillChange:= nil;
+  FOnTextureChange:= nil;
+
+  FToolbar := CreateToolBar(FImageList);
+  FToolbar.EdgeBorders:= [];
+  FToolbar.EdgeInner:= esNone;
+  FToolbar.EdgeOuter:= esNone;
+  FToolbar.Wrapable := false;
+  FButtonFillNone := AddToolbarCheckButton(FToolbar, 'No fill', 0, @ButtonFillChange, False, False);
+  FButtonFillSolid := AddToolbarCheckButton(FToolbar, 'Solid color', 1, @ButtonFillChange, False, False);
+  FButtonFillGradient := AddToolbarButton(FToolbar, 'Gradient fill', 2+ord(FGradType), @ButtonFillGradClick);
+  FButtonFillTexture := AddToolbarButton(FToolbar, 'Texture fill', 6, @ButtonFillTexClick);
+  FButtonFillTexture.Wrap := true;
+
+  //menu to access gradient interface
+  FGradTypeMenu := TPopupMenu.Create(self);
+  FGradTypeMenu.Images := FImageList;
+  for gt := low(TGradientType) to high(TGradientType) do
+  begin
+    item := TMenuItem.Create(FGradTypeMenu);  item.Caption := GradTypeToStr[gt];
+    item.OnClick:=@OnClickBackGradType;       item.Tag := ord(gt);
+    item.ImageIndex:= 2+ord(gt);
+    FGradTypeMenu.Items.Add(item);
+  end;
+
+  FSolidColorInterfaceCreated := false;
+  FGradientInterfaceCreated:= false;
+  FTextureInterfaceCreated:= false;
+
+  UpdateAccordingToFillType;
+end;
+
+destructor TVectorialFillInterface.Destroy;
+begin
+  FTexture.FreeReference;
+  if Assigned(FContainer) then
+  begin
+    FContainer.RemoveControl(FToolbar);
+    FContainer := nil;
+  end;
+  FToolbar.Free;
+  inherited Destroy;
+end;
+
+function TVectorialFillInterface.GetTextureThumbnail(AWidth, AHeight: integer; ABackColor: TColor): TBitmap;
+var
+  thumb: TBGRABitmap;
+begin
+  if FTexture = nil then exit(nil);
+  thumb := GetBitmapThumbnail(FTexture, AWidth,AHeight,BGRAPixelTransparent,true);
+  try
+    result := thumb.MakeBitmapCopy(ABackColor);
+  finally
+    thumb.Free;
+  end;
+end;
+
+begin
+  {$i fillimages16.lrs}
+end.
+

文件差异内容过多而无法显示
+ 29 - 1809
vectoredit/umain.lfm


+ 89 - 524
vectoredit/umain.pas

@@ -11,17 +11,13 @@ uses
   BCTrackbarUpdown, BCPanel, BCButton, BGRAVirtualScreen, BGRAImageList,
   BGRABitmap, BGRABitmapTypes, BGRAGraphics, BGRALazPaint, BGRALayerOriginal,
   BGRATransform, BGRAGradientScanner, LCVectorOriginal, LCVectorialFill,
-  LCVectorShapes, LCVectorPolyShapes;
+  LCVectorShapes, LCVectorPolyShapes, LCVectorialFillInterface;
 
 const
   ToolIconSize = 36;
   ActionIconSize = 24;
   EditorPointSize = 7;
   PenStyleToStr : array[TPenStyle] of string = ('─────', '─ ─ ─ ─', '···············', '─ · ─ · ─', '─ ·· ─ ·· ╴', 'InsideFrame', 'Pattern', 'Clear');
-  GradTypeToStr : array[TGradientType] of string = ('Linear','Reflected','Diamond','Radial');
-  GradRepetitionToStr : array[TBGRAGradientRepetition] of string = ('Pad', 'Repeat', 'Reflect', 'Sine');
-  ColorInterpToStr : array[TBGRAColorInterpolation] of string = ('sRGB', 'RGB', 'HSL CW', 'HSL CCW', 'Corr. HSL CW', 'Corr. HSL CCW');
-  TextureRepetitionToStr: array[TTextureRepetition] of string = ('No repetition', 'Repeat X', 'Repeat Y', 'Repeat both');
   PhongShapeKindToStr: array[TPhongShapeKind] of string = ('Rectangle', 'Round rectangle', 'Half sphere', 'Cone top', 'Cone side',
                      'Horizontal cylinder', 'Vertical cylinder');
 
@@ -44,14 +40,15 @@ type
   { TForm1 }
 
   TForm1 = class(TForm)
+    ButtonMoveBackFillPoints: TToolButton;
+    PanelBackFillIntf: TPanel;
     ShapeSendToBack: TAction;
     ShapeBringToFront: TAction;
     ShapeMoveDown: TAction;
     ShapeMoveUp: TAction;
-    ToolButtonBackFillGrad: TToolButton;
+    ToolBar1: TToolBar;
     VectorImageList24: TBGRAImageList;
     ActionList: TActionList;
-    BackImage: TImage;
     EditCopy: TAction;
     EditCut: TAction;
     EditDelete: TAction;
@@ -60,21 +57,11 @@ type
     FileOpen: TAction;
     FileSave: TAction;
     FileSaveAs: TAction;
-    FillImageList16: TBGRAImageList;
-    ButtonBackGradInterp: TBCButton;
-    ButtonBackGradRepetion: TBCButton;
-    ButtonBackLoadTex: TBCButton;
-    ButtonBackSwapGradColor: TBCButton;
-    ButtonBackTexAdjust: TBCButton;
-    ButtonBackTexRepeat: TBCButton;
-    ButtonMoveBackFillPoints: TToolButton;
     ButtonPenStyle: TBCButton;
     Label1: TLabel;
     Label2: TLabel;
     Label3: TLabel;
     PanelBackFill: TBCPanel;
-    PanelBackFillGrad: TPanel;
-    PanelBackFillTex: TPanel;
     PanelBasicStyle: TBCPanel;
     PanelExtendedStyle: TBCPanel;
     PanelFile: TBCPanel;
@@ -82,21 +69,16 @@ type
     PhongImageList: TBGRAImageList;
     PenStyleImageList: TBGRAImageList;
     CurveImageList: TBGRAImageList;
-    ShapeBackColor: TShape;
-    ShapeBackEndColor: TShape;
-    ShapeBackStartColor: TShape;
     ShapePenColor: TShape;
     ToolBarFile: TToolBar;
     ToolBarEdit: TToolBar;
     ToolBarTop: TToolBar;
-    ToolBar2: TToolBar;
     ToolBarJoinStyle: TToolBar;
     ToolButton1: TToolButton;
     ToolButton10: TToolButton;
     ToolButton11: TToolButton;
     ToolButton12: TToolButton;
     ToolButton13: TToolButton;
-    ToolButton2: TToolButton;
     ToolButton3: TToolButton;
     ToolButton4: TToolButton;
     ToolButton5: TToolButton;
@@ -104,9 +86,6 @@ type
     ToolButton7: TToolButton;
     ToolButton8: TToolButton;
     ToolButton9: TToolButton;
-    ToolButtonBackFillNone: TToolButton;
-    ToolButtonBackFillSolid: TToolButton;
-    ToolButtonBackFillTexture: TToolButton;
     ToolButtonJoinBevel: TToolButton;
     ToolButtonJoinMiter: TToolButton;
     ToolButtonJoinRound: TToolButton;
@@ -127,20 +106,11 @@ type
     ToolButtonPolygon: TToolButton;
     ToolButtonRectangle: TToolButton;
     ToolButtonEllipse: TToolButton;
-    UpDownBackAlpha: TBCTrackbarUpdown;
-    UpDownBackEndAlpha: TBCTrackbarUpdown;
-    UpDownBackStartAlpha: TBCTrackbarUpdown;
-    UpDownBackTexAlpha: TBCTrackbarUpdown;
     UpDownPenAlpha: TBCTrackbarUpdown;
     UpDownPenWidth: TBCTrackbarUpdown;
     procedure BCPanelToolbarResize(Sender: TObject);
     procedure BCPanelToolChoiceResize(Sender: TObject);
-    procedure ButtonBackGradInterpClick(Sender: TObject);
-    procedure ButtonBackGradRepetionClick(Sender: TObject);
-    procedure ButtonBackTexAdjustClick(Sender: TObject);
-    procedure ButtonBackTexRepeatClick(Sender: TObject);
     procedure ButtonPenStyleClick(Sender: TObject);
-    procedure ButtonBackSwapGradColorClick(Sender: TObject);
     procedure EditCopyExecute(Sender: TObject);
     procedure EditCutExecute(Sender: TObject);
     procedure EditDeleteExecute(Sender: TObject);
@@ -150,18 +120,14 @@ type
     procedure FileOpenExecute(Sender: TObject);
     procedure FileSaveAsExecute(Sender: TObject);
     procedure FileSaveExecute(Sender: TObject);
+    procedure PanelBackFillIntfResize(Sender: TObject);
     procedure PanelFileResize(Sender: TObject);
     procedure PanelShapeResize(Sender: TObject);
-    procedure ShapeBackGradColorMouseUp(Sender: TObject; Button: TMouseButton;
-      Shift: TShiftState; X, Y: Integer);
-    procedure ShapeBringToFrontExecute(Sender: TObject);
+   procedure ShapeBringToFrontExecute(Sender: TObject);
     procedure ShapeMoveDownExecute(Sender: TObject);
     procedure ShapeMoveUpExecute(Sender: TObject);
     procedure ShapeSendToBackExecute(Sender: TObject);
-    procedure ToolButtonBackFillGradClick(Sender: TObject);
     procedure ToolButtonJoinClick(Sender: TObject);
-    procedure UpDownBackGradAlphaChange(Sender: TObject; AByUser: boolean);
-    procedure UpDownBackTexAlphaChange(Sender: TObject; AByUser: boolean);
     procedure UpDownPenWidthChange(Sender: TObject; AByUser: boolean);
     procedure BGRAVirtualScreen1MouseDown(Sender: TObject;
       Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
@@ -170,36 +136,21 @@ type
     procedure BGRAVirtualScreen1MouseUp(Sender: TObject; Button: TMouseButton;
       Shift: TShiftState; X, Y: Integer);
     procedure BGRAVirtualScreen1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
-    procedure ButtonBackLoadTexClick(Sender: TObject);
     procedure FormCreate(Sender: TObject);
     procedure FormDestroy(Sender: TObject);
     procedure FormKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState);
     procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
     procedure FormUTF8KeyPress(Sender: TObject; var UTF8Key: TUTF8Char);
-    procedure ToolButtonBackFillChange(Sender: TObject);
-    procedure ShapeBackColorMouseUp(Sender: TObject; {%H-}Button: TMouseButton;
-      {%H-}Shift: TShiftState; X, Y: Integer);
     procedure ShapePenColorMouseUp(Sender: TObject; {%H-}Button: TMouseButton;
-      {%H-}Shift: TShiftState; X, Y: Integer);
+      {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
     procedure ToolButtonClick(Sender: TObject);
-    procedure UpDownBackAlphaChange(Sender: TObject; AByUser: boolean);
     procedure UpDownPenAlphaChange(Sender: TObject; AByUser: boolean);
   private
-    FPenColor, FBackColor: TBGRAPixel;
-    FBackGradStartColor, FBackGradEndColor: TBGRAPixel;
-    FBackFillType: TVectorialFillType;
-    FBackGradType: TGradientType;
-    FBackGradTypeMenu: TPopupMenu;
-    FBackGradRepetition: TBGRAGradientRepetition;
-    FBackGradRepetitionMenu: TPopupMenu;
-    FBackGradInterp: TBGRAColorInterpolation;
-    FBackGradInterpMenu: TPopupMenu;
-    FBackTexRepetition: TTextureRepetition;
-    FBackTexRepetitionMenu: TPopupMenu;
-    FBackTexture: TBGRABitmap;
+    FPenColor: TBGRAPixel;
     FPenWidth: single;
     FPenStyle: TBGRAPenStyle;
     FPenJoinStyle: TPenJoinStyle;
+    FBackFillIntf: TVectorialFillInterface;
     FFlattened: TBGRABitmap;
     FLastEditorBounds: TRect;
     FUpdatingFromShape: boolean;
@@ -217,7 +168,6 @@ type
     FUpDownPhongBorderSize: TBCTrackbarUpdown;
     FInRemoveShapeIfEmpty: Boolean;
     procedure ComboBoxSplineStyleClick(Sender: TObject);
-    function GetBackTexture: TBGRABitmap;
     function GetPenColor: TBGRAPixel;
     function GetPenStyle: TBGRAPenStyle;
     function GetPenWidth: single;
@@ -226,7 +176,6 @@ type
     function GetZoomFactor: single;
     procedure ImageChange(ARectF: TRectF);
     procedure LoadVectorImages;
-    procedure OnClickBackGradType(ASender: TObject);
     procedure OnClickSplineStyleItem(ASender: TObject);
     procedure OnEditingChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
     procedure OnOriginalChange({%H-}ASender: TObject; AOriginal: TBGRALayerCustomOriginal);
@@ -234,18 +183,9 @@ type
     procedure OnPhongShapeAltitudeChange(Sender: TObject; AByUser: boolean);
     procedure OnSelectShape(ASender: TObject; AShape: TVectorShape; APreviousShape: TVectorShape);
     procedure OnClickPenStyle(ASender: TObject);
-    procedure OnClickBackGradRepeat(ASender: TObject);
-    procedure OnClickBackGradInterp(ASender: TObject);
     procedure PhongShapeKindClick(Sender: TObject);
-    procedure SetBackColor(AValue: TBGRAPixel);
-    procedure SetBackFillType(AValue: TVectorialFillType);
-    procedure SetBackGradEndColor(AValue: TBGRAPixel);
-    procedure SetBackGradInterp(AValue: TBGRAColorInterpolation);
-    procedure SetBackGradRepetition(AValue: TBGRAGradientRepetition);
-    procedure SetBackGradStartColor(AValue: TBGRAPixel);
-    procedure SetBackGradType(AValue: TGradientType);
-    procedure SetBackTexRepetition(AValue: TTextureRepetition);
-    procedure SetBackTexture(AValue: TBGRABitmap);
+    procedure RequestBackFillUpdate(Sender: TObject);
+    procedure OnBackFillChange({%H-}ASender: TObject);
     procedure SetCurrentTool(AValue: TPaintTool);
     procedure SetPenColor(AValue: TBGRAPixel);
     procedure SetPenJoinStyle(AValue: TPenJoinStyle);
@@ -264,15 +204,14 @@ type
     function CreateShape(const APoint1, APoint2: TPointF): TVectorShape;
     function CreateBackFill(AShape: TVectorShape): TVectorialFill;
     procedure RemoveExtendedStyleControls;
-    procedure UpdateBackComponentsVisibility;
+    procedure UpdateBackToolFillPoints;
     procedure UpdateShapeBackFill;
     procedure UpdateShapeUserMode;
     procedure UpdateShapeActions(AShape: TVectorShape);
-    procedure OnClickBackTexRepeat(ASender: TObject);
     procedure RemoveShapeIfEmpty(AShape: TVectorShape);
-    procedure DoLoadTex;
     function VirtualScreenToImgCoord(X,Y: Integer): TPointF;
     procedure SetEditorGrid(AActive: boolean);
+    procedure RequestBackFillAdjustToShape(Sender: TObject);
   public
     { public declarations }
     img: TBGRALazPaintImage;
@@ -292,15 +231,6 @@ type
     procedure DoDelete;
     property vectorTransform: TAffineMatrix read GetVectorTransform;
     property penColor: TBGRAPixel read GetPenColor write SetPenColor;
-    property backColor: TBGRAPixel read FBackColor write SetBackColor;
-    property backGradStartColor: TBGRAPixel read FBackGradStartColor write SetBackGradStartColor;
-    property backGradEndColor: TBGRAPixel read FBackGradEndColor write SetBackGradEndColor;
-    property backFillType: TVectorialFillType read FBackFillType write SetBackFillType;
-    property backGradType: TGradientType read FBackGradType write SetBackGradType;
-    property backGradRepetition: TBGRAGradientRepetition read FBackGradRepetition write SetBackGradRepetition;
-    property backGradInterp: TBGRAColorInterpolation read FBackGradInterp write SetBackGradInterp;
-    property backTexture: TBGRABitmap read GetBackTexture write SetBackTexture;
-    property backTextureRepetition: TTextureRepetition read FBackTexRepetition write SetBackTexRepetition;
     property penWidth: single read GetPenWidth write SetPenWidth;
     property penStyle: TBGRAPenStyle read GetPenStyle write SetPenStyle;
     property splineStyle: TSplineStyle read GetSplineStyle write SetSplineStyle;
@@ -354,25 +284,15 @@ begin
   SetToolbarImages(ToolBarEdit, vectorImageList);
 end;
 
-procedure TForm1.OnClickBackGradType(ASender: TObject);
-begin
-  backGradType := TGradientType((ASender as TMenuItem).Tag);
-  if backFillType <> vftGradient then backFillType:= vftGradient;
-end;
-
 { TForm1 }
 
 procedure TForm1.FormCreate(Sender: TObject);
 var
   item: TMenuItem;
   ps: TPenStyle;
-  gr: TBGRAGradientRepetition;
-  ci: TBGRAColorInterpolation;
-  tr: TTextureRepetition;
   ss: TSplineStyle;
   toolImageList: TBGRAImageList;
   i: Integer;
-  gt: TGradientType;
 begin
   baseCaption:= Caption;
   if ToolIconSize <> ToolImageList48.Width then
@@ -397,7 +317,7 @@ begin
   img.OnOriginalEditingChange:= @OnEditingChange;
   img.OnOriginalChange:= @OnOriginalChange;
 
-  zoom := AffineMatrixScale(1,1);
+  zoom := AffineMatrixScale(20,20);
   FPenStyleMenu := TPopupMenu.Create(nil);
   item:= TMenuItem.Create(FPenStyleMenu); item.Caption := PenStyleToStr[psClear];
   item.OnClick := @OnClickPenStyle;       item.Tag := ord(psClear);
@@ -409,35 +329,11 @@ begin
     FPenStyleMenu.Items.Add(item);
   end;
 
-  FBackGradTypeMenu := TPopupMenu.Create(nil);
-  FBackGradTypeMenu.Images := FillImageList16;
-  for gt := low(TGradientType) to high(TGradientType) do
-  begin
-    item := TMenuItem.Create(FBackGradTypeMenu); item.Caption := GradTypeToStr[gt];
-    item.OnClick:=@OnClickBackGradType;          item.Tag := ord(gt);
-    item.ImageIndex:= 2+ord(gt);
-    FBackGradTypeMenu.Items.Add(item);
-  end;
-
-  FBackGradRepetitionMenu := TPopupMenu.Create(nil);
-  FBackGradRepetitionMenu.Images := FillImageList16;
-  for gr := low(TBGRAGradientRepetition) to high(TBGRAGradientRepetition) do
-  begin
-    item := TMenuItem.Create(FBackGradRepetitionMenu); item.Caption := GradRepetitionToStr[gr];
-    item.OnClick := @OnClickBackGradRepeat;            item.Tag := ord(gr);
-    item.ImageIndex:= 7+ord(gr);
-    FBackGradRepetitionMenu.Items.Add(item);
-  end;
-
-  FBackGradInterpMenu := TPopupMenu.Create(nil);
-  FBackGradInterpMenu.Images := FillImageList16;
-  for ci := low(TBGRAColorInterpolation) to high(TBGRAColorInterpolation) do
-  begin
-    item := TMenuItem.Create(FBackGradInterpMenu); item.Caption := ColorInterpToStr[ci];
-    item.OnClick := @OnClickBackGradInterp;        item.Tag := ord(ci);
-    item.ImageIndex:= 11+ord(ci);
-    FBackGradInterpMenu.Items.Add(item);
-  end;
+  FBackFillIntf := TVectorialFillInterface.Create(nil);
+  FBackFillIntf.SolidColor := CSSDodgerBlue;
+  FBackFillIntf.OnFillChange:=@RequestBackFillUpdate;
+  FBackFillIntf.OnAdjustToShape:=@RequestBackFillAdjustToShape;
+  FBackFillIntf.Container := PanelBackFillIntf;
 
   FSplineStyleMenu := TPopupMenu.Create(nil);
   for ss := low(TSplineStyle) to high(TSplineStyle) do
@@ -448,35 +344,17 @@ begin
     FSplineStyleMenu.Items.Add(item);
   end;
 
-  FBackTexRepetitionMenu := TPopupMenu.Create(nil);
-  FBackTexRepetitionMenu.Images := FillImageList16;
-  for tr := low(TTextureRepetition) to high(TTextureRepetition) do
-  begin
-    item := TMenuItem.Create(FBackTexRepetitionMenu); item.Caption := TextureRepetitionToStr[tr];
-    item.OnClick:=@OnClickBackTexRepeat;
-        item.Tag := ord(tr);
-    item.ImageIndex:= 17+ord(tr);
-    FBackTexRepetitionMenu.Items.Add(item);
-  end;
-
   newShape:= nil;
   penColor := BGRABlack;
-  backColor := CSSDodgerBlue;
-  backGradStartColor := CSSRed;
-  backGradEndColor := CSSYellow;
   penWidth := 5;
   penStyle := SolidPenStyle;
   joinStyle:= pjsBevel;
   currentTool:= ptHand;
   splineStyle:= ssEasyBezier;
-  FBackFillType:= vftSolid;
-  FBackGradRepetition:= grPad;
-  FBackGradInterp:= ciLinearRGB;
-  FBackTexRepetition:= trRepeatBoth;
   FPhongShapeAltitude := DefaultPhongShapeAltitudePercent;
   FPhongBorderSize := DefaultPhongBorderSizePercent;
   UpdateTitleBar;
-  UpdateBackComponentsVisibility;
+  UpdateBackToolFillPoints;
   UpdateShapeActions(nil);
 end;
 
@@ -495,11 +373,6 @@ begin
   FLastEditorBounds := img.DrawEditor(Bitmap, vectorLayer, zoom, EditorPointSize);
 end;
 
-procedure TForm1.ButtonBackLoadTexClick(Sender: TObject);
-begin
-  DoLoadTex;
-end;
-
 procedure TForm1.BGRAVirtualScreen1MouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 var
@@ -524,23 +397,10 @@ end;
 
 procedure TForm1.UpDownPenWidthChange(Sender: TObject; AByUser: boolean);
 begin
-  if FUpdatingSpinEditPenWidth then exit;
+  if FUpdatingSpinEditPenWidth or not AByUser then exit;
   penWidth := UpDownPenWidth.Value*0.1;
 end;
 
-procedure TForm1.ShapeBackGradColorMouseUp(Sender: TObject; Button: TMouseButton;
-  Shift: TShiftState; X, Y: Integer);
-begin
-  ColorDialog1.Color := (Sender as TShape).Brush.Color;
-  if ColorDialog1.Execute then
-  begin
-    if Sender = ShapeBackEndColor then
-      backGradEndColor := ColorToBGRA(ColorDialog1.Color, backGradEndColor.alpha)
-    else
-      backGradStartColor := ColorToBGRA(ColorDialog1.Color, backGradStartColor.alpha);
-  end;
-end;
-
 procedure TForm1.ShapeBringToFrontExecute(Sender: TObject);
 begin
   if Assigned(vectorOriginal) and
@@ -581,14 +441,6 @@ begin
   end;
 end;
 
-procedure TForm1.ToolButtonBackFillGradClick(Sender: TObject);
-begin
-  if Assigned(FBackGradTypeMenu) then
-    with ToolButtonBackFillGrad.ClientToScreen(Point(0,ToolButtonBackFillGrad.Height)) do
-      FBackGradTypeMenu.PopUp(X,Y);
-  ToolButtonBackFillGrad.Down := FBackFillType = vftGradient;
-end;
-
 procedure TForm1.ToolButtonJoinClick(Sender: TObject);
 begin
   if (Sender as TToolButton).Down then
@@ -599,22 +451,6 @@ begin
   end;
 end;
 
-procedure TForm1.ButtonBackSwapGradColorClick(Sender: TObject);
-var
-  temp, c: TBGRAPixel;
-begin
-  temp := FBackGradStartColor;
-  FBackGradStartColor := FBackGradEndColor;
-  FBackGradEndColor := temp;
-  c := FBackGradStartColor; c.alpha:= 255;
-  ShapeBackStartColor.Brush.Color := c.ToColor;
-  UpDownBackStartAlpha.Value:= FBackGradStartColor.alpha;
-  c := FBackGradEndColor; c.alpha:= 255;
-  ShapeBackEndColor.Brush.Color := c.ToColor;
-  UpDownBackEndAlpha.Value:= FBackGradEndColor.alpha;
-  UpdateShapeBackFill;
-end;
-
 procedure TForm1.EditCopyExecute(Sender: TObject);
 begin
   DoCopy;
@@ -719,6 +555,16 @@ begin
   end;
 end;
 
+procedure TForm1.PanelBackFillIntfResize(Sender: TObject);
+begin
+  with FBackFillIntf.PreferredSize do
+  begin
+    PanelBackFillIntf.Width := cx;
+    PanelBackFillIntf.Height := cy;
+  end;
+  PanelBackFill.Width := PanelBackFillIntf.Left+PanelBackFillIntf.Width+1;
+end;
+
 procedure TForm1.PanelFileResize(Sender: TObject);
 begin
   ToolBarFile.Width := GetToolbarSize(ToolBarFile).cx;
@@ -738,39 +584,6 @@ begin
       FPenStyleMenu.PopUp(X,Y);
 end;
 
-procedure TForm1.ButtonBackGradRepetionClick(Sender: TObject);
-begin
-  if Assigned(FBackGradRepetitionMenu) then
-    with ButtonBackGradRepetion.ClientToScreen(Point(0,ButtonBackGradRepetion.Height)) do
-      FBackGradRepetitionMenu.PopUp(X,Y);
-end;
-
-procedure TForm1.ButtonBackTexAdjustClick(Sender: TObject);
-var
-  vectorFill: TVectorialFill;
-begin
-  if Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape) then
-  begin
-    vectorFill := CreateBackFill(vectorOriginal.SelectedShape);
-    vectorOriginal.SelectedShape.BackFill := vectorFill;
-    vectorFill.Free;
-  end;
-end;
-
-procedure TForm1.ButtonBackTexRepeatClick(Sender: TObject);
-begin
-  if Assigned(FBackTexRepetitionMenu) then
-    with ButtonBackTexRepeat.ClientToScreen(Point(0,ButtonBackTexRepeat.Height)) do
-      FBackTexRepetitionMenu.PopUp(X,Y);
-end;
-
-procedure TForm1.ButtonBackGradInterpClick(Sender: TObject);
-begin
-  if Assigned(FBackGradInterpMenu) then
-    with ButtonBackGradInterp.ClientToScreen(Point(0,ButtonBackGradInterp.Height)) do
-      FBackGradInterpMenu.PopUp(X,Y);
-end;
-
 procedure TForm1.BCPanelToolChoiceResize(Sender: TObject);
 begin
   ToolbarTools.Width := GetToolbarSize(ToolbarTools).cx;
@@ -783,23 +596,6 @@ begin
   BCPanelToolbar.Height := ToolBarTop.Height;
 end;
 
-procedure TForm1.UpDownBackGradAlphaChange(Sender: TObject; AByUser: boolean);
-begin
-  if AByUser then
-  begin
-    if Sender = UpDownBackEndAlpha then
-      FBackGradEndColor.alpha := (Sender as TBCTrackbarUpdown).Value
-    else
-      FBackGradStartColor.alpha := (Sender as TBCTrackbarUpdown).Value;
-    if backFillType = vftGradient then UpdateShapeBackFill;
-  end;
-end;
-
-procedure TForm1.UpDownBackTexAlphaChange(Sender: TObject; AByUser: boolean);
-begin
-  if AByUser and (backFillType = vftTexture) then UpdateShapeBackFill;
-end;
-
 procedure TForm1.BGRAVirtualScreen1MouseMove(Sender: TObject;
   Shift: TShiftState; X, Y: Integer);
 var
@@ -885,14 +681,10 @@ end;
 procedure TForm1.FormDestroy(Sender: TObject);
 begin
   RemoveExtendedStyleControls;
+  FBackFillIntf.Free;
   img.Free;
   FFlattened.Free;
-  FBackTexture.FreeReference;
   FPenStyleMenu.Free;
-  FBackGradTypeMenu.Free;
-  FBackGradRepetitionMenu.Free;
-  FBackGradInterpMenu.Free;
-  FBackTexRepetitionMenu.Free;
   FSplineStyleMenu.Free;
 end;
 
@@ -949,50 +741,6 @@ begin
   end;
 end;
 
-procedure TForm1.ToolButtonBackFillChange(Sender: TObject);
-begin
-  if FUpdatingFromShape then exit;
-
-  if (Sender = ToolButtonBackFillTexture) and (backTexture = nil) then
-  begin
-    DoLoadTex;
-    exit;
-  end;
-
-  if (Sender as TToolButton).Down then
-  begin
-    if Sender = ToolButtonBackFillNone then backFillType := vftNone;
-    if Sender = ToolButtonBackFillSolid then backFillType := vftSolid;
-    if Sender = ToolButtonBackFillGrad then backFillType := vftGradient;
-    if Sender = ToolButtonBackFillTexture then backFillType := vftTexture;
-  end else
-  begin
-    if not ToolButtonBackFillNone.Down and
-       not ToolButtonBackFillSolid.Down and
-       not ToolButtonBackFillGrad.Down and
-       not ToolButtonBackFillTexture.Down then
-    begin
-      ToolButtonBackFillNone.Down := (backFillType = vftNone);
-      ToolButtonBackFillSolid.Down := (backFillType = vftSolid);
-      ToolButtonBackFillGrad.Down := (backFillType = vftGradient);
-      ToolButtonBackFillTexture.Down := (backFillType = vftTexture);
-    end;
-  end;
-end;
-
-procedure TForm1.ShapeBackColorMouseUp(Sender: TObject; Button: TMouseButton;
-  Shift: TShiftState; X, Y: Integer);
-begin
-  ColorDialog1.Color := ShapeBackColor.Brush.Color;
-  if ColorDialog1.Execute then
-  begin
-    if backColor.alpha <> 0 then
-      backColor := ColorToBGRA(ColorDialog1.Color, backColor.alpha)
-    else
-      backColor := ColorDialog1.Color;
-  end;
-end;
-
 procedure TForm1.ShapePenColorMouseUp(Sender: TObject; Button: TMouseButton;
   Shift: TShiftState; X, Y: Integer);
 begin
@@ -1030,7 +778,7 @@ begin
     else UpdateToolbarFromShape(nil);
 
     if currentTool in [ptPolyline, ptCurve] then
-      backFillType := vftNone;
+      FBackFillIntf.FillType := vftNone;
   end;
 
   UpdateShapeUserMode;
@@ -1039,15 +787,6 @@ begin
     UpdateToolbarFromShape(nil);
 end;
 
-procedure TForm1.UpDownBackAlphaChange(Sender: TObject; AByUser: boolean);
-begin
-  if AByUser then
-  begin
-    FBackColor:= ColorToBGRA(ShapeBackColor.Brush.Color, UpDownBackAlpha.Value);
-    if backFillType = vftSolid then UpdateShapeBackFill;
-  end;
-end;
-
 procedure TForm1.UpDownPenAlphaChange(Sender: TObject; AByUser: boolean);
 begin
   if AByUser then
@@ -1065,11 +804,6 @@ begin
       FSplineStyleMenu.PopUp(X,Y);
 end;
 
-function TForm1.GetBackTexture: TBGRABitmap;
-begin
-  result := FBackTexture;
-end;
-
 function TForm1.GetPenColor: TBGRAPixel;
 begin
   result := FPenColor;
@@ -1186,165 +920,20 @@ begin
   end;
 end;
 
-procedure TForm1.OnClickBackGradRepeat(ASender: TObject);
-begin
-  backGradRepetition := TBGRAGradientRepetition((ASender as TMenuItem).Tag);
-end;
-
-procedure TForm1.OnClickBackGradInterp(ASender: TObject);
-begin
-  backGradInterp := TBGRAColorInterpolation((ASender as TMenuItem).Tag);
-end;
-
 procedure TForm1.PhongShapeKindClick(Sender: TObject);
 begin
   if (Sender as TToolButton).Down then
     phongShapeKind:= TPhongShapeKind((Sender as TToolButton).Tag);
 end;
 
-procedure TForm1.SetBackColor(AValue: TBGRAPixel);
-begin
-  FBackColor := AValue;
-  ShapeBackColor.Brush.Color := AValue.ToColor;
-  UpDownBackAlpha.Value := AValue.alpha;
-  if not FUpdatingFromShape and (backFillType = vftSolid) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackFillType(AValue: TVectorialFillType);
+procedure TForm1.RequestBackFillUpdate(Sender: TObject);
 begin
-  if FBackFillType=AValue then Exit;
-  FBackFillType:=AValue;
-  ToolButtonBackFillNone.Down := (FBackFillType = vftNone);
-  ToolButtonBackFillSolid.Down := (FBackFillType = vftSolid);
-  ToolButtonBackFillGrad.Down := (FBackFillType = vftGradient);
-  ToolButtonBackFillTexture.Down := (FBackFillType = vftTexture);
   if not FUpdatingFromShape then UpdateShapeBackFill;
-  UpdateBackComponentsVisibility;
-end;
-
-procedure TForm1.SetBackGradEndColor(AValue: TBGRAPixel);
-begin
-  FBackGradEndColor := AValue;
-  UpDownBackEndAlpha.Value := AValue.alpha;
-  AValue.alpha := 255;
-  ShapeBackEndColor.Brush.Color := AValue.ToColor;
-  if not FUpdatingFromShape and (backFillType = vftGradient) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackGradInterp(AValue: TBGRAColorInterpolation);
-var
-  glyph: Graphics.TBitmap;
-begin
-  If FBackGradInterp=AValue then exit;
-  FBackGradInterp:=AValue;
-  glyph := TBitmap.Create;
-  glyph.Width := FillImageList16.Width;
-  glyph.Height := FillImageList16.Height;
-  glyph.Canvas.Brush.Color := MergeBGRA(ColorToBGRA(ButtonBackGradInterp.StateNormal.Background.Gradient1.EndColor),
-                                        ColorToBGRA(ButtonBackGradInterp.StateNormal.Background.Gradient2.StartColor));
-  glyph.Canvas.FillRect(0,0,glyph.Width,glyph.Height);
-  FillImageList16.Draw(glyph.Canvas,0,0,11+ord(FBackGradInterp));
-  ButtonBackGradInterp.Glyph.Assign(glyph);
-  glyph.Free;
-  if not FUpdatingFromShape and (backFillType = vftGradient) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackGradRepetition(AValue: TBGRAGradientRepetition);
-var
-  glyph: Graphics.TBitmap;
-begin
-  If FBackGradRepetition=AValue then exit;
-  FBackGradRepetition:=AValue;
-  glyph := TBitmap.Create;
-  glyph.Width := FillImageList16.Width;
-  glyph.Height := FillImageList16.Height;
-  glyph.Canvas.Brush.Color := MergeBGRA(ColorToBGRA(ButtonBackGradRepetion.StateNormal.Background.Gradient1.EndColor),
-                                        ColorToBGRA(ButtonBackGradRepetion.StateNormal.Background.Gradient2.StartColor));
-  glyph.Canvas.FillRect(0,0,glyph.Width,glyph.Height);
-  FillImageList16.Draw(glyph.Canvas,0,0,7+ord(FBackGradRepetition));
-  ButtonBackGradRepetion.Glyph.Assign(glyph);
-  glyph.Free;
-  if not FUpdatingFromShape and (backFillType = vftGradient) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackGradStartColor(AValue: TBGRAPixel);
-begin
-  FBackGradStartColor := AValue;
-  UpDownBackStartAlpha.Value := AValue.alpha;
-  AValue.alpha := 255;
-  ShapeBackStartColor.Brush.Color := AValue.ToColor;
-  if not FUpdatingFromShape and (backFillType = vftGradient) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackGradType(AValue: TGradientType);
-begin
-  if FBackGradType=AValue then Exit;
-  FBackGradType:=AValue;
-  ToolButtonBackFillGrad.ImageIndex := 2+ord(FBackGradType);
-  if not FUpdatingFromShape and (backFillType = vftGradient) then
-    UpdateShapeBackFill;
-end;
-
-procedure TForm1.SetBackTexRepetition(AValue: TTextureRepetition);
-var
-  glyph: TBitmap;
-begin
-  if FBackTexRepetition=AValue then Exit;
-  FBackTexRepetition:=AValue;
-  glyph := TBitmap.Create;
-  glyph.Width := FillImageList16.Width;
-  glyph.Height := FillImageList16.Height;
-  glyph.Canvas.Brush.Color := MergeBGRA(ColorToBGRA(ButtonBackGradInterp.StateNormal.Background.Gradient1.EndColor),
-                                        ColorToBGRA(ButtonBackGradInterp.StateNormal.Background.Gradient2.StartColor));
-  glyph.Canvas.FillRect(0,0,glyph.Width,glyph.Height);
-  FillImageList16.Draw(glyph.Canvas,0,0,17+ord(FBackTexRepetition));
-  ButtonBackTexRepeat.Glyph.Assign(glyph);
-  glyph.Free;
-  if not FUpdatingFromShape and (backFillType = vftTexture) then
-    UpdateShapeBackFill;
 end;
 
-procedure TForm1.SetBackTexture(AValue: TBGRABitmap);
-var
-  thumb: TBGRABitmap;
-  bmpThumb: TBitmap;
+procedure TForm1.OnBackFillChange(ASender: TObject);
 begin
-  if AValue = FBackTexture then exit;
-
-  if Assigned(FBackTexture) then
-  begin
-    FBackTexture.FreeReference;
-    FBackTexture := nil;
-  end;
-  if Assigned(AValue) then
-    FBackTexture := AValue.NewReference as TBGRABitmap;
-
-  if Assigned(FBackTexture) then
-  begin
-    thumb := GetBitmapThumbnail(FBackTexture, BackImage.Width,BackImage.Height,BGRAPixelTransparent,true);
-    try
-      bmpThumb := thumb.MakeBitmapCopy(clBtnFace);
-      try
-        BackImage.Picture.Assign(bmpThumb);
-      finally
-        bmpThumb.Free;
-      end;
-    finally
-      thumb.Free;
-    end;
-    BackImage.Visible := true;
-  end else
-  begin
-    BackImage.Picture.Clear;
-    BackImage.Visible := false;
-  end;
-
-  if not FUpdatingFromShape and (backFillType = vftTexture) then
+  if not FUpdatingFromShape then
     UpdateShapeBackFill;
 end;
 
@@ -1587,26 +1176,25 @@ begin
 
     if vsfBackFill in f then
     begin
-      backFillType:= AShape.BackFill.FillType;
-      case backFillType of
+      FBackFillIntf.FillType := AShape.BackFill.FillType;
+      case FBackFillIntf.FillType of
         vftTexture:
           begin
             texSource := AShape.BackFill.Texture;
-            if Assigned(texSource) then backTexture := texSource;
-            UpDownBackTexAlpha.Value := AShape.BackFill.TextureOpacity;
-            backTextureRepetition:= AShape.BackFill.TextureRepetition;
+            if Assigned(texSource) then FBackFillIntf.Texture := texSource;
+            FBackFillIntf.TextureOpacity:= AShape.BackFill.TextureOpacity;
+            FBackFillIntf.TextureRepetition:= AShape.BackFill.TextureRepetition;
           end;
-        vftSolid: backColor := AShape.BackFill.SolidColor;
+        vftSolid: FBackFillIntf.SolidColor := AShape.BackFill.SolidColor;
         vftGradient:
           begin
-            backGradStartColor := AShape.BackFill.Gradient.StartColor;
-            backGradEndColor := AShape.BackFill.Gradient.EndColor;
-            backGradType:= AShape.BackFill.Gradient.GradientType;
-            backGradRepetition:= AShape.BackFill.Gradient.Repetition;
-            backGradInterp := AShape.BackFill.Gradient.ColorInterpolation;
+            FBackFillIntf.GradStartColor := AShape.BackFill.Gradient.StartColor;
+            FBackFillIntf.GradEndColor := AShape.BackFill.Gradient.EndColor;
+            FBackFillIntf.GradientType:= AShape.BackFill.Gradient.GradientType;
+            FBackFillIntf.GradRepetition:= AShape.BackFill.Gradient.Repetition;
+            FBackFillIntf.GradInterpolation := AShape.BackFill.Gradient.ColorInterpolation;
           end;
       end;
-      UpdateBackComponentsVisibility;
     end;
 
     if AShape is TCurveShape then
@@ -1642,7 +1230,7 @@ begin
       showPhongStyle:= false;
     end;
   end;
-  UpdateBackComponentsVisibility;
+  UpdateBackToolFillPoints;
   UpDownPenWidth.Enabled := vsfPenWidth in f;
   ButtonPenStyle.Enabled:= vsfPenStyle in f;
   EnableDisableToolButtons([ToolButtonJoinRound,ToolButtonJoinBevel,ToolButtonJoinMiter], vsfJoinStyle in f);
@@ -1744,7 +1332,7 @@ begin
   if not IsCreateShapeTool(currentTool) then
     raise exception.Create('No shape type selected');
   result := PaintToolClass[currentTool].Create(vectorOriginal);
-  if (result is TCustomPolypointShape) and (backFillType = vftGradient) then backFillType := vftSolid;
+  if (result is TCustomPolypointShape) and (FBackFillIntf.FillType = vftGradient) then FBackFillIntf.FillType := vftSolid;
   result.PenColor := penColor;
   result.PenWidth := penWidth;
   result.PenStyle := penStyle;
@@ -1776,26 +1364,26 @@ var
   rF: TRectF;
   sx,sy: single;
 begin
-  if backFillType = vftSolid then
-    result := TVectorialFill.CreateAsSolid(FBackColor)
-  else if (backFillType = vftTexture) and Assigned(backTexture) then
+  if FBackFillIntf.FillType = vftSolid then
+    result := TVectorialFill.CreateAsSolid(FBackFillIntf.SolidColor)
+  else if (FBackFillIntf.FillType = vftTexture) and Assigned(FBackFillIntf.Texture) then
   begin
     rF := AShape.GetRenderBounds(InfiniteRect,AffineMatrixIdentity,[rboAssumeBackFill]);
-    if not (FBackTexRepetition in [trRepeatX,trRepeatBoth]) and (rF.Width <> 0) and (backTexture.Width > 0) then
-      sx:= rF.Width/backTexture.Width else sx:= 1;
-    if not (FBackTexRepetition in [trRepeatY,trRepeatBoth]) and (rF.Height <> 0) and (backTexture.Height > 0) then
-      sy:= rF.Height/backTexture.Height else sy:= 1;
+    if not (FBackFillIntf.TextureRepetition in [trRepeatX,trRepeatBoth]) and (rF.Width <> 0) and (FBackFillIntf.Texture.Width > 0) then
+      sx:= rF.Width/FBackFillIntf.Texture.Width else sx:= 1;
+    if not (FBackFillIntf.TextureRepetition in [trRepeatY,trRepeatBoth]) and (rF.Height <> 0) and (FBackFillIntf.Texture.Height > 0) then
+      sy:= rF.Height/FBackFillIntf.Texture.Height else sy:= 1;
 
-    result := TVectorialFill.CreateAsTexture(backTexture,
+    result := TVectorialFill.CreateAsTexture(FBackFillIntf.Texture,
                  AffineMatrixTranslation(rF.TopLeft.x,rF.TopLeft.y)*
                  AffineMatrixScale(sx,sy),
-                 UpDownBackTexAlpha.Value, FBackTexRepetition);
+                 FBackFillIntf.TextureOpacity, FBackFillIntf.TextureRepetition);
   end
-  else if backFillType = vftGradient then
+  else if FBackFillIntf.FillType = vftGradient then
   begin
     grad := TBGRALayerGradientOriginal.Create;
-    grad.StartColor := FBackGradStartColor;
-    grad.EndColor := FBackGradEndColor;
+    grad.StartColor := FBackFillIntf.GradStartColor;
+    grad.EndColor := FBackFillIntf.GradEndColor;
     if Assigned(AShape) then
     begin
       rF := AShape.GetRenderBounds(rect(0,0,img.Width,img.Height),vectorTransform,[rboAssumeBackFill]);
@@ -1803,9 +1391,9 @@ begin
     end
     else
       rF := rectF(0,0,img.Width,img.Height);
-    grad.GradientType:= FBackGradType;
-    grad.Repetition := FBackGradRepetition;
-    grad.ColorInterpolation:= FBackGradInterp;
+    grad.GradientType:= FBackFillIntf.GradientType;
+    grad.Repetition := FBackFillIntf.GradRepetition;
+    grad.ColorInterpolation:= FBackFillIntf.GradInterpolation;
     if grad.GradientType = gtLinear then
     begin
       grad.Origin := rF.TopLeft;
@@ -1855,20 +1443,14 @@ begin
   end;
 end;
 
-procedure TForm1.UpdateBackComponentsVisibility;
+procedure TForm1.UpdateBackToolFillPoints;
 var
   canEdit: Boolean;
 begin
-  ShapeBackColor.Visible := backFillType = vftSolid;
-  UpDownBackAlpha.Visible := backFillType = vftSolid;
-  PanelBackFillGrad.Visible:= backFillType = vftGradient;
-  PanelBackFillTex.Visible := backFillType = vftTexture;
-  canEdit := (backFillType in[vftGradient,vftTexture]) and
+  canEdit := (FBackFillIntf.FillType in[vftGradient,vftTexture]) and
     Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape);
   ButtonMoveBackFillPoints.Enabled := canEdit;
-  ButtonBackTexAdjust.Enabled := canEdit;
   if (currentTool = ptMoveBackFillPoint) and not canEdit then currentTool:= ptHand;
-  if backFillType <> vftTexture then backTexture := nil;
 end;
 
 procedure TForm1.UpdateShapeBackFill;
@@ -1878,21 +1460,21 @@ begin
   if Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape) and
     (vsfBackFill in vectorOriginal.SelectedShape.Fields) then
   begin
-    if (backFillType = vftTexture) and (UpDownBackTexAlpha.Value = 0) then
+    if (FBackFillIntf.FillType = vftTexture) and (FBackFillIntf.TextureOpacity = 0) then
       vectorFill := nil else
-    if (backFillType = vftTexture) and (vectorOriginal.SelectedShape.BackFill.FillType = vftTexture) then
+    if (FBackFillIntf.FillType = vftTexture) and (vectorOriginal.SelectedShape.BackFill.FillType = vftTexture) then
     begin
-      vectorFill := TVectorialFill.CreateAsTexture(FBackTexture, vectorOriginal.SelectedShape.BackFill.TextureMatrix,
-                                                   UpDownBackTexAlpha.Value, FBackTexRepetition);
+      vectorFill := TVectorialFill.CreateAsTexture(FBackFillIntf.Texture, vectorOriginal.SelectedShape.BackFill.TextureMatrix,
+                                                   FBackFillIntf.TextureOpacity, FBackFillIntf.TextureRepetition);
     end
-    else if (backFillType = vftGradient) and (vectorOriginal.SelectedShape.BackFill.FillType = vftGradient) then
+    else if (FBackFillIntf.FillType = vftGradient) and (vectorOriginal.SelectedShape.BackFill.FillType = vftGradient) then
     begin
       vectorFill := vectorOriginal.SelectedShape.BackFill.Duplicate;
-      vectorFill.Gradient.StartColor := FBackGradStartColor;
-      vectorFill.Gradient.EndColor := FBackGradEndColor;
-      vectorFill.Gradient.GradientType := FBackGradType;
-      vectorFill.Gradient.Repetition := FBackGradRepetition;
-      vectorFill.Gradient.ColorInterpolation:= FBackGradInterp;
+      vectorFill.Gradient.StartColor := FBackFillIntf.GradStartColor;
+      vectorFill.Gradient.EndColor := FBackFillIntf.GradEndColor;
+      vectorFill.Gradient.GradientType := FBackFillIntf.GradientType;
+      vectorFill.Gradient.Repetition := FBackFillIntf.GradRepetition;
+      vectorFill.Gradient.ColorInterpolation:= FBackFillIntf.GradInterpolation;
     end else
       vectorFill := CreateBackFill(vectorOriginal.SelectedShape);
 
@@ -1928,11 +1510,7 @@ begin
   EditCopy.Enabled := AShape <> nil;
   EditCut.Enabled := AShape <> nil;
   EditDelete.Enabled := AShape <> nil;
-end;
-
-procedure TForm1.OnClickBackTexRepeat(ASender: TObject);
-begin
-  backTextureRepetition := TTextureRepetition((ASender as TMenuItem).Tag);
+  FBackFillIntf.CanAdjustToShape := AShape <> nil;
 end;
 
 procedure TForm1.RemoveShapeIfEmpty(AShape: TVectorShape);
@@ -1958,31 +1536,6 @@ begin
   FInRemoveShapeIfEmpty := false;
 end;
 
-procedure TForm1.DoLoadTex;
-var
-  newTex: TBGRABitmap;
-begin
-  if OpenPictureDialog1.Execute then
-  begin
-    try
-      newTex := TBGRABitmap.Create(OpenPictureDialog1.FileName, true);
-      backTexture := newTex;
-      newTex.FreeReference;
-      backFillType:= vftTexture;
-    except
-      on ex: exception do
-        ShowMessage(ex.Message);
-    end;
-  end;
-  if (backFillType = vftTexture) and (backTexture = nil) then
-  begin
-    if Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape) then
-      UpdateToolbarFromShape(vectorOriginal.SelectedShape)
-    else
-      backFillType:= vftNone;
-  end;
-end;
-
 function TForm1.VirtualScreenToImgCoord(X, Y: Integer): TPointF;
 begin
   result := AffineMatrixTranslation(-0.5,-0.5)*AffineMatrixInverse(zoom)*AffineMatrixTranslation(0.5,0.5)*PointF(X,Y);
@@ -2004,6 +1557,18 @@ begin
   end;
 end;
 
+procedure TForm1.RequestBackFillAdjustToShape(Sender: TObject);
+var
+  vectorFill: TVectorialFill;
+begin
+  if Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape) then
+  begin
+    vectorFill := CreateBackFill(vectorOriginal.SelectedShape);
+    vectorOriginal.SelectedShape.BackFill := vectorFill;
+    vectorFill.Free;
+  end;
+end;
+
 procedure TForm1.DoCopy;
 begin
   if Assigned(vectorOriginal) and Assigned(vectorOriginal.SelectedShape) then

+ 142 - 1
vectoredit/vectorimages.lrs

@@ -1,3 +1,144 @@
+LazarusResources.Add('movegradpoint32','LZP',[
+  'LazPaint'#0#0#0#0'0'#0#0#0' '#0#0#0' '#0#0#0#1#0#0#0'n'#3#0#0#0#0#0#0#2#1#0#0
+  +#0#0#0#0'+'#7#0#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0' '#0#0#0' '#8#6#0
+  +#0#0'szz'#244#0#0#3#5'IDATx'#156'c`'#24#132' '#0#136#15#2#241'w(>'#8#21#163
+  +#11#232#6#226#255'8p7'#173'-'#7#249#242#191#130#130#220#255#157#219#214#253
+  +#255#254#249'%'#24#131#216' 1'#168'#h'#26#18#160#160#6'['#248#255#247#7#20#12
+  +#18#3#201#241'I'#5#254'W'#176#217'E.'#190'L'#200#1#223'@'#150'|'#255#252#2'l'
+  +#233#161#253#219#255#31#220#183#13#204#6#137#129#228'X8'#164'(q'#192#127#146
+  +#28#0'bsqq'#254#223#181'}='#220#1'l\'#226#255#245'<V'#252'7'#244'^'#245#223
+  +#196'o'#205#127#179#192'u'#255'-C6'#254#183#14#219#252#223'6r'#235#127#251
+  +#232#237#255#157#226'v'#254'wI'#220#253#223'-y'#239#127#143#212#253#255#189
+  +'2'#14#18#237#0#148'(`'#128'&>'#144'#'#218'['#235#193'l'#17'yO'#146'-'#247
+  +#201':L'#180#3'P'#18'!'#204#1#156#156#156#255#153#153#153#193'lu'#155#14#146
+  +'-'#247#203'9J'#180#3'@'#0'#'#27#130#162#0#226#8#214#255'j'#150'u$['#30#144
+  +#127#156'$'#7'0H'#25'L'#5#167'v'#152#3#192#185#0#234#8#22#22#246#255#154#182
+  +#141'$Y'#30'Tx'#146'4'#7' )'#134';'#0#221#17':'#142'-D['#30'\|'#154':'#14'@q'
+  +#4'+'#251#127#3#151'v'#162','#15'-=K='#7#160';'#194#216#163#147#160#229#225
+  +#229#231#169#235#0'TGp'#252'7'#243#233#193'kyd'#213#5#234';'#0#221#17#150#254
+  +#253'8-'#143#170#185'D'#27#7#160';'#194'&h'#18'V'#203'c'#234#174#208#206#1' '
+  +#188#11#201#17'v'#161#211'0,'#143'k'#184'F['#7#128#240#142#173'k!'#149#21#208
+  +#17#142#145'3P,'#143'o'#186'A'#27#7#188#127#243#240#255#210'E'#179#255#23#21
+  +'d'#255#215#210#212'@'#212#29'|'#226#255#163#170'/'#192'-Ol'#185'E'#27#7#172
+  +']'#181#24#165#200#150'Uw'#254'o'#228'R'#242#223'=q1'#138#229#201'mw'#168#227
+  +#128'c'#135'w'#253'?qt/'#156#255#236#241'Mp'#220's'#242#136#254#15','#216#135
+  +#17#236'0'#203'S:'#238'R'#230#128#151'Oo'#255'/)'#202#5#179'%$$'#254#191'}y'
+  +#31#238#136#178#146'|'#176#184'C'#196'T'#156#150#167'u'#221#167#204#1#10#10
+  +#242'`'#154#153#133#3'L'#207#157'5'#5#238#128#243#167#15'A'#131#223#233#127
+  +'\'#253'U'#172#150#167#247'<'#164#204#1#160#148#173'k_'#248#223'5~%'#152#173
+  +#165#169#254#255#235#199'g`'#7#252#251#245#254#191#191#159#23'X'#157'o'#230
+  +'z'#172#150'g'#246'=&'#207#1#146#202#14#255#165'U'#157#255#187#196#173#132
+  +#151'p'#154#22'I`'#203#214#174'^'#12#15#133#173#155'V'#129#197'tmS'#177'Z'
+  +#158#221#255#148'<'#7'(X'#239#0#226#237'('#141'Ji'#227#185'`'#203#236'l'#173
+  +#254#255#250#246#6#236#128'o'#159#158#255'WVV'#4'6X'#216#255#203#154#173#160
+  +#168'Q'#10's'#192'e|'#134#240'J@'#130'|'#225#188#233#255#231#205#153#250#223
+  +#195#221#5#30']b'#154#245#20'5'#203#137#5'!'#12#12#24#189#166#135'@'#220#11
+  +#196'R'#212#178#4#31'`'#2#226'sH'#150'Z'#0'1#=,Fw'#4#221'-'#165#9#0#0#175#131
+  +'E'#30#8#213'K'#134#0#0#0#0'IEND'#174'B`'#130' '#0#0#0' '#0#0#0#7#0#0#0'Prev'
+  +'iew'#16#141#0#0#0'$'#0#134'P'#193#247#247#193'P'#25#0#1#139'u'#1#139#23#0#1
+  +'Pw'#1'P'#22#0#1#193#23#255#1#211'f'#1#246#24#255'f'#1#246#24#255'f'#1#193#24
+  +#255'f'#1'P'#24#255'g'#1#139#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255
+  +'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23
+  +#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#1#211#21#255#1#211
+  +#17#0'A'#12'T'#255#225#141#1#26#24#0#134#2#206#225#141'8'#1#27#0#130#2#1'1'#0
+  +#224'z'#0#0#0#142#0' '#185#247#255#14' '#247#194#193#4#10#186#6#205'.'#187
+  +#171#170#171#170#170#129' '#135#20'L'#9#3'''N'#3'&P'#26#185#4')R,S'#4'0U3W'#4
+  +'6Y9Z<\>^'#184'A_'#239#165'r*'#10'Za'#173#29'2Gc'#198#200#230#9'Qd'#233't'#24
+  +#237'v@f '#3#157#207#29'^g-E*'#245#254'OMi'#25#27'D)'#173#181'-k  '#27'>'#250
+  +#246'#'#3#29#13#161#158'H'#22#224'z'#0#0#0#142#0' '#182#243#251#26'<'#243#191
+  +#190#8#10#183#10#205'H'#187#187#171#171#186#171#129' '#133#31'j'#9#3'<l'#3'9'
+  +'o0'#183#4'=qAs'#5'DuHw'#5'LzO|R~U'#128#181'Y'#130#236#162'p)'#14'{'#132#170
+  +'''Da'#134#195#197#227#12'p'#136#229'r'#24#233'tX'#138' '#4#154#203''''#127
+  +#140'?_)'#241#250'Ni'#142'#%^8'#171#178'='#143';;3='#246#242'#'#3'6'#24#158
+  +#156'G)'#224'z'#0#0#0#142#0#30#174#233#240'Q'#186#232#183#182#26#9#175#23#205
+  +#168#170#171#170#170#170#170#129' '#127'I'#195#9#3#136#197#5'~'#199#149#175#7
+  +#129#201#132#203#7#135#205#137#207#8#140#208#143#210#146#212#150#214#173#152
+  +#216#225#155'k('#23#208#218#163'Ct'#163#220#186#189#217#21#190#221#219'm'#24
+  +#223'o'#149#223#31#8#148#194'B'#213#225'q'#169''''#230#239'J'#175#227'@C'#169
+  +'b'#163#170'e'#229#184#183#157':'#236#231'!'#7#168'J'#151#149'D'#127#224#154
+  +#1#0#0'o'#198#1#153#135'pcA'#12#2#4#2#0#1#5#15#6'a'#231#229#201';'#16#1#10#15
+  +#6'a'#227#245'@'#196#11#147#16#206#13#153#153#153#153#153#153#144#200#6#130
+  +#138#164#128#132#11#27#0#28#205#15#153#153#153#153#153#155#200#6#130#137#150
+  +#128#132#30#31#0' '#205#16#153#153#153#153#153#188#130#6#6'd'#132#12#30'"#'
+  +#205#17#153#153#153#153#155#203#139#6#6'%'#5#0#0#4'&'#30'''('#204#19#153#153
+  +#153#155#203#208'A'#23#6#0#4'&'#131#30'''*'#203#21#153#153#155#203#218'A'''#6
+  +#0#4'&'#131#30',-'#202#23#153#155#203#218#176'A7'#6#0#4'&'#131#30',/'#201#25
+  ,#155#203#218#186#4#6'a'#5#4#132'&'#30'12'#200#29#203#218#186#176#4#6'a'#6#4
+  +#132'&'#30'14'#199'$'#218#186#186#4#6'a'#7#4#132'&'#30'16'#198'+'#186#186#160
+  +#4#6'a'#8#4#132#12#30'18'#229#27#170#160#4#6'a'#9#4#131':'#0'1'#229#162#170
+  +#176#4#6'a'#6#4#228#153#153#132#0#0'AB'#227#27#240#4#6'a'#6#4#1'Db'#227#169
+  +#144#132'9<CHA'#23#6#0#4'I'#135'J'#4#4'K'#30'LM'#199'5'#170#191#222'A'#7#6#0
+  +'OP'#136#0'QR'#4#4'S'#0'T'#199'7'#171#253#239'A'#7#6#0'V'#0#137'W'#0'X'#4#4
+  +'Y'#0'Z['#198'<'#253#239#240'A'#7#6#0'1]'#137'^1_`'#4'ab'#0'c'#197'C'#222#255
+  +#1'd'#4#6#195'e'#153#144')+h'#0'i'#4#4'j'#0'kHNU\dl'#4#6#130'mn'#3#6#133'o'#0
+  +'pq'#4#196'r'#153#144#15#6#136'v'#0'wxy'#0#0'z'#7#6'o'#224'TBGRALayeredBitma'
+  +'p'#26#0#28#0#0#0#1#0#0#0#0#0#0#0#3#0#0#0' '#0#0#0' '#0#0#0'<'#4#0#0#0#0#0#0
+  +'H'#0#0#0#1#0#0#0#1#0#0#0#0#0#0#0#0#0#0#0#3#0#0#0#255#255#0#0#188#3#0#0#0#0#0
+  +#0#156#21#191#183#226#215'F'#19#134'i'#221'H3'#199#31#213#0#0#128'?'#0#0#0#0
+  +#0#0#0#0#0#0#0#0#0#0#128'?'#0#0#0#0' '#0#0#0' '#0#0#0#6#0#0#0'Layer1'#16#141
+  +#0#0#0'$'#0#134'P'#193#247#247#193'P'#25#0#1#139'u'#1#139#23#0#1'Pw'#1'P'#22
+  +#0#1#193#23#255#1#211'f'#1#246#24#255'f'#1#246#24#255'f'#1#193#24#255'f'#1'P'
+  +#24#255'g'#1#139#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'
+  +#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#23#255
+  +'h'#23#255'h'#23#255'h'#23#255'h'#23#255'h'#1#211#21#255#1#211#17#0'A'#12'T'
+  +#255#225#141#1#26#24#0#134#2#206#225#141'8'#1#27#0#130#2#1'1'#0#224'z'#0#0#0
+  +#142#0' '#185#247#255#14' '#247#194#193#4#10#186#6#205'.'#187#171#170#171#170
+  +#170#129' '#135#20'L'#9#3'''N'#3'&P'#26#185#4')R,S'#4'0U3W'#4'6Y9Z<\>^'#184
+  +'A_'#239#165'r*'#10'Za'#173#29'2Gc'#198#200#230#9'Qd'#233't'#24#237'v@f '#3
+  +#157#207#29'^g-E*'#245#254'OMi'#25#27'D)'#173#181'-k  '#27'>'#250#246'#'#3#29
+  +#13#161#158'H'#22#224'z'#0#0#0#142#0' '#182#243#251#26'<'#243#191#190#8#10
+  +#183#10#205'H'#187#187#171#171#186#171#129' '#133#31'j'#9#3'<l'#3'9o0'#183#4
+  +'=qAs'#5'DuHw'#5'LzO|R~U'#128#181'Y'#130#236#162'p)'#14'{'#132#170'''Da'#134
+  +#195#197#227#12'p'#136#229'r'#24#233'tX'#138' '#4#154#203''''#127#140'?_)'
+  +#241#250'Ni'#142'#%^8'#171#178'='#143';;3='#246#242'#'#3'6'#24#158#156'G)'
+  +#224'z'#0#0#0#142#0#30#174#233#240'Q'#186#232#183#182#26#9#175#23#205#168#170
+  +#171#170#170#170#170#129' '#127'I'#195#9#3#136#197#5'~'#199#149#175#7#129#201
+  +#132#203#7#135#205#137#207#8#140#208#143#210#146#212#150#214#173#152#216#225
+  +#155'k('#23#208#218#163'Ct'#163#220#186#189#217#21#190#221#219'm'#24#223'o'
+  +#149#223#31#8#148#194'B'#213#225'q'#169''''#230#239'J'#175#227'@C'#169'b'#163
+  +#170'e'#229#184#183#157':'#236#231'!'#7#168'J'#151#149'D'#127#224#154#1#0#0
+  +'o'#198#1#153#135'pcA'#12#2#4#2#0#1#5#15#6'a'#231#229#201';'#16#1#10#15#6'a'
+  +#227#245'@'#196#11#147#16#206#13#153#153#153#153#153#153#144#200#6#130#138
+  +#164#128#132#11#27#0#28#205#15#153#153#153#153#153#155#200#6#130#137#150#128
+  +#132#30#31#0' '#205#16#153#153#153#153#153#188#130#6#6'd'#132#12#30'"#'#205
+  +#17#153#153#153#153#155#203#139#6#6'%'#5#0#0#4'&'#30'''('#204#19#153#153#153
+  +#155#203#208'A'#23#6#0#4'&'#131#30'''*'#203#21#153#153#155#203#218'A'''#6#0#4
+  +'&'#131#30',-'#202#23#153#155#203#218#176'A7'#6#0#4'&'#131#30',/'#201#25#155
+  +#203#218#186#4#6'a'#5#4#132'&'#30'12'#200#29#203#218#186#176#4#6'a'#6#4#132
+  +'&'#30'14'#199'$'#218#186#186#4#6'a'#7#4#132'&'#30'16'#198'+'#186#186#160#4#6
+  +'a'#8#4#132#12#30'18'#229#27#170#160#4#6'a'#9#4#131':'#0'1'#229#162#170#176#4
+  +#6'a'#6#4#228#153#153#132#0#0'AB'#227#27#240#4#6'a'#6#4#1'Db'#227#169#144#132
+  +'9<CHA'#23#6#0#4'I'#135'J'#4#4'K'#30'LM'#199'5'#170#191#222'A'#7#6#0'OP'#136
+  +#0'QR'#4#4'S'#0'T'#199'7'#171#253#239'A'#7#6#0'V'#0#137'W'#0'X'#4#4'Y'#0'Z['
+  +#198'<'#253#239#240'A'#7#6#0'1]'#137'^1_`'#4'ab'#0'c'#197'C'#222#255#1'd'#4#6
+  +#195'e'#153#144')+h'#0'i'#4#4'j'#0'kHNU\dl'#4#6#130'mn'#3#6#133'o'#0'pq'#4
+  +#196'r'#153#144#15#6#136'v'#0'wxy'#0#0'z'#7#6'o'#224'TMemDirectory'#26#0#0'&'
+  +#4#0#0#0#0#0#0#25#0#0#0#0#0#0#0'3vectorrect203cbaff2bevelgradient002291ff,80'
+  +'aafefflinear4,432,32RGBpad'#7#0#0#0#0#128#5#8'9'#0#0#0#0#0#0#0'class'#0#128
+  +#6#17'A'#0#0#0#0#0#0#0'colors'#0#128#13#6'R'#0#0#0#0#0#0#0'gradient-type'#0
+  +#128#6#3'X'#0#0#0#0#0#0#0'origin'#0#128#6#5'['#0#0#0#0#0#0#0'x-axis'#0#128#19
+  +#3'`'#0#0#0#0#0#0#0'color-interpolation'#0#128#10#3'c'#0#0#0#0#0#0#0'repetit'
+  +'ion15,15.525.5,15.515,26.5'#9#0#0#0#0#128#5#4''''#0#0#0#0#0#0#0'class'#0#128
+  +#9#8'+'#0#0#0#0#0#0#0'pen-color'#0#128#9#1'3'#0#0#0#0#0#0#0'pen-width'#0#128
+  +#9#0'4'#0#0#0#0#0#0#0'pen-style'#0#128#10#5'4'#0#0#0#0#0#0#0'join-style'#1
+  +#128#9#153'f'#0#0#0#0#0#0#0'back-fill'#0#128#6#7#255#0#0#0#0#0#0#0'origin'#0
+  +#128#6#9#6#1#0#0#0#0#0#0'x-axis'#0#128#6#7#15#1#0#0#0#0#0#0'y-axisellipsebla'
+  +'ck2fffbf0ff6.5,5.510.5,5.56.5,9.5'#8#0#0#0#0#128#5#7#203#1#0#0#0#0#0#0'clas'
+  +'s'#0#128#9#5#210#1#0#0#0#0#0#0'pen-color'#0#128#9#1#215#1#0#0#0#0#0#0'pen-w'
+  +'idth'#0#128#9#0#216#1#0#0#0#0#0#0'pen-style'#0#128#10#8#216#1#0#0#0#0#0#0'b'
+  +'ack-color'#0#128#6#7#224#1#0#0#0#0#0#0'origin'#0#128#6#8#231#1#0#0#0#0#0#0
+  ,'x-axis'#0#128#6#7#239#1#0#0#0#0#0#0'y-axispolylineblack2bevelfffbf0ff6.5,6.'
+  +'5,10.5,13.5,18,15,19.56,24.5,22,28.5,27,20,19true'#9#0#0#0#0#128#5#8#150#2#0
+  +#0#0#0#0#0'class'#0#128#9#5#158#2#0#0#0#0#0#0'pen-color'#0#128#9#1#163#2#0#0
+  +#0#0#0#0'pen-width'#0#128#9#0#164#2#0#0#0#0#0#0'pen-style'#0#128#10#5#164#2#0
+  +#0#0#0#0#0'join-style'#0#128#10#8#169#2#0#0#0#0#0#0'back-color'#0#128#1#28
+  +#177#2#0#0#0#0#0#0'x'#0#128#1#23#205#2#0#0#0#0#0#0'y'#0#128#6#4#228#2#0#0#0#0
+  +#0#0'closed'#5#0#0#0#0#128#5#1' '#0#0#0#0#0#0#0'count'#0#128#5#6'!'#0#0#0#0#0
+  +#0#0'class'#1#128#6#181#22#1#0#0#0#0#0#0'shape1'#1#128#6#160#246#1#0#0#0#0#0
+  +#0'shape2'#1#128#6#172#232#2#0#0#0#0#0#0'shape3'#1#0#0#0#1#128'&\'#148#3#0#0
+  +#0#0#0#0'{9C15BFB7-E2D7-4613-8669-DD4833C71FD5}'#1#0#0#0#1#128#9'6'#240#3#0#0
+  +#0#0#0#0'originals'
+]);
 LazarusResources.Add('movetoback32','LZP',[
   'LazPaint'#0#0#0#0'0'#0#0#0' '#0#0#0' '#0#0#0#1#0#0#0#150#3#0#0#0#0#0#0#2#1#0
   +#0#0#0#0#0'8'#7#0#0#137'PNG'#13#10#26#10#0#0#0#13'IHDR'#0#0#0' '#0#0#0' '#8#6
@@ -2520,5 +2661,5 @@ LazarusResources.Add('movedown32','LZP',[
 LazarusResources.Add('vectorimages','LST',[
   'filenew32.LZP,fileopen32.LZP,filesave32.LZP,filesaveas32.LZP,moveup32.LZP,mo'
   +'vedown32.LZP,movetofront32.LZP,movetoback32.LZP,copy32.LZP,paste32.LZP,cut3'
-  +'2.LZP,delete32.LZP'
+  +'2.LZP,delete32.LZP,movegradpoint32.LZP'
 ]);

+ 1 - 1
vectoredit/vectorimages.lst

@@ -10,4 +10,4 @@ copy32.LZP
 paste32.LZP
 cut32.LZP
 delete32.LZP
-
+movegradpoint32.LZP

二进制
vectoredit/vectorimages24.png


部分文件因为文件数量过多而无法显示