diff --git a/Macaw.xcodeproj/project.pbxproj b/Macaw.xcodeproj/project.pbxproj index e9df761b..934c7325 100644 --- a/Macaw.xcodeproj/project.pbxproj +++ b/Macaw.xcodeproj/project.pbxproj @@ -508,6 +508,30 @@ A718CD4F1F45C28F00966E06 /* MDisplayLink_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD4B1F45C28F00966E06 /* MDisplayLink_macOS.swift */; }; A718CD501F45C28F00966E06 /* MView_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD4C1F45C28F00966E06 /* MView_macOS.swift */; }; A718CD521F45C2A400966E06 /* MBezierPath+Extension_macOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = A718CD511F45C2A400966E06 /* MBezierPath+Extension_macOS.swift */; }; + A74C81EC229284790085A832 /* struct-use-01-t-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C81EA229284780085A832 /* struct-use-01-t-manual.reference */; }; + A74C81ED229284790085A832 /* struct-use-01-t-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C81EB229284780085A832 /* struct-use-01-t-manual.svg */; }; + A74C81F12292B3940085A832 /* color-prop-05-t-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C81F02292B3940085A832 /* color-prop-05-t-manual.svg */; }; + A74C81F32292B45E0085A832 /* color-prop-05-t-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C81F22292B45D0085A832 /* color-prop-05-t-manual.reference */; }; + A74C821F2297D4810085A832 /* coords-trans-13-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C821A2297D4800085A832 /* coords-trans-13-f-manual.svg */; }; + A74C82202297D4810085A832 /* coords-trans-14-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C821B2297D4800085A832 /* coords-trans-14-f-manual.svg */; }; + A74C82212297D4810085A832 /* coords-trans-11-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C821C2297D4800085A832 /* coords-trans-11-f-manual.svg */; }; + A74C82222297D4810085A832 /* coords-trans-10-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C821D2297D4800085A832 /* coords-trans-10-f-manual.svg */; }; + A74C82232297D4810085A832 /* coords-trans-12-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C821E2297D4810085A832 /* coords-trans-12-f-manual.svg */; }; + A74C82292297D5350085A832 /* coords-trans-12-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82242297D5340085A832 /* coords-trans-12-f-manual.reference */; }; + A74C822A2297D5350085A832 /* coords-trans-11-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82252297D5340085A832 /* coords-trans-11-f-manual.reference */; }; + A74C822B2297D5350085A832 /* coords-trans-14-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82262297D5340085A832 /* coords-trans-14-f-manual.reference */; }; + A74C822C2297D5350085A832 /* coords-trans-10-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82272297D5340085A832 /* coords-trans-10-f-manual.reference */; }; + A74C822D2297D5350085A832 /* coords-trans-13-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82282297D5350085A832 /* coords-trans-13-f-manual.reference */; }; + A74C82322297D8B40085A832 /* shapes-rect-06-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C822E2297D8B30085A832 /* shapes-rect-06-f-manual.svg */; }; + A74C82332297D8B40085A832 /* shapes-rect-02-t-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C822F2297D8B30085A832 /* shapes-rect-02-t-manual.svg */; }; + A74C82342297D8B40085A832 /* shapes-rect-03-t-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C82302297D8B30085A832 /* shapes-rect-03-t-manual.svg */; }; + A74C82352297D8B40085A832 /* shapes-rect-07-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C82312297D8B40085A832 /* shapes-rect-07-f-manual.svg */; }; + A74C823C2297DB2C0085A832 /* shapes-rect-07-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82382297DB2B0085A832 /* shapes-rect-07-f-manual.reference */; }; + A74C823E2297DB2C0085A832 /* shapes-rect-03-t-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C823A2297DB2B0085A832 /* shapes-rect-03-t-manual.reference */; }; + A74C823F2297DB2C0085A832 /* shapes-rect-06-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C823B2297DB2B0085A832 /* shapes-rect-06-f-manual.reference */; }; + A74C82412297DC220085A832 /* shapes-rect-02-t-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82402297DC220085A832 /* shapes-rect-02-t-manual.reference */; }; + A74C82032296BE5F0085A832 /* paths-data-20-f-manual.svg in Resources */ = {isa = PBXBuildFile; fileRef = A74C82022296BE5F0085A832 /* paths-data-20-f-manual.svg */; }; + A74C82052296BFC60085A832 /* paths-data-20-f-manual.reference in Resources */ = {isa = PBXBuildFile; fileRef = A74C82042296BFC60085A832 /* paths-data-20-f-manual.reference */; }; A7E675561EC4213500BD9ECB /* NodeBoundsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7E675551EC4213500BD9ECB /* NodeBoundsTests.swift */; }; C410148E1F834D290022EE44 /* style.svg in Resources */ = {isa = PBXBuildFile; fileRef = C410148D1F834D280022EE44 /* style.svg */; }; C4153A8F1F8793DE001BA5EE /* small-logo.png in Resources */ = {isa = PBXBuildFile; fileRef = C4153A8E1F8793DD001BA5EE /* small-logo.png */; }; @@ -923,6 +947,30 @@ A718CD4B1F45C28F00966E06 /* MDisplayLink_macOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MDisplayLink_macOS.swift; path = Source/platform/macOS/MDisplayLink_macOS.swift; sourceTree = SOURCE_ROOT; }; A718CD4C1F45C28F00966E06 /* MView_macOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MView_macOS.swift; path = Source/platform/macOS/MView_macOS.swift; sourceTree = SOURCE_ROOT; }; A718CD511F45C2A400966E06 /* MBezierPath+Extension_macOS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "MBezierPath+Extension_macOS.swift"; path = "Source/platform/macOS/MBezierPath+Extension_macOS.swift"; sourceTree = SOURCE_ROOT; }; + A74C81EA229284780085A832 /* struct-use-01-t-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "struct-use-01-t-manual.reference"; sourceTree = ""; }; + A74C81EB229284780085A832 /* struct-use-01-t-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "struct-use-01-t-manual.svg"; sourceTree = ""; }; + A74C81F02292B3940085A832 /* color-prop-05-t-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "color-prop-05-t-manual.svg"; sourceTree = ""; }; + A74C81F22292B45D0085A832 /* color-prop-05-t-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "color-prop-05-t-manual.reference"; sourceTree = ""; }; + A74C821A2297D4800085A832 /* coords-trans-13-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-13-f-manual.svg"; sourceTree = ""; }; + A74C821B2297D4800085A832 /* coords-trans-14-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-14-f-manual.svg"; sourceTree = ""; }; + A74C821C2297D4800085A832 /* coords-trans-11-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-11-f-manual.svg"; sourceTree = ""; }; + A74C821D2297D4800085A832 /* coords-trans-10-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-10-f-manual.svg"; sourceTree = ""; }; + A74C821E2297D4810085A832 /* coords-trans-12-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-12-f-manual.svg"; sourceTree = ""; }; + A74C82242297D5340085A832 /* coords-trans-12-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-12-f-manual.reference"; sourceTree = ""; }; + A74C82252297D5340085A832 /* coords-trans-11-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-11-f-manual.reference"; sourceTree = ""; }; + A74C82262297D5340085A832 /* coords-trans-14-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-14-f-manual.reference"; sourceTree = ""; }; + A74C82272297D5340085A832 /* coords-trans-10-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-10-f-manual.reference"; sourceTree = ""; }; + A74C82282297D5350085A832 /* coords-trans-13-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "coords-trans-13-f-manual.reference"; sourceTree = ""; }; + A74C822E2297D8B30085A832 /* shapes-rect-06-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-06-f-manual.svg"; sourceTree = ""; }; + A74C822F2297D8B30085A832 /* shapes-rect-02-t-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-02-t-manual.svg"; sourceTree = ""; }; + A74C82302297D8B30085A832 /* shapes-rect-03-t-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-03-t-manual.svg"; sourceTree = ""; }; + A74C82312297D8B40085A832 /* shapes-rect-07-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-07-f-manual.svg"; sourceTree = ""; }; + A74C82382297DB2B0085A832 /* shapes-rect-07-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-07-f-manual.reference"; sourceTree = ""; }; + A74C823A2297DB2B0085A832 /* shapes-rect-03-t-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-03-t-manual.reference"; sourceTree = ""; }; + A74C823B2297DB2B0085A832 /* shapes-rect-06-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-06-f-manual.reference"; sourceTree = ""; }; + A74C82402297DC220085A832 /* shapes-rect-02-t-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "shapes-rect-02-t-manual.reference"; sourceTree = ""; }; + A74C82022296BE5F0085A832 /* paths-data-20-f-manual.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "paths-data-20-f-manual.svg"; sourceTree = ""; }; + A74C82042296BFC60085A832 /* paths-data-20-f-manual.reference */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "paths-data-20-f-manual.reference"; sourceTree = ""; }; A7E675551EC4213500BD9ECB /* NodeBoundsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NodeBoundsTests.swift; path = Bounds/NodeBoundsTests.swift; sourceTree = ""; }; C410148D1F834D280022EE44 /* style.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = style.svg; sourceTree = ""; }; C4153A8E1F8793DD001BA5EE /* small-logo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "small-logo.png"; sourceTree = ""; }; @@ -1364,14 +1412,16 @@ 5B1AE18320B6A669007EECCB /* w3cSVGTests */ = { isa = PBXGroup; children = ( - 421C664F2225196900DD73F5 /* color-prop-04-t-manual.svg */, - 4269F43D2257265700D91393 /* color-prop-04-t-manual.reference */, 5B1AE22D20B6A669007EECCB /* color-prop-01-b-manual.reference */, 5B1AE18A20B6A669007EECCB /* color-prop-01-b-manual.svg */, 5B1AE22C20B6A669007EECCB /* color-prop-02-f-manual.reference */, 5B1AE1C620B6A669007EECCB /* color-prop-02-f-manual.svg */, 5B1AE1FA20B6A669007EECCB /* color-prop-03-t-manual.reference */, 5B1AE20320B6A669007EECCB /* color-prop-03-t-manual.svg */, + 4269F43D2257265700D91393 /* color-prop-04-t-manual.reference */, + 421C664F2225196900DD73F5 /* color-prop-04-t-manual.svg */, + A74C81F22292B45D0085A832 /* color-prop-05-t-manual.reference */, + A74C81F02292B3940085A832 /* color-prop-05-t-manual.svg */, 5B1AE1D420B6A669007EECCB /* coords-coord-01-t-manual.reference */, 5B1AE19A20B6A669007EECCB /* coords-coord-01-t-manual.svg */, 5B1AE1B920B6A669007EECCB /* coords-coord-02-t-manual.reference */, @@ -1394,6 +1444,16 @@ 5B1AE1F220B6A669007EECCB /* coords-trans-08-t-manual.svg */, 5B1AE20720B6A669007EECCB /* coords-trans-09-t-manual.reference */, 5B1AE1E520B6A669007EECCB /* coords-trans-09-t-manual.svg */, + A74C82272297D5340085A832 /* coords-trans-10-f-manual.reference */, + A74C821D2297D4800085A832 /* coords-trans-10-f-manual.svg */, + A74C82252297D5340085A832 /* coords-trans-11-f-manual.reference */, + A74C821C2297D4800085A832 /* coords-trans-11-f-manual.svg */, + A74C82242297D5340085A832 /* coords-trans-12-f-manual.reference */, + A74C821E2297D4810085A832 /* coords-trans-12-f-manual.svg */, + A74C82282297D5350085A832 /* coords-trans-13-f-manual.reference */, + A74C821A2297D4800085A832 /* coords-trans-13-f-manual.svg */, + A74C82262297D5340085A832 /* coords-trans-14-f-manual.reference */, + A74C821B2297D4800085A832 /* coords-trans-14-f-manual.svg */, 5B1AE1CC20B6A669007EECCB /* coords-transformattr-01-f-manual.reference */, 5B1AE1E320B6A669007EECCB /* coords-transformattr-01-f-manual.svg */, 5B1AE1D020B6A669007EECCB /* coords-transformattr-02-f-manual.reference */, @@ -1482,6 +1542,8 @@ 5BFEF5D420BC1C1E008DAC11 /* paths-data-18-f-manual.svg */, 5B1AE1D720B6A669007EECCB /* paths-data-19-f-manual.reference */, 5B1AE21A20B6A669007EECCB /* paths-data-19-f-manual.svg */, + A74C82022296BE5F0085A832 /* paths-data-20-f-manual.svg */, + A74C82042296BFC60085A832 /* paths-data-20-f-manual.reference */, 5B37139620BE95D7004BB6EE /* pservers-grad-01-b-manual.reference */, 5B37139220BE95D6004BB6EE /* pservers-grad-01-b-manual.svg */, 5B37139320BE95D6004BB6EE /* pservers-grad-02-b-manual.reference */, @@ -1526,10 +1588,18 @@ 5B1AE1BA20B6A669007EECCB /* shapes-polyline-01-t-manual.svg */, 5B1AE1AF20B6A669007EECCB /* shapes-polyline-02-t-manual.reference */, 5B1AE1E120B6A669007EECCB /* shapes-polyline-02-t-manual.svg */, + A74C82402297DC220085A832 /* shapes-rect-02-t-manual.reference */, + A74C822F2297D8B30085A832 /* shapes-rect-02-t-manual.svg */, + A74C823A2297DB2B0085A832 /* shapes-rect-03-t-manual.reference */, + A74C82302297D8B30085A832 /* shapes-rect-03-t-manual.svg */, 5B1AE22520B6A669007EECCB /* shapes-rect-04-f-manual.reference */, 5B1AE1CE20B6A669007EECCB /* shapes-rect-04-f-manual.svg */, 5B1AE19620B6A669007EECCB /* shapes-rect-05-f-manual.reference */, 5B1AE1B720B6A669007EECCB /* shapes-rect-05-f-manual.svg */, + A74C823B2297DB2B0085A832 /* shapes-rect-06-f-manual.reference */, + A74C822E2297D8B30085A832 /* shapes-rect-06-f-manual.svg */, + A74C82382297DB2B0085A832 /* shapes-rect-07-f-manual.reference */, + A74C82312297D8B40085A832 /* shapes-rect-07-f-manual.svg */, 5B1AE22220B6A669007EECCB /* struct-defs-01-t-manual.reference */, 5B1AE22E20B6A669007EECCB /* struct-defs-01-t-manual.svg */, 5B1AE19720B6A669007EECCB /* struct-frag-01-t-manual.reference */, @@ -1544,6 +1614,8 @@ 5B1AE1C420B6A669007EECCB /* struct-frag-06-t-manual.svg */, 5B1AE1CA20B6A669007EECCB /* struct-group-01-t-manual.reference */, 5B1AE22420B6A669007EECCB /* struct-group-01-t-manual.svg */, + A74C81EA229284780085A832 /* struct-use-01-t-manual.reference */, + A74C81EB229284780085A832 /* struct-use-01-t-manual.svg */, 5B1AE1BB20B6A669007EECCB /* struct-use-03-t-manual.reference */, 5B1AE20120B6A669007EECCB /* struct-use-03-t-manual.svg */, 5B1AE18D20B6A669007EECCB /* struct-use-12-f-manual.reference */, @@ -1758,10 +1830,12 @@ 5BAE203C208E163D006BF277 /* triangle.reference in Resources */, C4153A8F1F8793DE001BA5EE /* small-logo.png in Resources */, 5BAE2048208E163D006BF277 /* line.reference in Resources */, + A74C82322297D8B40085A832 /* shapes-rect-06-f-manual.svg in Resources */, 5B1AE2A420B6A669007EECCB /* paths-data-12-t-manual.reference in Resources */, 57CAB1361D7832E000FD8E47 /* triangle.svg in Resources */, 5B7E79CF20CBE69700C50BCF /* masking-path-02-b-manual.svg in Resources */, 5BFEF5D620BC1C1F008DAC11 /* paths-data-18-f-manual.svg in Resources */, + A74C81ED229284790085A832 /* struct-use-01-t-manual.svg in Resources */, 5B1AE23620B6A669007EECCB /* paths-data-07-t-manual.svg in Resources */, 5B1AE27720B6A669007EECCB /* coords-trans-03-t-manual.reference in Resources */, 5B1AE26420B6A669007EECCB /* painting-fill-03-t-manual.svg in Resources */, @@ -1769,6 +1843,7 @@ 5B1AE2DA20B6A669007EECCB /* color-prop-02-f-manual.reference in Resources */, 5B1AE26620B6A669007EECCB /* painting-fill-04-t-manual.svg in Resources */, 5B3713A420BE9D8A004BB6EE /* shapes-grammar-01-f-manual.svg in Resources */, + A74C822D2297D5350085A832 /* coords-trans-13-f-manual.reference in Resources */, 5B1AE26C20B6A669007EECCB /* painting-fill-05-b-manual.svg in Resources */, 5B37139920BE95D7004BB6EE /* pservers-grad-02-b-manual.reference in Resources */, 5B1AE2D620B6A669007EECCB /* coords-trans-03-t-manual.svg in Resources */, @@ -1777,6 +1852,7 @@ 5B1AE2B820B6A669007EECCB /* painting-stroke-03-t-manual.reference in Resources */, 4269F43E2257265800D91393 /* color-prop-04-t-manual.reference in Resources */, 5B1AE2C720B6A669007EECCB /* paths-data-02-t-manual.svg in Resources */, + A74C823C2297DB2C0085A832 /* shapes-rect-07-f-manual.reference in Resources */, 5B1AE27120B6A669007EECCB /* painting-stroke-04-t-manual.reference in Resources */, 5B1AE2C220B6A669007EECCB /* coords-trans-05-t-manual.svg in Resources */, 5B1AE29D20B6A669007EECCB /* types-basic-01-f-manual.reference in Resources */, @@ -1796,28 +1872,35 @@ 5BAE2040208E163D006BF277 /* ellipse.reference in Resources */, 5B1AE27E20B6A669007EECCB /* coords-transformattr-02-f-manual.reference in Resources */, 5B1AE25720B6A669007EECCB /* coords-trans-07-t-manual.svg in Resources */, + A74C823F2297DB2C0085A832 /* shapes-rect-06-f-manual.reference in Resources */, 5B1AE2BC20B6A669007EECCB /* coords-coord-02-t-manual.svg in Resources */, 5B1AE23520B6A669007EECCB /* shapes-line-02-f-manual.reference in Resources */, 5B1AE2CD20B6A669007EECCB /* paths-data-10-t-manual.svg in Resources */, 5B1AE29C20B6A669007EECCB /* paths-data-01-t-manual.reference in Resources */, 5B1AE29320B6A669007EECCB /* coords-trans-09-t-manual.svg in Resources */, 5B1AE2DC20B6A669007EECCB /* struct-defs-01-t-manual.svg in Resources */, + A74C821F2297D4810085A832 /* coords-trans-13-f-manual.svg in Resources */, + A74C82052296BFC60085A832 /* paths-data-20-f-manual.reference in Resources */, 5B1AE29020B6A669007EECCB /* painting-stroke-08-t-manual.svg in Resources */, 5B1AE2A720B6A669007EECCB /* paths-data-09-t-manual.svg in Resources */, 5B1AE2AB20B6A669007EECCB /* painting-stroke-08-t-manual.reference in Resources */, + A74C82352297D8B40085A832 /* shapes-rect-07-f-manual.svg in Resources */, 5B1AE2A520B6A669007EECCB /* coords-trans-02-t-manual.reference in Resources */, 5B1AE23220B6A669007EECCB /* text-align-01-b-manual.svg in Resources */, 5B1AE2B220B6A669007EECCB /* types-basic-01-f-manual.svg in Resources */, 58944BDA20AC8A9A00657640 /* logo_base64.txt in Resources */, 5B1AE2C520B6A669007EECCB /* coords-trans-02-t-manual.svg in Resources */, + A74C81F12292B3940085A832 /* color-prop-05-t-manual.svg in Resources */, 5B1AE26120B6A669007EECCB /* paths-data-13-t-manual.reference in Resources */, 5B1AE24820B6A669007EECCB /* coords-coord-01-t-manual.svg in Resources */, 5B1AE2B620B6A669007EECCB /* paths-data-04-t-manual.svg in Resources */, 5B1AE25620B6A669007EECCB /* paths-data-05-t-manual.reference in Resources */, 5B1AE2D020B6A669007EECCB /* struct-defs-01-t-manual.reference in Resources */, 5B1AE25020B6A669007EECCB /* render-elems-01-t-manual.reference in Resources */, + A74C822C2297D5350085A832 /* coords-trans-10-f-manual.reference in Resources */, 5B1AE24520B6A669007EECCB /* struct-frag-01-t-manual.reference in Resources */, 5B1AE25B20B6A669007EECCB /* painting-stroke-01-t-manual.svg in Resources */, + A74C823E2297DB2C0085A832 /* shapes-rect-03-t-manual.reference in Resources */, 5BAE2047208E163D006BF277 /* viewBox.reference in Resources */, 5B1AE2C120B6A669007EECCB /* painting-stroke-04-t-manual.svg in Resources */, 5B1AE2BE20B6A669007EECCB /* painting-stroke-03-t-manual.svg in Resources */, @@ -1833,6 +1916,7 @@ 5B1AE2B420B6A669007EECCB /* shapes-ellipse-02-t-manual.svg in Resources */, 5B1AE2A120B6A669007EECCB /* paths-data-02-t-manual.reference in Resources */, 5B37139B20BE95D7004BB6EE /* pservers-grad-07-b-manual.svg in Resources */, + A74C82212297D4810085A832 /* coords-trans-11-f-manual.svg in Resources */, 5B1AE2B920B6A669007EECCB /* painting-control-02-f-manual.svg in Resources */, 5B7E79DE20D2781A00C50BCF /* masking-intro-01-f-manual.reference in Resources */, 5B1AE28A20B6A669007EECCB /* shapes-polygon-01-t-manual.reference in Resources */, @@ -1849,11 +1933,13 @@ 5B1AE2CF20B6A669007EECCB /* paths-data-07-t-manual.reference in Resources */, 5B1AE28D20B6A669007EECCB /* shapes-circle-01-t-manual.reference in Resources */, 5B1AE2A320B6A669007EECCB /* painting-fill-01-t-manual.svg in Resources */, + A74C82332297D8B40085A832 /* shapes-rect-02-t-manual.svg in Resources */, 5B1AE2CB20B6A669007EECCB /* painting-fill-02-t-manual.reference in Resources */, 5B1AE26520B6A669007EECCB /* shapes-rect-05-f-manual.svg in Resources */, 5B1AE2D120B6A669007EECCB /* paths-data-03-f-manual.reference in Resources */, 5B1AE28920B6A669007EECCB /* shapes-intro-01-t-manual.reference in Resources */, 5B1AE2C020B6A669007EECCB /* paths-data-14-t-manual.reference in Resources */, + A74C82032296BE5F0085A832 /* paths-data-20-f-manual.svg in Resources */, 5B1AE27420B6A669007EECCB /* color-prop-02-f-manual.svg in Resources */, 5B1AE25120B6A669007EECCB /* coords-trans-05-t-manual.reference in Resources */, 5B1AE29120B6A669007EECCB /* coords-transformattr-01-f-manual.svg in Resources */, @@ -1872,7 +1958,9 @@ 5B1AE2D720B6A669007EECCB /* coords-trans-04-t-manual.svg in Resources */, 5B1AE2AC20B6A669007EECCB /* struct-use-12-f-manual.svg in Resources */, 5B1AE28220B6A669007EECCB /* coords-coord-01-t-manual.reference in Resources */, + A74C81F32292B45E0085A832 /* color-prop-05-t-manual.reference in Resources */, 5B1AE23420B6A669007EECCB /* painting-control-03-f-manual.reference in Resources */, + A74C82342297D8B40085A832 /* shapes-rect-03-t-manual.svg in Resources */, 5B1AE26820B6A669007EECCB /* shapes-polyline-01-t-manual.svg in Resources */, 5B1AE29A20B6A669007EECCB /* struct-frag-02-t-manual.svg in Resources */, 5B1AE2A620B6A669007EECCB /* text-fonts-01-t-manual.svg in Resources */, @@ -1885,8 +1973,10 @@ 5B1AE24E20B6A669007EECCB /* paths-data-14-t-manual.svg in Resources */, 57CAB1301D7832E000FD8E47 /* group.svg in Resources */, 5B1AE28820B6A669007EECCB /* text-fonts-02-t-manual.svg in Resources */, + A74C82232297D4810085A832 /* coords-trans-12-f-manual.svg in Resources */, 5B1AE29920B6A669007EECCB /* pservers-grad-stops-01-f-manual.svg in Resources */, 5B1AE27520B6A669007EECCB /* struct-frag-04-t-manual.reference in Resources */, + A74C82292297D5350085A832 /* coords-trans-12-f-manual.reference in Resources */, 5B1AE28720B6A669007EECCB /* render-elems-03-t-manual.svg in Resources */, 5B1AE2AD20B6A669007EECCB /* painting-stroke-05-t-manual.reference in Resources */, 5B1AE25920B6A669007EECCB /* coords-trans-01-b-manual.svg in Resources */, @@ -1901,11 +1991,14 @@ 5B1AE26A20B6A669007EECCB /* painting-control-06-f-manual.reference in Resources */, C46E83551F94B20E00208037 /* transform.svg in Resources */, 5B1AE2C420B6A669007EECCB /* painting-fill-01-t-manual.reference in Resources */, + A74C82412297DC220085A832 /* shapes-rect-02-t-manual.reference in Resources */, 5B1AE2AE20B6A669007EECCB /* shapes-circle-02-t-manual.reference in Resources */, 5B1AE29520B6A669007EECCB /* shapes-ellipse-03-f-manual.reference in Resources */, 5B1AE23820B6A669007EECCB /* color-prop-01-b-manual.svg in Resources */, + A74C822A2297D5350085A832 /* coords-trans-11-f-manual.reference in Resources */, 5B1AE24620B6A669007EECCB /* painting-control-01-f-manual.svg in Resources */, 5B1AE2B120B6A669007EECCB /* color-prop-03-t-manual.svg in Resources */, + A74C81EC229284790085A832 /* struct-use-01-t-manual.reference in Resources */, 5B1AE23B20B6A669007EECCB /* struct-use-12-f-manual.reference in Resources */, 5B1AE29F20B6A669007EECCB /* painting-stroke-09-t-manual.svg in Resources */, 5B1AE27D20B6A669007EECCB /* shapes-polygon-03-t-manual.svg in Resources */, @@ -1930,11 +2023,14 @@ 5B1AE2D820B6A669007EECCB /* metadata-example-01-t-manual.svg in Resources */, 5B1AE2C620B6A669007EECCB /* painting-fill-05-b-manual.reference in Resources */, 57CAB1331D7832E000FD8E47 /* polyline.svg in Resources */, + A74C822B2297D5350085A832 /* coords-trans-14-f-manual.reference in Resources */, 5B1AE2DE20B6A669007EECCB /* painting-control-03-f-manual.svg in Resources */, 5B1AE25520B6A669007EECCB /* paths-data-15-t-manual.reference in Resources */, 5B1AE24D20B6A669007EECCB /* paths-data-13-t-manual.svg in Resources */, + A74C82202297D4810085A832 /* coords-trans-14-f-manual.svg in Resources */, 5B270B5D214BBC27001AD741 /* clearColor.reference in Resources */, 57CAB1311D7832E000FD8E47 /* line.svg in Resources */, + A74C82222297D4810085A832 /* coords-trans-10-f-manual.svg in Resources */, 57B7A4DF1EE70D17009D78D7 /* logo.png in Resources */, 5B1AE24F20B6A669007EECCB /* painting-stroke-02-t-manual.reference in Resources */, 5B1AE28420B6A669007EECCB /* shapes-polyline-01-t-manual.reference in Resources */, diff --git a/MacawTests/MacawSVGTests.swift b/MacawTests/MacawSVGTests.swift index c3bc656b..e6755d8a 100644 --- a/MacawTests/MacawSVGTests.swift +++ b/MacawTests/MacawSVGTests.swift @@ -265,6 +265,10 @@ class MacawSVGTests: XCTestCase { validateJSON("color-prop-01-b-manual") } + func testColorProp05() { + validateJSON("color-prop-05-t-manual") + } + func testShapesEllipse01() { validateJSON("shapes-ellipse-01-t-manual") } @@ -277,10 +281,62 @@ class MacawSVGTests: XCTestCase { validateJSON("paths-data-12-t-manual") } + func testCoordsTrans01() { + validateJSON("coords-trans-01-b-manual") + } + + func testCoordsTrans02() { + validateJSON("coords-trans-02-t-manual") + } + + func testCoordsTrans03() { + validateJSON("coords-trans-03-t-manual") + } + + func testCoordsTrans04() { + validateJSON("coords-trans-04-t-manual") + } + + func testCoordsTrans05() { + validateJSON("coords-trans-05-t-manual") + } + func testCoordsTrans06() { validateJSON("coords-trans-06-t-manual") } + func testCoordsTrans07() { + validateJSON("coords-trans-07-t-manual") + } + + func testCoordsTrans08() { + validateJSON("coords-trans-08-t-manual") + } + + func testCoordsTrans09() { + validateJSON("coords-trans-09-t-manual") + } + + func testCoordsTrans10() { + validateJSON("coords-trans-10-f-manual") + } + + func testCoordsTrans11() { + validateJSON("coords-trans-11-f-manual") + } + + func testCoordsTrans12() { + validateJSON("coords-trans-12-f-manual") + } + + func testCoordsTrans13() { + validateJSON("coords-trans-13-f-manual") + } + + func testCoordsTrans14() { + validateJSON("coords-trans-14-f-manual") + } + func testCoordsCoord01() { validateJSON("coords-coord-01-t-manual") } @@ -317,14 +373,6 @@ class MacawSVGTests: XCTestCase { validateJSON("paths-data-06-t-manual") } - func testCoordsTrans07() { - validateJSON("coords-trans-07-t-manual") - } - - func testCoordsTrans01() { - validateJSON("coords-trans-01-b-manual") - } - func testPaintingStroke01() { validateJSON("painting-stroke-01-t-manual") } @@ -345,10 +393,30 @@ class MacawSVGTests: XCTestCase { validateJSON("painting-fill-03-t-manual") } + func testShapesRect02() { + validateJSON("shapes-rect-02-t-manual") + } + + func testShapesRect03() { + validateJSON("shapes-rect-03-t-manual") + } + + func testShapesRect04() { + validateJSON("shapes-rect-04-f-manual") + } + func testShapesRect05() { validateJSON("shapes-rect-05-f-manual") } + func testShapesRect06() { + validateJSON("shapes-rect-06-f-manual") + } + + func testShapesRect07() { + validateJSON("shapes-rect-07-f-manual") + } + func testPaintingFill04() { validateJSON("painting-fill-04-t-manual") } @@ -389,10 +457,6 @@ class MacawSVGTests: XCTestCase { validateJSON("painting-fill-02-t-manual") } - func testShapesRect04() { - validateJSON("shapes-rect-04-f-manual") - } - func testCoordsTransformattr03() { validateJSON("coords-transformattr-03-f-manual") } @@ -421,10 +485,6 @@ class MacawSVGTests: XCTestCase { validateJSON("coords-transformattr-01-f-manual") } - func testCoordsTrans09() { - validateJSON("coords-trans-09-t-manual") - } - func testShapesCircle01() { validateJSON("shapes-circle-01-t-manual") } @@ -453,10 +513,6 @@ class MacawSVGTests: XCTestCase { validateJSON("painting-stroke-09-t-manual") } - func testCoordsTrans08() { - validateJSON("coords-trans-08-t-manual") - } - func testPaintingFill01() { validateJSON("painting-fill-01-t-manual") } @@ -473,14 +529,18 @@ class MacawSVGTests: XCTestCase { validateJSON("struct-frag-03-t-manual") } - func testStructUse12() { - validateJSON("struct-use-12-f-manual") + func testStructUse01() { + validateJSON("struct-use-01-t-manual") } func testStructUse03() { validateJSON("struct-use-03-t-manual") } + func testStructUse12() { + validateJSON("struct-use-12-f-manual") + } + func testColorProp03() { validateJSON("color-prop-03-t-manual") } @@ -505,14 +565,6 @@ class MacawSVGTests: XCTestCase { validateJSON("coords-coord-02-t-manual") } - func testCoordsTrans05() { - validateJSON("coords-trans-05-t-manual") - } - - func testCoordsTrans02() { - validateJSON("coords-trans-02-t-manual") - } - func testPathsData02() { validateJSON("paths-data-02-t-manual") } @@ -521,6 +573,10 @@ class MacawSVGTests: XCTestCase { validateJSON("paths-data-19-f-manual") } + func testPathsData20() { + validateJSON("paths-data-20-f-manual") + } + func testStructGroup01() { validateJSON("struct-group-01-t-manual") } @@ -529,14 +585,6 @@ class MacawSVGTests: XCTestCase { validateJSON("painting-stroke-05-t-manual") } - func testCoordsTrans03() { - validateJSON("coords-trans-03-t-manual") - } - - func testCoordsTrans04() { - validateJSON("coords-trans-04-t-manual") - } - func testMetadataExample01() { validateJSON("metadata-example-01-t-manual") } diff --git a/MacawTests/w3c-test-suite.md b/MacawTests/w3c-test-suite.md index f52175fe..dd66111b 100644 --- a/MacawTests/w3c-test-suite.md +++ b/MacawTests/w3c-test-suite.md @@ -10,12 +10,12 @@ There are [521 SVG tests](https://github.com/web-platform-tests/wpt/tree/master/ * [switch/object](https://www.w3.org/TR/SVG11/backward.html) (7) The rest 306 tests can be split into following categories: -* 30.7% passed (94) +* 35.3% passed (108) * 14.1% filters (43) [#390](https://github.com/exyte/Macaw/issues/390) -* 7.8% images (24) [wpt issue](https://github.com/web-platform-tests/wpt/issues/11178) +* 8.5% images (26) [wpt issue](https://github.com/web-platform-tests/wpt/issues/11178) * 2.6% markers (8) [#392](https://github.com/exyte/Macaw/issues/392) -* 19.9% text (61) [#391](https://github.com/exyte/Macaw/issues/391) -* 25.2% blocked by issues (77) +* 20.6% text (63) [#391](https://github.com/exyte/Macaw/issues/391) +* 19.0% blocked by issues (58) Status of each test: @@ -25,8 +25,8 @@ Status of each test: |[color-prop-01-b-manual](w3cSVGTests/color-prop-01-b-manual.svg) | ✅ | |[color-prop-02-f-manual](w3cSVGTests/color-prop-02-f-manual.svg) | ✅ | |[color-prop-03-t-manual](w3cSVGTests/color-prop-03-t-manual.svg) | ✅ | -|[color-prop-04-t-manual](w3cSVGTests/color-prop-04-t-manual.svg) | [#387](https://github.com/exyte/Macaw/issues/387) | -|[color-prop-05-t-manual](w3cSVGTests/color-prop-05-t-manual.svg) | [#388](https://github.com/exyte/Macaw/issues/388) | +|[color-prop-04-t-manual](w3cSVGTests/color-prop-04-t-manual.svg) | ✅ | +|[color-prop-05-t-manual](w3cSVGTests/color-prop-05-t-manual.svg) | ✅ | |[conform-viewers-02-f-manual](w3cSVGTests/conform-viewers-02-f-manual.svg) | [wpt issue](https://github.com/web-platform-tests/wpt/issues/11178) | |[conform-viewers-03-f-manual](w3cSVGTests/conform-viewers-03-f-manual.svg) | [wpt issue](https://github.com/web-platform-tests/wpt/issues/11178) | |[coords-coord-01-t-manual](w3cSVGTests/coords-coord-01-t-manual.svg) | ✅ | @@ -40,11 +40,11 @@ Status of each test: |[coords-trans-07-t-manual](w3cSVGTests/coords-trans-07-t-manual.svg) | ✅ | |[coords-trans-08-t-manual](w3cSVGTests/coords-trans-08-t-manual.svg) | ✅ | |[coords-trans-09-t-manual](w3cSVGTests/coords-trans-09-t-manual.svg) | ✅ | -|[coords-trans-10-f-manual](w3cSVGTests/coords-trans-10-f-manual.svg) | [#347](https://github.com/exyte/Macaw/issues/347) | -|[coords-trans-11-f-manual](w3cSVGTests/coords-trans-11-f-manual.svg) | [#347](https://github.com/exyte/Macaw/issues/347) | -|[coords-trans-12-f-manual](w3cSVGTests/coords-trans-12-f-manual.svg) | [#347](https://github.com/exyte/Macaw/issues/347) | -|[coords-trans-13-f-manual](w3cSVGTests/coords-trans-13-f-manual.svg) | [#347](https://github.com/exyte/Macaw/issues/347) | -|[coords-trans-14-f-manual](w3cSVGTests/coords-trans-14-f-manual.svg) | [#347](https://github.com/exyte/Macaw/issues/347) | +|[coords-trans-10-f-manual](w3cSVGTests/coords-trans-10-f-manual.svg) | ✅ | +|[coords-trans-11-f-manual](w3cSVGTests/coords-trans-11-f-manual.svg) | ✅ | +|[coords-trans-12-f-manual](w3cSVGTests/coords-trans-12-f-manual.svg) | ✅ | +|[coords-trans-13-f-manual](w3cSVGTests/coords-trans-13-f-manual.svg) | ✅ | +|[coords-trans-14-f-manual](w3cSVGTests/coords-trans-14-f-manual.svg) | ✅ | |[coords-transformattr-01-f-manual](w3cSVGTests/coords-transformattr-01-f-manual.svg) | ✅ | |[coords-transformattr-02-f-manual](w3cSVGTests/coords-transformattr-02-f-manual.svg) | ✅ | |[coords-transformattr-03-f-manual](w3cSVGTests/coords-transformattr-03-f-manual.svg) | ✅ | @@ -183,7 +183,7 @@ Status of each test: |[paths-data-17-f-manual](w3cSVGTests/paths-data-17-f-manual.svg) | ✅ | |[paths-data-18-f-manual](w3cSVGTests/paths-data-18-f-manual.svg) | ✅ | |[paths-data-19-f-manual](w3cSVGTests/paths-data-19-f-manual.svg) | ✅ | -|[paths-data-20-f-manual](w3cSVGTests/paths-data-20-f-manual.svg) | [#395](https://github.com/exyte/Macaw/issues/395) | +|[paths-data-20-f-manual](w3cSVGTests/paths-data-20-f-manual.svg) | ✅ | |[pservers-grad-01-b-manual](w3cSVGTests/pservers-grad-01-b-manual.svg) | ✅ | |[pservers-grad-02-b-manual](w3cSVGTests/pservers-grad-02-b-manual.svg) | ✅ | |[pservers-grad-03-b-manual](w3cSVGTests/pservers-grad-03-b-manual.svg) | ✅ | @@ -237,12 +237,12 @@ Status of each test: |[shapes-polygon-03-t-manual](w3cSVGTests/shapes-polygon-03-t-manual.svg) | ✅ | |[shapes-polyline-01-t-manual](w3cSVGTests/shapes-polyline-01-t-manual.svg) | ✅ | |[shapes-polyline-02-t-manual](w3cSVGTests/shapes-polyline-02-t-manual.svg) | ✅ | -|[shapes-rect-02-t-manual](w3cSVGTests/shapes-rect-02-t-manual.svg) | [ios bug](https://stackoverflow.com/q/18880919)| -|[shapes-rect-03-t-manual](w3cSVGTests/shapes-rect-03-t-manual.svg) | [ios bug](https://stackoverflow.com/q/18880919)| +|[shapes-rect-02-t-manual](w3cSVGTests/shapes-rect-02-t-manual.svg) | ✅ | +|[shapes-rect-03-t-manual](w3cSVGTests/shapes-rect-03-t-manual.svg) | ✅ | |[shapes-rect-04-f-manual](w3cSVGTests/shapes-rect-04-f-manual.svg) | ✅ | |[shapes-rect-05-f-manual](w3cSVGTests/shapes-rect-05-f-manual.svg) | ✅ | -|[shapes-rect-06-f-manual](w3cSVGTests/shapes-rect-06-f-manual.svg) | [ios bug](https://stackoverflow.com/q/18880919) | -|[shapes-rect-07-f-manual](w3cSVGTests/shapes-rect-07-f-manual.svg) | [ios bug](https://stackoverflow.com/q/18880919) | +|[shapes-rect-06-f-manual](w3cSVGTests/shapes-rect-06-f-manual.svg) | ✅ | +|[shapes-rect-07-f-manual](w3cSVGTests/shapes-rect-07-f-manual.svg) | ✅ | |[struct-defs-01-t-manual](w3cSVGTests/struct-defs-01-t-manual.svg) | ✅ | |[struct-frag-01-t-manual](w3cSVGTests/struct-frag-01-t-manual.svg) | ✅ | |[struct-frag-02-t-manual](w3cSVGTests/struct-frag-02-t-manual.svg) | ✅ | @@ -274,7 +274,7 @@ Status of each test: |[struct-image-19-f-manual](w3cSVGTests/struct-image-19-f-manual.svg) | [wpt issue](https://github.com/web-platform-tests/wpt/issues/11178) | |[struct-svg-03-f-manual](w3cSVGTests/struct-svg-03-f-manual.svg) | [#344](https://github.com/exyte/Macaw/issues/344) | |[struct-symbol-01-b-manual](w3cSVGTests/struct-symbol-01-b-manual.svg) | [#398](https://github.com/exyte/Macaw/issues/398) | -|[struct-use-01-t-manual](w3cSVGTests/struct-use-01-t-manual.svg) | [#399](https://github.com/exyte/Macaw/issues/399) | +|[struct-use-01-t-manual](w3cSVGTests/struct-use-01-t-manual.svg) | ✅ | |[struct-use-03-t-manual](w3cSVGTests/struct-use-03-t-manual.svg) | ✅ | |[struct-use-09-b-manual](w3cSVGTests/struct-use-09-b-manual.svg) | [#398](https://github.com/exyte/Macaw/issues/398) | |[struct-use-12-f-manual](w3cSVGTests/struct-use-12-f-manual.svg) | ✅ | diff --git a/MacawTests/w3cSVGTests/color-prop-05-t-manual.reference b/MacawTests/w3cSVGTests/color-prop-05-t-manual.reference new file mode 100644 index 00000000..f2df0f8b --- /dev/null +++ b/MacawTests/w3cSVGTests/color-prop-05-t-manual.reference @@ -0,0 +1,88 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "h" : 150, + "type" : "Rect", + "w" : 150, + "x" : 120, + "y" : 60 + }, + "node" : "Shape" + } + ], + "node" : "Group" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.8 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/color-prop-05-t-manual.svg b/MacawTests/w3cSVGTests/color-prop-05-t-manual.svg new file mode 100644 index 00000000..466dcda5 --- /dev/null +++ b/MacawTests/w3cSVGTests/color-prop-05-t-manual.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

+ Tests the color that is used for the currentColor value in the fill + attribute when more than one color is specified. +

+

+ This is illustrated using a single rectangle that is a child of a group + element. A fill is specified for the group element but not the + rectangle. Colour is specifed for the rectangle and the group element. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if the user agent renders the rectangle with a green + fill. +

+
+ + $RCSfile: color-prop-05-t.svg,v $ + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/MacawTests/w3cSVGTests/coords-trans-10-f-manual.reference b/MacawTests/w3cSVGTests/coords-trans-10-f-manual.reference new file mode 100644 index 00000000..f2113416 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-10-f-manual.reference @@ -0,0 +1,627 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 40, 20" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 40, 20" + }, + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 40, 20" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 40, 20" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 0, 100" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.9 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/coords-trans-10-f-manual.svg b/MacawTests/w3cSVGTests/coords-trans-10-f-manual.svg new file mode 100644 index 00000000..b862af00 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-10-f-manual.svg @@ -0,0 +1,90 @@ + + + + + + + + + + +

+ Translation is equivalent to the matrix [1 0 0 1 tx ty], where 'tx' + and 'ty' are the distances to translate coordinates in X and Y + respectively. The test overlays a group of black graphics elements + with a 'translate' transform specified on top of an identical group + of red elements with the equivalent 'matrix' transform and vice + versa. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: coords-trans-10-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.9 $ + + + + diff --git a/MacawTests/w3cSVGTests/coords-trans-11-f-manual.reference b/MacawTests/w3cSVGTests/coords-trans-11-f-manual.reference new file mode 100644 index 00000000..c94401f8 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-11-f-manual.reference @@ -0,0 +1,627 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1.2, 0, 0, 2.5, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1.2, 0, 0, 2.5, 0, 0" + }, + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1.2, 0, 0, 2.5, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1.2, 0, 0, 2.5, 0, 0" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 0, 150" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.8 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/coords-trans-11-f-manual.svg b/MacawTests/w3cSVGTests/coords-trans-11-f-manual.svg new file mode 100644 index 00000000..501ee1cd --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-11-f-manual.svg @@ -0,0 +1,86 @@ + + + + + + + + + + +

+ Scaling is equivalent to the matrix [sx 0 0 xy 0 0], where one unit in the X and Y directions in the new coordinate system equals 'sx' and 'sy' units in the previous coordinate system respectively.The test overlays a group of black graphics elements with a 'scale' transform specified on top of an identical group of red elements + with the equivalent 'matrix' transform and vice versa. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: coords-trans-11-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.8 $ + + + + diff --git a/MacawTests/w3cSVGTests/coords-trans-12-f-manual.reference b/MacawTests/w3cSVGTests/coords-trans-12-f-manual.reference new file mode 100644 index 00000000..963aa1c7 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-12-f-manual.reference @@ -0,0 +1,633 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "0, 1, -1, 0, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "0, 1, -1, 0, 0, 0" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 200, 0" + }, + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "0, 1, -1, 0, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "0, 1, -1, 0, 0, 0" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 310, 0" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.6 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/coords-trans-12-f-manual.svg b/MacawTests/w3cSVGTests/coords-trans-12-f-manual.svg new file mode 100644 index 00000000..6984bb11 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-12-f-manual.svg @@ -0,0 +1,88 @@ + + + + + + + + + + +

+ Rotation about the origin is equivalent to the matrix [cos(a) sin(a) -sin(a) cos(a) 0 0], which has the effect of rotating the coordinate system axes by angle 'a'. The test overlays a group of black graphics elements with a 'rotate' transform specified on top of an identical group of red elements + with the equivalent 'matrix' transform and vice versa. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: coords-trans-12-f.svg,v $ + + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/MacawTests/w3cSVGTests/coords-trans-13-f-manual.reference b/MacawTests/w3cSVGTests/coords-trans-13-f-manual.reference new file mode 100644 index 00000000..a84b7758 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-13-f-manual.reference @@ -0,0 +1,627 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 1, 1, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 0, 1, 1, 0, 0" + }, + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 1, 1, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 0, 1, 1, 0, 0" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 0, 150" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.6 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/coords-trans-13-f-manual.svg b/MacawTests/w3cSVGTests/coords-trans-13-f-manual.svg new file mode 100644 index 00000000..5638c90c --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-13-f-manual.svg @@ -0,0 +1,87 @@ + + + + + + + + + + +

+ A skew transformation along the x-axis is equivalent to the matrix [1 0 tan(a) 1 0 0], which has the effect of skewing X coordinates by angle 'a'. +The test overlays a group of black graphics elements with a 'skewX' transform specified on top of an identical group of red elements + with the equivalent 'matrix' transform and vice versa. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: coords-trans-13-f.svg,v $ + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/MacawTests/w3cSVGTests/coords-trans-14-f-manual.reference b/MacawTests/w3cSVGTests/coords-trans-14-f-manual.reference new file mode 100644 index 00000000..db9708f8 --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-14-f-manual.reference @@ -0,0 +1,633 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 1, 0, 1, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 1, 0, 1, 0, 0" + }, + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 1, 0, 1, 0, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "segments" : [ + { + "data" : [ + 20, + 20 + ], + "type" : "M" + }, + { + "data" : [ + 70, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 45, + 60 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "ellipse" : { + "cx" : 120, + "cy" : 35, + "rx" : 30, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 18, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 160, 40", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + }, + "text" : "Filler Text" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "h" : 50, + "type" : "Rect", + "w" : 30, + "x" : 250, + "y" : 20 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 310, + "x2" : 350, + "y1" : 20, + "y2" : 70 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 5 + } + } + ], + "node" : "Group", + "place" : "1, 1, 0, 1, 0, 0" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 0, 150" + } + ], + "node" : "Group", + "place" : ".704769, -.256515, .256515, .704769, 0, 0" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.6 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/coords-trans-14-f-manual.svg b/MacawTests/w3cSVGTests/coords-trans-14-f-manual.svg new file mode 100644 index 00000000..c05e9dad --- /dev/null +++ b/MacawTests/w3cSVGTests/coords-trans-14-f-manual.svg @@ -0,0 +1,89 @@ + + + + + + + + + + +

