diff --git a/Demo/Source/StyleBook1.style b/Demo/Source/StyleBook1.style new file mode 100644 index 0000000..900b156 --- /dev/null +++ b/Demo/Source/StyleBook1.style @@ -0,0 +1,397 @@ +object TStyleContainer + object TLayout + StyleName = 'ListBoxItem1Style1' + Align = Center + Size.Width = 150.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + Visible = False + TabOrder = 38 + object TGlyph + StyleName = 'glyphstyle' + Margins.Left = 2.000000000000000000 + Margins.Top = 1.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 1.000000000000000000 + Align = Left + Size.Width = 32.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + end + object TActiveStyleTextObject + StyleName = 'text' + Align = Client + Margins.Left = 3.000000000000000000 + Margins.Top = 1.000000000000000000 + Margins.Right = 3.000000000000000000 + Margins.Bottom = 1.000000000000000000 + Size.Width = 144.000000000000000000 + Size.Height = 30.000000000000000000 + Size.PlatformDefault = False + Text = 'Text' + TextSettings.WordWrap = False + TextSettings.HorzAlign = Leading + ShadowVisible = False + ActiveTrigger = Selected + ActiveColor = claBlack + end + object TCheckBox + StyleName = 'check' + Align = Left + CanFocus = False + DisableFocusEffect = True + Size.Width = 20.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'ListBoxItem1Style1CheckBoxStyle1' + Visible = False + end + object TLayout + StyleName = 'accessorymore' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 11.000000000000000000 + Size.Height = 16.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 135.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 146.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 202.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 218.000000000000000000 + SourceRect.Bottom = 561.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 270.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 292.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 135.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 146.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 202.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 218.000000000000000000 + SourceRect.Bottom = 561.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 270.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 292.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + object TLayout + StyleName = 'accessorycheckmark' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 17.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 151.000000000000000000 + SourceRect.Top = 357.000000000000000000 + SourceRect.Right = 168.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 226.000000000000000000 + SourceRect.Top = 536.000000000000000000 + SourceRect.Right = 252.000000000000000000 + SourceRect.Bottom = 562.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 302.000000000000000000 + SourceRect.Top = 714.000000000000000000 + SourceRect.Right = 336.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 151.000000000000000000 + SourceRect.Top = 357.000000000000000000 + SourceRect.Right = 168.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 226.000000000000000000 + SourceRect.Top = 536.000000000000000000 + SourceRect.Right = 252.000000000000000000 + SourceRect.Bottom = 562.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 302.000000000000000000 + SourceRect.Top = 714.000000000000000000 + SourceRect.Right = 336.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + object TLayout + StyleName = 'accessorydetail' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 17.000000000000000000 + Size.Height = 15.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 173.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 190.000000000000000000 + SourceRect.Bottom = 373.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 260.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 286.000000000000000000 + SourceRect.Bottom = 559.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 346.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 380.000000000000000000 + SourceRect.Bottom = 746.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 173.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 190.000000000000000000 + SourceRect.Bottom = 373.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 260.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 286.000000000000000000 + SourceRect.Bottom = 559.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 346.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 380.000000000000000000 + SourceRect.Bottom = 746.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + end + object TLayout + StyleName = 'ListBoxItem1Style1CheckBoxStyle1' + Align = Center + Size.Width = 150.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + Visible = False + TabOrder = 18 + object TLayout + Align = Left + Size.Width = 18.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + object TCheckStyleObject + StyleName = 'background' + Align = Center + CapMode = Tile + Locked = True + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 13.000000000000000000 + Size.Height = 13.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Checked + ActiveLink = < + item + SourceRect.Left = 31.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 44.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 46.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 65.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 62.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 88.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 3.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 16.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 4.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 23.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 6.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 32.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + HotLink = < + item + SourceRect.Left = 17.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 30.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 25.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 44.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 34.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 60.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + ActiveHotLink = < + item + SourceRect.Left = 45.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 58.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 67.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 86.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 90.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 116.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + FocusedLink = < + item + SourceRect.Left = 17.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 30.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 25.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 44.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 34.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 60.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + ActiveFocusedLink = < + item + SourceRect.Left = 45.000000000000000000 + SourceRect.Top = 146.000000000000000000 + SourceRect.Right = 58.000000000000000000 + SourceRect.Bottom = 159.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 67.000000000000000000 + SourceRect.Top = 219.000000000000000000 + SourceRect.Right = 86.000000000000000000 + SourceRect.Bottom = 238.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 90.000000000000000000 + SourceRect.Top = 292.000000000000000000 + SourceRect.Right = 116.000000000000000000 + SourceRect.Bottom = 318.000000000000000000 + end> + end + end + object TButtonStyleTextObject + StyleName = 'text' + Align = Client + Locked = True + Margins.Left = 3.000000000000000000 + Size.Width = 129.000000000000000000 + Size.Height = 32.000000000000000000 + Size.PlatformDefault = False + ShadowVisible = False + HotColor = claBlack + FocusedColor = claBlack + NormalColor = claBlack + PressedColor = claBlack + end + end +end diff --git a/Demo/Source/UMainFMX.fmx b/Demo/Source/UMainFMX.fmx index d7a745f..cb80fb4 100644 --- a/Demo/Source/UMainFMX.fmx +++ b/Demo/Source/UMainFMX.fmx @@ -255,241 +255,240 @@ object SVGIconImageListForm: TSVGIconImageListForm end end object StyleBook1: TStyleBook + StyleName = 'FMXDemo' Styles = < item - end - item - Platform = 'Windows 10 Desktop' ResourcesBin = { 464D585F5354594C4520322E350106124C697374426F784974656D315374796C - 6531036C1006204C697374426F784974656D315374796C6531436865636B426F + 653103751006204C697374426F784974656D315374796C6531436865636B426F 785374796C653103E10B005450463007544C61796F757400095374796C654E61 6D6506124C697374426F784974656D315374796C653105416C69676E07064365 6E7465720A53697A652E576964746805000000000000009606400B53697A652E 48656967687405000000000000008004401453697A652E506C6174666F726D44 - 656661756C7408085461624F726465720227000654476C79706800095374796C - 654E616D65060A676C7970687374796C650C4D617267696E732E4C6566740500 - 0000000000008000400B4D617267696E732E546F70050000000000000080FF3F - 0D4D617267696E732E526967687405000000000000008000400E4D617267696E - 732E426F74746F6D050000000000000080FF3F05416C69676E07044C6566740A - 53697A652E576964746805000000000000008004400B53697A652E4865696768 - 7405000000000000008004401453697A652E506C6174666F726D44656661756C - 7408000016544163746976655374796C65546578744F626A6563740009537479 - 6C654E616D6506047465787405416C69676E0706436C69656E740C4D61726769 - 6E732E4C6566740500000000000000C000400B4D617267696E732E546F700500 - 00000000000080FF3F0D4D617267696E732E52696768740500000000000000C0 - 00400E4D617267696E732E426F74746F6D050000000000000080FF3F0A53697A - 652E576964746805000000000000009006400B53697A652E4865696768740500 - 000000000000F003401453697A652E506C6174666F726D44656661756C740804 - 54657874060454657874155465787453657474696E67732E576F726457726170 - 08165465787453657474696E67732E486F727A416C69676E07074C656164696E - 670D536861646F7756697369626C65080D416374697665547269676765720708 - 53656C65637465640B416374697665436F6C6F720708636C61426C61636B0000 - 0954436865636B426F7800095374796C654E616D650605636865636B05416C69 - 676E07044C6566740843616E466F637573081244697361626C65466F63757345 - 6666656374090A53697A652E57696474680500000000000000A003400B53697A - 652E48656967687405000000000000009803401453697A652E506C6174666F72 - 6D44656661756C74080B5374796C654C6F6F6B757006204C697374426F784974 - 656D315374796C6531436865636B426F785374796C65310756697369626C6508 - 000007544C61796F757400095374796C654E616D65060D6163636573736F7279 - 6D6F726505416C69676E07094D6F737452696768740A53697A652E5769647468 - 0500000000000000B003400B53697A652E4865696768740500000000000000B0 - 04401453697A652E506C6174666F726D44656661756C74080756697369626C65 - 080012544163746976655374796C654F626A6563740005416C69676E07064365 - 6E7465720C536F757263654C6F6F6B7570061B57696E646F7773203130204465 - 736B746F707374796C652E706E670A53697A652E576964746805000000000000 - 00B002400B53697A652E48656967687405000000000000008003401453697A65 - 2E506C6174666F726D44656661756C740808577261704D6F6465070643656E74 - 65720D41637469766554726967676572070853656C65637465640A4163746976 - 654C696E6B0E010F536F75726365526563742E4C656674050000000000000087 - 06400E536F75726365526563742E546F700500000000000000B3074010536F75 - 726365526563742E5269676874050000000000000092064011536F7572636552 - 6563742E426F74746F6D0500000000000000BB07400001055363616C65050000 + 656661756C74080756697369626C6508085461624F726465720225000654476C + 79706800095374796C654E616D65060A676C7970687374796C650C4D61726769 + 6E732E4C65667405000000000000008000400B4D617267696E732E546F700500 + 00000000000080FF3F0D4D617267696E732E5269676874050000000000000080 + 00400E4D617267696E732E426F74746F6D050000000000000080FF3F05416C69 + 676E07044C6566740A53697A652E576964746805000000000000008004400B53 + 697A652E48656967687405000000000000008004401453697A652E506C617466 + 6F726D44656661756C7408000016544163746976655374796C65546578744F62 + 6A65637400095374796C654E616D6506047465787405416C69676E0706436C69 + 656E740C4D617267696E732E4C6566740500000000000000C000400B4D617267 + 696E732E546F70050000000000000080FF3F0D4D617267696E732E5269676874 + 0500000000000000C000400E4D617267696E732E426F74746F6D050000000000 + 000080FF3F0A53697A652E576964746805000000000000009006400B53697A65 + 2E4865696768740500000000000000F003401453697A652E506C6174666F726D + 44656661756C74080454657874060454657874155465787453657474696E6773 + 2E576F72645772617008165465787453657474696E67732E486F727A416C6967 + 6E07074C656164696E670D536861646F7756697369626C65080D416374697665 + 54726967676572070853656C65637465640B416374697665436F6C6F72070863 + 6C61426C61636B00000954436865636B426F7800095374796C654E616D650605 + 636865636B05416C69676E07044C6566740843616E466F637573081244697361 + 626C65466F637573456666656374090A53697A652E5769647468050000000000 + 0000A003400B53697A652E48656967687405000000000000009803401453697A + 652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75700620 + 4C697374426F784974656D315374796C6531436865636B426F785374796C6531 + 0756697369626C6508000007544C61796F757400095374796C654E616D65060D + 6163636573736F72796D6F726505416C69676E07094D6F737452696768740A53 + 697A652E57696474680500000000000000B003400B53697A652E486569676874 + 0500000000000000B004401453697A652E506C6174666F726D44656661756C74 + 080756697369626C65080012544163746976655374796C654F626A6563740005 + 416C69676E070643656E7465720C536F757263654C6F6F6B7570061B57696E64 + 6F7773203130204465736B746F707374796C652E706E670A53697A652E576964 + 74680500000000000000B002400B53697A652E48656967687405000000000000 + 008003401453697A652E506C6174666F726D44656661756C740808577261704D + 6F6465070643656E7465720D41637469766554726967676572070853656C6563 + 7465640A4163746976654C696E6B0E010F536F75726365526563742E4C656674 + 05000000000000008706400E536F75726365526563742E546F70050000000000 + 0000B3074010536F75726365526563742E526967687405000000000000009206 + 4011536F75726365526563742E426F74746F6D0500000000000000BB07400001 + 055363616C650500000000000000C0FF3F0F536F75726365526563742E4C6566 + 740500000000000000CA06400E536F75726365526563742E546F700500000000 + 00004086084010536F75726365526563742E52696768740500000000000000DA + 064011536F75726365526563742E426F74746F6D05000000000000408C084000 + 01055363616C6505000000000000008000400F536F75726365526563742E4C65 + 667405000000000000008707400E536F75726365526563742E546F7005000000 + 00000000B3084010536F75726365526563742E52696768740500000000000000 + 92074011536F75726365526563742E426F74746F6D0500000000000000BB0840 + 00000A536F757263654C696E6B0E010F536F75726365526563742E4C65667405 + 000000000000008706400E536F75726365526563742E546F7005000000000000 + 00B3074010536F75726365526563742E52696768740500000000000000920640 + 11536F75726365526563742E426F74746F6D0500000000000000BB0740000105 + 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 + 0500000000000000CA06400E536F75726365526563742E546F70050000000000 + 004086084010536F75726365526563742E52696768740500000000000000DA06 + 4011536F75726365526563742E426F74746F6D05000000000000408C08400001 + 055363616C6505000000000000008000400F536F75726365526563742E4C6566 + 7405000000000000008707400E536F75726365526563742E546F700500000000 + 000000B3084010536F75726365526563742E5269676874050000000000000092 + 074011536F75726365526563742E426F74746F6D0500000000000000BB084000 + 0013546F756368416E696D6174696F6E2E4C696E6B0E0000000007544C61796F + 757400095374796C654E616D6506126163636573736F7279636865636B6D6172 + 6B05416C69676E07094D6F737452696768740A53697A652E5769647468050000 + 0000000000B003400B53697A652E4865696768740500000000000000B0044014 + 53697A652E506C6174666F726D44656661756C74080756697369626C65080012 + 544163746976655374796C654F626A6563740005416C69676E070643656E7465 + 720C536F757263654C6F6F6B7570061B57696E646F7773203130204465736B74 + 6F707374796C652E706E670A53697A652E576964746805000000000000008803 + 400B53697A652E48656967687405000000000000008803401453697A652E506C + 6174666F726D44656661756C740808577261704D6F6465070643656E7465720D + 41637469766554726967676572070853656C65637465640A4163746976654C69 + 6E6B0E010F536F75726365526563742E4C65667405000000000000009706400E + 536F75726365526563742E546F700500000000000080B2074010536F75726365 + 526563742E52696768740500000000000000A8064011536F7572636552656374 + 2E426F74746F6D0500000000000000BB07400001055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000000E20640 + 0E536F75726365526563742E546F70050000000000000086084010536F757263 + 65526563742E52696768740500000000000000FC064011536F75726365526563 + 742E426F74746F6D05000000000000808C08400001055363616C650500000000 + 0000008000400F536F75726365526563742E4C65667405000000000000009707 + 400E536F75726365526563742E546F700500000000000080B2084010536F7572 + 6365526563742E52696768740500000000000000A8074011536F757263655265 + 63742E426F74746F6D0500000000000000BB084000000A536F757263654C696E + 6B0E010F536F75726365526563742E4C65667405000000000000009706400E53 + 6F75726365526563742E546F700500000000000080B2074010536F7572636552 + 6563742E52696768740500000000000000A8064011536F75726365526563742E + 426F74746F6D0500000000000000BB07400001055363616C6505000000000000 + 00C0FF3F0F536F75726365526563742E4C6566740500000000000000E206400E + 536F75726365526563742E546F70050000000000000086084010536F75726365 + 526563742E52696768740500000000000000FC064011536F7572636552656374 + 2E426F74746F6D05000000000000808C08400001055363616C65050000000000 + 00008000400F536F75726365526563742E4C6566740500000000000000970740 + 0E536F75726365526563742E546F700500000000000080B2084010536F757263 + 65526563742E52696768740500000000000000A8074011536F75726365526563 + 742E426F74746F6D0500000000000000BB0840000013546F756368416E696D61 + 74696F6E2E4C696E6B0E0000000007544C61796F757400095374796C654E616D + 65060F6163636573736F727964657461696C05416C69676E07094D6F73745269 + 6768740A53697A652E57696474680500000000000000B003400B53697A652E48 + 65696768740500000000000000B004401453697A652E506C6174666F726D4465 + 6661756C74080756697369626C65080012544163746976655374796C654F626A + 6563740005416C69676E070643656E7465720C536F757263654C6F6F6B757006 + 1B57696E646F7773203130204465736B746F707374796C652E706E670A53697A + 652E576964746805000000000000008803400B53697A652E4865696768740500 + 000000000000F002401453697A652E506C6174666F726D44656661756C740808 + 577261704D6F6465070643656E7465720D416374697665547269676765720708 + 53656C65637465640A4163746976654C696E6B0E010F536F7572636552656374 + 2E4C6566740500000000000000AD06400E536F75726365526563742E546F7005 + 00000000000000B3074010536F75726365526563742E52696768740500000000 + 000000BE064011536F75726365526563742E426F74746F6D0500000000000080 + BA07400001055363616C650500000000000000C0FF3F0F536F75726365526563 + 742E4C65667405000000000000008207400E536F75726365526563742E546F70 + 050000000000004086084010536F75726365526563742E526967687405000000 + 000000008F074011536F75726365526563742E426F74746F6D05000000000000 + C08B08400001055363616C6505000000000000008000400F536F757263655265 + 63742E4C6566740500000000000000AD07400E536F75726365526563742E546F + 700500000000000000B3084010536F75726365526563742E5269676874050000 + 0000000000BE074011536F75726365526563742E426F74746F6D050000000000 + 0080BA084000000A536F757263654C696E6B0E010F536F75726365526563742E + 4C6566740500000000000000AD06400E536F75726365526563742E546F700500 + 000000000000B3074010536F75726365526563742E5269676874050000000000 + 0000BE064011536F75726365526563742E426F74746F6D0500000000000080BA + 07400001055363616C650500000000000000C0FF3F0F536F7572636552656374 + 2E4C65667405000000000000008207400E536F75726365526563742E546F7005 + 0000000000004086084010536F75726365526563742E52696768740500000000 + 0000008F074011536F75726365526563742E426F74746F6D05000000000000C0 + 8B08400001055363616C6505000000000000008000400F536F75726365526563 + 742E4C6566740500000000000000AD07400E536F75726365526563742E546F70 + 0500000000000000B3084010536F75726365526563742E526967687405000000 + 00000000BE074011536F75726365526563742E426F74746F6D05000000000000 + 80BA0840000013546F756368416E696D6174696F6E2E4C696E6B0E0000000000 + 5450463007544C61796F757400095374796C654E616D6506204C697374426F78 + 4974656D315374796C6531436865636B426F785374796C653105416C69676E07 + 0643656E7465720A53697A652E576964746805000000000000009606400B5369 + 7A652E48656967687405000000000000008004401453697A652E506C6174666F + 726D44656661756C74080756697369626C6508085461624F7264657202120007 + 544C61796F75740005416C69676E07044C6566740A53697A652E576964746805 + 000000000000009003400B53697A652E48656967687405000000000000008004 + 401453697A652E506C6174666F726D44656661756C7408001154436865636B53 + 74796C654F626A65637400095374796C654E616D65060A6261636B67726F756E + 6405416C69676E070643656E746572074361704D6F6465070454696C65064C6F + 636B6564090C536F757263654C6F6F6B7570061B57696E646F77732031302044 + 65736B746F707374796C652E706E670A53697A652E5769647468050000000000 + 0000D002400B53697A652E4865696768740500000000000000D002401453697A + 652E506C6174666F726D44656661756C740808577261704D6F6465070643656E + 7465720D416374697665547269676765720707436865636B65640A4163746976 + 654C696E6B0E010F536F75726365526563742E4C6566740500000000000000F8 + 03400E536F75726365526563742E546F70050000000000000092064010536F75 + 726365526563742E52696768740500000000000000B0044011536F7572636552 + 6563742E426F74746F6D05000000000000009F06400001055363616C65050000 0000000000C0FF3F0F536F75726365526563742E4C6566740500000000000000 - CA06400E536F75726365526563742E546F70050000000000004086084010536F - 75726365526563742E52696768740500000000000000DA064011536F75726365 - 526563742E426F74746F6D05000000000000408C08400001055363616C650500 + B804400E536F75726365526563742E546F700500000000000000DB064010536F + 75726365526563742E5269676874050000000000000082054011536F75726365 + 526563742E426F74746F6D0500000000000000EE06400001055363616C650500 0000000000008000400F536F75726365526563742E4C65667405000000000000 - 008707400E536F75726365526563742E546F700500000000000000B308401053 - 6F75726365526563742E5269676874050000000000000092074011536F757263 - 65526563742E426F74746F6D0500000000000000BB084000000A536F75726365 - 4C696E6B0E010F536F75726365526563742E4C65667405000000000000008706 - 400E536F75726365526563742E546F700500000000000000B3074010536F7572 - 6365526563742E5269676874050000000000000092064011536F757263655265 - 63742E426F74746F6D0500000000000000BB07400001055363616C6505000000 - 00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000CA - 06400E536F75726365526563742E546F70050000000000004086084010536F75 - 726365526563742E52696768740500000000000000DA064011536F7572636552 - 6563742E426F74746F6D05000000000000408C08400001055363616C65050000 + 00F804400E536F75726365526563742E546F7005000000000000009207401053 + 6F75726365526563742E52696768740500000000000000B0054011536F757263 + 65526563742E426F74746F6D05000000000000009F074000000A536F75726365 + 4C696E6B0E010F536F75726365526563742E4C6566740500000000000000C000 + 400E536F75726365526563742E546F70050000000000000092064010536F7572 + 6365526563742E5269676874050000000000000080034011536F757263655265 + 63742E426F74746F6D05000000000000009F06400001055363616C6505000000 + 00000000C0FF3F0F536F75726365526563742E4C656674050000000000000080 + 01400E536F75726365526563742E546F700500000000000000DB064010536F75 + 726365526563742E52696768740500000000000000B8034011536F7572636552 + 6563742E426F74746F6D0500000000000000EE06400001055363616C65050000 00000000008000400F536F75726365526563742E4C6566740500000000000000 - 8707400E536F75726365526563742E546F700500000000000000B3084010536F - 75726365526563742E5269676874050000000000000092074011536F75726365 - 526563742E426F74746F6D0500000000000000BB0840000013546F756368416E - 696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374796C65 - 4E616D6506126163636573736F7279636865636B6D61726B05416C69676E0709 - 4D6F737452696768740A53697A652E57696474680500000000000000B003400B - 53697A652E4865696768740500000000000000B004401453697A652E506C6174 - 666F726D44656661756C74080756697369626C65080012544163746976655374 - 796C654F626A6563740005416C69676E070643656E7465720C536F757263654C - 6F6F6B7570061B57696E646F7773203130204465736B746F707374796C652E70 - 6E670A53697A652E576964746805000000000000008803400B53697A652E4865 - 6967687405000000000000008803401453697A652E506C6174666F726D446566 - 61756C740808577261704D6F6465070643656E7465720D416374697665547269 - 67676572070853656C65637465640A4163746976654C696E6B0E010F536F7572 - 6365526563742E4C65667405000000000000009706400E536F75726365526563 - 742E546F700500000000000080B2074010536F75726365526563742E52696768 - 740500000000000000A8064011536F75726365526563742E426F74746F6D0500 - 000000000000BB07400001055363616C650500000000000000C0FF3F0F536F75 - 726365526563742E4C6566740500000000000000E206400E536F757263655265 - 63742E546F70050000000000000086084010536F75726365526563742E526967 - 68740500000000000000FC064011536F75726365526563742E426F74746F6D05 - 000000000000808C08400001055363616C6505000000000000008000400F536F - 75726365526563742E4C65667405000000000000009707400E536F7572636552 - 6563742E546F700500000000000080B2084010536F75726365526563742E5269 - 6768740500000000000000A8074011536F75726365526563742E426F74746F6D - 0500000000000000BB084000000A536F757263654C696E6B0E010F536F757263 - 65526563742E4C65667405000000000000009706400E536F7572636552656374 - 2E546F700500000000000080B2074010536F75726365526563742E5269676874 - 0500000000000000A8064011536F75726365526563742E426F74746F6D050000 - 0000000000BB07400001055363616C650500000000000000C0FF3F0F536F7572 - 6365526563742E4C6566740500000000000000E206400E536F75726365526563 - 742E546F70050000000000000086084010536F75726365526563742E52696768 - 740500000000000000FC064011536F75726365526563742E426F74746F6D0500 - 0000000000808C08400001055363616C6505000000000000008000400F536F75 - 726365526563742E4C65667405000000000000009707400E536F757263655265 - 63742E546F700500000000000080B2084010536F75726365526563742E526967 - 68740500000000000000A8074011536F75726365526563742E426F74746F6D05 - 00000000000000BB0840000013546F756368416E696D6174696F6E2E4C696E6B - 0E0000000007544C61796F757400095374796C654E616D65060F616363657373 - 6F727964657461696C05416C69676E07094D6F737452696768740A53697A652E - 57696474680500000000000000B003400B53697A652E48656967687405000000 - 00000000B004401453697A652E506C6174666F726D44656661756C7408075669 - 7369626C65080012544163746976655374796C654F626A6563740005416C6967 - 6E070643656E7465720C536F757263654C6F6F6B7570061B57696E646F777320 - 3130204465736B746F707374796C652E706E670A53697A652E57696474680500 - 0000000000008803400B53697A652E4865696768740500000000000000F00240 - 1453697A652E506C6174666F726D44656661756C740808577261704D6F646507 - 0643656E7465720D41637469766554726967676572070853656C65637465640A - 4163746976654C696E6B0E010F536F75726365526563742E4C65667405000000 - 00000000AD06400E536F75726365526563742E546F700500000000000000B307 - 4010536F75726365526563742E52696768740500000000000000BE064011536F - 75726365526563742E426F74746F6D0500000000000080BA0740000105536361 - 6C650500000000000000C0FF3F0F536F75726365526563742E4C656674050000 - 00000000008207400E536F75726365526563742E546F70050000000000004086 - 084010536F75726365526563742E526967687405000000000000008F07401153 - 6F75726365526563742E426F74746F6D05000000000000C08B08400001055363 - 616C6505000000000000008000400F536F75726365526563742E4C6566740500 - 000000000000AD07400E536F75726365526563742E546F700500000000000000 - B3084010536F75726365526563742E52696768740500000000000000BE074011 - 536F75726365526563742E426F74746F6D0500000000000080BA084000000A53 - 6F757263654C696E6B0E010F536F75726365526563742E4C6566740500000000 - 000000AD06400E536F75726365526563742E546F700500000000000000B30740 - 10536F75726365526563742E52696768740500000000000000BE064011536F75 - 726365526563742E426F74746F6D0500000000000080BA07400001055363616C - 650500000000000000C0FF3F0F536F75726365526563742E4C65667405000000 - 000000008207400E536F75726365526563742E546F7005000000000000408608 - 4010536F75726365526563742E526967687405000000000000008F074011536F - 75726365526563742E426F74746F6D05000000000000C08B0840000105536361 - 6C6505000000000000008000400F536F75726365526563742E4C656674050000 - 0000000000AD07400E536F75726365526563742E546F700500000000000000B3 - 084010536F75726365526563742E52696768740500000000000000BE07401153 - 6F75726365526563742E426F74746F6D0500000000000080BA0840000013546F - 756368416E696D6174696F6E2E4C696E6B0E00000000005450463007544C6179 - 6F757400095374796C654E616D6506204C697374426F784974656D315374796C - 6531436865636B426F785374796C653105416C69676E070643656E7465720A53 - 697A652E576964746805000000000000009606400B53697A652E486569676874 - 05000000000000008004401453697A652E506C6174666F726D44656661756C74 - 080756697369626C6508085461624F7264657202120007544C61796F75740005 - 416C69676E07044C6566740A53697A652E576964746805000000000000009003 - 400B53697A652E48656967687405000000000000008004401453697A652E506C - 6174666F726D44656661756C7408001154436865636B5374796C654F626A6563 - 7400095374796C654E616D65060A6261636B67726F756E6405416C69676E0706 - 43656E746572074361704D6F6465070454696C65064C6F636B6564090C536F75 - 7263654C6F6F6B7570061B57696E646F7773203130204465736B746F70737479 - 6C652E706E670A53697A652E57696474680500000000000000D002400B53697A - 652E4865696768740500000000000000D002401453697A652E506C6174666F72 - 6D44656661756C740808577261704D6F6465070643656E7465720D4163746976 - 65547269676765720707436865636B65640A4163746976654C696E6B0E010F53 - 6F75726365526563742E4C6566740500000000000000F803400E536F75726365 - 526563742E546F70050000000000000092064010536F75726365526563742E52 - 696768740500000000000000B0044011536F75726365526563742E426F74746F - 6D05000000000000009F06400001055363616C650500000000000000C0FF3F0F - 536F75726365526563742E4C6566740500000000000000B804400E536F757263 - 65526563742E546F700500000000000000DB064010536F75726365526563742E - 5269676874050000000000000082054011536F75726365526563742E426F7474 - 6F6D0500000000000000EE06400001055363616C650500000000000000800040 - 0F536F75726365526563742E4C6566740500000000000000F804400E536F7572 - 6365526563742E546F70050000000000000092074010536F7572636552656374 - 2E52696768740500000000000000B0054011536F75726365526563742E426F74 - 746F6D05000000000000009F074000000A536F757263654C696E6B0E010F536F - 75726365526563742E4C6566740500000000000000C000400E536F7572636552 - 6563742E546F70050000000000000092064010536F75726365526563742E5269 - 676874050000000000000080034011536F75726365526563742E426F74746F6D - 05000000000000009F06400001055363616C650500000000000000C0FF3F0F53 - 6F75726365526563742E4C65667405000000000000008001400E536F75726365 - 526563742E546F700500000000000000DB064010536F75726365526563742E52 - 696768740500000000000000B8034011536F75726365526563742E426F74746F - 6D0500000000000000EE06400001055363616C6505000000000000008000400F - 536F75726365526563742E4C6566740500000000000000C001400E536F757263 - 65526563742E546F70050000000000000092074010536F75726365526563742E - 5269676874050000000000000080044011536F75726365526563742E426F7474 - 6F6D05000000000000009F0740000007486F744C696E6B0E010F536F75726365 - 526563742E4C65667405000000000000008803400E536F75726365526563742E - 546F70050000000000000092064010536F75726365526563742E526967687405 - 00000000000000F0034011536F75726365526563742E426F74746F6D05000000 - 000000009F06400001055363616C650500000000000000C0FF3F0F536F757263 - 65526563742E4C6566740500000000000000C803400E536F7572636552656374 - 2E546F700500000000000000DB064010536F75726365526563742E5269676874 - 0500000000000000B0044011536F75726365526563742E426F74746F6D050000 - 0000000000EE06400001055363616C6505000000000000008000400F536F7572 - 6365526563742E4C65667405000000000000008804400E536F75726365526563 - 742E546F70050000000000000092074010536F75726365526563742E52696768 - 740500000000000000F0044011536F75726365526563742E426F74746F6D0500 - 0000000000009F074000000D416374697665486F744C696E6B0E010F536F7572 - 6365526563742E4C6566740500000000000000B404400E536F75726365526563 - 742E546F70050000000000000092064010536F75726365526563742E52696768 - 740500000000000000E8044011536F75726365526563742E426F74746F6D0500 - 0000000000009F06400001055363616C650500000000000000C0FF3F0F536F75 - 726365526563742E4C65667405000000000000008605400E536F757263655265 - 63742E546F700500000000000000DB064010536F75726365526563742E526967 - 68740500000000000000AC054011536F75726365526563742E426F74746F6D05 - 00000000000000EE06400001055363616C6505000000000000008000400F536F - 75726365526563742E4C6566740500000000000000B405400E536F7572636552 - 6563742E546F70050000000000000092074010536F75726365526563742E5269 - 6768740500000000000000E8054011536F75726365526563742E426F74746F6D - 05000000000000009F074000000B466F63757365644C696E6B0E010F536F7572 - 6365526563742E4C65667405000000000000008803400E536F75726365526563 - 742E546F70050000000000000092064010536F75726365526563742E52696768 - 740500000000000000F0034011536F75726365526563742E426F74746F6D0500 - 0000000000009F06400001055363616C650500000000000000C0FF3F0F536F75 - 726365526563742E4C6566740500000000000000C803400E536F757263655265 - 63742E546F700500000000000000DB064010536F75726365526563742E526967 - 68740500000000000000B0044011536F75726365526563742E426F74746F6D05 - 00000000000000EE06400001055363616C6505000000000000008000400F536F - 75726365526563742E4C65667405000000000000008804400E536F7572636552 - 6563742E546F70050000000000000092074010536F75726365526563742E5269 - 6768740500000000000000F0044011536F75726365526563742E426F74746F6D - 05000000000000009F0740000011416374697665466F63757365644C696E6B0E - 010F536F75726365526563742E4C6566740500000000000000B404400E536F75 - 726365526563742E546F70050000000000000092064010536F75726365526563 - 742E52696768740500000000000000E8044011536F75726365526563742E426F - 74746F6D05000000000000009F06400001055363616C650500000000000000C0 - FF3F0F536F75726365526563742E4C65667405000000000000008605400E536F - 75726365526563742E546F700500000000000000DB064010536F757263655265 - 63742E52696768740500000000000000AC054011536F75726365526563742E42 - 6F74746F6D0500000000000000EE06400001055363616C650500000000000000 - 8000400F536F75726365526563742E4C6566740500000000000000B405400E53 - 6F75726365526563742E546F70050000000000000092074010536F7572636552 - 6563742E52696768740500000000000000E8054011536F75726365526563742E - 426F74746F6D05000000000000009F074000000000001654427574746F6E5374 - 796C65546578744F626A65637400095374796C654E616D650604746578740541 - 6C69676E0706436C69656E74064C6F636B6564090C4D617267696E732E4C6566 - 740500000000000000C000400A53697A652E5769647468050000000000000081 - 06400B53697A652E48656967687405000000000000008004401453697A652E50 - 6C6174666F726D44656661756C74080D536861646F7756697369626C65080848 - 6F74436F6C6F720708636C61426C61636B0C466F6375736564436F6C6F720708 - 636C61426C61636B0B4E6F726D616C436F6C6F720708636C61426C61636B0C50 - 726573736564436F6C6F720708636C61426C61636B000000} + C001400E536F75726365526563742E546F70050000000000000092074010536F + 75726365526563742E5269676874050000000000000080044011536F75726365 + 526563742E426F74746F6D05000000000000009F0740000007486F744C696E6B + 0E010F536F75726365526563742E4C65667405000000000000008803400E536F + 75726365526563742E546F70050000000000000092064010536F757263655265 + 63742E52696768740500000000000000F0034011536F75726365526563742E42 + 6F74746F6D05000000000000009F06400001055363616C650500000000000000 + C0FF3F0F536F75726365526563742E4C6566740500000000000000C803400E53 + 6F75726365526563742E546F700500000000000000DB064010536F7572636552 + 6563742E52696768740500000000000000B0044011536F75726365526563742E + 426F74746F6D0500000000000000EE06400001055363616C6505000000000000 + 008000400F536F75726365526563742E4C65667405000000000000008804400E + 536F75726365526563742E546F70050000000000000092074010536F75726365 + 526563742E52696768740500000000000000F0044011536F7572636552656374 + 2E426F74746F6D05000000000000009F074000000D416374697665486F744C69 + 6E6B0E010F536F75726365526563742E4C6566740500000000000000B404400E + 536F75726365526563742E546F70050000000000000092064010536F75726365 + 526563742E52696768740500000000000000E8044011536F7572636552656374 + 2E426F74746F6D05000000000000009F06400001055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000000860540 + 0E536F75726365526563742E546F700500000000000000DB064010536F757263 + 65526563742E52696768740500000000000000AC054011536F75726365526563 + 742E426F74746F6D0500000000000000EE06400001055363616C650500000000 + 0000008000400F536F75726365526563742E4C6566740500000000000000B405 + 400E536F75726365526563742E546F70050000000000000092074010536F7572 + 6365526563742E52696768740500000000000000E8054011536F757263655265 + 63742E426F74746F6D05000000000000009F074000000B466F63757365644C69 + 6E6B0E010F536F75726365526563742E4C65667405000000000000008803400E + 536F75726365526563742E546F70050000000000000092064010536F75726365 + 526563742E52696768740500000000000000F0034011536F7572636552656374 + 2E426F74746F6D05000000000000009F06400001055363616C65050000000000 + 0000C0FF3F0F536F75726365526563742E4C6566740500000000000000C80340 + 0E536F75726365526563742E546F700500000000000000DB064010536F757263 + 65526563742E52696768740500000000000000B0044011536F75726365526563 + 742E426F74746F6D0500000000000000EE06400001055363616C650500000000 + 0000008000400F536F75726365526563742E4C65667405000000000000008804 + 400E536F75726365526563742E546F70050000000000000092074010536F7572 + 6365526563742E52696768740500000000000000F0044011536F757263655265 + 63742E426F74746F6D05000000000000009F0740000011416374697665466F63 + 757365644C696E6B0E010F536F75726365526563742E4C656674050000000000 + 0000B404400E536F75726365526563742E546F70050000000000000092064010 + 536F75726365526563742E52696768740500000000000000E8044011536F7572 + 6365526563742E426F74746F6D05000000000000009F06400001055363616C65 + 0500000000000000C0FF3F0F536F75726365526563742E4C6566740500000000 + 0000008605400E536F75726365526563742E546F700500000000000000DB0640 + 10536F75726365526563742E52696768740500000000000000AC054011536F75 + 726365526563742E426F74746F6D0500000000000000EE06400001055363616C + 6505000000000000008000400F536F75726365526563742E4C65667405000000 + 00000000B405400E536F75726365526563742E546F7005000000000000009207 + 4010536F75726365526563742E52696768740500000000000000E8054011536F + 75726365526563742E426F74746F6D05000000000000009F0740000000000016 + 54427574746F6E5374796C65546578744F626A65637400095374796C654E616D + 6506047465787405416C69676E0706436C69656E74064C6F636B6564090C4D61 + 7267696E732E4C6566740500000000000000C000400A53697A652E5769647468 + 05000000000000008106400B53697A652E486569676874050000000000000080 + 04401453697A652E506C6174666F726D44656661756C74080D536861646F7756 + 697369626C650808486F74436F6C6F720708636C61426C61636B0C466F637573 + 6564436F6C6F720708636C61426C61636B0B4E6F726D616C436F6C6F72070863 + 6C61426C61636B0C50726573736564436F6C6F720708636C61426C61636B0000 + 00} end> Left = 40 Top = 224 diff --git a/Demo/SvgViewer/SvgViewer.dproj b/Demo/SvgViewer/SvgViewer.dproj index ad77f93..a2447b3 100644 --- a/Demo/SvgViewer/SvgViewer.dproj +++ b/Demo/SvgViewer/SvgViewer.dproj @@ -6,8 +6,8 @@ SvgViewer.dpr True Debug - Win32 - 1 + Win64 + 3 Application SvgViewer @@ -91,6 +91,9 @@ $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png Viewer_Icon.ico + System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) + Debug + CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= DEBUG;$(DCC_Define) @@ -114,7 +117,7 @@ 1033 true Debug - PerMonitor + PerMonitorV2 Viewer_Icon.ico @@ -133,7 +136,7 @@ true 1033 true - PerMonitor + PerMonitorV2 Viewer_Icon.ico @@ -1204,7 +1207,7 @@ True - False + True 12 diff --git a/Image32/source/Img32.Draw.pas b/Image32/source/Img32.Draw.pas index 24f3b1a..252d396 100644 --- a/Image32/source/Img32.Draw.pas +++ b/Image32/source/Img32.Draw.pas @@ -59,6 +59,17 @@ TCustomRenderer = class {$IFDEF ABSTRACT_CLASSES} abstract {$ENDIF} // RenderProc: x & y refer to pixel coords in the destination image and // where x1 is the start (and left) and x2 is the end of the render procedure RenderProc(x1, x2, y: integer; alpha: PByte); virtual; abstract; + // RenderProcSkip: is called for every skipped line block if + // SupportsRenderProcSkip=True and the Rasterize() function skips scanlines. + procedure RenderProcSkip(const skippedRect: TRect); virtual; + // SetClipRect is called by the Rasterize() function with the + // rasterization clipRect. The default implementation does nothing. + procedure SetClipRect(const clipRect: TRect); virtual; + // If SupportsRenderProcSkip returns True the Rasterize() function + // will call RenderProcSkip() for every scanline where it didn't have + // anything to rasterize. + function SupportsRenderProcSkip: Boolean; virtual; + property ImgWidth: integer read fImgWidth; property ImgHeight: integer read fImgHeight; property ImgBase: Pointer read fImgBase; @@ -93,14 +104,27 @@ TAliasedColorRenderer = class(TCustomColorRenderer) constructor Create(color: TColor32 = clNone32); end; - // TCustomColorRendererCache is used to not create ColorRenderer + // TMaskRenderer masks all pixels inside the clipRect area + // where the alpha[]-array is zero. + TMaskRenderer = class(TCustomRenderer) + private + fClipRect: TRect; + protected + procedure SetClipRect(const clipRect: TRect); override; + procedure RenderProc(x1, x2, y: integer; alpha: PByte); override; + procedure RenderProcSkip(const skippedRect: TRect); override; + function SupportsRenderProcSkip: Boolean; override; + end; + + // TCustomRendererCache is used to not create Renderer // objects for every DrawPolygon/DrawLine function call. The color // of the TCustomColorRenderer will be changed by the DrawPolygon/ // DrawLine method. - TCustomColorRendererCache = class(TObject) + TCustomRendererCache = class(TObject) private fColorRenderer: TColorRenderer; fAliasedColorRenderer: TAliasedColorRenderer; + fMaskRenderer: TMaskRenderer; public constructor Create; destructor Destroy; override; @@ -108,6 +132,7 @@ TCustomColorRendererCache = class(TObject) property ColorRenderer: TColorRenderer read fColorRenderer; property AliasedColorRenderer: TAliasedColorRenderer read fAliasedColorRenderer; + property MaskRenderer: TMaskRenderer read fMaskRenderer; end; TEraseRenderer = class(TCustomRenderer) @@ -241,7 +266,7 @@ TBarycentricRenderer = class(TCustomRenderer) miterLimit: double = 2); overload; procedure DrawLine(img: TImage32; const line: TPathD; lineWidth: double; color: TColor32; - rendererCache: TCustomColorRendererCache; + rendererCache: TCustomRendererCache; endStyle: TEndStyle; joinStyle: TJoinStyle = jsAuto; miterLimit: double = 2); overload; procedure DrawLine(img: TImage32; @@ -253,7 +278,7 @@ TBarycentricRenderer = class(TCustomRenderer) endStyle: TEndStyle; joinStyle: TJoinStyle = jsAuto; miterLimit: double = 2); overload; procedure DrawLine(img: TImage32; const lines: TPathsD; - lineWidth: double; color: TColor32; rendererCache: TCustomColorRendererCache; + lineWidth: double; color: TColor32; rendererCache: TCustomRendererCache; endStyle: TEndStyle; joinStyle: TJoinStyle = jsAuto; miterLimit: double = 2); overload; procedure DrawLine(img: TImage32; const lines: TPathsD; @@ -272,12 +297,12 @@ TBarycentricRenderer = class(TCustomRenderer) dashPattern: TArrayOfDouble; patternOffset: PDouble; lineWidth: double; color: TColor32; endStyle: TEndStyle; joinStyle: TJoinStyle = jsAuto; - rendererCache: TCustomColorRendererCache = nil); overload; + rendererCache: TCustomRendererCache = nil); overload; procedure DrawDashedLine(img: TImage32; const lines: TPathsD; dashPattern: TArrayOfDouble; patternOffset: PDouble; lineWidth: double; color: TColor32; endStyle: TEndStyle; joinStyle: TJoinStyle = jsAuto; - rendererCache: TCustomColorRendererCache = nil); overload; + rendererCache: TCustomRendererCache = nil); overload; procedure DrawDashedLine(img: TImage32; const line: TPathD; dashPattern: TArrayOfDouble; patternOffset: PDouble; lineWidth: double; renderer: TCustomRenderer; endStyle: TEndStyle; @@ -304,7 +329,7 @@ TBarycentricRenderer = class(TCustomRenderer) fillRule: TFillRule; color: TColor32); overload; procedure DrawPolygon(img: TImage32; const polygons: TPathsD; fillRule: TFillRule; color: TColor32; - rendererCache: TCustomColorRendererCache); overload; + rendererCache: TCustomRendererCache); overload; procedure DrawPolygon(img: TImage32; const polygons: TPathsD; fillRule: TFillRule; renderer: TCustomRenderer); overload; @@ -339,7 +364,9 @@ TBarycentricRenderer = class(TCustomRenderer) const mask: TArrayOfByte; color: TColor32 = clBlack32); procedure Rasterize(const paths: TPathsD; - const clipRec: TRect; fillRule: TFillRule; renderer: TCustomRenderer); + const clipRec: TRect; fillRule: TFillRule; renderer: TCustomRenderer); overload; + procedure Rasterize(img: TImage32; const paths: TPathsD; + const clipRec: TRect; fillRule: TFillRule; renderer: TCustomRenderer); overload; implementation @@ -1237,16 +1264,28 @@ procedure Rasterize(const paths: TPathsD; const clipRec: TRect; scanlines: TArrayOfScanline; fragments: PFragment; scanline: PScanline; + skippedScanlines: integer; + skipRenderer: boolean; // FPC generates wrong code if "count" isn't NativeInt FillByteBuffer: procedure(byteBuffer: PByte; windingAccum: PDouble; count: nativeint); begin // See also https://nothings.org/gamedev/rasterize/ if not assigned(renderer) then Exit; + renderer.SetClipRect(clipRec); + skipRenderer := renderer.SupportsRenderProcSkip; + Types.IntersectRect(clipRec2, clipRec, GetBounds(paths)); - if IsEmptyRect(clipRec2) then Exit; + if IsEmptyRect(clipRec2) then + begin + if skipRenderer then renderer.RenderProcSkip(clipRec); + Exit; + end; - paths2 := TranslatePath(paths, -clipRec2.Left, -clipRec2.Top); + if (clipRec2.Left = 0) and (clipRec2.Top = 0) then + paths2 := paths + else + paths2 := TranslatePath(paths, -clipRec2.Left, -clipRec2.Top); // Delphi's Round() function is *much* faster than Trunc(), // and even a little faster than Trunc() above (except @@ -1280,18 +1319,37 @@ procedure Rasterize(const paths: TPathsD; const clipRec: TRect; {$ENDIF} FillByteBuffer := FillByteBufferNegative; else + if skipRenderer then renderer.RenderProcSkip(clipRec); Exit; end; + // Notify the renderer about the parts at the top + // that we didn't touch. + if skipRenderer and (clipRec2.Top > clipRec.Top) then + begin + renderer.RenderProcSkip(Rect(clipRec.Left, clipRec.Top, + clipRec.Right, clipRec2.Top - 1)); + end; + + skippedScanlines := 0; scanline := @scanlines[0]; for i := 0 to high(scanlines) do begin if scanline.fragCnt = 0 then begin inc(scanline); + if skipRenderer then inc(skippedScanlines); Continue; end; + // If we have skipped some scanlines, we must notify the renderer. + if skipRenderer and (skippedScanlines > 0) then + begin + renderer.RenderProcSkip(Rect(clipRec.Left, clipRec2.Top + i - skippedScanlines, + clipRec.Right, clipRec2.Top + i - 1)); + skippedScanlines := 0; + end; + // process each scanline to fill the winding count accumulation buffer ProcessScanlineFragments(scanline^, fragments, windingAccum); // it's faster to process only the modified sub-array of windingAccum @@ -1310,12 +1368,34 @@ procedure Rasterize(const paths: TPathsD; const clipRec: TRect; inc(scanline); end; + + // Notify the renderer about the last skipped scanlines + if skipRenderer then + begin + clipRec2.Bottom := clipRec2.top + High(scanlines) - skippedScanlines; + if clipRec2.Bottom < clipRec.Bottom then + begin + renderer.RenderProcSkip(Rect(clipRec.Left, clipRec2.Bottom + 1, + clipRec.Right, clipRec.Bottom)); + end; + end; finally // cleanup and deallocate memory FreeMem(fragments); FreeMem(byteBuffer); end; end; +// ------------------------------------------------------------------------------ + +procedure Rasterize(img: TImage32; const paths: TPathsD; + const clipRec: TRect; fillRule: TFillRule; renderer: TCustomRenderer); +begin + if renderer.Initialize(img) then + begin + Rasterize(paths, clipRec, fillRule, renderer); + renderer.NotifyChange; + end; +end; // ------------------------------------------------------------------------------ // TAbstractRenderer @@ -1362,6 +1442,24 @@ function TCustomRenderer.GetDstPixel(x, y: integer): Pointer; Result := fCurrLinePtr; inc(PByte(Result), x * fPixelSize); end; +// ------------------------------------------------------------------------------ + +procedure TCustomRenderer.SetClipRect(const clipRect: TRect); +begin + // default: do nothing +end; +// ------------------------------------------------------------------------------ + +procedure TCustomRenderer.RenderProcSkip(const skippedRect: TRect); +begin + // default: do nothing +end; +// ------------------------------------------------------------------------------ + +function TCustomRenderer.SupportsRenderProcSkip: Boolean; +begin + Result := False; +end; // ------------------------------------------------------------------------------ // TCustomColorRenderer @@ -1549,25 +1647,121 @@ procedure TAliasedColorRenderer.RenderProc(x1, x2, y: integer; alpha: PByte); end; // ------------------------------------------------------------------------------ -// TCustomColorRendererCache +// TMaskRenderer // ------------------------------------------------------------------------------ -constructor TCustomColorRendererCache.Create; +procedure TMaskRenderer.SetClipRect(const clipRect: TRect); +begin + fClipRect := clipRect; + // clipping to the image size + if fClipRect.Left < 0 then fClipRect.Left := 0; + if fClipRect.Top < 0 then fClipRect.Top := 0; + if fClipRect.Right > fImgWidth then fClipRect.Right := fImgWidth; + if fClipRect.Bottom > fImgHeight then fClipRect.Bottom := fImgHeight; +end; +// ------------------------------------------------------------------------------ + +procedure TMaskRenderer.RenderProc(x1, x2, y: integer; alpha: PByte); +var + p: PColor32; + i: integer; +begin + // CopyBlend excludes ClipRect.Right/Bottom, so we also + // need to exclude it. + if (y < fClipRect.Top) or (y >= fClipRect.Bottom) then Exit; + if x2 >= fClipRect.Right then x2 := fClipRect.Right - 1; + + if x1 < fClipRect.Left then + begin + inc(alpha, fClipRect.Left - x1); + x1 := fClipRect.Left; + end; + + p := GetDstPixel(fClipRect.Left, y); + + // Clear the area before x1 (inside OutsideBounds) + FillChar(p^, (x1 - fClipRect.Left) * SizeOf(TColor32), 0); + inc(p, x1 - fClipRect.Left); + + // Fill the area between x1 and x2 + for i := x1 to x2 do + begin + if p^ <> 0 then + begin + if Ord(alpha^) = 0 then + p^ := 0 + else if Ord(alpha^) <> 255 then + p^ := BlendMask(p^, Ord(alpha^) shl 24); + end; + inc(p); + inc(alpha); + end; + + // Clear the area after x2 (inside OutsideBounds) + FillChar(p^, (fClipRect.Right - (x2 + 1)) * SizeOf(TColor32), 0); +end; +// ------------------------------------------------------------------------------ + +procedure TMaskRenderer.RenderProcSkip(const skippedRect: TRect); +var + i, h, w: integer; + p: PColor32; + r: TRect; +begin + r := skippedRect; + if r.Left < fClipRect.Left then r.Left := fClipRect.Left; + if r.Top < fClipRect.Top then r.Top := fClipRect.Top; + // CopyBlend excludes ClipRect.Right/Bottom, so we also + // need to exclude it. + if r.Right >= fClipRect.Right then r.Right := fClipRect.Right - 1; + if r.Bottom >= fClipRect.Bottom then r.Bottom := fClipRect.Bottom - 1; + + if r.Right < r.Left then Exit; + if r.Bottom < r.Top then Exit; + + w := r.Right - r.Left + 1; + h := r.Bottom - r.Top + 1; + p := GetDstPixel(r.Left, r.Top); + if w = fImgWidth then + FillChar(p^, w * h * SizeOf(TColor32), 0) + else + begin + for i := 1 to h do + begin + FillChar(p^, w * SizeOf(TColor32), 0); + inc(p, fImgWidth); + end; + end; +end; + +// ------------------------------------------------------------------------------ +function TMaskRenderer.SupportsRenderProcSkip: Boolean; +begin + Result := True; +end; + +// ------------------------------------------------------------------------------ +// TCustomRendererCache +// ------------------------------------------------------------------------------ + +constructor TCustomRendererCache.Create; begin inherited Create; fColorRenderer := TColorRenderer.Create; fAliasedColorRenderer := TAliasedColorRenderer.Create; + fMaskRenderer := TMaskRenderer.Create; end; // ------------------------------------------------------------------------------ -destructor TCustomColorRendererCache.Destroy; +destructor TCustomRendererCache.Destroy; begin fColorRenderer.Free; fAliasedColorRenderer.Free; + fMaskRenderer.Free; end; // ------------------------------------------------------------------------------ -function TCustomColorRendererCache.GetColorRenderer(color: TColor32): TColorRenderer; +function TCustomRendererCache.GetColorRenderer(color: TColor32): TColorRenderer; begin Result := fColorRenderer; Result.SetColor(color); @@ -2200,7 +2394,7 @@ procedure DrawLine(img: TImage32; const line: TPathD; lineWidth: double; // ------------------------------------------------------------------------------ procedure DrawLine(img: TImage32; const line: TPathD; lineWidth: double; - color: TColor32; rendererCache: TCustomColorRendererCache; + color: TColor32; rendererCache: TCustomRendererCache; endStyle: TEndStyle; joinStyle: TJoinStyle; miterLimit: double); var lines: TPathsD; @@ -2255,7 +2449,7 @@ procedure DrawLine(img: TImage32; const lines: TPathsD; // ------------------------------------------------------------------------------ procedure DrawLine(img: TImage32; const lines: TPathsD; - lineWidth: double; color: TColor32; rendererCache: TCustomColorRendererCache; + lineWidth: double; color: TColor32; rendererCache: TCustomRendererCache; endStyle: TEndStyle; joinStyle: TJoinStyle; miterLimit: double); var cr: TCustomColorRenderer; @@ -2283,11 +2477,7 @@ procedure DrawLine(img: TImage32; const lines: TPathsD; if (not assigned(lines)) or (not assigned(renderer)) then exit; if (lineWidth < MinStrokeWidth) then lineWidth := MinStrokeWidth; lines2 := RoughOutline(lines, lineWidth, joinStyle, endStyle, miterLimit); - if renderer.Initialize(img) then - begin - Rasterize(lines2, img.bounds, frNonZero, renderer); - renderer.NotifyChange; - end; + Rasterize(img, lines2, img.bounds, frNonZero, renderer); end; // ------------------------------------------------------------------------------ @@ -2303,11 +2493,7 @@ procedure DrawInvertedLine(img: TImage32; lines2 := RoughOutline(lines, lineWidth, joinStyle, endStyle, 2); ir := TInverseRenderer.Create; try - if ir.Initialize(img) then - begin - Rasterize(lines2, img.bounds, frNonZero, ir); - ir.NotifyChange; - end; + Rasterize(img, lines2, img.bounds, frNonZero, ir); finally ir.free; end; @@ -2317,7 +2503,7 @@ procedure DrawInvertedLine(img: TImage32; procedure DrawDashedLine(img: TImage32; const line: TPathD; dashPattern: TArrayOfDouble; patternOffset: PDouble; lineWidth: double; color: TColor32; endStyle: TEndStyle; joinStyle: TJoinStyle; - rendererCache: TCustomColorRendererCache); + rendererCache: TCustomRendererCache); var lines: TPathsD; cr: TColorRenderer; @@ -2350,11 +2536,7 @@ procedure DrawDashedLine(img: TImage32; const line: TPathD; cr := TColorRenderer.Create(color) else cr := rendererCache.GetColorRenderer(color); try - if cr.Initialize(img) then - begin - Rasterize(lines, img.bounds, frNonZero, cr); - cr.NotifyChange; - end; + Rasterize(img, lines, img.bounds, frNonZero, cr); finally if rendererCache = nil then cr.free; @@ -2365,7 +2547,7 @@ procedure DrawDashedLine(img: TImage32; const line: TPathD; procedure DrawDashedLine(img: TImage32; const lines: TPathsD; dashPattern: TArrayOfDouble; patternOffset: PDouble; lineWidth: double; color: TColor32; endStyle: TEndStyle; joinStyle: TJoinStyle; - rendererCache: TCustomColorRendererCache); + rendererCache: TCustomRendererCache); var i: integer; begin @@ -2393,11 +2575,7 @@ procedure DrawDashedLine(img: TImage32; const line: TPathD; lines := GetDashedPath(line, endStyle = esPolygon, dashPattern, patternOffset); if Length(lines) = 0 then Exit; lines := RoughOutline(lines, lineWidth, joinStyle, endStyle); - if renderer.Initialize(img) then - begin - Rasterize(lines, img.bounds, frNonZero, renderer); - renderer.NotifyChange; - end; + Rasterize(img, lines, img.bounds, frNonZero, renderer); end; // ------------------------------------------------------------------------------ @@ -2434,11 +2612,7 @@ procedure DrawInvertedDashedLine(img: TImage32; lines := RoughOutline(lines, lineWidth, joinStyle, endStyle); renderer := TInverseRenderer.Create; try - if renderer.Initialize(img) then - begin - Rasterize(lines, img.bounds, frNonZero, renderer); - renderer.NotifyChange; - end; + Rasterize(img, lines, img.bounds, frNonZero, renderer); finally renderer.Free; end; @@ -2479,11 +2653,7 @@ procedure DrawPolygon(img: TImage32; const polygon: TPathD; if (not assigned(polygon)) or (not assigned(renderer)) then exit; setLength(polygons, 1); polygons[0] := polygon; - if renderer.Initialize(img) then - begin - Rasterize(polygons, img.Bounds, fillRule, renderer); - renderer.NotifyChange; - end; + Rasterize(img, polygons, img.Bounds, fillRule, renderer); end; // ------------------------------------------------------------------------------ @@ -2497,11 +2667,7 @@ procedure DrawPolygon(img: TImage32; const polygons: TPathsD; cr := TColorRenderer.Create(color) else cr := TAliasedColorRenderer.Create(color); try - if cr.Initialize(img) then - begin - Rasterize(polygons, img.bounds, fillRule, cr); - cr.NotifyChange; - end; + Rasterize(img, polygons, img.bounds, fillRule, cr); finally cr.free; end; @@ -2510,7 +2676,7 @@ procedure DrawPolygon(img: TImage32; const polygons: TPathsD; procedure DrawPolygon(img: TImage32; const polygons: TPathsD; fillRule: TFillRule; color: TColor32; - rendererCache: TCustomColorRendererCache); + rendererCache: TCustomRendererCache); var cr: TCustomColorRenderer; begin @@ -2523,11 +2689,7 @@ procedure DrawPolygon(img: TImage32; const polygons: TPathsD; cr := rendererCache.ColorRenderer else cr := rendererCache.AliasedColorRenderer; cr.SetColor(color); - if cr.Initialize(img) then - begin - Rasterize(polygons, img.bounds, fillRule, cr); - cr.NotifyChange; - end; + Rasterize(img, polygons, img.bounds, fillRule, cr); end; end; // ------------------------------------------------------------------------------ @@ -2536,11 +2698,7 @@ procedure DrawPolygon(img: TImage32; const polygons: TPathsD; fillRule: TFillRule; renderer: TCustomRenderer); begin if (not assigned(polygons)) or (not assigned(renderer)) then exit; - if renderer.Initialize(img) then - begin - Rasterize(polygons, img.bounds, fillRule, renderer); - renderer.NotifyChange; - end; + Rasterize(img, polygons, img.bounds, fillRule, renderer); end; // ------------------------------------------------------------------------------ @@ -2564,11 +2722,7 @@ procedure DrawInvertedPolygon(img: TImage32; const polygons: TPathsD; if not assigned(polygons) then exit; cr := TInverseRenderer.Create; try - if cr.Initialize(img) then - begin - Rasterize(polygons, img.bounds, fillRule, cr); - cr.NotifyChange; - end; + Rasterize(img, polygons, img.bounds, fillRule, cr); finally cr.free; end; @@ -2594,8 +2748,7 @@ procedure DrawPolygon_ClearType(img: TImage32; const polygons: TPathsD; tmpPolygons := ScalePath(tmpPolygons, 3, 1); cr := TColorRenderer.Create(clBlack32); try - if cr.Initialize(tmpImg) then - Rasterize(tmpPolygons, tmpImg.bounds, fillRule, cr); + Rasterize(tmpImg, tmpPolygons, tmpImg.bounds, fillRule, cr); finally cr.Free; end; @@ -2626,11 +2779,7 @@ procedure ErasePolygon(img: TImage32; const polygons: TPathsD; begin er := TEraseRenderer.Create; try - if er.Initialize(img) then - begin - Rasterize(polygons, img.bounds, fillRule, er); - er.NotifyChange; - end; + Rasterize(img, polygons, img.bounds, fillRule, er); finally er.Free; end; diff --git a/Image32/source/Img32.Extra.pas b/Image32/source/Img32.Extra.pas index 1380658..b0e7f62 100644 --- a/Image32/source/Img32.Extra.pas +++ b/Image32/source/Img32.Extra.pas @@ -108,7 +108,7 @@ procedure EraseOutsidePath(img: TImage32; const path: TPathD; fillRule: TFillRule; const outsideBounds: TRect); procedure EraseOutsidePaths(img: TImage32; const paths: TPathsD; fillRule: TFillRule; const outsideBounds: TRect; - rendererCache: TCustomColorRendererCache = nil); overload; + rendererCache: TCustomRendererCache = nil); overload; procedure Draw3D(img: TImage32; const polygon: TPathD; fillRule: TFillRule; height, blurRadius: double; @@ -938,43 +938,86 @@ procedure EraseInsidePaths(img: TImage32; const paths: TPathsD; fillRule: TFillR end; //------------------------------------------------------------------------------ +procedure EraseOutsideRect(img: TImage32; const r, outsideBounds: TRect); +begin + // Fill the parts, that are in outsideBounds but not in r with zeros + + // whole top block + if r.Top > outsideBounds.Top then + img.FillRect(Rect(outsideBounds.Left, outsideBounds.Top, outsideBounds.Right, r.Top - 1), 0); + // whole bottom block + if r.Bottom < outsideBounds.Bottom then + img.FillRect(Rect(outsideBounds.Left, r.Bottom + 1, outsideBounds.Right, outsideBounds.Bottom), 0); + + // remaining left block + if r.Left > outsideBounds.Left then + img.FillRect(Rect(outsideBounds.Left, r.Top, r.Left - 1, r.Bottom), 0); + // remaining right block + if r.Right < outsideBounds.Right then + img.FillRect(Rect(r.Right + 1, r.Top, outsideBounds.Right, r.Bottom), 0); +end; +//------------------------------------------------------------------------------ + procedure EraseOutsidePath(img: TImage32; const path: TPathD; fillRule: TFillRule; const outsideBounds: TRect); var - mask: TImage32; - p: TPathD; - w,h: integer; + w, h: integer; + renderer: TMaskRenderer; + r: TRect; + polygons: TPathsD; begin if not assigned(path) then Exit; - RectWidthHeight(outsideBounds, w,h); - mask := TImage32.Create(w, h); + RectWidthHeight(outsideBounds, w, h); + if (w <= 0) or (h <= 0) then Exit; + + // We can skip the costly polygon rasterization if the path is + // a rectangle + if (fillRule in [frEvenOdd, frNonZero]) and IsSimpleRectanglePath(path, r) then + begin + EraseOutsideRect(img, r, outsideBounds); + Exit; + end; + + renderer := TMaskRenderer.Create; try - p := TranslatePath(path, -outsideBounds.Left, -outsideBounds.top); - DrawPolygon(mask, p, fillRule, clBlack32); - img.CopyBlend(mask, mask.Bounds, outsideBounds, BlendMaskLine); + SetLength(polygons, 1); + polygons[0] := path; + Rasterize(img, polygons, outsideBounds, fillRule, renderer); finally - mask.Free; + renderer.Free; end; end; //------------------------------------------------------------------------------ procedure EraseOutsidePaths(img: TImage32; const paths: TPathsD; fillRule: TFillRule; const outsideBounds: TRect; - rendererCache: TCustomColorRendererCache); + rendererCache: TCustomRendererCache); var - mask: TImage32; - pp: TPathsD; - w,h: integer; + w, h: integer; + renderer: TMaskRenderer; + r: TRect; begin if not assigned(paths) then Exit; - RectWidthHeight(outsideBounds, w,h); - mask := TImage32.Create(w, h); + RectWidthHeight(outsideBounds, w, h); + if (w <= 0) or (h <= 0) then Exit; + + // We can skip the costly polygon rasterization if the path is + // a rectangle. + if (fillRule in [frEvenOdd, frNonZero]) and IsSimpleRectanglePath(paths, r) then + begin + EraseOutsideRect(img, r, outsideBounds); + Exit; + end; + + if rendererCache = nil then + renderer := TMaskRenderer.Create + else + renderer := rendererCache.MaskRenderer; try - pp := TranslatePath(paths, -outsideBounds.Left, -outsideBounds.top); - DrawPolygon(mask, pp, fillRule, clBlack32, rendererCache); - img.CopyBlend(mask, mask.Bounds, outsideBounds, BlendMaskLine); + Rasterize(img, paths, outsideBounds, fillRule, renderer); finally - mask.Free; + if rendererCache = nil then + renderer.Free; end; end; //------------------------------------------------------------------------------ diff --git a/Image32/source/Img32.SVG.Reader.pas b/Image32/source/Img32.SVG.Reader.pas index 5cbb824..7316ca4 100644 --- a/Image32/source/Img32.SVG.Reader.pas +++ b/Image32/source/Img32.SVG.Reader.pas @@ -120,7 +120,7 @@ TSvgReader = class fClassStyles : TClassStylesList; fLinGradRenderer : TLinearGradientRenderer; fRadGradRenderer : TSvgRadialGradientRenderer; - fCustomColorRendererCache: TCustomColorRendererCache; + fCustomRendererCache: TCustomRendererCache; fRootElement : TSvgElement; fFontCache : TFontCache; fUsePropScale : Boolean; @@ -1016,9 +1016,9 @@ procedure TGroupElement.Draw(image: TImage32; drawDat: TDrawData); begin if fDrawData.fillRule = frNegative then EraseOutsidePaths(tmpImg, clipPaths, frNonZero, clipRec, - fReader.fCustomColorRendererCache) else + fReader.fCustomRendererCache) else EraseOutsidePaths(tmpImg, clipPaths, fDrawData.fillRule, clipRec, - fReader.fCustomColorRendererCache); + fReader.fCustomRendererCache); end; image.CopyBlend(tmpImg, clipRec, clipRec, BlendToAlphaLine); finally @@ -2122,7 +2122,7 @@ procedure TFeGaussElement.Apply; // FastGaussianBlur is a very good approximation and also very much faster. // Empirically stdDev * PI/4 more closely emulates other renderers. - FastGaussianBlur(dstImg, dstRec, Ceil(stdDev * PI/4 * ParentFilterEl.fScale)); + FastGaussianBlur(dstImg, dstRec, Ceil(stdDev * (PI/4) * ParentFilterEl.fScale)); end; //------------------------------------------------------------------------------ @@ -2395,9 +2395,9 @@ procedure TShapeElement.Draw(image: TImage32; drawDat: TDrawData); begin if fDrawData.fillRule = frNegative then EraseOutsidePaths(img, clipPaths, frNonZero, clipRec2, - fReader.fCustomColorRendererCache) else + fReader.fCustomRendererCache) else EraseOutsidePaths(img, clipPaths, fDrawData.fillRule, clipRec2, - fReader.fCustomColorRendererCache); + fReader.fCustomRendererCache); end; if usingTempImage and (img <> image) then @@ -2540,14 +2540,14 @@ procedure TShapeElement.DrawFilled(img: TImage32; drawDat: TDrawData); else if drawDat.fillColor = clInvalid then begin DrawPolygon(img, fillPaths, drawDat.fillRule, clBlack32, - fReader.fCustomColorRendererCache); + fReader.fCustomRendererCache); end else with drawDat do begin DrawPolygon(img, fillPaths, fillRule, MergeColorAndOpacity(fillColor, fillOpacity), - fReader.fCustomColorRendererCache); + fReader.fCustomRendererCache); end; end; //------------------------------------------------------------------------------ @@ -2629,7 +2629,7 @@ procedure TShapeElement.DrawStroke(img: TImage32; strokePaths := MatrixApply(drawPathsO, drawDat.matrix); DrawDashedLine(img, strokePaths, dashArray, @dashOffset, sw * scale, strokeClr, endStyle, jsAuto, - fReader.fCustomColorRendererCache); + fReader.fCustomRendererCache); Exit; end; strokePaths := RoughOutline(drawPathsO, sw, joinStyle, endStyle, lim); @@ -2662,7 +2662,7 @@ procedure TShapeElement.DrawStroke(img: TImage32; end; end else begin - DrawPolygon(img, strokePaths, frNonZero, strokeClr, fReader.fCustomColorRendererCache); + DrawPolygon(img, strokePaths, frNonZero, strokeClr, fReader.fCustomRendererCache); end; end; @@ -4902,7 +4902,7 @@ constructor TSvgReader.Create; fClassStyles := TClassStylesList.Create; fLinGradRenderer := TLinearGradientRenderer.Create; fRadGradRenderer := TSvgRadialGradientRenderer.Create; - fCustomColorRendererCache := TCustomColorRendererCache.Create; + fCustomRendererCache := TCustomRendererCache.Create; fIdList := TStringList.Create; fIdList.Duplicates := dupIgnore; fIdList.CaseSensitive := false; @@ -4925,7 +4925,7 @@ destructor TSvgReader.Destroy; fLinGradRenderer.Free; fRadGradRenderer.Free; - fCustomColorRendererCache.Free; + fCustomRendererCache.Free; FreeAndNil(fFontCache); fSimpleDrawList.Free; diff --git a/Image32/source/Img32.Vector.pas b/Image32/source/Img32.Vector.pas index 85caa15..bcc8a20 100644 --- a/Image32/source/Img32.Vector.pas +++ b/Image32/source/Img32.Vector.pas @@ -275,6 +275,11 @@ interface function IsClockwise(const path: TPathD): Boolean; + // IsSimpleRectanglePath returns true if the specified path has only one polygon + // with 4 points that describe a rectangle. + function IsSimpleRectanglePath(const paths: TPathsD; var R: TRect): Boolean; overload; + function IsSimpleRectanglePath(const path: TPathD; var R: TRect): Boolean; overload; + function Area(const path: TPathD): Double; overload; function RectsEqual(const rec1, rec2: TRect): Boolean; @@ -791,6 +796,63 @@ function IsClockwise(const path: TPathD): Boolean; end; //------------------------------------------------------------------------------ +function IsSimpleRectanglePath(const path: TPathD; var R: TRect): Boolean; +type + TLastMatch = (lmX, lmY); +var + i: Integer; + lastMatch: TLastMatch; +begin + Result := False; + // If we have a single path with 4 points, it could be a rectangle + if Length(path) = 4 then + begin + // For a rectangle the X and Y coordinates of the points alternate + // in being equal + if path[0].X = path[3].X then + lastMatch := lmX + else if path[0].Y = path[3].Y then + lastMatch := lmY + else + Exit; + + R.Left := Trunc(path[0].X); + R.Top := Trunc(path[0].Y); + R.Right := Ceil(path[0].X); + R.Bottom := Ceil(path[0].Y); + for i := 1 to 3 do + begin + case lastMatch of + lmY: // now the X-coordinates must be equal + begin + if path[i].X <> path[i - 1].X then Exit; + lastMatch := lmX; + R.Top := Min(R.Top, Trunc(path[i].Y)); + R.Bottom := Max(R.Bottom, Ceil(path[i].Y)); + end; + lmX: // now the Y-coordinates must be equal + begin + if path[i].Y <> path[i - 1].Y then Exit; + lastMatch := lmY; + R.Left := Min(R.Left, Trunc(path[i].X)); + R.Right := Max(R.Right, Ceil(path[i].X)); + end; + end; + end; + Result := True; + end; +end; + +//------------------------------------------------------------------------------ +function IsSimpleRectanglePath(const paths: TPathsD; var R: TRect): Boolean; +begin + if (Length(paths) = 1) and (Length(paths[0]) = 4) then + Result := IsSimpleRectanglePath(paths[0], r) + else + Result := False; +end; +//------------------------------------------------------------------------------ + function Area(const path: TPathD): Double; var i, j, highI: Integer; @@ -1915,7 +1977,7 @@ procedure ConcatPaths(var dstPath: TPathD; const paths: TPathsD); pathLen := Length(paths[i]); if pathLen > 0 then begin - // Skip the start-point if is matches the previous path's end-point + // Skip the start-point if it matches the previous path's end-point if (i > 0) and PointsEqual(paths[i][0], paths[i -1][high(paths[i -1])]) then dec(pathLen); inc(len, pathLen); @@ -1931,14 +1993,19 @@ procedure ConcatPaths(var dstPath: TPathD; const paths: TPathsD); if pathLen > 0 then begin offset := 0; - // Skip the start-point if is matches the previous path's end-point + // Skip the start-point if it matches the previous path's end-point if (i > 0) and PointsEqual(paths[i][0], paths[i -1][high(paths[i -1])]) then begin dec(pathLen); offset := 1; end; - Move(paths[i][offset], dstPath[len], pathLen * SizeOf(TPointD)); - inc(len, pathLen); + // Skip if we have a path with only one point and that point also matches + // the previous path's end-point. + if pathLen > 0 then + begin + Move(paths[i][offset], dstPath[len], pathLen * SizeOf(TPointD)); + inc(len, pathLen); + end; end; end; end; diff --git a/Image32/source/Img32.pas b/Image32/source/Img32.pas index d39a94a..5d49f35 100644 --- a/Image32/source/Img32.pas +++ b/Image32/source/Img32.pas @@ -1269,6 +1269,8 @@ function BlendMask(bgColor, alphaMask: TColor32): TColor32; {$RANGECHECKS OFF} // negative array index is used procedure BlendMaskLine(bgColor, alphaMask: PColor32; width: nativeint); +label + SkipNone32; var a: byte; begin @@ -1283,6 +1285,13 @@ procedure BlendMaskLine(bgColor, alphaMask: PColor32; width: nativeint); // common values. while width < 0 do begin + // MulTable[0, fgA] -> 0, if bgColor is already 0 => skip + while PStaticARGBArray(bgColor)[width].Color = 0 do + begin +SkipNone32: + inc(width); + if width = 0 then exit; + end; a := PStaticARGBArray(bgColor)[width].A; // MulTable[0, fgA] -> 0 => replace color with 0 while a = 0 do @@ -1290,6 +1299,8 @@ procedure BlendMaskLine(bgColor, alphaMask: PColor32; width: nativeint); PStaticColor32Array(bgColor)[width] := 0; inc(width); if width = 0 then exit; + if PStaticARGBArray(bgColor)[width].Color = 0 then + goto SkipNone32; a := PStaticARGBArray(bgColor)[width].A; end; // MulTable[255, fgA] -> fgA => replace alpha with fgA @@ -3707,12 +3718,15 @@ procedure TImage32.ReduceOpacity(opacity: Byte); var i: Integer; c: PARGB; + a: Byte; begin if opacity = 255 then Exit; c := PARGB(PixelBase); for i := 0 to Width * Height -1 do begin - c.A := MulTable[c.A, opacity]; + a := c.A; + if a <> 0 then + c.A := MulTable[a, opacity]; inc(c); end; Changed; @@ -3723,19 +3737,24 @@ procedure TImage32.ReduceOpacity(opacity: Byte; rec: TRect); var i,j, rw: Integer; c: PARGB; + a: Byte; + lineOffsetInBytes: integer; begin Types.IntersectRect(rec, rec, bounds); if IsEmptyRect(rec) then Exit; rw := RectWidth(rec); c := @Pixels[rec.Top * Width + rec.Left]; - for i := rec.Top to rec.Bottom -1 do + lineOffsetInBytes := (Width - rw) * SizeOf(TARGB); + for i := rec.Top to rec.Bottom - 1 do begin for j := 1 to rw do begin - c.A := MulTable[c.A, opacity]; + a := c.A; + if a <> 0 then + c.A := MulTable[a, opacity]; inc(c); end; - inc(c, Width - rw); + inc(PByte(c), lineOffsetInBytes); end; Changed; end; diff --git a/Packages/D11/SVGIconImageListFMX.dproj b/Packages/D11/SVGIconImageListFMX.dproj index b547cbb..9bad99a 100644 --- a/Packages/D11/SVGIconImageListFMX.dproj +++ b/Packages/D11/SVGIconImageListFMX.dproj @@ -149,10 +149,7 @@ MainSource - - - diff --git a/Packages/D12/SVGIconImageList.dproj b/Packages/D12/SVGIconImageList.dproj index def3f71..9cbefcc 100644 --- a/Packages/D12/SVGIconImageList.dproj +++ b/Packages/D12/SVGIconImageList.dproj @@ -2,7 +2,7 @@ {B5E8B9F1-C42D-4AFC-AE08-193731C6515B} SVGIconImageList.dpk - 20.1 + 20.2 VCL True Release @@ -45,12 +45,6 @@ Base true - - true - Cfg_2 - true - true - ..\..\Lib\D12\$(Platform)\$(Config) .\$(Platform)\$(Config) diff --git a/Packages/D12/SVGIconImageListFMX.dproj b/Packages/D12/SVGIconImageListFMX.dproj index be11ea6..5670052 100644 --- a/Packages/D12/SVGIconImageListFMX.dproj +++ b/Packages/D12/SVGIconImageListFMX.dproj @@ -2,7 +2,7 @@ {45F75DEA-42F2-4C8C-AA3A-0C8FF47BEE1F} SVGIconImageListFMX.dpk - 20.1 + 20.2 FMX True Release @@ -54,11 +54,6 @@ Base true - - true - Base - true - true Base @@ -155,10 +150,7 @@ MainSource - - - diff --git a/Packages/D12/SVGImage32Package.dproj b/Packages/D12/SVGImage32Package.dproj index 9b8f01d..194d8f1 100644 --- a/Packages/D12/SVGImage32Package.dproj +++ b/Packages/D12/SVGImage32Package.dproj @@ -2,7 +2,7 @@ {D0A69637-2974-4401-9226-4F66893CB5CE} SVGImage32Package.dpk - 20.1 + 20.2 VCL True Release @@ -19,16 +19,6 @@ Base true - - true - Base - true - - - true - Base - true - true Base diff --git a/Packages/D12/dclSVGIconImageList.dproj b/Packages/D12/dclSVGIconImageList.dproj index 8a3a1af..28a3cba 100644 --- a/Packages/D12/dclSVGIconImageList.dproj +++ b/Packages/D12/dclSVGIconImageList.dproj @@ -2,7 +2,7 @@ {265E39DA-3CDF-4D32-A71B-DE971C864350} dclSVGIconImageList.dpk - 20.1 + 20.2 VCL True Release @@ -19,11 +19,6 @@ Base true - - true - Base - true - true Base diff --git a/Packages/D12/dclSVGIconImageListFMX.dproj b/Packages/D12/dclSVGIconImageListFMX.dproj index c203151..22f57ca 100644 --- a/Packages/D12/dclSVGIconImageListFMX.dproj +++ b/Packages/D12/dclSVGIconImageListFMX.dproj @@ -2,7 +2,7 @@ {D45ECCFB-40F6-46F7-8BC3-DBFAA3C12B32} dclSVGIconImageListFMX.dpk - 20.1 + 20.2 FMX True Release diff --git a/Packages/FMX.SVGIconImageListEditorUnit.fmx b/Packages/FMX.SVGIconImageListEditorUnit.fmx index 5b21b9c..9894d71 100644 --- a/Packages/FMX.SVGIconImageListEditorUnit.fmx +++ b/Packages/FMX.SVGIconImageListEditorUnit.fmx @@ -16,145 +16,144 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX OnShow = FormShow DesignerMasterStyle = 0 object ListBoxItemStyleBook: TStyleBook + StyleName = 'ListBoxItemStyleBook' Styles = < item - end - item - Platform = 'Windows 10 Desktop' ResourcesBin = { 464D585F5354594C4520322E35010616437573746F6D4C697374426F78497465 - 6D5374796C65037010005450463007544C61796F757400095374796C654E616D + 6D5374796C65037910005450463007544C61796F757400095374796C654E616D 650616437573746F6D4C697374426F784974656D5374796C6505416C69676E07 0643656E7465720A53697A652E57696474680500000000000000B406400B5369 7A652E48656967687405000000000000008005401453697A652E506C6174666F - 726D44656661756C7408085461624F726465720200000654476C797068000953 - 74796C654E616D65060A676C7970687374796C650C4D617267696E732E4C6566 - 7405000000000000008000400B4D617267696E732E546F700500000000000000 - 80FF3F0D4D617267696E732E526967687405000000000000008000400E4D6172 - 67696E732E426F74746F6D050000000000000080FF3F05416C69676E07044C65 - 66740A53697A652E576964746805000000000000008005400B53697A652E4865 - 6967687405000000000000008005401453697A652E506C6174666F726D446566 - 61756C7408000016544163746976655374796C65546578744F626A6563740009 - 5374796C654E616D6506047465787405416C69676E0706436C69656E740C4D61 - 7267696E732E4C6566740500000000000000C000400B4D617267696E732E546F + 726D44656661756C74080756697369626C6508085461624F7264657202000006 + 54476C79706800095374796C654E616D65060A676C7970687374796C650C4D61 + 7267696E732E4C65667405000000000000008000400B4D617267696E732E546F 70050000000000000080FF3F0D4D617267696E732E5269676874050000000000 - 0000C000400E4D617267696E732E426F74746F6D050000000000000080FF3F0A - 53697A652E57696474680500000000000000AE06400B53697A652E4865696768 - 740500000000000000F804401453697A652E506C6174666F726D44656661756C - 74080454657874060454657874155465787453657474696E67732E576F726457 - 72617008165465787453657474696E67732E486F727A416C69676E07074C6561 - 64696E670D536861646F7756697369626C65080D416374697665547269676765 - 72070853656C65637465640B416374697665436F6C6F720708636C61426C6163 - 6B00000954436865636B426F7800095374796C654E616D650605636865636B05 - 416C69676E07044C6566740843616E466F637573081244697361626C65466F63 - 7573456666656374090A53697A652E57696474680500000000000000A003400B - 53697A652E48656967687405000000000000009803401453697A652E506C6174 - 666F726D44656661756C74080B5374796C654C6F6F6B757006204C697374426F - 784974656D315374796C6531436865636B426F785374796C6531075669736962 - 6C6508000007544C61796F757400095374796C654E616D65060D616363657373 - 6F72796D6F726505416C69676E07094D6F737452696768740A53697A652E5769 - 6474680500000000000000B003400B53697A652E486569676874050000000000 - 0000B004401453697A652E506C6174666F726D44656661756C74080756697369 - 626C65080012544163746976655374796C654F626A6563740005416C69676E07 - 0643656E7465720C536F757263654C6F6F6B7570061B57696E646F7773203130 - 204465736B746F707374796C652E706E670A53697A652E576964746805000000 - 00000000B002400B53697A652E48656967687405000000000000008003401453 - 697A652E506C6174666F726D44656661756C740808577261704D6F6465070643 - 656E7465720D41637469766554726967676572070853656C65637465640A4163 - 746976654C696E6B0E010F536F75726365526563742E4C656674050000000000 - 00008706400E536F75726365526563742E546F700500000000000000B3074010 - 536F75726365526563742E5269676874050000000000000092064011536F7572 - 6365526563742E426F74746F6D0500000000000000BB07400001055363616C65 - 0500000000000000C0FF3F0F536F75726365526563742E4C6566740500000000 - 000000CA06400E536F75726365526563742E546F700500000000000040860840 - 10536F75726365526563742E52696768740500000000000000DA064011536F75 - 726365526563742E426F74746F6D05000000000000408C08400001055363616C - 6505000000000000008000400F536F75726365526563742E4C65667405000000 - 000000008707400E536F75726365526563742E546F700500000000000000B308 - 4010536F75726365526563742E5269676874050000000000000092074011536F - 75726365526563742E426F74746F6D0500000000000000BB084000000A536F75 - 7263654C696E6B0E010F536F75726365526563742E4C65667405000000000000 - 008706400E536F75726365526563742E546F700500000000000000B307401053 - 6F75726365526563742E5269676874050000000000000092064011536F757263 - 65526563742E426F74746F6D0500000000000000BB07400001055363616C6505 - 00000000000000C0FF3F0F536F75726365526563742E4C656674050000000000 - 0000CA06400E536F75726365526563742E546F70050000000000004086084010 - 536F75726365526563742E52696768740500000000000000DA064011536F7572 - 6365526563742E426F74746F6D05000000000000408C08400001055363616C65 - 05000000000000008000400F536F75726365526563742E4C6566740500000000 - 0000008707400E536F75726365526563742E546F700500000000000000B30840 - 10536F75726365526563742E5269676874050000000000000092074011536F75 - 726365526563742E426F74746F6D0500000000000000BB0840000013546F7563 - 68416E696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374 - 796C654E616D6506126163636573736F7279636865636B6D61726B05416C6967 - 6E07094D6F737452696768740A53697A652E57696474680500000000000000B0 - 03400B53697A652E4865696768740500000000000000B004401453697A652E50 - 6C6174666F726D44656661756C74080756697369626C65080012544163746976 - 655374796C654F626A6563740005416C69676E070643656E7465720C536F7572 - 63654C6F6F6B7570061B57696E646F7773203130204465736B746F707374796C - 652E706E670A53697A652E576964746805000000000000008803400B53697A65 - 2E48656967687405000000000000008803401453697A652E506C6174666F726D - 44656661756C740808577261704D6F6465070643656E7465720D416374697665 - 54726967676572070853656C65637465640A4163746976654C696E6B0E010F53 - 6F75726365526563742E4C65667405000000000000009706400E536F75726365 - 526563742E546F700500000000000080B2074010536F75726365526563742E52 - 696768740500000000000000A8064011536F75726365526563742E426F74746F - 6D0500000000000000BB07400001055363616C650500000000000000C0FF3F0F - 536F75726365526563742E4C6566740500000000000000E206400E536F757263 - 65526563742E546F70050000000000000086084010536F75726365526563742E - 52696768740500000000000000FC064011536F75726365526563742E426F7474 - 6F6D05000000000000808C08400001055363616C650500000000000000800040 - 0F536F75726365526563742E4C65667405000000000000009707400E536F7572 - 6365526563742E546F700500000000000080B2084010536F7572636552656374 - 2E52696768740500000000000000A8074011536F75726365526563742E426F74 - 746F6D0500000000000000BB084000000A536F757263654C696E6B0E010F536F - 75726365526563742E4C65667405000000000000009706400E536F7572636552 - 6563742E546F700500000000000080B2074010536F75726365526563742E5269 - 6768740500000000000000A8064011536F75726365526563742E426F74746F6D - 0500000000000000BB07400001055363616C650500000000000000C0FF3F0F53 - 6F75726365526563742E4C6566740500000000000000E206400E536F75726365 - 526563742E546F70050000000000000086084010536F75726365526563742E52 - 696768740500000000000000FC064011536F75726365526563742E426F74746F - 6D05000000000000808C08400001055363616C6505000000000000008000400F - 536F75726365526563742E4C65667405000000000000009707400E536F757263 - 65526563742E546F700500000000000080B2084010536F75726365526563742E - 52696768740500000000000000A8074011536F75726365526563742E426F7474 - 6F6D0500000000000000BB0840000013546F756368416E696D6174696F6E2E4C - 696E6B0E0000000007544C61796F757400095374796C654E616D65060F616363 - 6573736F727964657461696C05416C69676E07094D6F737452696768740A5369 - 7A652E57696474680500000000000000B003400B53697A652E48656967687405 - 00000000000000B004401453697A652E506C6174666F726D44656661756C7408 - 0756697369626C65080012544163746976655374796C654F626A656374000541 - 6C69676E070643656E7465720C536F757263654C6F6F6B7570061B57696E646F - 7773203130204465736B746F707374796C652E706E670A53697A652E57696474 - 6805000000000000008803400B53697A652E4865696768740500000000000000 - F002401453697A652E506C6174666F726D44656661756C740808577261704D6F - 6465070643656E7465720D41637469766554726967676572070853656C656374 - 65640A4163746976654C696E6B0E010F536F75726365526563742E4C65667405 - 00000000000000AD06400E536F75726365526563742E546F7005000000000000 - 00B3074010536F75726365526563742E52696768740500000000000000BE0640 - 11536F75726365526563742E426F74746F6D0500000000000080BA0740000105 - 5363616C650500000000000000C0FF3F0F536F75726365526563742E4C656674 - 05000000000000008207400E536F75726365526563742E546F70050000000000 - 004086084010536F75726365526563742E526967687405000000000000008F07 - 4011536F75726365526563742E426F74746F6D05000000000000C08B08400001 - 055363616C6505000000000000008000400F536F75726365526563742E4C6566 - 740500000000000000AD07400E536F75726365526563742E546F700500000000 - 000000B3084010536F75726365526563742E52696768740500000000000000BE - 074011536F75726365526563742E426F74746F6D0500000000000080BA084000 - 000A536F757263654C696E6B0E010F536F75726365526563742E4C6566740500 - 000000000000AD06400E536F75726365526563742E546F700500000000000000 - B3074010536F75726365526563742E52696768740500000000000000BE064011 - 536F75726365526563742E426F74746F6D0500000000000080BA074000010553 - 63616C650500000000000000C0FF3F0F536F75726365526563742E4C65667405 - 000000000000008207400E536F75726365526563742E546F7005000000000000 - 4086084010536F75726365526563742E526967687405000000000000008F0740 - 11536F75726365526563742E426F74746F6D05000000000000C08B0840000105 - 5363616C6505000000000000008000400F536F75726365526563742E4C656674 - 0500000000000000AD07400E536F75726365526563742E546F70050000000000 - 0000B3084010536F75726365526563742E52696768740500000000000000BE07 - 4011536F75726365526563742E426F74746F6D0500000000000080BA08400000 - 13546F756368416E696D6174696F6E2E4C696E6B0E0000000000} + 00008000400E4D617267696E732E426F74746F6D050000000000000080FF3F05 + 416C69676E07044C6566740A53697A652E576964746805000000000000008005 + 400B53697A652E48656967687405000000000000008005401453697A652E506C + 6174666F726D44656661756C7408000016544163746976655374796C65546578 + 744F626A65637400095374796C654E616D6506047465787405416C69676E0706 + 436C69656E740C4D617267696E732E4C6566740500000000000000C000400B4D + 617267696E732E546F70050000000000000080FF3F0D4D617267696E732E5269 + 6768740500000000000000C000400E4D617267696E732E426F74746F6D050000 + 000000000080FF3F0A53697A652E57696474680500000000000000AE06400B53 + 697A652E4865696768740500000000000000F804401453697A652E506C617466 + 6F726D44656661756C7408045465787406045465787415546578745365747469 + 6E67732E576F72645772617008165465787453657474696E67732E486F727A41 + 6C69676E07074C656164696E670D536861646F7756697369626C65080D416374 + 69766554726967676572070853656C65637465640B416374697665436F6C6F72 + 0708636C61426C61636B00000954436865636B426F7800095374796C654E616D + 650605636865636B05416C69676E07044C6566740843616E466F637573081244 + 697361626C65466F637573456666656374090A53697A652E5769647468050000 + 0000000000A003400B53697A652E486569676874050000000000000098034014 + 53697A652E506C6174666F726D44656661756C74080B5374796C654C6F6F6B75 + 7006204C697374426F784974656D315374796C6531436865636B426F78537479 + 6C65310756697369626C6508000007544C61796F757400095374796C654E616D + 65060D6163636573736F72796D6F726505416C69676E07094D6F737452696768 + 740A53697A652E57696474680500000000000000B003400B53697A652E486569 + 6768740500000000000000B004401453697A652E506C6174666F726D44656661 + 756C74080756697369626C65080012544163746976655374796C654F626A6563 + 740005416C69676E070643656E7465720C536F757263654C6F6F6B7570061B57 + 696E646F7773203130204465736B746F707374796C652E706E670A53697A652E + 57696474680500000000000000B002400B53697A652E48656967687405000000 + 000000008003401453697A652E506C6174666F726D44656661756C7408085772 + 61704D6F6465070643656E7465720D4163746976655472696767657207085365 + 6C65637465640A4163746976654C696E6B0E010F536F75726365526563742E4C + 65667405000000000000008706400E536F75726365526563742E546F70050000 + 0000000000B3074010536F75726365526563742E526967687405000000000000 + 0092064011536F75726365526563742E426F74746F6D0500000000000000BB07 + 400001055363616C650500000000000000C0FF3F0F536F75726365526563742E + 4C6566740500000000000000CA06400E536F75726365526563742E546F700500 + 00000000004086084010536F75726365526563742E5269676874050000000000 + 0000DA064011536F75726365526563742E426F74746F6D05000000000000408C + 08400001055363616C6505000000000000008000400F536F7572636552656374 + 2E4C65667405000000000000008707400E536F75726365526563742E546F7005 + 00000000000000B3084010536F75726365526563742E52696768740500000000 + 00000092074011536F75726365526563742E426F74746F6D0500000000000000 + BB084000000A536F757263654C696E6B0E010F536F75726365526563742E4C65 + 667405000000000000008706400E536F75726365526563742E546F7005000000 + 00000000B3074010536F75726365526563742E52696768740500000000000000 + 92064011536F75726365526563742E426F74746F6D0500000000000000BB0740 + 0001055363616C650500000000000000C0FF3F0F536F75726365526563742E4C + 6566740500000000000000CA06400E536F75726365526563742E546F70050000 + 000000004086084010536F75726365526563742E526967687405000000000000 + 00DA064011536F75726365526563742E426F74746F6D05000000000000408C08 + 400001055363616C6505000000000000008000400F536F75726365526563742E + 4C65667405000000000000008707400E536F75726365526563742E546F700500 + 000000000000B3084010536F75726365526563742E5269676874050000000000 + 000092074011536F75726365526563742E426F74746F6D0500000000000000BB + 0840000013546F756368416E696D6174696F6E2E4C696E6B0E0000000007544C + 61796F757400095374796C654E616D6506126163636573736F7279636865636B + 6D61726B05416C69676E07094D6F737452696768740A53697A652E5769647468 + 0500000000000000B003400B53697A652E4865696768740500000000000000B0 + 04401453697A652E506C6174666F726D44656661756C74080756697369626C65 + 080012544163746976655374796C654F626A6563740005416C69676E07064365 + 6E7465720C536F757263654C6F6F6B7570061B57696E646F7773203130204465 + 736B746F707374796C652E706E670A53697A652E576964746805000000000000 + 008803400B53697A652E48656967687405000000000000008803401453697A65 + 2E506C6174666F726D44656661756C740808577261704D6F6465070643656E74 + 65720D41637469766554726967676572070853656C65637465640A4163746976 + 654C696E6B0E010F536F75726365526563742E4C656674050000000000000097 + 06400E536F75726365526563742E546F700500000000000080B2074010536F75 + 726365526563742E52696768740500000000000000A8064011536F7572636552 + 6563742E426F74746F6D0500000000000000BB07400001055363616C65050000 + 0000000000C0FF3F0F536F75726365526563742E4C6566740500000000000000 + E206400E536F75726365526563742E546F70050000000000000086084010536F + 75726365526563742E52696768740500000000000000FC064011536F75726365 + 526563742E426F74746F6D05000000000000808C08400001055363616C650500 + 0000000000008000400F536F75726365526563742E4C65667405000000000000 + 009707400E536F75726365526563742E546F700500000000000080B208401053 + 6F75726365526563742E52696768740500000000000000A8074011536F757263 + 65526563742E426F74746F6D0500000000000000BB084000000A536F75726365 + 4C696E6B0E010F536F75726365526563742E4C65667405000000000000009706 + 400E536F75726365526563742E546F700500000000000080B2074010536F7572 + 6365526563742E52696768740500000000000000A8064011536F757263655265 + 63742E426F74746F6D0500000000000000BB07400001055363616C6505000000 + 00000000C0FF3F0F536F75726365526563742E4C6566740500000000000000E2 + 06400E536F75726365526563742E546F70050000000000000086084010536F75 + 726365526563742E52696768740500000000000000FC064011536F7572636552 + 6563742E426F74746F6D05000000000000808C08400001055363616C65050000 + 00000000008000400F536F75726365526563742E4C6566740500000000000000 + 9707400E536F75726365526563742E546F700500000000000080B2084010536F + 75726365526563742E52696768740500000000000000A8074011536F75726365 + 526563742E426F74746F6D0500000000000000BB0840000013546F756368416E + 696D6174696F6E2E4C696E6B0E0000000007544C61796F757400095374796C65 + 4E616D65060F6163636573736F727964657461696C05416C69676E07094D6F73 + 7452696768740A53697A652E57696474680500000000000000B003400B53697A + 652E4865696768740500000000000000B004401453697A652E506C6174666F72 + 6D44656661756C74080756697369626C65080012544163746976655374796C65 + 4F626A6563740005416C69676E070643656E7465720C536F757263654C6F6F6B + 7570061B57696E646F7773203130204465736B746F707374796C652E706E670A + 53697A652E576964746805000000000000008803400B53697A652E4865696768 + 740500000000000000F002401453697A652E506C6174666F726D44656661756C + 740808577261704D6F6465070643656E7465720D416374697665547269676765 + 72070853656C65637465640A4163746976654C696E6B0E010F536F7572636552 + 6563742E4C6566740500000000000000AD06400E536F75726365526563742E54 + 6F700500000000000000B3074010536F75726365526563742E52696768740500 + 000000000000BE064011536F75726365526563742E426F74746F6D0500000000 + 000080BA07400001055363616C650500000000000000C0FF3F0F536F75726365 + 526563742E4C65667405000000000000008207400E536F75726365526563742E + 546F70050000000000004086084010536F75726365526563742E526967687405 + 000000000000008F074011536F75726365526563742E426F74746F6D05000000 + 000000C08B08400001055363616C6505000000000000008000400F536F757263 + 65526563742E4C6566740500000000000000AD07400E536F7572636552656374 + 2E546F700500000000000000B3084010536F75726365526563742E5269676874 + 0500000000000000BE074011536F75726365526563742E426F74746F6D050000 + 0000000080BA084000000A536F757263654C696E6B0E010F536F757263655265 + 63742E4C6566740500000000000000AD06400E536F75726365526563742E546F + 700500000000000000B3074010536F75726365526563742E5269676874050000 + 0000000000BE064011536F75726365526563742E426F74746F6D050000000000 + 0080BA07400001055363616C650500000000000000C0FF3F0F536F7572636552 + 6563742E4C65667405000000000000008207400E536F75726365526563742E54 + 6F70050000000000004086084010536F75726365526563742E52696768740500 + 0000000000008F074011536F75726365526563742E426F74746F6D0500000000 + 0000C08B08400001055363616C6505000000000000008000400F536F75726365 + 526563742E4C6566740500000000000000AD07400E536F75726365526563742E + 546F700500000000000000B3084010536F75726365526563742E526967687405 + 00000000000000BE074011536F75726365526563742E426F74746F6D05000000 + 00000080BA0840000013546F756368416E696D6174696F6E2E4C696E6B0E0000 + 000000} end> Left = 408 Top = 104 @@ -183,7 +182,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 0 Text = 'OK' - TextSettings.Trimming = None end object CancelButton: TButton Anchors = [akTop, akRight] @@ -196,7 +194,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 1 Text = 'Cancel' - TextSettings.Trimming = None end object HelpButton: TButton Anchors = [akTop, akRight] @@ -207,7 +204,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 2 Text = 'Help' - TextSettings.Trimming = None OnClick = HelpButtonClick end end @@ -232,7 +228,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 1 Text = 'Add...' - TextSettings.Trimming = None OnClick = AddButtonClick end object DeleteButton: TButton @@ -243,7 +238,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 2 Text = 'Delete' - TextSettings.Trimming = None OnClick = DeleteButtonClick end object ClearAllButton: TButton @@ -254,7 +248,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 3 Text = 'Clear all' - TextSettings.Trimming = None OnClick = ClearAllButtonClick end object NewButton: TButton @@ -265,7 +258,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.PlatformDefault = False TabOrder = 0 Text = 'New' - TextSettings.Trimming = None OnClick = NewButtonClick end end @@ -278,7 +270,7 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX object ImageListGroupBox: TGroupBox Align = Left Size.Width = 217.000000000000000000 - Size.Height = 346.000000000000000000 + Size.Height = 408.000000000000000000 Size.PlatformDefault = False Text = 'Properties of ImageList' TabOrder = 1 @@ -308,7 +300,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.Width = 107.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False - TextSettings.Trimming = None Text = '% Opacity (default)' TabOrder = 3 end @@ -332,7 +323,6 @@ object SVGIconImageListEditorFMX: TSVGIconImageListEditorFMX Size.Width = 88.000000000000000000 Size.Height = 17.000000000000000000 Size.PlatformDefault = False - TextSettings.Trimming = None Text = 'Size (in pixel)' TabOrder = 0 end diff --git a/Packages/ListBoxItemStyleBook.style b/Packages/ListBoxItemStyleBook.style new file mode 100644 index 0000000..6eac5ce --- /dev/null +++ b/Packages/ListBoxItemStyleBook.style @@ -0,0 +1,230 @@ +object TStyleContainer + object TLayout + StyleName = 'CustomListBoxItemStyle' + Align = Center + Size.Width = 180.000000000000000000 + Size.Height = 64.000000000000000000 + Size.PlatformDefault = False + Visible = False + TabOrder = 0 + object TGlyph + StyleName = 'glyphstyle' + Margins.Left = 2.000000000000000000 + Margins.Top = 1.000000000000000000 + Margins.Right = 2.000000000000000000 + Margins.Bottom = 1.000000000000000000 + Align = Left + Size.Width = 64.000000000000000000 + Size.Height = 64.000000000000000000 + Size.PlatformDefault = False + end + object TActiveStyleTextObject + StyleName = 'text' + Align = Client + Margins.Left = 3.000000000000000000 + Margins.Top = 1.000000000000000000 + Margins.Right = 3.000000000000000000 + Margins.Bottom = 1.000000000000000000 + Size.Width = 174.000000000000000000 + Size.Height = 62.000000000000000000 + Size.PlatformDefault = False + Text = 'Text' + TextSettings.WordWrap = False + TextSettings.HorzAlign = Leading + ShadowVisible = False + ActiveTrigger = Selected + ActiveColor = claBlack + end + object TCheckBox + StyleName = 'check' + Align = Left + CanFocus = False + DisableFocusEffect = True + Size.Width = 20.000000000000000000 + Size.Height = 19.000000000000000000 + Size.PlatformDefault = False + StyleLookup = 'ListBoxItem1Style1CheckBoxStyle1' + Visible = False + end + object TLayout + StyleName = 'accessorymore' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 11.000000000000000000 + Size.Height = 16.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 135.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 146.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 202.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 218.000000000000000000 + SourceRect.Bottom = 561.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 270.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 292.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 135.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 146.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 202.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 218.000000000000000000 + SourceRect.Bottom = 561.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 270.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 292.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + object TLayout + StyleName = 'accessorycheckmark' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 17.000000000000000000 + Size.Height = 17.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 151.000000000000000000 + SourceRect.Top = 357.000000000000000000 + SourceRect.Right = 168.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 226.000000000000000000 + SourceRect.Top = 536.000000000000000000 + SourceRect.Right = 252.000000000000000000 + SourceRect.Bottom = 562.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 302.000000000000000000 + SourceRect.Top = 714.000000000000000000 + SourceRect.Right = 336.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 151.000000000000000000 + SourceRect.Top = 357.000000000000000000 + SourceRect.Right = 168.000000000000000000 + SourceRect.Bottom = 374.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 226.000000000000000000 + SourceRect.Top = 536.000000000000000000 + SourceRect.Right = 252.000000000000000000 + SourceRect.Bottom = 562.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 302.000000000000000000 + SourceRect.Top = 714.000000000000000000 + SourceRect.Right = 336.000000000000000000 + SourceRect.Bottom = 748.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + object TLayout + StyleName = 'accessorydetail' + Align = MostRight + Size.Width = 22.000000000000000000 + Size.Height = 44.000000000000000000 + Size.PlatformDefault = False + Visible = False + object TActiveStyleObject + Align = Center + SourceLookup = 'Windows 10 Desktopstyle.png' + Size.Width = 17.000000000000000000 + Size.Height = 15.000000000000000000 + Size.PlatformDefault = False + WrapMode = Center + ActiveTrigger = Selected + ActiveLink = < + item + SourceRect.Left = 173.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 190.000000000000000000 + SourceRect.Bottom = 373.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 260.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 286.000000000000000000 + SourceRect.Bottom = 559.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 346.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 380.000000000000000000 + SourceRect.Bottom = 746.000000000000000000 + end> + SourceLink = < + item + SourceRect.Left = 173.000000000000000000 + SourceRect.Top = 358.000000000000000000 + SourceRect.Right = 190.000000000000000000 + SourceRect.Bottom = 373.000000000000000000 + end + item + Scale = 1.500000000000000000 + SourceRect.Left = 260.000000000000000000 + SourceRect.Top = 537.000000000000000000 + SourceRect.Right = 286.000000000000000000 + SourceRect.Bottom = 559.000000000000000000 + end + item + Scale = 2.000000000000000000 + SourceRect.Left = 346.000000000000000000 + SourceRect.Top = 716.000000000000000000 + SourceRect.Right = 380.000000000000000000 + SourceRect.Bottom = 746.000000000000000000 + end> + TouchAnimation.Link = <> + end + end + end +end diff --git a/README.htm b/README.htm index e00f0b6..8347b09 100644 --- a/README.htm +++ b/README.htm @@ -31,7 +31,7 @@