+ A skew transformation along the y-axis is equivalent to the matrix [1 tan(a) 0 1 0 0], which has the effect of skewing Y coordinates by angle 'a'. +The test overlays a group of black graphics elements with a 'skewY' transform specified on top of an identical group of red elements + with the equivalent 'matrix' transform and vice versa. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: coords-trans-14-f.svg,v $ + + + + + + + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + Filler Text + + + + + + + Filler Text + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/MacawTests/w3cSVGTests/paths-data-20-f-manual.reference b/MacawTests/w3cSVGTests/paths-data-20-f-manual.reference new file mode 100644 index 00000000..c9be2934 --- /dev/null +++ b/MacawTests/w3cSVGTests/paths-data-20-f-manual.reference @@ -0,0 +1,793 @@ +{ + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 120, + 120 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 0, + -25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 120, + 120 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 0, + -25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 200, + 120 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + 25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 200, + 120 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + 25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 280, + 120 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 0, + -25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 280, + 120 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 360, + 120 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + 25, + 25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 360, + 120 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 120, + 200 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + -25, + -25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 120, + 200 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + -25, + -25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 200, + 200 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 0, + 25, + -25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 200, + 200 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 280, + 200 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 1, + -25, + -25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 280, + 200 + ], + "type" : "M" + }, + { + "data" : [ + 25 + ], + "type" : "h" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 360, + 200 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + 25, + 25, + 0, + 1, + 0, + 25, + -25 + ], + "type" : "a" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "segments" : [ + { + "data" : [ + 360, + 200 + ], + "type" : "M" + }, + { + "data" : [ + -25 + ], + "type" : "h" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.3 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/paths-data-20-f-manual.svg b/MacawTests/w3cSVGTests/paths-data-20-f-manual.svg new file mode 100644 index 00000000..ed643bce --- /dev/null +++ b/MacawTests/w3cSVGTests/paths-data-20-f-manual.svg @@ -0,0 +1,87 @@ + + + + + + + + + + +

+ Tests parsing of the elliptical arc path syntax. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if the image looks as if there are eight green circles that have + two white rectangles overlapping them, like in the reference image. If any red is visible + the test has failed. +

+
+ + $RCSfile: paths-data-20-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.reference b/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.reference new file mode 100644 index 00000000..2f5be6a1 --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.reference @@ -0,0 +1,188 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 32768 + }, + "form" : { + "h" : 80, + "type" : "Rect", + "w" : 50, + "x" : 0, + "y" : 46 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 32768 + }, + "form" : { + "h" : 80, + "type" : "Rect", + "w" : 50, + "x" : 130, + "y" : 0 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 32768 + }, + "form" : { + "rect" : { + "h" : 80, + "type" : "Rect", + "w" : 50, + "x" : 30, + "y" : 196 + }, + "rx" : 20, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 32768 + }, + "form" : { + "rect" : { + "h" : 80, + "type" : "Rect", + "w" : 50, + "x" : 130, + "y" : 196 + }, + "rx" : 20, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "node" : "Group" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.5 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.svg b/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.svg new file mode 100644 index 00000000..6c487d5f --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-02-t-manual.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Test x, y, width, height, rx and ry default/lacuna values on a rect element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ There should be four green rectangles visible, two of them should have rounded corners. +

+
+ + $RCSfile: shapes-rect-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.reference b/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.reference new file mode 100644 index 00000000..b4afbc6f --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.reference @@ -0,0 +1,1629 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 100, + "y" : 0 + }, + "rx" : 50, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 130, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 160, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 190, + "y" : 0 + }, + "rx" : 10, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 220, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 250, + "y" : 0 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 280, + "y" : 0 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 310, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 340, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 120 + }, + "rx" : 50, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 150 + }, + "rx" : 15, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 180 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 120 + }, + "rx" : 50, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 150 + }, + "rx" : 20, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 180 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 120 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 150 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 180 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 45, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 10, + "y" : 120 + }, + "rx" : 25, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 50, + "type" : "Rect", + "w" : 20, + "x" : 80, + "y" : 120 + }, + "rx" : 10, + "ry" : 25, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 120, + "y" : 120 + }, + "rx" : 25, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 0, + "y" : 0 + }, + "rx" : 10, + "ry" : 15, + "type" : "RoundRect" + }, + "node" : "Shape", + "place" : "2, 0, 0, 2, 180, 120" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 230, + "y" : 120 + }, + "rx" : 10, + "ry" : 25, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 100, 100" + } + ], + "node" : "Group" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 100, + "y" : 0 + }, + "rx" : 50, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 130, + "y" : 0 + }, + "rx" : 15, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 160, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 190, + "y" : 0 + }, + "rx" : 80, + "ry" : 80, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 220, + "y" : 0 + }, + "rx" : 20, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 250, + "y" : 0 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 280, + "y" : 0 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 310, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 340, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 120 + }, + "rx" : 50, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 150 + }, + "rx" : 15, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 180 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 120 + }, + "rx" : 50, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 150 + }, + "rx" : 20, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 180 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 120 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 150 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 180 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 45, 0" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 10, + "y" : 120 + }, + "rx" : 50, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 50, + "type" : "Rect", + "w" : 20, + "x" : 80, + "y" : 120 + }, + "rx" : 50, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 120, + "y" : 120 + }, + "rx" : 200, + "ry" : 200, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 0, + "y" : 0 + }, + "rx" : 50, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape", + "place" : "2, 0, 0, 2, 180, 120" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 230, + "y" : 120 + }, + "rx" : 50, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 100, 100" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 100, + "y" : 0 + }, + "rx" : 50, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 130, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 160, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 190, + "y" : 0 + }, + "rx" : 10, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 220, + "y" : 0 + }, + "rx" : 10, + "ry" : 20, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 250, + "y" : 0 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 280, + "y" : 0 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 310, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 20, + "x" : 340, + "y" : 0 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "contents" : [ + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 120 + }, + "rx" : 50, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 150 + }, + "rx" : 15, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 10, + "y" : 180 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 120 + }, + "rx" : 50, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 150 + }, + "rx" : 20, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 130, + "y" : 180 + }, + "rx" : 10, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 120 + }, + "rx" : 5, + "ry" : 5, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 150 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 100, + "x" : 250, + "y" : 180 + }, + "rx" : 0, + "ry" : 0, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 45, 0" + }, + { + "contents" : [ + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 10, + "y" : 120 + }, + "rx" : 25, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 50, + "type" : "Rect", + "w" : 20, + "x" : 80, + "y" : 120 + }, + "rx" : 10, + "ry" : 25, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 20, + "type" : "Rect", + "w" : 50, + "x" : 120, + "y" : 120 + }, + "rx" : 25, + "ry" : 10, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + }, + { + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 0, + "y" : 0 + }, + "rx" : 10, + "ry" : 15, + "type" : "RoundRect" + }, + "node" : "Shape", + "place" : "2, 0, 0, 2, 180, 120", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 0.5 + } + }, + { + "form" : { + "rect" : { + "h" : 30, + "type" : "Rect", + "w" : 20, + "x" : 230, + "y" : 120 + }, + "rx" : 10, + "ry" : 25, + "type" : "RoundRect" + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 100, 100" + } + ], + "node" : "Group" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 0, 30" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.9 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.svg b/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.svg new file mode 100644 index 00000000..8e7fbec6 --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-03-t-manual.svg @@ -0,0 +1,139 @@ + + + + + + + + + + +

+ Tests rx and ry clamping and aliasing. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • There is no red visible
  • +
  • There is no green outside the black borders of each rectangle
  • +
+
+ + $RCSfile: shapes-rect-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + diff --git a/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.reference b/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.reference new file mode 100644 index 00000000..5595a94c --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.reference @@ -0,0 +1,221 @@ +{ + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 50 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 50 + }, + "rx" : 150, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 200 + }, + "rx" : 150, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 200 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 275, + "y" : 50 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 275, + "y" : 50 + }, + "rx" : 100, + "ry" : 75, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 275, + "y" : 200 + }, + "rx" : 100, + "ry" : 75, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 275, + "y" : 200 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.3 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.svg b/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.svg new file mode 100644 index 00000000..7b4d209e --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-06-f-manual.svg @@ -0,0 +1,70 @@ + + + + + + + + + + +

+ When 'rect' attributes 'rx' and 'ry' have a value greater than half of the width/height of the rectangle, they are treated as half the width/height of the rectangle. +

+

+ The test creates one 'rect' element with 'rx' greater than 1/2 the 'rect' width. Underneath that element, it creates a red 'rect' element with + 'rx' set to 1/2 the width. Repeats with 'ry' attribute. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: shapes-rect-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.reference b/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.reference new file mode 100644 index 00000000..ad046761 --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.reference @@ -0,0 +1,145 @@ +{ + "contents" : [ + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 50 + }, + "rx" : 100, + "ry" : 100, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 50 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 16711680 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 200 + }, + "rx" : 100, + "ry" : 50, + "type" : "RoundRect" + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "rect" : { + "h" : 100, + "type" : "Rect", + "w" : 200, + "x" : 25, + "y" : 200 + }, + "rx" : 100, + "ry" : 100, + "type" : "RoundRect" + }, + "node" : "Shape" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.2 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.svg b/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.svg new file mode 100644 index 00000000..ac9e9fbd --- /dev/null +++ b/MacawTests/w3cSVGTests/shapes-rect-07-f-manual.svg @@ -0,0 +1,61 @@ + + + + + + + + + + +