SVGIconImageList License

Three engines to render SVG (Delphi Image32, Skia4Delphi, Direct2D wrapper) and four components to simplify use of SVG images (resize, fixedcolor, grayscale…)

-

Actual official version 4.1.8 (VCL+FMX)

+

Actual official version 4.1.9 (VCL+FMX)

@@ -126,6 +126,13 @@

DOCUMENTATION

Other similar library

A similar project made by Ethea for Icon Fonts: https://github.com/EtheaDev/IconFontsImageList

RELEASE NOTES

+

14 Sep 2024: version 4.1.9 (VCL+FMX)

+
    +
  • Aligned to Image32 4.5 Version of 14 September 2024
  • +
  • Fixed Range Error rendering some icons (Image32 engine)
  • +
  • Fixed Rename Icon in FireMonkey ImageList Editor
  • +
  • Aggiornamento packages Delphi 12.2
  • +

27 Aug 2024: version 4.1.8 (VCL+FMX)

  • Aligned to Image32 4.5 Version of 18 August 2024
  • diff --git a/README.md b/README.md index baca8c4..63732df 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Three engines to render SVG (Delphi Image32, Skia4Delphi, Direct2D wrapper) and four components to simplify use of SVG images (resize, fixedcolor, grayscale...) -### Actual official version 4.1.8 (VCL+FMX) +### Actual official version 4.1.9 (VCL+FMX) | Component | Description | | - | - | @@ -90,6 +90,12 @@ Follow the [guide in Wiki section](https://github.com/EtheaDev/SVGIconImageList/ A similar project made by Ethea for Icon Fonts: [https://github.com/EtheaDev/IconFontsImageList](https://github.com/EtheaDev/IconFontsImageList) ### RELEASE NOTES +14 Sep 2024: version 4.1.9 (VCL+FMX) +- Aligned to Image32 4.5 Version of 14 September 2024 +- Fixed Range Error rendering some icons (Image32 engine) +- Fixed Rename Icon in FireMonkey ImageList Editor +- Aggiornamento packages Delphi 12.2 + 27 Aug 2024: version 4.1.8 (VCL+FMX) - Aligned to Image32 4.5 Version of 18 August 2024 - Fixed rendering with Opacity for Skia4Delphi and D2D Engines diff --git a/Source/FMX.SVGIconImageList.pas b/Source/FMX.SVGIconImageList.pas index 79cb256..5673af6 100644 --- a/Source/FMX.SVGIconImageList.pas +++ b/Source/FMX.SVGIconImageList.pas @@ -47,7 +47,7 @@ interface ; const - SVGIconImageListVersion = '4.1.8'; + SVGIconImageListVersion = '4.1.9'; DEFAULT_SIZE = 32; ZOOM_DEFAULT = 100; SVG_INHERIT_COLOR = TAlphaColors.Null; diff --git a/Source/SVGIconImageListBase.pas b/Source/SVGIconImageListBase.pas index a9f0694..28d634d 100644 --- a/Source/SVGIconImageListBase.pas +++ b/Source/SVGIconImageListBase.pas @@ -48,7 +48,7 @@ interface SvgInterfaces; const - SVGIconImageListVersion = '4.1.8'; + SVGIconImageListVersion = '4.1.9'; DEFAULT_SIZE = 16; type
Component