+ Checks that unspecified 'ry' and 'rx' attributes are copied from each other before their values are clamped. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is no red visible on the page. +

+
+ + $RCSfile: shapes-rect-07-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + diff --git a/MacawTests/w3cSVGTests/struct-use-01-t-manual.reference b/MacawTests/w3cSVGTests/struct-use-01-t-manual.reference new file mode 100644 index 00000000..183b4045 --- /dev/null +++ b/MacawTests/w3cSVGTests/struct-use-01-t-manual.reference @@ -0,0 +1,503 @@ +{ + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "contents" : [ + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 30", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 60", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 90", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 120", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 150", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 180", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 210", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 240", + "text" : "" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 130, 40" + }, + { + "contents" : [ + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "text" : "" + }, + { + "align" : "max", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 20, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 30", + "text" : "" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 310, 40" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "h" : 20, + "type" : "Rect", + "w" : 20, + "x" : 0, + "y" : 0 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "cx" : 10, + "cy" : 10, + "r" : 10, + "type" : "Circle" + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 30" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "ellipse" : { + "cx" : 10, + "cy" : 10, + "rx" : 10, + "ry" : 10, + "type" : "Ellipse" + }, + "extent" : 6.2831853071795862, + "shift" : 0, + "type" : "Arc" + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 60" + }, + { + "fill" : { + "type" : "Color", + "val" : 0 + }, + "form" : { + "type" : "Line", + "x1" : 0, + "x2" : 20, + "y1" : 10, + "y2" : 10 + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 90", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 2 + } + }, + { + "form" : { + "points" : [ + 0, + 0, + 20, + 0, + 20, + 20 + ], + "type" : "Polyline" + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 120", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "join" : "miter", + "width" : 2 + } + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "points" : [ + 0, + 0, + 20, + 0, + 20, + 20, + 0, + 20, + 0, + 0 + ], + "type" : "Polygon" + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 150" + }, + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "segments" : [ + { + "data" : [ + 0, + 0 + ], + "type" : "M" + }, + { + "data" : [ + 20, + 0 + ], + "type" : "L" + }, + { + "data" : [ + 20, + 20 + ], + "type" : "L" + }, + { + "data" : [ + 0, + 20 + ], + "type" : "L" + }, + { + "data" : [ + + ], + "type" : "z" + } + ], + "type" : "Path" + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 0, 180" + }, + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "font" : { + "name" : "FreeSerif,serif", + "size" : 25, + "weight" : "bold" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 0, 260", + "text" : "Text" + }, + { + "contents" : [ + { + "fill" : { + "type" : "Color", + "val" : 65280 + }, + "form" : { + "h" : 20, + "type" : "Rect", + "w" : 10, + "x" : 0, + "y" : 0 + }, + "node" : "Shape" + }, + { + "fill" : { + "type" : "Color", + "val" : 32768 + }, + "form" : { + "h" : 20, + "type" : "Rect", + "w" : 10, + "x" : 10, + "y" : 0 + }, + "node" : "Shape" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 180, 0" + }, + { + "fill" : { + "type" : "Color", + "val" : 52224 + }, + "form" : { + "h" : 20, + "type" : "Rect", + "w" : 20, + "x" : 0, + "y" : 0 + }, + "node" : "Shape", + "place" : "1, 0, 0, 1, 180, 30" + } + ], + "node" : "Group", + "place" : "1, 0, 0, 1, 150, 25" + } + ], + "node" : "Group" + }, + { + "contents" : [ + { + "align" : "min", + "baseline" : "bottom", + "fill" : { + "type" : "Color", + "val" : 0 + }, + "font" : { + "name" : "SVGFreeSansASCII,sans-serif", + "size" : 32, + "weight" : "normal" + }, + "node" : "Text", + "place" : "1, 0, 0, 1, 10, 340", + "text" : "$Revision: 1.5 $" + } + ], + "node" : "Group" + }, + { + "form" : { + "h" : 358, + "type" : "Rect", + "w" : 478, + "x" : 1, + "y" : 1 + }, + "node" : "Shape", + "stroke" : { + "cap" : "butt", + "dashes" : [ + + ], + "fill" : { + "type" : "Color", + "val" : 0 + }, + "join" : "miter", + "width" : 1 + } + } + ], + "layout" : { + "scalingMode" : "meet", + "svgSize" : { + "height" : "100.0%", + "width" : "100.0%" + }, + "viewBox" : { + "h" : 360, + "type" : "Rect", + "w" : 480, + "x" : 0, + "y" : 0 + }, + "xAligningMode" : "mid", + "yAligningMode" : "mid" + }, + "node" : "Canvas" +} \ No newline at end of file diff --git a/MacawTests/w3cSVGTests/struct-use-01-t-manual.svg b/MacawTests/w3cSVGTests/struct-use-01-t-manual.svg new file mode 100644 index 00000000..92e5175f --- /dev/null +++ b/MacawTests/w3cSVGTests/struct-use-01-t-manual.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + +

+ The purpose of this test is to validate proper handling of + the use element. In particular, the test checks the proper inheritance + of properties through the shadow tree (rather than through the document + tree). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test should display various elements in different shades of green. + If an element is not displayed in green, but in red fill and/or yellow + stroke, then it is in error. +

+
+ + $RCSfile: struct-use-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text + + + + + + <rect> + <circle> + <ellipse> + <line> + <polyline> + <polygon> + <path> + <image> + <text> + + + <g> + <use> + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Source/model/draw/Color.swift b/Source/model/draw/Color.swift index 092dc445..3229fc88 100644 --- a/Source/model/draw/Color.swift +++ b/Source/model/draw/Color.swift @@ -2,23 +2,153 @@ open class Color: Fill { public let val: Int - public static let white: Color = Color( val: 0xFFFFFF ) - public static let silver: Color = Color( val: 0xC0C0C0 ) - public static let gray: Color = Color( val: 0x808080 ) - public static let black: Color = Color( val: 0 ) - public static let red: Color = Color( val: 0xFF0000 ) - public static let maroon: Color = Color( val: 0x800000 ) - public static let yellow: Color = Color( val: 0xFFFF00 ) - public static let olive: Color = Color( val: 0x808000 ) - public static let lime: Color = Color( val: 0x00FF00 ) - public static let green: Color = Color( val: 0x008000 ) - public static let aqua: Color = Color( val: 0x00FFFF ) - public static let teal: Color = Color( val: 0x008080 ) - public static let blue: Color = Color( val: 0x0000FF ) - public static let navy: Color = Color( val: 0x000080 ) - public static let fuchsia: Color = Color( val: 0xFF00FF ) - public static let purple: Color = Color( val: 0x800080 ) - public static let clear: Color = Color.rgba(r: 0, g: 0, b: 0, a: 0) + public static let white = Color(0xFFFFFF) + public static let silver = Color(0xC0C0C0) + public static let gray = Color(0x808080) + public static let black = Color(0) + public static let red = Color(0xFF0000) + public static let maroon = Color(0x800000) + public static let yellow = Color(0xFFFF00) + public static let olive = Color(0x808000) + public static let lime = Color(0x00FF00) + public static let green = Color(0x008000) + public static let aqua = Color(0x00FFFF) + public static let teal = Color(0x008080) + public static let blue = Color(0x0000FF) + public static let navy = Color(0x000080) + public static let fuchsia = Color(0xFF00FF) + public static let purple = Color(0x800080) + + public static let clear = Color.rgba(r: 0, g: 0, b: 0, a: 0) + + public static let aliceBlue = Color(0xf0f8ff) + public static let antiqueWhite = Color(0xfaebd7) + public static let aquamarine = Color(0x7fffd4) + public static let azure = Color(0xf0ffff) + public static let beige = Color(0xf5f5dc) + public static let bisque = Color(0xffe4c4) + public static let blanchedAlmond = Color(0xffebcd) + public static let blueViolet = Color(0x8a2be2) + public static let brown = Color(0xa52a2a) + public static let burlywood = Color(0xdeb887) + public static let cadetBlue = Color(0x5f9ea0) + public static let chartreuse = Color(0x7fff00) + public static let chocolate = Color(0xd2691e) + public static let coral = Color(0xff7f50) + public static let cornflowerBlue = Color(0x6495ed) + public static let cornsilk = Color(0xfff8dc) + public static let crimson = Color(0xdc143c) + public static let cyan = Color(0x00ffff) + public static let darkBlue = Color(0x00008b) + public static let darkCyan = Color(0x008b8b) + public static let darkGoldenrod = Color(0xb8860b) + public static let darkGray = Color(0xa9a9a9) + public static let darkGreen = Color(0x006400) + public static let darkKhaki = Color(0xbdb76b) + public static let darkMagenta = Color(0x8b008b) + public static let darkOliveGreen = Color(0x556b2f) + public static let darkOrange = Color(0xff8c00) + public static let darkOrchid = Color(0x9932cc) + public static let darkRed = Color(0x8b0000) + public static let darkSalmon = Color(0xe9967a) + public static let darkSeaGreen = Color(0x8fbc8f) + public static let darkSlateBlue = Color(0x483d8b) + public static let darkSlateGray = Color(0x2f4f4f) + public static let darkTurquoise = Color(0x00ced1) + public static let darkViolet = Color(0x9400d3) + public static let deepPink = Color(0xff1493) + public static let deepSkyBlue = Color(0x00bfff) + public static let dimGray = Color(0x696969) + public static let dodgerBlue = Color(0x1e90ff) + public static let firebrick = Color(0xb22222) + public static let floralWhite = Color(0xfffaf0) + public static let forestGreen = Color(0x228b22) + public static let gainsboro = Color(0xdcdcdc) + public static let ghostWhite = Color(0xf8f8ff) + public static let gold = Color(0xffd700) + public static let goldenrod = Color(0xdaa520) + public static let greenYellow = Color(0xadff2f) + public static let honeydew = Color(0xf0fff0) + public static let hotPink = Color(0xff69b4) + public static let indianRed = Color(0xcd5c5c) + public static let indigo = Color(0x4b0082) + public static let ivory = Color(0xfffff0) + public static let khaki = Color(0xf0e68c) + public static let lavender = Color(0xe6e6fa) + public static let lavenderBlush = Color(0xfff0f5) + public static let lawnGreen = Color(0x7cfc00) + public static let lemonChiffon = Color(0xfffacd) + public static let lightBlue = Color(0xadd8e6) + public static let lightCoral = Color(0xf08080) + public static let lightCyan = Color(0xe0ffff) + public static let lightGoldenrodYellow = Color(0xfafad2) + public static let lightGray = Color(0xd3d3d3) + public static let lightGreen = Color(0x90ee90) + public static let lightPink = Color(0xffb6c1) + public static let lightSalmon = Color(0xffa07a) + public static let lightSeaGreen = Color(0x20b2aa) + public static let lightSkyBlue = Color(0x87cefa) + public static let lightSlateGray = Color(0x778899) + public static let lightSteelBlue = Color(0xb0c4de) + public static let lightYellow = Color(0xffffe0) + public static let limeGreen = Color(0x32cd32) + public static let linen = Color(0xfaf0e6) + public static let mediumAquamarine = Color(0x66cdaa) + public static let mediumBlue = Color(0x0000cd) + public static let mediumOrchid = Color(0xba55d3) + public static let mediumPurple = Color(0x9370db) + public static let mediumSeaGreen = Color(0x3cb371) + public static let mediumSlateBlue = Color(0x7b68ee) + public static let mediumSpringGreen = Color(0x00fa9a) + public static let mediumTurquoise = Color(0x48d1cc) + public static let mediumVioletRed = Color(0xc71585) + public static let midnightBlue = Color(0x191970) + public static let mintCream = Color(0xf5fffa) + public static let mistyRose = Color(0xffe4e1) + public static let moccasin = Color(0xffe4b5) + public static let navajoWhite = Color(0xffdead) + public static let oldLace = Color(0xfdf5e6) + public static let oliveDrab = Color(0x6b8e23) + public static let orange = Color(0xffa500) + public static let orangeRed = Color(0xff4500) + public static let orchid = Color(0xda70d6) + public static let paleGoldenrod = Color(0xeee8aa) + public static let paleGreen = Color(0x98fb98) + public static let paleTurquoise = Color(0xafeeee) + public static let paleVioletRed = Color(0xdb7093) + public static let papayaWhip = Color(0xffefd5) + public static let peachPuff = Color(0xffdab9) + public static let peru = Color(0xcd853f) + public static let pink = Color(0xffc0cb) + public static let plum = Color(0xdda0dd) + public static let powderBlue = Color(0xb0e0e6) + public static let rebeccaPurple = Color(0x663399) + public static let rosyBrown = Color(0xbc8f8f) + public static let royalBlue = Color(0x4169e1) + public static let saddleBrown = Color(0x8b4513) + public static let salmon = Color(0xfa8072) + public static let sandyBrown = Color(0xf4a460) + public static let seaGreen = Color(0x2e8b57) + public static let seashell = Color(0xfff5ee) + public static let sienna = Color(0xa0522d) + public static let skyBlue = Color(0x87ceeb) + public static let slateBlue = Color(0x6a5acd) + public static let slateGray = Color(0x708090) + public static let snow = Color(0xfffafa) + public static let springGreen = Color(0x00ff7f) + public static let steelBlue = Color(0x4682b4) + public static let tan = Color(0xd2b48c) + public static let thistle = Color(0xd8bfd8) + public static let tomato = Color(0xff6347) + public static let turquoise = Color(0x40e0d0) + public static let violet = Color(0xee82ee) + public static let wheat = Color(0xf5deb3) + public static let whiteSmoke = Color(0xf5f5f5) + public static let yellowGreen = Color(0x9acd32) + + public init(_ val: Int = 0) { + self.val = val + } public init(val: Int = 0) { self.val = val diff --git a/Source/model/geom2d/Line.swift b/Source/model/geom2d/Line.swift index 77a2395d..e37c2d29 100644 --- a/Source/model/geom2d/Line.swift +++ b/Source/model/geom2d/Line.swift @@ -5,6 +5,13 @@ open class Line: Locus { public let x2: Double public let y2: Double + public init(_ x1: Double, _ y1: Double, _ x2: Double, _ y2: Double) { + self.x1 = x1 + self.y1 = y1 + self.x2 = x2 + self.y2 = y2 + } + public init(x1: Double = 0, y1: Double = 0, x2: Double = 0, y2: Double = 0) { self.x1 = x1 self.y1 = y1 @@ -13,11 +20,7 @@ open class Line: Locus { } override open func bounds() -> Rect { - return Rect( - x: min(x1, x2), - y: min(y1, y2), - w: abs(x1 - x2), - h: abs(y1 - y2)) + return Rect(x: min(x1, x2), y: min(y1, y2), w: abs(x1 - x2), h: abs(y1 - y2)) } override open func toPath() -> Path { diff --git a/Source/model/geom2d/Locus.swift b/Source/model/geom2d/Locus.swift index 1a7539d6..06e3747e 100644 --- a/Source/model/geom2d/Locus.swift +++ b/Source/model/geom2d/Locus.swift @@ -15,10 +15,26 @@ open class Locus { return Shape(form: self, fill: with) } + open func fill(_ hex: Int) -> Shape { + return Shape(form: self, fill: Color(val: hex)) + } + + open func fill(_ fill: Fill) -> Shape { + return Shape(form: self, fill: fill) + } + open func stroke(fill: Fill = Color.black, width: Double = 1, cap: LineCap = .butt, join: LineJoin = .miter, dashes: [Double] = []) -> Shape { return Shape(form: self, stroke: Stroke(fill: fill, width: width, cap: cap, join: join, dashes: dashes)) } + open func stroke(color: Color, width: Double = 1, cap: LineCap = .butt, join: LineJoin = .miter, dashes: [Double] = []) -> Shape { + return Shape(form: self, stroke: Stroke(fill: color, width: width, cap: cap, join: join, dashes: dashes)) + } + + open func stroke(color: Int, width: Double = 1, cap: LineCap = .butt, join: LineJoin = .miter, dashes: [Double] = []) -> Shape { + return Shape(form: self, stroke: Stroke(fill: Color(color), width: width, cap: cap, join: join, dashes: dashes)) + } + open func toPath() -> Path { fatalError("Unsupported locus: \(self)") } diff --git a/Source/model/geom2d/MoveTo.swift b/Source/model/geom2d/MoveTo.swift index 7d4a04ae..9f488153 100644 --- a/Source/model/geom2d/MoveTo.swift +++ b/Source/model/geom2d/MoveTo.swift @@ -1,5 +1,9 @@ open class MoveTo: PathBuilder { + public init(_ x: Double, _ y: Double) { + super.init(segment: PathSegment(type: .M, data: [x, y])) + } + public init(x: Double, y: Double) { super.init(segment: PathSegment(type: .M, data: [x, y])) } diff --git a/Source/model/geom2d/Point.swift b/Source/model/geom2d/Point.swift index cac4f508..234ae075 100644 --- a/Source/model/geom2d/Point.swift +++ b/Source/model/geom2d/Point.swift @@ -5,7 +5,12 @@ open class Point: Locus { public let x: Double public let y: Double - public static let origin: Point = Point( x: 0, y: 0 ) + public static let origin = Point(0, 0) + + public init(_ x: Double, _ y: Double) { + self.x = x + self.y = y + } public init(x: Double = 0, y: Double = 0) { self.x = x diff --git a/Source/model/geom2d/Polygon.swift b/Source/model/geom2d/Polygon.swift index 62c4c972..f47fdf5c 100644 --- a/Source/model/geom2d/Polygon.swift +++ b/Source/model/geom2d/Polygon.swift @@ -4,6 +4,10 @@ open class Polygon: Locus { public let points: [Double] + public init(_ points: [Double]) { + self.points = points + } + public init(points: [Double] = []) { self.points = points } diff --git a/Source/model/geom2d/Polyline.swift b/Source/model/geom2d/Polyline.swift index 9ee50871..83de29ce 100644 --- a/Source/model/geom2d/Polyline.swift +++ b/Source/model/geom2d/Polyline.swift @@ -4,6 +4,10 @@ open class Polyline: Locus { public let points: [Double] + public init(_ points: [Double]) { + self.points = points + } + public init(points: [Double] = []) { self.points = points } diff --git a/Source/model/geom2d/Rect.swift b/Source/model/geom2d/Rect.swift index c2a7c4c5..6f31771e 100644 --- a/Source/model/geom2d/Rect.swift +++ b/Source/model/geom2d/Rect.swift @@ -5,6 +5,13 @@ open class Rect: Locus { public let w: Double public let h: Double + public init(_ x: Double, _ y: Double, _ w: Double, _ h: Double) { + self.x = x + self.y = y + self.w = w + self.h = h + } + public init(x: Double = 0, y: Double = 0, w: Double = 0, h: Double = 0) { self.x = x self.y = y diff --git a/Source/model/geom2d/Size.swift b/Source/model/geom2d/Size.swift index b4a09805..9f5ef0e6 100644 --- a/Source/model/geom2d/Size.swift +++ b/Source/model/geom2d/Size.swift @@ -5,7 +5,12 @@ open class Size { public let w: Double public let h: Double - public static let zero: Size = Size(w: 0, h: 0) + public static let zero = Size(0, 0) + + public init(_ w: Double, _ h: Double) { + self.w = w + self.h = h + } public init(w: Double = 0, h: Double = 0) { self.w = w diff --git a/Source/model/geom2d/Transform.swift b/Source/model/geom2d/Transform.swift index 38dc516c..206d137a 100644 --- a/Source/model/geom2d/Transform.swift +++ b/Source/model/geom2d/Transform.swift @@ -9,7 +9,16 @@ public final class Transform { public let dx: Double public let dy: Double - public static let identity: Transform = Transform() + public static let identity = Transform() + + public init(_ m11: Double, _ m12: Double, _ m21: Double, _ m22: Double, _ dx: Double, _ dy: Double) { + self.m11 = m11 + self.m12 = m12 + self.m21 = m21 + self.m22 = m22 + self.dx = dx + self.dy = dy + } public init(m11: Double = 1, m12: Double = 0, m21: Double = 0, m22: Double = 1, dx: Double = 0, dy: Double = 0) { self.m11 = m11 @@ -20,39 +29,74 @@ public final class Transform { self.dy = dy } - public func move(dx: Double, dy: Double) -> Transform { - return Transform(m11: m11, m12: m12, m21: m21, m22: m22, - dx: dx * m11 + dy * m21 + self.dx, dy: dx * m12 + dy * m22 + self.dy) + public func move(_ dx: Double, _ dy: Double) -> Transform { + return move(dx: dx, dy: dy) } - public func scale(sx: Double, sy: Double) -> Transform { + public func move(dx: Double = 0, dy: Double = 0) -> Transform { + return Transform(m11: m11, m12: m12, m21: m21, m22: m22, + dx: dx * m11 + dy * m21 + self.dx, + dy: dx * m12 + dy * m22 + self.dy) + } + + public func scale(sx: Double = 0, sy: Double = 0) -> Transform { return Transform(m11: m11 * sx, m12: m12 * sx, m21: m21 * sy, m22: m22 * sy, dx: dx, dy: dy) } - public func shear(shx: Double, shy: Double) -> Transform { + public func scale(_ sx: Double, _ sy: Double) -> Transform { + return scale(sx: sx, sy: sy) + } + + public func shear(shx: Double = 0, shy: Double = 0) -> Transform { return Transform(m11: m11 + m21 * shy, m12: m12 + m22 * shy, m21: m11 * shx + m21, m22: m12 * shx + m22, dx: dx, dy: dy) } - public func rotate(angle: Double) -> Transform { - let asin = sin(angle); let acos = cos(angle) - return Transform(m11: acos * m11 + asin * m21, m12: acos * m12 + asin * m22, - m21: -asin * m11 + acos * m21, m22: -asin * m12 + acos * m22, dx: dx, dy: dy) + public func shear(_ shx: Double, _ shy: Double) -> Transform { + return shear(shx: shx, shy: shy) } - public func rotate(angle: Double, x: Double, y: Double) -> Transform { + public func rotate(angle: Double) -> Transform { + let asin = sin(angle) + let acos = cos(angle) + return Transform(m11: acos * m11 + asin * m21, m12: acos * m12 + asin * m22, + m21: -asin * m11 + acos * m21, m22: -asin * m12 + acos * m22, + dx: dx, dy: dy) + } + + public func rotate(_ angle: Double) -> Transform { + return rotate(angle: angle) + } + + public func rotate(angle: Double, x: Double = 0, y: Double = 0) -> Transform { return move(dx: x, dy: y).rotate(angle: angle).move(dx: -x, dy: -y) } - public class func move(dx: Double, dy: Double) -> Transform { + public func rotate(_ angle: Double, _ x: Double, _ y: Double) -> Transform { + return rotate(angle: angle, x: x, y: y) + } + + public class func move(dx: Double = 0, dy: Double = 0) -> Transform { return Transform(dx: dx, dy: dy) } - public class func scale(sx: Double, sy: Double) -> Transform { + public class func move(_ dx: Double, _ dy: Double) -> Transform { + return Transform(dx: dx, dy: dy) + } + + public class func scale(sx: Double = 0, sy: Double = 0) -> Transform { return Transform(m11: sx, m22: sy) } - public class func shear(shx: Double, shy: Double) -> Transform { + public class func scale(_ sx: Double, _ sy: Double) -> Transform { + return Transform(m11: sx, m22: sy) + } + + public class func shear(shx: Double = 0, shy: Double = 0) -> Transform { + return Transform(m12: shy, m21: shx) + } + + public class func shear(_ shx: Double, _ shy: Double) -> Transform { return Transform(m12: shy, m21: shx) } @@ -61,10 +105,18 @@ public final class Transform { return Transform(m11: acos, m12: asin, m21: -asin, m22: acos) } - public class func rotate(angle: Double, x: Double, y: Double) -> Transform { + public class func rotate(_ angle: Double) -> Transform { + return rotate(angle: angle) + } + + public class func rotate(angle: Double, x: Double = 0, y: Double = 0) -> Transform { return Transform.move(dx: x, dy: y).rotate(angle: angle).move(dx: -x, dy: -y) } + public class func rotate(_ angle: Double, _ x: Double, _ y: Double) -> Transform { + return rotate(angle: angle, x: x, y: y) + } + public func concat(with: Transform) -> Transform { let nm11 = with.m11 * m11 + with.m12 * m21 let nm21 = with.m21 * m11 + with.m22 * m21 diff --git a/Source/model/scene/Image.swift b/Source/model/scene/Image.swift index cab5bb98..27a90826 100644 --- a/Source/model/scene/Image.swift +++ b/Source/model/scene/Image.swift @@ -64,7 +64,9 @@ open class Image: Node { tag: tag ) - srcVar.onChange { _ in self.mImage = nil } + srcVar.onChange { [weak self] _ in + self?.mImage = nil + } } public init(image: MImage, xAlign: Align = .min, yAlign: Align = .min, aspectRatio: AspectRatio = .none, w: Int = 0, h: Int = 0, place: Transform = Transform.identity, opaque: Bool = true, opacity: Double = 1, clip: Locus? = nil, effect: Effect? = nil, visible: Bool = true, tag: [String] = []) { @@ -93,7 +95,9 @@ open class Image: Node { tag: tag ) - srcVar.onChange { _ in self.mImage = nil } + srcVar.onChange { [weak self] _ in + self?.mImage = nil + } } override open var bounds: Rect? { diff --git a/Source/platform/macOS/Common_macOS.swift b/Source/platform/macOS/Common_macOS.swift index c4739d2c..3fdca8c1 100644 --- a/Source/platform/macOS/Common_macOS.swift +++ b/Source/platform/macOS/Common_macOS.swift @@ -160,4 +160,20 @@ extension MBezierPath { } } +extension CGContext { + private struct CGContextScale { + static var _scale: CGFloat = 0.0 + } + + var scale: CGFloat { + get { + return CGContextScale._scale + } + + set(newValue) { + CGContextScale._scale = newValue + } + } +} + #endif diff --git a/Source/platform/macOS/Graphics_macOS.swift b/Source/platform/macOS/Graphics_macOS.swift index 5f93e801..d260410d 100644 --- a/Source/platform/macOS/Graphics_macOS.swift +++ b/Source/platform/macOS/Graphics_macOS.swift @@ -11,8 +11,6 @@ import Foundation #if os(OSX) import AppKit -private var imageContextStack: [CGFloat] = [] - func MGraphicsGetCurrentContext() -> CGContext? { return NSGraphicsContext.current?.cgContext } @@ -54,8 +52,6 @@ func MGraphicsBeginImageContextWithOptions(_ size: CGSize, _ opaque: Bool, _ sca let height = Int(size.height * scale) if width > 0 && height > 0 { - imageContextStack.append(scale) - let colorSpace = CGColorSpaceCreateDeviceRGB() guard let ctx = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 4 * width, space: colorSpace, bitmapInfo: (opaque ? CGImageAlphaInfo.noneSkipFirst.rawValue : CGImageAlphaInfo.premultipliedFirst.rawValue)) else { @@ -64,32 +60,24 @@ func MGraphicsBeginImageContextWithOptions(_ size: CGSize, _ opaque: Bool, _ sca ctx.concatenate(CGAffineTransform(a: 1, b: 0, c: 0, d: -1, tx: 0, ty: CGFloat(height))) ctx.scaleBy(x: scale, y: scale) + ctx.scale = scale MGraphicsPushContext(ctx) } } func MGraphicsGetImageFromCurrentImageContext() -> MImage? { - if !imageContextStack.isEmpty { - guard let ctx = MGraphicsGetCurrentContext() else { + guard let ctx = MGraphicsGetCurrentContext(), + let theCGImage = ctx.makeImage() else { return nil - } - - let scale = imageContextStack.last! - if let theCGImage = ctx.makeImage() { - let size = CGSize(width: CGFloat(ctx.width) / scale, height: CGFloat(ctx.height) / scale) - let image = NSImage(cgImage: theCGImage, size: size) - return image - } } - - return nil + let scale = ctx.scale + let size = CGSize(width: CGFloat(ctx.width) / scale, height: CGFloat(ctx.height) / scale) + let image = NSImage(cgImage: theCGImage, size: size) + return image } func MGraphicsEndImageContext() { - if imageContextStack.last != nil { - imageContextStack.removeLast() - MGraphicsPopContext() - } + MGraphicsPopContext() } func MNoIntrinsicMetric() -> CGFloat { diff --git a/Source/render/RenderUtils.swift b/Source/render/RenderUtils.swift index 8b9ebeff..a3e217de 100644 --- a/Source/render/RenderUtils.swift +++ b/Source/render/RenderUtils.swift @@ -54,7 +54,9 @@ class RenderUtils { let lowerWeight = weight?.lowercased() if lowerWeight == "bold" || lowerWeight == "bolder" { #if os(iOS) - fontDesc = fontDesc.withSymbolicTraits(.traitBold)! + if let boldDesc = fontDesc.withSymbolicTraits(.traitBold) { + fontDesc = boldDesc + } #elseif os(OSX) fontDesc = fontDesc.withSymbolicTraits(.bold) #endif diff --git a/Source/svg/SVGParser.swift b/Source/svg/SVGParser.swift index 2b21bd02..26140633 100644 --- a/Source/svg/SVGParser.swift +++ b/Source/svg/SVGParser.swift @@ -156,7 +156,7 @@ open class SVGParser { } if let id = element.allAttributes["id"]?.text { switch element.name { - case "linearGradient", "radialGradient", "fill": + case "linearGradient", "radialGradient", SVGKeys.fill: defFills[id] = try parseFill(node) case "pattern": defPatterns[id] = try parsePattern(node) @@ -316,7 +316,7 @@ open class SVGParser { case "use": return try parseUse(node, groupStyle: style, place: position) case "title", "desc", "mask", "clip", "filter", - "linearGradient", "radialGradient", "fill": + "linearGradient", "radialGradient", SVGKeys.fill: break default: print("SVG parsing error. Shape \(element.name) not supported") @@ -571,9 +571,14 @@ open class SVGParser { } } + let hasCurrentColor = styleAttributes[SVGKeys.fill] == SVGKeys.currentColor + self.availableStyleAttributes.forEach { availableAttribute in if let styleAttribute = element.allAttributes[availableAttribute]?.text, styleAttribute != "inherit" { - styleAttributes.updateValue(styleAttribute, forKey: availableAttribute) + + if !hasCurrentColor || availableAttribute != SVGKeys.color { + styleAttributes.updateValue(styleAttribute, forKey: availableAttribute) + } } } @@ -625,7 +630,7 @@ open class SVGParser { opacity = Double(fillOpacity.replacingOccurrences(of: " ", with: "")) ?? 1 } - guard var fillColor = styleParts["fill"] else { + guard var fillColor = styleParts[SVGKeys.fill] else { return Color.black.with(a: opacity) } if let colorId = parseIdFromUrl(fillColor) { @@ -636,7 +641,7 @@ open class SVGParser { return getPatternFill(pattern: pattern, locus: locus) } } - if fillColor == "currentColor", let currentColor = groupStyle["color"] { + if fillColor == SVGKeys.currentColor, let currentColor = groupStyle[SVGKeys.color] { fillColor = currentColor } @@ -660,7 +665,7 @@ open class SVGParser { guard var strokeColor = styleParts["stroke"] else { return .none } - if strokeColor == "currentColor", let currentColor = groupStyle["color"] { + if strokeColor == SVGKeys.currentColor, let currentColor = groupStyle[SVGKeys.color] { strokeColor = currentColor } var opacity: Double = 1 @@ -997,7 +1002,7 @@ open class SVGParser { let attributes = getStyleAttributes([:], element: element) return Text(text: text, font: getFont(attributes, fontName: fontName, fontWeight: fontWeight, fontSize: fontSize), - fill: (attributes["fill"] != nil) ? getFillColor(attributes)! : fill, stroke: stroke ?? getStroke(attributes), + fill: (attributes[SVGKeys.fill] != nil) ? getFillColor(attributes)! : fill, stroke: stroke ?? getStroke(attributes), align: anchorToAlign(textAnchor ?? getTextAnchor(attributes)), baseline: .alphabetic, place: pos, opacity: getOpacity(attributes), tag: getTag(element)) } @@ -1352,7 +1357,7 @@ open class SVGParser { } var color = Color.black.with(a: opacity) if var stopColor = getStyleAttributes([:], element: element)["stop-color"] { - if stopColor == "currentColor", let currentColor = groupStyle["color"] { + if stopColor == SVGKeys.currentColor, let currentColor = groupStyle[SVGKeys.color] { stopColor = currentColor } color = createColor(stopColor.replacingOccurrences(of: " ", with: ""), opacity: opacity)! @@ -1605,7 +1610,7 @@ private class PathDataReader { } public func read() -> [PathSegment] { - _ = readNext() + readNext() var segments = [PathSegment]() while let array = readSegments() { segments.append(contentsOf: array) @@ -1620,7 +1625,12 @@ private class PathDataReader { return [PathSegment(type: type)] } var result = [PathSegment]() - let data = readData() + let data: [Double] + if type == .a || type == .A { + data = readDataOfASegment() + } else { + data = readData() + } var index = 0 var isFirstSegment = true while index < data.count { @@ -1658,6 +1668,28 @@ private class PathDataReader { } } + private func readDataOfASegment() -> [Double] { + let argCount = getArgCount(segment: .A) + var data: [Double] = [] + var index = 0 + while true { + skipSpaces() + let value: Double? + let indexMod = index % argCount + if indexMod == 3 || indexMod == 4 { + value = readFlag() + } else { + value = readNum() + } + guard let doubleValue = value else { + return data + } + data.append(doubleValue) + index += 1 + } + return data + } + private func skipSpaces() { var ch = current while ch != nil && "\n\r\t ,".contains(String(ch!)) { @@ -1665,21 +1697,42 @@ private class PathDataReader { } } + private func readFlag() -> Double? { + guard let ch = current else { + return .none + } + readNext() + switch ch { + case "0": + return 0 + case "1": + return 1 + default: + return .none + } + } + fileprivate func readNum() -> Double? { guard let ch = current else { - return nil + return .none } - if (ch >= "0" && ch <= "9") || ch == "." || ch == "-" { - var chars = [ch] - var hasDot = ch == "." - while let ch = readDigit(&hasDot) { - chars.append(ch) - } - var buf = "" - buf.unicodeScalars.append(contentsOf: chars) - return Double(buf) + + guard ch >= "0" && ch <= "9" || ch == "." || ch == "-" else { + return .none } - return nil + + var chars = [ch] + var hasDot = ch == "." + while let ch = readDigit(&hasDot) { + chars.append(ch) + } + + var buf = "" + buf.unicodeScalars.append(contentsOf: chars) + guard let value = Double(buf) else { + return .none + } + return value } fileprivate func readDigit(_ hasDot: inout Bool) -> UnicodeScalar? { @@ -1709,6 +1762,7 @@ private class PathDataReader { return false } + @discardableResult private func readNext() -> UnicodeScalar? { previous = current current = iterator.next() @@ -1725,7 +1779,7 @@ private class PathDataReader { private func readSegmentType() -> PathSegmentType? { while true { if let type = getPathSegmentType() { - _ = readNext() + readNext() return type } if readNext() == nil { @@ -1842,3 +1896,9 @@ fileprivate class UserSpacePattern { self.contentUserSpace = contentUserSpace } } + +fileprivate enum SVGKeys { + static let fill = "fill" + static let color = "color" + static let currentColor = "currentColor" +} diff --git a/Source/views/MacawZoom.swift b/Source/views/MacawZoom.swift index 1831593b..1a9532cd 100644 --- a/Source/views/MacawZoom.swift +++ b/Source/views/MacawZoom.swift @@ -81,7 +81,7 @@ open class MacawZoom { } private func getNewZoom() -> ZoomData { - if touches.count == 0 || (touches.count == 1 && !trackMove) { + if touches.isEmpty || (touches.count == 1 && !trackMove) { return zoomData } let s1 = touches[0].point