diff --git a/.gitignore b/.gitignore index 2c2382ee8..ee0d5b251 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,10 @@ xcuserdata profile *.moved-aside build + +# Add this line if you want to avoid checking in source code from Carthage dependencies. +Carthage/Checkouts +Carthage/Build + +#VScode +.vscode diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index bc19b17a7..000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "calayer-exporter"] - path = calayer-exporter - url = git://github.com/reklis/calayer-exporter.git diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..42038f03e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,41 @@ + +language: objective-c +osx_image: xcode9.4 + +env: + global: + - LC_CTYPE=en_US.UTF-8 + - LANG=en_US.UTF-8 + +notifications: + email: false + +before_install: + - env + - locale + - gem install cocoapods --no-rdoc --no-ri --no-document --quiet + - gem install xcpretty --no-rdoc --no-ri --no-document --quiet + - pod --version + - pod setup --silent > /dev/null + - pod repo update --silent + - xcpretty --version + - xcodebuild -version + - xcodebuild -showsdks + +script: + - set -o pipefail + + - echo Check if the library described by the podspec can be built + - pod lib lint --allow-warnings + + - echo Build as static library + - xcodebuild build -project SVGKit-iOS.xcodeproj -scheme 'SVGKit-iOS' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + + - echo Build as dynamic frameworks + - xcodebuild build clean -project SVGKit-iOS.xcodeproj -scheme 'SVGKitFramework-iOS' -sdk iphonesimulator PLATFORM_NAME=iphonesimulator -configuration Debug | xcpretty -c + - xcodebuild build clean -project SVGKit-iOS.xcodeproj -scheme 'SVGKitFramework-tvOS' -sdk appletvsimulator -configuration Debug | xcpretty -c + - xcodebuild build clean -project SVGKit-iOS.xcodeproj -scheme 'SVGKitFramework-OSX' -sdk macosx -configuration Debug | xcpretty -c + + - echo Build the Demo apps + - xcodebuild build -project Demo-iOS.xcodeproj -scheme 'Demo-iOS' -configuration Debug -destination 'name=iPhone 8' | xcpretty -c + - xcodebuild build -project Demo-OSX.xcodeproj -scheme 'Demo-OSX' -sdk macosx -configuration Debug | xcpretty -c diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..af8bedea2 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,32 @@ +# Important info, please read + +## Everyone here is another developer + +...there's no support team. When you create an Issue, it will be seen by the other users of SVGKit. If someone answers, it's because they're a fellow user and they're trying to help. + +Some of them are kind enough to fix things for other developers - but please note they're doing it out of generosity! + +## A short (3 sentence) Issue is often the best + +The Issues that get fastest response / resolved best are often the shortest - but not TOO short. + +Adam wrote an ultra short guide: How to write a good Issue - it's worth a quick read! + +## Pull Requests + +We love Pull Requests. Most get accepted within hours. + +But there's a couple of hard and fast rules, to protect all of us: + +1. A Pull Request MUST be a small, self-contained feature or fix, or a couple of fixes at most. It could stretch over many files, but usually it will be 2-5 files at most. +1. ...because: a Maintainer will *manually check every line of code* in the Pull Request, and make sure it doesn't break anything else +1. If your code breaks other stuff, we'll tell you why and help you to fix it +1. EVERY PULL REQUEST should be first tested using the "Demo-iOS" app (or "Demo-OSX" app) to make sure it works with all our current SVG files +1. If you're fixing a bug, PLEASE CREATE A SIMPLE SVG FILE THAT DEMONSTRATES THE BUG, and then a Maintainer can add it to the Demo app, and use it to "prove" that your fix works. (or you can add it yourself directly, as part of your commit) +1. When you send a Pull Request, you warrant that it's your own code, or that you have permission to donate it to the project (this should be obvious! It's open-source!) + +# Coding Style + +We have very few rules for coding style. But there are a couple of things that affect other programmers: + +1. Don't reformat existing code unless it's VERY badly formatted - it makes it TEN TIMES HARDER for us to check your changes (it will mess up all the diff's) diff --git a/Demo-OSX.xcodeproj/project.pbxproj b/Demo-OSX.xcodeproj/project.pbxproj new file mode 100644 index 000000000..66604a336 --- /dev/null +++ b/Demo-OSX.xcodeproj/project.pbxproj @@ -0,0 +1,1083 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 323C2E29218437C600741D80 /* Mozilla_Firefox_logo_2013.svg in Resources */ = {isa = PBXBuildFile; fileRef = 323C2E28218437C600741D80 /* Mozilla_Firefox_logo_2013.svg */; }; + 32B5A1E4217333C200CAA60C /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32B5A1DD217333C200CAA60C /* CocoaLumberjack.framework */; }; + 32B5A1E6217333C800CAA60C /* CocoaLumberjack.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 32B5A1DD217333C200CAA60C /* CocoaLumberjack.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 32C4FD3A2173976C00FBEDBF /* radialGradientTest.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCF52173976C00FBEDBF /* radialGradientTest.svg */; }; + 32C4FD3B2173976C00FBEDBF /* g-element-applies-rotation.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCF62173976C00FBEDBF /* g-element-applies-rotation.svg */; }; + 32C4FD3C2173976C00FBEDBF /* Blank_Map-Africa.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCF72173976C00FBEDBF /* Blank_Map-Africa.svg */; }; + 32C4FD3D2173976C00FBEDBF /* australia_states_blank.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCF82173976C00FBEDBF /* australia_states_blank.svg */; }; + 32C4FD3E2173976C00FBEDBF /* imageWithASinglePointPath.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCF92173976C00FBEDBF /* imageWithASinglePointPath.svg */; }; + 32C4FD3F2173976C00FBEDBF /* Map.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFA2173976C00FBEDBF /* Map.svg */; }; + 32C4FD402173976C00FBEDBF /* parent-clip.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFB2173976C00FBEDBF /* parent-clip.svg */; }; + 32C4FD412173976C00FBEDBF /* Reinel_compass_rose-simplified-more.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFC2173976C00FBEDBF /* Reinel_compass_rose-simplified-more.svg */; }; + 32C4FD422173976C00FBEDBF /* NewTux.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFD2173976C00FBEDBF /* NewTux.svg */; }; + 32C4FD432173976C00FBEDBF /* Lion.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFE2173976C00FBEDBF /* Lion.svg */; }; + 32C4FD442173976C00FBEDBF /* bird-1382034603Euc-cropped.png in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FCFF2173976C00FBEDBF /* bird-1382034603Euc-cropped.png */; }; + 32C4FD452173976C00FBEDBF /* test-stroke-dash-array.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD002173976C00FBEDBF /* test-stroke-dash-array.svg */; }; + 32C4FD462173976C00FBEDBF /* breaking-1.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD012173976C00FBEDBF /* breaking-1.svg */; }; + 32C4FD472173976C00FBEDBF /* Scale-Negative-Direction.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD022173976C00FBEDBF /* Scale-Negative-Direction.svg */; }; + 32C4FD482173976C00FBEDBF /* RainbowWing.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD032173976C00FBEDBF /* RainbowWing.svg */; }; + 32C4FD492173976C00FBEDBF /* Note.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD042173976C00FBEDBF /* Note.svg */; }; + 32C4FD4A2173976C00FBEDBF /* Reinel_compass_rose-simplified-evenmore.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD052173976C00FBEDBF /* Reinel_compass_rose-simplified-evenmore.svg */; }; + 32C4FD4B2173976C00FBEDBF /* imagetag-layer2-sun.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD062173976C00FBEDBF /* imagetag-layer2-sun.svg */; }; + 32C4FD4C2173976C00FBEDBF /* sakamura-default-fill-opacity-test.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD072173976C00FBEDBF /* sakamura-default-fill-opacity-test.svg */; }; + 32C4FD4D2173976C00FBEDBF /* groups-and-layers-test.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD082173976C00FBEDBF /* groups-and-layers-test.svg */; }; + 32C4FD4E2173976C00FBEDBF /* Europe_states_reduced.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD092173976C00FBEDBF /* Europe_states_reduced.svg */; }; + 32C4FD4F2173976C00FBEDBF /* ImageAspectRatio.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0A2173976C00FBEDBF /* ImageAspectRatio.svg */; }; + 32C4FD502173976C00FBEDBF /* test-wave-1.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0B2173976C00FBEDBF /* test-wave-1.svg */; }; + 32C4FD512173976C00FBEDBF /* Coins.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0C2173976C00FBEDBF /* Coins.svg */; }; + 32C4FD522173976C00FBEDBF /* Text.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0D2173976C00FBEDBF /* Text.svg */; }; + 32C4FD532173976C00FBEDBF /* M-to-S-to-T.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0E2173976C00FBEDBF /* M-to-S-to-T.svg */; }; + 32C4FD542173976C00FBEDBF /* rounded-rects.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD0F2173976C00FBEDBF /* rounded-rects.svg */; }; + 32C4FD552173976C00FBEDBF /* Reinel_compass_rose.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD102173976C00FBEDBF /* Reinel_compass_rose.svg */; }; + 32C4FD562173976C00FBEDBF /* CSS.css in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD112173976C00FBEDBF /* CSS.css */; }; + 32C4FD572173976C00FBEDBF /* radial-gradient-opacity.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD122173976C00FBEDBF /* radial-gradient-opacity.svg */; }; + 32C4FD582173976C00FBEDBF /* CSS.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD132173976C00FBEDBF /* CSS.svg */; }; + 32C4FD592173976C00FBEDBF /* opacity01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD152173976C00FBEDBF /* opacity01.svg */; }; + 32C4FD5A2173976C00FBEDBF /* fillrule-evenodd.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD162173976C00FBEDBF /* fillrule-evenodd.svg */; }; + 32C4FD5B2173976C00FBEDBF /* arcs01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD172173976C00FBEDBF /* arcs01.svg */; }; + 32C4FD5C2173976C00FBEDBF /* arcs02.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD182173976C00FBEDBF /* arcs02.svg */; }; + 32C4FD5D2173976C00FBEDBF /* cubic01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD192173976C00FBEDBF /* cubic01.svg */; }; + 32C4FD5E2173976C00FBEDBF /* PreserveAspectRatio.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1A2173976C00FBEDBF /* PreserveAspectRatio.svg */; }; + 32C4FD5F2173976C00FBEDBF /* lingrad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1B2173976C00FBEDBF /* lingrad01.svg */; }; + 32C4FD602173976C00FBEDBF /* pattern01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1C2173976C00FBEDBF /* pattern01.svg */; }; + 32C4FD612173976C00FBEDBF /* quad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1D2173976C00FBEDBF /* quad01.svg */; }; + 32C4FD622173976C00FBEDBF /* radgrad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1E2173976C00FBEDBF /* radgrad01.svg */; }; + 32C4FD632173976C00FBEDBF /* text01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD1F2173976C00FBEDBF /* text01.svg */; }; + 32C4FD642173976C00FBEDBF /* StyleAttribute.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD202173976C00FBEDBF /* StyleAttribute.svg */; }; + 32C4FD652173976C00FBEDBF /* tspan01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD212173976C00FBEDBF /* tspan01.svg */; }; + 32C4FD662173976C00FBEDBF /* Reinel_compass_rose-simplified-for-testing.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD222173976C00FBEDBF /* Reinel_compass_rose-simplified-for-testing.svg */; }; + 32C4FD672173976C00FBEDBF /* svg-with-explicit-width-large.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD232173976C00FBEDBF /* svg-with-explicit-width-large.svg */; }; + 32C4FD682173976C00FBEDBF /* MathCurve-optimized.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD242173976C00FBEDBF /* MathCurve-optimized.svg */; }; + 32C4FD692173976C00FBEDBF /* uk-only.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD252173976C00FBEDBF /* uk-only.svg */; }; + 32C4FD6A2173976C00FBEDBF /* Monkey.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD262173976C00FBEDBF /* Monkey.svg */; }; + 32C4FD6B2173976C00FBEDBF /* Snowman.png in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD272173976C00FBEDBF /* Snowman.png */; }; + 32C4FD6C2173976C00FBEDBF /* imagetag-layered.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD282173976C00FBEDBF /* imagetag-layered.svg */; }; + 32C4FD6D2173976C00FBEDBF /* map-alaska-onlysimple.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD292173976C00FBEDBF /* map-alaska-onlysimple.svg */; }; + 32C4FD6E2173976C00FBEDBF /* Cycling_Lambie.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD2A2173976C00FBEDBF /* Cycling_Lambie.svg */; }; + 32C4FD6F2173976C00FBEDBF /* CurvedDiamond.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD2B2173976C00FBEDBF /* CurvedDiamond.svg */; }; + 32C4FD702173976C00FBEDBF /* Location_European_nation_states.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD2C2173976C00FBEDBF /* Location_European_nation_states.svg */; }; + 32C4FD712173976C00FBEDBF /* strokes.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD2E2173976C00FBEDBF /* strokes.svg */; }; + 32C4FD722173976C00FBEDBF /* shapes.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD2F2173976C00FBEDBF /* shapes.svg */; }; + 32C4FD732173976C00FBEDBF /* transformations.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD302173976C00FBEDBF /* transformations.svg */; }; + 32C4FD742173976C00FBEDBF /* Sample Licenses from svg-android project.txt in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD312173976C00FBEDBF /* Sample Licenses from svg-android project.txt */; }; + 32C4FD752173976C00FBEDBF /* gradients.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD322173976C00FBEDBF /* gradients.svg */; }; + 32C4FD762173976C00FBEDBF /* svg-with-explicit-width.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD332173976C00FBEDBF /* svg-with-explicit-width.svg */; }; + 32C4FD772173976C00FBEDBF /* bike-frame.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD342173976C00FBEDBF /* bike-frame.svg */; }; + 32C4FD782173976C00FBEDBF /* Coin.png in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD352173976C00FBEDBF /* Coin.png */; }; + 32C4FD792173976C00FBEDBF /* BlankMap-World6-Equirectangular.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD362173976C00FBEDBF /* BlankMap-World6-Equirectangular.svg */; }; + 32C4FD7A2173976C00FBEDBF /* rotated-and-skewed-text.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD372173976C00FBEDBF /* rotated-and-skewed-text.svg */; }; + 32C4FD7B2173976C00FBEDBF /* voies.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD382173976C00FBEDBF /* voies.svg */; }; + 32C4FD7C2173976C00FBEDBF /* heart.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32C4FD392173976C00FBEDBF /* heart.svg */; }; + 32EE37912173433B00A23278 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32EE37902173431300A23278 /* SVGKit.framework */; }; + 32EE37922173434B00A23278 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 32EE37902173431300A23278 /* SVGKit.framework */; }; + 32EE37932173434B00A23278 /* SVGKit.framework in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 32EE37902173431300A23278 /* SVGKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 55018B4C1B24E95700936DF7 /* Licenses.plist in Resources */ = {isa = PBXBuildFile; fileRef = 55018B4B1B24E95700936DF7 /* Licenses.plist */; }; + 55D8EE2817628A71009C25F1 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 55D8EE2717628A71009C25F1 /* Cocoa.framework */; }; + 55D8EE3217628A71009C25F1 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 55D8EE3017628A71009C25F1 /* InfoPlist.strings */; }; + 55D8EE3417628A71009C25F1 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 55D8EE3317628A71009C25F1 /* main.m */; }; + 55D8EE3B17628A71009C25F1 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 55D8EE3A17628A71009C25F1 /* AppDelegate.m */; }; + 55D8EE3E17628A71009C25F1 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 55D8EE3C17628A71009C25F1 /* MainMenu.xib */; }; + 55D8EE4F17628FBC009C25F1 /* DemoSVGObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 55D8EE4E17628FBC009C25F1 /* DemoSVGObject.m */; }; + E0060539218BEBF300FC58FE /* shapes2.svg in Resources */ = {isa = PBXBuildFile; fileRef = E0060531218BEBF300FC58FE /* shapes2.svg */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 327B288A217DA6D2004D27FC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 32A1F09C21746F4700ABFCE1; + remoteInfo = "SVGKitFramework-OSXTests"; + }; + 32EE37832173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 6639618E16145D0400E58CCA; + remoteInfo = "SVGKit-iOS"; + }; + 32EE37852173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 55452BF119EC68A200B75A30; + remoteInfo = "SVGKit-iOS Tests"; + }; + 32EE37872173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAAF1BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOS"; + }; + 32EE37892173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAB81BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOSTests"; + }; + 32EE378B2173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAD31BDA4D38003C1C12; + remoteInfo = "SVGKitFramework-tvOS"; + }; + 32EE378D2173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDADC1BDA4D38003C1C12; + remoteInfo = "SVGKitFramework-tvOSTests"; + }; + 32EE378F2173431300A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 321EAA622171EC8700640504; + remoteInfo = "SVGKitFramework-OSX"; + }; + 32EE37942173434B00A23278 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 321EAA612171EC8700640504; + remoteInfo = "SVGKitFramework-OSX"; + }; + 55018B271B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = DCB3185114EB418E001CFBEE; + remoteInfo = CocoaLumberjack; + }; + 55018B291B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BF0F1A81D8B700692297; + remoteInfo = CocoaLumberjackSwift; + }; + 55018B2B1B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BFA71A81DF5600692297; + remoteInfo = "CocoaLumberjack-iOS"; + }; + 55018B2D1B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BFC21A81DFA200692297; + remoteInfo = "CocoaLumberjackSwift-iOS"; + }; + 55018B2F1B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BFD71A81E06E00692297; + remoteInfo = "CocoaLumberjack-iOS-Static"; + }; + 55018B311B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = DCB318CA14ED6C3B001CFBEE; + remoteInfo = FmwkTest; + }; + 55018B331B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 55CCBEFF19BA679200957A39; + remoteInfo = SwiftTest; + }; + 55018B351B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BF5F1A81DD2E00692297; + remoteInfo = iOSSwiftTest; + }; + 55018B371B24E7F800936DF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 18F3BFF21A81E0C700692297; + remoteInfo = iOSLibStaticTest; + }; + 5529EC381DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19190EDE1B84D812008D059E; + remoteInfo = "CocoaLumberjack-watchOS"; + }; + 5529EC3A1DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19190EEB1B84D826008D059E; + remoteInfo = "CocoaLumberjackSwift-watchOS"; + }; + 5529EC3C1DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19D90B261BBFA9DB00947169; + remoteInfo = "CocoaLumberjack-tvOS"; + }; + 5529EC3E1DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19D90B351BBFAA7500947169; + remoteInfo = "CocoaLumberjackSwift-tvOS"; + }; + 5529EC401DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19EC14671B84D134000EC2E7; + remoteInfo = watchOSSwiftTest; + }; + 5529EC421DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19EC14731B84D134000EC2E7; + remoteInfo = "watchOSSwiftTest Extension"; + }; + 5529EC441DA85C66006A9210 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 19406BE11BDBABFF001194DC; + remoteInfo = tvOSSwiftTest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 55D8EEA1176296F3009C25F1 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 32EE37932173434B00A23278 /* SVGKit.framework in Copy Frameworks */, + 32B5A1E6217333C800CAA60C /* CocoaLumberjack.framework in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 323C2E28218437C600741D80 /* Mozilla_Firefox_logo_2013.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Mozilla_Firefox_logo_2013.svg; sourceTree = ""; }; + 32B5A1DD217333C200CAA60C /* CocoaLumberjack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaLumberjack.framework; path = "3rd-party-frameworks/CocoaLumberjack-2.2.0/Mac/CocoaLumberjack.framework"; sourceTree = ""; }; + 32C4FCF52173976C00FBEDBF /* radialGradientTest.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = radialGradientTest.svg; sourceTree = ""; }; + 32C4FCF62173976C00FBEDBF /* g-element-applies-rotation.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "g-element-applies-rotation.svg"; sourceTree = ""; }; + 32C4FCF72173976C00FBEDBF /* Blank_Map-Africa.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Blank_Map-Africa.svg"; sourceTree = ""; }; + 32C4FCF82173976C00FBEDBF /* australia_states_blank.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = australia_states_blank.svg; sourceTree = ""; }; + 32C4FCF92173976C00FBEDBF /* imageWithASinglePointPath.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = imageWithASinglePointPath.svg; sourceTree = ""; }; + 32C4FCFA2173976C00FBEDBF /* Map.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Map.svg; sourceTree = ""; }; + 32C4FCFB2173976C00FBEDBF /* parent-clip.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "parent-clip.svg"; sourceTree = ""; }; + 32C4FCFC2173976C00FBEDBF /* Reinel_compass_rose-simplified-more.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-more.svg"; sourceTree = ""; }; + 32C4FCFD2173976C00FBEDBF /* NewTux.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = NewTux.svg; sourceTree = ""; }; + 32C4FCFE2173976C00FBEDBF /* Lion.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Lion.svg; sourceTree = ""; }; + 32C4FCFF2173976C00FBEDBF /* bird-1382034603Euc-cropped.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bird-1382034603Euc-cropped.png"; sourceTree = ""; }; + 32C4FD002173976C00FBEDBF /* test-stroke-dash-array.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "test-stroke-dash-array.svg"; sourceTree = ""; }; + 32C4FD012173976C00FBEDBF /* breaking-1.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "breaking-1.svg"; sourceTree = ""; }; + 32C4FD022173976C00FBEDBF /* Scale-Negative-Direction.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Scale-Negative-Direction.svg"; sourceTree = ""; }; + 32C4FD032173976C00FBEDBF /* RainbowWing.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = RainbowWing.svg; sourceTree = ""; }; + 32C4FD042173976C00FBEDBF /* Note.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Note.svg; sourceTree = ""; }; + 32C4FD052173976C00FBEDBF /* Reinel_compass_rose-simplified-evenmore.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-evenmore.svg"; sourceTree = ""; }; + 32C4FD062173976C00FBEDBF /* imagetag-layer2-sun.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "imagetag-layer2-sun.svg"; sourceTree = ""; }; + 32C4FD072173976C00FBEDBF /* sakamura-default-fill-opacity-test.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "sakamura-default-fill-opacity-test.svg"; sourceTree = ""; }; + 32C4FD082173976C00FBEDBF /* groups-and-layers-test.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "groups-and-layers-test.svg"; sourceTree = ""; }; + 32C4FD092173976C00FBEDBF /* Europe_states_reduced.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Europe_states_reduced.svg; sourceTree = ""; }; + 32C4FD0A2173976C00FBEDBF /* ImageAspectRatio.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ImageAspectRatio.svg; sourceTree = ""; }; + 32C4FD0B2173976C00FBEDBF /* test-wave-1.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "test-wave-1.svg"; sourceTree = ""; }; + 32C4FD0C2173976C00FBEDBF /* Coins.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Coins.svg; sourceTree = ""; }; + 32C4FD0D2173976C00FBEDBF /* Text.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Text.svg; sourceTree = ""; }; + 32C4FD0E2173976C00FBEDBF /* M-to-S-to-T.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "M-to-S-to-T.svg"; sourceTree = ""; }; + 32C4FD0F2173976C00FBEDBF /* rounded-rects.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "rounded-rects.svg"; sourceTree = ""; }; + 32C4FD102173976C00FBEDBF /* Reinel_compass_rose.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Reinel_compass_rose.svg; sourceTree = ""; }; + 32C4FD112173976C00FBEDBF /* CSS.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = CSS.css; sourceTree = ""; }; + 32C4FD122173976C00FBEDBF /* radial-gradient-opacity.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "radial-gradient-opacity.svg"; sourceTree = ""; }; + 32C4FD132173976C00FBEDBF /* CSS.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = CSS.svg; sourceTree = ""; }; + 32C4FD152173976C00FBEDBF /* opacity01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = opacity01.svg; sourceTree = ""; }; + 32C4FD162173976C00FBEDBF /* fillrule-evenodd.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "fillrule-evenodd.svg"; sourceTree = ""; }; + 32C4FD172173976C00FBEDBF /* arcs01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = arcs01.svg; sourceTree = ""; }; + 32C4FD182173976C00FBEDBF /* arcs02.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = arcs02.svg; sourceTree = ""; }; + 32C4FD192173976C00FBEDBF /* cubic01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubic01.svg; sourceTree = ""; }; + 32C4FD1A2173976C00FBEDBF /* PreserveAspectRatio.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PreserveAspectRatio.svg; sourceTree = ""; }; + 32C4FD1B2173976C00FBEDBF /* lingrad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = lingrad01.svg; sourceTree = ""; }; + 32C4FD1C2173976C00FBEDBF /* pattern01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = pattern01.svg; sourceTree = ""; }; + 32C4FD1D2173976C00FBEDBF /* quad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = quad01.svg; sourceTree = ""; }; + 32C4FD1E2173976C00FBEDBF /* radgrad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = radgrad01.svg; sourceTree = ""; }; + 32C4FD1F2173976C00FBEDBF /* text01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = text01.svg; sourceTree = ""; }; + 32C4FD202173976C00FBEDBF /* StyleAttribute.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = StyleAttribute.svg; sourceTree = ""; }; + 32C4FD212173976C00FBEDBF /* tspan01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tspan01.svg; sourceTree = ""; }; + 32C4FD222173976C00FBEDBF /* Reinel_compass_rose-simplified-for-testing.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-for-testing.svg"; sourceTree = ""; }; + 32C4FD232173976C00FBEDBF /* svg-with-explicit-width-large.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "svg-with-explicit-width-large.svg"; sourceTree = ""; }; + 32C4FD242173976C00FBEDBF /* MathCurve-optimized.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "MathCurve-optimized.svg"; sourceTree = ""; }; + 32C4FD252173976C00FBEDBF /* uk-only.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "uk-only.svg"; sourceTree = ""; }; + 32C4FD262173976C00FBEDBF /* Monkey.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Monkey.svg; sourceTree = ""; }; + 32C4FD272173976C00FBEDBF /* Snowman.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Snowman.png; sourceTree = ""; }; + 32C4FD282173976C00FBEDBF /* imagetag-layered.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "imagetag-layered.svg"; sourceTree = ""; }; + 32C4FD292173976C00FBEDBF /* map-alaska-onlysimple.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "map-alaska-onlysimple.svg"; sourceTree = ""; }; + 32C4FD2A2173976C00FBEDBF /* Cycling_Lambie.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Cycling_Lambie.svg; sourceTree = ""; }; + 32C4FD2B2173976C00FBEDBF /* CurvedDiamond.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = CurvedDiamond.svg; sourceTree = ""; }; + 32C4FD2C2173976C00FBEDBF /* Location_European_nation_states.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Location_European_nation_states.svg; sourceTree = ""; }; + 32C4FD2E2173976C00FBEDBF /* strokes.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = strokes.svg; sourceTree = ""; }; + 32C4FD2F2173976C00FBEDBF /* shapes.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = shapes.svg; sourceTree = ""; }; + 32C4FD302173976C00FBEDBF /* transformations.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = transformations.svg; sourceTree = ""; }; + 32C4FD312173976C00FBEDBF /* Sample Licenses from svg-android project.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Sample Licenses from svg-android project.txt"; sourceTree = ""; }; + 32C4FD322173976C00FBEDBF /* gradients.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gradients.svg; sourceTree = ""; }; + 32C4FD332173976C00FBEDBF /* svg-with-explicit-width.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "svg-with-explicit-width.svg"; sourceTree = ""; }; + 32C4FD342173976C00FBEDBF /* bike-frame.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "bike-frame.svg"; sourceTree = ""; }; + 32C4FD352173976C00FBEDBF /* Coin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Coin.png; sourceTree = ""; }; + 32C4FD362173976C00FBEDBF /* BlankMap-World6-Equirectangular.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "BlankMap-World6-Equirectangular.svg"; sourceTree = ""; }; + 32C4FD372173976C00FBEDBF /* rotated-and-skewed-text.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "rotated-and-skewed-text.svg"; sourceTree = ""; }; + 32C4FD382173976C00FBEDBF /* voies.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = voies.svg; sourceTree = ""; }; + 32C4FD392173976C00FBEDBF /* heart.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = heart.svg; sourceTree = ""; }; + 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = "SVGKit-iOS.xcodeproj"; sourceTree = ""; }; + 55018B4B1B24E95700936DF7 /* Licenses.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Licenses.plist; path = "Demo-Samples/Licenses.plist"; sourceTree = SOURCE_ROOT; }; + 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lumberjack.xcodeproj; path = Source/Vendor/CocoaLumberjack/Lumberjack.xcodeproj; sourceTree = ""; }; + 55C362CA1782208700BA24FA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + 55D8EE2417628A71009C25F1 /* Demo-OSX.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Demo-OSX.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 55D8EE2717628A71009C25F1 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 55D8EE2A17628A71009C25F1 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; }; + 55D8EE2B17628A71009C25F1 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 55D8EE2C17628A71009C25F1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 55D8EE2F17628A71009C25F1 /* Demo-OSX-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Demo-OSX-Info.plist"; sourceTree = ""; }; + 55D8EE3117628A71009C25F1 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + 55D8EE3317628A71009C25F1 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 55D8EE3517628A71009C25F1 /* Demo-OSX-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Demo-OSX-Prefix.pch"; sourceTree = ""; }; + 55D8EE3917628A71009C25F1 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = AppDelegate.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 55D8EE3A17628A71009C25F1 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 55D8EE3D17628A71009C25F1 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/MainMenu.xib; sourceTree = ""; }; + 55D8EE4D17628FBC009C25F1 /* DemoSVGObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DemoSVGObject.h; sourceTree = ""; }; + 55D8EE4E17628FBC009C25F1 /* DemoSVGObject.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DemoSVGObject.m; sourceTree = ""; }; + E0060531218BEBF300FC58FE /* shapes2.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = shapes2.svg; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 55D8EE2117628A71009C25F1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 32EE37922173434B00A23278 /* SVGKit.framework in Frameworks */, + 32EE37912173433B00A23278 /* SVGKit.framework in Frameworks */, + 32B5A1E4217333C200CAA60C /* CocoaLumberjack.framework in Frameworks */, + 55D8EE2817628A71009C25F1 /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 32C4FCF42173976B00FBEDBF /* SVG */ = { + isa = PBXGroup; + children = ( + 323C2E28218437C600741D80 /* Mozilla_Firefox_logo_2013.svg */, + 32C4FCF52173976C00FBEDBF /* radialGradientTest.svg */, + 32C4FCF62173976C00FBEDBF /* g-element-applies-rotation.svg */, + 32C4FCF72173976C00FBEDBF /* Blank_Map-Africa.svg */, + 32C4FCF82173976C00FBEDBF /* australia_states_blank.svg */, + 32C4FCF92173976C00FBEDBF /* imageWithASinglePointPath.svg */, + 32C4FCFA2173976C00FBEDBF /* Map.svg */, + 32C4FCFB2173976C00FBEDBF /* parent-clip.svg */, + 32C4FCFC2173976C00FBEDBF /* Reinel_compass_rose-simplified-more.svg */, + 32C4FCFD2173976C00FBEDBF /* NewTux.svg */, + 32C4FCFE2173976C00FBEDBF /* Lion.svg */, + 32C4FCFF2173976C00FBEDBF /* bird-1382034603Euc-cropped.png */, + 32C4FD002173976C00FBEDBF /* test-stroke-dash-array.svg */, + 32C4FD012173976C00FBEDBF /* breaking-1.svg */, + 32C4FD022173976C00FBEDBF /* Scale-Negative-Direction.svg */, + 32C4FD032173976C00FBEDBF /* RainbowWing.svg */, + 32C4FD042173976C00FBEDBF /* Note.svg */, + 32C4FD052173976C00FBEDBF /* Reinel_compass_rose-simplified-evenmore.svg */, + 32C4FD062173976C00FBEDBF /* imagetag-layer2-sun.svg */, + 32C4FD072173976C00FBEDBF /* sakamura-default-fill-opacity-test.svg */, + 32C4FD082173976C00FBEDBF /* groups-and-layers-test.svg */, + 32C4FD092173976C00FBEDBF /* Europe_states_reduced.svg */, + 32C4FD0A2173976C00FBEDBF /* ImageAspectRatio.svg */, + 32C4FD0B2173976C00FBEDBF /* test-wave-1.svg */, + 32C4FD0C2173976C00FBEDBF /* Coins.svg */, + 32C4FD0D2173976C00FBEDBF /* Text.svg */, + 32C4FD0E2173976C00FBEDBF /* M-to-S-to-T.svg */, + 32C4FD0F2173976C00FBEDBF /* rounded-rects.svg */, + 32C4FD102173976C00FBEDBF /* Reinel_compass_rose.svg */, + 32C4FD112173976C00FBEDBF /* CSS.css */, + 32C4FD122173976C00FBEDBF /* radial-gradient-opacity.svg */, + 32C4FD132173976C00FBEDBF /* CSS.svg */, + 32C4FD142173976C00FBEDBF /* www.w3.org-TR-SVG */, + 32C4FD222173976C00FBEDBF /* Reinel_compass_rose-simplified-for-testing.svg */, + 32C4FD232173976C00FBEDBF /* svg-with-explicit-width-large.svg */, + 32C4FD242173976C00FBEDBF /* MathCurve-optimized.svg */, + 32C4FD252173976C00FBEDBF /* uk-only.svg */, + 32C4FD262173976C00FBEDBF /* Monkey.svg */, + 32C4FD272173976C00FBEDBF /* Snowman.png */, + 32C4FD282173976C00FBEDBF /* imagetag-layered.svg */, + 32C4FD292173976C00FBEDBF /* map-alaska-onlysimple.svg */, + 32C4FD2A2173976C00FBEDBF /* Cycling_Lambie.svg */, + 32C4FD2B2173976C00FBEDBF /* CurvedDiamond.svg */, + 32C4FD2C2173976C00FBEDBF /* Location_European_nation_states.svg */, + 32C4FD2D2173976C00FBEDBF /* apache-licensed-from-svg-android */, + 32C4FD332173976C00FBEDBF /* svg-with-explicit-width.svg */, + 32C4FD342173976C00FBEDBF /* bike-frame.svg */, + 32C4FD352173976C00FBEDBF /* Coin.png */, + 32C4FD362173976C00FBEDBF /* BlankMap-World6-Equirectangular.svg */, + 32C4FD372173976C00FBEDBF /* rotated-and-skewed-text.svg */, + 32C4FD382173976C00FBEDBF /* voies.svg */, + 32C4FD392173976C00FBEDBF /* heart.svg */, + ); + name = SVG; + path = "Demo-Samples/SVG"; + sourceTree = ""; + }; + 32C4FD142173976C00FBEDBF /* www.w3.org-TR-SVG */ = { + isa = PBXGroup; + children = ( + 32C4FD152173976C00FBEDBF /* opacity01.svg */, + 32C4FD162173976C00FBEDBF /* fillrule-evenodd.svg */, + 32C4FD172173976C00FBEDBF /* arcs01.svg */, + 32C4FD182173976C00FBEDBF /* arcs02.svg */, + 32C4FD192173976C00FBEDBF /* cubic01.svg */, + 32C4FD1A2173976C00FBEDBF /* PreserveAspectRatio.svg */, + 32C4FD1B2173976C00FBEDBF /* lingrad01.svg */, + 32C4FD1C2173976C00FBEDBF /* pattern01.svg */, + 32C4FD1D2173976C00FBEDBF /* quad01.svg */, + 32C4FD1E2173976C00FBEDBF /* radgrad01.svg */, + 32C4FD1F2173976C00FBEDBF /* text01.svg */, + 32C4FD202173976C00FBEDBF /* StyleAttribute.svg */, + 32C4FD212173976C00FBEDBF /* tspan01.svg */, + ); + path = "www.w3.org-TR-SVG"; + sourceTree = ""; + }; + 32C4FD2D2173976C00FBEDBF /* apache-licensed-from-svg-android */ = { + isa = PBXGroup; + children = ( + 32C4FD2E2173976C00FBEDBF /* strokes.svg */, + 32C4FD2F2173976C00FBEDBF /* shapes.svg */, + E0060531218BEBF300FC58FE /* shapes2.svg */, + 32C4FD302173976C00FBEDBF /* transformations.svg */, + 32C4FD312173976C00FBEDBF /* Sample Licenses from svg-android project.txt */, + 32C4FD322173976C00FBEDBF /* gradients.svg */, + ); + path = "apache-licensed-from-svg-android"; + sourceTree = ""; + }; + 32EE377A2173431300A23278 /* Products */ = { + isa = PBXGroup; + children = ( + 32EE37842173431300A23278 /* libSVGKit-iOS.2.0.0.a */, + 32EE37862173431300A23278 /* SVGKit-iOS Tests.xctest */, + 32EE37882173431300A23278 /* SVGKit.framework */, + 32EE378A2173431300A23278 /* SVGKitFramework-iOSTests.xctest */, + 32EE378C2173431300A23278 /* SVGKit.framework */, + 32EE378E2173431300A23278 /* SVGKitFramework-tvOSTests.xctest */, + 32EE37902173431300A23278 /* SVGKit.framework */, + 327B288B217DA6D2004D27FC /* SVGKitFramework-OSXTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 55018B1B1B24E7F700936DF7 /* Products */ = { + isa = PBXGroup; + children = ( + 55018B281B24E7F800936DF7 /* CocoaLumberjack.framework */, + 55018B2A1B24E7F800936DF7 /* CocoaLumberjackSwift.framework */, + 55018B2C1B24E7F800936DF7 /* CocoaLumberjack.framework */, + 55018B2E1B24E7F800936DF7 /* CocoaLumberjackSwift.framework */, + 55018B301B24E7F800936DF7 /* libCocoaLumberjack.a */, + 5529EC391DA85C66006A9210 /* CocoaLumberjack.framework */, + 5529EC3B1DA85C66006A9210 /* CocoaLumberjackSwift.framework */, + 5529EC3D1DA85C66006A9210 /* CocoaLumberjack.framework */, + 5529EC3F1DA85C66006A9210 /* CocoaLumberjackSwift.framework */, + 55018B321B24E7F800936DF7 /* FmwkTest.app */, + 55018B341B24E7F800936DF7 /* SwiftTest.app */, + 55018B361B24E7F800936DF7 /* iOSSwiftTest.app */, + 5529EC411DA85C66006A9210 /* watchOSSwiftTest.app */, + 5529EC431DA85C66006A9210 /* watchOSSwiftTest Extension.appex */, + 5529EC451DA85C66006A9210 /* tvOSSwiftTest.app */, + 55018B381B24E7F800936DF7 /* iOSLibStaticTest.app */, + ); + name = Products; + sourceTree = ""; + }; + 55D8EE1B17628A71009C25F1 = { + isa = PBXGroup; + children = ( + 32C4FCF42173976B00FBEDBF /* SVG */, + 55D8EE2D17628A71009C25F1 /* Demo-OSX */, + 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */, + 55D8EE2617628A71009C25F1 /* Frameworks */, + 55D8EE2517628A71009C25F1 /* Products */, + ); + sourceTree = ""; + usesTabs = 1; + }; + 55D8EE2517628A71009C25F1 /* Products */ = { + isa = PBXGroup; + children = ( + 55D8EE2417628A71009C25F1 /* Demo-OSX.app */, + ); + name = Products; + sourceTree = ""; + }; + 55D8EE2617628A71009C25F1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 32B5A1DD217333C200CAA60C /* CocoaLumberjack.framework */, + 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */, + 55C362CA1782208700BA24FA /* QuartzCore.framework */, + 55D8EE2717628A71009C25F1 /* Cocoa.framework */, + 55D8EE2917628A71009C25F1 /* Other Frameworks */, + ); + name = Frameworks; + sourceTree = ""; + }; + 55D8EE2917628A71009C25F1 /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 55D8EE2A17628A71009C25F1 /* AppKit.framework */, + 55D8EE2B17628A71009C25F1 /* CoreData.framework */, + 55D8EE2C17628A71009C25F1 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 55D8EE2D17628A71009C25F1 /* Demo-OSX */ = { + isa = PBXGroup; + children = ( + 55D8EE3917628A71009C25F1 /* AppDelegate.h */, + 55D8EE3A17628A71009C25F1 /* AppDelegate.m */, + 55D8EE3C17628A71009C25F1 /* MainMenu.xib */, + 55D8EE4D17628FBC009C25F1 /* DemoSVGObject.h */, + 55D8EE4E17628FBC009C25F1 /* DemoSVGObject.m */, + 55D8EE2E17628A71009C25F1 /* Supporting Files */, + ); + name = "Demo-OSX"; + path = "SVGKitLibrary/Demo-OSX"; + sourceTree = ""; + }; + 55D8EE2E17628A71009C25F1 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 55018B4B1B24E95700936DF7 /* Licenses.plist */, + 55D8EE2F17628A71009C25F1 /* Demo-OSX-Info.plist */, + 55D8EE3017628A71009C25F1 /* InfoPlist.strings */, + 55D8EE3317628A71009C25F1 /* main.m */, + 55D8EE3517628A71009C25F1 /* Demo-OSX-Prefix.pch */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 55D8EE2317628A71009C25F1 /* Demo-OSX */ = { + isa = PBXNativeTarget; + buildConfigurationList = 55D8EE4117628A71009C25F1 /* Build configuration list for PBXNativeTarget "Demo-OSX" */; + buildPhases = ( + 55D8EE2017628A71009C25F1 /* Sources */, + 55D8EE2117628A71009C25F1 /* Frameworks */, + 55D8EE2217628A71009C25F1 /* Resources */, + 55D8EEA1176296F3009C25F1 /* Copy Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 32EE37952173434B00A23278 /* PBXTargetDependency */, + ); + name = "Demo-OSX"; + productName = "Demo-OSX"; + productReference = 55D8EE2417628A71009C25F1 /* Demo-OSX.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 55D8EE1C17628A71009C25F1 /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = SK; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 1000; + ORGANIZATIONNAME = "C.W. Betts"; + }; + buildConfigurationList = 55D8EE1F17628A71009C25F1 /* Build configuration list for PBXProject "Demo-OSX" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 55D8EE1B17628A71009C25F1; + productRefGroup = 55D8EE2517628A71009C25F1 /* Products */; + projectDirPath = ""; + projectReferences = ( + { + ProductGroup = 55018B1B1B24E7F700936DF7 /* Products */; + ProjectRef = 556427B71A4B9E5D006A7269 /* Lumberjack.xcodeproj */; + }, + { + ProductGroup = 32EE377A2173431300A23278 /* Products */; + ProjectRef = 32EE37792173431300A23278 /* SVGKit-iOS.xcodeproj */; + }, + ); + projectRoot = ""; + targets = ( + 55D8EE2317628A71009C25F1 /* Demo-OSX */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXReferenceProxy section */ + 327B288B217DA6D2004D27FC /* SVGKitFramework-OSXTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-OSXTests.xctest"; + remoteRef = 327B288A217DA6D2004D27FC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE37842173431300A23278 /* libSVGKit-iOS.2.0.0.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = "libSVGKit-iOS.2.0.0.a"; + remoteRef = 32EE37832173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE37862173431300A23278 /* SVGKit-iOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKit-iOS Tests.xctest"; + remoteRef = 32EE37852173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE37882173431300A23278 /* SVGKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 32EE37872173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE378A2173431300A23278 /* SVGKitFramework-iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-iOSTests.xctest"; + remoteRef = 32EE37892173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE378C2173431300A23278 /* SVGKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 32EE378B2173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE378E2173431300A23278 /* SVGKitFramework-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-tvOSTests.xctest"; + remoteRef = 32EE378D2173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32EE37902173431300A23278 /* SVGKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 32EE378F2173431300A23278 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B281B24E7F800936DF7 /* CocoaLumberjack.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjack.framework; + remoteRef = 55018B271B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B2A1B24E7F800936DF7 /* CocoaLumberjackSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjackSwift.framework; + remoteRef = 55018B291B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B2C1B24E7F800936DF7 /* CocoaLumberjack.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjack.framework; + remoteRef = 55018B2B1B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B2E1B24E7F800936DF7 /* CocoaLumberjackSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjackSwift.framework; + remoteRef = 55018B2D1B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B301B24E7F800936DF7 /* libCocoaLumberjack.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libCocoaLumberjack.a; + remoteRef = 55018B2F1B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B321B24E7F800936DF7 /* FmwkTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = FmwkTest.app; + remoteRef = 55018B311B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B341B24E7F800936DF7 /* SwiftTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = SwiftTest.app; + remoteRef = 55018B331B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B361B24E7F800936DF7 /* iOSSwiftTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = iOSSwiftTest.app; + remoteRef = 55018B351B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 55018B381B24E7F800936DF7 /* iOSLibStaticTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = iOSLibStaticTest.app; + remoteRef = 55018B371B24E7F800936DF7 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC391DA85C66006A9210 /* CocoaLumberjack.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjack.framework; + remoteRef = 5529EC381DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC3B1DA85C66006A9210 /* CocoaLumberjackSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjackSwift.framework; + remoteRef = 5529EC3A1DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC3D1DA85C66006A9210 /* CocoaLumberjack.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjack.framework; + remoteRef = 5529EC3C1DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC3F1DA85C66006A9210 /* CocoaLumberjackSwift.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = CocoaLumberjackSwift.framework; + remoteRef = 5529EC3E1DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC411DA85C66006A9210 /* watchOSSwiftTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = watchOSSwiftTest.app; + remoteRef = 5529EC401DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC431DA85C66006A9210 /* watchOSSwiftTest Extension.appex */ = { + isa = PBXReferenceProxy; + fileType = "wrapper.app-extension"; + path = "watchOSSwiftTest Extension.appex"; + remoteRef = 5529EC421DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 5529EC451DA85C66006A9210 /* tvOSSwiftTest.app */ = { + isa = PBXReferenceProxy; + fileType = wrapper.application; + path = tvOSSwiftTest.app; + remoteRef = 5529EC441DA85C66006A9210 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; +/* End PBXReferenceProxy section */ + +/* Begin PBXResourcesBuildPhase section */ + 55D8EE2217628A71009C25F1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 32C4FD652173976C00FBEDBF /* tspan01.svg in Resources */, + 32C4FD5D2173976C00FBEDBF /* cubic01.svg in Resources */, + 32C4FD3D2173976C00FBEDBF /* australia_states_blank.svg in Resources */, + 32C4FD592173976C00FBEDBF /* opacity01.svg in Resources */, + 32C4FD552173976C00FBEDBF /* Reinel_compass_rose.svg in Resources */, + 32C4FD3B2173976C00FBEDBF /* g-element-applies-rotation.svg in Resources */, + 32C4FD7A2173976C00FBEDBF /* rotated-and-skewed-text.svg in Resources */, + 55D8EE3217628A71009C25F1 /* InfoPlist.strings in Resources */, + 32C4FD602173976C00FBEDBF /* pattern01.svg in Resources */, + 32C4FD5C2173976C00FBEDBF /* arcs02.svg in Resources */, + 32C4FD5F2173976C00FBEDBF /* lingrad01.svg in Resources */, + 32C4FD402173976C00FBEDBF /* parent-clip.svg in Resources */, + 32C4FD6B2173976C00FBEDBF /* Snowman.png in Resources */, + 32C4FD752173976C00FBEDBF /* gradients.svg in Resources */, + 32C4FD642173976C00FBEDBF /* StyleAttribute.svg in Resources */, + 32C4FD672173976C00FBEDBF /* svg-with-explicit-width-large.svg in Resources */, + 32C4FD5B2173976C00FBEDBF /* arcs01.svg in Resources */, + 32C4FD732173976C00FBEDBF /* transformations.svg in Resources */, + 32C4FD482173976C00FBEDBF /* RainbowWing.svg in Resources */, + 32C4FD782173976C00FBEDBF /* Coin.png in Resources */, + 32C4FD6A2173976C00FBEDBF /* Monkey.svg in Resources */, + 32C4FD662173976C00FBEDBF /* Reinel_compass_rose-simplified-for-testing.svg in Resources */, + 323C2E29218437C600741D80 /* Mozilla_Firefox_logo_2013.svg in Resources */, + 32C4FD622173976C00FBEDBF /* radgrad01.svg in Resources */, + 32C4FD442173976C00FBEDBF /* bird-1382034603Euc-cropped.png in Resources */, + 32C4FD4F2173976C00FBEDBF /* ImageAspectRatio.svg in Resources */, + 32C4FD412173976C00FBEDBF /* Reinel_compass_rose-simplified-more.svg in Resources */, + 32C4FD632173976C00FBEDBF /* text01.svg in Resources */, + 32C4FD572173976C00FBEDBF /* radial-gradient-opacity.svg in Resources */, + 32C4FD562173976C00FBEDBF /* CSS.css in Resources */, + 32C4FD4B2173976C00FBEDBF /* imagetag-layer2-sun.svg in Resources */, + 32C4FD5E2173976C00FBEDBF /* PreserveAspectRatio.svg in Resources */, + 32C4FD4A2173976C00FBEDBF /* Reinel_compass_rose-simplified-evenmore.svg in Resources */, + 32C4FD522173976C00FBEDBF /* Text.svg in Resources */, + 32C4FD472173976C00FBEDBF /* Scale-Negative-Direction.svg in Resources */, + 32C4FD512173976C00FBEDBF /* Coins.svg in Resources */, + 32C4FD772173976C00FBEDBF /* bike-frame.svg in Resources */, + 32C4FD682173976C00FBEDBF /* MathCurve-optimized.svg in Resources */, + 32C4FD6D2173976C00FBEDBF /* map-alaska-onlysimple.svg in Resources */, + 32C4FD492173976C00FBEDBF /* Note.svg in Resources */, + 32C4FD452173976C00FBEDBF /* test-stroke-dash-array.svg in Resources */, + 32C4FD4C2173976C00FBEDBF /* sakamura-default-fill-opacity-test.svg in Resources */, + 32C4FD4E2173976C00FBEDBF /* Europe_states_reduced.svg in Resources */, + 32C4FD582173976C00FBEDBF /* CSS.svg in Resources */, + 32C4FD702173976C00FBEDBF /* Location_European_nation_states.svg in Resources */, + 32C4FD692173976C00FBEDBF /* uk-only.svg in Resources */, + 32C4FD432173976C00FBEDBF /* Lion.svg in Resources */, + 32C4FD7C2173976C00FBEDBF /* heart.svg in Resources */, + 32C4FD5A2173976C00FBEDBF /* fillrule-evenodd.svg in Resources */, + 55D8EE3E17628A71009C25F1 /* MainMenu.xib in Resources */, + 32C4FD612173976C00FBEDBF /* quad01.svg in Resources */, + 32C4FD3A2173976C00FBEDBF /* radialGradientTest.svg in Resources */, + 32C4FD532173976C00FBEDBF /* M-to-S-to-T.svg in Resources */, + 32C4FD462173976C00FBEDBF /* breaking-1.svg in Resources */, + 32C4FD7B2173976C00FBEDBF /* voies.svg in Resources */, + 32C4FD4D2173976C00FBEDBF /* groups-and-layers-test.svg in Resources */, + 32C4FD6C2173976C00FBEDBF /* imagetag-layered.svg in Resources */, + 32C4FD422173976C00FBEDBF /* NewTux.svg in Resources */, + 32C4FD542173976C00FBEDBF /* rounded-rects.svg in Resources */, + 32C4FD712173976C00FBEDBF /* strokes.svg in Resources */, + 55018B4C1B24E95700936DF7 /* Licenses.plist in Resources */, + 32C4FD6F2173976C00FBEDBF /* CurvedDiamond.svg in Resources */, + 32C4FD742173976C00FBEDBF /* Sample Licenses from svg-android project.txt in Resources */, + 32C4FD3C2173976C00FBEDBF /* Blank_Map-Africa.svg in Resources */, + 32C4FD3E2173976C00FBEDBF /* imageWithASinglePointPath.svg in Resources */, + 32C4FD722173976C00FBEDBF /* shapes.svg in Resources */, + 32C4FD792173976C00FBEDBF /* BlankMap-World6-Equirectangular.svg in Resources */, + 32C4FD6E2173976C00FBEDBF /* Cycling_Lambie.svg in Resources */, + 32C4FD762173976C00FBEDBF /* svg-with-explicit-width.svg in Resources */, + 32C4FD502173976C00FBEDBF /* test-wave-1.svg in Resources */, + 32C4FD3F2173976C00FBEDBF /* Map.svg in Resources */, + E0060539218BEBF300FC58FE /* shapes2.svg in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 55D8EE2017628A71009C25F1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 55D8EE3417628A71009C25F1 /* main.m in Sources */, + 55D8EE3B17628A71009C25F1 /* AppDelegate.m in Sources */, + 55D8EE4F17628FBC009C25F1 /* DemoSVGObject.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 32EE37952173434B00A23278 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SVGKitFramework-OSX"; + targetProxy = 32EE37942173434B00A23278 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 55D8EE3017628A71009C25F1 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 55D8EE3117628A71009C25F1 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 55D8EE3C17628A71009C25F1 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 55D8EE3D17628A71009C25F1 /* en */, + ); + name = MainMenu.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 55D8EE3F17628A71009C25F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + }; + name = Debug; + }; + 55D8EE4017628A71009C25F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.10; + SDKROOT = macosx; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + }; + name = Release; + }; + 55D8EE4217628A71009C25F1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/3rd-party-frameworks/CocoaLumberjack-2.2.0/Mac", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/Demo-OSX/Demo-OSX-Prefix.pch"; + INFOPLIST_FILE = "$(SRCROOT)/SVGKitLibrary/Demo-OSX/Demo-OSX-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.github.maddthesane.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + 55D8EE4317628A71009C25F1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/3rd-party-frameworks/CocoaLumberjack-2.2.0/Mac", + ); + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/Demo-OSX/Demo-OSX-Prefix.pch"; + INFOPLIST_FILE = "$(SRCROOT)/SVGKitLibrary/Demo-OSX/Demo-OSX-Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks @executable_path/../Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.github.maddthesane.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = "$(TARGET_NAME)"; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 55D8EE1F17628A71009C25F1 /* Build configuration list for PBXProject "Demo-OSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 55D8EE3F17628A71009C25F1 /* Debug */, + 55D8EE4017628A71009C25F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 55D8EE4117628A71009C25F1 /* Build configuration list for PBXNativeTarget "Demo-OSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 55D8EE4217628A71009C25F1 /* Debug */, + 55D8EE4317628A71009C25F1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 55D8EE1C17628A71009C25F1 /* Project object */; +} diff --git a/Demo-Samples/Fonts/Blocky.ttf b/Demo-Samples/Fonts/Blocky.ttf new file mode 100644 index 000000000..0e1554781 Binary files /dev/null and b/Demo-Samples/Fonts/Blocky.ttf differ diff --git a/Demo-Samples/Licenses.plist b/Demo-Samples/Licenses.plist new file mode 100644 index 000000000..970b309cd --- /dev/null +++ b/Demo-Samples/Licenses.plist @@ -0,0 +1,481 @@ + + + + + Online / from Web + + fcpx-shadow-f823057a + + License + n/a - linked + From webpage + http://voormedia.com/blog/2012/10/creating-svg-vector-graphics-for-maximum-browser-compatibility + Source URL + http://voormedia.com/blog/2012/10/creating-svg-vector-graphics-for-maximum-browser-compatibility/images/fcpx-shadow-f823057a.svg + + + Special + + nil-demo-layered-imageview + + License + Special magic name that tests nil images + + + Contributed + + M-to-S-to-T + + Source Local File + M-to-S-to-T.svg + License + Public Domain + + heart + + Source Local File + heart.svg + License + Public Domain + + CSS.svg + + Source Local File + CSS.svg + License + Public Domain + + bike-frame + + License + Public Domain, author: Vessi + Source Local File + bike-frame.svg + + Cycling_Lambie + + Source Local File + Cycling_Lambie.svg + License + Public Domain, author: Vessi + + Scale Negative Direction + + Source Local File + Scale-Negative-Direction.svg + License + Public Domain, author: Adam Martin + + Reinel simplified-evenmore + + Source Local File + Reinel_compass_rose-simplified-evenmore.svg + License + Creative Commons, adapted by Adam Martin + + New Tux + + Source Local File + NewTux.svg + License + Public Domain, author: Larry Ewing + Source URL + http://upload.wikimedia.org/wikipedia/commons/b/b0/NewTux.svg + + sakamura opacity-test + + Source Local File + sakamura-default-fill-opacity-test.svg + License + + + explicit width (large) + + Source Local File + svg-with-explicit-width-large.svg + License + Public Domain, author: Adam Martin + + explicit width + + Source Local File + svg-with-explicit-width.svg + License + Public Domain, author: Adam Martin + + stroke-dash array + + Source Local File + test-stroke-dash-array.svg + License + Public Domain, author: David Sweetman + + wave-1 + + Source Local File + test-wave-1.svg + License + Public Domain, author: Adam Martin + + Text.svg + + Source Local File + Text.svg + License + ? + + UK only + + Source Local File + uk-only.svg + License + Creative Commons + + voies + + Source Local File + voies.svg + License + Public Domain + + Reinel_compass_rose simplified more + + Source Local File + Reinel_compass_rose-simplified-more.svg + License + Creative Commons, adapted by Adam Martin + + Reinel_compass_rose simplified + + Source Local File + Reinel_compass_rose-simplified-for-testing.svg + License + Creative Commons, adapted by Adam Martin + + Reinel_compass_rose + + Source Local File + Reinel_compass_rose.svg + License + Creative Commons + Source URL + http://commons.wikimedia.org/wiki/File:Reinel_compass_rose.svg + + rotated-and-skewed-text + + Source Local File + rotated-and-skewed-text.svg + License + ? + + rounded-rects + + Source Local File + rounded-rects.svg + License + Public Domain, author: Adam Martin + + RainbowWing.svg + + Source Local File + RainbowWing.svg + License + ? + + imagetag-layered.svg + + Source Local File + imagetag-layered.svg + License + Public Domain, author: Adam Martin + + imageWithASinglePointPath.svg + + Source Local File + imageWithASinglePointPath.svg + License + Public Domain, author: Eric Shapiro (https://github.com/EricShapiro) + + Lion.svg + + Source Local File + Lion.svg + License + Unknown, probably Public Domain. + Source URL + http://www-archive.mozilla.org/projects/svg/lion.svg + + Location_European_nation_states.svg + + Source Local File + Location_European_nation_states.svg + License + Creative Commons + Source URL + http://en.wikipedia.org/wiki/File:Location_European_nation_states.svg + + map-alaska-onlysimple.svg + + Source Local File + map-alaska-onlysimple.svg + License + Public Domain, author: Adam Martin + + Map.svg + + Source Local File + Map.svg + License + ? + + MathCurve-optimized.svg + + Source Local File + MathCurve-optimized.svg + License + ? + + Monkey.svg + + Source Local File + Monkey.svg + License + ? + + Note.svg + + Source Local File + Note.svg + License + ? + + parent-clip.svg + + Source Local File + parent-clip.svg + License + ? + + radial-gradient-opacity.svg + + Source Local File + radial-gradient-opacity.svg + License + Public Domain, author: Tomás Silcher + + radialGradientTest.svg + + Source Local File + radialGradientTest.svg + License + ? + + australia_states_blank.svg + + Source Local File + australia_states_blank.svg + License + Creative Commons + Source URL + http://commons.wikimedia.org/wiki/File:Australia_states_blank.svg + + Blank_Map-Africa.svg + + Source Local File + Blank_Map-Africa.svg + License + Public Domain + Source URL + http://en.wikipedia.org/wiki/File:Blank_Map-Africa.svg + + BlankMap-World6-Equirectangular.svg + + Source Local File + BlankMap-World6-Equirectangular.svg + License + Public Domain + Source URL + http://commons.wikimedia.org/wiki/File:BlankMap-World6-Equirectangular.svg + + breaking-1.svg + + Source Local File + breaking-1.svg + License + Public Domain + + Coins.svg + + Source Local File + Coins.svg + License + Public Domain. Coins images Public Domain, http://pixabay.com/en/euro-2-coin-currency-europe-money-400287/ + + CurvedDiamond.svg + + Source Local File + CurvedDiamond.svg + License + Public Domain, author: Adam Martin (http://t-machine.org) + + Europe_states_reduced.svg + + Source Local File + Europe_states_reduced.svg + License + Public Domain? + + g-element-applies-rotation.svg + + Source Local File + g-element-applies-rotation.svg + License + Public Domain + + groups-and-layers-test.svg + + Source Local File + groups-and-layers-test.svg + License + Public Domain + + ImageAspectRatio.svg + + Source Local File + ImageAspectRatio.svg + License + Public Domain, Created by author based on PreserveAspectRatio.svg from the SVG spec. Snowman image Public Domain, http://www.publicdomainpictures.net/view-image.php?image=17565&picture=snowman-decoration + + imagetag-layer2-sun.svg + + Source Local File + imagetag-layer2-sun.svg + License + Public Domain, author: Adam Martin + + Mozilla_Firefox_logo_2013.svg + + Source Local File + Mozilla_Firefox_logo_2013.svg + License + Public Domain, author: Sean Martell for Mozilla + Source URL + https://upload.wikimedia.org/wikipedia/commons/7/76/Mozilla_Firefox_logo_2013.svg + + + SVG Spec + + arcs01 + + Source Local File + arcs01.svg + Source URL + http://www.w3.org/TR/SVG/images/paths/arcs01.svg + License + Public Domain + + arcs02 + + Source Local File + arcs02.svg + Source URL + http://www.w3.org/TR/SVG/images/paths/arcs02.svg + License + Public Domain + + fillrule-evenodd.svg + + Source Local File + fillrule-evenodd.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/painting/fillrule-evenodd.svg + + radgrad01.svg + + Source Local File + radgrad01.svg + License + Public Domain + + StyleAttribute.svg + + Source Local File + StyleAttribute.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/styling/StyleAttribute.svg + + text01.svg + + Source Local File + text01.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/text/text01.svg + + tspan01.svg + + Source Local File + tspan01.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/text/tspan01.svg + + opacity01.svg + + Source Local File + opacity01.svg + License + Public Domain + + pattern01.svg + + Source Local File + pattern01.svg + License + Public Domain + + PreserveAspectRatio.svg + + Source Local File + PreserveAspectRatio.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG11/images/coords/PreserveAspectRatio.svg + + quad01.svg + + Source Local File + quad01.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/paths/quad01.svg + + cubic01.svg + + Source Local File + cubic01.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/paths/cubic01.svg + + lingrad01.svg + + Source Local File + lingrad01.svg + License + Public Domain + Source URL + http://www.w3.org/TR/SVG/images/pservers/lingrad01.svg + + + + diff --git a/Demo-Samples/SVG/CSS.css b/Demo-Samples/SVG/CSS.css new file mode 100644 index 000000000..b3dbc538f --- /dev/null +++ b/Demo-Samples/SVG/CSS.css @@ -0,0 +1,26 @@ +/* Use these: */ +path { + fill: #006600; +} +#check-id { + fill: #00ff00; +} +#group-red path, path.red, path#id-red, #id-and-class.red, #by-id { + fill: #00ff00; +} +#hidden { + visibility: hidden; +} +#display-none { + display: none; +} + +/* These should get overridden: */ +.red, #id-red, #style, #use-local, #id-and-class, #use-last { + fill: #ff0000; +} + +/* Use this: */ +#use-last { + fill: #00ff00; +} \ No newline at end of file diff --git a/Demo-Samples/SVG/CSS.svg b/Demo-Samples/SVG/CSS.svg new file mode 100644 index 000000000..7594ad46f --- /dev/null +++ b/Demo-Samples/SVG/CSS.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/Coin.png b/Demo-Samples/SVG/Coin.png new file mode 100644 index 000000000..7174ceef4 Binary files /dev/null and b/Demo-Samples/SVG/Coin.png differ diff --git a/Demo-Samples/SVG/Coins.svg b/Demo-Samples/SVG/Coins.svg new file mode 100644 index 000000000..d6071cfb8 --- /dev/null +++ b/Demo-Samples/SVG/Coins.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/Cycling_Lambie.svg b/Demo-Samples/SVG/Cycling_Lambie.svg new file mode 100644 index 000000000..e177ff0ec --- /dev/null +++ b/Demo-Samples/SVG/Cycling_Lambie.svg @@ -0,0 +1,833 @@ + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/ImageAspectRatio.svg b/Demo-Samples/SVG/ImageAspectRatio.svg new file mode 100644 index 000000000..dcde79a25 --- /dev/null +++ b/Demo-Samples/SVG/ImageAspectRatio.svg @@ -0,0 +1,72 @@ + + + + + Example PreserveAspectRatio - illustrates preserveAspectRatio attribute + + + SVG to fit + + Viewport 1 + + Viewport 2 + + + + --------------- meet --------------- + xMin* + + xMid* + + xMax* + + + + + ---------- meet ---------- + *YMin + + *YMid + + *YMax + + + + + ---------- slice ---------- + xMin* + + xMid* + + xMax* + + + + + --------------- slice --------------- + *YMin + + *YMid + + *YMax + + + + diff --git a/Demo-Samples/SVG/M-to-S-to-T.svg b/Demo-Samples/SVG/M-to-S-to-T.svg new file mode 100644 index 000000000..8d6160c1b --- /dev/null +++ b/Demo-Samples/SVG/M-to-S-to-T.svg @@ -0,0 +1 @@ + diff --git a/Demo-Samples/SVG/MathCurve.svg b/Demo-Samples/SVG/MathCurve-optimized.svg similarity index 83% rename from Demo-Samples/SVG/MathCurve.svg rename to Demo-Samples/SVG/MathCurve-optimized.svg index ac8ad2bdb..a71571bbe 100644 --- a/Demo-Samples/SVG/MathCurve.svg +++ b/Demo-Samples/SVG/MathCurve-optimized.svg @@ -3,7 +3,8 @@ xmlns:xlink="http://www.w3.org/1999/xlink"> - + diff --git a/Demo-Samples/SVG/Mozilla_Firefox_logo_2013.svg b/Demo-Samples/SVG/Mozilla_Firefox_logo_2013.svg new file mode 100644 index 000000000..6e0299b97 --- /dev/null +++ b/Demo-Samples/SVG/Mozilla_Firefox_logo_2013.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Demo-Samples/SVG/NewTux.svg b/Demo-Samples/SVG/NewTux.svg new file mode 100644 index 000000000..047e020e4 --- /dev/null +++ b/Demo-Samples/SVG/NewTux.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/Reinel_compass_rose-simplified-evenmore.svg b/Demo-Samples/SVG/Reinel_compass_rose-simplified-evenmore.svg new file mode 100644 index 000000000..3ee14a263 --- /dev/null +++ b/Demo-Samples/SVG/Reinel_compass_rose-simplified-evenmore.svg @@ -0,0 +1,74 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/Demo-Samples/SVG/Reinel_compass_rose-simplified-more.svg b/Demo-Samples/SVG/Reinel_compass_rose-simplified-more.svg new file mode 100644 index 000000000..6fdd370af --- /dev/null +++ b/Demo-Samples/SVG/Reinel_compass_rose-simplified-more.svg @@ -0,0 +1,156 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/Scale-Negative-Direction.svg b/Demo-Samples/SVG/Scale-Negative-Direction.svg new file mode 100644 index 000000000..d93a46ad0 --- /dev/null +++ b/Demo-Samples/SVG/Scale-Negative-Direction.svg @@ -0,0 +1,71 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/Demo-Samples/SVG/Snowman.png b/Demo-Samples/SVG/Snowman.png new file mode 100644 index 000000000..91022e6df Binary files /dev/null and b/Demo-Samples/SVG/Snowman.png differ diff --git a/Demo-Samples/SVG/apache-licensed-from-svg-android/shapes2.svg b/Demo-Samples/SVG/apache-licensed-from-svg-android/shapes2.svg new file mode 100644 index 000000000..13f7f6f9f --- /dev/null +++ b/Demo-Samples/SVG/apache-licensed-from-svg-android/shapes2.svg @@ -0,0 +1,71 @@ + + + +]> + + + + + +SVG Parser: Shapes / Opacity / Blend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/bike-frame.svg b/Demo-Samples/SVG/bike-frame.svg new file mode 100644 index 000000000..de50a7d78 --- /dev/null +++ b/Demo-Samples/SVG/bike-frame.svg @@ -0,0 +1,69 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/Demo-Samples/SVG/bird-1382034603Euc-cropped.png b/Demo-Samples/SVG/bird-1382034603Euc-cropped.png new file mode 100644 index 000000000..ae8b4488e Binary files /dev/null and b/Demo-Samples/SVG/bird-1382034603Euc-cropped.png differ diff --git a/Demo-Samples/SVG/heart.svg b/Demo-Samples/SVG/heart.svg new file mode 100644 index 000000000..924aeb203 --- /dev/null +++ b/Demo-Samples/SVG/heart.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Demo-Samples/SVG/imagetag-layer2-sun.svg b/Demo-Samples/SVG/imagetag-layer2-sun.svg new file mode 100644 index 000000000..65be5cd6d --- /dev/null +++ b/Demo-Samples/SVG/imagetag-layer2-sun.svg @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/imagetag-layered.svg b/Demo-Samples/SVG/imagetag-layered.svg new file mode 100644 index 000000000..34a96dc63 --- /dev/null +++ b/Demo-Samples/SVG/imagetag-layered.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/map-alaska-onlysimple.svg b/Demo-Samples/SVG/map-alaska-onlysimple.svg new file mode 100644 index 000000000..47ba753f2 --- /dev/null +++ b/Demo-Samples/SVG/map-alaska-onlysimple.svg @@ -0,0 +1,23 @@ + + + + + + diff --git a/Demo-Samples/SVG/parent-clip.svg b/Demo-Samples/SVG/parent-clip.svg new file mode 100644 index 000000000..b32dfd0e8 --- /dev/null +++ b/Demo-Samples/SVG/parent-clip.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo-Samples/SVG/radial-gradient-opacity.svg b/Demo-Samples/SVG/radial-gradient-opacity.svg new file mode 100644 index 000000000..7d2c56d8a --- /dev/null +++ b/Demo-Samples/SVG/radial-gradient-opacity.svg @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/Demo-Samples/SVG/sakamura-default-fill-opacity-test.svg b/Demo-Samples/SVG/sakamura-default-fill-opacity-test.svg new file mode 100644 index 000000000..eb3bfdf85 --- /dev/null +++ b/Demo-Samples/SVG/sakamura-default-fill-opacity-test.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/Demo-Samples/SVG/test-stroke-dash-array.svg b/Demo-Samples/SVG/test-stroke-dash-array.svg new file mode 100644 index 000000000..c52c5d510 --- /dev/null +++ b/Demo-Samples/SVG/test-stroke-dash-array.svg @@ -0,0 +1,20 @@ + + + + + + + diff --git a/Demo-Samples/SVG/svg spec examples/PreserveAspectRatio.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/PreserveAspectRatio.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/PreserveAspectRatio.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/PreserveAspectRatio.svg diff --git a/Demo-Samples/SVG/svg spec examples/StyleAttribute.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/StyleAttribute.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/StyleAttribute.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/StyleAttribute.svg diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs01.svg new file mode 100644 index 000000000..9e4b9a577 --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs01.svg @@ -0,0 +1,24 @@ + + + + Example arcs01 - arc commands in path data + Picture of a pie chart with two pie wedges and + a picture of a line with arc blips + + + + + + + + diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs02.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs02.svg new file mode 100644 index 000000000..c0bddf955 --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/arcs02.svg @@ -0,0 +1,59 @@ + + + + Example arcs02 - arc options in paths + Pictures showing the result of setting + large-arc-flag and sweep-flag to the four + possible combinations of 0 and 1. + + + + + + Arc start + Arc end + + + + + + + + + + large-arc-flag=0 + sweep-flag=0 + + + + + large-arc-flag=0 + sweep-flag=1 + + + + + large-arc-flag=1 + sweep-flag=0 + + + + + large-arc-flag=1 + sweep-flag=1 + + + + + + + diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/cubic01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/cubic01.svg new file mode 100644 index 000000000..f577cdeca --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/cubic01.svg @@ -0,0 +1,39 @@ + + + + Example cubic01- cubic Bézier commands in path data + Picture showing a simple example of path data + using both a "C" and an "S" command, + along with annotations showing the control points + and end points + + + + + + + + + + + + + + + + + M100,200 C100,100 250,100 250,200 + S400,300 400,200 + diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/fillrule-evenodd.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/fillrule-evenodd.svg new file mode 100644 index 000000000..330740f77 --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/fillrule-evenodd.svg @@ -0,0 +1,32 @@ + + + + Example fillrule-evenodd - demonstrates fill-rule:evenodd + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo-Samples/SVG/svg spec examples/lingrad01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/lingrad01.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/lingrad01.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/lingrad01.svg diff --git a/Demo-Samples/SVG/svg spec examples/opacity01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/opacity01.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/opacity01.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/opacity01.svg diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/pattern01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/pattern01.svg new file mode 100644 index 000000000..ea6e1a389 --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/pattern01.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/quad01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/quad01.svg new file mode 100644 index 000000000..3cdbc8bec --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/quad01.svg @@ -0,0 +1,30 @@ + + + + Example quad01 - quadratic Bézier commands in path data + Picture showing a "Q" a "T" command, + along with annotations showing the control points + and end points + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/www.w3.org-TR-SVG/radgrad01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/radgrad01.svg new file mode 100644 index 000000000..e5034c80e --- /dev/null +++ b/Demo-Samples/SVG/www.w3.org-TR-SVG/radgrad01.svg @@ -0,0 +1,27 @@ + + + + Example radgrad01 - fill a rectangle by referencing a + radial gradient paint server + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/SVG/svg spec examples/text01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/text01.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/text01.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/text01.svg diff --git a/Demo-Samples/SVG/svg spec examples/tspan01.svg b/Demo-Samples/SVG/www.w3.org-TR-SVG/tspan01.svg similarity index 100% rename from Demo-Samples/SVG/svg spec examples/tspan01.svg rename to Demo-Samples/SVG/www.w3.org-TR-SVG/tspan01.svg diff --git a/Demo-Samples/Sample Licenses.txt b/Demo-Samples/Sample Licenses.txt deleted file mode 100644 index e21c23998..000000000 --- a/Demo-Samples/Sample Licenses.txt +++ /dev/null @@ -1,65 +0,0 @@ -This file exists to document where each sample file came from, in case anyone needs to check legals in future. - -Also, it's helpful to know which SVG-editing software created / exported each file - helps us to check compatibility with particular editors. - -URL'S INCLUDED IN SVGKit: ------------ - - NB: we are NOT embedding these, so we do NOT have to license them, but FYI here are the original sources: - -http://upload.wikimedia.org/wikipedia/commons/f/f9/BlankMap-Africa.svg - -- Public Domain, author: http://commons.wikimedia.org/wiki/User:Lokal_Profil - -- http://commons.wikimedia.org/w/index.php?title=File:BlankMap-Africa.svg&page=1 - - -FILES INCLUDED IN SVGKit: ------------ - -australia_states_blank.svg - -- Creative Commons - -- http://commons.wikimedia.org/wiki/File:Australia_states_blank.svg - -Blank_Map-Africa.svg - -- Public Domain, c.f. - http://en.wikipedia.org/wiki/File:Blank_Map-Africa.svg - -CurvedDiamond.svg - -- Public Domain, author: Adam Martin (http://t-machine.org) - -- Created by: Inkscape - -imageWithASinglePointPath.svg - -- Public Domain, author: Eric Shapiro (https://github.com/EricShapiro) - -Lion.svg - -- ??? Unknown, probably Public Domain. Same file as this one on Mozilla.org: http://www-archive.mozilla.org/projects/svg/lion.svg - -test-wave-1.svg - -- Public Domain, author: Adam Martin (http://t-machine.org) - -- Created by: Inkscape - -Location_European_nation_states - -- Creative Commons - -- http://en.wikipedia.org/wiki/File:Location_European_nation_states.svg - - uk-only.svg, Europe_states_reduced.svg - -- Adam Martin's modified versions of Location_European_nation_states, same license - -Reinel_compass_rose.svg - -- Creative Commons - -- http://commons.wikimedia.org/wiki/File:Reinel_compass_rose.svg - - -FILES TAKEN DIRECT FROM THE OFFICIAL SVG SPEC: ------------ -lingrad01.svg - -- http://www.w3.org/TR/SVG/images/pservers/lingrad01.svg - -StyleAttribute - -- http://www.w3.org/TR/SVG/images/styling/StyleAttribute.svg - -PreserveAspectRatio - -- http://www.w3.org/TR/SVG11/images/coords/PreserveAspectRatio.svg - -text01.svg - -- http://www.w3.org/TR/SVG/images/text/text01.svg - -tspan01.svg - -- http://www.w3.org/TR/SVG/images/text/tspan01.svg \ No newline at end of file diff --git a/Demo-Samples/Saved Bitmaps/BlankMap-World6-Equirectangular.png b/Demo-Samples/Saved Bitmaps/BlankMap-World6-Equirectangular.png new file mode 100644 index 000000000..52a673e77 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/BlankMap-World6-Equirectangular.png differ diff --git a/Demo-Samples/Saved Bitmaps/Blank_Map-Africa.png b/Demo-Samples/Saved Bitmaps/Blank_Map-Africa.png new file mode 100644 index 000000000..c1e595459 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Blank_Map-Africa.png differ diff --git a/Demo-Samples/Saved Bitmaps/CSS.png b/Demo-Samples/Saved Bitmaps/CSS.png new file mode 100644 index 000000000..c73fc6a29 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/CSS.png differ diff --git a/Demo-Samples/Saved Bitmaps/Coins.png b/Demo-Samples/Saved Bitmaps/Coins.png new file mode 100644 index 000000000..a6663b7ec Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Coins.png differ diff --git a/Demo-Samples/Saved Bitmaps/CurvedDiamond.png b/Demo-Samples/Saved Bitmaps/CurvedDiamond.png new file mode 100644 index 000000000..edfe69a67 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/CurvedDiamond.png differ diff --git a/Demo-Samples/Saved Bitmaps/Cycling_Lambie.png b/Demo-Samples/Saved Bitmaps/Cycling_Lambie.png new file mode 100644 index 000000000..72901967a Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Cycling_Lambie.png differ diff --git a/Demo-Samples/Saved Bitmaps/Europe_states_reduced.png b/Demo-Samples/Saved Bitmaps/Europe_states_reduced.png new file mode 100644 index 000000000..8026a1874 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Europe_states_reduced.png differ diff --git a/Demo-Samples/Saved Bitmaps/ImageAspectRatio.png b/Demo-Samples/Saved Bitmaps/ImageAspectRatio.png new file mode 100644 index 000000000..486c61b7e Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/ImageAspectRatio.png differ diff --git a/Demo-Samples/Saved Bitmaps/Lion.png b/Demo-Samples/Saved Bitmaps/Lion.png new file mode 100644 index 000000000..1d99732dc Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Lion.png differ diff --git a/Demo-Samples/Saved Bitmaps/Location_European_nation_states.png b/Demo-Samples/Saved Bitmaps/Location_European_nation_states.png new file mode 100644 index 000000000..2d62e9ab4 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Location_European_nation_states.png differ diff --git a/Demo-Samples/Saved Bitmaps/M-to-S-to-T.png b/Demo-Samples/Saved Bitmaps/M-to-S-to-T.png new file mode 100644 index 000000000..8e5eb7c6f Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/M-to-S-to-T.png differ diff --git a/Demo-Samples/Saved Bitmaps/Map.png b/Demo-Samples/Saved Bitmaps/Map.png new file mode 100644 index 000000000..0d4531292 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Map.png differ diff --git a/Demo-Samples/Saved Bitmaps/MathCurve-optimized.png b/Demo-Samples/Saved Bitmaps/MathCurve-optimized.png new file mode 100644 index 000000000..1587e9158 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/MathCurve-optimized.png differ diff --git a/Demo-Samples/Bitmap/Monkey.png b/Demo-Samples/Saved Bitmaps/Monkey.png similarity index 100% rename from Demo-Samples/Bitmap/Monkey.png rename to Demo-Samples/Saved Bitmaps/Monkey.png diff --git a/Demo-Samples/Saved Bitmaps/Mozilla_Firefox_logo_2013.png b/Demo-Samples/Saved Bitmaps/Mozilla_Firefox_logo_2013.png new file mode 100644 index 000000000..624ad150f Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Mozilla_Firefox_logo_2013.png differ diff --git a/Demo-Samples/Saved Bitmaps/NewTux.png b/Demo-Samples/Saved Bitmaps/NewTux.png new file mode 100644 index 000000000..85ec3cf4c Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/NewTux.png differ diff --git a/Demo-Samples/Bitmap/Note.png b/Demo-Samples/Saved Bitmaps/Note.png similarity index 100% rename from Demo-Samples/Bitmap/Note.png rename to Demo-Samples/Saved Bitmaps/Note.png diff --git a/Demo-Samples/Saved Bitmaps/RainbowWing.png b/Demo-Samples/Saved Bitmaps/RainbowWing.png new file mode 100644 index 000000000..ea37b877e Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/RainbowWing.png differ diff --git a/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-evenmore.png b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-evenmore.png new file mode 100644 index 000000000..bfa46673d Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-evenmore.png differ diff --git a/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-for-testing.png b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-for-testing.png new file mode 100644 index 000000000..62ee4eb89 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-for-testing.png differ diff --git a/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-more.png b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-more.png new file mode 100644 index 000000000..83cdd98df Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose-simplified-more.png differ diff --git a/Demo-Samples/Saved Bitmaps/Reinel_compass_rose.png b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose.png new file mode 100644 index 000000000..8f407601c Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Reinel_compass_rose.png differ diff --git a/Demo-Samples/Saved Bitmaps/Scale-Negative-Direction.png b/Demo-Samples/Saved Bitmaps/Scale-Negative-Direction.png new file mode 100644 index 000000000..e28a5f4f0 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Scale-Negative-Direction.png differ diff --git a/Demo-Samples/Saved Bitmaps/Text.png b/Demo-Samples/Saved Bitmaps/Text.png new file mode 100644 index 000000000..2040ab4bd Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/Text.png differ diff --git a/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/gradients.png b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/gradients.png new file mode 100644 index 000000000..39377d61d Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/gradients.png differ diff --git a/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/shapes.png b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/shapes.png new file mode 100644 index 000000000..66035c756 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/shapes.png differ diff --git a/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/strokes.png b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/strokes.png new file mode 100644 index 000000000..530344bba Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/strokes.png differ diff --git a/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/transformations.png b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/transformations.png new file mode 100644 index 000000000..0df6bec17 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/apache-licensed-from-svg-android/transformations.png differ diff --git a/Demo-Samples/Saved Bitmaps/arcs01.png b/Demo-Samples/Saved Bitmaps/arcs01.png new file mode 100644 index 000000000..814ad12db Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/arcs01.png differ diff --git a/Demo-Samples/Saved Bitmaps/arcs02.png b/Demo-Samples/Saved Bitmaps/arcs02.png new file mode 100644 index 000000000..59e26875a Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/arcs02.png differ diff --git a/Demo-Samples/Saved Bitmaps/australia_states_blank.png b/Demo-Samples/Saved Bitmaps/australia_states_blank.png new file mode 100644 index 000000000..2b59eee2c Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/australia_states_blank.png differ diff --git a/Demo-Samples/Saved Bitmaps/bike-frame.png b/Demo-Samples/Saved Bitmaps/bike-frame.png new file mode 100644 index 000000000..640a8e6b0 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/bike-frame.png differ diff --git a/Demo-Samples/Saved Bitmaps/breaking-1.png b/Demo-Samples/Saved Bitmaps/breaking-1.png new file mode 100644 index 000000000..5f9f19fb2 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/breaking-1.png differ diff --git a/Demo-Samples/Saved Bitmaps/g-element-applies-rotation.png b/Demo-Samples/Saved Bitmaps/g-element-applies-rotation.png new file mode 100644 index 000000000..65fdc52b6 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/g-element-applies-rotation.png differ diff --git a/Demo-Samples/Saved Bitmaps/groups-and-layers-test.png b/Demo-Samples/Saved Bitmaps/groups-and-layers-test.png new file mode 100644 index 000000000..b5773842d Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/groups-and-layers-test.png differ diff --git a/Demo-Samples/Saved Bitmaps/heart.png b/Demo-Samples/Saved Bitmaps/heart.png new file mode 100644 index 000000000..cb0811dac Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/heart.png differ diff --git a/Demo-Samples/Saved Bitmaps/imageWithASinglePointPath.png b/Demo-Samples/Saved Bitmaps/imageWithASinglePointPath.png new file mode 100644 index 000000000..e4e5f4a6e Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/imageWithASinglePointPath.png differ diff --git a/Demo-Samples/Saved Bitmaps/imagetag-layer2-sun.png b/Demo-Samples/Saved Bitmaps/imagetag-layer2-sun.png new file mode 100644 index 000000000..e53d06938 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/imagetag-layer2-sun.png differ diff --git a/Demo-Samples/Saved Bitmaps/map-alaska-onlysimple.png b/Demo-Samples/Saved Bitmaps/map-alaska-onlysimple.png new file mode 100644 index 000000000..034475b6a Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/map-alaska-onlysimple.png differ diff --git a/Demo-Samples/Saved Bitmaps/parent-clip.png b/Demo-Samples/Saved Bitmaps/parent-clip.png new file mode 100644 index 000000000..e28aa6218 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/parent-clip.png differ diff --git a/Demo-Samples/Saved Bitmaps/radial-gradient-opacity.png b/Demo-Samples/Saved Bitmaps/radial-gradient-opacity.png new file mode 100644 index 000000000..326743c96 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/radial-gradient-opacity.png differ diff --git a/Demo-Samples/Saved Bitmaps/radialGradientTest.png b/Demo-Samples/Saved Bitmaps/radialGradientTest.png new file mode 100644 index 000000000..890149cfd Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/radialGradientTest.png differ diff --git a/Demo-Samples/Saved Bitmaps/rotated-and-skewed-text.png b/Demo-Samples/Saved Bitmaps/rotated-and-skewed-text.png new file mode 100644 index 000000000..27d13b86c Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/rotated-and-skewed-text.png differ diff --git a/Demo-Samples/Saved Bitmaps/rounded-rects.png b/Demo-Samples/Saved Bitmaps/rounded-rects.png new file mode 100644 index 000000000..74da83beb Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/rounded-rects.png differ diff --git a/Demo-Samples/Saved Bitmaps/sakamura-default-fill-opacity-test.png b/Demo-Samples/Saved Bitmaps/sakamura-default-fill-opacity-test.png new file mode 100644 index 000000000..df8eb8aa5 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/sakamura-default-fill-opacity-test.png differ diff --git a/Demo-Samples/Saved Bitmaps/svg-with-explicit-width-large.png b/Demo-Samples/Saved Bitmaps/svg-with-explicit-width-large.png new file mode 100644 index 000000000..fc97e5090 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/svg-with-explicit-width-large.png differ diff --git a/Demo-Samples/Saved Bitmaps/svg-with-explicit-width.png b/Demo-Samples/Saved Bitmaps/svg-with-explicit-width.png new file mode 100644 index 000000000..382d6f0ee Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/svg-with-explicit-width.png differ diff --git a/Demo-Samples/Saved Bitmaps/test-stroke-dash-array.png b/Demo-Samples/Saved Bitmaps/test-stroke-dash-array.png new file mode 100644 index 000000000..a1a7b7e55 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/test-stroke-dash-array.png differ diff --git a/Demo-Samples/Saved Bitmaps/test-wave-1.png b/Demo-Samples/Saved Bitmaps/test-wave-1.png new file mode 100644 index 000000000..6f5fbbd7b Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/test-wave-1.png differ diff --git a/Demo-Samples/Saved Bitmaps/uk-only.png b/Demo-Samples/Saved Bitmaps/uk-only.png new file mode 100644 index 000000000..108af6bfb Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/uk-only.png differ diff --git a/Demo-Samples/Saved Bitmaps/voies.png b/Demo-Samples/Saved Bitmaps/voies.png new file mode 100644 index 000000000..a53391b0c Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/voies.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/PreserveAspectRatio.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/PreserveAspectRatio.png new file mode 100644 index 000000000..83daf55f2 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/PreserveAspectRatio.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/StyleAttribute.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/StyleAttribute.png new file mode 100644 index 000000000..15d925d44 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/StyleAttribute.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/cubic01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/cubic01.png new file mode 100644 index 000000000..c0b95dc4e Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/cubic01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/fillrule-evenodd.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/fillrule-evenodd.png new file mode 100644 index 000000000..06a25b842 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/fillrule-evenodd.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/lingrad01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/lingrad01.png new file mode 100644 index 000000000..b878dbba6 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/lingrad01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/opacity01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/opacity01.png new file mode 100644 index 000000000..0f967cfa4 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/opacity01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/pattern01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/pattern01.png new file mode 100644 index 000000000..584c90174 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/pattern01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/quad01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/quad01.png new file mode 100644 index 000000000..1132aae4b Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/quad01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/radgrad01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/radgrad01.png new file mode 100644 index 000000000..339696a70 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/radgrad01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/text01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/text01.png new file mode 100644 index 000000000..f7865f8b3 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/text01.png differ diff --git a/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/tspan01.png b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/tspan01.png new file mode 100644 index 000000000..037c9a463 Binary files /dev/null and b/Demo-Samples/Saved Bitmaps/www.w3.org-TR-SVG/tspan01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/20x20.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/20x20.png new file mode 100644 index 000000000..32399c621 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/20x20.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50-viewbox-greencircle.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50-viewbox-greencircle.svg new file mode 100644 index 000000000..306c52e4e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50-viewbox-greencircle.svg @@ -0,0 +1,5 @@ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50greencircle.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50greencircle.svg new file mode 100644 index 000000000..cc7aa04dd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/50x50greencircle.svg @@ -0,0 +1,5 @@ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/DisplaceChecker.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/DisplaceChecker.png new file mode 100644 index 000000000..25c77d0a9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/DisplaceChecker.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g01.png new file mode 100644 index 000000000..556fa7270 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g02.png new file mode 100644 index 000000000..ce09821ef Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g04.png new file mode 100644 index 000000000..3853273f9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g08.png new file mode 100644 index 000000000..faed8bec4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g16.png new file mode 100644 index 000000000..a9f28165e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c08.png new file mode 100644 index 000000000..2aab44d42 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c16.png new file mode 100644 index 000000000..cd7e50f91 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p01.png new file mode 100644 index 000000000..00a7cea6c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p02.png new file mode 100644 index 000000000..bb16b44b3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p04.png new file mode 100644 index 000000000..b4e888e24 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p08.png new file mode 100644 index 000000000..50a6d1cac Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a08.png new file mode 100644 index 000000000..398132be5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a16.png new file mode 100644 index 000000000..51192e731 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi4a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a08.png new file mode 100644 index 000000000..aecb32e0d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a16.png new file mode 100644 index 000000000..4181533ad Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basi6a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g01.png new file mode 100644 index 000000000..1d722423a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g02.png new file mode 100644 index 000000000..508332418 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g04.png new file mode 100644 index 000000000..0bf368786 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g08.png new file mode 100644 index 000000000..23c82379a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g16.png new file mode 100644 index 000000000..e7c82f78e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c08.png new file mode 100644 index 000000000..db5ad1586 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c16.png new file mode 100644 index 000000000..50c1cb91a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p01.png new file mode 100644 index 000000000..b145c2b8e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p02.png new file mode 100644 index 000000000..8985b3d81 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p04.png new file mode 100644 index 000000000..0fbf9e827 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p08.png new file mode 100644 index 000000000..0ddad07e5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a08.png new file mode 100644 index 000000000..3e1305220 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a16.png new file mode 100644 index 000000000..8243644d0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn4a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a08.png new file mode 100644 index 000000000..e60873876 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a16.png new file mode 100644 index 000000000..984a99525 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/basn6a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a08.png new file mode 100644 index 000000000..398132be5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a16.png new file mode 100644 index 000000000..51192e731 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgai4a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a08.png new file mode 100644 index 000000000..e60873876 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a16.png new file mode 100644 index 000000000..984a99525 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgan6a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgbn4a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgbn4a08.png new file mode 100644 index 000000000..7cbefc3bf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgbn4a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bggn4a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bggn4a16.png new file mode 100644 index 000000000..13fd85ba1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bggn4a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgwn6a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgwn6a08.png new file mode 100644 index 000000000..a67ff205b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgwn6a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgyn6a16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgyn6a16.png new file mode 100644 index 000000000..ae3e9be58 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/bgyn6a16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn2c08.png new file mode 100644 index 000000000..47c24817b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn3p08.png new file mode 100644 index 000000000..8bb2c1098 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ccwn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdfn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdfn2c08.png new file mode 100644 index 000000000..559e5261e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdfn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdhn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdhn2c08.png new file mode 100644 index 000000000..3e07e8ecb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdhn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdsn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdsn2c08.png new file mode 100644 index 000000000..076c32cc0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdsn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdun2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdun2c08.png new file mode 100644 index 000000000..846033be6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cdun2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch1n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch1n3p04.png new file mode 100644 index 000000000..17cd12dfc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch1n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch2n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch2n3p08.png new file mode 100644 index 000000000..25c17987a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ch2n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm0n0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm0n0g04.png new file mode 100644 index 000000000..9fba5db3b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm0n0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm7n0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm7n0g04.png new file mode 100644 index 000000000..f7dc46e68 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm7n0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm9n0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm9n0g04.png new file mode 100644 index 000000000..dd70911ad Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cm9n0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n2c16.png new file mode 100644 index 000000000..bf5fd20a2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n3p08.png new file mode 100644 index 000000000..f4a66237b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs3n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n2c08.png new file mode 100644 index 000000000..40f947c33 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n3p08.png new file mode 100644 index 000000000..dfd6e6e6e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs5n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n2c08.png new file mode 100644 index 000000000..8e01d3294 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n3p08.png new file mode 100644 index 000000000..a44066eb6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/cs8n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct0n0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct0n0g04.png new file mode 100644 index 000000000..40d1e062f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct0n0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct1n0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct1n0g04.png new file mode 100644 index 000000000..3ba110aa7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ct1n0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ctzn0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ctzn0g04.png new file mode 100644 index 000000000..b4401c9cf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ctzn0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n0g08.png new file mode 100644 index 000000000..45a007596 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n2c08.png new file mode 100644 index 000000000..d6a1ffff6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f00n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n0g08.png new file mode 100644 index 000000000..4a1107b46 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n2c08.png new file mode 100644 index 000000000..26fee958c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f01n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n0g08.png new file mode 100644 index 000000000..bfe410c5e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n2c08.png new file mode 100644 index 000000000..e590f1234 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f02n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n0g08.png new file mode 100644 index 000000000..ed01e2923 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n2c08.png new file mode 100644 index 000000000..758115059 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f03n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n0g08.png new file mode 100644 index 000000000..663fdae3e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n2c08.png new file mode 100644 index 000000000..3c8b5116e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/f04n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n0g16.png new file mode 100644 index 000000000..41083ca80 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n2c08.png new file mode 100644 index 000000000..a9354dbee Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n3p04.png new file mode 100644 index 000000000..60396c95a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g03n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n0g16.png new file mode 100644 index 000000000..32395b76c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n2c08.png new file mode 100644 index 000000000..a652b0ce8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n3p04.png new file mode 100644 index 000000000..5661cc313 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g04n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n0g16.png new file mode 100644 index 000000000..70b37f01e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n2c08.png new file mode 100644 index 000000000..932c13653 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n3p04.png new file mode 100644 index 000000000..961993058 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g05n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n0g16.png new file mode 100644 index 000000000..d6a47c2d5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n2c08.png new file mode 100644 index 000000000..597346460 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n3p04.png new file mode 100644 index 000000000..c73fb6136 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g07n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n0g16.png new file mode 100644 index 000000000..85f2c958e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n2c08.png new file mode 100644 index 000000000..b3039970c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n3p04.png new file mode 100644 index 000000000..1b6a6be2c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g10n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n0g16.png new file mode 100644 index 000000000..a9f6787c7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n2c08.png new file mode 100644 index 000000000..03f505a64 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n3p04.png new file mode 100644 index 000000000..4f943c617 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/g25n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n0g16.png new file mode 100644 index 000000000..e7c82f78e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n2c16.png new file mode 100644 index 000000000..50c1cb91a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi1n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n0g16.png new file mode 100644 index 000000000..14d64c583 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n2c16.png new file mode 100644 index 000000000..4c2e3e335 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi2n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n0g16.png new file mode 100644 index 000000000..69e73ede3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n2c16.png new file mode 100644 index 000000000..93691e373 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi4n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n0g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n0g16.png new file mode 100644 index 000000000..924841357 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n0g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n2c16.png new file mode 100644 index 000000000..f0512e49f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/oi9n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite.doc b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite.doc new file mode 100644 index 000000000..7da918b4e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite.doc @@ -0,0 +1,520 @@ + PNGSUITE +---------------- + + testset for PNG-(de)coders + created by Willem van Schaik +------------------------------------ + +This is a collection of graphics images created to test the png applications +like viewers, converters and editors. All (as far as that is possible) +formats supported by the PNG standard are represented. + + +1. INTRODUCTION +-------------------- + +1.1 PNG capabilities +------------------------ + +Supported color-types are: + + - grayscale + - grayscale + alpha-channel + - color palettes + - rgb + - rgb + alpha-channel + +Allowed bitdepths are depending on the color-type, but are in the range +of 1-bit (grayscale, which is b&w) upto 16-bits. + +Special features are: + + - interlacing (Adam-7) + - gamma-support + - transparency (a poor-man's alpha solution) + + +1.2 File naming +------------------- + +Where possible, the testfiles are 32x32 bits icons. This results in a still +reasonable size of the suite even with a large number of tests. The name +of each test-file reflects thetype in the following way: + + g04i2c08.png + || |||+---- bit-depth + || ||+----- color-type (descriptive) + || |+------ color-type (numerical) + || +------- interlaced or non-interlaced + |+--------- parameter of test (in this case gamma-value) + +---------- test feature (in this case gamma) + + +1.3 PNG formats +------------------- + +color-type: + 0g - grayscale + 2c - rgb color + 3p - paletted + 4a - grayscale + alpha channel + 6a - rgb color + alpha channel + +bit-depth: + 01 - with color-type 0, 3 + 02 - with color-type 0, 3 + 04 - with color-type 0, 3 + 08 - with color-type 0, 2, 3, 4, 6 + 16 - with color-type 0, 2, 4, 6 + +interlacing: + n - non-interlaced + i - interlaced + + +2. THE TESTS +----------------- + +2.1 Sizes +------------- + +These tests are there to check if your software handles pictures well, with +picture sizes that are not a multiple of 8. This is particularly important +with Adam-7 type interlacing. In the same way these tests check if pictures +size 1x1 and similar are ok. + + s01 - 1x1 pixel picture + s02 - 2x2 pixel picture + s03 - 3x3 pixel picture + s04 - 4x4 pixel picture + s05 - 5x5 pixel picture + s06 - 6x6 pixel picture + s07 - 7x7 pixel picture + s08 - 8x8 pixel picture + s09 - 9x9 pixel picture + s32 - 32x32 pixel picture + s33 - 33x33 pixel picture + s34 - 34x34 pixel picture + s35 - 35x35 pixel picture + s36 - 36x36 pixel picture + s37 - 37x37 pixel picture + s38 - 38x38 pixel picture + s39 - 39x39 pixel picture + s40 - 40x40 pixel picture + + +2.2 Background +------------------ + +When the PNG file contains a background chunck, this should be used for +pictures with alpha-channel or pictures with a transparency chunck. For +pictures without this background-chunk, but with alpha, this testset +assumes a black background. + +For the images in this test, the left-side should be 100% the background +color, where moving to the right the color should gradually become the +image pattern. + + bga - alpha + no background + bgw - alpha + white background + bgg - alpha + gray background + bgb - alpha + black background + bgy - alpha + yellow background + + +2.3 Transparency +-------------------- + +Transparency should be used together with a background chunk. To test the +combination of the two the latter 4 tests are there. How to handle pictures +with transparancy, but without a background, opinions can differ. Here we +use black, but especially in the case of paletted images, the normal color +would maybe even be better. + + tp0 - not transparent for reference + tp1 - transparent, but no background chunk + tbw - transparent + white background + tbg - transparent + gray background + tbb - transparent + black background + tby - transparent + yellow background + + +2.4 Gamma +------------- + +To test if your viewer handles gamma-correction, 6 testfiles are available. +They contain corrected color-ramps and a corresponding gamma-chunk with the +file-gamma value. These are created in such a way that when the viewer does +the gamma correction right, all 6 should be displayed identical. + +If they are different, probably the gamma correction is omitted. In that +case, have a look at the two right coloumns in the 6 pictures. The image +where those two look the same (when looked from far) reflects the gamma of +your system. However, because of the limited size of the image, you should +do more elaborate tests to determine your display gamma. + + g03 - file-gamma = 0.35, for display with gamma = 2.8 + g04 - file-gamma = 0.45, for display with gamma = 2.2 (PC) + g05 - file-gamma = 0.55, for display with gamma = 1.8 (Mac) + g07 - file-gamma = 0.70, for display with gamma = 1.4 + g10 - file-gamma = 1.00, for display with gamma = 1.0 (NeXT) + g25 - file-gamma = 2.50, for display with gamma = 0.4 + + +2.5 Filtering +----------------- + +PNG uses file-filtering, for optimal compression. Normally the type is of +filtering is adjusted to the contents of the picture, but here each file +has the same picture, with a different filtering. + + f0 - no filtering + f1 - sub filtering + f2 - up filtering + f3 - average filtering + f4 - paeth filtering + + +2.6 Additional palettes +--------------------------- + +Besides the normal use of paletted images, palette chunks can in combination +with true-color (and other) images also be used to select color lookup-tables +when the video system is of limited capabilities. The suggested palette chunk +is specially created for this purpose. + + pp - normal palette chunk + ps - suggested palette chunk + + +2.7 Ancillary chunks (under construction) +------------------------ + +To test the correct decoding of ancillary chunks, these test-files contain +one or more examples of these chunkcs. Depending on the type of chunk, a +number of typical values are selected to test. Unluckily, the testset can +not contain all combinations, because that would be an endless set. + +The significant bits are used in files with the next higher bit-depth. They +indicate howmany bits are valid. + + cs3 - 3 significant bits + cs5 - 5 significant bits + cs8 - 8 significant bits (reference) + cs3 - 13 significant bits + +For the physical pixel dimensions, the result of each decoding should be +a sqare picture. The first (cdf) image is an example of flat (horizontal) +pixels, where the pHYS chunk (x is 1 per unit, y = 4 per unit) must take +care of the correction. The second is just the other way round. The last +example uses the unit specifier, for 1000 pixels per meter. This should +result in a picture of 3.2 cm square. + + cdf - physical pixel dimensions, 8x32 flat pixels + cdh - physical pixel dimensions, 32x8 high pixels + cds - physical pixel dimensions, 8x8 square pixels + cdu - physical pixel dimensions, with unit-specifier + + ccw - primary chromaticities and white point + + ch1 - histogram 15 colors + ch2 - histogram 256 colors + + cm7 - modification time, 01-jan-1970 + cm9 - modification time, 31-dec-1999 + cm0 - modification time, 01-jan-2000 + +In the textual chunk, a number of the standard, and some non-standard +text items are included. + + ct0 - no textual data + ct1 - with textual data + ctz - with compressed textual data + + +2.8 Chunk ordering (still under construction) +---------------------- + +These testfiles will test the obligatory ordering relations between various +chunk types (not yet) as well as the number of data chunks used for the image. + + oi1 - mother image with 1 idat-chunk + oi2 - image with 2 idat-chunks + oi4 - image with 4 unequal sized idat-chunks + oi9 - all idat-chunks of length one + + +2.9 Compression level +------------------------- + +Here you will find a set of images compressed by zlib, ranging from level 0 +for no compression at maximum speed upto level 9 for maximum compression. + + z00 - zlib compression level 0 - none + z03 - zlib compression level 3 + z06 - zlib compression level 6 - default + z09 - zlib compression level 9 - maximum + + +2.10 Corrupted files (under construction) +----------------------- + +All these files are illegal. When decoding they should generate appropriate +error-messages. + + x00 - empty IDAT chunk + xcr - added cr bytes + xlf - added lf bytes + xc0 - color type 0 + xc9 - color type 9 + xd0 - bit-depth 0 + xd3 - bit-depth 3 + xd9 - bit-depth 99 + xcs - incorrect IDAT checksum + + +3. TEST FILES +------------------ + +For each of the tests listed above, one or more test-files are created. A +selection is made (for each test) for the color-type and bitdepth to be used +for the tests. Further for a number of tests, both a non-interlaced as well +as an interlaced version is available. + + +3.1 Basic format test files (non-interlaced) +------------------------------------------------ + + basn0g01 - black & white + basn0g02 - 2 bit (4 level) grayscale + basn0g04 - 4 bit (16 level) grayscale + basn0g08 - 8 bit (256 level) grayscale + basn0g16 - 16 bit (64k level) grayscale + basn2c08 - 3x8 bits rgb color + basn2c16 - 3x16 bits rgb color + basn3p01 - 1 bit (2 color) paletted + basn3p02 - 2 bit (4 color) paletted + basn3p04 - 4 bit (16 color) paletted + basn3p08 - 8 bit (256 color) paletted + basn4a08 - 8 bit grayscale + 8 bit alpha-channel + basn4a16 - 16 bit grayscale + 16 bit alpha-channel + basn6a08 - 3x8 bits rgb color + 8 bit alpha-channel + basn6a16 - 3x16 bits rgb color + 16 bit alpha-channel + + +3.2 Basic format test files (Adam-7 interlaced) +--------------------------------------------------- + + basi0g01 - black & white + basi0g02 - 2 bit (4 level) grayscale + basi0g04 - 4 bit (16 level) grayscale + basi0g08 - 8 bit (256 level) grayscale + basi0g16 - 16 bit (64k level) grayscale + basi2c08 - 3x8 bits rgb color + basi2c16 - 3x16 bits rgb color + basi3p01 - 1 bit (2 color) paletted + basi3p02 - 2 bit (4 color) paletted + basi3p04 - 4 bit (16 color) paletted + basi3p08 - 8 bit (256 color) paletted + basi4a08 - 8 bit grayscale + 8 bit alpha-channel + basi4a16 - 16 bit grayscale + 16 bit alpha-channel + basi6a08 - 3x8 bits rgb color + 8 bit alpha-channel + basi6a16 - 3x16 bits rgb color + 16 bit alpha-channel + + +3.3 Sizes test files +----------------------- + + s01n3p01 - 1x1 paletted file, no interlacing + s02n3p01 - 2x2 paletted file, no interlacing + s03n3p01 - 3x3 paletted file, no interlacing + s04n3p01 - 4x4 paletted file, no interlacing + s05n3p02 - 5x5 paletted file, no interlacing + s06n3p02 - 6x6 paletted file, no interlacing + s07n3p02 - 7x7 paletted file, no interlacing + s08n3p02 - 8x8 paletted file, no interlacing + s09n3p02 - 9x9 paletted file, no interlacing + s32n3p04 - 32x32 paletted file, no interlacing + s33n3p04 - 33x33 paletted file, no interlacing + s34n3p04 - 34x34 paletted file, no interlacing + s35n3p04 - 35x35 paletted file, no interlacing + s36n3p04 - 36x36 paletted file, no interlacing + s37n3p04 - 37x37 paletted file, no interlacing + s38n3p04 - 38x38 paletted file, no interlacing + s39n3p04 - 39x39 paletted file, no interlacing + s40n3p04 - 40x40 paletted file, no interlacing + + s01i3p01 - 1x1 paletted file, interlaced + s02i3p01 - 2x2 paletted file, interlaced + s03i3p01 - 3x3 paletted file, interlaced + s04i3p01 - 4x4 paletted file, interlaced + s05i3p02 - 5x5 paletted file, interlaced + s06i3p02 - 6x6 paletted file, interlaced + s07i3p02 - 7x7 paletted file, interlaced + s08i3p02 - 8x8 paletted file, interlaced + s09i3p02 - 9x9 paletted file, interlaced + s32i3p04 - 32x32 paletted file, interlaced + s33i3p04 - 33x33 paletted file, interlaced + s34i3p04 - 34x34 paletted file, interlaced + s35i3p04 - 35x35 paletted file, interlaced + s36i3p04 - 36x36 paletted file, interlaced + s37i3p04 - 37x37 paletted file, interlaced + s38i3p04 - 38x38 paletted file, interlaced + s39i3p04 - 39x39 paletted file, interlaced + s40i3p04 - 40x40 paletted file, interlaced + + +3.4 Background test files (with alpha) +------------------------------------------ + + bgai4a08 - 8 bit grayscale, alpha, no background chunk, interlaced + bgai4a16 - 16 bit grayscale, alpha, no background chunk, interlaced + bgan6a08 - 3x8 bits rgb color, alpha, no background chunk + bgan6a16 - 3x16 bits rgb color, alpha, no background chunk + + bgbn4a08 - 8 bit grayscale, alpha, black background chunk + bggn4a16 - 16 bit grayscale, alpha, gray background chunk + bgwn6a08 - 3x8 bits rgb color, alpha, white background chunk + bgyn6a16 - 3x16 bits rgb color, alpha, yellow background chunk + + +3.5 Transparency (and background) test files +------------------------------------------------ + + tp0n1g08 - not transparent for reference (logo on gray) + tbbn1g04 - transparent, black background chunk + tbwn1g16 - transparent, white background chunk + tp0n2c08 - not transparent for reference (logo on gray) + tbrn2c08 - transparent, red background chunk + tbgn2c16 - transparent, green background chunk + tbbn2c16 - transparent, blue background chunk + tp0n3p08 - not transparent for reference (logo on gray) + tp1n3p08 - transparent, but no background chunk + tbbn3p08 - transparent, black background chunk + tbgn3p08 - transparent, light-gray background chunk + tbwn3p08 - transparent, white background chunk + tbyn3p08 - transparent, yellow background chunk + + +3.6 Gamma test files +------------------------ + + g03n0g16 - grayscale, file-gamma = 0.35 + g04n0g16 - grayscale, file-gamma = 0.45 + g05n0g16 - grayscale, file-gamma = 0.55 + g07n0g16 - grayscale, file-gamma = 0.70 + g10n0g16 - grayscale, file-gamma = 1.00 + g25n0g16 - grayscale, file-gamma = 2.50 + g03n2c08 - color, file-gamma = 0.35 + g04n2c08 - color, file-gamma = 0.45 + g05n2c08 - color, file-gamma = 0.55 + g07n2c08 - color, file-gamma = 0.70 + g10n2c08 - color, file-gamma = 1.00 + g25n2c08 - color, file-gamma = 2.50 + g03n3p04 - paletted, file-gamma = 0.35 + g04n3p04 - paletted, file-gamma = 0.45 + g05n3p04 - paletted, file-gamma = 0.55 + g07n3p04 - paletted, file-gamma = 0.70 + g10n3p04 - paletted, file-gamma = 1.00 + g25n3p04 - paletted, file-gamma = 2.50 + + +3.7 Filtering test files +---------------------------- + + f00n0g08 - grayscale, no interlacing, filter-type 0 + f01n0g08 - grayscale, no interlacing, filter-type 1 + f02n0g08 - grayscale, no interlacing, filter-type 2 + f03n0g08 - grayscale, no interlacing, filter-type 3 + f04n0g08 - grayscale, no interlacing, filter-type 4 + f00n2c08 - color, no interlacing, filter-type 0 + f01n2c08 - color, no interlacing, filter-type 1 + f02n2c08 - color, no interlacing, filter-type 2 + f03n2c08 - color, no interlacing, filter-type 3 + f04n2c08 - color, no interlacing, filter-type 4 + + +3.8 Additional palette chunk test files +------------------------------------------- + + pp0n2c16 - six-cube palette-chunk in true-color image + pp0n6a08 - six-cube palette-chunk in true-color+alpha image + ps1n0g08 - six-cube suggested palette (1 byte) in grayscale image + ps1n2c16 - six-cube suggested palette (1 byte) in true-color image + ps2n0g08 - six-cube suggested palette (2 bytes) in grayscale image + ps2n2c16 - six-cube suggested palette (2 bytes) in true-color image + + +3.9 Ancillary chunks test files +----------------------------------- + + cs5n2c08 - color, 5 significant bits + cs8n2c08 - color, 8 significant bits (reference) + cs3n2c16 - color, 13 significant bits + cs3n3p08 - paletted, 3 significant bits + cs5n3p08 - paletted, 5 significant bits + cs8n3p08 - paletted, 8 significant bits (reference) + + cdfn2c08 - physical pixel dimensions, 8x32 flat pixels + cdhn2c08 - physical pixel dimensions, 32x8 high pixels + cdsn2c08 - physical pixel dimensions, 8x8 square pixels + cdun2c08 - physical pixel dimensions, 1000 pixels per 1 meter + + ccwn2c08 - chroma chunk w:0.3127,0.3290 r:0.64,0.33 g:0.30,0.60 b:0.15,0.06 + ccwn3p08 - chroma chunk w:0.3127,0.3290 r:0.64,0.33 g:0.30,0.60 b:0.15,0.06 + + ch1n3p04 - histogram 15 colors + ch2n3p08 - histogram 256 colors + + cm7n0g04 - modification time, 01-jan-1970 00:00:00 + cm9n0g04 - modification time, 31-dec-1999 23:59:59 + cm0n0g04 - modification time, 01-jan-2000 12:34:56 + + ct0n0g04 - no textual data + ct1n0g04 - with textual data + ctzn0g04 - with compressed textual data + + + +3.10 Chunk ordering +---------------------- + + oi1n0g16 - grayscale mother image with 1 idat-chunk + oi2n0g16 - grayscale image with 2 idat-chunks + oi4n0g16 - grayscale image with 4 unequal sized idat-chunks + oi9n0g16 - grayscale image with all idat-chunks length one + oi1n2c16 - color mother image with 1 idat-chunk + oi2n2c16 - color image with 2 idat-chunks + oi4n2c16 - color image with 4 unequal sized idat-chunks + oi9n2c16 - color image with all idat-chunks length one + + + +3.11 Compression level +------------------------- + + z00n2c08 - color, no interlacing, compression level 0 (none) + z03n2c08 - color, no interlacing, compression level 3 + z06n2c08 - color, no interlacing, compression level 6 (default) + z09n2c08 - color, no interlacing, compression level 9 (maximum) + + + +3.12 Currupted files +----------------------- + + x00n0g01 - empty 0x0 grayscale file + xcrn0g04 - added cr bytes + xlfn0g04 - added lf bytes + xc0n0c08 - color type 0 + xc9n0c08 - color type 9 + xd0n2c00 - bit-depth 0 + xd3n2c03 - bit-depth 3 + xd9n2c99 - bit-depth 99 + xcsn2c08 - incorrect IDAT checksum + + +-------- + (c) Willem van Schaik + willem@schaik.com + Singapore, October 1996 diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite_logo.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite_logo.png new file mode 100644 index 000000000..205460d82 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pngsuite_logo.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n2c16.png new file mode 100644 index 000000000..8f2aad733 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n6a08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n6a08.png new file mode 100644 index 000000000..4ed7a30e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/pp0n6a08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n0g08.png new file mode 100644 index 000000000..2053df2ba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n2c16.png new file mode 100644 index 000000000..b03ecfc66 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps1n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n0g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n0g08.png new file mode 100644 index 000000000..beeab8ff3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n0g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n2c16.png new file mode 100644 index 000000000..c256f9091 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/ps2n2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01i3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01i3p01.png new file mode 100644 index 000000000..6c0fad1fc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01i3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01n3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01n3p01.png new file mode 100644 index 000000000..cb2c8c782 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s01n3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02i3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02i3p01.png new file mode 100644 index 000000000..2defaed91 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02i3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02n3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02n3p01.png new file mode 100644 index 000000000..2b1b66964 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s02n3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03i3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03i3p01.png new file mode 100644 index 000000000..c23fdc463 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03i3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03n3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03n3p01.png new file mode 100644 index 000000000..6d96ee4f8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s03n3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04i3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04i3p01.png new file mode 100644 index 000000000..0e710c2c3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04i3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04n3p01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04n3p01.png new file mode 100644 index 000000000..956396c45 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s04n3p01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05i3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05i3p02.png new file mode 100644 index 000000000..d14cbd351 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05i3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05n3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05n3p02.png new file mode 100644 index 000000000..bf940f057 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s05n3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06i3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06i3p02.png new file mode 100644 index 000000000..456ada320 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06i3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06n3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06n3p02.png new file mode 100644 index 000000000..501064dc2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s06n3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07i3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07i3p02.png new file mode 100644 index 000000000..44b66bab9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07i3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07n3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07n3p02.png new file mode 100644 index 000000000..6a582593d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s07n3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08i3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08i3p02.png new file mode 100644 index 000000000..acf74f3fc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08i3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08n3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08n3p02.png new file mode 100644 index 000000000..b7094e1b4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s08n3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09i3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09i3p02.png new file mode 100644 index 000000000..0bfae8e45 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09i3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09n3p02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09n3p02.png new file mode 100644 index 000000000..711ab8245 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s09n3p02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32i3p04.png new file mode 100644 index 000000000..0841910b7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32n3p04.png new file mode 100644 index 000000000..fa58e3e3f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s32n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33i3p04.png new file mode 100644 index 000000000..ab0dc14ab Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33n3p04.png new file mode 100644 index 000000000..764f1a3dc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s33n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34i3p04.png new file mode 100644 index 000000000..bd99039be Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34n3p04.png new file mode 100644 index 000000000..9cbc68b3b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s34n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35i3p04.png new file mode 100644 index 000000000..e2a5e0a65 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35n3p04.png new file mode 100644 index 000000000..90b892eba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s35n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36i3p04.png new file mode 100644 index 000000000..eb61b6f9a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36n3p04.png new file mode 100644 index 000000000..b38d17977 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s36n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37i3p04.png new file mode 100644 index 000000000..6e2b1e9b7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37n3p04.png new file mode 100644 index 000000000..4d3054da5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s37n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38i3p04.png new file mode 100644 index 000000000..a0a8a140a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38n3p04.png new file mode 100644 index 000000000..1233ed048 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s38n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39i3p04.png new file mode 100644 index 000000000..04fee93ea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39n3p04.png new file mode 100644 index 000000000..c750100d5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s39n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40i3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40i3p04.png new file mode 100644 index 000000000..68f358b82 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40i3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40n3p04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40n3p04.png new file mode 100644 index 000000000..864b6b967 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/s40n3p04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn1g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn1g04.png new file mode 100644 index 000000000..fc8002053 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn1g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn2c16.png new file mode 100644 index 000000000..5abfbbb3a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn3p08.png new file mode 100644 index 000000000..4210d1683 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbbn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn2c16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn2c16.png new file mode 100644 index 000000000..236c81dcf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn2c16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn3p08.png new file mode 100644 index 000000000..42db2325b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbgn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbrn2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbrn2c08.png new file mode 100644 index 000000000..8c214746d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbrn2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn1g16.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn1g16.png new file mode 100644 index 000000000..dba2cbb6c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn1g16.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn3p08.png new file mode 100644 index 000000000..7922135aa Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbwn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbyn3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbyn3p08.png new file mode 100644 index 000000000..5b2c6cbba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tbyn3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n1g08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n1g08.png new file mode 100644 index 000000000..caad31dea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n1g08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n2c08.png new file mode 100644 index 000000000..f26be4467 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n3p08.png new file mode 100644 index 000000000..4d6cf9e44 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp0n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp1n3p08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp1n3p08.png new file mode 100644 index 000000000..6c5fd6ec3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/tp1n3p08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/x00n0g01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/x00n0g01.png new file mode 100644 index 000000000..db3a5fda7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/x00n0g01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xcrn0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xcrn0g04.png new file mode 100644 index 000000000..5bce9f3ad Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xcrn0g04.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xlfn0g04.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xlfn0g04.png new file mode 100644 index 000000000..1fd104ba6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/xlfn0g04.png @@ -0,0 +1,13 @@ +‰PNG + + + + + +IHDR “áÈ)ÈIDATxœ]ÑÁ +Â0 P*@ð¡#° + +#TâÈ10lPF`Ø F=•ŸÄIQâ*çÅuí”`%qk +Hžñšˆ©ñ´€m÷Íüµàߟ Ñ=,¸fìOK + +ç ÐtŽÀ(Èïä’צíF ;èPº€¯¾{xpç]9‡/p*$(ì*éyìÕƒ ×þÚéçè@÷C¼  cÔqž‹NÛU#„)11·.räðfä0°ägh(¥týÙÂEøÿ‰kIEND®B`‚ \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z00n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z00n2c08.png new file mode 100644 index 000000000..7669eb838 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z00n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z03n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z03n2c08.png new file mode 100644 index 000000000..bfb10de8d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z03n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z06n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z06n2c08.png new file mode 100644 index 000000000..b90ebc10f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z06n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z09n2c08.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z09n2c08.png new file mode 100644 index 000000000..5f191a78e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/PngSuite/z09n2c08.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/SVG-1.1-monolithic-fixed.dtd b/Demo-Samples/W3C_SVG_11_TestSuite/images/SVG-1.1-monolithic-fixed.dtd new file mode 100644 index 000000000..7ddd73b9b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/SVG-1.1-monolithic-fixed.dtd @@ -0,0 +1,1622 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/SVGImageTest.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/SVGImageTest.svg new file mode 100644 index 000000000..f20c9d804 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/SVGImageTest.svg @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVGImageTest.svg + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-add-BE-09.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-add-BE-09.svg new file mode 100644 index 000000000..70234568e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-add-BE-09.svg @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test 'additive' and 'accumulate' attributes. + + +Eight animations have been defined. +For each animation, ruler lines and text are provided to help show +what the correct behavior is. +The red text shows the values for attributes 'additive' and 'accumulate'. +The black text and ruler lines help show the change in height of +the rectangles over time. + + +In the first row, a single animation which changes the height of the rectangle +is defined for each picture. +The height changes from 10 to 25, and the animation repeats (total of two loops). +The four pictures show the effect with the four possible combinations of +'additive' (either 'replace' or 'sum') and 'accumulate' (either 'none' or 'sum'). + + +In the second row, two identical animations change the height of the rectangle, +with each animation exactly the same as the corresponding animation in the first row. +Again, the four pictures show the effect with the four possible combinations of +'additive' (either 'replace' or 'sum') and 'accumulate' (either 'none' or 'sum'). +Because two animations are animating the height, the effects of 'additive' and +'accumulate' are sometimes different than when there is only a single animation. + + + + + + animation-add-BE-09 + Test 'additive' and 'accumulate' attributes. + + + + + Test 'additive' and 'accumulate' attributes. + + + 0,4 sec. + + 4,8+ sec. + + + + + additive='replace' + accumulate='none' + + + 0,4 sec. + + 4,8+ sec. + + + + + additive='sum' + accumulate='none' + + + 0 sec. + + 4 sec. + + 4 sec. + + 8+ sec. + + + + + additive='replace' + accumulate='sum' + + + 0 sec. + + 4 sec. + + 4 sec. + + 8+ sec. + + + + + additive='sum' + accumulate='sum' + + + 0,4 sec. + + 4,8+ sec. + + + + + + additive='replace' + accumulate='none' + + + 0,4 sec. + + 4,8+ sec. + + + + + + additive='sum' + accumulate='none' + + + 0 sec. + + 4 sec. + + 4 sec. + + 8+ sec. + + + + + + additive='replace' + accumulate='sum' + + + 0 sec. + + 4 sec. + + 4 sec. + + 8+ sec. + + + + + + additive='sum' + accumulate='sum' + + + + + + + + + + Scalable Vector Graphics (SVG) Conformance Suite + + Copyright 2000 W3C. All Rights Reserved. + + animation-add-BE-09 + $Revision: 1.1 $ + Release 3.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image1.svg new file mode 100644 index 000000000..0651f69db --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image1.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + Image 1 + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image2.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image2.svg new file mode 100644 index 000000000..d10ee806a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image2.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + Image 2 + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image3.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image3.svg new file mode 100644 index 000000000..408a4793d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/animation-extRef-image3.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + Image 3 + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/black10x10.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/black10x10.png new file mode 100644 index 000000000..2e95303a9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/black10x10.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/blue1x1.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue1x1.png new file mode 100644 index 000000000..648583295 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue1x1.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.png new file mode 100644 index 000000000..21955dab6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.ppm b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.ppm new file mode 100644 index 000000000..1cb38746c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/blue_10x10.ppm @@ -0,0 +1,23 @@ +P3 +10 10 +255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 255 diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bluesquidj.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bluesquidj.png new file mode 100644 index 000000000..9f5c55878 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bluesquidj.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-small.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-small.png new file mode 100644 index 000000000..2f92cc615 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-small.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-white.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-white.png new file mode 100644 index 000000000..d4c4abfd8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet-white.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet.png new file mode 100644 index 000000000..e1495d984 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bullet.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap.png new file mode 100644 index 000000000..1ac02a8da Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap2.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap2.png new file mode 100644 index 000000000..1609323d4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap2.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap3.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap3.png new file mode 100644 index 000000000..646f5de57 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/bumpMap3.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/case-insensitivity.css b/Demo-Samples/W3C_SVG_11_TestSuite/images/case-insensitivity.css new file mode 100644 index 000000000..ce508ff8d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/case-insensitivity.css @@ -0,0 +1,2 @@ +#d {fill: red } +#d {FiLl: oRaNgE } diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/changeColor.ICM b/Demo-Samples/W3C_SVG_11_TestSuite/images/changeColor.ICM new file mode 100644 index 000000000..dc99698e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/changeColor.ICM differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/colorprof.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/colorprof.png new file mode 100644 index 000000000..c03ab9cf3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/colorprof.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/convolveImage.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/convolveImage.png new file mode 100644 index 000000000..f8fb85230 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/convolveImage.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.png new file mode 100644 index 000000000..4a075c717 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.svg new file mode 100644 index 000000000..fbb57ce3d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/coords-units-01-f.svg @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Verify the conversion processing of percentage and fraction values relative to +object bounding boxes. This is used when defining linear and radial gradients +as well as patterns. + + +The test validates conversion for coordinates, width, height and length. The first +test defines three corresponding linear gradients, which specify coordinates +using percentages for one, fractions for the second and user coordinates for the +third. The second test defines three corresponding radial gradients, which specify +a length (radius) using percentages for the first, fractions for the second and +user space for the third. Finally, the third test defines three corresponding patterns, +which specify their width and height using percentages for the first, fractions for the +second and user space coordinates for the last one. + + +The rendered image should match the reference image. Also, the text may +show minor differences, per CSS2 rules for font selection and matching. + + +The test also assumes that linear and radial gradients, +as well as patterns are implemented. + + + + coords-units-01-f + This test validates the processing rules for converting coordinates and length defined in fractions of the current object's bounding box to user space coordinates and length. Note that this test assumes that linear and radial gradients, as well as patterns are implemented. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative coordinates (percentage and fraction) + + + + + + + Percentage + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative length (percentage and fraction) + + + + + Percent. + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative width/height (percentage and fraction) + + + + + Percentage + Fraction + User Space + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + coords-units-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/copyright-documents-19990405.html b/Demo-Samples/W3C_SVG_11_TestSuite/images/copyright-documents-19990405.html new file mode 100644 index 000000000..e65f61f9c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/copyright-documents-19990405.html @@ -0,0 +1,89 @@ + + + + + +DOCUMENT NOTICE + + + + + +

W3C® DOCUMENT NOTICE AND LICENSE

+ +

Copyright © 1994-2000 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en +Automatique, Keio University). All Rights +Reserved.
+http://www.w3.org/Consortium/Legal/

+ +

Public documents on the W3C site are provided by the copyright holders under the +following license. The software or Document Type Definitions (DTDs) associated with W3C +specifications are governed by the Software Notice. By +using and/or copying this document, or the W3C document from which this statement is +linked, you (the licensee) agree that you have read, understood, and will comply with the +following terms and conditions:

+ +

Permission to use, copy, and distribute the contents of this document, or the W3C +document from which this statement is linked, in any medium for any purpose and without +fee or royalty is hereby granted, provided that you include the following on ALL +copies of the document, or portions thereof, that you use: + +

    +
  1. A link or URL to the original W3C document.
  2. +
  3. The pre-existing copyright notice of the original author, or if it doesn't exist, a + notice of the form: "Copyright © [$date-of-document] World + Wide Web Consortium, (Massachusetts Institute of + Technology, Institut National de Recherche en + Informatique et en Automatique, Keio University). + All Rights Reserved. http://www.w3.org/Consortium/Legal/" (Hypertext is preferred, + but a textual representation is permitted.)
  4. +
  5. If it exists, the STATUS of the W3C document.
  6. +
+ +

When space permits, inclusion of the full text of this NOTICE should be +provided. We request that authorship attribution be provided in any software, documents, +or other items or products that you create pursuant to the implementation of the contents +of this document, or any portion thereof.

+ +

No right to create modifications or derivatives of W3C documents is granted pursuant to +this license. However, if additional requirements (documented in the Copyright FAQ) are satisfied, the right to create modifications or +derivatives is sometimes granted by the W3C to individuals complying with those +requirements.

+ +

THIS DOCUMENT IS PROVIDED "AS IS," AND COPYRIGHT HOLDERS MAKE NO +REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR +TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE SUITABLE FOR ANY PURPOSE; NOR THAT THE +IMPLEMENTATION OF SUCH CONTENTS WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, +TRADEMARKS OR OTHER RIGHTS.

+ +

COPYRIGHT HOLDERS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL +DAMAGES ARISING OUT OF ANY USE OF THE DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE +CONTENTS THEREOF.

+ +

The name and trademarks of copyright holders may NOT be used in advertising or +publicity pertaining to this document or its contents without specific, written prior +permission. Title to copyright in this document will at all times remain with copyright +holders.

+ +

----------------------------------------------------------------------------

+ +

This formulation of W3C's notice and license became active on April 05 1999 so as to +account for the treatment of DTDs, schema's and bindings. See the older formulation for the policy prior to +this date. Please see our Copyright FAQ for common questions +about using materials from our site, including specific terms and conditions for packages +like libwww, Amaya, and Jigsaw. Other questions about this notice can be directed to site-policy@w3.org.

+ +
+ webmaster
+ (last updated by reagle on 1999/04/99.) +
+ + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/diagarrow.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/diagarrow.png new file mode 100644 index 000000000..4cd284e81 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/diagarrow.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/empty.js b/Demo-Samples/W3C_SVG_11_TestSuite/images/empty.js new file mode 100644 index 000000000..e69de29bb diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/ext-TestComic.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/ext-TestComic.svg new file mode 100644 index 000000000..84e207350 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/ext-TestComic.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/f.js b/Demo-Samples/W3C_SVG_11_TestSuite/images/f.js new file mode 100644 index 000000000..a19096b57 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/f.js @@ -0,0 +1 @@ +f() diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/fillChangeColor.ICM b/Demo-Samples/W3C_SVG_11_TestSuite/images/fillChangeColor.ICM new file mode 100644 index 000000000..dc99698e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/fillChangeColor.ICM differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-blend-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-blend-01-f.svg new file mode 100644 index 000000000..bd56639d3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-blend-01-f.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verify correct operation of the five compositing modes + of the feBlend filter primitive. Five text strings + blended into a gradient, with one text string for each of + the five feBlend modes. The string indicates the blend + mode. + + + The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). + + + The test uses a nested 'svg' element, 'text' element, + the 'enable-background' property, and linear gradients.as + well as basic fill (solid primary colors), stroke (solid + primary colors with stroke-width lines), font-family + (Helvetica) and font-size properties. + + + + filters-blend-01-f + Overall filter effects test case. Extracted from example filters00 in the March 3, 2000 spec. + + + + + + + Examples of the five + feBlend modes. + Five text strings blended + into a gradient, with one + text string for each of the + five feBlend modes. The + string indicates the blend + mode. + + + + Example feBlend - Examples of feBlend modes + Five text strings blended into a gradient, with one text string for each of the five feBlend modes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Normal + Multiply + Screen + Darken + Lighten + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-blend-01 + $Revision: 1.1 $ + Release 1.0 + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-color-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-color-01-f.svg new file mode 100644 index 000000000..b70ca61c4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-color-01-f.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test which verifies the basic facilities of + feColorMatrix. + + + This test uses the following elements : a nested + <svg> with a viewBox attribute, <linearGradient>, + <filter>, <feColorMatrix>, <feComposite> + + + The test case shows five rectangles filled with a + gradient showing the effects of feColorMatrix: an + unfiltered rectangle acting as a reference, use of the + feColorMatrix matrix option to convert to grayscale, + use of the feColorMatrix saturate option, use of the + feColorMatrix hueRotate option, and use of the + feColorMatrix luminanceToAlpha option. + + + The test is somewhat self-explanatory as the strings + document the type of feColorMatrix operation that is + being used. + + + + filters-color-01-f + Test which verifies the basic facilities of feColorMatrix. + + + + + + Example feColorMatrix - Examples of feColorMatrix operations + Five rectangles filled with a gradient showing the effects of feColorMatrix: an unfiltered rectangle acting as a reference, use of the feColorMatrix matrix option to convert to grayscale, use of the feColorMatrix saturate option, use of the feColorMatrix hueRotate option, and use of the feColorMatrix luminanceToAlpha option. + + + + + + + + + + + + + + + + + + + + + + + + + Unfiltered + + type="matrix" (grayscale matrix) + + type="saturate" values=".4" + + type="hueRotate" values="90" + + type="luminanceToAlpha" + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-color-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-composite-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-composite-01-f.svg new file mode 100644 index 000000000..ca1433bf8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-composite-01-f.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test which verifies the basic facilities of feComposite. + + + This test uses the following elements: <path>, <use>, + <linearGradient>, <filter> with, an enable-background + attribute, <feFlood>, <feComposite>, <feMerge> + + + The test case shows six pairs of overlapping triangles + depicting the six different feComposite operators. The + first row shows compositing when both triangles have + opacity=1. The second row shows compositing when both + triangles have opacity=.5. The six columns illustrate the + six types of compositing operations. + + + + filters-composite-01-f + Test which verifies the basic facilities of feComposite. + + + + + Example feComposite - Examples of feComposite operations + Six pairs of overlapping triangles depicting the six different feComposite operators. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + opacity 1.0 + opacity 0.5 + + + + + + + + over + + + + + + + + + in + + + + + + + + + out + + + + + + + + + atop + + + + + + + + + xor + + + + + + + + + arithmetic + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-composite-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-comptran-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-comptran-01-f.svg new file mode 100644 index 000000000..3fbbf7371 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-comptran-01-f.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test which verifies the basic facilities of + feComponentTransfer. + + + This test uses the following elements : a nested <svg> + with a viewBox attribute, <linearGradient>, <filter>, + <feComponentTransfer> + + + The test case shows four rectangles filled with a + gradient showing the effects of feComponentTransfer: an + identity function acting as a reference, use of the + feComponentTransfer table option, use of the + feComponentTransfer linear option, and use of the + feComponentTransfer gamma option. + + + The test is somewhat self-explanatory as the strings + document the type of feComponentTransfer operation that + is being used. + + + + filters-comptran-01-f + Test which verifies the basic facilities of feComponentTransfer. + + + + + + Example feComponentTransfer - Examples of feComponentTransfer operations + Four rectangles filled with a gradient showing the effects of feComponentTransfer: an identity function acting as a reference, use of the feComponentTransfer table option, use of the feComponentTransfer linear option, and use of the feComponentTransfer gamma option. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type="identity" + + type="table" + + type="linear" slope=".5" intercepts:.25/0/.5 + + type="gamma" amplitude="2" exponents:5/3/1 + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-comptran-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.includeimage.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.includeimage.png new file mode 100644 index 000000000..f8fb85230 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.includeimage.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.svg new file mode 100644 index 000000000..927e9927f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-conv-01-f.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test which verifies the basic facilities of + feConvolveMatrix. + + + This test defines six filters that exercise traditional + convolutions: uniform blur, vertical and horizontal + blurs, edge detection, embossing and sharpening. Note + that the edge detection filter produces a fully + transparent image because the alpha chanel is convolved + and produces 0 values. + + + + filters-conv-01-f + Test which verifies the basic facilities of feConvolveMatrix. + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blur (3x3) + + + + Edge Detection (3x3) + + + + Sharpening (3x3) + + + + Embossing (3x3) + + + + Horizontal blur (3x1) + + + + Vertical blur (1x3) + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-conv-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-diffuse-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-diffuse-01-f.svg new file mode 100644 index 000000000..c08fbccc1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-diffuse-01-f.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verify the basic operation of the feDiffuseLighting + element. The test shows three rows of 3 images. Each + rows tests a different aspect of the filter and shows + the result of the filtering operation. + + + The first row shows the result of varying the + surfaceScale attribute. The second row shows the result + of varying the diffuse constant (kd) attribute. The last + row shows the result of varying the lighting-color + property. + + + The rendered picture should match the reference image. + + + + filters-diffuse-01-f + Validates operation of the feDiffuseLighting filter + + + + + + Filters: feDiffuseLighting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for surfaceScale: 1, 10 and -10 + + + + + + + Various values for diffuseConstants: 0, 1 and 2 + + + + + + + Various values for lighting color: red, yellow and blue + + + + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-diffuse-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-example-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-example-01-f.svg new file mode 100644 index 000000000..49437325f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/filters-example-01-f.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verify that a typical usage of filtering is operation. + This test case creates a 3D lightiing effect and requires + that several filters are working: feGaussianBlur, feOffset, + feSpecularLighting, feComposite and feMerge. The graphic + consisting of the string "SVG" sitting on top of oval + filled in red and surrounded by an oval outlined in red. + + + The rendered picture should match the reference image + exactly, except for possible variations in the labelling + text (per CSS2 rules). + + + The test uses a nested 'svg' element, 'rect' element, + 'path' element, as well as basic fill (solid primary + colors), stroke (solid primary colors with stroke-width + lines), font-family (Helvetica) and font-size properties. + + + + filters-example-01-f + Overall filter effects test case. Extracted from example filters00 in the March 3, 2000 spec. + + + + + + A single filter that uses a combination of filter primitives. You should see + a gray rectangle. Inside, there is an outer ring and an inner button with + "SVG" on it, both in red with a 3D appearance and a lighting effect. + + + + + Example filters01.svg - introducing filter effects + An example which combines multiple filter primitives to produce a 3D lighting effect on a graphic consisting of the string "SVG" sitting on top of oval filled in red and surrounded by an oval outlined in red. + + + + + + + + + + + + + + + + + + + + + + SVG + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + filters-example-01 + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints.jpg new file mode 100644 index 000000000..3ae7a69d3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints2.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints2.jpg new file mode 100644 index 000000000..560834812 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/footprints2.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/galpha.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/galpha.png new file mode 100644 index 000000000..0698cdf83 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/galpha.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030.png new file mode 100644 index 000000000..904c9721b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030b.png new file mode 100644 index 000000000..90e718479 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam030b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045.png new file mode 100644 index 000000000..b649a8a54 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045b.png new file mode 100644 index 000000000..9885e3392 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam045b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056.png new file mode 100644 index 000000000..e5f959dc9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056b.png new file mode 100644 index 000000000..32af5b3a9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam056b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100.png new file mode 100644 index 000000000..6c7ba5f1e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100b.png new file mode 100644 index 000000000..a3e91e0ec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam100b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200.png new file mode 100644 index 000000000..daa20fcbc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200b.png new file mode 100644 index 000000000..2c337d8ff Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/gam200b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/green1x1.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/green1x1.png new file mode 100644 index 000000000..ba7098723 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/green1x1.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/greentopbutton.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/greentopbutton.jpg new file mode 100644 index 000000000..be33a3ce9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/greentopbutton.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/happysmiley.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/happysmiley.svg new file mode 100644 index 000000000..ea4f73da7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/happysmiley.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/image.png new file mode 100644 index 000000000..01b579247 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.jpg new file mode 100644 index 000000000..40c1b2587 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.png new file mode 100644 index 000000000..fa37f6d68 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image1_b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1_b.png new file mode 100644 index 000000000..019702262 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image1_b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.jpg new file mode 100644 index 000000000..b9cf86297 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.png new file mode 100644 index 000000000..0b8464927 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/image2_b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/inline2.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/inline2.png new file mode 100644 index 000000000..0abec528f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/inline2.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-dom-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-dom-01-f.svg new file mode 100644 index 000000000..90d6ee5ac --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-dom-01-f.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Verify basic support for DOM event listener registration. The root svg element + has an onload handler where a click event listener is registered on group element 'Start Button'. + + + If UI events listener registration is supported (and UI events), + when the user clicks on the button a text node is inserted reading "UI Event Listeners supported". + + + At the end of the test, the start test button in changed to pink, + and the click event listener is removed from the the start button. + + + Subsequent clicks on the start button should cause no effect if + the event listener has been removed successfully. + If additional lines of text appear in the document that say "UI Event Listeners supported", + then the implementation has not successfully removed the event listener. + + + After clicking at least once on the button, + the rendered image should be exactly as the reference image, except for + differences in text display. + + + + + + interact-dom-01-f + Checks if DOM/ECMA Script binding is supported. Checks that the DOM API +supports event listener registration/unregistration. + + + + + + + + + + + + + Start Test + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + interact-dom-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-02-b-targ.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-02-b-targ.svg new file mode 100644 index 000000000..a2eba47cd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-02-b-targ.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + interact-order-02-b + + File that just serves as hyperlink target for test case + interact-order-02-b.svg. + + + + + + Hyperlink target for + + + interact-order-02-b.svg + + + + + + + + + + Click to hyperlink back to + + + interact-order-02-b.svg + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-03-b-targ.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-03-b-targ.svg new file mode 100644 index 000000000..b930e7052 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/interact-order-03-b-targ.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + interact-order-03-b + + File that just serves as hyperlink target for test case + interact-order-03-b.svg. + + + + + + Hyperlink target for + + + interact-order-03-b.svg + + + + + + + + + + Click to hyperlink back to + + + interact-order-03-b.svg + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/leftarrow.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/leftarrow.png new file mode 100644 index 000000000..07fb487be Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/leftarrow.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/level1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/level1.svg new file mode 100644 index 000000000..4157b9ecd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/level1.svg @@ -0,0 +1,3 @@ + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/level2.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/level2.svg new file mode 100644 index 000000000..f8f7a7993 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/level2.svg @@ -0,0 +1,3 @@ + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-b.svg new file mode 100644 index 000000000..335673215 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-b.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + +

+ Verify the capability to handle links to 'view' elements, and the + permissible attributes on those elements. All of the links in this + test case are internal, i.e., to 'view' elements in the same SVG file. +

+

+ This test is identical to linking-uri-02-b except that the links there are external. +

+

+ In the four quadrants of the initial picture are four graphical objects. + Clockwise from upper right, they are + a purple rectangle, blue ellipse, green polygon (pentagon), and yellow + circle. Each is labelled and tightly boxes with a rectangular frame. + These are identical to their counterparts in linking-uri-01-b.svg, in which + file each has an associated 'view' element, with attributes + per the labels in the initial picture. +

+

+ In the center is a gray box with four lines of text, each of which says + "Go to" followed by Rectangle, Ellipse, Polygon, and Circle, respectively. + Each of these is contained within an 'a' element, whose xlink:href names + the respective 'view' element of the respective graphical object. +

+

+ There are several reference images associated with this test case. The first + illustrates the correct initial state of the rendered SVG file, which should + also be the correct picture after the Rectangle link is executed. + The second, third, and fourth illustrate the correct images as described + above after respectively the Ellipse, Polygon, and Circle links are activated. + (Note. This harness does not yet provide access to multiple PNGs; the PNG for the + initial view is shown.) +

+

+ The test uses the 'rect', 'circle', 'ellipse', and 'polygon' elements, + as well as basic fill (solid simple colors), + stroke (black and colored 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ In turn, activate each of the "Rectangle", "Ellipse", "Polygon" and "Circle" links + in the gray box in the middle of the document, navigating back (for example with + the Back button if in a browser) after activating each one. +

+
+ +

+ The test is passed if all of the sub-tests have the correct behavior: +

+
    +
  • After activating the "Rectangle" link, the whole of the linking-uri-01-b.svg + document must be displayed; that is, there will be no visual change. (The + 'view' element has no attributes (other than id), so the correct view in + the frame is of the parent 'svg' element, which is the whole picture.)
  • +
  • After navigating back and activating the "Ellipse" link, the view must change so that it is + zoomed (uniformly scaled) and centered on the ellipse. The black rectangle + surrounding the ellipse must be just within the frame.
  • +
  • After navigating back and activating the "Circle" link, the view must change so that it is + zoomed and centered on the yellow circle. The view is scaled non-uniformly, however, + so that the circle is stretched horizontally ito an ellipse. The black rectangle + surrounding it must be just within the frame.
  • +
  • After navigating back and activating the "Polygon" link, the view must not change.
  • +
+
+ + $RCSfile: linking-uri-01-b.svg,v $ + + + + + + + + + Link test of the 'view' element and its attributes, 1 of 2, internal. + + + + + Go to Rectangle + + + Go to Ellipse + + + Go to Circle + + + Go to Polygon + + Click element's line + to link to its view + + + + + + Rectangle + + No view attributes except id. + + + + Ellipse + + viewBox, should fill frame. + + + + Circle + + viewBox & non-uniform + preserveAspectRatio + + + + Polygon + + viewTarget, no + changes to viewport + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-1st.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-1st.png new file mode 100644 index 000000000..60a63b417 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-1st.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-2nd.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-2nd.png new file mode 100644 index 000000000..b67b09161 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-2nd.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-3rd.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-3rd.png new file mode 100644 index 000000000..b67b09161 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-3rd.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-4th.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-4th.png new file mode 100644 index 000000000..f6083419f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-4th.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-start.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-start.png new file mode 100644 index 000000000..b67b09161 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-01-f-start.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-1st.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-1st.png new file mode 100644 index 000000000..84bff5792 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-1st.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-start.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-start.png new file mode 100644 index 000000000..9e3599f89 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/linking-uri-03-f-start.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingCircle-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingCircle-f.svg new file mode 100644 index 000000000..42ae8543e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingCircle-f.svg @@ -0,0 +1,34 @@ + + + + + + + + linkingCircle-f.svg + Some circles with ids, for linking tests. + + + + + + + + + Some circles with ids, for linking tests. + + circle-1 + + circle-2 + + + + circle-3 + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingToc-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingToc-t.svg new file mode 100644 index 000000000..ff00d54a0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/linkingToc-t.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + TOC & index of linking tests. + + + + + 1.) linking-a-04-t: Verify basic links out of SVG content ('a'). + + + + + + 2.) linking-uri-03-t: Verify handling of xlink attributes on 'a'. + + + + + + 3.) linking-a-02-b: Verify links into SVG content and fragment syntax. + + + + + + 4.) linking-uri-01-b: Verify 'view' element handling. + + + + + + 5.) linking-uri-02-b: Verify 'view' element handling (companion to linking-uri-01-f). + + + + + [Note. This is not a linking test, but a supplemental file and link + + + target for other linking tests.] + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/magnify.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/magnify.png new file mode 100644 index 000000000..571357744 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/magnify.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/makealpha.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/makealpha.svg new file mode 100644 index 000000000..c284b29bc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/makealpha.svg @@ -0,0 +1,34 @@ + + + + + Makes a simple graphic for testing alpha transparency + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/myimage.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/myimage.jpg new file mode 100644 index 000000000..16009ed17 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/myimage.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_bullet.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_bullet.png new file mode 100644 index 000000000..f2f7c1f9d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_bullet.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_down.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_down.png new file mode 100644 index 000000000..0e8fb8e15 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_down.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downleft.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downleft.png new file mode 100644 index 000000000..8405698b0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downleft.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downright.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downright.png new file mode 100644 index 000000000..83973937c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_downright.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_frame.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_frame.png new file mode 100644 index 000000000..4eb974abd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_frame.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_left.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_left.png new file mode 100644 index 000000000..818c5118f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_left.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_noframe.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_noframe.png new file mode 100644 index 000000000..9c5c8724d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_noframe.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_right.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_right.png new file mode 100644 index 000000000..bcc3eeab3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_right.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_svg.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_svg.png new file mode 100644 index 000000000..98bb21cbb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_svg.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_up.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_up.png new file mode 100644 index 000000000..bab586ca6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_up.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upleft.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upleft.png new file mode 100644 index 000000000..44e568b84 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upleft.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upright.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upright.png new file mode 100644 index 000000000..ffc2d925b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/nav_upright.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/old-name-2-new-name1.html b/Demo-Samples/W3C_SVG_11_TestSuite/images/old-name-2-new-name1.html new file mode 100644 index 000000000..2c24600e6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/old-name-2-new-name1.html @@ -0,0 +1,1178 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CompanyPersonEmailOld FilenameNew Filename
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-add-BE-09animate-elem-01-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-inherit-BE-10animate-elem-02-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-motion-BE-11animate-elem-03-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-motion-BE-12animate-elem-04-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-values-BE-06animate-elem-05-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-values-BE-07animate-elem-06-F
EricssonMathias Larsson CarlanderMathias.Carlander@era.ericsson.seanimation-values-BE-08animate-elem-07-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpanimation-overall-BE-01animate-elem-09-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpanimation-targAtt-BE-04animate-elem-10-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpanimation-targElt-BE-03animate-elem-11-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpanimation-timing-BE-05animate-elem-12-F
W3CChris Lilleychris@w3.organimation-extRef-BE-13animate-elem-13-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.aucolor-colorProf-BE-03color-prof-01-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.aucolor-property-BE-02color-prop-01-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.comcolor-datatypes-BE-01color-prop-02-F
ZoomON ABOla Anderssonola.andersson@zoomon.comcoords-transforms-BE-02coords-trans-01-F
ILOGChristophe Jolifcjolif@ilog.frcoords-unitsProc-BE-05coords-units-01-F
ZoomON ABOla Anderssonola.andersson@zoomon.comcoords-units-BE-01coords-units-03-F
ZoomON ABOla Anderssonola.andersson@zoomon.comcoords-unitsProc-BE-04coords-units-02-F
ZoomON ABOla Anderssonola.andersson@zoomon.comcoords-viewBox-BE-03coords-viewattr-01-F
W3CChris Lilleychris@w3.orgextend-multiNS-BE-01extend-namespace-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-blend-BE-02filters-blend-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-colorMtrx-BE-03filters-color-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-composite-BE-05filters-composite-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-transfer-BE-04filters-comptran-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-convolve-BE-06filters-conv-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-diffuseLt-BE-07filters-diffuse-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.comfilters-dispMap-BE-16filters-displace-01-F
Savage SoftwareMike Bultrowiczmbultrowicz@savagesoftware.comfilters-many-BE-01filters-example-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-feImage-BE-13filters-image-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-lights-BE-09filters-light-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-morph-BE-10filters-morph-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.comfilters-fldMrgOff-BE-15filters-offset-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-specularLt-BE-08filters-specular-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-feTile-BE-14filters-tile-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-turb-BE-11filters-turb-01-F
W3CChris Lilleychris@w3.orgfonts-fontElement-BE-01fonts-elem-01-F
AGFAChris Tuijnchris.tuijn.ct@belgium.agfa.comfilters-blur-BE-12filters-gauss-01-F
Hewlett PackardLee Klostermanlee_klosterman@hp.cominteract-cursor-BE-08interact-cursor-01-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comdom-eventListener-BE-04interact-dom-01-F
Hewlett PackardLee Klostermanlee_klosterman@hp.cominteract-onload-BE-07interact-events-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.cominteract-bubble-BE-04interact-order-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.cominteract-pEvents-BE-05interact-pointer-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.cominteract-pEvents-BE-06interact-pointer-02-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.cominteract-zoomPan-BE-01interact-zoom-01-F
Eastman KodakThomas DeWeesethomas.deweese@kodak.cominteract-zoomPan-BE-02interact-zoom-02-F
Hewlett PackardLee Klostermanlee_klosterman@hp.comlinking-inBound-BE-03linking-a-01-F
Hewlett PackardLee Klostermanlee_klosterman@hp.comlinking-outBound-BE-01linking-a-02-F
Hewlett PackardLee Klostermanlee_klosterman@hp.comlinking-view-BE-04linking-uri-01-F
Hewlett PackardLee Klostermanlee_klosterman@hp.comlinking-view-BE-05linking-uri-02-F
Hewlett PackardLee Klostermanlee_klosterman@hp.comlinking-xlinkAttr-BE-02linking-uri-03-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-groupOpac-BE-04masking-alpha-01-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-mask-BE-05masking-mask-01-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-mask-BE-06masking-mask-02-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-property-BE-07masking-opacity-01-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-clipPath-BE-08masking-path-01-F
CanonJun Fujisawafujisawa.jun@canon.co.jpmasking-clipPath-BE-01masking-path-01-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-clipRule-BE-03masking-path-02-F
CanonJun Fujisawafujisawa.jun@canon.co.jpmasking-clipPath-BE-02masking-path-02-F
OpenwaveCharles Yingcharles.ying@openwave.commasking-vportClip-BE-09masking-path-03-F
W3CChris Lilleychris@w3.orgmetadata-sample-BE-01metadata-example-01-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpanimation-href-BE-02naimate-elem-08-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-fill-BE-01painting-fill-01-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-inherit-BE-06painting-fill-02-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-markers-BE-03painting-markers-01-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-markers-BE-04painting-markers-02-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-colIntProp-BE-05painting-render-01-F
Schema Software Inc.Philip Mansfieldphilipm@schemasoft.compaint-stroke-BE-02painting-stroke-01-F
ILOGChristophe Jolifcjolif@ilog.frpath-curves-BE-02paths-data-01-F
ILOGChristophe Jolifcjolif@ilog.frpath-curves-BE-03paths-data-02-F
ILOGChristophe Jolifcjolif@ilog.frpath-curves-BE-04paths-data-03-F
ILOGChristophe Jolifcjolif@ilog.frpath-lines-BE-01paths-data-04-F
CanonJun Fujisawafujisawa.jun@canon.co.jpgradPatt-referenc-BE-08pservers-grad-01-F
CanonJun Fujisawafujisawa.jun@canon.co.jpgradPatt-stop-BE-06pservers-grad-02-F
CanonJun Fujisawafujisawa.jun@canon.co.jpgradPatt-stop-BE-10pservers-grad-03-F
CanonJun Fujisawafujisawa.jun@canon.co.jpgradPatt-transfrm-BE-09pservers-grad-04-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.augradPatt-linearGr-BE-01pservers-grad-05-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.augradPatt-linearGr-BE-02pservers-grad-06-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.augradPatt-linearGr-BE-03pservers-grad-07-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.augradPatt-radialGr-BE-04pservers-grad-08-F
CSIRO AustraliaDean Jacksondean.jackson@cmis.csiro.augradPatt-radialGr-BE-05pservers-grad-09-F
CanonJun Fujisawafujisawa.jun@canon.co.jpgradPatt-pattern-BE-07pservers-pattern-01-F
CorelPhil Armstrongphila@corel.comrendering-shape-BE-03render-elems-01-F
CorelPhil Armstrongphila@corel.comrendering-text-BE-02render-elems-02-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpscript-eventDom-BE-01script-handle-01-F
KDDIArei Kobayashiarei_kobayasi@jmserv.kbip.kddlabs.co.jpscript-uiEvents-BE-02script-handle-02-F
NokiaTolga Capintolga.capin@nokia.comshapes-circle-BE-03shapes-circle-01-F
ILOGChristophe Jolifcjolif@ilog.frshapes-ellipse-BE-02shapes-ellipse-01-F
NokiaTolga Capintolga.capin@nokia.comshapes-line-BE-04shapes-line-01-F
NokiaTolga Capintolga.capin@nokia.comshapes-polygon-BE-05shapes-polygon-01-F
NokiaTolga Capintolga.capin@nokia.comshapes-polyline-BE-06shapes-polyline-01-F
ILOGChristophe Jolifcjolif@ilog.frshapes-rect-BE-01shapes-rect-01-F
BitflashRick Grahamrick@bitflash.comstructure-switch-BE-07struct-cond-01-F
BitflashRick Grahamrick@bitflash.comstructure-lang-BE-08struct-cond-02-F
CorelPhil Armstrongphila@corel.comstructure-defs-BE-04struct-defs-01-F
BitflashRick Grahamrick@bitflash.comstructure-extRef-BE-10struct-defs-02-F
W3CChris Lilleychris@w3.orgdom-svg-BE-02struct-dom-01-F
W3CChris Lilleychris@w3.orgdom-featureString-BE-03struct-dom-02-F
W3CChris Lilleychris@w3.orgdom-core-BE-01struct-dom-03-F
CorelPhil Armstrongphila@corel.comstructure-empty-BE-01struct-frag-01-F
CorelPhil Armstrongphila@corel.comstructure-basicG-BE-03struct-group-01-F
CorelPhil Armstrongphila@corel.comstructure-nested-BE-02struct-group-02-F
BitflashRick Grahamrick@bitflash.comstructure-image-BE-06struct-image-01-F
BitflashRick Grahamrick@bitflash.comstructure-allElem-BE-09struct-image-02-F
BitflashRick Grahamrick@bitflash.comstructure-imggamma-BE-11struct-image-03-F
BitflashRick Grahamrick@bitflash.comstructure-symbol-BE-05struct-symbol-01-F
ZoomON ABOla Anderssonola.andersson@zoomon.comstyle-selector-BE-01styline-css-01-F
ZoomON ABOla Anderssonola.andersson@zoomon.comstyle-selector-BE-02styline-css-02-F
ZoomON ABOla Anderssonola.andersson@zoomon.comstyle-selector-BE-03styline-css-03-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-alignment-BE-10text-align-01-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-textAnchor-BE-05text-align-02-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-alignment-BE-11text-align-03-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-altGlyph-BE-07text-altglyph-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-decoration-BE-12text-deco-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-font-BE-15text-fonts-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-font-BE-16text-fonts-02-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-i18n-BE-09text-intro-01-F
NokiaTolga Capintolga.capin@nokia.comtext-textOnPath-BE-03text-path-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-spacing-BE-14text-spacing-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-textLength-BE-17text-text-01-F
NokiaTolga Capintolga.capin@nokia.comtext-text-BE-01text-text-02-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-extTref-BE-18text-tref-01-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-tref-BE-04text-tref-01-F
Adobe Systems Inc.Jon Ferraiolojferraio@adobe.comtext-selection-BE-13text-tselect-01-F
NokiaTolga Capintolga.capin@nokia.comtext-tspan-BE-02text-tspan-01-F
Sun MicrosystemsVincent Hardyvincent.hardy@sun.comtext-whiteSpace-BE-06text-ws-01-F
+ + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.png new file mode 100644 index 000000000..3886e7931 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.svg new file mode 100644 index 000000000..43d9041b7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-01-f.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test that the viewer has the basic capability to handle the 'path' +element and its data (d) attribute in combination with the cubic +Bezier curveto commands, C, c, S, s (plus Mm and Zz). + + +There are 8 subtests, each composed from the cubic Bezier path commands per +the label by the subtest. On-curve control points (i.e., the curve position) +are marked by small blue squares. Subtests are filled, or stroked, or +both, using simple style properties and colors. + + +The rendered picture should match the reference image exactly, except for possible +variations in the labelling text (per CSS2 rules). + + +The test uses the 'rect' element, as well as basic fill (solid primary colors), +stroke (primary color 1-pixel lines), font-family (Helvetica) and font-size properties. + + + + paths-data-01-f + Test that the viewer has the basic capability to handle the 'path' element and data (d) attribute in combination with the cubic Bezier curveto, both regular and shorthand/smooth forms - C, c, S, s (along with Mm and Zz). + + + + + + + + Cubic bezier curves drawn with commands: + + + + + + + + + + + M, C, S, m, c, s + + + + + + + + + + + + M, c, c, c, C, z + + + + + + + + + + M, C, Z + + + + + + + + + + + M, C, c, Z + + + + + + + + + + + m, c, s + + + + + + + + + + M, C + + + + + + + + + + + + M, c, s, s, s, z + + + + + + + + + + m, c, z + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + paths-data-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.png new file mode 100644 index 000000000..968ed60d8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.svg new file mode 100644 index 000000000..0436ee6ee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-02-f.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test that the viewer has the basic capability to handle the 'path' +element and its data (d) attribute in combination with the quadratic +Bezier curveto commands, Q, q, T, t (plus Mm and Zz). + + +There are 7 subtests, each composed from the quadric Bezier path commands per +the label by the subtest. On-curve control points (i.e., the curve position) +are marked by small colored squares. Subtests are filled, or stroked, or +both, using simple style properties and colors. + + +The rendered picture should match the reference image exactly, except for possible +variations in the labelling text (per CSS2 rules). + + +The test uses the 'rect' element, as well as basic fill (solid primary colors), +stroke (primary color wide and 1-pixel lines), font-family (Helvetica) and font-size properties. + + + + paths-data-02-f + Test that the viewer has the basic capability to handle the 'path' element and data (d) attribute in combination with the quadratic Bezier curveto commands, both regular and shorthand/smooth forms - Q, q, T, t (along with Mm and Zz). + + + + + Quadric bezier curves drawn with commands: + + + + + M, Q, M, q, z + + + + + + + + + m, q, z, m, q, z + + + + + + + + + M, Q, Z + + + + + + + M, Q, T, Q, z + + + + + + + + + M, Q, Q, z + + + + + + + + M, q, t, t, t, t, z + + + + + + + + + + + M, q, Q, q, Q, z + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + paths-data-02-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.png new file mode 100644 index 000000000..a5f466bcd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.svg new file mode 100644 index 000000000..c671a058b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-03-f.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Test that the viewer has the basic capability to handle the 'path' +element and its data (d) attribute in combination with the elliptical +arc curveto commands, A, a (plus Mm and Zz). + + +There are 6 subtests, each composed from the elliptical arc path commands per +the label by the subtest. The curve positions +are marked by small colored squares. Subtests are filled, or stroked, or +both, using simple style properties and colors. + + +The rendered picture should match the reference image exactly, except for possible +variations in the labelling text (per CSS2 rules). + + +The test uses the 'rect' element, as well as basic fill (solid primary colors), +stroke (primary color wide and 1-pixel lines), font-family (Helvetica) and font-size properties. + + + + + paths-data-03-f.svg + Test that the viewer has the basic capability to handle the 'path' element and data (d) attribute in combination with the elliptical Arc curveto commands - A, a (along with Mm and Zz). + + + + + Elliptical arc curves drawn with commands: + + + + + M, A, Z + + + + + + + m, a, z + + + + + + + M, a + + + + + + + M, A, a, a, z + + + + + + + + + M, a, Z, m, A, Z, m, a, z + + + + + + + + + + + M, A, A, A, A + + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + paths-data-03-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.png new file mode 100644 index 000000000..ed52be58b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.svg new file mode 100644 index 000000000..18d5ad4d5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/paths-data-04-f.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Verify the basic capability to handle the 'path' element, and its data attribute (d) +in combination with the straight-line path commands. +Four pairs of figures should be displayed in the +four quadrants. The shapes in each pair are identical, with one stroked and +one filled. Two pairs of concentric equilateral triangles are drawn using respectively +M,L,Z and m,l,z. The fill-mode default of "even-odd" means that +the inner triangle is hollow. Two pairs of staircase figures are drawn using +respectively M,H,V,Z and m,h,v,z. + + +The rendered picture should match the reference image exactly, except for possible +variations in the labelling text (per CSS2 rules). + + +The test uses the 'rect' element, as well as basic fill (solid primary colors), +stroke (black 1-pixel lines), font-family (Helvetica) and font-size properties. + + + + + paths-data-04-f + Test that viewer has the basic capability to handle the <path> element and data (d) attribute in combination with the moveto, lineto, and closepath commands - M, L, Z, m, l, and z. + + + + + + + + Lines drawn with commands: + M, L, L, L, Z, + subpath + M, L, L, L, Z + + + + + + + + stroked + + + + + + + + filled + + + + m, l, l, l, z, + subpath + m, l, l, l, z + + + + + + + + + + + + + + + + + + M, H, V, H, + V. H, V, H, + V, Z + + + + + + + + + + + + + + + + + + + + + + m, h, v, h + v, h, v, h + v, z + + + + + + + + + + + + + + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + paths-data-04-f + $Revision: 1.1 $ + Release 3.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/pinksquidj.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/pinksquidj.png new file mode 100644 index 000000000..e88ae4eb4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/pinksquidj.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/plant.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/plant.jpg new file mode 100644 index 000000000..855412102 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/plant.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/purplesquidj.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/purplesquidj.png new file mode 100644 index 000000000..90000a8bc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/purplesquidj.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/rects.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/rects.svg new file mode 100644 index 000000000..d940ed448 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/rects.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/rects_b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/rects_b.svg new file mode 100644 index 000000000..5952ae2d2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/rects_b.svg @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/red1x1.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/red1x1.png new file mode 100644 index 000000000..c4c0d7719 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/red1x1.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/rgbalpha.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/rgbalpha.png new file mode 100644 index 000000000..c2e3baa90 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/rgbalpha.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/rightarrow.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/rightarrow.png new file mode 100644 index 000000000..c29fb8ae2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/rightarrow.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/rotate20.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/rotate20.png new file mode 100644 index 000000000..e566bfadf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/rotate20.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-fill-green.css b/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-fill-green.css new file mode 100644 index 000000000..f7cdb44a9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-fill-green.css @@ -0,0 +1,28 @@ +path +{ + fill: green; +} +g svg circle +{ + fill: green; +} +g > ellipse +{ + fill: green; +} +ellipse + circle +{ + fill: green; +} +[id=testAttributeSelector] +{ + fill: green; +} +#testIdSelector +{ + fill: green; +} +#testPseudoClassSelector:first-child +{ + fill: green; +} diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-visibility-hidden.css b/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-visibility-hidden.css new file mode 100644 index 000000000..9d5e525d6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/selector-types-visibility-hidden.css @@ -0,0 +1,32 @@ +path +{ + visibility: hidden; +} +g svg circle +{ + visibility: hidden; +} +g > ellipse +{ + visibility: hidden; +} +ellipse + circle +{ + visibility: hidden; +} +[id=testAttributeSelector] +{ + visibility: hidden; +} +#testIdSelector +{ + visibility: hidden; +} +#testPseudoClassSelector:first-child +{ + visibility: hidden; +} +.reference +{ + visibility: visible !important; +} diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-b.svg new file mode 100644 index 000000000..119dc2caa --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-b.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + shapes-rect-01-b + Test that viewer has the basic capability to render the 'ellipse'element + + + + + + + default + + + + filled + + + + 'rx'='ry' + + + all attributes + + + + + + + + + + + SVG v1.1 Conformance Suite + + shapes-ellipse-01-b + + $Revision: 1.1 $ + + ©2002 W3C + + Release 1.0 + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.png new file mode 100644 index 000000000..73e78ad8f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.svg new file mode 100644 index 000000000..70899a16e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-ellipse-01-f.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Verify the basic capability to handle the 'ellipse' +shape element. Four pairs of ellipses should be displayed in the +four quadrants, with the shapes in each pair being identical. Filling, stroking, +and filling-plus-stroking are applied, and the cx,cy (center position) and +rx,ry (ellipse radii) attributes are varied. + + +The rendered picture should match the reference image, except for possible +variations in the labelling text (per CSS2 rules). + + +This test uses 'text', 'rect' and 'path' elements, as well as +fill (solid primary colors), stroke (primary colors and wide lines), +font-family ("Helvetica"), and font-size properties within the 'style' attribute. + + + + + shapes-ellipse-01-f + Test that viewer has the basic capability to handle the <ellipse> element. + + + + + + + + Basic ellipses + rx=30 + ry=50 + + + stroked + filled + + + + rx=35 + ry=35 + + + stroked + filled + + + + rx=30 + ry=50 + + + stroked + filled & stroked + + + + rx=70 + ry=40 + + filled & stroked + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + shapes-ellipse-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-b.svg new file mode 100644 index 000000000..8f9115791 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-b.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + shapes-rect-01-b + Test that viewer has the basic capability to render the 'rect'element + + + + + + + default + + + + filled + + + + rounded 'x' + + + + rounded 'x', 'y' + + + + + + + + + + + SVG v1.1 Conformance Suite + + shapes-rect-01-b + + $Revision: 1.1 $ + + ©2002 W3C + + Release 1.0 + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.png new file mode 100644 index 000000000..bf25fdfed Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.svg new file mode 100644 index 000000000..2caf30e57 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/shapes-rect-01-f.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Verify that interpreter/viewer has basic capability to handle the 'rect' +shape element. Four pairs of rectangles should be displayed in the +four quadrants, with the shapes in each pair being identical to each other. +Filling, stroking, and filling-plus-stroking are tested, as are the round-rect +attributes. + + +The rendered picture should match the reference image, except for possible +variations in the labelling text (per CSS2 rules). + + +This test uses 'text' and 'path' elements, as well as +fill (solid primary colors), stroke (primary colors and wide lines), +font-family ("Helvetica"), and font-size properties within the 'style' attribute. + + + + + shapes-rect-01-f + Test that viewer has the basic capability to handle the <rect> element. + + + + + + + + Basic rectangles + width=50 + height=80 + + + stroked + filled + + + + width=50 + height=80 + rx=30 + + + stroked + filled + + + + width=50 + height=80 + + + stroked + filled & stroked + + + + width=50, height=80 + rx=30 ry=50 + + + stroked + filled + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + shapes-rect-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/sign.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/sign.png new file mode 100644 index 000000000..6aac7e150 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/sign.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/smiley.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/smiley.png new file mode 100644 index 000000000..5bcc67a2d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/smiley.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/sphere.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/sphere.png new file mode 100644 index 000000000..9e22388e7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/sphere.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/star.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/star.svg new file mode 100755 index 000000000..01ca19029 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/star.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/stefan_252_tRNS_opti.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/stefan_252_tRNS_opti.png new file mode 100644 index 000000000..1937a3154 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/stefan_252_tRNS_opti.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-frag-01-B.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-frag-01-B.svg new file mode 100644 index 000000000..41e99c0de --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-frag-01-B.svg @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + struct-frag-01 + Test that 'svg' elements nested inside of each other will render correctly + + + + + + + + + + + + + + + + + + + + + + + + + + SVG v1.1 Conformance Suite + struct-frag-01-B + + ©2002 W3C + + $Rev:1.0$ + Rel 1.1 + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.jpg new file mode 100644 index 000000000..a74e07223 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.png new file mode 100644 index 000000000..4ed08406d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.jpg new file mode 100644 index 000000000..9e44fec63 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.png new file mode 100644 index 000000000..c609c4671 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-02.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-1.svg new file mode 100644 index 000000000..9ab4b1ede --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-1.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-2.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-2.svg new file mode 100644 index 000000000..01f5d4c27 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-11-b-2.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-cycle.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-cycle.svg new file mode 100644 index 000000000..ce5fe148c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-cycle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-nocycle.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-nocycle.svg new file mode 100644 index 000000000..3d6440bb5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-12-b-nocycle.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-17-b-1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-17-b-1.svg new file mode 100644 index 000000000..ff34bdea0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-image-17-b-1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-symbol-01.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-symbol-01.png new file mode 100644 index 000000000..323a51fa7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-symbol-01.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-06-b-1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-06-b-1.svg new file mode 100644 index 000000000..18af39ed5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-06-b-1.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-08-b-cycles.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-08-b-cycles.svg new file mode 100644 index 000000000..8f3c1a4ab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/struct-use-08-b-cycles.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef1.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef1.svg new file mode 100644 index 000000000..1df0237c9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef1.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + svgRef1.svg + $Revision: 1.3 $ + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.css b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.css new file mode 100644 index 000000000..0e4157b7a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.css @@ -0,0 +1,4 @@ +rect {fill:fuchsia;} +circle {fill:blue;} +polygon {fill:green;} +ellipse {fill:gold;} diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.svg new file mode 100644 index 000000000..2f170fbd8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/svgRef4.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + svgRef4.svg + $Revision: 1.2 $ + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-01-f.svg new file mode 100644 index 000000000..b46aad9ee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-01-f.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'text-anchor' and the 'baseline-shift' properties (horizonatal). + + + The topmost three lines test the three values for property 'text-anchor': start, middle and end. + + + The next three lines test property 'baseline-shift'. + The fourth line tests 'baseline-shift:7' (i.e., a length for 'baseline-shift'). + The red text should shift upward by 7 pixels. + The fifth line tests 'baseline-shift:-70%' (i.e., a percentage for 'baseline-shift'). + The red text should shift downward by 70% of the 'font-size'. + The sixth line tests the three keywords 'sub', 'super' and 'normal'. + You should see a subscript, superscript and return to normal. + + + + + text-align-01-f + Test 'text-anchor' and the 'baseline-shift' properties (horizontal). + + + + + Test 'text-anchor' and the 'baseline-shift' properties (horizontal). + + + + + Text-anchor:start + + + + + Text-anchor:middle + + + + + Text-anchor:end + + + + Normal textbaseline-shift:7normal text + Normal textbaseline-shift:-70%normal text + Normal textsubsupernormaltext + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-align-01-f + $Revision: 1.1 $ + Release 1.0 + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-02-f.svg new file mode 100644 index 000000000..b3b289710 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-02-f.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test for viewer capibility to handle the basics of the 'textAnchor' + alignment property for 'text' and related elements. + + + There are several groups of sub-tests. The first group at the top has an + initial sub-test with no text-anchor property ("none"), then + tests the three values of the text-anchor property -- start, middle, end -- + for simple 'text' elements. In each case, the x-coordinate attribute of + the 'text' element corresponds to the position of the vertical red line. + + + The second group from the top contains sub-tests to verify that the + interpreter handles text-anchor when the text is comprised of other + text related elements, 'tspan', 'tref', and 'textPath'. + The text-anchor property is present on the containing 'text' element + in these cases, not on the contained child elements. + + + The third group from the top contains sub-tests to verify that + the interpreter correctly handles and applies the text-anchor + properties when present on "chunks", which are comprised of tspan elements + with absolute positioning, within the containing 'text' element. + + + The rendered picture should match the reference image, except for + possible variations in the text fonts and layout (per CSS2 rules). + + + The test also uses the 'rect' element, + as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Helvetica) + and font-size properties. + + + + + text-align-03-f + Test viewer basic capability to handle 'text-anchor' property. + + + + + + end. text w/ tref + + + Basic test of 'text-anchor' alignment property. + (The red line corresponds to the "initial current text position".) + Simple text. + + + + none + start + middle + end + + + + none... + start... + middle... + end... + + Tspan, tref, toap + + + + start. text w/ red tspan + middle. text w/ bold tspan + + + + + Text-anchor: end. Text on path + + + + + tspan... + tspan... + tref... + textPath... + + Changes in chunks. + + + + Begin with "end" align, and switch to middle in a tspan, and finish with start in another tspan. + + + + end... + middle... + start... + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-align-02-f + $Revision: 1.1 $ + Release 1.0 + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-03-f.svg new file mode 100644 index 000000000..732e9d443 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-align-03-f.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'text-anchor' and the 'baseline-shift' properties (vertical). + + + The leftmost three lines test the three values for property 'text-anchor': start, middle and end. + + + The next three lines test property 'baseline-shift'. + The fourth line tests 'baseline-shift:7' (i.e., a length for 'baseline-shift'). + The red text should shift right by 7 pixels. + The fifth line tests 'baseline-shift:-70%' (i.e., a percentage for 'baseline-shift'). + The red text should shift left by 70% of the 'font-size'. + The sixth line tests the three keywords 'sub', 'super' and 'normal'. + You should see a subscript, superscript and return to normal. + + + + + text-align-03-f + Test 'text-anchor' and the 'baseline-shift' properties (vertical). + + + + + Test 'text-anchor' and the 'baseline-shift' properties (vertical). + text-anchor + baseline-shift + + + + + start + + + + middle + + + + end + + + + noneshift by 7none + noneshift by -70%none + nonesubsuperno shift + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-align-03-f + $Revision: 1.1 $ + Release 1.0 + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-altglyph-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-altglyph-01-f.svg new file mode 100644 index 000000000..bf10d740e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-altglyph-01-f.svg @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'altGlyph' facilities and many-to-many chars to glyphs. + + + Three text strings show: the word "HAPPY" in red, the word "SAD" in green + and the word "SASSY" in blue. + + + The "HAPPY" and "SAD" strings test the 'altGlyph' facility and + the ability to map multiple glyphs to a single character. + All characters except the "D" are bracketed by 'altGlyph' elements + to use two different glyphs to render each character. + For "HAPPY", the horizontal stroke through the center of the characters + is a smile stroke. + For "SAD", the horizontal stroke through the center of the characters + is a frown stroke. + + + The "SASSY" string tests a single glyph representing multiple characters + (a ligature). The SVG font in the test case contains an "SS" ligature + so that the "SS" in "SASSY" is rendered with a single glyph, where + the two parts of the "SS" are connected. + + + This test requires some support for SVG fonts. + + + + + text-altglyph-01-f + Test 'altGlyph' facilities and many-to-many chars to glyphs. + + + + + Test 'altGlyph' facilities and many-to-many chars to glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H +A +P +P +Y + + SAD + SASSY + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-altglyph-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-extTref-BE-18-targ.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-extTref-BE-18-targ.svg new file mode 100644 index 000000000..31c7943b8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-extTref-BE-18-targ.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + +text-extTref-BE-18-targ + + +Auxiliary ('tref' target) file for test case text-extTref-BE-18. + + + + + + + + + Simple external referenced text. + + + + + + + + + + + + + + + Scalable Vector Graphics (SVG) Conformance Suite + text-extTref-BE-18-targ + Release 1.0 + $Revision: 1.1 $ + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-intro-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-intro-01-f.svg new file mode 100644 index 000000000..f28b9acab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-intro-01-f.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test various aspects of internationalized text, including + left-to-right, right-to-left, top-to-bottom, and the + following properties: 'writing-mode', + 'glyph-orientation-vertical', 'glyph-orientation-horizontal', + 'direction' and 'unicode-bidi'. + + + Various text strings in various languages appear. The main + purpose of the test is to verify that the correct characters + appear and that they appear in the correct order and orientation. + In particular, ensure that the three lines with Hebrew are ordered + correctly (test of bidi algorithms and support of 'unicode-bidi' and + 'direction' properties). Also, ensure that the two lines of + vertical Japanese text have the proper orientation + (test of 'glyph-orientation-vertical' property). + + + This test requires installation of a system font that supports + the various international characters used in this test case. + Due to differences across systems regarding system fonts and + font handling, for some implementations editing of the test case + may be necessary to specify the correct system font. To + minimize system dependencies, a future version of this test + might include all necessary glyphs as an SVG font. + + + + + text-intro-01-f + Test various aspects of internationalized text, including left-to-right, right-to-left, top-to-bottom, and the following properties: 'writing-mode', 'glyph-orientation-vertical', 'glyph-orientation-horizontal', 'direction' and 'unicode-bidi'. + + + + + Test combinations of left-to-right, right-to-left, top-to-bottom text. + + Polish: MogÄ™ jeść szkÅ‚o, i mi nie szkodzi. + Russian: Я могу еÑÑ‚ÑŒ Ñтекло, Ñто мне не вредит. + Greek: ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα. + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + Yiddish: ×יך קען עסן גל×ָז ×ון עס טוט מיר נישט װײ. + + + Chinese:我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 + Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 + + unicode-bidi:bidi-override. First, direction:ltr, then direction:rtl. + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + This text "我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。" is in ChineseJapanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-intro-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-tref-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-tref-01-f.svg new file mode 100644 index 000000000..a4acdd73e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-tref-01-f.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test for viewer capability to handle the basics of the 'tref' element + and its attributes. Basic referencing is tested, as well as + the equivalence of 'tref' to 'tspan' in attributes handling. + There are five sub-tests. + + + The first box down from the top should contain green "Simple internal referenced text.", + which is obtained by a 'tref' element reference to a 'text' element in a 'defs' + section of this test file. + + + The second box from the top tests changing of visual properties + of 'tref' substrings. It should contain + the string "Change color within string.", blue except for the single + word "color" in red. Three 'tref' elements within the + 'text' element each point to a substring in the 'defs' section of + this test file -- the second 'tref' sets fill color to red and the + others set fill color to blue. + + + The third box from the top tests an x-coordinate list in a 'tref', + which individually places each character of the string "Char-by-char." + The string is in a single 'text' element in the 'defs' section. + + + The fourth box from the top tests that the x,y attributes of 'tref' behave + like those of 'tspan'. The string + "Bouncing up and down." is formed by four 'tref' elements pointing to 'text' + elements in the 'defs' section, and each 'tref' is individually + positioned by the x,y attributes. + + + The final sub-test actually involves the single-line test description at the very + top. It is written initially in blue, and then at the end is over-written in + black by a 'tref' pointing to the 'desc' element of the test. + + + The rendered picture should match the reference image, except that some color + "fuzziness" in the top line may result from anti-aliasing. + Also, variations are possible in the text fonts and layout (per CSS2 rules). + + + The test also uses the 'rect' element, + as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Helvetica) + and font-size properties. + + + + + text-tref-01-f + Basic test of 'tref' element and its attributes. + + + + + + Simple internal referenced text. + Change + color + within string. + Bouncing + up + and + down. + Char-by-char. + + + Basic test of 'tref' element and its attributes. + + + + + + 'tref', within file + + + + + + + + multiple 'tref' and property changes + + + + + + 'tref' with x-coordinate list + + + + + + + + + 'tref's with x/y attribute changes + + + + + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-tref-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/text-ws-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-ws-01-f.svg new file mode 100644 index 000000000..277a3aa65 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/text-ws-01-f.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test for viewer correct handling of whitespace and the 'xml:space' attribute. + There are four sub-tests, two for xml:space value "default" and two for + value "preserve". In each test, the content of the 'text' element is written on + multiple lines. The first test of each pair has indented text with leading + space characters, tabs, etc. The second has no indentation, but a line break + before the content and after it. There are no space (or other whitespace) + characters at the ends of the lines. + + + The four test cases are self-descriptive. From the top; first, "default" value applied to + 3 lines of content with indents, space characters, tabs, etc; second, "default" applied to two lines content with no indent; third, "preserve" applied to essentially the same content as first; fourth, "preserve" applied to essentially the same content as second. + + + In each test, the test string is in blue and the reference + image is in black. + The rendered picture should approximately match the reference image, + however there is some question in the reference image concerning the + exact amount of space in the long-space areas. The third test uses the nbsp unicode character + to force the reference white spaces display, which provides an accurate match if the font in use + has the same metrics for that character and the default white space. + Also, variations are possible in the text fonts and layout (per CSS2 rules). + + + The test also uses the 'rect' element, + as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Helvetica) + and font-size properties. + + + + + text-ws-01-f + Test that viewer correctly handle whitespace and the "space" attribute. + + + + + Basic test of xml:space attribute & whitespace handling. + + + + WS example with indented lines. + WS example with indented lines. + + xml:space='default' + + + + +WS example +non-indented lines. + + WS examplenon-indented lines. + + xml:space='default' + + + + + WS example + with + indented lines. + + +                   WS example    with                   indented lines. + + + xml:space='preserve' + + + + WS example +non-indented lines. + + WS example non-indented lines. + + xml:space='preserve' + + + + + + + + + Scalable Vector Graphics (SVG) v1.1 Conformance Suite + + Copyright 2002 W3C. All Rights Reserved. + + text-ws-01-f + $Revision: 1.1 $ + Release 1.0 + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-sv.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-sv.svg new file mode 100644 index 000000000..ae97d525f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-sv.svg @@ -0,0 +1,114 @@ + + + + + + +SVG Conformance Tests -- TOC-SV + + + + + +26 December 2000 + +SVG Conformance Tests -- TOC (-SV) + + +Table of Contents + + +3. Rendering Model + + + +5. Structure + + + +6. Styling + + + +7. Coordinate Systems, Transformations, and Units + + + +8. Paths + + + +9. Basic Shapes + + + +10. Text + + + +11. Painting: Filling, Stroking, and Markers + + + +12. Color + + + +13. Gradients and Patterns + + + +14. Clipping, Masking, Compositing + + + +15. Filter Effects + + + +16. Interactivity + + + +17. Linking + + + +18. Scripting + + + +19. Animation + + + +20. Fonts + + + +21. Metadata + + + +23. Extensibility + + + +B. DOM + + + +F. Implementation requirements +G. Conformance requirements + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-svcmp.svg b/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-svcmp.svg new file mode 100644 index 000000000..69f89e4f1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/images/toc-svcmp.svg @@ -0,0 +1,114 @@ + + + + + + +SVG Conformance Tests -- TOC-SV + + + + + +26 December 2000 + +SVG Conformance Tests -- TOC (-SV) + + +Table of Contents + + +3. Rendering Model + + + +5. Structure + + + +6. Styling + + + +7. Coordinate Systems, Transformations, and Units + + + +8. Paths + + + +9. Basic Shapes + + + +10. Text + + + +11. Painting: Filling, Stroking, and Markers + + + +12. Color + + + +13. Gradients and Patterns + + + +14. Clipping, Masking, Compositing + + + +15. Filter Effects + + + +16. Interactivity + + + +17. Linking + + + +18. Scripting + + + +19. Animation + + + +20. Fonts + + + +21. Metadata + + + +23. Extensibility + + + +B. DOM + + + +F. Implementation requirements +G. Conformance requirements + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/townsville.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/townsville.jpg new file mode 100644 index 000000000..3a4a19944 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/townsville.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/tree.jpg b/Demo-Samples/W3C_SVG_11_TestSuite/images/tree.jpg new file mode 100644 index 000000000..9d7da4ae1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/tree.jpg differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/images/uparrow.png b/Demo-Samples/W3C_SVG_11_TestSuite/images/uparrow.png new file mode 100644 index 000000000..6fe9f0966 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/images/uparrow.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-01-f.png new file mode 100644 index 000000000..06a21476a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-02-f.png new file mode 100644 index 000000000..7a165de20 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-dom-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-02-t.png new file mode 100644 index 000000000..8a89351c5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-03-t.png new file mode 100644 index 000000000..5c75d3243 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-04-t.png new file mode 100644 index 000000000..c56eeb6d3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-05-t.png new file mode 100644 index 000000000..ff8c50133 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-06-t.png new file mode 100644 index 000000000..dbba56a67 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-07-t.png new file mode 100644 index 000000000..53cc00aa7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-08-t.png new file mode 100644 index 000000000..55d4e9022 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-09-t.png new file mode 100644 index 000000000..48e3bdc03 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-10-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-10-t.png new file mode 100644 index 000000000..7fd463f87 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-10-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-11-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-11-t.png new file mode 100644 index 000000000..eb27d6e2c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-11-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-12-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-12-t.png new file mode 100644 index 000000000..7fd463f87 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-12-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-13-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-13-t.png new file mode 100644 index 000000000..69c449325 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-13-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-14-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-14-t.png new file mode 100644 index 000000000..7797ee6ca Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-14-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-15-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-15-t.png new file mode 100644 index 000000000..7ecb6e6ce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-15-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-17-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-17-t.png new file mode 100644 index 000000000..84b4699e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-17-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-19-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-19-t.png new file mode 100644 index 000000000..bfb0ebb14 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-19-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-20-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-20-t.png new file mode 100644 index 000000000..e2290932a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-20-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-21-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-21-t.png new file mode 100644 index 000000000..37aa901b2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-21-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-22-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-22-b.png new file mode 100644 index 000000000..5c89c368c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-22-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-23-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-23-t.png new file mode 100644 index 000000000..0b006e2a5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-23-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-24-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-24-t.png new file mode 100644 index 000000000..ed75981b8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-24-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-25-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-25-t.png new file mode 100644 index 000000000..e2822f29b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-25-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-26-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-26-t.png new file mode 100644 index 000000000..79d530a6d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-26-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-27-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-27-t.png new file mode 100644 index 000000000..878a31de4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-27-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-28-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-28-t.png new file mode 100644 index 000000000..d553960bc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-28-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-29-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-29-b.png new file mode 100644 index 000000000..c895ad5cb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-29-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-30-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-30-t.png new file mode 100644 index 000000000..228a7ea8b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-30-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-31-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-31-t.png new file mode 100644 index 000000000..20dad72f0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-31-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-32-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-32-t.png new file mode 100644 index 000000000..81618515f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-32-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-33-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-33-t.png new file mode 100644 index 000000000..42501533f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-33-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-34-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-34-t.png new file mode 100644 index 000000000..f9bde89b6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-34-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-35-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-35-t.png new file mode 100644 index 000000000..fea2db350 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-35-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-36-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-36-t.png new file mode 100644 index 000000000..5ff4b6137 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-36-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-37-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-37-t.png new file mode 100644 index 000000000..dbab0095c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-37-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-38-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-38-t.png new file mode 100644 index 000000000..29c1b2dde Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-38-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-39-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-39-t.png new file mode 100644 index 000000000..0438d6857 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-39-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-40-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-40-t.png new file mode 100644 index 000000000..d7e12aefd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-40-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-41-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-41-t.png new file mode 100644 index 000000000..20bbb6e98 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-41-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-42-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-42-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-42-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-43-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-43-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-43-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-44-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-44-t.png new file mode 100644 index 000000000..7a8b41718 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-44-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-45-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-45-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-45-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-46-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-46-t.png new file mode 100644 index 000000000..330c176df Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-46-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-47-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-47-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-47-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-48-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-48-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-48-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-49-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-49-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-49-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-50-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-50-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-50-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-51-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-51-t.png new file mode 100644 index 000000000..4816a1bec Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-51-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-52-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-52-t.png new file mode 100644 index 000000000..5801ac240 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-52-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-53-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-53-t.png new file mode 100644 index 000000000..4de7915a2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-53-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-60-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-60-t.png new file mode 100644 index 000000000..331701406 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-60-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-61-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-61-t.png new file mode 100644 index 000000000..24e2110cd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-61-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-62-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-62-t.png new file mode 100644 index 000000000..dd9d8dc92 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-62-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-63-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-63-t.png new file mode 100644 index 000000000..097b6bc3a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-63-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-64-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-64-t.png new file mode 100644 index 000000000..dfdd63bfc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-64-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-65-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-65-t.png new file mode 100644 index 000000000..73f15cd05 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-65-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-66-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-66-t.png new file mode 100644 index 000000000..0982da1e1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-66-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-67-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-67-t.png new file mode 100644 index 000000000..aa756aed2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-67-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-68-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-68-t.png new file mode 100644 index 000000000..fcea521f3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-68-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-69-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-69-t.png new file mode 100644 index 000000000..9a220801e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-69-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-70-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-70-t.png new file mode 100644 index 000000000..301cd48ca Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-70-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-77-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-77-t.png new file mode 100644 index 000000000..d5a1cea1e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-77-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-78-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-78-t.png new file mode 100644 index 000000000..99adc7724 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-78-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-80-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-80-t.png new file mode 100644 index 000000000..abdd08187 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-80-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-81-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-81-t.png new file mode 100644 index 000000000..c1ae2aa80 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-81-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-82-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-82-t.png new file mode 100644 index 000000000..a7160b2e8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-82-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-83-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-83-t.png new file mode 100644 index 000000000..500cf4705 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-83-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-84-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-84-t.png new file mode 100644 index 000000000..f42ae902c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-84-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-85-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-85-t.png new file mode 100644 index 000000000..f2228ecb5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-85-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-86-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-86-t.png new file mode 100644 index 000000000..0d466247b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-86-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-87-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-87-t.png new file mode 100644 index 000000000..d9da67262 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-87-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-88-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-88-t.png new file mode 100644 index 000000000..29db5e639 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-88-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-89-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-89-t.png new file mode 100644 index 000000000..5fd198c00 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-89-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-90-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-90-b.png new file mode 100644 index 000000000..a9563a29b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-90-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-91-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-91-t.png new file mode 100644 index 000000000..95f1e5f88 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-91-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-92-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-92-t.png new file mode 100644 index 000000000..482fcb2ce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-elem-92-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-events-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-events-01-t.png new file mode 100644 index 000000000..f68d821e5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-events-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-01-t.png new file mode 100644 index 000000000..fce3827e5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-02-t.png new file mode 100644 index 000000000..aebf107d0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-03-t.png new file mode 100644 index 000000000..cc13f0d7f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-04-t.png new file mode 100644 index 000000000..34923f2db Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-interact-pevents-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-pservers-grad-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-pservers-grad-01-b.png new file mode 100644 index 000000000..21af9e3a0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-pservers-grad-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-script-elem-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-script-elem-01-b.png new file mode 100644 index 000000000..a313957d9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-script-elem-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-struct-dom-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-struct-dom-01-b.png new file mode 100644 index 000000000..ed0e5b0d1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/animate-struct-dom-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prof-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prof-01-f.png new file mode 100644 index 000000000..94187c494 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prof-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-01-b.png new file mode 100644 index 000000000..cc6be8f81 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-02-f.png new file mode 100644 index 000000000..e4675f9ac Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-03-t.png new file mode 100644 index 000000000..e8d9be527 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-04-t.png new file mode 100644 index 000000000..96b454a0e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-05-t.png new file mode 100644 index 000000000..82da712f9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/color-prop-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-01-t.png new file mode 100644 index 000000000..5335cb893 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-02-f.png new file mode 100644 index 000000000..4a1a73f1c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-03-f.png new file mode 100644 index 000000000..2cf88d32c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/conform-viewers-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-01-t.png new file mode 100644 index 000000000..358da4029 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-02-t.png new file mode 100644 index 000000000..c01f5d1bf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-coord-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-01-f.png new file mode 100644 index 000000000..9507029f7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-02-f.png new file mode 100644 index 000000000..f43a37544 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-03-f.png new file mode 100644 index 000000000..93eea682d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-04-f.png new file mode 100644 index 000000000..d7cfbde73 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-dom-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-01-b.png new file mode 100644 index 000000000..1f5df9fbb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-02-t.png new file mode 100644 index 000000000..5177150ef Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-03-t.png new file mode 100644 index 000000000..2342067fd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-04-t.png new file mode 100644 index 000000000..1f4ebbf39 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-05-t.png new file mode 100644 index 000000000..b3eecace0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-06-t.png new file mode 100644 index 000000000..f16a70c00 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-07-t.png new file mode 100644 index 000000000..839d9319d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-08-t.png new file mode 100644 index 000000000..bc6776f21 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-09-t.png new file mode 100644 index 000000000..c7d22a1c5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-10-f.png new file mode 100644 index 000000000..21d611193 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-11-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-11-f.png new file mode 100644 index 000000000..f53ba6996 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-11-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-12-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-12-f.png new file mode 100644 index 000000000..d5f2cd305 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-12-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-13-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-13-f.png new file mode 100644 index 000000000..44a238f57 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-13-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-14-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-14-f.png new file mode 100644 index 000000000..1173e6914 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-trans-14-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-01-f.png new file mode 100644 index 000000000..897068d6d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-02-f.png new file mode 100644 index 000000000..c920e9876 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-03-f.png new file mode 100644 index 000000000..f11595cb0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-04-f.png new file mode 100644 index 000000000..7ed6dae32 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-05-f.png new file mode 100644 index 000000000..07154a8bb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-transformattr-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-01-b.png new file mode 100644 index 000000000..864e77330 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-02-b.png new file mode 100644 index 000000000..f4f9bce81 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-03-b.png new file mode 100644 index 000000000..8b39b6e12 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-units-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-01-b.png new file mode 100644 index 000000000..8edeee25d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-02-b.png new file mode 100644 index 000000000..24e99dcbe Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-03-b.png new file mode 100644 index 000000000..de77fb664 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-04-f.png new file mode 100644 index 000000000..b017ce283 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/coords-viewattr-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/extend-namespace-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/extend-namespace-01-f.png new file mode 100644 index 000000000..f9f2ccde1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/extend-namespace-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-background-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-background-01-f.png new file mode 100644 index 000000000..05fc0b396 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-background-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-blend-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-blend-01-b.png new file mode 100644 index 000000000..27f311ebe Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-blend-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-01-b.png new file mode 100644 index 000000000..a07909744 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-02-b.png new file mode 100644 index 000000000..4d6bd39ea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-color-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-02-b.png new file mode 100644 index 000000000..d81d63022 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-03-f.png new file mode 100644 index 000000000..a7d49fca0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-04-f.png new file mode 100644 index 000000000..af5cf2d62 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-05-f.png new file mode 100644 index 000000000..e58a17f5b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-composite-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-comptran-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-comptran-01-b.png new file mode 100644 index 000000000..07ed2eb2d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-comptran-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-01-f.png new file mode 100644 index 000000000..5c86d9d68 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-02-f.png new file mode 100644 index 000000000..a0013985f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-03-f.png new file mode 100644 index 000000000..142324114 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-04-f.png new file mode 100644 index 000000000..8ac54ef7e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-05-f.png new file mode 100644 index 000000000..1d0207e29 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-conv-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-diffuse-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-diffuse-01-f.png new file mode 100644 index 000000000..9ce7499d5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-diffuse-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-01-f.png new file mode 100644 index 000000000..b385b3059 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-02-f.png new file mode 100644 index 000000000..7bbd900b8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-displace-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-example-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-example-01-b.png new file mode 100644 index 000000000..19b76da41 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-example-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-01-b.png new file mode 100644 index 000000000..aef8c22ce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-02-f.png new file mode 100644 index 000000000..e10c021b1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-felem-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-01-b.png new file mode 100644 index 000000000..526dacb29 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-02-f.png new file mode 100644 index 000000000..74bf87f2b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-03-f.png new file mode 100644 index 000000000..431364b5e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-gauss-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-01-b.png new file mode 100644 index 000000000..a5697ff15 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-02-b.png new file mode 100644 index 000000000..6daa9ab27 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-03-f.png new file mode 100644 index 000000000..e45180f74 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-04-f.png new file mode 100644 index 000000000..3c454938b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-05-f.png new file mode 100644 index 000000000..7552ff008 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-image-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-01-f.png new file mode 100644 index 000000000..0b7e41c65 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-02-f.png new file mode 100644 index 000000000..573138392 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-03-f.png new file mode 100644 index 000000000..2b0fee07b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-04-f.png new file mode 100644 index 000000000..815abf30c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-05-f.png new file mode 100644 index 000000000..7789d3768 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-light-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-morph-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-morph-01-f.png new file mode 100644 index 000000000..05adc9162 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-morph-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-01-b.png new file mode 100644 index 000000000..4b7e949f4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-02-b.png new file mode 100644 index 000000000..7cd6f500b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-offset-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-01-b.png new file mode 100644 index 000000000..a2456d42c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-02-b.png new file mode 100644 index 000000000..149531d22 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-03-b.png new file mode 100644 index 000000000..149531d22 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-overview-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-specular-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-specular-01-f.png new file mode 100644 index 000000000..0359624f2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-specular-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-tile-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-tile-01-b.png new file mode 100644 index 000000000..70353fc42 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-tile-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-01-f.png new file mode 100644 index 000000000..8fcef3433 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-02-f.png new file mode 100644 index 000000000..8c0778ff9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/filters-turb-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-01-t.png new file mode 100644 index 000000000..a0dc1d370 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-02-t.png new file mode 100644 index 000000000..b89326955 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-03-t.png new file mode 100644 index 000000000..8b2cbd0b2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-04-t.png new file mode 100644 index 000000000..211c33c09 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-05-t.png new file mode 100644 index 000000000..192518fdb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-desc-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-01-t.png new file mode 100644 index 000000000..bd9c12ec1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-02-t.png new file mode 100644 index 000000000..e232c4ccc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-03-b.png new file mode 100644 index 000000000..b1c58ace4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-04-b.png new file mode 100644 index 000000000..6bc6acba3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-05-t.png new file mode 100644 index 000000000..114c2b26d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-06-t.png new file mode 100644 index 000000000..4cdeb2ee9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-07-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-07-b.png new file mode 100644 index 000000000..d0b1ad590 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-elem-07-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-02-t.png new file mode 100644 index 000000000..cc18e4b79 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-03-t.png new file mode 100644 index 000000000..2633fbd53 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-04-t.png new file mode 100644 index 000000000..25498e3cd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-glyph-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-kern-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-kern-01-t.png new file mode 100644 index 000000000..a4e8d5fc3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-kern-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-overview-201-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-overview-201-t.png new file mode 100644 index 000000000..4c3200b6b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/fonts-overview-201-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/imp-path-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/imp-path-01-f.png new file mode 100644 index 000000000..809dd05f0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/imp-path-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-cursor-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-cursor-01-f.png new file mode 100644 index 000000000..58f16b76c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-cursor-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-dom-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-dom-01-b.png new file mode 100644 index 000000000..b1f459d87 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-dom-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-01-b.png new file mode 100644 index 000000000..3c2b88310 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-02-b.png new file mode 100644 index 000000000..eace54b15 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-202-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-202-f.png new file mode 100644 index 000000000..bc5cd0e11 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-202-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-203-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-203-t.png new file mode 100644 index 000000000..156c9f194 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-events-203-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-01-b.png new file mode 100644 index 000000000..d3cfae0a9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-02-b.png new file mode 100644 index 000000000..1b1e93019 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-03-b.png new file mode 100644 index 000000000..117077f31 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-order-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-01-b.png new file mode 100644 index 000000000..d798171f2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-02-t.png new file mode 100644 index 000000000..6e86c5e61 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-03-b.png new file mode 100644 index 000000000..27dd9710d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-04-t.png new file mode 100644 index 000000000..1242ef261 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-05-b.png new file mode 100644 index 000000000..4e4a7b2d6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-07-t.png new file mode 100644 index 000000000..aebf107d0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-08-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-08-f.png new file mode 100644 index 000000000..d0d44bfa4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-08-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-09-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-09-f.png new file mode 100644 index 000000000..65d6d1957 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-09-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-10-f.png new file mode 100644 index 000000000..167f1967d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-201-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-201-t.png new file mode 100644 index 000000000..4a6e3aa80 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-201-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-202-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-202-t.png new file mode 100644 index 000000000..ea2b21b1c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pevents-202-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-01-t.png new file mode 100644 index 000000000..af8cb1edf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-02-t.png new file mode 100644 index 000000000..9070e19fd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-03-t.png new file mode 100644 index 000000000..e08a6662a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-04-f.png new file mode 100644 index 000000000..15f6a0812 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-pointer-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-01-t.png new file mode 100644 index 000000000..b6d124bd0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-02-t.png new file mode 100644 index 000000000..1f3f48ffb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-03-t.png new file mode 100644 index 000000000..eb380e205 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/interact-zoom-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-01-b.png new file mode 100644 index 000000000..642cad965 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-03-b.png new file mode 100644 index 000000000..1d5ddc6d6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-04-t.png new file mode 100644 index 000000000..002ad8665 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-05-t.png new file mode 100644 index 000000000..96d1d9a6e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-06-t.png new file mode 100644 index 000000000..e2dabdde2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-07-t.png new file mode 100644 index 000000000..ad8e9168a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-08-t.png new file mode 100644 index 000000000..4471f351b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-09-b.png new file mode 100644 index 000000000..8b57a760d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-10-f.png new file mode 100644 index 000000000..aa147521c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-a-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-frag-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-frag-01-f.png new file mode 100644 index 000000000..dbf75a9b7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-frag-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-01-b.png new file mode 100644 index 000000000..a422b814c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-02-b.png new file mode 100644 index 000000000..0e1ca0dfb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-03-t.png new file mode 100644 index 000000000..ef07497f9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/linking-uri-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-filter-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-filter-01-f.png new file mode 100644 index 000000000..a42ffb6c5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-filter-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-intro-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-intro-01-f.png new file mode 100644 index 000000000..e3af4e5af Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-intro-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-01-b.png new file mode 100644 index 000000000..065b17187 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-02-f.png new file mode 100644 index 000000000..8040e1f48 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-mask-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-opacity-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-opacity-01-b.png new file mode 100644 index 000000000..a85cc03fc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-opacity-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-01-b.png new file mode 100644 index 000000000..fcd09f05f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-02-b.png new file mode 100644 index 000000000..732542340 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-03-b.png new file mode 100644 index 000000000..cadc16e45 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-04-b.png new file mode 100644 index 000000000..7a6600100 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-05-f.png new file mode 100644 index 000000000..6cdbd106d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-06-b.png new file mode 100644 index 000000000..93d2994f1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-07-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-07-b.png new file mode 100644 index 000000000..77c3dd180 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-07-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-08-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-08-b.png new file mode 100644 index 000000000..0f39bc433 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-08-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-09-b.png new file mode 100644 index 000000000..d1864b9bb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-10-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-10-b.png new file mode 100644 index 000000000..9a075c165 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-10-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-11-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-11-b.png new file mode 100644 index 000000000..1ec940063 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-11-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-12-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-12-f.png new file mode 100644 index 000000000..5cd695169 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-12-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-13-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-13-f.png new file mode 100644 index 000000000..5ec944ab9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-13-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-14-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-14-f.png new file mode 100644 index 000000000..d05c4dafd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/masking-path-14-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/metadata-example-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/metadata-example-01-t.png new file mode 100644 index 000000000..c25d96fc5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/metadata-example-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-01-f.png new file mode 100644 index 000000000..ddb0459dc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-02-f.png new file mode 100644 index 000000000..e6f187a93 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-03-f.png new file mode 100644 index 000000000..f5269a443 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-04-f.png new file mode 100644 index 000000000..c68ab069d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-05-f.png new file mode 100644 index 000000000..b09f95c44 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-06-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-06-f.png new file mode 100644 index 000000000..e72c7996f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-control-06-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-01-t.png new file mode 100644 index 000000000..483c46cba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-02-t.png new file mode 100644 index 000000000..da8823bbd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-03-t.png new file mode 100644 index 000000000..429a4007c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-04-t.png new file mode 100644 index 000000000..f6ad794c3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-05-b.png new file mode 100644 index 000000000..7eed3692e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-fill-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-01-f.png new file mode 100644 index 000000000..491b27e5a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-02-f.png new file mode 100644 index 000000000..2994fd323 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-03-f.png new file mode 100644 index 000000000..9999c43ce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-04-f.png new file mode 100644 index 000000000..79b5b2fea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-05-f.png new file mode 100644 index 000000000..2433c8d2f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-06-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-06-f.png new file mode 100644 index 000000000..5e03c00a4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-06-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-07-f.png new file mode 100644 index 000000000..c7cddc4b6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-properties-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-properties-01-f.png new file mode 100644 index 000000000..3058db050 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-marker-properties-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-01-b.png new file mode 100644 index 000000000..7ce6bdfe6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-02-b.png new file mode 100644 index 000000000..58133b9cd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-render-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-01-t.png new file mode 100644 index 000000000..a641d0e44 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-02-t.png new file mode 100644 index 000000000..3586ab940 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-03-t.png new file mode 100644 index 000000000..3f5f3290b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-04-t.png new file mode 100644 index 000000000..566af91b2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-05-t.png new file mode 100644 index 000000000..7e006747c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-06-t.png new file mode 100644 index 000000000..1eeb627ba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-07-t.png new file mode 100644 index 000000000..4b9e2104b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-08-t.png new file mode 100644 index 000000000..dc194c50f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-09-t.png new file mode 100644 index 000000000..c61e17e59 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-10-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-10-t.png new file mode 100644 index 000000000..68122cdc9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/painting-stroke-10-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-01-t.png new file mode 100644 index 000000000..f88b2c1f5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-02-t.png new file mode 100644 index 000000000..57429b46c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-03-f.png new file mode 100644 index 000000000..e3a375aca Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-04-t.png new file mode 100644 index 000000000..8294c5ee4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-05-t.png new file mode 100644 index 000000000..b382b8e07 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-06-t.png new file mode 100644 index 000000000..11a7e3d8e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-07-t.png new file mode 100644 index 000000000..c579adf8b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-08-t.png new file mode 100644 index 000000000..b6383f29a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-09-t.png new file mode 100644 index 000000000..f85d38894 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-10-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-10-t.png new file mode 100644 index 000000000..0f2138fe7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-10-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-11-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-11-t.png new file mode 100644 index 000000000..e2dabdde2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-11-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-12-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-12-t.png new file mode 100644 index 000000000..bd4fb8296 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-12-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-13-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-13-t.png new file mode 100644 index 000000000..c8ec9ee7f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-13-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-14-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-14-t.png new file mode 100644 index 000000000..e3f2e865c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-14-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-15-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-15-t.png new file mode 100644 index 000000000..c391fd6d5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-15-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-16-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-16-t.png new file mode 100644 index 000000000..33d195dc5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-16-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-17-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-17-f.png new file mode 100644 index 000000000..a19bf4b73 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-17-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-18-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-18-f.png new file mode 100644 index 000000000..a2e2e74a3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-18-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-19-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-19-f.png new file mode 100644 index 000000000..6fd6af3ee Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-19-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-20-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-20-f.png new file mode 100644 index 000000000..60ed4cd31 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-data-20-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dist-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dist-01-t.png new file mode 100644 index 000000000..e2dabdde2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dist-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-01-f.png new file mode 100644 index 000000000..e384ce3f5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-02-f.png new file mode 100644 index 000000000..0150a8f21 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/paths-dom-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-01-b.png new file mode 100644 index 000000000..8f2763591 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-02-b.png new file mode 100644 index 000000000..b7e694bfb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-03-b.png new file mode 100644 index 000000000..f73c699cc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-04-b.png new file mode 100644 index 000000000..7d9f8f4a1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-05-b.png new file mode 100644 index 000000000..4e9d966fb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-06-b.png new file mode 100644 index 000000000..ddd1667f4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-07-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-07-b.png new file mode 100644 index 000000000..bc383dcfb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-07-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-08-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-08-b.png new file mode 100644 index 000000000..3f875f5f9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-08-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-09-b.png new file mode 100644 index 000000000..128c64798 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-10-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-10-b.png new file mode 100644 index 000000000..a1e7b7659 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-10-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-11-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-11-b.png new file mode 100644 index 000000000..3a0812a28 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-11-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-12-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-12-b.png new file mode 100644 index 000000000..309bb3e87 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-12-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-13-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-13-b.png new file mode 100644 index 000000000..c24aea4f5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-13-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-14-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-14-b.png new file mode 100644 index 000000000..815fb75b2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-14-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-15-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-15-b.png new file mode 100644 index 000000000..311b42be0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-15-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-16-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-16-b.png new file mode 100644 index 000000000..51a882c75 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-16-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-17-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-17-b.png new file mode 100644 index 000000000..49a5c0920 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-17-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-18-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-18-b.png new file mode 100644 index 000000000..b288dc706 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-18-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-19-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-19-b.png new file mode 100644 index 000000000..21af9e3a0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-19-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-20-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-20-b.png new file mode 100644 index 000000000..49a5c0920 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-20-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-21-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-21-b.png new file mode 100644 index 000000000..207c6e7b6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-21-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-22-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-22-b.png new file mode 100644 index 000000000..b31ffd8b8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-22-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-23-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-23-f.png new file mode 100644 index 000000000..130ea2261 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-23-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-24-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-24-f.png new file mode 100644 index 000000000..0c944c969 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-24-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-stops-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-stops-01-f.png new file mode 100644 index 000000000..5f09f2751 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-grad-stops-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-01-b.png new file mode 100644 index 000000000..5e7dff581 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-02-f.png new file mode 100644 index 000000000..820358b8d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-03-f.png new file mode 100644 index 000000000..7b5d57149 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-04-f.png new file mode 100644 index 000000000..c041e512a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-05-f.png new file mode 100644 index 000000000..6c0b664ba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-06-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-06-f.png new file mode 100644 index 000000000..ede529a4b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-06-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-07-f.png new file mode 100644 index 000000000..1d608c2f6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-08-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-08-f.png new file mode 100644 index 000000000..039ec22c2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-08-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-09-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-09-f.png new file mode 100644 index 000000000..8ea91d0c0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/pservers-pattern-09-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-01-t.png new file mode 100644 index 000000000..d7d54c8d7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-02-t.png new file mode 100644 index 000000000..b30c256e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-03-t.png new file mode 100644 index 000000000..07570106f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-06-t.png new file mode 100644 index 000000000..0a71fa2f5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-07-t.png new file mode 100644 index 000000000..26ed60d84 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-08-t.png new file mode 100644 index 000000000..10b385049 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-elems-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-01-b.png new file mode 100644 index 000000000..55601945e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-03-t.png new file mode 100644 index 000000000..f69ee5f7e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/render-groups-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-elem-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-elem-01-b.png new file mode 100644 index 000000000..a313957d9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-elem-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-01-b.png new file mode 100644 index 000000000..5ea1b532a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-02-b.png new file mode 100644 index 000000000..edce4c31c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-03-b.png new file mode 100644 index 000000000..8af27276b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-04-b.png new file mode 100644 index 000000000..933d93832 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-handle-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-01-f.png new file mode 100644 index 000000000..8f2be723c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-02-f.png new file mode 100644 index 000000000..0d1c65016 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/script-specify-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-01-t.png new file mode 100644 index 000000000..84a292b8e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-02-t.png new file mode 100644 index 000000000..71fdf69af Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-circle-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-01-t.png new file mode 100644 index 000000000..87b76deca Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-02-t.png new file mode 100644 index 000000000..97886b178 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-03-f.png new file mode 100644 index 000000000..9a78b5064 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-ellipse-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-grammar-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-grammar-01-f.png new file mode 100644 index 000000000..db698fc41 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-grammar-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-01-t.png new file mode 100644 index 000000000..376f4e606 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-02-f.png new file mode 100644 index 000000000..61de62954 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-intro-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-01-t.png new file mode 100644 index 000000000..97f0157e2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-02-f.png new file mode 100644 index 000000000..9dea9b92b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-line-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-01-t.png new file mode 100644 index 000000000..c505ee74b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-02-t.png new file mode 100644 index 000000000..3a9301e13 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-03-t.png new file mode 100644 index 000000000..b432ba44b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polygon-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-01-t.png new file mode 100644 index 000000000..daa275e96 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-02-t.png new file mode 100644 index 000000000..739eb628d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-polyline-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-01-t.png new file mode 100644 index 000000000..339dbb8e4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-02-t.png new file mode 100644 index 000000000..20a908c9e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-03-t.png new file mode 100644 index 000000000..43b896197 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-04-f.png new file mode 100644 index 000000000..72f26ad9f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-05-f.png new file mode 100644 index 000000000..0717997d9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-06-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-06-f.png new file mode 100644 index 000000000..0978cb2de Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-06-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-07-f.png new file mode 100644 index 000000000..557aa9a31 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/shapes-rect-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-01-t.png new file mode 100644 index 000000000..7a643fa78 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-02-t.png new file mode 100644 index 000000000..14796821c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-03-t.png new file mode 100644 index 000000000..ea793b85c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-02-f.png new file mode 100644 index 000000000..a63dc0048 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-03-f.png new file mode 100644 index 000000000..d25a98bce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-04-f.png new file mode 100644 index 000000000..4463ee128 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-05-f.png new file mode 100644 index 000000000..00c20db71 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-cond-overview-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-defs-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-defs-01-t.png new file mode 100644 index 000000000..225c2dae7 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-defs-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-01-b.png new file mode 100644 index 000000000..d53461992 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-02-b.png new file mode 100644 index 000000000..06445c2bd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-03-b.png new file mode 100644 index 000000000..26e8f5333 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-04-b.png new file mode 100644 index 000000000..da8c5ec92 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-05-b.png new file mode 100644 index 000000000..d25a265a4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-06-b.png new file mode 100644 index 000000000..c138a34b6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-07-f.png new file mode 100644 index 000000000..a0d32d459 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-08-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-08-f.png new file mode 100644 index 000000000..946bbbbc6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-08-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-09-b.png new file mode 100644 index 000000000..ed0e5b0d1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-11-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-11-f.png new file mode 100644 index 000000000..78258dc62 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-11-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-12-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-12-b.png new file mode 100644 index 000000000..00d986437 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-12-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-13-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-13-f.png new file mode 100644 index 000000000..1a113ad79 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-13-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-14-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-14-f.png new file mode 100644 index 000000000..e4819bb66 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-14-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-15-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-15-f.png new file mode 100644 index 000000000..6a56c57b3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-15-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-16-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-16-f.png new file mode 100644 index 000000000..60bfbb0df Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-16-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-17-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-17-f.png new file mode 100644 index 000000000..520e57a8f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-17-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-18-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-18-f.png new file mode 100644 index 000000000..1ee03ae33 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-18-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-19-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-19-f.png new file mode 100644 index 000000000..804d9cd4c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-19-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-20-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-20-f.png new file mode 100644 index 000000000..f844e0b31 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-dom-20-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-01-t.png new file mode 100644 index 000000000..5163766f1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-02-t.png new file mode 100644 index 000000000..45e3aecfb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-03-t.png new file mode 100644 index 000000000..f0c63d605 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-04-t.png new file mode 100644 index 000000000..ca78f48aa Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-05-t.png new file mode 100644 index 000000000..82b322501 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-06-t.png new file mode 100644 index 000000000..a732fe41c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-frag-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-01-t.png new file mode 100644 index 000000000..a20eeed44 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-02-b.png new file mode 100644 index 000000000..49396df5c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-03-t.png new file mode 100644 index 000000000..d22653527 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-group-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-01-t.png new file mode 100644 index 000000000..49eacfd77 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-02-b.png new file mode 100644 index 000000000..1b8211359 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-03-t.png new file mode 100644 index 000000000..41ead9033 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-04-t.png new file mode 100644 index 000000000..782a1bd04 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-05-b.png new file mode 100644 index 000000000..f92bb67d6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-06-t.png new file mode 100644 index 000000000..b96839fad Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-07-t.png new file mode 100644 index 000000000..f39a3fc58 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-08-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-08-t.png new file mode 100644 index 000000000..a65fc02b5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-08-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-09-t.png new file mode 100644 index 000000000..f30f854bb Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-10-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-10-t.png new file mode 100644 index 000000000..0207bb181 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-10-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-11-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-11-b.png new file mode 100644 index 000000000..712498091 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-11-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-12-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-12-b.png new file mode 100644 index 000000000..6048212ce Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-12-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-13-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-13-f.png new file mode 100644 index 000000000..89f753f68 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-13-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-14-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-14-f.png new file mode 100644 index 000000000..7299cc1d0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-14-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-15-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-15-f.png new file mode 100644 index 000000000..5b584e9c1 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-15-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-16-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-16-f.png new file mode 100644 index 000000000..48cf50dd3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-16-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-17-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-17-b.png new file mode 100644 index 000000000..fbe8a581a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-17-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-18-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-18-f.png new file mode 100644 index 000000000..8acaf92d4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-18-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-19-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-19-f.png new file mode 100644 index 000000000..6b97a9f58 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-image-19-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-01-f.png new file mode 100644 index 000000000..e51d2da1e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-02-f.png new file mode 100644 index 000000000..aaa0c2b37 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-03-f.png new file mode 100644 index 000000000..3dc44573b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-svg-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-symbol-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-symbol-01-b.png new file mode 100644 index 000000000..859cb5604 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-symbol-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-01-t.png new file mode 100644 index 000000000..e5c579960 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-03-t.png new file mode 100644 index 000000000..af94ab94c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-04-b.png new file mode 100644 index 000000000..2c01bdfbc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-05-b.png new file mode 100644 index 000000000..d486dc3fa Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-06-b.png new file mode 100644 index 000000000..483828eb0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-07-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-07-b.png new file mode 100644 index 000000000..756b08cc0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-07-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-08-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-08-b.png new file mode 100644 index 000000000..6d0aaa622 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-08-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-09-b.png new file mode 100644 index 000000000..043664d06 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-10-f.png new file mode 100644 index 000000000..7e14ab046 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-11-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-11-f.png new file mode 100644 index 000000000..9a4e57003 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-11-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-12-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-12-f.png new file mode 100644 index 000000000..797bcc218 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-12-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-13-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-13-f.png new file mode 100644 index 000000000..da19897a5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-13-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-14-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-14-f.png new file mode 100644 index 000000000..4ac441de4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-14-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-15-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-15-f.png new file mode 100644 index 000000000..c93bdd0d8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/struct-use-15-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-class-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-class-01-f.png new file mode 100644 index 000000000..a4f3a318d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-class-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-01-b.png new file mode 100644 index 000000000..57f3c8fd0 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-02-b.png new file mode 100644 index 000000000..32dcd8b0d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-03-b.png new file mode 100644 index 000000000..a64439ad5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-04-f.png new file mode 100644 index 000000000..a87d3ce94 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-05-b.png new file mode 100644 index 000000000..23317d762 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-06-b.png new file mode 100644 index 000000000..58643316d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-07-f.png new file mode 100644 index 000000000..7502be872 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-08-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-08-f.png new file mode 100644 index 000000000..076127968 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-08-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-09-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-09-f.png new file mode 100644 index 000000000..dd8631db6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-09-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-10-f.png new file mode 100644 index 000000000..9d1dd68db Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-css-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-01-b.png new file mode 100644 index 000000000..5e69472d9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-02-b.png new file mode 100644 index 000000000..f8b8efe4f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-elem-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-inherit-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-inherit-01-b.png new file mode 100644 index 000000000..064e6ef54 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-inherit-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-01-t.png new file mode 100644 index 000000000..440141cb3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-02-f.png new file mode 100644 index 000000000..f05e87ead Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-03-f.png new file mode 100644 index 000000000..dd8631db6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-04-f.png new file mode 100644 index 000000000..dd8631db6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-05-f.png new file mode 100644 index 000000000..dd8631db6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/styling-pres-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/svgdom-over-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/svgdom-over-01-f.png new file mode 100644 index 000000000..a68943a9e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/svgdom-over-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-01-b.png new file mode 100644 index 000000000..5e80dd9ae Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-02-b.png new file mode 100644 index 000000000..ecce28c02 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-03-b.png new file mode 100644 index 000000000..4124dc85d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-04-b.png new file mode 100644 index 000000000..c4a107f9c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-05-b.png new file mode 100644 index 000000000..c03622551 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-06-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-06-b.png new file mode 100644 index 000000000..f9d7b9fb8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-06-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-07-t.png new file mode 100644 index 000000000..6b9549faf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-08-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-08-b.png new file mode 100644 index 000000000..70a77eb9b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-align-08-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-01-b.png new file mode 100644 index 000000000..f5254a4ef Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-02-b.png new file mode 100644 index 000000000..4c24be1bd Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-03-b.png new file mode 100644 index 000000000..57bc13e5d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-altglyph-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-bidi-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-bidi-01-t.png new file mode 100644 index 000000000..9c38a2baa Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-bidi-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-deco-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-deco-01-b.png new file mode 100644 index 000000000..162120a0b Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-deco-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-01-f.png new file mode 100644 index 000000000..bb3d6fe9c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-02-f.png new file mode 100644 index 000000000..2b47c38e2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-03-f.png new file mode 100644 index 000000000..cd9f0b22a Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-04-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-04-f.png new file mode 100644 index 000000000..a53ec7679 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-04-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-05-f.png new file mode 100644 index 000000000..7e85777ff Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-dom-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-01-t.png new file mode 100644 index 000000000..2e98b1ea8 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-02-t.png new file mode 100644 index 000000000..6b4be05ae Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-03-t.png new file mode 100644 index 000000000..9469cc98c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-04-t.png new file mode 100644 index 000000000..9469cc98c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-05-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-05-f.png new file mode 100644 index 000000000..07c26f8f5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-05-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-202-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-202-t.png new file mode 100644 index 000000000..8375d13a6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-202-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-203-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-203-t.png new file mode 100644 index 000000000..c77043c29 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-203-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-204-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-204-t.png new file mode 100644 index 000000000..43c977a07 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-fonts-204-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-01-t.png new file mode 100644 index 000000000..5915c5eea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-02-b.png new file mode 100644 index 000000000..8cadaece3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-03-b.png new file mode 100644 index 000000000..a93856029 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-04-t.png new file mode 100644 index 000000000..f72def1ea Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-05-t.png new file mode 100644 index 000000000..5bff5a434 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-06-t.png new file mode 100644 index 000000000..e506784bc Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-07-t.png new file mode 100644 index 000000000..59b611b88 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-09-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-09-b.png new file mode 100644 index 000000000..15b441047 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-09-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-10-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-10-f.png new file mode 100644 index 000000000..83bcac0de Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-10-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-11-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-11-t.png new file mode 100644 index 000000000..3d75a065d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-11-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-12-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-12-t.png new file mode 100644 index 000000000..7c4cd7960 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-intro-12-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-01-b.png new file mode 100644 index 000000000..3e55eb924 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-02-b.png new file mode 100644 index 000000000..d1adf7a60 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-path-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-spacing-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-spacing-01-b.png new file mode 100644 index 000000000..46c30c4ae Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-spacing-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-01-b.png new file mode 100644 index 000000000..686b68e02 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-03-b.png new file mode 100644 index 000000000..851209621 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-04-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-04-t.png new file mode 100644 index 000000000..f5d8c0ca5 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-04-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-05-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-05-t.png new file mode 100644 index 000000000..d6f920980 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-05-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-06-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-06-t.png new file mode 100644 index 000000000..8eb87a50c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-06-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-07-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-07-t.png new file mode 100644 index 000000000..7c54463da Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-07-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-08-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-08-b.png new file mode 100644 index 000000000..93ae72528 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-08-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-09-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-09-t.png new file mode 100644 index 000000000..78102e0c4 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-09-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-10-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-10-t.png new file mode 100644 index 000000000..6489c0000 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-10-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-11-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-11-t.png new file mode 100644 index 000000000..4f6f82d19 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-11-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-12-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-12-t.png new file mode 100644 index 000000000..e39b4b782 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-text-12-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-01-b.png new file mode 100644 index 000000000..e4ad2dea9 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-02-b.png new file mode 100644 index 000000000..423be4c45 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-03-b.png new file mode 100644 index 000000000..53b9f49cf Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tref-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-01-b.png new file mode 100644 index 000000000..fa587fe18 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-02-f.png new file mode 100644 index 000000000..58b9cd007 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-03-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-03-f.png new file mode 100644 index 000000000..31edb8356 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tselect-03-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-01-b.png new file mode 100644 index 000000000..971813e13 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-02-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-02-b.png new file mode 100644 index 000000000..ebc03c478 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-tspan-02-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-01-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-01-t.png new file mode 100644 index 000000000..d70fcdb4d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-01-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-02-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-02-t.png new file mode 100644 index 000000000..f5d5794ba Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-02-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-03-t.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-03-t.png new file mode 100644 index 000000000..0e72cf82e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/text-ws-03-t.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-01-f.png new file mode 100644 index 000000000..bd1a57ac3 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-02-f.png new file mode 100644 index 000000000..70306da2c Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-basic-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-01-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-01-b.png new file mode 100644 index 000000000..d6ddede6e Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-01-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-02-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-02-f.png new file mode 100644 index 000000000..6eac2640d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-02-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-03-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-03-b.png new file mode 100644 index 000000000..3abad76c6 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-03-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-04-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-04-b.png new file mode 100644 index 000000000..08b8ba808 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-04-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-05-b.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-05-b.png new file mode 100644 index 000000000..fd737138f Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-05-b.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-06-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-06-f.png new file mode 100644 index 000000000..25cb85ad2 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-06-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-07-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-07-f.png new file mode 100644 index 000000000..12754ba64 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-07-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-08-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-08-f.png new file mode 100644 index 000000000..5d4df4515 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-08-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgfittoviewbox-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgfittoviewbox-01-f.png new file mode 100644 index 000000000..0f7259313 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgfittoviewbox-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svglengthlist-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svglengthlist-01-f.png new file mode 100644 index 000000000..506894375 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svglengthlist-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgnumberlist-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgnumberlist-01-f.png new file mode 100644 index 000000000..4305da40d Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgnumberlist-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgstringlist-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgstringlist-01-f.png new file mode 100644 index 000000000..506894375 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgstringlist-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgtransformable-01-f.png b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgtransformable-01-f.png new file mode 100644 index 000000000..be5157b85 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/png/types-dom-svgtransformable-01-f.png differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-01-f.svg new file mode 100644 index 000000000..663a07faf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-01-f.svg @@ -0,0 +1,190 @@ + + + + + + + + + + +

+ This tests the return value required for the + SVGAnimationElement.getStartTime() method, as described in + section 19.5 DOM Interfaces. +

+ + +

+ After the loading the document, some animations that have no + visible effect will run. The text "Test running..." will + appear in the bottom right corner until the test has + completed. (This takes 2.5s.) +

+
+ +

+ The test is passed if all seven rectangles are green once the animations + have stopped running (i.e., 2.5s after the document has loaded.) +

+
+ + $RCSfile: animate-dom-01-f.svg,v $ + + + + + + + + + + Testing SVGAnimationElement.getStartTime() + + Test running... + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Called before a lone interval starts + Called on an animation with no intervals + Called during an interval + Called after a lone interval ends, fill="remove" + Called after a lone interval ends, fill="freeze" + Called with multiple begin values + Called with multiple begin values including "indefinite" + Called with syncbase begin value + + + + + $Revision: 1.11 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-02-f.svg new file mode 100644 index 000000000..c9bf32719 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-dom-02-f.svg @@ -0,0 +1,83 @@ + + + + + + + + + + +

+ This tests that the methods on the ElementTimeControl + interface return the undefined value, since the IDL + operations are declared to return void. +

+

+ After the loading the document, a rectangle is shown + indicating whether all four methods from the ElementTimeControl + interface returned undefined when invoked. The rectangle + is black if the test did not run, red if the test failed + and green if the test succeeded. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the rectangle is green. +

+
+ + $RCSfile: animate-dom-02-f.svg,v $ + + + + + + + + + + Testing ElementTimeControl method return values + + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-02-t.svg new file mode 100644 index 000000000..0dc004570 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-02-t.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + +

+ Test 'additive' and 'accumulate' attributes. +

+

+ The four pictures show the effect with the four possible combinations of + 'additive' (either 'replace' or 'sum') and 'accumulate' (either 'none' or 'sum'). + Because two animations are animating the height, the effects of 'additive' and + 'accumulate' are sometimes different than when there is only a single animation. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test has passed if the four green rectangles each animate their height according to the following:

+

The leftmost rect:

+
    +
  • when the animation starts the height of the green rect should make it align with the bottommost red indicator line
  • +
  • after two seconds the height should jump to be 10% of the height of the gray rect it overlaps
  • +
  • after four seconds the height should jump to make the green rect align with the bottommost red indicator line
  • +
  • after six seconds the height should jump to its final position, 10% of the height of the gray rect
  • +
+

The next to leftmost rect:

+
    +
  • when the animation starts the height of the green rect should be 110% of the height of the gray rect
  • +
  • after two seconds the height should jump to be 20% of the height of the gray rect
  • +
  • after four seconds the height should jump to be 110% of the height of the gray rect
  • +
  • after six seconds the height should jump to its final position, 20% of the height of the gray rect
  • +
+

The next to rightmost rect:

+
    +
  • when the animation starts the height of the green rect should make it align with the bottommost red indicator line
  • +
  • after two seconds the height should jump to be 10% of the height of the gray rect
  • +
  • after four seconds the height should jump to be 110% of the height of the gray rect
  • +
  • after six seconds the height should jump to its final position, 20% of the height of the gray rect
  • +
+

The rightmost rect:

+
    +
  • when the animation starts the height of the green rect should be 110% of the height of the gray rect
  • +
  • after two seconds the height should jump to be 20% of the height of the gray rect
  • +
  • after four seconds the height should jump to be 120% of the height of the gray rect
  • +
  • after six seconds the height should jump to its final position, 30% of the height of the gray rect
  • +
+
+ + $RCSfile: animate-elem-02-t.svg,v $ + + + + + + + + + + + + + + + + + anim.5 + + + + + + + + + anim.6 + + + + + + + + + anim.7 + + + + + + + + + anim.8 + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-03-t.svg new file mode 100644 index 000000000..2c28362de --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-03-t.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + +

+ Test inheritance of animated properties. +

+

+ Three colored text strings appear. All three are inside of the same + 'g' element. The 'g' element has its 'font-size' animated from 30 to + 40, and its 'fill' from #00f (blue) to #070 (green). +

+

+ The first colored 'text' element has the font-size set, so the + animation of the parent 'g' only affects the fill color. The second + has the fill set and font-size set, so no inherited values are + used. The font-size and fill color stay constant. The third colored + 'text' element has neither of these properties specified and thus + inherits both animated values - the fill color changes and the text + grows in size. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • the topmost line shows the text "Sample 123" that animates its fill-color smoothly from blue to green over the course of six seconds
  • +
  • the middle line shows the text "Sample 123" in a larger font-size than the first line, in blue fill-color that doesn't animate
  • +
  • the bottommost line shows the text "Sample 123" in the same font-size as the topmost line, then smoothly animating the font-size + to be larger than the middle line over the course of six seconds. At the same time the fill-color is smoothly animated from blue to green
  • +
  • after six seconds the rendered result matches the reference image
  • +
+
+ + $RCSfile: animate-elem-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + Sample 123 + Sample 123 + Sample 123 + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-04-t.svg new file mode 100644 index 000000000..343642a1e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-04-t.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Test different ways of defining a motion path. +

+

+ An animation moves a triangle along a path. Reference rectangles, lines and text + are provided to help show what the correct behavior is. +

+

+ This animation uses the 'from' and 'to' attributes to define the motion path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if a triangle is animated smoothly along the path indicated by the black line, starting at the leftmost pink rectangle and stopping after 3 seconds on top of the rightmost pink rectangle. +

+
+ + $RCSfile: animate-elem-04-t.svg,v $ + + + + + + + + + + Test a motion path + 'from'/'to' attribute. + + + 0 sec. + + 3+ sec. + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-05-t.svg new file mode 100644 index 000000000..3e1be14f3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-05-t.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + +

+ Test different ways of defining a motion path. +

+

+ An animation moves a triangle along a path. Reference rectangles, lines and text + are provided to help show what the correct behavior is. +

+

+ This animation uses the 'values' attribute to define the motion path, with a linear calcMode. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if a triangle is animated smoothly along the path indicated by the black line, and + it passes over the pink rectangles at the indicated times. + When the animation starts the triangle should be positioned on top of the leftmost pink rectangle, after + 3 seconds it should reach the middle pink rectangle, and after 6 seconds it should be positioned on top + of the rightmost pink rectangle where it should stop. +

+
+ + $RCSfile: animate-elem-05-t.svg,v $ + + + + + + + + + + Test a motion path + 'values' attribute. + + + 0 sec. + + 3+ + + 6+ + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-06-t.svg new file mode 100644 index 000000000..c95dc1f20 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-06-t.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Test different ways of defining a motion path. +

+

+ An animation moves a triangle along a path. Reference rectangles, lines and text + are provided to help show what the correct behavior is. +

+

+ This animation uses the 'path' attribute to define the motion path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the triangle is animated along the black curve over the course of 6 seconds. +

+
+ + $RCSfile: animate-elem-06-t.svg,v $ + + + + + + + + + + Test a motion path + 'path' attribute. + + + 0 sec. + + 6+ sec. + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-07-t.svg new file mode 100644 index 000000000..b59f8fda8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-07-t.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + +

+ Test different ways of defining a motion path. +

+

+ An animation moves a triangle along a path. Reference rectangles, lines and text + are provided to help show what the correct behavior is. +

+

+ This animation uses the 'mpath' sub-element to define the motion path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the triangle is animated along the black curve over the course of 6 seconds. +

+
+ + $RCSfile: animate-elem-07-t.svg,v $ + + + + + + + + + + Test a motion path + 'mpath' element. + + + 0 sec. + + 6+ sec. + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-08-t.svg new file mode 100644 index 000000000..1b28fcbb5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-08-t.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

+ Test rotate='auto' and rotate='auto-reverse'. +

+

+ Two animations have been defined that move a triangle along a path. The first animation specifies rotate='auto', which causes + the object to be rotated along the curve of the path. The second animation specifies rotate='auto-reverse', which causes the + object to be flipped and then rotated along the curve of the path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • each of the triangles are animated along the respective black curves over the course of 6 seconds
  • +
  • the leftmost triangle points upwards and the rightmost triangle points downwards
  • +
  • the triangles are rotated during the animation so that they are always perpendicular to the tangential vector at the current position on the respective curve
  • +
+
+ + $RCSfile: animate-elem-08-t.svg,v $ + + + + + + + + + Test rotate='auto' and rotate='auto-reverse' + + + + 0 sec. + + 6+ sec. + + + + rotate='auto' + + + 0 sec. + + 6+ sec. + + + + rotate='auto-reverse' + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-09-t.svg new file mode 100644 index 000000000..20f86c906 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-09-t.svg @@ -0,0 +1,97 @@ + + + + + + + + + + + + +

+ Test possible values for 'calcMode="discrete"'. +

+

+ Two animations have been defined. For each animation, ruler lines and text are provided to help show what the correct behavior is. + The black text and ruler lines help show the sizes and movement of the rectangles over time. +

+

+ The discrete animations should show stair-stepping animations, with quantum-level jumps every two seconds in these tests. The linear + animations change constantly with each keyframe to keyframe section, with the result that the change is faster when there is a larger + change within a given amount of time. The paced animations change constantly over the entire animation, regardless of the values at + particular keyframes. For calcMode='spline' in this test case, the initial rate of change is defined to be the same as linear, but the + last jump has an ease-in/ease-out effect where the change is slower at the start and end but faster in the middle. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the two orange rects are animated so that the bottom part of each rectangle is at the position + indicated by the ruler lines at the particular time noted next to each ruler line. +

+
+ + $RCSfile: animate-elem-09-t.svg,v $ + + + + + + + + + + + 0-2 sec. + 2-4 sec. + 4-6 sec. + 6+ sec. + + + + + + + + + + + + + 0-2 sec. + 2-4 sec. + 4-6 sec. + 6+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-10-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-10-t.svg new file mode 100644 index 000000000..23b1502ea --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-10-t.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + +

+ Test possible values for 'calcMode="linear"'. +

+

+ Two animations have been defined. For each animation, ruler lines and text are provided to help show what the correct behavior is. + The black text and ruler lines help show the sizes and movement of the rectangles over time. +

+

+ The linear animations change constantly with each keyframe to keyframe section, with the result that the change is faster when there is a larger + change within a given amount of time. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the two orange rects are animated so that the bottom part of each rectangle is at the position + indicated by the ruler lines at the particular time noted next to each ruler line. Between two noted times the + bottom part of each rect must be between the two corresponding ruler lines. +

+
+ + $RCSfile: animate-elem-10-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-11-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-11-t.svg new file mode 100644 index 000000000..001fb7d32 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-11-t.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ Test possible values for 'calcMode="paced"'. +

+

+ Two animations have been defined. For each animation, ruler lines and text are provided to help show what the correct behavior is. + The black text and ruler lines help show the sizes and movement of the rectangles over time. +

+

+ The paced animations change constantly over the entire animation, regardless of the values at + particular keyframes. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the two orange rects are animated so that the bottom part of each rectangle is at the position indicated by the ruler lines at the particular time noted next to each ruler line. Between two noted times the bottom part of each rect must be between the two corresponding ruler lines. +

+
+ + $RCSfile: animate-elem-11-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-12-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-12-t.svg new file mode 100644 index 000000000..ff0cc495a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-12-t.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ Test possible values for 'calcMode="spline"'. +

+

+ Two animations have been defined. For each animation, ruler lines and text are provided to help show what the correct behavior is. + The black text and ruler lines help show the sizes and movement of the rectangles over time. +

+

+ For calcMode='spline' in this test case, the initial rate of change is defined to be the same as linear, but the + last jump has an ease-in/ease-out effect where the change is slower at the start and end but faster in the middle. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the two orange rects are animated so that the bottom part of each rectangle is at the position indicated by the ruler lines at the particular time noted next to each ruler line. Between two noted times the bottom part of each rect must be between the two corresponding ruler lines. The bottom of the left rectangles and the right rectangle must always be the same throughout the animation. +

+
+ + $RCSfile: animate-elem-12-t.svg,v $ + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + at 0 sec. + at 3 sec. + at 6 sec. + 9+ sec. + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-13-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-13-t.svg new file mode 100644 index 000000000..52c4b6fa2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-13-t.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + +

+ Test 'from', 'by', 'to' and 'values'. +

+

+ Six animations have been defined. All six animations define the same simultaneous behavior, but use different combinations of + attributes 'from', 'by', 'to' and 'values'. In all cases, from time 2 seconds to time 5 seconds, the rectangle should change + from a width of 30 to a width of 300. +

+

+ The text on each line shows the attributes that were used for that particular animation. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The six orange rectangles should simultaneously animate their widths so that their right edges line up with the ruler lines at the indicated time. + From time 0 - 2 seconds all rectangles should have their right edges lined up with the leftmost ruler line, and at time 2 seconds the animation should + start, changing the widths of all the rectangles from 30 to 300. At time 5 seconds the animation should stop and the rectangles should all line up with + the rightmost ruler line. +

+
+ + $RCSfile: animate-elem-13-t.svg,v $ + + + + + + + + + + + + 0-2 sec. + 5+ sec. + + + + + from to + + + + + + from by + + + + + + by + + + + + + to + + + + + + values + + + + + + values + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-14-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-14-t.svg new file mode 100644 index 000000000..b85b279a5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-14-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ Test 'calcMode'=discrete. +

+

+ One animation has been defined to animate the height of a rectangle. Ruler lines and text are provided + to help show what the correct behavior is. The headline text shows the values for the 'calcMode' and 'keyTimes' attributes. The + black text and ruler lines help show the size and movement of the rectangle over time. +

+

+ This test shows an animation with calcMode="discrete" (i.e., a jumping animation). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The right edge of the blue rectangle should line up with the ruler lines at the indicated times, and should jump directly to each position with no animation in between. +

+
+ + $RCSfile: animate-elem-14-t.svg,v $ + + + + + + + + + calcMode="discrete" + keyTimes="0;.2;.4;.6" + + + Time (s): + 0 + + 2 + + 4 + + 6 + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-15-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-15-t.svg new file mode 100644 index 000000000..4ef4a7a96 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-15-t.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ Test 'calcMode'=paced. +

+

+ One animation has been defined to animate the width of a rectangle. Ruler lines and text are provided + to help show what the correct behavior is. The headline text shows the values for the 'calcMode' and 'keyTimes' attributes. The + black text and ruler lines help show the size and movement of the rectangle over time. +

+

+ This test shows calcMode="paced" for an animation that has constant velocity, thus showing how 'values' + and 'keyTimes' are ignored. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The blue rectangle should animate its width at a constant speed so that the right edge of the rectangle lines up with the ruler line at the indicated times. +

+
+ + $RCSfile: animate-elem-15-t.svg,v $ + + + + + + + + + calcMode="paced" + keyTimes="0;.25;.5;1" + + + Time (s): + 0 + + 1.5 + + 4 + + 9 + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-17-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-17-t.svg new file mode 100644 index 000000000..c9936b080 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-17-t.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ Test 'calcMode'=spline. +

+

+ One animation has been defined to animate the height of a rectangle. Ruler lines and text are provided + to help show what the correct behavior is. The red text shows the values for the 'calcMode' and 'keyTimes' attributes. The + black text and ruler lines help show the size and movement of the rectangle over time. +

+

+ This animation shows calcMode="spline". Between time 4 seconds and 8 seconds, the animation displays an ease-in/ease-out approach + instead of a constant linear approach which would have been the case if calcMode had been linear instead. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The blue rectangle should animate its width so that the right edge of the rectangle lines up with the ruler line at the indicated times. Between 4 and 8 seconds the animation should show an ease-in/ease-out motion (i.e. a gradual change in speed). +

+
+ + $RCSfile: animate-elem-17-t.svg,v $ + + + + + + + + + calcMode="spline" + keyTimes="0;.25;.5;1" + + + Time (s): + 0 + + 2 + + 4 + + 8 + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-19-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-19-t.svg new file mode 100644 index 000000000..e379e92d0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-19-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ Test 'calcMode'=linear. +

+

+ One animation has been defined to animate the width of a rectangle. Ruler lines and text are provided + to help show what the correct behavior is. The red text shows the values for the 'calcMode' and 'keyTimes' attributes. The + black text and ruler lines help show the size and movement of the rectangle over time. +

+

+ This test shows an animation with calcMode="linear". +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The blue rectangle should animate its width so that the right edge of the rectangle lines up with the ruler line at the indicated times. The rate of change will increase after each ruler line is passed. +

+
+ + $RCSfile: animate-elem-19-t.svg,v $ + + + + + + + + + calcMode="linear" + keyTimes="0;.5;.75;1" + + + Time (s): + 0 + + 4 + + 6 + + 8 + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-20-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-20-t.svg new file mode 100644 index 000000000..0301032fb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-20-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

+ Test hyperlinking rules as they relate to resolved start times. +

+ + +

+ Click "fade in", wait 3 seconds. Click "fade out", wait 3 seconds. Click "fade in" again, wait 6 seconds. +

+
+ +

The test is passed if:

+
    +
  • The first time "fade in" is clicked, a blue rectangle should smoothly fade from white to blue over the course of three seconds.
  • +
  • When "fade out" is clicked, the blue rectangle should smoothly fade from blue to white over the course of three seconds.
  • +
  • When "fade in" is clicked the second time, the blue rectangle should smoothly fade from white to blue over the course of three seconds, and then directly fade out from blue to white over the course of three seconds.
  • +
  • The rendered picture matches the reference image, (except + for possible variations in the labeling text (per CSS2 rules)) + after activating the link on the fade-in button the first time + and waiting three seconds for the animation to complete. The picture + should remain looking the same way indefinitely, until another + link is activated.
  • +
+
+ + $RCSfile: animate-elem-20-t.svg,v $ + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-21-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-21-t.svg new file mode 100644 index 000000000..f68aed08d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-21-t.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + +

+ Test for chained animations. +

+

+ The assumption is that you will first click on "fade in" and + then click on "fade out", each exactly once. The first time you + select the link 'fade in', you should see a blue square appearing, + gradually and smoothly fading from white to blue over the + course of three seconds. This square is in front of and thus + obscures the lower left circle, but is behind the upper right + circle. The fill color of these circles is also animated, from white to + grey. The animations are triggered by the start of the corresponding + animation of the blue square. +

+

+ With the second click on "fade in", however, the behavior might + be different. In the case of having a first click on "fade in", + waiting three seconds, and then immediately perform a first click + on "fade out", waiting three seconds, and then immediately perform + a second click on "fade in", you should see the following. After + the first click on "fade in", the blue square goes from white to blue. + After the first click on "fade out", the blue square goes + from blue to white. After the second click on "fade in", + however, the blue square goes from white to blue, and then + goes back from blue to white. This is because of the + hyperlinking rules as they relate to resolved start times in the + SMIL Animation specification. +

+ + +

+ Click "fade in", wait 3 seconds. Click "fade out", wait 3 seconds. Click "fade in" again, wait 6 seconds. +

+
+ +

The test is passed if:

+
    +
  • The first time "fade in" is clicked, a blue rectangle should smoothly fade from white to blue, and two circles should fade from white to gray, all over the course of three seconds
  • +
  • When "fade out" is clicked, the blue rectangle should smoothly fade from blue to white, and the two circles should fade from gray to white, all over the course of three seconds.
  • +
  • When "fade in" is clicked the second time, it should behave as the first time "fade in" was clicked but immediately followed by the "fade out" behaviour described above, so that the shapes all fade in over the course of three seconds, and then out again over the course of three seconds.
  • +
  • The rendered picture matches the reference image, (except + for possible variations in the labeling text (per CSS2 rules)) + after activating the link on the fade-in button the first time + and waiting three seconds for the animation to compete. The picture + should remain looking the same way indefinitely, until another + link is activated.
  • +
+
+ + $RCSfile: animate-elem-21-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-22-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-22-b.svg new file mode 100644 index 000000000..4935e923f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-22-b.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ Test which verifies that the basic facilities of declarative + animation are working. +

+

+ This test uses the following element : 'animate' +

+

+ The test is a nine second animation with no repeats. It shows + a rectangle growing from small (37.5% width, 33.3% height) to + big (100% width, 100% height) +

+

+ The file includes various guides that can be used to verify the + correctness of the animation. Outlines exist for the rectangle + size and location at times 0s, 3s and 9s. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test is passed if:

+
    +
  • At the start of the animation the innermost rectangle is filled by a yellow semitransparent color
  • +
  • Over the course of three seconds the yellow rect smoothly animates its width and height so that at time t=3s fully fills the middle rectangle
  • +
  • The animation then continues in the same fashion and at time t=9s fully fills the largest rectangle with blue stroke
  • +
+
+ + $RCSfile: animate-elem-22-b.svg,v $ + + + + + + + + + + + Yellow rect at time 0s + + Yellow rect at time 3s + + Yellow rect at time 9s + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-23-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-23-t.svg new file mode 100644 index 000000000..84e8c59c7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-23-t.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ Test which verifies that the basic facilities of declarative + animation are working. +

+

+ This test uses the following elements : 'set', + and 'animateColor'. +

+

+ The test is a nine second animation with no repeats. It shows a circle + changing color from 3s to 9s. +

+

+ The file includes various guides that can be used to verify the + correctness of the animation. + Boxes on the left show the correct circle color values at times + 3s, 6s and 9s. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • From time t=0 seconds to t=3 seconds the large rectangle is filled with black
  • +
  • At t=3 seconds a blue circle appears inside the black rectangle
  • +
  • Between time t=3 seconds and t=6 seconds the fill of the circle is animated between blue and bluegreen
  • +
  • Between time t=6 seconds and t=9 seconds the fill of the circle is animated between bluegreen and green
  • +
+
+ + $RCSfile: animate-elem-23-t.svg,v $ + + + + + + + + + + + Color at 3s + + + Color at 6s + + + Color at 9s + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-24-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-24-t.svg new file mode 100644 index 000000000..2ea2a3408 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-24-t.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + +

+ Test which verifies that the basic facilities of declarative + animation are working. +

+

+ This test uses the following elements : 'animateMotion' and + 'animateTransform' +

+

+ The test is a nine second animation with no repeats. It shows + the text string "It's alive" moving, rotating and growing from + time 3s to 9s. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The file includes various guides that can be used to verify the + correctness of the animation. Pale blue guides exist for + the text size, location and orientation at times 3s, 6s and 9s. +

+

+ The test is passed if the animated text covers the pale blue guides at + the indicated times on the test. +

+
+ + $RCSfile: animate-elem-24-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Text from 0s to 3s + Text at 6s + Text at 9s + + + + It's alive! + It's alive! + It's alive! + + + + + + It's alive! + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-25-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-25-t.svg new file mode 100644 index 000000000..8d2e0b626 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-25-t.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + +

+ Test animation options for specifying the target attribute/property. +

+

+ The left-hand rectangle animates an XML attribute without + specifying a value for 'attributeType'. The right-hand rectangle + animates an XML attribute and does set 'attributeType' to 'XML'. +

+

+ The left rectangle animates its height from 100 to 50, + starting at time 3 seconds and ending at 6 seconds. + The right rectangle animates its height from 100 to 50, + starting at time 6 seconds and ending at 9 seconds. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the left yellow rectangle animates its height from 100 to 50, + starting at time 3 seconds and ending at 6 seconds, as indicated + by the green ruler lines.
  • +
  • the right yellow rectangle animates its height from 100 to 50, + starting at time 6 seconds and ending at 9 seconds, as indicated + by the green ruler lines. +
  • +
+
+ + $RCSfile: animate-elem-25-t.svg,v $ + + + + + + + + + Test animation options for specifying the target attribute/property. + + 0-3 sec. + + at 6 sec. + + + + + 0-6 sec. + + at 9 sec. + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-26-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-26-t.svg new file mode 100644 index 000000000..0365cbfc1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-26-t.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + +

+ Test animation options for specifying the target attribute/property. +

+

+ On the left, a circle animates the stroke-width property without + specifying a value for 'attributeType'. On the right, + a circle animates the stroke-width property and does set 'attributeType' to 'CSS'. +

+

+ For each circle, guides shows what + the stroke-width looks like initially and + what it looks like at the end of the animation. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the left blue circle smoothly animates its stroke-width from time t=1 second to time t=5 seconds, so that the blue color fully fills the left donut shape
  • +
  • the right pink circle smoothly animates its stroke-width from time t=4 seconds to time t=7 seconds, so that the pink color fully fills the right donut shape
  • +
  • both of the stroke-width animations originate from the thin black circle in the middle of each donut shape
  • +
+
+ + $RCSfile: animate-elem-26-t.svg,v $ + + + + + + + + + + + + + + + + anim. 1 + + + + + + + + + anim. 2 + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-27-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-27-t.svg new file mode 100644 index 000000000..939fbd7f1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-27-t.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ Test animation options for specifying the target element. +

+

+ The leftmost rectangle verifies the use of the 'xlink:href' + attribute to indicate the target element to be animated. + The rightmost rectangle verifies animating the parent of + the 'animate' element (in this case, a 'rect' element) + (i.e., the implicit parent of the 'animate' element). +

+

+ At time 0, two rectangles filled with blue and stroked with + light blue appear, each with width=100 and height=160. Starting at + time 3 seconds and ending at time 6 seconds, the height of + the leftmost rectangle decreases from 160 to 40. Starting at + time 6 seconds and ending at time 9 seconds, the rightmost + rectangle decreases from 160 to 40. Annotations on the picture + show the correct positions at particular times. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the left blue rectangle animates its height from 160 to 40, + starting at time 3 seconds and ending at 6 seconds, as indicated + by the green ruler lines.
  • +
  • the right blue rectangle animates its height from 160 to 40, + starting at time 6 seconds and ending at 9 seconds, as indicated + by the green ruler lines. +
  • +
+
+ + $RCSfile: animate-elem-27-t.svg,v $ + + + + + + + + + Test animation options for specifying the target element. + + 0 to 3 sec. + + at 6 sec. + + + + 0 to 6 sec. + + at 9 sec. + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-28-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-28-t.svg new file mode 100644 index 000000000..8d7ea85e5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-28-t.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + +

+ Test inheritance of animated properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ A yellow happy face should be displayed. The stroke for the smile and + yellow circle are both animated, the stroke color fades from yellow to black. +

+
+ + $RCSfile: animate-elem-28-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-29-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-29-b.svg new file mode 100644 index 000000000..265f4b6ec --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-29-b.svg @@ -0,0 +1,98 @@ + + + + + + + + + + + + +

+ Test compositing of animated fill opacity. +

+ + +

+ First click once on "fade in" and + then, once the animation has completed, click once on "fade out". +

+
+ +

The first time you + select the link 'fade in', you should see a green square appearing, + gradually and smoothly fading from zero to 100% opacity over the + course of three seconds. This square is in front of and thus + obscures the lower left circle, but is behind the upper right + circle which is thus composited on top of the animated green + square. Then, when you click on "fade out", the green square will + gradually disappear, smoothly fading from 100% to zero opacity + over the course of three seconds. +

+

+ The rendered picture should match the reference image, (except + for possible variations in the labelling text (per CSS2 rules)) + after activating the link on the fade-in button the first time + and waiting three seconds for the animation to complete. The picture + should remain looking the same way indefinitely, until another + link is activated. +

+ +
+ + $RCSfile: animate-elem-29-b.svg,v $ + + + + + + + + + + + + + + + + + + Fade in + + + + Fade out + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-30-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-30-t.svg new file mode 100644 index 000000000..d27f9a1d6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-30-t.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animated <use> where + the referenced <defs> also is animated. +

+

+ The test shows 6 different elements, each element defined in a + <defs> and referenced with a <use>. All the elements are + animated between 0-3 seconds. The expected animation transform is + indicated with a gray silhouette showing the border values (0 and 3 seconds) + and an arrow indicating the movement in between. + For the two elements with a color animation, the colors goes from white to + blue (the same blue color used for all elements). +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if:

+
    +
  • Each animated element (the line, circle, three-segment polyline, image + and the two rectangles) is transformed with a continuous animation + over three seconds. The size and shape of each element must start off + as shown by the silhouette at the start of the arrow, and must end + up as shown by the silhouette at the end of the arrow.
  • +
  • The fill of the two rectangles is animated over three seconds from + white to blue.
  • +
+
+ + $RCSfile: animate-elem-30-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-31-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-31-t.svg new file mode 100644 index 000000000..60ff89466 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-31-t.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of the display attribute. +

+

+ The test shows two gray rectangles which are filled with colored circles during the length of the animation (8 sec). + The circles in the top rectangle are displayed/hidden by animating the display attribute. + The circles in the bottom rectangle are serving as the reference and are displayed/hidden by animating the visibility attribute. + A correct implementation should display/hide circles with the same color from the top and bottom rectangle at the same time. +

+

+ In total there are 6 different circles (purple, green, dodgerblue, blue, yellow, cyan) in 5 positions (blue and yellow share position) that should be displayed during the test. +

+ + +

+ Run the test. No interaction required. +

+
+ +

While the test is running (which takes approximately 8 seconds), + the text "Test running" is shown. The test passes if:

+
    +
  • While the test is running, the colored circles are variously shown and hidden.
  • +
  • A colored circle is shown in the top rectangle if and only if + the corresponding colored circle is shown in the bottom rectangle.
  • +
+
+ + $RCSfile: animate-elem-31-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + display + visibility + Test of display attribute animation. + Circles with same color should be visible at same time. + + Test running... + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-32-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-32-t.svg new file mode 100644 index 000000000..595c72dda --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-32-t.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + +

+ Tests the animation to and from the degenerate cases of the basic shapes. + The shapes are drawn within the black rectangles. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if within each of the 11 rectangles an animated shape + is shown over the first six seconds and that after the six seconds, at the + end of the animation, each of these rectangles is empty.

+
+ + $RCSfile: animate-elem-32-t.svg,v $ + + + + + + + + + + + + + Stroked + Unstroked + Zero width rect + Zero height rect + Zero radius circle + Zero x radius ellipse + Zero y radius ellipse + Zero length line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-33-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-33-t.svg new file mode 100644 index 000000000..4b50ae3d5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-33-t.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animateMotion with keyPoints and keyTimes. +

+

+ The test consists of 4 sub-tests. Each test has a purple circle which moves along a path. The path is indicated with a dashed line and sample points where the circle should pass a certain position on the path is indicated with gray circles. On top of each gray circle is a number which indicates the passing time in seconds. In the cases where the purple circle should pass the gray circle two times the first passing time is written above the gray circle and the second passing time is written below. +

+

+ Section 19.2.12 in the spec. states that a motion path is defined by the path attribute or by values or from/to attributes. So in the animateMotion case, values is just used for defining the motionPath and the number of values do not have to relate to the number of keyTimes. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if, for the first four seconds of the document, + each of the four purple circles moves along the dashed lines + such that they coincide with the gray circles at the times indicated + next to those gray circles. The purple circles must all move continuously + over the four seconds, except for the top-right one, which + jumps discontinuously at 2s from the second grey circle to + the third in that subtest.

+

If a range of times is given next to a grey circle, then the purple + circle must stay stationary at that position for that duration.

+
+ + $RCSfile: animate-elem-33-t.svg,v $ + + + + + + + + + + + 0 + 0.8-3.2 + 4 + + + + + + + + + + + + + + + 0 + 2 + 2 + 4 + + + + + + + + + + + + + + + + + + 3 + 2.6 + 0 + 1 + 4 + 1.4 + + + + + + + + + + + + + + + + 3 + 2.6 + 0 + 1 + 4 + 1.4 + + + + + + + + + + + + + + Test of keyPoints and keyTimes. + Number indicates the circle's passing time in seconds. + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-34-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-34-t.svg new file mode 100644 index 000000000..ac7893155 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-34-t.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of attributes points and fill-rule. +

+

+ The test consists of 2 sub-tests. The first test is a polygon shaped as a digit. The polygon + has an animation on its vertex points which morphs the polygon between the numbers 1, 2, 3 + and 4. The gray outlines indicates the expected position of the polygon at 1, 2, 3 and 4s. + The second test is 4 paths in a u-shape. They have animated fill-rules. Their initial + fill-rules are, from left to right, nonzero, evenodd, nonzero (by default value, no fill-rule attribute set) + and nonzero (by default value, no fill-rule attribute set). This means, that the second path is + initially u-shaped, and all other paths are initially rect-shaped. All four animations are set to evenodd as a last stage. + The further expected result is that one path at a time is filled. The other three paths are not filled but have the u-shape. + The fourth animation from evenodd to nonzero happens by going back to the initial state, + because the fill attribute is not set to freeze. Which path that should be filled at + which time is indicated by the number above it (indicating time in seconds). To enhance the + difference between the filled path and the rest, the filled path should always have the + same color as the morphing polygon. This is achieved by a discrete color animation. +

+ + +

Run the test. No interaction required.

+
+ +

The test is passed if all of the following conditions are met:

+
    +
  • The red path in the shape of the digit "1" morphs continuously over three seconds + (from 1s to 4s in document time) to the shape of "2", "3" and then "4". The gray paths + show the four shapes and positions that the red path takes as it morphs.
  • +
  • Initially, when the document is loaded, of the four paths underneath each of the + four digits, the second one is u-shaped, while the other three are square shaped. + The first path is red, while the remaining three are gray.
  • +
  • From 1s to 2s, the path below the "1" digit is red and square-shaped and the others are gray and u-shaped.
  • +
  • From 2s to 3s, the path below the "2" digit is red and square-shaped and the others are gray and u-shaped.
  • +
  • From 3s to 4s, the path below the "3" digit is red and square-shaped and the others are gray and u-shaped.
  • +
  • From 4s onwards, the path below the "4" digit is red and square-shaped and the others are gray and u-shaped.
  • +
+
+ + $RCSfile: animate-elem-34-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'points' and 'fill-rule'. + Digit should match outline at indicated time. + Filled square should follow morphing digit discretely. + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-35-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-35-t.svg new file mode 100644 index 000000000..8ced2d966 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-35-t.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of attributes stroke-dasharray, + stroke-dashoffset, stroke-miterlimit, stroke-linecap and stroke-linjoin. +

+ + + + +

+ This file contains four tests, testing animation of five attributes. + The first test animates the stroke-dashoffset. There are seven reference polylines, all with + the same stroke-dasharray but with different values on their stroke-dashoffset. A red polyline + with the same stroke-dash array has an animation on its stroke-dasharray. The red polyline is + animated so that it stops by the reference polyline that has the right stroke-dashoffset at + that perticular time. + The second test animates stroke-linecap and stroke-linejoin. There are three reference + polylines. Comparsion is done in the same manner as in the previous test. + The third test animates the stroke-miterlimit. There are two sets offilled reference paths + (black) and two outlined paths (red) with animated stroke-miterlimit. The paths are shaped like + a capital A. In the upper test the animated path is drawn on top of the reference polygons and + in the lower test the reference path is drawn on top of the animated path. As the + stroke-miterlimit is animated to different values, different reference paths are used. To pass + the test, there should never be any part of the underlying geometry visible (black in the upper + or red in the lower). + The fourth test animates the stroke-dasharray. The initial stroke-dasharray gives a + short-dashed line. This pattern is animated into a pattern that on this short path gives a + solid line at 2 seconds. +

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: animate-elem-35-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'stroke-dasharray', 'stroke-dashoffset', + 'stroke-miterlimit', 'stroke-linecap' and 'stroke-linejoin'. + + + $Revision: 1.8 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-36-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-36-t.svg new file mode 100644 index 000000000..460f76b82 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-36-t.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + +

+ This test validates the animation of the transform attribute on structure + elements, hyperlinks and text elements. +

+

+ The test applies an <animateTransform> on various element types: <g>, + <use>, <image>, <switch>, <a> and <text>. In all + cases, the type is a rotation and all the elements should rotate together about + their centers, for 3s, starting at the document's load time. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if each of the seven flower-like shapes (the four above "<use>" + and the ones above "<g>", "<switch>" and "<a>"), the image and + the text "123" rotate clockwise, then anti-clockwise, then clockwise again, + over the course of a few seconds.

+

The static reference image shows the final state of the animation.

+
+ + $RCSfile: animate-elem-36-t.svg,v $ + + + + + + + + + <animateTransform> on structure, + hyperlinking and text elements + + + + + + + + + + + + + + + <g> + + + + + + + + + + + <use> + + + + + + + <image> + + + + + + + + + + + + + + + + + + <switch> + + + + + + + + + + + + + + + + <a> + + + + + + + + + + + + + + 123 + + + + <text> + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-37-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-37-t.svg new file mode 100644 index 000000000..c6c6ee3fc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-37-t.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + +

+ This test validates the animation of the transform attribute shape elements. +

+

+ The test applies an <animateTransform> on various element + types: <g>, <use>, <image>, <switch>, + <a> and <text>. + In all cases the animation should run for 3s, starting at the document's load time. + The <circle> has a scale animation, and all the rest of the elements should rotate together about their centers. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if:

+
    +
  • each of the seven shapes rotates clockwise, then anti-clockwise, then clockwise again,
  • +
  • and the circle is scaled down, then up, then down again
  • +
+

over the course of three seconds.

+

The static reference image shows the final state of the animation.

+
+ + $RCSfile: animate-elem-37-t.svg,v $ + + + + + + + + + <animateTransform> shape elements + + + + + <path> + + + + + + <rect> + + + + + + <circle> + + + + + + <ellipse> + + + + + + <line> + + + + + + <polyline> + + + + + + <polygon> + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-38-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-38-t.svg new file mode 100644 index 000000000..f9681c685 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-38-t.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of the viewBox attribute. +

+ + +

+ Run the test. No interaction required +

+
+ +

+ The viewBox changes position and size + several times. At each new setting, a green indicator frame will flash a couple of times. + This frame must only appear at the edges of the SVG element. +

+
+ + $RCSfile: animate-elem-38-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on: 'viewBox'. Flashing frame should + only appear at the edges of the SVG element. + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-39-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-39-t.svg new file mode 100644 index 000000000..b21056630 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-39-t.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + +

+ This test validates that the xlink:href attribute can be animated on + the <a>, <image> and <use> elements, using the <animate> + or <set> animation elements. +

+

+ For the <a> animation, showing on the left-most column, the number + indicates the number of the animation test currently linked by the xlink:href + attribute. For example, when the xlink:href animated value is "animate-elem-38-t.svg", + the text displays "38". When the user clicks on the displayed number, the user + agent should open the corresponding link. For example, if the user clicks on 38, + then the "animate-elem-38-t.svg" URI should be followed. If the user clicks on 02, + then the "animate-elem-02-t.svg" URI should be followed. +

+

+ For the <image> animations, the image xlink:href attribute cycles through + two values showing a sun set and a picture of the sydney opera. The image should + change every second and the images shown by the <set> and <animate> + animations should always match. +

+

+ For the <use> animations, the use xlink:href attribute cycles through + values "#useA" and "#useB" which reference text elements displaying values + "Use A" and "Use B". The change should happen every second and the text shown + for the two animations (<set> and <animation>) should always + match. +

+ + +

Run the test. Note each of the six subtests alternating (using animation) + between two states. (The pass criteria indicate what must be shown for + each of these.) Click on the top circle while it is showing "02": the + test animate-elem-02-t should be loaded. Go back, then click on the circle + again while it is showing "38": the test animate-elem-38-t should be + loaded. Go back again, then click on the bottom circle while it is showing + "03": the test animate-elem-03-t should be loaded. Go back again, then + click on the bottom circle while it is showing "09": the test animate-elem-09-t + should be loaded.

+
+ +

Every one second, the document alternates between two states. In the first + state, the top circle shows the number "02", the bottom circle shows "03", + the two images show a picture of the Sydney Opera House, and the two 'use' + elements show the text "Use A". In the second state, the top circle shows + the number "38", the bottom circle shows "09", the two images show a + picture of some water and land, and the two 'use' elements show the text "Use B".

+

The test passes if the document does alternate between these two states, + and that clicking on the circles produces the behavior described in the operator + script.

+
+ + $RCSfile: animate-elem-39-t.svg,v $ + + + + + + + + + <animate> on xlink:href + + + <set> + + + + + + 38 + 02 + + + + + <a> + + + + + + + <image> + + + + + Use A + Use B + Use C + + + + + + + <use> + + + + <animate> + + + + + + 09 + 03 + + + + + <a> + + + + + + + <image> + + + + + + + + <use> + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-40-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-40-t.svg new file mode 100644 index 000000000..c019e9766 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-40-t.svg @@ -0,0 +1,239 @@ + + + + + + + + + + + + +

+ This test validates that the x and y attributes can be animated on + <use>, <image>, <rect> and <text> elements. + The test also validates that the width and height attributes can + be animated on <image> and <rect> +

+

+ For x and y animation, each test shows the reference positions at + specific points in the animation. These markers are highlighted + at the time the target element's x/y position should match that of + the marker. For the <text> element, there are two tests. The + first one tests animating a single value on the text's x and y attributes. + The second one tests animating x, y values where there are values for each + of the text's characters. For that test (bottom left), there is a set of + reference markers for each of the characters ('1' and '2'). +

+

+ For width and height animation (the two tests on the bottom right), the + outline showing the expected width and height at given points in the animation + is highlighted at the time the marker's width and height should match that + of the target element. +

+ + +

Run the test. No interaction required.

+
+ +

Over the course of four seconds, the positions and sizes of elements + within the document are animated. The test passes if the following + conditions are met:

+
    +
  • In the first four subtests, the shape, image or text moves clockwise once along + the perimeter of a square whose corners are indicated by the small grey squares.
  • +
  • In the fifth subtest ("x/y on <text>(2)"), the number "1" moves clockwise + along the perimeter of a square as in the first four subtests, while the number "2" + does the same except in an anti-clockise direction.
  • +
  • In the sixth subtest, the width and height of the image are animated continously, + from the initial square size, to the wide and short rectangle, to the narrow and + tall rectangle, and back to the square. At each point when it reaches one of these + key sizes, the yellow outline indicating the size is shown thicker momentarily. + This animation takes only three seconds.
  • +
  • In the seventh subtest, the gray rectangle's width and height are animated in + the same way as the image in the sixth subtest.
  • +
+
+ + $RCSfile: animate-elem-40-t.svg,v $ + + + + + + + + + <animate> of x/y/width/height + + + + + + + + + + + + + + + + + + + + + + + + + + + + x/y on <use> + + + + + + + + + + + x/y on <image> + + + + + + + + + + + x/y on <rect> + + + + + + + + + + + + x/y on <rect> + + + + + + + + + + + + + + 123 + + + + + + + x/y on <text> + + + + + + + + + + + + + + + + + + 12 + + + + + + + x/y on <text>(2) + + + + + + + + + + + + + + + + + + + + + width/height + on <image> + + + + + + + + + + + + + + + + + + + + + + width/height + on <rect> + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-41-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-41-t.svg new file mode 100644 index 000000000..fbba0e7b6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-41-t.svg @@ -0,0 +1,445 @@ + + + + + + + + + + + + +

+ This test validates the operation of the animate element on the various graphics + properties. This test is very similar to animate-elem-78-t which uses the set element + instead of the animate element to modify graphics properties. +

+

+ For each of the graphics properties, there are three tests. One animates the graphics + property directly on an element (such as a rect or a line) which uses the + property. The other two tests apply the animation on a container element (g and + a), and validate that the animated property is inherited by elements which + are child of the container. +

+ + +

Run the test. No interaction required.

+
+ +

+ There are 11 graphics properties that are animated, and for each of these, + they are animated in one of three different ways (the three columns). The + three animations in each row must be the same. +

+

+ For each animation test, the element on which the animation is applied is also + translated by an animation so that the various states of the animation can + be checked more easily: +

+
    +
  • For those tests that have two light gray silhouettes + (fill-rule, stroke-linecap, stroke-linejoin, stroke-miterlimit and stroke-dashoffset), + the animated element's shape must be the same as the left silouhette at the + start of the animation and the same as the right silhouette at the end of + the animation.
  • +
  • For the continous paint animations (fill, stroke and color), + three references shapes show the color that the animated element must be + at the start, middle and end of the animation.
  • +
  • For the stroke-width test, the two dark gray reference shapes show the + width of the short, animated horizontal line must be at the start and the end + of the animation.
  • +
  • For the display and visibility tests, the single light gray silhouette + shows the position the animated element must be at at the start of the animation. + At the end of the animation, these animated elements must not be visible.
  • +
+

+ The following animations must show continuous changes: fill, stroke, + stroke-width, stroke-dashoffset and color. +

+

+ The following animations must show discrete animation changes: fill-rule, stroke-linecap, + stroke-linejoin, stroke-miterlimit, display and visibility. The point at which + the change takes place must be half way through the animation, except for the + stroke-miter animation, which must change a quarter of the way through. + (Note that visually, stroke-miterlimit shows a sharp transition even though its value + is animated continuously, but that is because the miter is cut off when + the animated miter limit reaches the test sharp angle's miter value.) +

+

The test passes if all of the above criteria are met.

+
+ + $RCSfile: animate-elem-41-t.svg,v $ + + + + + + + + + graphics + + + fill + fill-rule + stroke + stroke-width + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-dashoffset + display + visibility + color + + + + element + <g> + <a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-44-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-44-t.svg new file mode 100644 index 000000000..3c75b6d3a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-44-t.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of the d + attribute of the path element. +

+

+ This test consists of a path, specified as a series of + lineto commands, whose d attribute is animated. + The path morphs between the numbers 1, 2, 3, and 4. + The gray outlines indicates the expected position of the polygon at 1, 2, 3 and 4s. + The test contains an animated circle that indicates where + the path should be at a given time. +

+ + +

Run the test. No interaction required.

+
+ +

The test is passed if all of the following conditions are met:

+
    +
  • The red path in the shape of the digit "1" morphs continuously over three seconds + (from 1s to 4s in document time) to the shape of "2", "3" and then "4". The gray paths + show the four shapes and positions that the red path takes as it morphs.
  • +
  • From 0s to 2s, the circle below the "1" digit is red and the others are gray.
  • +
  • From 2s to 3s, the circle below the "2" digit is red and the others are gray.
  • +
  • From 3s to 4s, the circle below the "3" digit is red and the others are gray.
  • +
  • From 4s onwards, the circle below the "4" digit is red and the others are gray.
  • +
+
+ + $RCSfile: animate-elem-44-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Animation on the 'd' + attribute of path. + + Digit should match outline at indicated time. + Filled circle should follow morphing digit discretely. + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-46-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-46-t.svg new file mode 100644 index 000000000..7fc7397e2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-46-t.svg @@ -0,0 +1,279 @@ + + + + + + + + + + + + +

+ This test validates the operation of the animate element on the various + text and font properties. This test is very similar to animate-elem-77-t.svg + which uses the set element instead of the animate element to modify graphics + properties. +

+

+ For each text or font properties, there are three tests. One animates the text or font + property directly on a text element which uses the + property. The other two tests apply the animation on a container element (g and + a), and validate that the animated property is inherited by children text elements. +

+

+ For each animation test, the element on which the animation is applied is also + translated by an animation so that the various states of the animation can + be checked more easily. There is a gray reference marker which shows + the expected animation state at the begining of the animation, mid-way, or at the + end of the animation. +

+ + +

Run the test. No interaction required.

+
+ +

+ There are 5 text properties that are animated, and for each of these, + they are animated in one of three different ways (the three columns). The + three animations in each row must be the same. +

+

+ For each animation test, the element on which the animation is applied is also + translated by an animation so that the various states of the animation can + be checked more easily. Each test has three gray silhouettes, showing the size + and shape that the "A" must have at the start, middle and end of the animation. +

+

+ The animation of font-size must show a continuous change of the font size. +

+

+ The following animations must animate discretely: text-anchor, font-family, + font-style, font-weight. +

+

+ The test passes if all of the above conditions are met. +

+
+ + $RCSfile: animate-elem-46-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text-anchor + font-size + font-family + font-style + font-weight + + + + <text> + <g> + <a> + + + + + + + A + + A + + A + + + + + + + + + + + + A + + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + A + A + A + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + + A + A + A + + + + + + + + A + + + + + + + A + + + + + + A + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-52-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-52-t.svg new file mode 100644 index 000000000..190baa75a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-52-t.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test eventbase targets. +

+

+ The test consists of 4 rectangles named A, B, C, D. The D rectangle contains + three animations changing the color of the animation target. + Each animation applies to one of the other rectangles + by using xlink:href. Clicking on rect A should change it's + color immediately, clicking B changes its color after 2 seconds, + clicking C changes its color after 4 seconds and clicking D shows no visible change + (although D contains the animations the event target for each + animation is the referenced rectangle, this rectangle is also the + animation target.) +

+

+ The following sections in the SMIL Animation spec (http://www.w3.org/TR/smil-animation/) + are relevant as confirmation of this test: + The SMIL spec(3.6.7 subsection "Event Values") states that "If the + Eventbase-element term is missing, the event-base element is defined to + be the target element of the animation" + The SMIL spec (3.1 subsection "The target element") says that the + animation target may be defined explicitly thru the targetElement IDREF + or href URI. + So in this test, the animation target is defined through + xlink:href and the event base per definition is then also this + referenced element. +

+ + +

Run the test. Click on each of the four blue rectangles from left to right.

+
+ +

The test passes if all of the following conditions are met:

+
    +
  • the A rectangle turns yellow immediately when clicked
  • +
  • the B rectangle turns yellow two seconds after being clicked
  • +
  • the C rectangle turns yellow four seconds after being clicked
  • +
  • at the time the C rectangle turns yellow, the D rectangle is still blue
  • +
+
+ + $RCSfile: animate-elem-52-t.svg,v $ + + + + + + + + + A + B + C + D + + + + + click A + + + + + click B+2 + + + + + click C+4 + + + + + never + + + + + + + Test of Eventbase targets. + Note that clicking rect D should give no result. + Clicking a rectangle should change its color at the + time for the click + delay as indicated in each rect. + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-53-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-53-t.svg new file mode 100644 index 000000000..7c34d36a3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-53-t.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + +

+ The purpose of this test is to test animation of points and calcmode. +

+ + + + +

+ 1. The green squares should animate together side by side. This applies + to the blue ones as well. + 2. The time values indicate when the squares should reach the + corresponding reference square. + 3. The total distance is 0+40+80+24.14=144.14 + a. The "green animation" is 9 sec and linear so each interval + should get 3 sec. + b. The "blue animation" is 8 sec and paced so the intervals + should get 2.22, 4.44 and 1.34 sec each. +

+

+ Here comes a more detailed description of the animation. + + The left green square (LG) is animated by animating the points with + a value array, consisting of 4 lists of points. This is an animation + with calc-mode=linear so an equal amount of time should be spent on + all 4 intervals. The right green square (RG) is animated by a simple + linear motion followed by a scale to follow LG. + The last scale by 1.9428 correspond to a movement of the lover right + corner of the square by sqrt((30*0.9428)^2 + (30*0.9428)^2) which is + approximately 40 distance units. This is the same distance as the first + interval in the values array (and half the second interval). + The length (in terms of distance) is not really important for the + green squares but for the blue squares which are animated with + calc-mode=paced the length is used to calculate the time for each + interval. + Since the first and last interval are of the same length which + totals to the length of the middle interval, the interval should + be given time according to [27.75%(2.22sec);55.5%(4.44sec);16.75%(1.34sec)]. + + So the left blue square (LR) is animated just as the LG square but + with calc-mode=paced. The same applies to the right blue square (RR) + that has default calc-mode (paced for animateMotion) compablue to the + RG square that has calc-mode=linear. + The calc-mode for the scale of RR (and RG) is not important since + it's not a value list type of animation. +

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: animate-elem-53-t.svg,v $ + + + + + + + + + + + + + + 0s + + 3s + + 6s + + 9s + + + + + + + + + + + + + 0s + + 2.22s + + 6.66s + + 8s + + + + + + + + + + + Animation on: 'points' with 'calc-mode'. + Coloblue and black squares should match at indicated time. + Same coloblue squares (green and blue) should match at all times + + + $Revision: 1.7 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-60-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-60-t.svg new file mode 100644 index 000000000..2b3837487 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-60-t.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + +

+ This test performs basic test on the begin attribute, + assuming support for the <set> element and setting the + fill attribute on a <rect> element. +

+

+ The test validates the various possibilities for the begin attribute + value: no specified value, offset value, event base value, sync base + value, indefinite value, repeat value, accessKey value and wallclock. +

+

+ There is one or several <set> elements for each of the possible begin + values. For each test, the <set> element(s) has (or have) an indefinite + duration and no other timing attribute specified other than begin + and dur. +

+

+ There are two sets of vertical markers which help check that the test + is handled properly by the user agent. The first set, on the left, shows + markers from 0s to 8s, where the times are offset from the document's load time. + The rectangles in that area should turn green at the time corresponding + to the column they are in. From example, the first rectangle (going left to right) + on the "sync base" line should turn green 2 seconds after the document's load. + The second set of time vertical markers shows offset from a particular event. + For example, for the event base, the markers show an offset to the time + the first event base rectangle (the left-most one) is clicked on. For the + accessKey line, the times show offsets from the time the 'a' key is pressed + and the document has focus. +

+

+ The first <set> has an unspecified begin attribute. That value + defaults to an offset of 0s so the animation should apply as soon as + the document is loaded. +

+

+ The second <set> has its begin attribute set to '2s'. So its + target rectangle should turn green two seconds after the document is + loaded. +

+

+ The third <set> has its begin attribute set to an event base + value 'click'. The user has to click on the left-most target red rectangle + to make the <set> target turn green. There are two rectangles + with associated <set> elements. The left most ones has a simple + value (no offset) and the second one is offset from the event time by 2 seconds. +

+

+ The fourth <set> elements have their begin attributes set to a sync base + value. The first two rectangles have <set> elements synchronized on their sync base + begin. The left-most one has no offset and the following one has a 2 seconds offset. + The last two rectangles have <set> elements synchronized on their sync base end. + The first one (i.e., the third from left to right on that line), has a 2 seconds + negative offset. The second one (i.e., the last one on the line) has no offset and should + begin at the time its sync base ends. +

+

+ The fifth <set> has its begin attribute set to indefinite and + should not turn red and stay green. +

+

+ The sixth <set>s have their begin attributes have their begin attributes + based on the repeat() function. The repeat they are synchronized on happens + at 3s. The first <set>, which has no offset, should begin at 3s. The + second <set>, which has a 2 seconds offset, should start at 5s. +

+

+ The seventh <set>s have their begin attributes set to 'accessKey(a)'. + The first one has no offset and should become active (and turn the rectangle + green), as soon as the key 'a' is pressed in the user agent. The second <set> + has a 2s offset and should become active 2 seconds after the 'a' key is pressed in + the user agent. +

+

+ The eight's <set> target has its begin attribute set to + 'wallclock()'. Therefore, the target should turn red because the + target wallclock time is in the past. The SMIL specification states the following about wallclock values in the past: + "When a begin time is resolved to be in the past (i.e., before the current presentation time), the element begins immediately, + but acts as though it had begun at the specified time (playing from an offset into the media)." (http://www.w3.org/TR/2001/REC-smil-animation-20010904/#AnimFuncTiming). +

+ + +

Run the test. Observe the document for at least eight seconds. + Then, click on the first red square in the "event base" row, + and observe the document for two seconds. Then, press "a" + on the keyboard, and observe the document for another two seconds.

+
+ +

The test passes if the following conditions are met:

+
    +
  • In the first eight seconds of the document, the 10 squares + in the left section of the test must become green at the time + at the top of the column they are in. For example, the square in + the "offset" row must become green at 2s after the document has + been loaded.
  • +
  • Immediately once the red square in the "event base" row has been clicked, + it must become green. Two seconds after the click, the second square + must become green.
  • +
  • Immediately once "a" has been pressed on the keyboard, + the first square in the "accessKey()" row must become green. + Two seconds after the keypress, the second square must become green.
  • +
  • No other changes occur in the document.
  • +
+
+ + $RCSfile: animate-elem-60-t.svg,v $ + + + + + + + + + begin + + + unspecified + offset + event base + sync base + indefinite + repeat() + accessKey() + wallclock() + + + + 0s + 1s + 2s + 3s + 4s + 5s + 6s + 7s + 8s + 0s + 1s + 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-61-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-61-t.svg new file mode 100644 index 000000000..08666d108 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-61-t.svg @@ -0,0 +1,191 @@ + + + + + + + + + + + + +

+ This tests validates multiple begin conditions in the begin attribute, + assuming support for the <set> element and setting the + fill attribute on a <rect> element. +

+

+ The test validates the various possibilities for the begin attribute + value: multiple offset values, multiple event base values, multiple sync base + values, multiple repeat values, and multiple accessKey values. Finally, + the test validates that begin values of different kinds can be mixed. +

+

+ The test shows 6 rows where a red rectangle' s x attribute is animated + with <set> elements. +

+

+ On the first three rows, the red rectangles should show on the left from + 0 to 1s. From 1 to 2s, the rectangles should show on the right. Then + the rectangles should show on the left from 2 to 4s, then on the right + again from 4 to 5s and come back to the left position and stay there + after 5s. +

+

+ On the fourth row, the rectangle's begin condition is event based + and requires a user click. After the user clicks on the rectangle, + the rectangle should move to the right position for 1s, then move + back to the left position for 3 seconds, move again to the right + position for 1 second before going back to the left position. +

+

+ On the fifth row, the rectangle's begin condition is accessKey based + and requires a user to press the 'a' key. After the user presses that key + the rectangle should move to the right position for 1s, then move + back to the left position for 3 seconds, move again to the right + position for 1 second before going back to the left position. +

+

+ The last row's rectangle has a begin condition with two offset values + (1s;4s) and should behave like the rectangles of the first three + rows for the first 5 seconds of the document's timeline. In addition, + the begin condition has a click event base and thus, the rectangle + should move to the right position for one second every time the user + clicks on it. Finally, the begin condition also has an accessKey condition + for the 'b' character. Thus, the rectangle should move to the right + position every time the user presses the 'b' key. +

+ + +

Run the test. Observe the document for a least six seconds. + Then, click on the left square in the "2 event base" row and + wait for another six seconds while observing. Then, press "a" + on the keyboard and wait for another six seconds while observing.

+
+ +

The test passes if all of the following conditions are met:

+
    +
  • The red squares in the top three rows and the bottom row are + in the relevant column according to the times written above the columns: + in left column for the first second of the document, in the + right column between 1s and 2s, in the left column again between + 2s and 4s, in the right column again between 4s and 5s, and finally + revert to the left column at 5s.
  • +
  • Once the red square in the "2 event base" row is clicked, it must + follow the same movements as the earlier animated squares, except that + the times above the columns indicate offsets from the time of the click, + rather than from the start of the document. Thus, the red square must + be in the left column in the first second after being clicked, + in the right column between 1s and 2s after being clicked, + in the left column again between 2s and 4s after being clicked, + in the right column again between 4s and 5s after being clicked, + and finally must revert to the left column 5s after being clicked.
  • +
  • Once the "a" key is pressed, the red square in the "2 accessKeys" + row must follow the same movements as the first set of animated squares, except that + the times above the columns indicate offsets from the time of the keypress, + rather than from the start of the document. Thus, the red square must + be in the left column in the first second after the keypress, + in the right column between 1s and 2s after the keypress, + in the left column again between 2s and 4s after the keypress, + in the right column again between 4s and 5s after the keypress, + and finally must revert to the left column 5s after the keypress.
  • +
+
+ + $RCSfile: animate-elem-61-t.svg,v $ + + + + + + + + + multiple begin + + + 2 offsets + 2 sync bases + 2 repeat + 2 event base + 2 accessKeys + misc + + + + 0-1s + 2s-4s + > 5s + + 1-2s + 4-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-62-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-62-t.svg new file mode 100644 index 000000000..43590af4d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-62-t.svg @@ -0,0 +1,260 @@ + + + + + + + + + + + + +

+ This test performs basic test on the end attribute, + assuming support for the <set> element and setting the + fill attribute on a <rect> element. +

+

+ The test validates the various possibilities for the end attribute + value: no specified value, offset value, event base value, sync base + value, indefinite value, repeat value, accessKey value and wallclock. +

+

+ There are one or several <set> elements for each of the possible end + values. For each test, the <set> element(s) has (or have) an indefinite + duration and no other timing attribute specified other than end + and dur. +

+

+ There are two sets of vertical markers which help check that the test + is handled properly by the user agent. The first set, on the left, shows + markers from 0s to 8s, where the times are offset from the document's load time. + The rectangles in that area should turn green at the time corresponding + to the column they are in. From example, the first rectangle (going left to right) + on the "sync base" line should turn green 2 seconds after the document's load. + The second set of time vertical markers shows offset from a particular event. + For example, for the event base, the markers show an offset to the time + the first event base rectangle (the left-most one) is clicked on. For the + accessKey line, the times show offsets from the time the 'a' key is pressed + and the document has focus. +

+

+ The first <set> has no end attribute and an indefinite duration. + Since there are no constraints on the active duration (no end attribute) the + active duration is the same as the simple duration (indefinite). This + means that the animation begins at 0s and has an indefinite end time. +

+

+ The second <set> has its end attribute set to '2s'. So its + target rectangle should turn green two seconds after the document is + loaded. +

+

+ The third <set> has its end attribute set to an event base + value 'click'. The user has to click on the left-most target red rectangle + to make the <set> target turn green. There are two rectangles + with associated <set> elements. The left most ones has a simple + value (no offset) and the second one is offset from the event time by 2 seconds. +

+

+ The fourth <set> elements have their end attributes set to a sync base + value. The first two rectangles have <set> elements synchronized on their sync base + end. The left-most one has no offset and the following one has a 2 seconds offset. + The last two rectangles have <set> elements synchronized on their sync base end. + The first one (i.e., the third from left to right on that line), has a 2 seconds + negative offset. The second one (i.e., the last one on the line) has no offset and should + end at the time its sync base ends. +

+

+ The fifth <set> has its end attribute set to indefinite and + should not turn red and stay green. +

+

+ The sixth <set>s have their end attributes have their end attributes + based on the repeat() function. The repeat they are synchronized on happens + at 3s. The first <set>, which has no offset, should end at 3s. The + second <set>, which has a 2 seconds offset, should start at 5s. +

+

+ The seventh <set>s have their end attributes set to 'accessKey(a)'. + The first one has no offset and should become active (and turn the rectangle + green), as soon as the key 'a' is pressed in the user agent. The second <set> + has a 2s offset and should become active 2 seconds after the 'a' key is pressed in + the user agent. +

+

+ The eight's <set> target has its end attribute set to + 'wallclock()'. The result depends on the presentation time. + If the document is viewed completely before 2200-06-10T12:34:56Z, + the rectangle has to be always green. begin is not explicitely set, therefore + it is zero, dur is indefinite and end is in the future. + If the document is viewed completely after 2200-06-10T12:34:56Z, the only end + value is before the implicitely given only begin value and therefore the set + does not start, the rectangle remains red. If the document is viewed in a time interval started before + 2200-06-10T12:34:56Z and ended after this date, the rectangle will start green at the beginning, change to red at + 2200-06-10T12:34:56Z and will remain red until the end of presentation. +

+ + +

Run the test. Observe the document for at least eight seconds. + Then, click on the first red square in the "event base" row, + and observe the document for two seconds. Then, press "a" + on the keyboard, and observe the document for another two seconds.

+
+ +

The test passes if the following conditions are met:

+
    +
  • In the first eight seconds of the document, the 10 squares + in the left section of the test must become green at the time + at the top of the column they are in. For example, the square in + the "offset" row must become green at 2s after the document has + been loaded.
  • +
  • Immediately once the red square in the "event base" row has been clicked, + it must become green. Two seconds after the click, the second square + must become green.
  • +
  • Immediately once "a" has been pressed on the keyboard, + the first square in the "accessKey()" row must become green. + Two seconds after the keypress, the second square must become green.
  • +
  • No other changes occur in the document.
  • +
+
+ + $RCSfile: animate-elem-62-t.svg,v $ + + + + + + + + + end + + + unspecified + offset + event base + sync base + indefinite + repeat() + accessKey() + wallclock() + + + + 0s + 1s + 2s + 3s + 4s + 5s + 6s + 7s + 8s + 0s + 1s + 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-63-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-63-t.svg new file mode 100644 index 000000000..63cfc7a61 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-63-t.svg @@ -0,0 +1,200 @@ + + + + + + + + + + + + +

+ This tests validates multiple end conditions in the end attribute, + assuming support for the <set> element and setting the + dur attribute to 'indefinite'. +

+

+ The test validates the various possibilities for the end attribute + value: multiple offset values, multiple event base values, multiple sync base + values, multiple repeat values, and multiple accessKey values. Finally, + the test validates that end values of different kinds can be mixed. +

+

+ The test shows 6 rows where a red rectangle's x attribute is animated + with <set> elements. +

+

+ On the first three rows, the red rectangles should show on the left from + 0 to 1s. From 1 to 2s, the rectangles should show on the right. Then + the rectangles should show on the left from 2 to 4s, then on the right + again from 4 to 5s and come back to the left position and stay there + after 5s. +

+

+ On the fourth row, the rectangle's end condition is event based + and requires a user click. One of the end condition is defined + to be 5 seconds prior to the click and one is defined to be 5 + seconds after the click. If the user clicks on the rectangle + before 5 seconds (in document time), the red rectangle we move + to the left position 5 seconds after the click (because the + 'click - 5s' end time resolves to a time prior to the begin + time). If the user clicks after 5 seconds (in document time), + then the red rectangle moves to the left position immediately because + the 'click - 5s' time resolves to a time after the begin time. +

+

+ On the fifth row, the rectangle's end condition is accessKey based + and requires a user to press the 'a' key. The behavior is exactly the + same as for the previous row, except that the triggering event + is the 'a' key press. +

+

+ The last row's rectangle has a end condition with two offset values + (1s;4s) and should behave like the rectangles of the first three + rows for the first 5 seconds of the document's timeline. In addition, + the end condition has a click event base and thus, the rectangle + should immediately move to the left position if the user everytime the user + clicks clicks on the rectangle when it is on the right position. + Finally, the end condition also has an accessKey condition + for the 'b' character. Thus, the rectangle should move to the left + position every time the user presses the 'b' key and the rectangle is + on the right position. +

+ + +

Run the test. Observe the document for six seconds. + Then, click the red square in the "2 event base" row + and then press "a" on the keyboard.

+

Next, reload the test. Before five seconds have elapsed, + click the red square in the "2 event base" row and then + press "a" on the keyboard. Observe the document for another six seconds.

+
+ +

The test passes if the following conditions are met:

+
    +
  • In the first load of the document, the red squares in the top three + rows and the bottom row are in the relevant column according to the + times written above the columns: in left column for the first second + of the document, in the right column between 1s and 2s, in the left + column again between 2s and 4s, in the right column again between 4s + and 5s, and finally revert to the left column at 5s. During this + whole time, the red squares on the "2 event base" and "2 accessKeys" + rows must be in the right column.
  • +
  • In the first load of the document, immediately once the red + square is clicked, it must move to the left column.
  • +
  • In the first load of the document, immediately once "a" is pressed + on the keyboard, the red square in the "2 accessKeys" row must move + to the left column.
  • +
  • In the second load of the document, five seconds after the red + square is clicked, it must move to the left column.
  • +
  • In the second load of the document, five seconds after "a" is pressed + on the keyboard, the red square in the "2 accessKeys" row must move + to the left column.
  • +
+
+ + $RCSfile: animate-elem-63-t.svg,v $ + + + + + + + + + multiple end + + + 2 offsets + 2 sync bases + 2 repeat + 2 event base + 2 accessKeys + misc + + + + 0-1s + 2s-4s + > 5s + + 1-2s + 4-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-64-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-64-t.svg new file mode 100644 index 000000000..f13a1e9d3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-64-t.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on the dur attribute. +

+

+ The first row shows a red rectangle subject to a <set> animation + with no begin attribute, no end attribute and a dur attribute set to + '2s'. Therefore, the animation should be active from 0 to 2 seconds and + then terminate. Consequently, the rectangle should show on the right + for the first two seconds, and then move to the left position. +

+

+ The second row shows a red rectangle subject to a <set> animation + with no begin attribute, no end attribute and a dur attribute set to + 'indefinite'. Therefore, the animation should stay active indefinitely + and the rectangle should always be on the right position, never on the + left position. +

+

+ Finally, the third row shows red rectangle subject to a <set> animation + with no begin attribute, no end attribute and a dur attribute set to + 'media'. In the context of SVG 1.1, this is equivalent to an 'indefinite' + value. Therefore, the animation should stay active indefinitely + and the rectangle should always be on the right position, never on the + left position. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if after three seconds, in each of the three rows, + the red rectangle is in the column at the times indicated. + Thus, from the document load until 2s afterwards, the red + square in the first row must be in the right column, + and after the 2s it must be in the left column. In the + other two rows, the red square must remain in the + right column.

+
+ + $RCSfile: animate-elem-64-t.svg,v $ + + + + + + + + + dur + + + clock value + indefinite + media + + + + > 2s + 0s-2s + + + never + > 0s + + + + never + > 0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-65-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-65-t.svg new file mode 100644 index 000000000..6c51f3f6b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-65-t.svg @@ -0,0 +1,223 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on the min attribute. The test is based + on the SMIL specification at: + http://www.w3.org/TR/smil20/smil-timing.html#Timing-MinMax. +

+

+ Each row in the test shows different rectangles subject to <set> + animations with different configurations with regards to the min + attribute. For each row but the last one, the animation should be active + during the first 5 seconds of the animations where the red rectangle + should show in the right column. At five seconds into the animation, + all the rectangles should move to their left position. +

+

+ On the first row, the first <set> animation (left rectangle) has an end value of 5s, + and no min attribute. The active duration resulting from the end attribute is 5s. + The first row shows a second rectangle with a <set> animation with + the same configuration except that the min attribute value is set to + 'media'. Because the <set> element does not define a media, the + behavior should be as if the attribute was not specified. The active duration (5s) + of the second <set> animation is therefore not constrained. +

+

+ On the second row, the <set> animation has an end value of 5s, + and a -6s min attribute. The active duration resulting from the end attribute is 5s. + The negative min value is invalid and, as per the specification, the behavior should be + as if the attribute was not specified. The active duration (5s) is therefore not constrained. +

+

+ On the third row, the <set> animation has an end value of 5s, + and a 3s min attribute. The active duration resulting from the end attribute is 5s. + The min value is less than the active duration, so the min attribute does not actually + constrain the active duration. +

+

+ On the fourth row, the <set> animation has a dur value of indefinite, an end value of 2s, + and a 5s min attribute. The active duration resulting from the end attribute would be 2s. + Because this is less than the min value (2s < 5s) the (min constrained) active duration + has to be corrected to 5s, despite a simple duration (indefinite) that is greater than the min value. +

+

+ On the fifth row, the <set> animation has a dur value of 1s, an end value of 2s, + a repeatCount of 7 and a 5s min attribute. The active duration resulting from dur, end and repeatCount + would be 2s. Because this is less than the min value (2s < 5s) + the (min constrained) active duration has to be corrected to 5s. +

+

+ On the sixth row, the <set> animation has a dur value of 1s, an end + value of 2s, a repeatCount of 5 and a 8s min attribute value. + The active duration resulting from dur, end and repeatCount + would be 2s, because this is less than the min value (2s < 8s) + the active duration has to be corrected to 8s. As the + fill attribute is set to 'remove' on the <set> animation, this + remove is applied at 5s, the end of the repeatCount. + Note, that if the end of active duration would have been used as a + syncbase-value for another animation, the corrected end event at + (begin + min) = 8s has to be used. +

+

+ On the seventh row, the <set> animation has a dur value of 1s, an end + value of 2s, a repeatCount of 5 and a 8s min attribute value. + The active duration resulting from dur, end and repeatCount + would be 2s, because this is less than the min value (2s < 8s) + the active duration has to be corrected to 8s. As the fill attribute + is set to 'freeze' on the <set> animation, the animation is frozen at + 5s, the end of the repeatCount, the <set> applies indefinitely. + Note, that if the end of active duration would have been used as a + syncbase-value for another animation, the corrected end event at + (begin + min) = 8s has to be used. +

+ + +

Run the test and observe it for at least six seconds. No interaction required.

+
+ +

The test passes if the following conditions are met:

+
    +
  • For the first five seconds after the document loads, + all of the red squares in the top six rows are in the right column, and + after five seconds, they all move to the left column.
  • +
  • The red square in the last row is always in the right column.
  • +
+
+ + $RCSfile: animate-elem-65-t.svg,v $ + + + + + + + + + min + + + + + no min / media + invalid min + min < active dur + min > active dur + min < repeat dur + min > repeat dur, remove + min > repeat dur, freeze + + + + > 5s + 0s-5s + + + never + > 0s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-66-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-66-t.svg new file mode 100644 index 000000000..ed11acd50 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-66-t.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on the max attribute and on + combinations of the min and max attributes. The test is based + on the SMIL specification at: + http://www.w3.org/TR/smil20/smil-timing.html#Timing-MinMax. +

+

+ Each row in the test shows different rectangles subject to <set> + animations with different configurations with regards to the max and min + attributes. For each row, the animation should be active + during the first 5 seconds of the animations where the red rectangle + should show in the right column. At five seconds into the animation, + all the rectangles should move to their left position. +

+

+ On the first row, the <set> animation has a (0s <= t < 5s) active duration + and no max attribute so the actual active duration is (0s <= t < 5s). + The first row shows a second rectangle with a <set> animation with + the same configuration except that the max attribute value is set to + 'media'. Because the <set> element does not define a media, the + behavior should be as if the attribute was not specified. +

+

+ On the second row, the <set> animation has a (0s <= t < 5s) active duration + and a min attribute set to '-6s' for the first rectangle and to 'foo' for the + second one. These values are invalid for max and, as + per the specification, the behavior should be as if the attribute was not + specified. Consequently, the behavior is as for the previous row and + the actual active duration is (0s <= t < 5s). +

+

+ On the third row, the <set> animation has a (0s <= t < 8s) initial active duration + and a max attribute set to '5s'. The max value is less than the active + duration, so the max attribute constrains the active duration to (0s <= t < 5s). +

+

+ On the fourth row, the <set> animation has a (0s <= t < 5s) initial active duration, + an indefinite simple duration (dur is set to indefinite) and a max attribute set to '8s'. + Because the initial active duration is less than the max attribute the active + duration is not constrained and is unchanged at (0s <= t < 5s). +

+

+ On the fifth row, the <set> animation has a (0s <= t < indefinite) initial active duration, + a min of 2s and a max of 5s. Because the min value is less than the max value, both apply + and the computed active duration is (0s <= t < 5s). +

+

+ On the sixth row, the <set> animation has a (0s <= t < indefinite) initial active duration, + a min of 5s and a max of 5s. Because the min value is equal to the max value, both apply + and the computed active duration is (0s <= t < 5s). +

+

+ On the seventh row, the <set> animation has a [0s, 5s[[ initial active duration, + a min of 8s and a max of 2s. Because the min value is greater than the max value, both are + ignored and the computed active duration is [0s, 5s[. +

+ + +

Run the test and observe it for at least six seconds. No interaction required.

+
+ +

The test passes if for the first five seconds after the document loads, + the red squares in each row (two in the first two rows, and one each in the + remaining rows) are in the right column, and after the five seconds, + they all move to the left column.

+
+ + $RCSfile: animate-elem-66-t.svg,v $ + + + + + + + + + max + min & max + + + no max / media + invalid max values + max < active dur + max > active dur + min < max + min = max + min > max (both ignored) + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-67-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-67-t.svg new file mode 100644 index 000000000..4de722733 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-67-t.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on restart attribute. +

+

+ Each row in the test shows different rectangles subject to <set> + animations with different configurations with regards to the restart + attribute. For each row, the animation should be active + during the first 5 seconds of the animations where the red rectangle + should show in the right column. At five seconds into the animation, + all the rectangles should move to their left position. +

+

+ On the first row, the <set> animation has a begin attribute set to + '0s;1s' and a dur attribute set to 4s. This should result in a first + interval of (0s <= t < 4s) which should be superceeded, at 1s, by a new interval + of (1s <= t < 5s) because the default restart behavior is 'always'. + Consequently, the rectangle should be in the right position during the + (0s <= t < 5s) interval and move to the left position at 5s. +

+

+ On the second row, the <set> animation has a begin attribute set to + '0s;1s', a dur attribute set to 4s and a restart attribute set to always. + The behavior should be the same as for the first row. +

+

+ On the third row, the first (left most) rectangle's <set> animation + has a begin attribute set to '0s;1s', a dur set to 5s and a restart attribute + set to whenNotActive. Because of the rules for computing intervals, the + animation's interval is (0s <= t < 5s) and is not superseded by a (1s <= t < 6s) interval + because of the restart value. + + The second (right most) red rectangle's <set> animation has a begin + attribute set to '0s;2.5s' and a dur attribute set to 2.5s. This results in + a first interval (0s <= t < 2.5s) which is followed by a (2.5s <= t < 5s) interval. Consequently, + the rectangle stays on its right position for the first five seconds before it definitively + moves to the left position. +

+

+ On the fourth row, the <set> animation has a begin attribute set to + '0s;5s' and a dur attribute set to 5s. This results in a first interval of (0s <= t < 5s). + Because the restart attribute is set to 'never', the following possible interval, + (5s <= t < 10s) does not apply and the animation is only active for the first 5 seconds. +

+

+ The fifth row shows a simple animated red rectangle which lasts for 5 seconds. It shows + a reference of how the other animations should behave visually: all red rectangles should + have the same horizontal position as the one on the reference row, at any time during the + animation. +

+ + +

Run the test and observe it for at least six seconds. No interaction required.

+
+ +

The test passes if for the first five seconds after the document loads, + the red squares in each row (two in the third row, and one each in the + remaining rows) are in the right column, and after the five seconds, + they all move to the left column.

+
+ + $RCSfile: animate-elem-67-t.svg,v $ + + + + + + + + + restart + + + + + no restart (defaults to always) + restart="always" + restart="whenNotActive" + restart="never" + reference + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-68-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-68-t.svg new file mode 100644 index 000000000..a8919530a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-68-t.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on the repeatCount attribute. +

+

+ Each row in the test shows different rectangles subject to <set> + animations with different configurations with regards to the repeatCount + attribute. For each row, the animation should be active + during the first 5 seconds of the animations where the red rectangle + should show in the right column. At five seconds into the animation, + all the rectangles should move to their left position. +

+

+ On the first row, the <set> animation has its dur attribute set to + '5s' and its repeatCount unspecified. Consequently, its only interval + is (0s <= t < 5s). +

+

+ On the second row, the <set> animation has its dur attribute set to + 1s and its repeatCount set to 5. Consequently, its only interval is + (0s <= t < 5s (1s*5)). +

+

+ On the third row, the <set> animation has its dur attribute set to + 10s and its repeatCount set to 0.5. Consequently, its only interval is + (0s <= t < 5s (10s*0.5)) +

+

+ On the fourth row, the <set> animation has its dur attribute set to + 1s and its repeatCount set to indefinite. It also has an end attribute + set to 5s. Consequently, the repeat duration is indefinite, but the active + duration is limited by the end attribute and the active interval is (0s <= t < 5s). +

+ + +

Run the test and observe it for at least six seconds. No interaction required.

+
+ +

The test passes if for the first five seconds after the document loads, + the red squares in each row are in the right column, and after the five seconds, + they all move to the left column.

+
+ + $RCSfile: animate-elem-68-t.svg,v $ + + + + + + + + + repeatCount + + + dur=5s repeatCount unspecified + dur=1s repeatCount=5 + dur=10s repeatCount=0.5 + dur=1s repeatCount=indefinite + end=5s + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-69-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-69-t.svg new file mode 100644 index 000000000..01d4284bb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-69-t.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + +

+ This tests performs basic tests on the repeatDur attribute. +

+

+ Each row in the test shows different rectangles subject to <set> + animations with different configurations with regards to the repeatDur + attribute. For each row, the animation should be active + during the first 5 seconds of the animations where the red rectangle + should show in the right column. At five seconds into the animation, + all the rectangles should move to their left position. +

+

+ On the first row, the <set> animation has its dur attribute set to + '5s' and its repeatDur unspecified. Consequently, its only interval + is (0s <= t < 5s). +

+

+ On the second row, the <set> animation has its dur attribute set to + 1s and its repeatDur set to 5s. Consequently, its only interval is + (0s <= t < 5s). +

+

+ On the third row, the <set> animation has its dur attribute set to + 0.5s and its repeatDur set to 5s. Consequently, its only interval is + (0s <= t < 5s). +

+

+ On the fourth row, the <set> animation has its dur attribute set to + 1s and its repeatDur set to indefinite. It also has an end attribute + set to 5s. Consequently, the repeat duration is indefinite, but the active + duration is limited by the end attribute and the active interval is (0s <= t < 5s). +

+

+ On the fifth row, the <set> animation has its dur attribute set to + 0.7s and its repeatDur set to 5s. Consequently, its only interval is + (0s <= t < 5s). The difference with the 3rd row is that there is a fractional + number of simple durations in the active duration (7.1428) where there + is a whole number of simple durations in the third row (10). +

+ + +

Run the test and observe it for at least six seconds. No interaction required.

+
+ +

The test passes if for the first five seconds after the document loads, + the red squares in each row are in the right column, and after the five seconds, + they all move to the left column.

+
+ + $RCSfile: animate-elem-69-t.svg,v $ + + + + + + + + + repeatDur + + + dur=5s repeatDur unspecified + dur=1s repeatDur=5s + dur=0.5s repeatDur=5s + dur=1s repeatDur=indefinite + end=5s + dur=0.7s repeatDur=5s + + + + > 5s + 0s-5s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-70-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-70-t.svg new file mode 100644 index 000000000..7941ae594 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-70-t.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + +

+ This tests the animation's SMIL fill attribute. +

+

+ On the first row, the <set> animation has its dur + attribute set to '1s' and its begin attribute set to '0s; + firstSet.end + 1s'. The fill attribute is unspecified, so + the effect is as if it was set to 'remove', because 'remove' is + the default value for fill. + + Consequently, the first interval is (0s <= t < 1s), the second is + (2s <= t < 3s), the third, (4s <= t < 5s) etc.. The red rectangle starts on the + right position, moves to the left position for one second, moves + to the right for 1 second, and so on. +

+

+ On the second row, the <set> animation + with the identifier 'firstSet' has its dur attribute + set to 1s and its begin attribute set to '0s; firstSet.end'. The fill attribute + is set to 'remove'. The behavior should be exactly the same as for the previous + row, and the rectangle moves from the right position to the left position + every second. +

+

+ On the third row, the <set> animation has its dur attribute set to + 1s and its begin attribute set to '0s; firstSet.end'. The fill attribute + is set to 'freeze'. The first interval should be (0s <= t < 1s), the second (2s <= t < 3s), + the third, (4s <= t < 5s), etc. Between interval, the fill behavior should be applied, + so the red rectangle should stay on the right position and never go to the + left position. +

+

+ On the fourth row, the <set> animation has its dur attribute set to + 1s and its begin attribute set to '0s'. The fill attribute + is set to 'freeze'. The first interval should be (0s <= t < 1s) and there is no + following interval. Because of the fill behavior, the <set> should + apply the last (and only) animation value after 1s. Consequently, the + red rectangle should stay on the right position and never go to the + left position. +

+ + +

Run the test and observe it for at least 5 seconds. No interaction required.

+
+ +

The test passes if for the duration of the test the following conditions are met:

+
    +
  • The red squares in the top two rows alternate between the left and the right column + at a rate of one movement per second. They must also be in the same column + at any given time.
  • +
  • The red squares in the bottom two rows stay in the right column.
  • +
+
+ + $RCSfile: animate-elem-70-t.svg,v $ + + + + + + + + + fill + + + fill unspecified (remove) + fill=remove + fill=freeze (with restart) + fill=freeze (no restart) + + + + never + here + always + here + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-77-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-77-t.svg new file mode 100644 index 000000000..f71a033ca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-77-t.svg @@ -0,0 +1,357 @@ + + + + + + + + + + + + +

+ Tests the inheritance of animated values on text. +

+

+ This test demonstrates how <set> elements change + text properties on a <text> element. For + each of the text properties being tested, 3 + <set> elements are set. The first <set> + element acts directly on the <text> element. The + second <set> element acts on a <g> containing + children. The third <set> element acts on an <a> + containing children. In each case the test validates that + the animated value set on the <g> and <a> + elements is inherited by the <text> element. + All the <set> elements have a begin attribute + set to 0s with an offset of 1s after end. + So, the animation will apply 1s after the document is loaded + and will repeat every 1s after the animation ends. +

+

+ The first <set> validates the transform property. When + applied to the <text> element, the letter A will be + translated to the right every 1s, in the <text> column. + When applied to the <g> element, the letter A inherits the + transform value and is translated to the right every 1s, as + seen in the <g> column. When applied to the <a> + element, the letter A inherits the transform value and is + translated to the right every 1s, as seen in <a> column. +

+

+ The second <set> validates the text-anchor attribute. + When applied to the <text> element, the anchor position + of letter A is moved from start to end. When applied to the + <g> and <a> element, the property is inherited + and hence the anchor position of letter A is moved from start + to end in the second row. +

+

+ The third <set> validates the font-size attribute. + The font size of letter A is changed from 20 to 30. + When applied to <g> and <a> elements, the letter + A inherits the font-size and hence in row 3, letter A has a + font-size of 30 in all 3 right columns of row 3. +

+

+ The fourth <set> validates the font-family attribute. + The font-family is changed from default to serif. + When applied to <g> and <a> elements, the letter + A inherits the font-family attribute and hence in row 4, + letter A has serif font-family in all 3 columns. +

+

+ The fifth <set> validates the font-style attribute. + The font-style is changed from normal to italic. + When applied to <g> and <a> elements, the letter + A inherits the font-style attribute and hence in row 5, + letter A is animated to italic in all 3 columns. +

+

+ The sixth <set> validates the font-weight attribute. + The font-weight is changed from normal to bold. + When applied to <g> and <a> elements, the letter + A inherits the font-weight attribute and hence in row 6, + letter A is changed to bold on the right. +

+ + +

Run the test. No interaction required.

+
+ +

+ The document is animated such that it alternates between two states, an alternation occurring every second. + For the test to pass each row must show a colored letter A that alternates between the two exact shapes and positions shown + by the gray silhouettes. +

+
+ + $RCSfile: animate-elem-77-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + transform + text-anchor + font-size + font-family + font-style + font-weight + + + + <text> + <g> + <a> + + + + A + + + + + A + A + + + + + + + + + A + + + + + + A + + + + + A + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + A + A + + + + + + + + + A + + + + + + + + A + + + + + + + + A + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-78-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-78-t.svg new file mode 100644 index 000000000..31aceb503 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-78-t.svg @@ -0,0 +1,563 @@ + + + + + + + + + + + + +

+ This test demonstrates how <set> elements change + graphics properties on elements from the 'Basic Shapes' chapter. For + each of the graphics properties being tested, 3 + <set> elements are set. The first <set> + element acts directly on the 'Basic Shape' element. The + <set> element acts on a <g> containing + children. The third <set> element acts on an <a> + containing children. In each case the test validates that + the animated value set on the <g> and <a> + elements is inherited by the 'Basic Shape' element. + All the <set> elements have a begin attribute + set to 0s with an offset of 1s after end. + So, the animation will apply 1s after the document is loaded + and will repeat every 1s after the animation ends. +

+

+ The first <set> validates the fill property, with + fill set to orange. When applied directly to the 'Basic Shape' + element, the <rect> fill value will change to orange + when it is translated to the right every 1s. When applied + to the <g> and <a> elements, the <rect> + inherits the fill value and is orange. +

+

+ The second <set> validates the fill-style property, + with fill-style set to evenodd. When applied to the + 'Basic Shape' element, the <polyline> fill-style is + changed from nonzero to evenodd. When applied to the + <g> and <a> elements, the <polyline> inherits + the evenodd fill-style. +

+

+ the third <set> validates the stroke property. + In this case fill is set to none. When stroke is applied + to the 'Basic Shape' element, the <rect> on the right + appears with the stroke color. When applied to the <g> and + <a> elements, the <rect> inherits the stroke property. +

+

+ the fourth <set> validates the stroke-width property, + with stroke-width set to 4. When stroke-width is applied + to the 'Basic Shape' element, the <line> on the right + has a width of 4. When applied to the <g> and + <a> elements, the <line> inherits the stroke-width. +

+

+ the fifth <set> validates the stroke-linecap property, + with stroke-linecap set to round. When stroke-linecap is applied + to the 'Basic Shape' element, the <line> stroke-linecap + value switches from butt to round. When applied to the <g> + and <a> elements, the <line> inherits the + square stroke-linecap. +

+

+ the sixth <set> validates the stroke-linejoin property, + with stroke-linejoin set to bevel. When stroke-linejoin is applied + to the 'Basic Shape' element, the <line> stroke-linejoin + value switches from miter to bevel. When applied to the <g> + and <a> elements, the <line> inherits the + bevel stroke-linejoin. +

+

+ the seventh <set> validates the stroke-miterlimit property, + with stroke-miterlimit set to 10. When stroke-miterlimit + is applied to the 'Basic Shape' element, the miter-length to + stroke-width ratio exceeds the miter-limit and the + <polyline> switches from bevel to miter.When applied + to the <g> and <a> elements,the <line> + inherits the stroke-miterlimit. +

+

+ the eighth <set> validates the stroke-dashoffset property, + with stroke-dashoffset set to 5.5. When stroke-dashoffset is applied + to the 'Basic Shape' element, the <line> has a different + dashing pattern. When applied to the <g> and <a> + elements, the <line> inherits the property. +

+

+ the ninth <set> validates the display property, + with display set to none. When display is applied + to the 'Basic Shape' element, the <rect> does not + appear on the right. When applied to the <g> and <a> + elements, the <line> inherits the display property and + hence is not seen. +

+

+ the tenth <set> validates the visibility property, + with visibility set to hidden. When visibility is applied + to the 'Basic Shape' element, the <rect> is hidden + on the right. When applied to the <g> and <a> + elements, the <line> inherits the visibility property + and hence is not seen. +

+

+ the eleventh <set> validates the color property, + with color set to blue. When color is applied to the + 'Basic Shape' element, the <rect> on the right + switches from default color of black to blue. When + applied to the <g> and <a> + elements, the <line> inherits the color property. +

+

+ The eleventh <set> validates the color property, with + color set to orange. When applied directly to the 'Basic Shape' + element, the <rect> fill value will change to orange + when it is translated to the right every 1s. When applied + to the <g> and <a> elements, the <rect> + inherits the color value, and via its fill="currentColor" + becomes orange. +

+ + +

Run the test. No interaction required.

+
+ +

The document is animated such that it alternates between two states, + an alternation occurring every second. In each row there are three + sub-tests, which must behave identically except for any differences + noted below. Each sub-test consists of a colored shape that in one + state appears in the left column and in the second state appears in + the right column. The test is passed if the following conditions are + met:

+
    +
  • For the fill-rule, stroke-width, stroke-linecap, stroke-linejoin, + stroke-miterlimit and stroke-dashoffset rows, the red shape must + take the exact shape and position of the two gray silhouettes + when animating between the two states.
  • +
  • For the fill row, the colored square must take the exact + shape and position of the two gray silhouettes when animating + between the two states. When in the left column, it must be red, + and when in the right column, it must be orange.
  • +
  • For the color row, the colored square must take the exact + shape and position of the two gray silhouettes when animating + between the two states. When in the left column, it must be + red, and when in the right column, it must be orange.
  • +
  • For the stroke row, the shape must be invisible when in the + left column, and must be a red-stroked, empty-filled square + matching the size and position of the gray silhouette when + in the right column.
  • +
  • For the display and visibility rows, the shape must be a red + square matching the size and position of the gray silhouette + when in the left column, and must be invisible when in the right + column.
  • +
+
+ + $RCSfile: animate-elem-78-t.svg,v $ + + + + + + + + + graphics + + + fill + fill-rule + stroke + stroke-width + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-dashoffset + display + visibility + color + + + + 'Basic Shape' + <g> + <a> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-80-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-80-t.svg new file mode 100644 index 000000000..ba831cb72 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-80-t.svg @@ -0,0 +1,312 @@ + + + + + + + + + + + + +

+ This test demonstrates validates the operation of the + animateTransform element and validates the operation + of the different type attribute values. +

+

+ There are 5 possible values for the type attribute and + there is one animateTransform for each type and two for + the translate type. +

+

+ For each transform type, the test has a corresponding animateTransform. + The test uses references to show what the expected transform should be + at different points in the animation. For example, the top left + animateTransform, for type=rotate, shows circular markers which turn + orange at the time of corresponding transform value should be set by the + animateTransform. + The marker elements show the expected transform value on reference + markers in the test. +

+ + +

Run the test. No interaction required.

+
+ +

The test has eight sub-tests, each of which consists of a brown + shape being animated in some way with the animation starting two + seconds after the document is loaded. Gray shapes are used + to indicate points along the animation. The test passes if + the brown shape in each of the sub-tests is animated correctly, + according to the following descriptions:

+
    +
  • In the two "type=rotate" sub-tests, the brown line is rotated + clockwise about one of its end points for one complete revolution, + and then immediately performs the reverse animation where it is + rotated anti-clockwise for one complete revolution. During the + animation, whenever the other end point of the line coincides + with one of the gray filled circles, the circle briefly glows yellow.
  • +
  • In the "type=skewX" sub-test, the brown line continuously skewed. + It starts off coinciding with the middle gray silhouette, and then + over the course of the animation coincides with the left gray silhouette, + the middle one, the right one and finally the middle one again. + During the animation, whenever the brown line coincides with one of the gray silhouettes, + the silhouette briefly glows yellow.
  • +
  • In the "type=skewY" sub-test, the brown line continuously skewed. + It starts off coinciding with the middle gray silhouette, and then + over the course of the animation coincides with the top gray silhouette, + the middle one, the bottom one and finally the middle one again. + During the animation, whenever the brown line coincides with one of the gray silhouettes, + the silhouette briefly glows yellow.
  • +
  • In the two "type=translate" sub-tests, the brown circle is continuously + translated. It starts off coinciding with the left-most gray circle, and + over the course of the animation coincides each of the other gray circles + from left to right. During the animation, whenever the brown circle coincides with one of the + gray circles, the circle briefly glows yellow.
  • +
  • In the two "type=scale" sub-tests, the brown circle is continuously + scaled. There are four concentric gray stroked circles indicating the + sizes the brown circle will take during the animation, although they + are only all visible at the end of the animation. (Initially only the + largest one is visible.) The brown circle + starts off with a size coinciding with the largest gray circle, and + over the course of the animation coincides each of the other gray circles + from outside in. During the animation, whenever the brown circle coincides with one of the + gray circles, the circle briefly glows yellow.
  • +
+
+ + $RCSfile: animate-elem-80-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type=rotate + + + + + + + + + + + + + + + + + + + type=skewX + + + + + + + + + + + + + + + + + + + + + + type=skewY + + + + + + + + + + + + + + + + + + + + + + + type=scale + (sx and sy) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=rotate + (with cx/cy) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=translate + (tx only) + + + + + + + + + + + + + + + + + + + + + + + + + + + type=translate + (tx and ty) + + + + + + + + + + + + + + + + + + + + + + + type=scale + (sx only) + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-81-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-81-t.svg new file mode 100644 index 000000000..e6fd01c0d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-81-t.svg @@ -0,0 +1,162 @@ + + + + + + + + + + + + +

+ This test tests the operation of the animateTransform's + additive behavior. +

+

+ The first two rectangles, on the top row, show the effect of the + additive attribute on animateTransform. The left-most + animateTransforms have their additive attribute set to replace, + so the effect of the two transform animation is as if only the + highest priority one applied because it replaces the underlying + value. The second animateTransforms (from left to right) have + their additive attribute set to sum, which means the transforms + they produce are concatenated. +

+

+ The last two rectangles, on the top row, show the effect of the + accumulate attribute on animateTransform. For the left one + (third on the row, from left to right), the accumulate attribute + is set to none. There are two repeats for the + animateTransform. Therefore, the transform goes twice from a + scale(1,1) to a scale(2,2). For the right-most animateTransform, + the accumulate attribute is set to sum. There are two repeats + and the animation goes from scale(0,0) to scale(2,2) for the + first iteration and then from scale(2,2) to scale(4,4) (because + the result of the second iteration is added to the + scale(2,2) result of the previous, first iteration). +

+

+ The rectangles on the bottom row show the combination of + additive and cumulative behavior. The left rectangle's + animateTransform accumulate behavior is set to none but its + additive behavior is set to sum. Therefore, the transform's + underlying value (skewX(30)) is always pre-concatenated to the + animateTransform's result, which goes from "skewX(30) + scale(1,1)" to "skewX(30) scale(2,2)" in each of its two + iterations. The right rectangle's animateTransform accumulate + behavior is set to sum and the additive behavior is also set to + sum. Therefore, the transform's underlying value is always + pre-concatenated, and repetitions of the scale animation + get added together. Consequently, the transform goes from "skewX(30) + scale(0,0)" to "skewX(30) scale(2,2)" for the first iteration + and then from "skewX(30) scale(2,2)" to "skewX(30) + scale(4,4)" for the second iteration. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test is passed if:

+
    +
  • the scale of the upper leftmost grey rectangle is smoothly animated over the course of 5 seconds to completely fill the upper leftmost yellow rectangle
  • +
  • the scale and rotation of the second upper grey rectangle from the left is smoothly animated over the course of 5 seconds to fill the second upper yellow rectangle from the left
  • +
  • the scale of the upper third grey rectangle from the left is smoothly animated over the course of 2.5 seconds to completely fill the upper third yellow rectangle from the left, and then repeated once so that at time t=5 seconds it completely fills the same yellow rectangle
  • +
  • the scale of the upper rightmost grey rectangle is smoothly animated over the course of 5 seconds to completely fill the upper rightmost yellow rectangle
  • +
  • the scale of the lower leftmost grey rectangle is smoothly animated over the course of 2.5 seconds to completely fill the lower leftmost yellow rectangle, and then repeated once so that at time t=5 seconds it completely fills the same yellow rectangle
  • +
  • the scale of the lower rightmost grey rectangle is smoothly animated over the course of 5 seconds to completely fill the lower rightmost yellow rectangle
  • +
+
+ + $RCSfile: animate-elem-81-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + additive=replace + + + + + + + + + additive=sum + + + + + + + + accumulate=none + additive=replace + + + + + + + + accumulate=sum + additive=replace + + + + + + + + accumulate=none + additive=sum + + + + + + + + accumulate=sum + additive=sum + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-82-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-82-t.svg new file mode 100644 index 000000000..b0c29a879 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-82-t.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + +

+ This test demonstrates validates the operation of + animateTransform with regards to the rotation center + and with regards to paced animation. +

+

+ The following descriptions describe the various animations, + going top bottom, left to right. For each animation, orange + rectangle markers show the expected position for the animated rectangle + halfway through the animation. The markers are drawn with a thick + stroke for 0.2s, starting at the time when they reflect the + expected position. +

+

+ The first animateTransform has type='rotate' and goes from + 45 degrees to 90 degrees over a period of 3s. The rotation + center for the from and to values is 0, 0. At 0 seconds, the + expected transform should be rotate(45). At 1.5 seconds, the + expected transform is rotate(0.5 * (90 + 45)) = rotate(67.5). + At 3s, the expected transform is rotate(90). +

+

+ The second animateTransform has type='rotate' but has a + rotation center that varies between the from and to values. + The rotation goes from rotate(45,0,0) to rotate(90,-15,-15). + At 0s, the expected transform is rotate(45,0,0). + At 1.5s, the expected transform is rotate(67.5, -7.5, -7.5). + At 3s, the expected transform is rotate(90, -15, -15). +

+

+ The third animateTransform has type='translate' and calcMode='paced'. + The animation goes from translate(-40,40) to translate(-20,20) to + translate(40,-40). + At 0s, the expected transform is translate(-40,40). + At 1.5s, the expected transform is translate(0,0). + At 3s, the expected transform is translate(40,-40). +

+

+ The fourth animateTransform has type='translate' and calcMode='linear'. + The animation goes from translate(-40,40) to translate(-20,-20) to + translate(40,-40). + At 0s, the expected transform is translate(-40,40). + At 1.5s, the expected transform is translate(-20,-20). + At 3s, the expected transform is translate(40,-40). +

+

+ The fifth animateTransform has type='scale' and calcMode='paced'. + The animation goes from scale(1,2) to scale(3,2) to + scale(1,1). + At 0s, the expected transform is scale(1,2). + At 1.5s, the expected transform is scale(3,2). + At 3s, the expected transform is scale(1,1). +

+

+ The sixth animateTransform has type='scale' and calcMode='linear'. + The animation goes from scale(1,2) to scale(3,2) to + scale(1,1). + At 0s, the expected transform is scale(1,2). + At 1.5s, the expected transform is scale(3,2). + At 3s, the expected transform is scale(1,1). +

+

+ The seventh animateTransform has type="rotate" and calcMode='paced'. + The animation goes from rotate(0,0,0) to rotate(45,-15,-20) to + rotate(180,30,50). The total length along the rotation angle component + is (45 - 0) + (180 - 45) = 180. The total length along the rotation + center along the x axis is (0 - (-15)) + (30 - (-15)) = 45 + 15 = 60. + The total length along the rotation center along the y axis is + (0 - (-20)) + (50 - (-20)) = 20 + 70 = 90. + At 0s, the expected transform is rotate(45,-15,-20). + At 1.5s, the expected transform is rotate(90,0,5) to achieve constant + velocity along the rotation angle component, the x-axis rotation center + component and the y-axis rotation center component. At 1.5s, half the + distance has been run on each component. For the rotation angle, this + means that 45 has been reached and that 45 more degrees in the (45 <= r < 180) + interval have been consumed. For the x-axis rotation center, this means + that 30 units have been run: the (0 >= x > -15) interval has been fully consumed + (15 units long) and 15 units on the (-15 <= x < 30) interval have been consumed, + which explains the computed 0 value. For the y-axis rotation center, this + means that 45 units have been run: the (0 >= y > -20) interval has been fully + consumed and 25 units have been consumed in the (-20 <= y < 50) interval, which + explains the computed 5 value. + At 3s, the expected transform is rotate(180,30,50). +

+ + + Run the test. No interaction required. + + +

+ The test is passed if the lightgray rectangles are exactly in the positions indicated by each of the orange rectangles when they are shown with a thick stroke. If any part of the lightgray + rectangles are outside the thick stroked orange rectangles then the test has failed. +

+
+ + $RCSfile: animate-elem-82-t.svg,v $ + + + + + + + + + <animateTransform> + + + + + + + + + + + + + + + + + + + + + + + + + + same rotation + center + + + + + + + + + + + + + + + + + + + different rotation + centers + + + + + + + + + + + + + + + + + + + paced translation + + + + + + + + + + + + + + + + + + + linear translation + + + + + + + + + + + + + + + + + + + + + paced scale + + + + + + + + + + + + + + + + + + + + linear scale + + + + + + + + + + + + + + + + + + + paced rotation + + + + + + + + + + + + + + + + + + + linear rotation + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-83-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-83-t.svg new file mode 100644 index 000000000..b64a7c650 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-83-t.svg @@ -0,0 +1,229 @@ + + + + + + + + + + + + +

+ This test validates the operation of the animate element + on the <path> element's d attribute. +

+

+ The following descriptions references to the tests by number. The first test + is the one showing on the top left. The last, sixth test is the one showing + at the bottom right. Test numbers are alocated from left to right and from + top to bottom. + + For each test, there are reference outline markers which show the expected + animated shape at different times in the animation. At the time of the expected + shape, the outline of the expected shape is drawn with a thick stroke for 0.2s + so the test user can visually check that the shapes are matching at the + expected times. +

+

+ The first test validates a simple from-to animation on a path's d attribute + made of M, C and Z commands where both the from and to attributes are specified. + The attributes are compatible with the path element's d attribute. +

+

+ The second test validates a simple to-animation on a path's d attribute + made of M, C and Z commands where the to attribute is specified. + The attribute is compatible with the path element's d attribute. +

+

+ The third test validates a simple values-animation on a path's d attribute + made of M, C and Z commands where the values attribute is specified and + specifies three seperate values. + The attribute is compatible with the path element's d attribute. +

+

+ The fourth, fifth and sixth tests validate that interpolation between compatible + path values (i.e., path values which normalize to the compatible values) is + supported. +

+

+ The fourth tests interpolation between a path value containing H, V and L commands + (in the from value) and a path value containing compatible h, v and l commands + (in the to value). +

+

+ The fifth tests interpolation between a path value containing C and S commands + (in the from value) and a path value containing compatible c and s commands + (in the to value). +

+

+ The sixth tests interpolation between a path value containing Q, T and A commands + (in the from value) and a path value containing compatible q, t and a commands + (in the to value). +

+ + +

Run the test. No interaction required.

+
+ +

The test consists of six sub-tests. In each sub-test, the light gray filled + path must continously morph its shape, starting one second after the document + load and continuing for three seconds. In all sub-tests except for #3, there are + two orange reference shape outlines between which the gray path must morph. + In sub-test #3, there are three reference shapes. The test passes if each of the + gray shapes morphs appropriately according to the following descriptions:

+
    +
  1. The gray shape must morph from the diamond to the flower-like shape.
  2. +
  3. The gray shape must morph just like sub-test #1, from the diamond to the flower-like shape.
  4. +
  5. The gray shape must morph from the diamond, to the flower-like shape, and then to the large, rounded diamond shape.
  6. +
  7. The gray shape must morph from the lower-right pointing kite shape to the upper-left pointing kite shape.
  8. +
  9. The gray shape must morph from the tall shape to the wide shape.
  10. +
  11. The gray shape must morph from the wide "D" shape to the narrow "D" shape.
  12. +
+

In addition, during the animations whenever the gray shape has the same shape as + a reference shape, the stroke of the reference shape must be shown thicker momentarily.

+
+ + $RCSfile: animate-elem-83-t.svg,v $ + + + + + + + + + <animate> on <path>'s d attribute + + + + + + + + + + + + + + + + + + + + + + + + #1: from-to animation + + + + + + + + + + + + + + + + #2: to animation + + + + + + + + + + + + + + + + + + + + #3: values animation + + + + + + + + + + + + + + + + #4: from-to animation + compatible H/h, V/v, + L/l segments + + + + + + + + + + + + + + + + #5: from-to animation + compatible C/c + s/S segments + + + + + + + + + + + + + + + + #6: from-to animation + compatible Q/q, T/t + segments + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-84-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-84-t.svg new file mode 100644 index 000000000..cdf35fb37 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-84-t.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+ Test animation of color keywords that resolve to animatable RGB values. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if five + black squares are shown, after two seconds, all five squares turn red and + then smoothly animate the fill color to green over the next five seconds. +

+
+ + $RCSfile: animate-elem-84-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + currentColor + green + inherit + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-85-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-85-t.svg new file mode 100644 index 000000000..cecac6a8f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-85-t.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + +

+ The first subtest tests animateColor with 'to' and 'from' values including + currentColor. The second subtest checks that the value of currentColor is the + current animated value of the color property, by animating the color property + at the same time as animating fill with a 'from' or 'to' value of currentColor. +

+ + + +

Run the test. No interaction required. +

+
+ +

+ The first subtest is passed if all + four rectangles at the top smoothly animate from black to green over 5 seconds. + During this time the bottom two rectangles must be blue.

+

The second subtest, which starts after the first one completes, is passed if + the bottom two rectangles smoothly animate from green (at five seconds), through + dark cyan (at 7.5 seconds), to cyan (at 10 seconds and above). Colored circles + indicate the appropriate colors at these times. +

+
+ + $RCSfile: animate-elem-85-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-86-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-86-t.svg new file mode 100644 index 000000000..7ef5eb8f9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-86-t.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

+ [[Describe which section and what specific assertion is being tested + by the test. If the test has a number of sub tests, multiple + "testComponent" elements can be specified within the "testDescription" + element.]] +

+ + +

+ This tests performs tests on fill="freeze" values. +

+

+ Currently, this test does not claim to show correct + behaviour in SVG 1.1. The reason is only to show the + difference between current viewers at this point. +

+

+ When the correct behaviour has been defined, this test + can be adjusted to reflect that. +

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: animate-elem-86-t.svg,v $ + + + + + + + + + fill="freeze" with discrete calcMode + + + + discrete + + + + > 2s + 0s-2s + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-87-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-87-t.svg new file mode 100644 index 000000000..812c98e1c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-87-t.svg @@ -0,0 +1,89 @@ + + + + + + + + + + +

+ This tests that the underlying value of a scale transformation + is 0. Since SMIL defines a by animation as being equivalent + to an additive values animation where the first value is zero and + the second value is the by value, such an animation would + begin by post-multiplying a scale(0) transformation to + the element's underlying transform list. +

+ + +

+ The test consists of two circles: an orange circle on the left, + which serves as a reference, and a blue circle on the right, + whose transform attribute is animated. Animation of + the circles begins at t=1s and lasts for 3s. +

+

+ The transform animation that applies to the blue circle is of type + "scale", and specifies by="1". Since the animation is + considered to be equivalent to one that specifies from="0" to="1", + when the animation begins the circle will be scaled down to a point, + and then will be scaled up until it reaches its original size at + t=4s. +

+
+ +

+ The test is passed if the blue circle on the right is always the same + size as the orange circle on the left. The test runs from t=0s until + t=4s. +

+
+ + $RCSfile: animate-elem-87-t.svg,v $ + + + + + + + + + + Test zero value of a scale transform animation + + + + + + + Reference + + + + + + + <animateTransform type='scale' by='1'/> + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-88-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-88-t.svg new file mode 100644 index 000000000..d523f7704 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-88-t.svg @@ -0,0 +1,67 @@ + + + + + + + + + + +

+ This tests that any which space before semicolon separators in + a values="" attribute on an animation element is ignored. +

+

+ The test consists of a single rectangle whose height is animated + with a values=" 0 ; 50 " attribute. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the rectangle is animated from a height of + 0 to a height of 50 over four seconds, starting from when the + test is loaded. +

+
+ + $RCSfile: animate-elem-88-t.svg,v $ + + + + + + + + + + Test values attribute list syntax + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-89-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-89-t.svg new file mode 100644 index 000000000..07aee20f9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-89-t.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + +

+ Tests clarification of value spacing of keySpline syntax; whitespace, or commas with optional whitespace, are allowed. +

+

+ Test possible values for 'calcMode="spline"', with both commas, whitespace, and mixed separators +

+

+ Six animations (three sets of two) have been defined. The three green ones on the left show rectangles which get smaller. The three orange ones on the right show rectangles of constant size, which move. + The black text and grey ruler lines help show the sizes and movement of the rectangles over time. + +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the bottom edge of all six animated rectangles move together in sync. +

+
+ + $RCSfile: animate-elem-89-t.svg,v $ + + + + + + + + + + + + + 0 sec. + 3 sec. + 6 sec. + 9+ sec. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-90-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-90-b.svg new file mode 100644 index 000000000..1d0d1b08e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-90-b.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + +

+ Test that the class attribute is animatable and that style + sheets select on the animated value. + + +

+ + +

+ This test uses the following elements : 'set', + and 'animate'. It requires that CSS style sheets are supported. +

+

+ The test shows a circle which is initially hidden, becomes visible and blue at + 3s, abruptly changing to dark red at 5s. Two overlapping animations both animate the + class attribute. The class attribute, as a string value, does not support + linear interpolation so a discrete animation is produced, changing from the + start to the end value midway through the animation duration. +

+

+ The first animation starts at 2s and lasts for 4s so the mid point is at 3s. + The second animation starts at 3s and lasts for 4s so the midpoint is at 5s. + The file includes various guides that can be used to verify the + correctness of the animation. The value of the class attribute + at 02 is "start" so the first CSS rule matches. At 3s it becomes "midway" + so the second rule matches. At 5s it becomes "final midway" so the second and + third rules match; the third rule has higher specificity so determines the fill color. + +

+
+ +

+ The color of the large circle must match the colour of the smaller guide + boxes on the left at times 0s, 3s and 5s. If the text "CSS not supported" + is visible, the test does not apply. +

+
+ + $RCSfile: animate-elem-90-b.svg,v $ + + + + + + + + + + + + Color at start + + + Color at 3s + + + Color at 5s + + + + + + + + + + + + CSS not supported + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-91-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-91-t.svg new file mode 100644 index 000000000..a3b0a67f8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-91-t.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + +

+ This tests that to-animations on attributes whose values cannot be + interpolated are treated as discrete animations. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if there initially eight red squares in the + left column when the document is loaded and the all move + at the same time to the right column two seconds after the + document is loaded. +

+
+ + $RCSfile: animate-elem-91-t.svg,v $ + + + + + + + + + + Testing <animate to=""> with non-interpolable attributes + + + + 0s-2s + > 2s + + + + (reference) + + + + + + + + + + + + class + + + + + + + + + + + clipPathUnits + + + + + + + + + + + + + in + + + + + + + + + + + + + + + + + + + + + + + preserveAspectRatio + + + + + + + + + + + + + + + + + + + spreadMethod + + + + + + + + + + + + + + + + + + + + + + + xlink:href + + + + + + + + + + + + + + + display + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-92-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-92-t.svg new file mode 100644 index 000000000..95b5f0703 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-elem-92-t.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + +

+ This tests checks the behavior of discrete to-animations. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if after five seconds, in each of the three rows, + the red rectangle is in the column at the times indicated. + Thus, from the document load until 2s afterwards, the red + square in all three rows must be in the left column. At 2s, + all three red squares must move to the right column. At 4s, + the red square in the first row must move to the left column + and the other two red squares must remain in the right column.

+
+ + $RCSfile: animate-elem-92-t.svg,v $ + + + + + + + + + discrete to-animation + + + without freezing + with freezing + with keyTimes + + + + 0s-2s + > 4s + 2s-4s + + + 0s-2s + > 2s + + + + 0s-2s + > 2s + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-events-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-events-01-t.svg new file mode 100644 index 000000000..a0014c5de --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-events-01-t.svg @@ -0,0 +1,116 @@ + + + + + + + + + + +

Tests 'mouseover' event on SVGElementInstance

+

+ What each case tests is as follows. + Case 1: mouseover event on SVGElementInstance. Referenceing an element that contains an event. + Case 2: mouseover event on referencing element. Event bubbling from SVGElementInstance to referencing element. + Case 3: mouseover event on parent of referencing element. Event bubbling from SVGElementInstance to referencing element ancestors. + Case 4: mousedown event on referencing element. SVGElementInstance is not effected by event listener on referencing element. +

+ + +

+ Mouseover each of the red rectangles, and then click on the bottommost rectangle. +

+
+ +

+ This test contains four cases. The cases must produce the following results for the test to pass. +

+
    +
  • Case 1: On a mouseover event on the top square, all four squares must turn blue.
  • +
  • Case 2: On a mouseover event on the top middle square, all four squares must turn blue and a black stroke + must appear on the referencing square (element).
  • +
  • Case 3: On a mouseover event on the bottom middle square, all four squares must turn blue and a black + stroke must appear on the referencing square (element).
  • +
  • Case 4: On a mouseover event on the bottom square, all four squares must turn blue, and on a mousedown event + a black stroke must appear on the referencing square (element).
  • +
+
+ + $RCSfile: animate-interact-events-01-t.svg,v $ + + + + + + + + + + + + + + + + + Shadow tree event listener chain + + + + Case 1: on mouseover all squares must turn blue + + + + + + + + + Case 2: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + + + Case 3: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + Case 4: on mouseover all squares must turn blue + and on mousedown a black stroke must appear on reference square + + + + + $Revision: 1.2 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-01-t.svg new file mode 100644 index 000000000..9d51b7ea6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-01-t.svg @@ -0,0 +1,285 @@ + + + + + + + + + + + + +

+ This test tests 'pointer-events' on text. Initially you should see four big rects with black stroke. + In the uppermost rect there should be 10 'O':s with black fill. + In the second rect from the top there should be 10 'O':s with no fill but with black stroke. + In the third and fourth rects there should be no visible 'O':s at all. + In the fourth rect there should be two green rects, and in each of the other three rects there should be one green rect. +

+ + +

+ Using the pointer device move the cursor over each of the four black-stroked rectangles from left to right. + As the mouseover event triggers, the 'O':s will become visible and marked + in either green (a pass) or red (an immediate fail). Some 'O':s will not + change when the pointer is moved over them. +

+
+ +

+ The test has passed if after moving the cursor over all the rects: +

+
    +
  1. all the 'O':s in the green rects have green fill
  2. +
  3. there are no red 'O':s visible
  4. +
  5. there are 9 green 'O':s in the first and second rect, 4 in the third rect and 6 in the fourth rect
  6. +
+
+ + $RCSfile: animate-interact-pevents-01-t.svg,v $ + + + + + + + + + + Test pointer-events on text + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + + + + + + + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + O + + + + + + + + + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + + + + + + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + O + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-02-t.svg new file mode 100644 index 000000000..9993ec6eb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-02-t.svg @@ -0,0 +1,116 @@ + + + + + + + + + + +

Testing pointer-events and rendering order

+ + +

+ Move the mouse over the blue and purple shapes. Click the pink circle at the top right of the page. Move the mouse over the blue and purple shapes again. +

+
+ +

+ For the test to pass the blue rectangles must always turn pink on mouseover, and the ovals must turn pink on mouseover only if pointer-events are set to "ALL". + If a shape other than the one currently hovered turns pink then the test has failed. +

+
+ + $RCSfile: animate-interact-pevents-02-t.svg,v $ + + + + + + + + + + + + Testing pointer-events and rendering order + Rectangles should turn RED on mouseover + Ovals should turn RED if Pointer-Events are set to "ALL" + + + + Change "Pointer-Events" of + ovals from "ALL" to "NONE" + + + + + Purple ovals have "Pointer-Events" set to "ALL". + Purple ovals have Pointer-Events set to "NONE". + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-03-t.svg new file mode 100644 index 000000000..6fff4f9bf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-03-t.svg @@ -0,0 +1,219 @@ + + + + + + + + + + +

Tests the pointer-events attribute with different 'visible' values

+

+ The 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke. + The 4th column (most right column) has a non activatable pointer event as the visibility of the column + is set to hidden. +

+

+ The first row tests the default value for pointer-event, i.e. visible fill and stroke will trigger an event. + The second row tests pointer-events="visiblePainted", i.e. visible fill and stroke will trigger an event. + The third row tests pointer-events="visibleFill", i.e. visible fill only an event. + The fourth row tests pointer-events="visibleStroke", i.e. visible stroke only an event. + The fifth row tests pointer-events="visible", i.e. visible fill and stroke will trigger an event. +

+ + +

+ Slowly move the mouse over the rectangles in each row while checking the pass criteria. +

+
+ +

+ The test is passed if the following conditions are met +

+
    +
  • In the first row of squares, the fill and stroke of squares 1 and 3 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the second row of squares, the fill and stroke of squares 1 and 3 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the third row of squares, the fill only of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fourth row of squares, the stroke only of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fifth row of squares, the fill and stroke of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
+
+ + $RCSfile: animate-interact-pevents-03-t.svg,v $ + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + + + + + + + + + + default : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + visiblePainted : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visibleFill : + only fill of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visibleStroke : + only stroke of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + + + + + + + + + + visible : + fill and stroke of rects 1, 2 and 3 must trigger + + + + + + $Revision: 1.2 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-04-t.svg new file mode 100644 index 000000000..c0a45e813 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-interact-pevents-04-t.svg @@ -0,0 +1,208 @@ + + + + + + + + + + +

Tests the pointer-events attribute with different painting values

+

+ The 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke. + The 4th column has visibility set to hidden. +

+

+ The first row tests pointer-events="painted", i.e. event on fill and stroke that are set. + The second row tests pointer-events="fill", i.e. event on a fill that is set. + The third row tests pointer-events="stroke", i.e. even on a stroke that is et. + The fourth row tests pointer-events="all", i.e. event on fill and stroke that are set. + The fifth row tests pointer-events="none", i.e. no event. +

+ + +

+ Slowly move the mouse over the rectangles in each row while checking the pass criteria. +

+
+ +

+ The test is passed if the following conditions are met: +

+
    +
  • In the first row of squares, the fill and stroke of squares 1, 3 and 4 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the second row of squares, the fill only of all squares must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the third row of squares, the stroke only of all must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fourth row of squares, the fill and stroke of all squares must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fifth row of squares, nothing is to trigger on mouseover.
  • +
+
+ + $RCSfile: animate-interact-pevents-04-t.svg,v $ + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + + + + + + + + + + painted : + fill and stroke of rects 1, 3 and 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + fill : + fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + stroke : + stroke of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + all : + stroke and fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + + + + + + + + + + none : + nothing is to trigger + + + + + + $Revision: 1.2 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-pservers-grad-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-pservers-grad-01-b.svg new file mode 100644 index 000000000..8f0fdb9a9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-pservers-grad-01-b.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + +

+ This test shows rectangles filled with animated gradient which inherits some of their properties: stop-color, stop-opacity. +

+ + +

+ Load the svg and wait 5 seconds for the animation to run, then compare the image to the reference. +

+
+ +

+ The correct result should show: +

+
    +
  • the top-left rectangle filled initially with a linear green-to-red gradient and turning into a solid green color after 5s.
  • +
  • the top-right rectangle filled initially with a green gradient fully opaque on the left and half transparent on the right, but after 5s the rectangle should be filled with a fully opaque solid green.
  • +
  • the bottom-left rectangle filled with a static green-to-black opaque gradient.
  • +
  • the bottom-right rectangle initially filled with a green-to-yellow fully-opaque gradient animated and turning into a fully-opaque green solid color.
  • + +
+
+ + $RCSfile: animate-pservers-grad-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-script-elem-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-script-elem-01-b.svg new file mode 100644 index 000000000..c6da8c51b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-script-elem-01-b.svg @@ -0,0 +1,90 @@ + + + + + + + + + + +

+ This tests that the 'xlink:href' attribute on the 'script' element is not animatable. +

+

+ After loading the test and waiting one second, two rectangles + will appear, indicating the result of two sub-tests. The + upper rectangle reflects the result of testing that an + attempt to animate 'xlink:href' on 'script' does not affect + the .href.animVal of the element. The lower rectangle reflects + the result of testing that the animation attempt does not + cause a new script to be loaded and executed. Black indicates + that the sub-test did not run, red that it failed and green + that it passed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if both rectangles are green once they + appear one second after loading the test. +

+
+ + $RCSfile: animate-script-elem-01-b.svg,v $ + + + + + + + + + + Test that <script xlink:href=""> is not animatable + + + + + + Test script.href.animVal does not change + Test animating xlink:href="" does not load a script + + + + + + + + + + $Revision: 1.1 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-struct-dom-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-struct-dom-01-b.svg new file mode 100644 index 000000000..3181b620f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/animate-struct-dom-01-b.svg @@ -0,0 +1,93 @@ + + + + + + + + + + +

+ This tests that calling SVGSVGElement.getCurrentTime() before the + document timeline has begun returns 0, and that + calling SVGSVGElement.setCurrentTime() before the document timeline + has begun will queue a seek to that time once the timeline + does begin. + After loading the test, two rectangles will be shown. + The left rectangle indicates whether SVGSVGElement.getCurrentTime() + correctly returned 0 before the document timeline had begun. + The right rectangles indicates whether a call to + SVGSVGElement.setCurrentTime() was acted upon once the timeline + did begin. For each rectangle, red indicates that the sub-test + failed and green indicates that the sub-test passed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if both rectangles are green. +

+
+ + $RCSfile: animate-struct-dom-01-b.svg,v $ + + + + + + + + + + Test getCurrentTime() and setCurrentTime() before timeline begin + + + + + + + + getCurrentTime + setCurrentTime + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prof-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prof-01-f.svg new file mode 100644 index 000000000..7211dd0b2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prof-01-f.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

+ The purpose of this test is to determine if an application can apply ICC + color profiles to raster images. The same image is displayed twice; a color profile + is applied to one by the SVG, so that the colors change. +

+ + + +

+ +

+

+ Run the test. No interaction required. +

+
+ +

+ If the two images (each of 9 colored squares) look identical, the test fails. + If the colours in the lower right image are more saturated, brighter versions of + those in the top left image, as shown by the reference image, the test is passed. +

+
+ + $RCSfile: color-prof-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + Basic test of ICC profile with an image. + + + + $Revision: 1.9 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-01-b.svg new file mode 100644 index 000000000..5b7366a3b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-01-b.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+ This tests the 'color' property and the 'currentColor' value on fill, stroke, and stop-color properties. +

+ + +

+ Run the test. No interaction required. +

+ +
+ +

+ There are three subtests. The first subtest, to the top left, is passed if the circle has a green fill. The second subtest, + to the top right, is passed if the circle has a green stroke. The third subtest shows a rectangle + with a gradient fill, which has three stops. The subtest is passed if central stop is green, + fading off to blue to the left and pale yellow to the right. +

+
+ + $RCSfile: color-prop-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fill + stroke + stop-color + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-02-f.svg new file mode 100644 index 000000000..3fcc04d56 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-02-f.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + +

+ Tests if the color datatype is supported. There are multiple syntaxes for + specifying the same color, such as #37F and #3377FF. This test is focussed on the + X11 color names, which are not part of the tiny profile. + Each group of circles uses four forms - 6-digit hex, rbg() integer form, rgb() percentage form, + and named ('X11') colors. It does not use 3-digit hex, because the colors used in this test + cannot be represented in three digit form. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ For each of the nine groups of circles shown here, all circles must + be identical in color, and the same color as in the reference image. +

+
+ + $RCSfile: color-prop-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-03-t.svg new file mode 100644 index 000000000..466542ef8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-03-t.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + +

+ Tests if the color datatype is supported. There are multiple syntaxes for + specifying the same color, such as #37F and #3377FF. +For each of the six groups shown here, + each of the circles in the group uses one of the syntactical forms +

+

+ The first row uses five forms - 3-digit hex, 6-digit hex, rbg() integer form, rgb() percentage form, + and the 'HTML' subset of the name ('X11') colors. +

+

+ The second row uses only four forms - 3-digit hex, 6-digit hex, rbg() integer form, rgb() percentage form - + as there are no HTML or X11 names for those colors. +

+ + +

+ Run the test. No interaction required. +

+ +
+ +

+ For each of the six groups of circles shown here, all circles must + be identical in color, and the same color as in the reference image. +

+
+ + $RCSfile: color-prop-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-04-t.svg new file mode 100644 index 000000000..e481fc992 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-04-t.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + +

+ This tests the 'system' colors. +

+ + +

Run the test. No interaction required.

+
+ +

+ This test has no specific pass criteria, except that no error must be indicated. +

+

+ The colors on your screen might not match the reference + image at all, but they should at minimum be legible and should + preferably resemble the colors used on menus and other user interface + elements on your computer, pda or phone. +

+
+ + $RCSfile: color-prop-04-t.svg,v $ + + + + + + + + + + + + + + + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. + Vestibulum pulvinar. Duis laoreet, nunc vitae facilisis + tristique, pede sem iaculis mi, non consectetuer lorem + libero et est. Donec imperdiet purus sed odio. Duis + venenatis tortor eu lectus. Suspendisse sed metus at + metus viverra ultricies. Mauris porttitor, justo a vulputate + + + + + Load + + Save + + + + + + + + File + Edit + + + + Lorem + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-05-t.svg new file mode 100644 index 000000000..466dcda5f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/color-prop-05-t.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-01-t.svgz b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-01-t.svgz new file mode 100644 index 000000000..a4f1d0338 Binary files /dev/null and b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-01-t.svgz differ diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-02-f.svg new file mode 100644 index 000000000..53e570e77 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-02-f.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + +

+ Test that the viewer can read gzipped content in data uri. +

+ + +

+ Open the test in any SVG player. +

+
+ +

+ The test has passed if you see a star in the middle of the test frame. +

+
+ + $RCSfile: conform-viewers-02-f.svg,v $ + + + + + + + + + Test data uri with svgz content + + FAILED + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-03-f.svg new file mode 100644 index 000000000..4cfb4e7ca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/conform-viewers-03-f.svg @@ -0,0 +1,123 @@ + + + + + + + + + + +

+ This test checks that namespace prefixes are handled correctly. +

+

+ First, a random 20-character string is generated. The string only contains characters that are valid NCName letters. + This string is then used as a custom prefix for an 'href' attribute in the XLink namespace. + An 'image' element is created and two image references are added, one is in the "http://www.this.is.not.an/xlink" namespace, + and one is in the XLink namespace. Only the attribute with the 20-character prefix is actually in the XLink namespace, + which means that that link should be the one that is used when rendering the 'image' element. This first subtest is + using the setAttributeNS method. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The testcase has passed if after the script execution has taken place these conditions are met: +

+
    +
  • There is one pink image visible.
  • +
  • The image doesn't show the word "Fail"
  • +
  • The status message says "No exceptions"
  • +
+
+ + $RCSfile: conform-viewers-03-f.svg,v $ + + + + + + + + + + + + + Generated prefix 1: ... + + + Status: No exceptions. + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-01-t.svg new file mode 100644 index 000000000..0019667ca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-01-t.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

+ Tests the default initial coordinate system used by renderer. +

+

Should be 0,0 if not specified. This is illustrated by comparing blue boxes that are + missing a coordinate or all coordinates with yellow boxes that have the + correct coordinates specified. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are three blue boxes, + with small yellow boxes rendered on top of them. These boxes should be + placed along the origin, and x and y axis. +

+
+ + $RCSfile: coords-coord-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-02-t.svg new file mode 100644 index 000000000..a6b0a55c5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-coord-02-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ Tests the default units used for the initial coordinate system. This is + illustrated by comparing blue boxes that have no units specified for their + coordinates, with yellow boxes that have px units specified for their + coordinates. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ This test should produce three blue boxes, with small yellow + boxes rendered on top of them. These boxes should be placed along the + origin, x and y axis. +

+
+ + $RCSfile: coords-coord-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-01-f.svg new file mode 100644 index 000000000..c254ae7a2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-01-f.svg @@ -0,0 +1,115 @@ + + + + + + + + + + +

+ Tests the liveness of SVGTransform.matrix. +

+ + +

+ Load the svg, you should see a green circle. +

+
+ +

+ The test has passed if: +

+
    +
  • There is no red visible
  • +
  • There is a green circle visible
  • +
+
+ + $RCSfile: coords-dom-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-02-f.svg new file mode 100644 index 000000000..42cac3b3f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-02-f.svg @@ -0,0 +1,96 @@ + + + + + + + + + + +

+ Tests the liveness of SVGTransform.matrix, that the SVGTransform object is updated when the SVGTransform.matrix object is changed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • There is no red visible
  • +
  • There is a green ellipse visible
  • +
+
+ + $RCSfile: coords-dom-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-03-f.svg new file mode 100644 index 000000000..b44d16c6b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-03-f.svg @@ -0,0 +1,116 @@ + + + + + + + + + + +

+ This tests that SVGTransformList.createSVGTransformFromMatrix(), + SVGSVGElement.createSVGTransformFromMatrix() and SVGTransform.setMatrix() + all do not track changes to the SVGMatrix passed to them. +

+

+ After loading the test, three rectangles will be presented. The + upper rectangle indicates the result of testing whether + SVGTransformList.createSVGTransformFromMatrix() behaved correctly, + the middle rectangle indicates the status for SVGSVGElement.createSVGTransformFromMatrix(), + and the bottom rectangle for SVGTransform.setMatrix(). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the three rectangles are green. +

+
+ + $RCSfile: coords-dom-03-f.svg,v $ + + + + + + + + + + Test that some methods taking an SVGMatrix take a copy of it + + + + + + SVGTransformList.createSVGTransformFromMatrix() + SVGSVGElement.createSVGTransformFromMatrix() + SVGTransform.setMatrix() + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-04-f.svg new file mode 100644 index 000000000..9e620bc68 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-dom-04-f.svg @@ -0,0 +1,166 @@ + + + + + + + + + + +

+ The test checks the SVGTransformList.consolidate method. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ There must be 13 green rectangles visible. + The text next to the first rectangle must say "Scripting enabled". + The other 12 lines must each say "Passed subtest #n" where n is the subtest number 1..12. + If anything red shows, the test has failed. +

+
+ + $RCSfile: coords-dom-04-f.svg,v $ + + + + + + + + + + + + + + + + + Scripting disabled + + + + + + + $Revision: 1.5 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-01-b.svg new file mode 100644 index 000000000..19431e0fe --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-01-b.svg @@ -0,0 +1,239 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate (50, 50) + + + + + rotate(-90) + + + + + skew x (45) + + + + + skew y (45) + + + + + scale (2) + + + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) and translate(2, 2) + + + + + scale(25, 95) then translate(2, 2) + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-02-t.svg new file mode 100644 index 000000000..ef3ab1a88 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-02-t.svg @@ -0,0 +1,176 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + translate (50, 50) + + + + + rotate(-90) + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-03-t.svg new file mode 100644 index 000000000..b1c507c95 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-03-t.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + skew x (45) + + + + + skew y (45) + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-04-t.svg new file mode 100644 index 000000000..3ca363087 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-04-t.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale (2) + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-05-t.svg new file mode 100644 index 000000000..d0d78bf43 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-05-t.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) - translate(2, 2) + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-06-t.svg new file mode 100644 index 000000000..9b845b231 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-06-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + scale(25, 95) then translate(2, 2) + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-07-t.svg new file mode 100644 index 000000000..f9cb6c44c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-07-t.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ The test uses the rect element, the fill color (solid primary colors) and transforms. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text - a long blue line at four o'clock and a short red line at seven o'clock below the text "translate+rotate", and, below and to the left of that, a long green line at four o'clock and a short red line at seven o'clock below the text "rotate+translate". +

+
+ + $RCSfile: coords-trans-07-t.svg,v $ + + + + + + + + + + + + + + rotate+translate + + + + + + translate+rotate + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-08-t.svg new file mode 100644 index 000000000..d1cbf594a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-08-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ This test will check if the transfomations performed are carried out in the proper order. The result should differ depending on which transformation comes first. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-08-t.svg,v $ + + + + + + + + + + + + + + + + + skewX(45)+skewY(45) + + + + + + + + + skewY(45)+skewX(45) + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-09-t.svg new file mode 100644 index 000000000..d37ef9cce --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-09-t.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of transforms. It tests elementary transforms + and transform nesting. + Note that for layout purposes, this test uses nesting of translation with the elementary transforms. +

+

+ This test will check if the various matrix operations work +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-trans-09-t.svg,v $ + + + + + + + + + + + + + + + matrix(0 0 0 0 0 0) + + + + + + matrix(1 0 0 1 100 100) + + + + + + matrix(1.5 0 0 1.5 70 60) + + + + + + matrix(1 0 0.5 1 30 170) + + + + + + matrix(1 0.5 0 1 100 200) + + + + + + matrix(0 1 -1 0 450 0) + + + + + + matrix(1 0.8 0.8 1 300 220) + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-10-f.svg new file mode 100644 index 000000000..b50b4c3fa --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-10-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-11-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-11-f.svg new file mode 100644 index 000000000..a5ed7d518 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-11-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-12-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-12-f.svg new file mode 100644 index 000000000..b2f9b9037 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-12-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-13-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-13-f.svg new file mode 100644 index 000000000..0dba07346 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-13-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-14-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-14-f.svg new file mode 100644 index 000000000..a224a385d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-trans-14-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-01-f.svg new file mode 100644 index 000000000..b3914f37c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-01-f.svg @@ -0,0 +1,94 @@ + + + + + + + + + + +

+ Tests that separating transform definitions by whitespace and/or a comma is supported. The test draws a red 'rect' element with a valid, non-delimited transform list. It overlays it with an identical black rectangle with + equivalent transform list delimted by commas and numerical Unicode references of space (U+0020), tab (U+0009), carriage + return (U+000D), line feed (U+000A), and combination of all five, +so that no red is visible. +

+ + +

+ Run the test. No interaction required. +

+
+ +

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

+
+ + $RCSfile: coords-transformattr-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-02-f.svg new file mode 100644 index 000000000..7e676c7e4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-02-f.svg @@ -0,0 +1,93 @@ + + + + + + + + + + +

+ If a list of transforms is provided, then the net effect is as if each transform had been specified separately in the order provided. +

+

The test overlays a black 'rect' with transform list on top of an equivalent red 'rect' with equivalent nested transforms, and vice + versa, so that there is no red visible on the page.

p> + + +

+ Run the test. No interaction required. +

+
+ +

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

+
+ + $RCSfile: coords-transformattr-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-03-f.svg new file mode 100644 index 000000000..ce5f7a7b8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-03-f.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + +

+ If 'ty' is not specified for a 'translate' transform, it is assumed to be zero. +

+

+ Specify a series of various red graphics elements. Specify an equivalent series of black graphics elements that are defined to have positions + that are shifted '10' user units to the right of the red graphics elements. Specify a 'transform' value of 'translate' with only the 'tx' value + specified (i.e., 'translate(10)'). If the 'ty' parameter takes the default value of '0' user units, there will be no red on the page. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if there is no red visible on the page. +

+
+ + $RCSfile: coords-transformattr-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-04-f.svg new file mode 100644 index 000000000..031c89e09 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-04-f.svg @@ -0,0 +1,60 @@ + + + + + + + + + + +

+ If 'sy' is not specified for a 'scale' transform, it is assumed to be equal to 'sx'. +

+

+ Specify a series of various red graphics elements. Specify an equivalent series of black graphics elements that are defined to have dimensions + that are half the size as the red elements. Specify a 'transform' value of 'scale' with only the 'sx' value specified (i.e., 'scale(2)'). If the 'sy' + parameter takes the same value as the 'sx', there will be no red on the page. +

+ + +

Run the test. No interaction required.

+
+ +

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

+
+ + $RCSfile: coords-transformattr-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-05-f.svg new file mode 100644 index 000000000..2f14c18ba --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-transformattr-05-f.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ If 'cx' and 'cy' are not specified for a 'rotate' transform, the rotation is about the origin of the current user coordinate system and thus corresponds to the matrix [cos(a) sin(a) -sin(a) cos(a) 0 0]. +

+

+ Specify a series of various black graphics elements inside a 'g' element with 'transform' set to a 'rotate' value with unspecified 'cx' + and 'cy' parameters (i.e., 'rotate(15)'). Specify an equivalent series of red graphics elements inside a 'g' element with 'transform' set + to a 'matrix' value which would rotate the elements 15 degrees about the point (0,0) of the current user coordinate system. If the 'g' element containing the black elements correctly rotates its content by 15 degrees around the origin of the current user coordinate system, there will be no red on the page. +

+ + +

Run the test. No interaction required.

+
+ +

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

+ +
+ + $RCSfile: coords-transformattr-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-01-b.svg new file mode 100644 index 000000000..830d5b769 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-01-b.svg @@ -0,0 +1,175 @@ + + + + + + + + + + + + +

+ Verify the conversion processing of percentage and fraction values relative to + object bounding boxes. This is used when defining linear and radial gradients + as well as patterns. +

+

+ The test validates conversion for coordinates, width, height and length. The first + test defines three corresponding linear gradients, which specify coordinates + using percentages for one, fractions for the second and user coordinates for the + third. The second test defines three corresponding radial gradients, which specify + a length (radius) using percentages for the first, fractions for the second and + user space for the third. Finally, the third test defines three corresponding patterns, + which specify their width and height using percentages for the first, fractions for the + second and user space coordinates for the last one. +

+

+ The test also assumes that linear and radial gradients, + as well as patterns are implemented. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered image should match the reference image. Also, the text may + show minor differences, per CSS2 rules for font selection and matching. +

+
+ + $RCSfile: coords-units-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative coordinates (percentage and fraction) + + + + + + + Percentage + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative length (percentage and fraction) + + + + + Percent. + Fraction + User Space + + + + + + + + + + + + + + + + + + + + + + + + + + Bounding box relative width/height (percentage and fraction) + + + + + Percentage + Fraction + User Space + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-02-b.svg new file mode 100644 index 000000000..b83db3774 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-02-b.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + +

+ Verify the conversion processing of CSS units and percentage values for both + coordinates and length values. Note that the test uses the CSS px unit to be usable + in all pixel resolutions. Hence, the conversion from other CSS units to CSS px is + left out of the test. +

+

+ There are six atomic tests in this test. For each, the approach is to draw two similar + elements (circles or rects) with coordinates specified in user space for one and in + CSS units or percentage for the other. Each test is such that these two values (or + value pairs) should match. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ In the first two tests, that validate coordinate processing, the circles + should have the same center. In the following two tests, the rectangles should have + the same height and width. And finally, in the last test, the 3 skewed circles should have the + same radius. +

+

+ The rendered image should match the reference image except for the text which may + show minor differences, per CSS2 rules for font selection and matching. +

+
+ + $RCSfile: coords-units-02-b.svg,v $ + + + + + + + + + + + + + + + + CSS pixel coordinate to user space conversion + + + + + + + + + + + Percentage coordinates to user space conversion + + + + + + + + + + + + + + CSS width/height to user space conversion + + + + + + + + + + + Percentage width/height to user space conversion + + + + + + + + + + + + + + CSS and percentage length conversion + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-03-b.svg new file mode 100644 index 000000000..c9828be4b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-units-03-b.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + +

+ This test verifies both the initial viewport size and the support for the various + unit specifiers. +

+

+ The units in SVG can be: user coordinate and CSS units: em, ex, px, pt, pc, cm, mm, + in and percentages. The test does not check the absolute length accuracy as this + can only be truly validated with a ruler. However, it validates that the different + units are supported by drawing multiple elements who have the same length specified + in different units. +

+

+ The viewport is the "finite rectangular region" where rendering occurs in SVG. + Hence, nothing should be rendered outside the viewport (paragraph 7.1). Furthermore, + when no positioning properties are set on the top svg element, the initial viewport + size should have the value of the top svg element's "width" and "height" attributes. + To check this behavior, the test does not define positioning properties on the top + svg element but defines its "width" and "height" properties. Then it fills a red + rectangle that is bigger than the viewport size. Then, a rectangle, the size of the + viewport is drawn in white. If rendering is limited to the viewport area, none of the + red should show. +

+

+ The line showing the "ex" units will not necessarily appear with the same length + as shown in the reference image because the X-height of a font is not + necessarily half of the font size (which is assumed in the reference image where + 1ex is considered to be .5em). +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if the top three lines (user units, px, em) are the same length, + the fifth line (%) is the same length as the top three lines, and the bottom + five lines (in, cm, mm, pt, pc) are the same length. The fourth line (ex) may have + any non-zero length, since the X-height of the font will depend on the exact font + chosen by the user agent (which may vary).

+
+ + $RCSfile: coords-units-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + Initial viewport and CSS units test + + + + + + 200 + User space units (no specifier) + + + + + + + + 200 px + Pixels (px) + + + + 20 em = 200 px (font-size=10px) + Relative to font size (em) + + + + + + 40 ex + Relative to font x-height (ex) + + + + + + + + 41.67% = 200 px + Percentage (%) + + + + + + 1 in + Inches (in) + + + + 2.54 cm = 1 in + Centimeters (cm) + + + + 25.4 mm = 1 in + Millimeters (mm) + + + + 72pt = 1 in + Points (pt) + + + + 6pc = 1 in + Picas (pc) + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-01-b.svg new file mode 100644 index 000000000..05fbe99f5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-01-b.svg @@ -0,0 +1,140 @@ + + + + + + + + "> + "> + "> +]> + + + + + + + + + + + + +

+ This test verifies the implementation of the viewBox and the + preserveAspectRatio attribute. This is a modified version of the sample + file included in the SVG specification. It exercises the various + preserveAspectRatio values and uses a general entity definition in order + to make reading of the SVG source easier. +

+ + +

+ Load the document in the user agent. +

+
+ +

+ The rendered picture should match the reference image exactly except for + variations in the labeling text. +

+
+ + $RCSfile: coords-viewattr-01-b.svg,v $ + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + Test available options of preserveAspectRatio + SVG to fit + &Smile; + Viewport 1 + &Viewport1; + Viewport 2 + &Viewport2; + + ---------- meet -------------------- + + xMin*&Viewport1; + &Smile; + + + xMid*&Viewport1; + &Smile; + + + xMax*&Viewport1; + &Smile; + + + + ---------- meet ------------------------ + + *YMin&Viewport2; + &Smile; + + + *YMid&Viewport2; + &Smile; + + + *YMax&Viewport2; + &Smile; + + + + ---------- slice ------------------------- + + xMin*&Viewport2; + &Smile; + + + xMid*&Viewport2; + &Smile; + + + xMax*&Viewport2; + &Smile; + + + + ---------- slice --------------------- + + *YMin&Viewport1; + &Smile; + + + *YMid&Viewport1; + &Smile; + + + *YMax&Viewport1; + &Smile; + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-02-b.svg new file mode 100644 index 000000000..77a0e1979 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-02-b.svg @@ -0,0 +1,716 @@ +"> + "> +]> + + + + + + + + + + + + +

+ This test verifies the implementation of the preserveAspectRatio attribute on <image> + referencing raster content. +

+ + +

+ This is a modified version of the sample file included in the SVG specification. + It exercises the various preserveAspectRatio values and uses a general entity definition + in order to make reading of the SVG source easier. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-viewattr-02-b.svg,v $ + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + Test options of preserveAspectRatio on an image element + Raster to fit + + + + Viewport 1 + &Viewport1; + Viewport 2 + &Viewport2; + + ---------- meet -------------------- + + xMin*&Viewport1; + + + + xMid*&Viewport1; + + + + xMax*&Viewport1; + + + + + ---------- meet ------------------------ + + *YMin&Viewport2; + + + + *YMid&Viewport2; + + + + *YMax&Viewport2; + + + + + ---------- slice ------------------------- + + xMin*&Viewport2; + + + + xMid*&Viewport2; + + + + xMax*&Viewport2; + + + + + ---------- slice --------------------- + + *YMin&Viewport1; + + + + *YMid&Viewport1; + + + + *YMax&Viewport1; + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-03-b.svg new file mode 100644 index 000000000..02c31605e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-03-b.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + +

+ This file tests the allowed syntax of the viewBox attribute. The viewBox attribute is a list of + four numbers min-x, min-y, width and height, separated by whitespace and/or a comma. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ In the rendered result, you should see 6 identical light blue shapes. +

+
+ + $RCSfile: coords-viewattr-03-b.svg,v $ + + + + + + + + + <svg> 'viewBox' attribute + + + + + + + viewBox="0 0 200 200" + overflow="visible" + + + + + viewBox="0 0 200 200" + overflow="hidden" + + + + + viewBox="0,0,200,200" + overflow="visible" + + + + + viewBox="0,0,200,200" + overflow="hidden" + + + + + viewBox="0,0, 200, 200" + overflow="visible" + + + + + viewBox="0,0, 200, 200" + overflow="hidden" + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-04-f.svg new file mode 100644 index 000000000..f172ecd2a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/coords-viewattr-04-f.svg @@ -0,0 +1,129 @@ +"> + "> +]> + + + + + + + + + + + + +

+ This test verifies the implementation of the preserveAspectRatio attribute on <image> + referencing svg content. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: coords-viewattr-04-f.svg,v $ + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + Test options of preserveAspectRatio on an image element + SVG to fit + + + + Viewport 1 + &Viewport1; + Viewport 2 + &Viewport2; + + ---------- meet -------------------- + + xMin*&Viewport1; + + + + xMid*&Viewport1; + + + + xMax*&Viewport1; + + + + + ---------- meet ------------------------ + + *YMin&Viewport2; + + + + *YMid&Viewport2; + + + + *YMax&Viewport2; + + + + + ---------- slice ------------------------- + + xMin*&Viewport2; + + + + xMid*&Viewport2; + + + + xMax*&Viewport2; + + + + + ---------- slice --------------------- + + *YMin&Viewport1; + + + + *YMid&Viewport1; + + + + *YMax&Viewport1; + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/extend-namespace-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/extend-namespace-01-f.svg new file mode 100644 index 000000000..e5c111139 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/extend-namespace-01-f.svg @@ -0,0 +1,180 @@ + + + + + + + + + + + + +

+ Test mixing a business data namespace with elements in SVG namespace. +

+

+ The test case uses a different namespace to hold fake sales data. + Using ECMAScript to make calls to the DOM, the test case extracts + the sales data and then makes calls to the SVG DOM to build up + a 'path' element and a 'text' element for each individual pie slice. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The result should show five pie slices. + The first pie slice should be exploded, with a pink fill and a blue border. + The other pie slices should have various levels of gray fill and black borders. + The name of each region should appear in black towards the center of + the pie slice. +

+
+ + $RCSfile: extend-namespace-01-f.svg,v $ + + + + + + + + + + + + + + + East + 3 + + + North + 4 + + + West + 5 + + + Central + 3.2 + + + South + 6 + + + + Pie chart built from data in a different namespace. + + + + Pie chart is built within this 'g' element + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-background-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-background-01-f.svg new file mode 100644 index 000000000..72510dd51 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-background-01-f.svg @@ -0,0 +1,159 @@ + + + + + + + + + + +

+ Test background image processing. +

+

+ The first subtest enables background image processing and adds an empty ‘g’ element + which invokes the ShiftBGAndBlur filter. This filter takes the current accumulated + background image (i.e., the entire reference graphic) as input, shifts its offscreen + down, blurs it, and then writes the result to the canvas. Note that the offscreen for + the filter is initialized to transparent black, which allows the already rendered + rectangle, circle and triangle to show through after the filter renders its own + result to the canvas. +

+

+ The second subtest enables background image processing and instead invokes the + ShiftBGAndBlur filter on the inner ‘g’ element. The accumulated background at the + time the filter is applied contains only the rectangle. Because the children + of the inner ‘g’ (i.e., the circle and triangle) are not part of the inner ‘g’ element's + background and because ShiftBGAndBlur ignores SourceGraphic, the children of the inner ‘g’ + do not appear in the result. +

+

+ The third subtest enables background image processing and invokes the ShiftBGAndBlur on the + ‘polygon’ element that draws the triangle. The accumulated background at the time the filter + is applied contains the rectangle plus the circle ignoring the effect of the ‘opacity’ + property on the inner ‘g’ element. (Note that the blurred circle at the bottom does not + let the rectangle show through on its left side. This is due to ignoring the effect of + the ‘opacity’ property.) Because the triangle itself is not part of the accumulated background + and because ShiftBGAndBlur ignores SourceGraphic, the triangle does not appear in the result. +

+

+ The fourth subtest is the same as the third except that filter ShiftBGAndBlur_WithSourceGraphic is + invoked instead of ShiftBGAndBlur. ShiftBGAndBlur_WithSourceGraphic performs the same effect as + ShiftBGAndBlur, but then renders the SourceGraphic on top of the shifted, blurred background + image. In this case, SourceGraphic is the blue triangle; thus, the result is the same as in + the fourth case except that the triangle now appears. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • each blue rectangle has the same shapes twice inside, once without filters applied, once with (blurred)
  • +
  • from left to right, the blue rectangles contain the following shapes: [rectangle, circle, triangle], [rectangle], [rectangle, circle], [rectangle, circle, triangle]
  • +
+
+ + $RCSfile: filters-background-01-f.svg,v $ + + + + + + + + + + + + This filter discards the SourceGraphic, if any, and just produces + a result consisting of the BackgroundImage shifted down 125 units + and then blurred. + + + + + + + This filter takes the BackgroundImage, shifts it down 125 units, blurs it, + and then renders the SourceGraphic on top of the shifted/blurred background. + + + + + + + + + + + + + The second adds an empty 'g' element which invokes ShiftBGAndBlur. + + + + + + + + + + + The third invokes ShiftBGAndBlur on the inner group. + + + + + + + + + + The fourth invokes ShiftBGAndBlur on the triangle. + + + + + + + + + + The fifth invokes ShiftBGAndBlur_WithSourceGraphic on the triangle. + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-blend-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-blend-01-b.svg new file mode 100644 index 000000000..685a59ee5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-blend-01-b.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + +

+ Verify correct operation of the five compositing modes + of the feBlend filter primitive. Seven rectangles are + blended into a gradient, with text strings identifying + which of the the five feBlend modes were used. +

+

+ All rectangles but the fourth one have a blue fill, although the + blend mode will adjust this color. The fourth has a yellow fill. +

+

+ The third and fourth rectangles are grouped and the filter is applied to the group. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-blend-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Normal + Multiply + Multiply + Multiply + Screen + Darken + Lighten + + + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-01-b.svg new file mode 100644 index 000000000..53b993a0e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-01-b.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of + feColorMatrix. +

+

+ This test uses the following elements : a nested + <svg> with a viewBox attribute, <linearGradient>, + <filter>, <feColorMatrix>, <feComposite>. +

+

+ The test case shows five rectangles filled with a + gradient showing the effects of feColorMatrix: an + unfiltered rectangle acting as a reference, use of the + feColorMatrix matrix option to convert to grayscale, + use of the feColorMatrix saturate option, use of the + feColorMatrix hueRotate option, and use of the + feColorMatrix luminanceToAlpha option. +

+

+ The test is somewhat self-explanatory as the strings + document the type of feColorMatrix operation that is + being used. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-color-01-b.svg,v $ + + + + + + + + + + Example feColorMatrix - Examples of feColorMatrix operations + Five rectangles filled with a gradient showing the effects of feColorMatrix: an unfiltered rectangle acting as a reference, use of the feColorMatrix matrix option to convert to grayscale, use of the feColorMatrix saturate option, use of the feColorMatrix hueRotate option, and use of the feColorMatrix luminanceToAlpha option. + + + + + + + + + + + + + + + + + + + + + + + + + Unfiltered + + type="matrix" (grayscale matrix) + + type="saturate" values=".4" + + type="hueRotate" values="90" + + type="luminanceToAlpha" + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-02-b.svg new file mode 100644 index 000000000..ac399b980 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-color-02-b.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ Tests the default behaviour of feComponentTransfer +

+

+ The test displays two rects with the same gradient fill. The gradient + fill has the stops red, green, blue and black all of which are evenly + spaced. +

+

+ The first rect with the 'Reference' label beneath it has an + feComponentTransfer filter applied to it. This filter specifies a + 'linear' transform for the Red component such that Red is transformed to + Black. The Green component is specified as an 'identity' transform. The + remaining components (Green, Alpha) are unspecified and by default + must be treated as 'identity' transforms. +

+

+ The second rect with the 'Default' label beneath it has an + feComponentTransfer filter applied to it. This filter specifies a + multiple transforms from the Red component. The last transform + specified for the Red component is a 'linear' transform that shifts Red + to Black. This is the transform that should be used by a conforming + implementation. There are no other components specified for the filter + of the second rect. A conforming implementation should treat + unspecified components in an feComponentTransfer as 'identity'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ For this test to pass both rects must have a gradient fill that has the + stop colors Black, Green, Blue and Black, equally spaced. +

+
+ + $RCSfile: filters-color-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference + Default + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-02-b.svg new file mode 100644 index 000000000..23e4b9adf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-02-b.svg @@ -0,0 +1,203 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of feComposite. +

+

+ This test uses the following elements: <path>, <filter> + <feImage> <feComposite>. +

+

+ The test case shows six pairs of overlapping triangles + depicting the six different feComposite operators. The + first row shows compositing when both triangles have + opacity=1. The second row shows compositing when both + triangles have opacity=.5. The six columns illustrate the + six types of compositing operations. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-composite-02-b.svg,v $ + + + + + + + + + + Example feComposite - Examples of feComposite operations + Six pairs of overlapping triangles depicting the six different feComposite operators. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + on first Row : opacity 1.0 + on second row opacity 0.5 + + + + over + + + + + + + + + in + + + + + + + + + out + + + + + + + + atop + + + + + + + + xor + + + + + + + arith- + metic + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-03-f.svg new file mode 100644 index 000000000..39c9dca9e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-03-f.svg @@ -0,0 +1,87 @@ + + + + + + + + + + +

+ Tests the arithmetic operator in feComposite. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are four filled squares visible, and the + fill color matches the respective reference stroke exactly. +

+
+ + $RCSfile: filters-composite-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-04-f.svg new file mode 100644 index 000000000..78404f10e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-04-f.svg @@ -0,0 +1,78 @@ + + + + + + + + + + +

+ Test feComposite and the arithmetic operator to implement a simple dissolve operation. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if there are four images visible, each in + different stages of dissolving the bird in the foreground into the + tree in the background. +

+
+ + $RCSfile: filters-composite-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-05-f.svg new file mode 100644 index 000000000..0d4ffe8e4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-composite-05-f.svg @@ -0,0 +1,68 @@ + + + + + + + + + + +

+ Testing the feComposite element and that the 'k2' and 'k3' attributes + are animatable. The result is an animated dissolve between two images. +

+ + +

+ Reload the testcase or click the image to run animation again. +

+
+ +

+ The test has passed if there is an animation effect that gradually + dissolves a photo of a tree into an image of a bird over the course + of two seconds. The final result is that the bird is fully visible + and the tree photo is invisible. +

+
+ + $RCSfile: filters-composite-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-comptran-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-comptran-01-b.svg new file mode 100644 index 000000000..4f94d9412 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-comptran-01-b.svg @@ -0,0 +1,126 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of + feComponentTransfer. +

+

+ This test uses the following elements : a nested <svg> + with a viewBox attribute, <linearGradient>, <filter>, + <feComponentTransfer>. +

+

+ The test case shows four rectangles filled with a + gradient showing the effects of feComponentTransfer: an + identity function acting as a reference, use of the + feComponentTransfer table option, use of the + feComponentTransfer linear option, and use of the + feComponentTransfer gamma option. +

+

+ The test is somewhat self-explanatory as the strings + document the type of feComponentTransfer operation that + is being used. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-comptran-01-b.svg,v $ + + + + + + + + + + Example feComponentTransfer - Examples of feComponentTransfer operations + Four rectangles filled with a gradient showing the effects of feComponentTransfer: an identity function acting as a reference, use of the feComponentTransfer table option, use of the feComponentTransfer linear option, and use of the feComponentTransfer gamma option. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type: identity + + type: table + + type:linear slope:.5 intercepts:.25/0/.5 + + type: gamma ampl:2 exponents:5/3/1 + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-01-f.svg new file mode 100644 index 000000000..3ca53f6bb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-01-f.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of + feConvolveMatrix. +

+

+ This test defines six filters that exercise traditional + convolutions: uniform blur, vertical and horizontal + blurs, edge detection, embossing and sharpening. Note + that the edge detection filter produces a fully + transparent image because the alpha channel is convolved + and produces 0 values. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the + labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-conv-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Blur (3x3) + + + + Edge Detection (3x3) + + + + Sharpening (3x3) + + + + Embossing (3x3) + + + + Horizontal blur (3x1) + + + + Vertical blur (1x3) + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-02-f.svg new file mode 100644 index 000000000..5912f422b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-02-f.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +

+ Tests feConvolveMatrix with different values for the 'order' attribute. +

+ + +

Run the test. No interaction required. + +

+
+ +

You should see three filtered images. Each image is the same + and has the same filter applied to it. + The test has passed if all the three filtered images look the same, and the filtered result shows bright white edges on a dark background. + The rendered picture should match the reference image. +

+
+ + $RCSfile: filters-conv-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + feConvolveMatrix 'order' attribute + + + without order + + + order="3" + + + order="3 3" + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-03-f.svg new file mode 100644 index 000000000..cb9d8448e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-03-f.svg @@ -0,0 +1,102 @@ + + + + + + + + + + +

+ Tests the 'in1' DOM attribute on 'feConvolveMatrix'. +

+

+ Load the testcase, you should see three nearly identical images that say "FAIL". + After 3 seconds all three images should be replaced by the same image of a bird. + The two images to the right have filters applied, while the one on the left is always unfiltered. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • the two images inside the blue rects look exactly the same
  • +
  • the same base image is used in all three rects
  • +
  • the purple image that says "FAIL" is replaced after 3 seconds by an image of a bird
  • +
+
+ + $RCSfile: filters-conv-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + PASS + + + + + feConvolveMatrix 'in1' DOM + + + + + + + Original image + Animated filter + Scripted filter + + + $Revision: 1.8 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-04-f.svg new file mode 100644 index 000000000..e1291c03d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-04-f.svg @@ -0,0 +1,163 @@ + + + + + + + + + + +

+ Tests the 'bias' attribute on 'feConvolveMatrix'. +

+

+ The test uses a raster image and a vector graphic to test the effect + that the 'bias' attribute on 'feConvolveMatrix' has. +

+

+ The first row of images in the test are four identical raster images. + The first image is the original unfiltered image. The second has the + filter kernel applied with no bias value specified. The third and fourth + images both have a bias value specified for the filter. +

+

+ The second row of images in the test are four rectangle objects with a + gradient fill. The gradient fill transitions from opaque green to + transparent green. The first image is the original unfiltered graphic. The + second graphic has a filter kernel applied with no bias value specified. + The third and forth images both have a bias value specified for the + filter. +

+

+ Behind each filter result there's a checkerboard pattern placed, to help + verify that there's transparency in the lower row, but not in the upper. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • + The raster images in the top row appears more faded and coarse for each instance + further to the right. +
      +
    • The first image (left most) must be smooth and clear
    • +
    • + The second image (second from the left) must contain the same colours as + the first image but have course outlining around the objects. +
    • +
    • + The third image (second from the right) must contain colour that is very faded + but have course outlining around the faded objects. +
    • +
    • + The last image (right most) must be completed faded such that all the colour + in the first image appears to have gone to white. Some course outlining should + appear in the image. +
    • +
    +
  • +
  • + The top row has no checkerboard pattern visible where the filtered results are. +
  • +
  • + The rectangle with a green gradient going from left to right appears + more faded for each instance further to the right. +
      +
    • + The first image (left most) must be a rect filled with a linear gradient that + transitions from solid green to transparent green. +
    • +
    • The second image (second from the left) must be identical to the first image.
    • +
    • + The third image (second from the right) must contain a linear gradient that transitions + from a solid faded green to transparent faded green. +
    • +
    • + The last image (right most) must contain a linear gradient that transitions from + solid white to transparent white. +
    • +
    +
  • +
  • + The bottom row must show 95% of the checkerboard pattern where the filtered results are + since the gradients are transparent. +
  • +
+
+ + $RCSfile: filters-conv-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-05-f.svg new file mode 100644 index 000000000..b60f774ee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-conv-05-f.svg @@ -0,0 +1,83 @@ + + + + + + + + + + +

+ Tests feConvolveMatrix and the 'edgeMode' attribute. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ You should see three filtered images, each result should be slightly different, if they all look the same the test has failed. + The rendered picture should match the reference image. +

+
+ + $RCSfile: filters-conv-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + feConvolveMatrix 'edgeMode' + + + none + + + wrap + + + duplicate + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-diffuse-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-diffuse-01-f.svg new file mode 100644 index 000000000..5f8c3f080 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-diffuse-01-f.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + +

+ Verify the basic operation of the feDiffuseLighting + element. The test shows three rows of 3 images. Each + rows tests a different aspect of the filter and shows + the result of the filtering operation. +

+

+ The first row shows the result of varying the + surfaceScale attribute. The second row shows the result + of varying the diffuse constant (kd) attribute. The last + row shows the result of varying the lighting-color + property. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image. +

+
+ + $RCSfile: filters-diffuse-01-f.svg,v $ + + + + + + + + + + Filters: feDiffuseLighting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for surfaceScale: 1, 10 and -10 + + + + + + + Various values for diffuseConstants: 0, 1 and 2 + + + + + + + Various values for lighting color: red, yellow and blue + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-01-f.svg new file mode 100644 index 000000000..2ff17a780 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-01-f.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the feDisplacementMap filter + node. Six images should appear in 2 rows of 3. On the left in each + row a test image of a checker board is displayed. In the middle + column is the displacement map. In the right-hand column is the + result. All displacement maps are generated as png files with gamma + 1.0 and must be interpreted linearly for the proper geometric + displacement to occur. +

+

+ The top row tests a displacement map which displaces each pixel by an + amount equivalent to a rotation of 20 degrees around the center of the + image. A blue reference rectangle is drawn on the result using an svg + transform attribute to mimick the same 20 degree rotation. The edges + of the blue rectangle should be parallel to the grid lines in the + displaced image. Distortion of the grid pattern such that the grid + lines are slightly curved is indicative of improper gamma handling in + the viewer. +

+

+ The bottom row tests a displacement map which distorts the image + spherically. +

+

+ In addition to feDisplacementMap, this test uses the 'feImage' and + 'rect' elements. Figure labeling uses the text element. The + reference blue rectangle uses fill, fill-opacity, and transform. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered image should match the reference image. The edges + of the blue rectangle must be parallel to the grid lines in the + displaced image. The center of the bottommost right distorted image + should be on a gridpoint. +

+
+ + $RCSfile: filters-displace-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Checkerboard Image + + + + + Displacement Map + (20 deg. rotation) + + + + + + + + Result + (overlayed with 20 deg. + rotated blue rectangle) + + + + + + Checkerboard Image + + + + + + Displacement Map + (spherical distortion) + + + + + Result + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-02-f.svg new file mode 100644 index 000000000..1fc1d1bc5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-displace-02-f.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + +

+ This tests feDisplacementMap without feImage. The input geometry is also used as the displacement map. +

+

+ The bottom subtest tests that not specifying the 'xChannelSelector' attribute has the same effect as if 'A' was specified. +

+

+ In both cases the filter input image consists of a gradient that is rendered using the default 'color-interpolation' which is 'sRGB'. + The default colorspace for filter primitives is 'linearRGB'. The filtering operation happens in 'linearRGB' space and the + result is then transformed back to 'sRGB' space for display. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • the top rectangle is overlapped by a gradient that has its blackest part centered around the vertical green line that splits the top rectangle
  • +
  • the bottom right corner of the area covered by the top gradient is aligned with the corner just below the top rectangle
  • +
  • the bottom rectangle is overlapped by a gradient that is displaced upwards with the maximum displacement the middle indicated by the vertical green line that splits the bottom rectangle
  • +
  • no part of the bottom gradient extends outside the bottom rectangle
  • +
  • both gradients use the same gradientcolors
  • +
+
+ + $RCSfile: filters-displace-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-example-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-example-01-b.svg new file mode 100644 index 000000000..825f309b5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-example-01-b.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ A single filter that uses a combination of filter + primitives. You should see a gray rectangle that + contains a green outer ring and a green inner button + with "SVG" on it, both having a 3D appearance. +

+

+ Verify that a typical usage of filtering is operation. + This test case creates a 3D lighting effect and requires + that several filters are working: feGaussianBlur, feOffset, + feSpecularLighting, feComposite and feMerge. The graphic + consisting of the string "SVG" sitting on top of oval + filled in green and surrounded by an oval outlined in green. +

+

+ The test uses a nested 'svg' element, 'rect' element, + 'path' element, as well as basic fill (solid + colors), stroke (solid colors with stroke-width + lines), font-family (Verdana and Arial) and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image + exactly, except for possible variations in the labelling + text (per CSS2 rules). +

+
+ + $RCSfile: filters-example-01-b.svg,v $ + + + + + + + + + + + Example filters01.svg - introducing filter effects + An example which combines multiple filter primitives to produce a 3D lighting effect on a graphic consisting of the string "SVG" sitting on top of oval filled in green and surrounded by an oval outlined in green. + + + + + + + + + + + + + + SVG + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-01-b.svg new file mode 100644 index 000000000..4ad95869d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-01-b.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + +

+ Test which verifies null filters and filter regions. +

+

+ Four subtests each consist of a small red circle overdrawn with a larger green circle. + Filters are applied to three of the red circles, hiding them and showing the green circle. +

+

+ The top left subtest has no filter applied to the circle, so the green circle is visible and the red one is not. + The top right subtest applies a filter to the red circle, but there is no corresponding filter element. + Thus, a null filter is applied and the red circle is not shown, allowing the green circle to be seen. +

+

+ The bottom left subtest applies an empty filter element with the default filterRegion, and the bottom right + subtest applies an empty filter with a non-default filterRegion. In both cases where empty filters are applied, + the result of the filter is a transparent black offscreen, thus showing the green circle underneath. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are four green circles visible. +

+
+ + $RCSfile: filters-felem-01-b.svg,v $ + + + + + + + + + + + + + + + + No filter + + + + + Null filter + + + + + Non-existent filter + + + + + Null with small region filter + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-02-f.svg new file mode 100644 index 000000000..ebcdac5e0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-felem-02-f.svg @@ -0,0 +1,127 @@ + + + + + + + + + + +

+ This tests the 'primitiveUnits' attribute and how it affects other attribute values. +

+ + +

+ You should see three rectangles in a row, then a row of three circles, then a row of three stars. +

+
+ +

+ The test has passed if: +

+
    +
  • There is no red visible anywhere
  • +
  • The first row has three green rectangles
  • +
  • The second row has three black circles, and the middle one has more blurred edges than the other two.
  • +
  • The third row has three green stars.
  • +
+
+ + $RCSfile: filters-felem-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-01-b.svg new file mode 100644 index 000000000..d1cd3a5f8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-01-b.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ In the upper left corner of the output are blue and yellow rectangles that overlap, + they appear normally, no gaussianBlur has been applied. + In the upper right the same rectangles are displayed with a blur filter applied, + the standard deviation is the same for both the x and y axis. + In the lower right corner the rectangles appear again, + this time the standard deviation is different along the x (20) and y (1) axis. +

+

+ On top of the rectangles in the upper right and lower right, thin (half-pixel-wide) blue + lines are drawn to show the outline of the object bounding box (the inside lines) and the + outline of the filter region (the outside lines). The blur effect should be clipped + to the bounds of the filter region. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel and blue half-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-gauss-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-02-f.svg new file mode 100644 index 000000000..003fc59ee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-02-f.svg @@ -0,0 +1,85 @@ + + + + + + + + + + +

+ Test that when 'stdDeviation' is zero in one of X or Y the filter input image is + blurred only in the non-zero direction. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the left subtest shows a blue and yellow rectangle fused together, with blur applied only in the vertical direction
  • +
  • the right subtest shows a blue and yellow rectangle fused together, with blur applied only in the horizontal direction
  • +
  • the blurred shapes are within the blue guidelines
  • +
+
+ + $RCSfile: filters-gauss-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-03-f.svg new file mode 100644 index 000000000..ea7c54cab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-gauss-03-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ Test that when 'stdDeviation' is zero the result is a non-blurred image. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there's a green rectangle visible, and no red. +

+
+ + $RCSfile: filters-gauss-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-01-b.svg new file mode 100644 index 000000000..837850adf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-01-b.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + +

+ An image should be displayed in the middle of the view area. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image. +

+
+ + $RCSfile: filters-image-01-b.svg,v $ + + + + + + + + + + + + + + Basic test of feImage filter support. + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-02-b.svg new file mode 100644 index 000000000..ee30a7307 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-02-b.svg @@ -0,0 +1,79 @@ + + + + + + + + + + +

+ Tests the animatability of 'xlink:href' on the 'feImage' element. + The test will first show two blue images that should look exactly the same, + then after two seconds both images should simultaneously change to show two + pink images that also look exactly the same. +

+ + +

Run the test. No interaction required. + +

+
+ +

+ The test has passed if: +

+
    +
  • at first there are two identical blue images shown next to each other
  • +
  • after two seconds the two blue images are simultaneously replaced by two pink images
  • +
+
+ + $RCSfile: filters-image-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + Animation in filters + 'feImage' + 'image' + + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-03-f.svg new file mode 100644 index 000000000..d8b2b92c6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-03-f.svg @@ -0,0 +1,179 @@ + + + + + + + + + + +

+ This tests the feImage element with a number of different filter primitive subregion values. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the first row show four smiley faces of the same size, each framed by a blue rectangle
  • +
  • the first image on the left on the second row shows half a smiley face (horizontally offset)
  • +
  • the second image on the left on the second row shows half a smiley face (vertically offset)
  • +
  • the third image on the left on the second row shows the upper-lefthand quarter of the smiley face enlarged to fit the blue rectangle
  • +
  • the rightmost image on the second row shows the upper-lefthand quarter of the smiley face (horizontally and vertically offset)
  • +
+
+ + $RCSfile: filters-image-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-04-f.svg new file mode 100644 index 000000000..ab2475dc4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-04-f.svg @@ -0,0 +1,119 @@ + + + + + + + + + + + + +

+ This tests the feImage element with a number of different filter primitive subregion values. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • the first row show four smiley faces of the same size, each framed by a blue rectangle
  • +
  • the first image on the left on the second row shows half a smiley face (horizontally offset)
  • +
  • the second image on the left on the second row shows half a smiley face (vertically offset)
  • +
  • the third image on the left on the second row shows the upper-lefthand quarter of the smiley face enlarged to fit the blue rectangle
  • +
  • the rightmost image on the second row shows the upper-lefthand quarter of the smiley face (horizontally and vertically offset)
  • +
+
+ + $RCSfile: filters-image-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + primitiveUnits = "objectBoundingBox" + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-05-f.svg new file mode 100644 index 000000000..eab4872db --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-image-05-f.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + +

+ This test verifies the implementation of the preserveAspectRatio attribute on <feImage> + referencing raster content. +

+ + +

+ This test copies coords-viewattr-02-b, substituting feImage for image. + It exercises the various preserveAspectRatio values. An external bitmap + is referenced. +

+
+ +

+ The rendered picture should match the reference image exactly except for variations in the labeling text. +

+
+ + $RCSfile: filters-image-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + Test preserveAspectRatio on an feImage element. + Raster to fit + + + + Viewport 1 + + Viewport 2 + + + ---------- meet -------------------- + + xMin* + + + + + xMid* + + + + + xMax* + + + + + + ---------- meet ------------------------ + + *YMin + + + + *YMid + + + + *YMax + + + + + ---------- slice ------------------------- + + xMin* + + + + xMid* + + + + xMax* + + + + + ---------- slice --------------------- + + *YMin + + + + + *YMid + + + + + *YMax + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-01-f.svg new file mode 100644 index 000000000..eb53871a5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-01-f.svg @@ -0,0 +1,187 @@ + + + + + + + + + + + + +

+ Verify the basic operation of the different lights used in the feDiffuseLighting + and feSpecularLighting elements. The test uses the same feDiffuseLighting filter, + using different lights. +

+

+ The first row shows different settings for feDistantLight. The second row shows + different settings for fePointLight. The last row shows different settings for + feSpotLight. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered image should look approximately like the reference image, except for the last + feSpotLight test for which a reference image could not be created. The reference image may not be pixel accurate. However, the rendered image should show + at least 'similar' lighting results and bump maps. +

+
+ + $RCSfile: filters-light-01-f.svg,v $ + + + + + + + + + + Filters: feDistantLight, fePointLight, feSpotLight + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for feDistantLight azimuth and elevation + (0, 0) + (45, 0) + (0, 45) + (45, 45) + + + + + + + + Various values for fePointLight's x, y and z + (0, 0, 10) + (50, 0, 10) + (0, 30, 10) + (50, 30, 10) + + + + + + + + + + Various values for feSpotLight's x, y, z, pointsAtX, pointsAtY, pointsAtZ + (25, 0, 25) + (25, 30, 0) + (25, 30, 25) + (25, 0, 0) + np=1 + limitingConeAngle=30 + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-02-f.svg new file mode 100644 index 000000000..c5b61328e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-02-f.svg @@ -0,0 +1,97 @@ + + + + + + + + + + +

+ This test verifies that the 'azimuth' attribute is interpreted as a clockwise value in degrees. +

+

The test should show four arrows, indicating the direction of the incoming distant light. + As the four circles are lit by a specular lighting filter a faint shaded arc should appear. + The middle of each such arc should be where the corresponding arrow points.

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if the shaded arcs are displayed only on the side indicated by the arrows. +

+
+ + $RCSfile: filters-light-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 'feDistantLight' azimuth + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-03-f.svg new file mode 100644 index 000000000..65238a99f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-03-f.svg @@ -0,0 +1,124 @@ + + + + + + + + + + +

+ Test resolving of 'primitiveUnits' on the 'z' attribute of 'fePointLight'. +You should see some shapes that have a black border, three circles and three rectangles. + The fill of these shapes should look the same. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • All of the circles look identical
  • +
  • The shapes all look like they have been filled with a gradient
  • +
  • No parts of the fill extend outside the black borders
  • +
  • All of the rects look identical
  • +
  • The circles must be fully filled by the filter output, which should resemble a radial gradient with a white focal point in the lower right position (about four o'clock, as shown by the small white circles)
  • +
  • The rects must be fully filled by the filter output, which should resemble a radial gradient with a white focal point in the lower right corner.
  • +
+
+ + $RCSfile: filters-light-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + primitiveUnits="objectBoundingBox" + + + + + + + + + primitiveUnits="userSpaceOnUse" + + + + + + + + + primitiveUnits unspecified + + + + + + $Revision: 1.10 $ + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-04-f.svg new file mode 100644 index 000000000..807380cf8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-04-f.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + +

+ Test various values for limitingConeAngle in feSpotLight. +

+

+ There should be four rects in two rows. Each of the rects has a different filter applied, + and each of those filters uses different values for limitingConeAngle. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered image should look approximately like the reference image, and the third rectangle from the left + in each row must be animated. +

+
+ + $RCSfile: filters-light-04-f.svg,v $ + + + + + + + + + + feSpotLight's limitingConeAngle + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 30 + 20 + Animated (0..50) + 5 + + -30 + -20 + Animated (0..-50) + -5 + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-05-f.svg new file mode 100644 index 000000000..339837efe --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-light-05-f.svg @@ -0,0 +1,252 @@ + + + + + + + + + + +

+ This test verifies that the 'elevation' attribute is interpreted as a + complementary value to the z-axis in degrees. +

+

+ The test shows four different elevation angles that can be used for feDistantLight source. + The four different feDistantLight light sources are used in three different filter cases; feDiffuseLight, feSpecularLight + and feMerge which merges both feDiffuseLight and feSpecularLight to form a single filter. Using four different elevation values + in three different filter cases gives twelve different filters. All twelve filter cases are applied to a vector graphic and + then to a raster graphic. The vector graphic results are shown to the left and the raster graphic results are shown to the right. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if +

+
    +
  • The top row has from left to right for a single graphic set: +
      +
    • A green square with a black circle inside of it
    • +
    • A black square
    • +
    • A black square with a green semicircle inside the lefthand side of the rect
    • +
    • A black square with a green semicircle inside the righthand side of the rect
    • +
    +
  • +
  • The middle row has from left to right for a single graphic set: +
      +
    • A green square with a white circle inside of it
    • +
    • A green semicircle pointing to the right on top of a white background
    • +
    • A green square with a white crest inside pointing to the right
    • +
    • A green square with a white crest inside pointing to the left
    • +
    +
  • +
  • The bottom row has from left to right for a single graphic set: +
      +
    • A green square with a black circle inside of it
    • +
    • A black square with a green semicircle inside pointing to the right
    • +
    • A green square with a circle inside that has a shadow on the righthand side and a reflection on the lefthand side
    • +
    • A green square with a circle inside that has a shadow on the lefthand side and a reflection on the righthand side
    • +
    +
  • +
+

+ If the test shows any red, the test has failed. +

+
+ + $RCSfile: filters-light-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feDiffuseLight using feDistantLight source + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + feSpecularLight using feDistantLight source + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + feDiffuseLight and feSpecularLight using feDistantLight + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + + + + + 90 deg + 270 deg + 180 deg + 0 deg + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-morph-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-morph-01-f.svg new file mode 100644 index 000000000..af9a6b02f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-morph-01-f.svg @@ -0,0 +1,103 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of feMorphology. +

+

+ The test shows the same graphics filtered with four different feMorphology + settings. The top two have the type erode and a radius of 1(left) and 2(right). + The bottom two have the type dilate and a radius of 1(left) and 3(right). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-morph-01-f.svg,v $ + + + + + + + + + Filter Effect: feMorphology + + + + + + + + + + + + + + + + + + + + + + + + + + + + + type=erode radius=1 + + + + type=erode radius=2 + + + + type=dilate radius=1 + + + + type=dilate radius=3 + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-01-b.svg new file mode 100644 index 000000000..d00ad44a6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-01-b.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ The target crosshairs should align with + lower left bounds of the associated circle. + The color of each crosshair should match + the associated circle. +

+

+ Verify the basic capability to handle the feOffset, feMerge and + feFlood filter nodes. Four copies of a filled circle should appear at + various offsets and colors. For each circle a reference crosshair is + drawn at the lower left of the circle to indicate the expected color, + opacity and position for the filtered element. The targets are drawn + with the standard svg path element. +

+

+ In addition to feFlood, feMerge, and feOffset, this test uses + 'feComposite' to recolor the SourceGraphic with the feFlood color. + The source graphic uses 'circle'. The target cross hairs are drawn + with 'path' and use 'fill' and 'fill-opacity'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered image should match the reference image. Additionally, the + target crosshairs should match the color, lower left corner, and + opacity of each copy of the filtered circle. +

+
+ + $RCSfile: filters-offset-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-02-b.svg new file mode 100644 index 000000000..bb933b9e2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-offset-02-b.svg @@ -0,0 +1,83 @@ + + + + + + + + + + +

+ Tests primitiveUnits="objectBoundingBox" and relative values. +There should be three green rectangles with thick black stroke. +

+ + +

Run the test. No interaction required. + +

+
+ +

+ The test has passed if there is nothing red visible and there are three + green rectangles with black stroke. If any green is visible outside the + black stroked rectangles the test has failed. +

+
+ + $RCSfile: filters-offset-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-01-b.svg new file mode 100644 index 000000000..c5b9621c6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-01-b.svg @@ -0,0 +1,165 @@ + + + + + + + + + + + + +

The purpose of this file is to test the 'in' attribute on filter primitives.

+ + +

+ Run the test. No interaction required. +

+
+ +

+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly. +

+
    +
  1. The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).
  2. +
  3. The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).
  4. +
  5. The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).
  6. +
  7. The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).
  8. +
  9. The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blue rectangle with blurred edges.
  10. +
  11. The size of the blue rectangles are bigger than the blurred circles.
  12. +
+
+ + $RCSfile: filters-overview-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-02-b.svg new file mode 100644 index 000000000..89f48d75c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-02-b.svg @@ -0,0 +1,178 @@ + + + + + + + + + + + + +

+ The purpose of this file is to test the 'in' attribute on filter primitives. + This test is the same as filters-overview-01-b.svg but uses gradients with gradientUnits="userSpaceOnUse" instead for the + FillPaint/StrokePaint. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly. +

+
    +
  1. The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).
  2. +
  3. The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).
  4. +
  5. The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).
  6. +
  7. The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).
  8. +
  9. The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blurred gradiant (blue/white/red/yellow).
  10. +
  11. The size of the gradients are bigger than the blurred circles.
  12. +
+
+ + $RCSfile: filters-overview-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-03-b.svg new file mode 100644 index 000000000..c5688b3a8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-overview-03-b.svg @@ -0,0 +1,166 @@ + + + + + + + + + + + + + +

The purpose of this file is to test the 'in' attribute on filter primitives.

+ + +

+ Run the test. No interaction required. +

+
+ +

+ To pass this test, the UA must render all 6 cases (SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint, StrokePaint) correctly. +

+
    +
  1. The result for in="SourceGraphic" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (red/green/blue with dashed stroke).
  2. +
  3. The result for in="SourceAlpha" is a non blurred vertical rectangle (green with dashed stroke) overlayed with three blurred circles (dark gray with dashed stroke).
  4. +
  5. The result for in="BackgroundImage" is a blurred vertical rectangle (green with dashed stroke).
  6. +
  7. The result for in="BackgroundAlpha" is blurred vertical rectangle (dark gray with dashed stroke).
  8. +
  9. The results for in="FillPaint" and in="StrokePaint" are the same. They consists of a non blurred vertical rectangle (green with dashed stroke) overlayed with a blurred gradiant (blue/white/red/yellow).
  10. +
  11. The size of the gradients are bigger than the blurred circles.
  12. +
+
+ + $RCSfile: filters-overview-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SourceAlpha + + =========================================================================================== + + + + + + + + SourceGraphic + + =========================================================================================== + + + + + + + + BackgroundAlpha + + =========================================================================================== + + + + + + + + BackgroundImage + + =========================================================================================== + + + + + + + + FillPaint + + =========================================================================================== + + + + + + + + StrokePaint + + + + Filter input test + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-specular-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-specular-01-f.svg new file mode 100644 index 000000000..a49e4b3bd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-specular-01-f.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + +

+ Verify the basic operation of the feSpecularLighting element. The test shows + four rows of 3 images. Each row tests a different aspect of the filter and + shows the result of the filtering operation. +

+

+ The first row shows the result of varying the surfaceScale attribute. The second + row shows the result of varying the specular constant (ks) attribute. The third + row shows the result of varying the specular exponent (np) attribute. The last + row shows the result of varying the lighting-color property. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image. +

+
+ + $RCSfile: filters-specular-01-f.svg,v $ + + + + + + + + + + Filters: feSpecularLighting + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Various values for surfaceScale: 1, 10 and -10 + + + + + + + + + + + + Various values for specularConstants: 0, 1 and 2 + + + + + + + + + + + + Various values for specularExponents: 1, 2 and 4 + + + + + + + + + + + + Various values for lighting color: red, yellow and blue + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-tile-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-tile-01-b.svg new file mode 100644 index 000000000..df49b53aa --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-tile-01-b.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+ The test case constructs a filter that uses feTile to tile the entire specified filter region. + The tile consists of a green rectangle over a larger transparent rectangle. + The green rectangle is created with feFlood and feOffset. There is also a semi-transparent + blue rectangle that should exactly cover one of the tiled rectangles, creating a purple + tile with a black stroke (4 tiles down and 3 across). +

+

+ The test uses the 'rect' element, feTile, feFlood, feOffset, feMerge, fill style, stroke, + font-family and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible variations + in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-tile-01-b.svg,v $ + + + + + + + + + feTile filter test: a tiled pattern + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-01-f.svg new file mode 100644 index 000000000..9d0ef617b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-01-f.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + +

+ Test which verifies the basic facilities of feTurbulence. Six rectangular areas showing the + effects of various parameter settings for feTurbulence. The sample image indicates the + parameter settings to produce the given image. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible variations + in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: filters-turb-01-f.svg,v $ + + + + + + + + + Six rectangular areas showing the effects of various parameter settings for feTurbulence. + + + + + + + + + + + + + + + + + + + + + + + type=turbulence + baseFrequency=0.05 + numOctaves=2 + + type=turbulence + baseFrequency=0.1 + numOctaves=2 + + type=turbulence + baseFrequency=0.05 + numOctaves=8 + + type=fractalNoise + baseFrequency=0.1 + numOctaves=4 + + type=fractalNoise + baseFrequency=0.4 + numOctaves=4 + + type=fractalNoise + baseFrequency=0.1 + numOctaves=1 + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-02-f.svg new file mode 100644 index 000000000..779bacc77 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/filters-turb-02-f.svg @@ -0,0 +1,147 @@ + + + + + + + + + + +

+ This tests the 'seed' attribute on 'feTurbulence'. +

+ + +

+ Run the test. No interaction required. + +

+
+ +

You should see three rectangles with black stroke. In each of these rectangles there should be + a series of numbers indicating the value for 'seed' that was used on the small rectangle + directly above the number. The top stroked rectangle should contain 7 smaller rects that all + have a different filter applied to them, the lower two rectangles should contain 2 smaller rects + each. The filtered rectangles in each stroked rectangle should all look exactly the same. + If the filtered rectangles are red, that indicates that the test has failed. +

+

+ The test has passed if: +

+
    +
  • the top stroked rectangle contains 7 smaller rectangles that are all identical
  • +
  • the lower left stroked rectangle contains 2 smaller rectangles that are identical
  • +
  • the lower right stroked rectangle contains 2 smaller rectangles that are identical
  • +
  • there's no red visible inside the stroked rectangles
  • +
+
+ + $RCSfile: filters-turb-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + feTurbulence seed + + + + -0.8 + + -0.5 + + -0.2 + + 0 + + 0.2 + + 0.5 + + 1.5 + + + + -1 + + -1.5 + + + + -2 + + -2.6 + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-01-t.svg new file mode 100644 index 000000000..e5e4c73ef --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-01-t.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + +

+ This tests case show the behaviour of CSS font matching + based on the font-size attribute. +

+ + + +

+ Run the test. No interaction required. +

+
+ +

+ The most correct output is + two squares, the exact match of the size, but as these are + vector fonts, and therefore scalable, the user agent can + use a margin of error, so conformant results may vary. +

+
+ + $RCSfile: fonts-desc-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + + $Revision: 1.6 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-02-t.svg new file mode 100644 index 000000000..7bd720b5c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-02-t.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + +

+ This tests the behaviour of CSS font matching based on font-variant attribute. +

+

+ The first line of text tests that the small-caps font is used for the second text element. +

+

+ The second line of text tests that the order of font specification does not effect the selection + of these fonts. +

+

+ The third line of text tests that the correct font is selected when a font in the list does not support + the variant required. Note that the fonts provide no x-height so scaling + (allowed by CSS) cannot be used to simulate a small cap from a regular font. +

+

+ The last line tests if small-caps are synthesized. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The first line of text should be 'square' 'triangle'. +

+

+ The second line of text should be 'square' 'triangle'. +

+

+ The third line of text should be 'square', 'diamond', 'square', 'diamond'. + Note that the fonts provide no x-height so scaling + (allowed by CSS) cannot be used to simulate a small cap from a regular font. +

+

+ The last line of test can be 'square', 'a', 'a' (from a fallback font), + 'diamond'. The first 'a' + can be replaced with a smallcaps 'A', if there is a smallcaps font installed + or if synthesis is supported. +

+
+ + $RCSfile: fonts-desc-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + a + a + + + a + a + a + a + + + a + a + a + a + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-03-t.svg new file mode 100644 index 000000000..d6de08d04 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-03-t.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + +

+ This test demonstrates CSS font matching based on the + font-weight attribute. +

+

+ The first line tests selecting a bold font. +

+

+ The second line tests that order of font definition does not + effect selection. +

+

+ The last line tests basic font-weight selection using + font-weight numbers. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The first line should show a square and then a triangle. +

+

+ The second line should show a triangle and then a square. +

+

+ The last line should show a square then a triangle. +

+
+ + $RCSfile: fonts-desc-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + a + a + + a + a + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-04-t.svg new file mode 100644 index 000000000..fb77128d2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-04-t.svg @@ -0,0 +1,154 @@ + + + + + + + + + + + + +

+ This test demonstrates CSS font matching based on the + font-style attribute. +

+

+ The first line of text tests selecting an italic font. +

+

+ The second line tests that order of font definition + does not effect correct matching. +

+

+ The third line tests selecting an italic and an oblique font. + Italic can match against oblique or italic, but all other values must match exactly. + The letter 'a' will be an UA-dependent default font-family, + it should be oblique, possiblely a transformation of a + normal font. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The first line of text should produce a square followed + by a triangle. +

+

+ The second line should produce a square followed + by a triangle. +

+

+ The third line should produce in first place + either a triangle, a diamond, or a letter 'a' in some fallback font. + (All are correct,and depend on which font is chosen for fallback). + This is followed by two diamonds. +

+
+ + $RCSfile: fonts-desc-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + + + a + a + + + a + a + a + + + + $Revision: 1.7 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-05-t.svg new file mode 100644 index 000000000..41cff386f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-desc-05-t.svg @@ -0,0 +1,136 @@ + + + + + + + + + + + + +

+ This tests a combination of font attribute matching. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The correct result for the first line is diamond, diamond, upward-triangle, + downard-triangle. The correct result for the second line is + upward-triangle, downard triangle, and a right-triangle. +

+

+ Reasoning for glyphs on the first line: + The first character is a diamond because it is matched purely + on the font-style attribute. The second character is a diamond + because font-style (italic) is of highest precedence, followed + by font-variant (normal), then font-weight (bold). The third + character matches upward-triangle because again font-variant + (small-caps) is a higher precedence than font-weight. The + fourth character undisputedly matches the downward-triangle. +

+

+ Reasoning for the glyphs on the second line: + The first character is a upward-triangle because the font + matching must fall back to SVGFont1 to get a match + for small-caps. The second character is a downward-triangle + because there is no match for small-caps in SVGFont2. + The third character is a right facing triangle because + italic should match oblique in SVGFont2. +

+
+ + $RCSfile: fonts-desc-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + a + a + a + a + + + a + a + a + + + + $Revision: 1.7 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-01-t.svg new file mode 100644 index 000000000..9ff421cf6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-01-t.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ This is a basic test for embedded SVG fonts. The font "Comic Sans" + (available from Microsoft) has been converted into an SVG font and embedded + in the SVG file. The test contains two text areas, each with the character + string "AyÖ@ç" drawn at the same font size. +

+

+ The upper area contains the glyphs from the embedded font placed in + the SVG file as path elements. Each glyph is placed at the location it + would be if rendered using normal text rendering (ie. the horizontal + advance between characters has been preserved). +

+

+ The lower area contains the text string rendered using the embedded + SVG font. It should appear exactly the same as the upper text area, + ie. font size, character baseline and horizontal advance should be + the same. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passes if the string "AyÖ@ç" is visible and fontsize, + character baseline and horizontal advances are the same on both lines, + as shown in the reference image. +

+
+ + $RCSfile: fonts-elem-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + Basic SVG font element + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-02-t.svg new file mode 100644 index 000000000..7a8e34767 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-02-t.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + +

+ This is an accuracy test for embedded SVG fonts. The font "Comic Sans" + (available from Microsoft) has been converted into an SVG font and embedded + in the SVG file. The test contains two text areas, each with the character + string "AyÖ@ç" drawn at the same font size. +

+

+ The upper area has the placed glyphs as path elements filled with + white over a solid black background (creating a white cutout). The + embedded SVG font text is then drawn over the cutout. +

+

+ The lower area is the reverse of the upper area, with the placed + black glyphs filling the cutout created by white SVG font text. + An implementation that passes this test should completely fill the + cutout, leaving a solid black area (some slight antialiasing effects + may remain). +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed iff the black text exactly overlays the white text + on black, giving a solid black area. Some slight antialiasing effects may + remain and do not cause the test to fail. +

+
+ + $RCSfile: fonts-elem-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + SVG font element accuracy + + SVG over Glyphs + + + + + + + + + + + + + + + + + + + AyÖ@ç + + Glyphs over SVG + + AyÖ@ç + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-03-b.svg new file mode 100644 index 000000000..6d7306705 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-03-b.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + +

+ This is a basic test for external SVG fonts. The font "Comic Sans" + (available from Microsoft) has been converted into an SVG font and placed + in an external SVG file referenced by a font-face-src element. + The test contains two text areas, each with the character + string "AyÖ@ç" drawn at the same font size. +

+

+ The upper area contains the glyphs from the font placed in + the SVG file as path elements. Each glyph is placed at the location it + would be if rendered using normal text rendering (ie. the horizontal + advance between characters has been preserved). +

+

+ The lower area contains the text string rendered using the external + SVG font. It should appear exactly the same as the upper text area, + ie. font size, character baseline and horizontal advance should be + the same. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if the upper and lower lines show the same glyphs with + the same glyph positioing and inter-glyph spacing. +

+
+ + $RCSfile: fonts-elem-03-b.svg,v $ + + + + + + + + + + + + + + + + + External SVG font element (xml) + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-04-b.svg new file mode 100644 index 000000000..07362e512 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-04-b.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + +

+ This is a basic test for external SVG fonts. The font "Comic Sans" + (available from Microsoft) has been converted into an SVG font and placed + in an external SVG file referenced by a CSS stylesheet with an @font-face rule. + The test contains two text areas, each with the character + string "AyÖ@ç" drawn at the same font size. +

+

+ The upper area contains the glyphs from the font placed in + the SVG file as path elements. Each glyph is placed at the location it + would be if rendered using normal text rendering (ie. the horizontal + advance between characters has been preserved). +

+

+ The lower area contains the text string rendered using the external + SVG font. It should appear exactly the same as the upper text area, + ie. font size, character baseline and horizontal advance should be + the same. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if the upper and lower lines show the same glyphs with + the same glyph positioing and inter-glyph spacing. +

+
+ + $RCSfile: fonts-elem-04-b.svg,v $ + + + + + + + + + + + + + External SVG font element (css) + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-05-t.svg new file mode 100644 index 000000000..7460c158c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-05-t.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + +

+ This tests the horiz-origin-x attributes on the font and glyph elements. +

+ + +

Run the test. No interaction required. +

+
+ +

+ There are three subtests. The test is passed if for each subtest there is labelling text on the left and on the right, a series of black squares whose lower-left corner aligns with the centre of the corresponding small, pale blue square as shown in the reference graphic. +

+
+ + $RCSfile: fonts-elem-05-t.svg,v $ + + + + + + + + + <font> horiz-origin-x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horiz-origin-x unspecified (0) + + + + + 1234 + + + + horiz-origin-x=500 + + + + + 1234 + + + + + horiz-adv-x=1000 but ignored + + + + + 1234 + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-06-t.svg new file mode 100644 index 000000000..a6116e1ee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-06-t.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + +

+ This test validates that the font element's horiz-adv-x is used as + the default glyph's advance when there is no glyph advance specified. + All fonts have a units-per-em of 1000. +

+

+ The first row shows a layout with a default advance of 1000. + Glyphs have no advance so the 1000 default should be used. +

+

+ The second row shows a layout with a default advance of 2000. + Glyphs have no advance so the 2000 default should be used. +

+

+ The last row shows a layout with a default advance of 0. + Glyphs have a specified advance so the 0 default should be ignored. +

+

+ Blue reference markers show the expected glyph positions. +

+ + +

Run the test. No interaction required. +

+
+ +

+ There are three subtests. The test is passed if for each subtest there is labelling text on the left and on the right, a series of black squares whose lower-left corner aligns with the centre of the corresponding small, pale blue square as shown in the reference graphic. +

+
+ + $RCSfile: fonts-elem-06-t.svg,v $ + + + + + + + + + <font> horiz-adv-x + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horiz-adv-x=1000 + + + 12 + + + + horiz-adv-x=2000 + + + 12 + + + + + horiz-adv-x=1000 but ignored + + + 12 + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-07-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-07-b.svg new file mode 100644 index 000000000..f9167aeb3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-elem-07-b.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + +

+ This is a basic test for embedded SVG fonts. The font "Comic Sans" + (available from Microsoft) has been converted into an SVG font and embedded + in the SVG file. The test contains two text areas, each with the character + string "AyÖ@ç" drawn at the same font size. +

+

+ The upper area contains the glyphs from the embedded font placed in + the SVG file as path elements. Each glyph is placed at the location it + would be if rendered using normal text rendering (ie. the horizontal + advance between characters has been preserved). +

+

+ The lower area contains the text string rendered using the embedded + SVG font, referenced with a CSS @font-face declaration. The SVG font does not have a font-family attribute, so the reference is via the @font-face block which points to a font element by ID. It should appear + exactly the same as the upper text area, + ie. font size, character baseline and horizontal advance should be + the same. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passes if the string "AyÖ@ç" is visible and fontsize, + character baseline and horizontal advances are the same on both lines, + as shown in the reference image. +

+
+ + $RCSfile: fonts-elem-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic SVG font element + + + + + Placed Glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + SVG Font + + + AyÖ@ç + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-02-t.svg new file mode 100644 index 000000000..68ce4fa73 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-02-t.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ The first subtest tests the arabic-form attribute on the glyph element, + the second subtest is the same, but with glyphs for the letter khah. + It should match the reference image. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The first subtest must produce a + 'downward triangle', a 'space', a 'square', a 'diamond' + and then an 'upward triangle' in this order. Remembering + that arabic text is right to left. +

+

The second subtest must produce the isolated, initial, medial, final and + glyphs of the letter khah. Again in the writing direction, from right to left. +

+
+ + $RCSfile: fonts-glyph-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ښ ښښښ + + + + خ خخخ + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-03-t.svg new file mode 100644 index 000000000..e7bcc10b1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-03-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

ISSUE: http://www.w3.org/2011/02/27-svg-irc#T22-20-51 - unapprove test for now

+

+ This files tests the lang attribute support of the glyph + element. The test should produce an upward-triangle for + the first (en) test element and a square for the second (fr) + and third (fr-ca) text element. In the third case, a glyph for + fr is also suitable for a more specific language text fr-ca. + In the fourth case, no suitable language specific or general + glyph is provided by the test so a fallback font for the letter + 'a' should be used. A triangle or square must not be + displayed in the fourth case. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if, from top to bottom, you see an upward pointing triangle, then two squares, and finally the letter "a". +

+
+ + $RCSfile: fonts-glyph-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + a + + a + + a + + a + + + + $Revision: 1.6 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-04-t.svg new file mode 100644 index 000000000..498244b84 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-glyph-04-t.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + +

+ This tests that glyph selection is done in the + order in the definition of the font element. + The first line of text should be represented by + two triangles and an 'l'. The second line should + be represented by a square. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if on the first line you see two upward pointed triangles + followed by the letter "l". On the second line, a single square. +

+
+ + $RCSfile: fonts-glyph-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + ffl + ffl + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-kern-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-kern-01-t.svg new file mode 100644 index 000000000..0b52ff662 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-kern-01-t.svg @@ -0,0 +1,293 @@ + + + + + + + + + + + + +

+ This test validates handling of the hkern element. +

+

+ In all instances, a text element matching a font with hkern + is displayed along with reference markers showing the expected + glyph positioning. +

+

+ The 'fontA' cell shows the string "12" with "fontA" for which there + in a kerning pair defined with u1="1" and u2="2". +

+

+ The 'fontB' cell shows the string "12" with "fontB" for which there + in a kerning pair defined with g1="gl_1" and g2="gl_2", + where "gl_1" has unicode="1" and "gl_2" has unicode="2". +

+

+ The 'fontC' cell shows the string "1234" with "fontC" were the same kerning pair + uses u1/u2 to match "12" and g1/g2 to match "34". +

+

+ The 'fontD' cell shows the string "1234" with "fontD" were the same kerning pair + uses u1/u2 to match "12" and "34" (u1/u2 are lists of character vales). +

+

+ The 'fontE' cell shows the string "1234" with "fontE" were the same kerning pair + uses g1/g2 to match "12" and "34" (g1/g2 are lists of names). +

+

+ The 'fontF' cell shows the string "1234" with "fontF" were the same kerning pair + uses u1/u2 to match "12" and "34" (u1/u2 are unicode ranges). +

+

+ The 'fontG' cell shows the string "12" with "fontG" were for which there + is a kerning pair with u1 matching "1" and g2 matching "gl_2". +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if for each of the seven subtests there is a series of black squares whose lower-left corner aligns with the centre of the corresponding small, red square as shown in the reference graphic. +

+
+ + $RCSfile: fonts-kern-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <hkern> + + + + + font A + + + u1="1" u2="2" + + + + + + + + + 12 + + + + + + + font B + + + g1="gl_1" g2="gl_2" + + + + 12 + + + + + + + font C + + + u1="1" u2="2" g1="gl_3" g2="gl_4" + + + + + + + + 1234 + + + + + + + font D + + + u1="1,3" u2="2,4" + + + + + + 1234 + + + + + + + font E + + + g1="gl_1,gl_3" g2="gl_2,gl_4" + + + + + + 1234 + + + + + + + font F + + + u1="U+003?" u2="U+0031-34" + + + + + + + + + 1234 + + + + + + + font G + + + u1="1" g2="gl_2" + + + + + + + + + 12 + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-overview-201-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-overview-201-t.svg new file mode 100644 index 000000000..65de3f474 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/fonts-overview-201-t.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + +

+ This tests a range of values for the 'units per em' attribute. +

+

+ The same glyph is defined three times in three fonts, but with different values + for units-per-em - 1,000, 10, and 10,000 - and with the other numerical values + that depend on units-per-em scaled accordingly. Text using these fonts must all be displayed at the same size, + because the same font-size is used throughout. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the three letter β are all the same size. +

+
+ + $RCSfile: fonts-overview-201-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + β + β + β + + 1,000 + 10 + 10,000 + varying units-per-em values + + + $Revision: 1.2 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/imp-path-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/imp-path-01-f.svg new file mode 100644 index 000000000..1cae43261 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/imp-path-01-f.svg @@ -0,0 +1,54 @@ + + + + + + + + + + +

+ Tests that markers are drawn on zero-length 'path' and 'line' segments. +

+ + +

Run the test. No interaction required.

+
+ +

+ Test passes if there are two blue boxes, positioned as in the reference image. +

+
+ + $RCSfile: imp-path-01-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-cursor-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-cursor-01-f.svg new file mode 100644 index 000000000..ff7d71650 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-cursor-01-f.svg @@ -0,0 +1,158 @@ + + + + + + + + + + + + +

+ Purpose of test is to determine if the cursor property and cursor element are + supported. +

+ + +

+ This test requires user interaction. Firstly, the default cursor behaviour should be examined. + Move the cursor to the top left corner, in the white area. This is the default + cursor. Now move the cursor over the text at the top of the example. The cursor + changes to the text cursor. Lastly, move the cursor to the blue link + text - the cursor changes to the pointer cursor. +

+

+ Now, move the cursor in turn to each of the gray rectangles (but not on top + of the white text label text). From top to bottom in the first row, the cursor + should change to: +

+

+ A crosshair or other 'accurate positioning' cursor + The 'default' cursor, as noted above + The 'pointer' cursor, as noted above + A cursor indicating movement, such as panning +

+

Now from top to bottom in the second row, the cursor should change to:

+

+ The 'text' cursor, as noted above + A 'wait' cursor + A 'help' cursor + A special cursor which looks like a small magnifying glass. This is a downloaded image cursor. + +

+

+ Moving to the bottom-leftmost of the eight red triangles, and moving around them clockwise, the + cursor should change to: +

+

+ SouthEast-resize, South-resize, SouthWest resize, West-resize, + NorthWest-resize, North-resize, NorthEast-resize, East-resize. +

+

+ Lastly, move the cursor to the target in the bottom-right of the test. The cursor must not + change to the 'pointer' cursor, but instead to the custom magnifying glass cursor as noted + above. +

+
+ +

+ The test is passed if, at each position, the cursor changes as described in the operator script. +

+
+ + $RCSfile: interact-cursor-01-f.svg,v $ + + + + + + + + + + + + + Text Cursor + Pointer Cursor + + + + + + + + + + crosshair + + + + default + + + + pointer + + + + move + + + + text + + + + wait + + + + help + + + + <url> + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-dom-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-dom-01-b.svg new file mode 100644 index 000000000..907cc20bc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-dom-01-b.svg @@ -0,0 +1,133 @@ + + + + + + + + + + + + +

+ Verify basic support for DOM event listener registration. The root svg element + has an onload handler where a click event listener is registered on group element 'Start Button'. +

+

+ If UI events listener registration is supported (and UI events), + when the user clicks on the button a text node is inserted reading "Event Listeners supported". +

+

+ At the end of the test, the start test button is changed to green, + and the click event listener is removed from the the start button. +

+

+ Subsequent clicks on the start button should cause no effect if + the event listener has been removed successfully. + If additional lines of text appear in the document that say "Event Listeners supported", + then the implementation has not successfully removed the event listener. +

+ + +

This test requires user interaction. Run the test, then click on the grey rectangle. + If it turns green, click it again. +

+
+ +

+ After clicking once on the button, the rectangle should have a green fill + and the text "Event listeners supported" should appear, once. + +

+
+ + $RCSfile: interact-dom-01-b.svg,v $ + + + + + + + + + + + + + + + + + Start Test + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-01-b.svg new file mode 100644 index 000000000..e31961e34 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-01-b.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + +

+ Test 'onload' event attribute. +

+

+ Six blue rectangles have been defined, each initially defined with + 'visibility:hidden'. 'onload' event attributes are assigned in + a variety of ways, usually to set 'visibility:visible'. + The red text indicates the correct behavior + (whether a given rectangle should appear in the visual result). +

+

+ The first rectangle has no associated 'onload' event so it remains invisible. + The second rectangle has an 'onload' event on itself, which invokes a script + which sets 'visibility:visible', so it should appear. + The third rectangle has an 'onload' event on its parent 'g', which invokes a script + which sets 'visibility:visible' on the rectangle, so it should appear. + The fourth rectangle has an 'onload' event on an ancestor 'svg', which invokes a script + which sets 'visibility:visible' on the rectangle, so it should appear. + The fifth rectangle has an 'onload' event both itself and its parent 'g'. + The rectangle's script sets 'visibility:visible' on the rectangle + but the parent's script sets 'visibility:hidden' on the rectangle, + which should happen afterwards, so the rectangle should not appear. + The sixth rectangle has an 'onload' event on the outermost 'svg', which invokes a script + which sets 'visibility:visible' on the rectangle, so it should appear. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if blue squares are visible for subtests 2, 3, 4 and 6 (only) +

+
+ + $RCSfile: interact-events-01-b.svg,v $ + + + + + + + + + + + + + 'onload' event attribute. + + + + + 1: No + + + + 2: Yes + + + + + + 3: Yes + + + + + + 4: Yes + + + + + + 5: No + + + + 6: Yes + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-02-b.svg new file mode 100644 index 000000000..60e377cc7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-02-b.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +

+ This tests that the SVGLoad event does not bubble. +

+

+ After loading the tests, two rectangles are displayed. + The left rectangle indicates whether the SVGLoad event + dispatched to the root 'svg' element did not bubble + and the right rectangle indicates whether the SVGLoad + event dispatched to an 'image' element did not bubble. + Each rectangle is red if the sub-test failed or green + if it passed. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test is passed if both rectangles are green + once the document has loaded. +

+
+ + $RCSfile: interact-events-02-b.svg,v $ + + + + + + + + + + Testing that SVGLoad does not bubble + + + + + On root <svg> + On an <image> + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-202-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-202-f.svg new file mode 100644 index 000000000..61ed1c017 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-202-f.svg @@ -0,0 +1,83 @@ + + + + + + + + + + +

+ Testing event bubbling through 'use' element. +

+ + +

+ Mouseover the blue rect, then the green rect and then away from the rects. +

+
+ +

+ Moving the mouse over the blue rect should make a yellow rect visible underneath it. + Moving the mouse over the green rect should make a purple rect visible underneath it. + Moving the mouse away from the blue/green rect should hide the rect underneath it again. +

+
+ + $RCSfile: interact-events-202-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-203-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-203-t.svg new file mode 100644 index 000000000..6b3f94492 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-events-203-t.svg @@ -0,0 +1,109 @@ + + + + + + + + + + +

Tests 'mouseover' event on SVGElementInstance

+

+ What each case tests is as follows. + Case 1: mouseover event on SVGElementInstance. Referenceing an element that contains an event. + Case 2: mouseover event on referencing element. Event bubbling from SVGElementInstance to referencing element. + Case 3: mouseover event on parent of referencing element. Event bubbling from SVGElementInstance to referencing element ancestors. + Case 4: mousedown event on referencing element. SVGElementInstance is not effected by event listener on referencing element. +

+ + +

+ Mouseover each of the red rectangles, and then click on the bottommost rectangle. +

+
+ +

+ This test contains four cases. The cases must produce the following results for the test to pass. +

+
    +
  • Case 1: On a mouseover event on the top square, all four squares must turn blue.
  • +
  • Case 2: On a mouseover event on the top middle square, all four squares must turn blue and a black stroke + must appear on the referencing square (element).
  • +
  • Case 3: On a mouseover event on the bottom middle square, all four squares must turn blue and a black + stroke must appear on the referencing square (element).
  • +
  • Case 4: On a mouseover event on the bottom square, all four squares must turn blue, and on a mousedown event + a black stroke must appear on the referencing square (element).
  • +
+
+ + $RCSfile: interact-events-203-t.svg,v $ + + + + + + + + + + + + + + + Shadow tree event listener chain + + + + Case 1: on mouseover all squares must turn blue + + + + + + + + Case 2: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + + + Case 3: on mouseover all squares must turn blue + and a black stroke must appear on reference square + + + + + + + + Case 4: on mouseover all squares must turn blue + and on mousedown a black stroke must appear on reference square + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-01-b.svg new file mode 100644 index 000000000..c552a9609 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-01-b.svg @@ -0,0 +1,105 @@ + + + + + + + + + + + + +

+ Test event bubbling of event attributes, part a. +

+

+ The two circles test whether event bubbling is occurring + to parents of the target object, and whether the target object + is able to prevent bubbling. The supplemental text next to + the circles describes what should occur. +

+ + +

This test requires user interaction. Firstly, move the pointer + over the top circle. Then, move it over the bottom circle.

+
+ +

+ The test is passed if two black circles are displayed. The top circle +must turn pink when the pointer is over the circle, and go back to black once +the pointer leaves. The second circle must turn blue when the pointer is over +the circle, and go back to black once the pointer leaves. +

+
+ + $RCSfile: interact-order-01-b.svg,v $ + + + + + + + + + + + + Event bubbling - a + + + + + + + + + + + + Pointer in circle, + + + circle turns pink + + + Pointer in circle, + + + circle turns blue + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-02-b.svg new file mode 100644 index 000000000..175a739c9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-02-b.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + +

+ Test event bubbling of event attributes, part b. +

+

+ The two circles test whether events are handled in the + proper order. Events listeners and event attributes are processed + before hyperlink processing, which is processed before text selection. + +

+ + +

Click on the first circle, then the second, and lastly the new third circle.

+
+ +

+ Clicking on the first circle should change the circle from black to red. Clicking + on the second circle should take you to another SVG file titled "Hyperlink target for + interact-order-02.svg. Cliking on the circle in this SVG file should return you to the orginal + two circles. +

+
+ + $RCSfile: interact-order-02-b.svg,v $ + + + + + + + + + + + + Event bubbling - b + + + + + + + + + + + + + Click on circle, + + + circle turns red + + + Click on circle, + + + hyperlink + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-03-b.svg new file mode 100644 index 000000000..da13af3e8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-order-03-b.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + +

+ Test event bubbling of event attributes, part c. +

+

+ The three strings tests event handling behavior on text. + Text selection only is available after event listeners and event + attributes have been processed, and after hyperlink processing + has occurred. +

+ + +

+ First, click the string on the first line; then the second. Lastly, all text should be selectable. +

+
+ +

+ The supplemental text below the text strings describes what should occur. +

+
+ + $RCSfile: interact-order-03-b.svg,v $ + + + + + + + + + + + + Event bubbling - c + + + + + + + + String turns red on click + + + + String hyperlinks to + + + interact-order-03b-targ.svg + + + + All strings are selectable. + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-01-b.svg new file mode 100644 index 000000000..75c11e92b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-01-b.svg @@ -0,0 +1,197 @@ + + + + + + + + + + + + +

+ This test tests 'pointer-events' on text. Initially you should see four big rects with black stroke. + In the uppermost rect there should be 10 'O':s with black fill. + In the second rect from the top there should be 10 'O':s with no fill but with black stroke. + In the third and fourth rects there should be no visible 'O':s at all. + In the fourth rect there should be two green rects, and in each of the other three rects there should be one green rect. +

+

+ For UA debugging purposes it's possible to click the "Toggle freeze" button before running the test. + That will reset the visibility, fill and stroke on each 'O' as the cursor moves over them so that it's + possible to trigger the change more than once. If the "Toggle freeze" button is clicked once again that + means the change will remain after the cursor moves out. +

+ + +

+ Using the pointer device move the cursor over the rects all the rects from left to right. + As the mouseover event triggers the 'O':s will become visible and marked in either green (a pass) or red (a fail). +

+
+ +

+ The test has passed if after moving the cursor over all the rects: +

+
    +
  1. all the 'O':s in the green rects have green fill
  2. +
  3. there are no red 'O':s visible
  4. +
  5. there are 9 green 'O':s in the first and second rect, 4 in the third rect and 6 in the fourth rect
  6. +
+
+ + $RCSfile: interact-pevents-01-b.svg,v $ + + + + + + + + + + + + Test pointer-events on text + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + O + O + O + O + O + O + O + O + + + + + + + + + + O + O + + O + O + O + + O + + O + O + O + + O + + + + + + + + + + + + Toggle freeze + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-03-b.svg new file mode 100644 index 000000000..5da26cfbb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-03-b.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + +

Tests that pointer events are not delivered to text elements when the pointer is + over any white space due to letter-spacing.

+ + +

For each line of text, slowly move the mouse from left to right over and between all of the visible glyphs. + When the mouse is at various points along each line of text, the text will become green.

+
+ +

For all of the lines of text, when the mouse is over a visible glyph, that line of text + must be green. When the mouse is between the visible glyphs, it must be either green or + black as follows:

+
    +
  • For the first, third and fifth lines, the text must be black when the mouse + is between any of the visible glyphs.
  • +
  • For the second and fourth lines, the space between each pair of visible glyphs is divided into + three parts (not necessarily of equal size): +
      +
    • When the mouse is over the first (left) part of the space between a pair of visible glyphs, the text must be black.
    • +
    • When the mouse is over the second (middle) part of the space between a pair of visible glyphs, the text must be green.
    • +
    • When the mouse is over the third (right) part of the space between a pair of visible glyphs, the text must be black.
    • +
  • +
+
+ + $RCSfile: interact-pevents-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + + + + @ A y Ö ç + + + + @ A y Ö ç + + + + @AyÖç + + + + + + @ A y Ö ç + + + + @AyÖç + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-04-t.svg new file mode 100644 index 000000000..2ed7c6eee --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-04-t.svg @@ -0,0 +1,132 @@ + + + + + + + + + + + + +

+ Tests where text is considered intersected by the cursor when letter-spacing is used. +

+

+ The first two lines should look the same, but the second line is using a slightly different svgfont that defines an empty path for the space glyph. +

+

+ The third line doesn't have any spaces, just letter-spacing, so there are no glyphs in between the letters. Hovering the whitespace between the letters should not highlight the line. +

+

+ The fourth line has a space glyph between the other glyphs, and letter-spacing. +

+

+ The fifth line has no spaces only letter-spacing. +

+ + +

+ Slowly move the mouse over the characters on each row. +

+
+ +
    +
  • The first two lines must behave the same way, and must turn green only when a glyph is hovered, note that this includes the space glyph which covers about half the distance between each pair of the other glyphs.
  • +
  • The third line must turn green only when hovering each of the visible glyphs, not the whitespace.
  • +
  • The fourth line must turn green only when a glyph is hovered, note that this includes the space glyph which covers about half the distance between each pair of the other glyphs.
  • +
  • The fifth line must turn green only when hovering each of the visible glyphs, not the whitespace.
  • +
+
+ + $RCSfile: interact-pevents-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + + + + @ A y Ö ç + + + + @ A y Ö ç + + + + @AyÖç + + + + + + @ A y Ö ç + + + + @AyÖç + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-05-b.svg new file mode 100644 index 000000000..7a6f6815a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-05-b.svg @@ -0,0 +1,121 @@ + + + + + + + + + + + + +

+ Tests when text is considered hit by pointer-events. + According to SVG 1.1 pointer-events on text is not supposed to use the text boundingbox, instead it should use the 'character cells'. +

+ + +

Consider each of the two light blue boxes to be divided up into nine vertical strips: + five consisting of areas just wide enough to fit each of the glyphs, and four + consisting of the white space between those five other strips. For each of these + vertical strips, move the mouse slowly from the top of the light blue box to the bottom, + keeping the mouse within the strip. At various points, all of the glyphs within + the box will be green and at others they will all be black.

+
+ +

When the mouse is over a glyph, then all of the glyphs within the light blue box + must be green.

+

When the mouse is within one of the white space strips, then all of the glyphs + within the light blue box must be black.

+

When the mouse is within the strip containing the first, second or fourth + glyph ("@", "A" or "Ö") and it is below the glyph, then all of the glyphs + within the light blue box must be black.

+

When the mouse is within the strip containing the second, third, fourth or + fifth glyph ("A", "y", "Ö" or "ç") and it is above the glyph, then all of the glyphs + within the light blue box must be black.

+
+ + $RCSfile: interact-pevents-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test pointer-events on text + + @AyÖç + @AyÖç + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-07-t.svg new file mode 100644 index 000000000..e78f68ee2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-07-t.svg @@ -0,0 +1,114 @@ + + + + + + + + + + +

Testing pointer-events and rendering order

+ + +

+ Move the mouse over the blue and purple shapes. Click the red circle on the top left. Move the mouse over the blue and purple shapes again. +

+
+ +

+ For the test to pass the blue rectangles must always turn red on mouseover, and the ovals must turn red on mouseover only if pointer-events are set to "ALL". + If a shape other than the one currently hovered turns red then the test has failed. +

+
+ + $RCSfile: interact-pevents-07-t.svg,v $ + + + + + + + + + + + + Testing pointer-events and rendering order + Rectangles should turn RED on mouseover + Ovals should turn RED if Pointer-Events are set to "ALL" + + + + Change "Pointer-Events" of + ovals from "ALL" to "NONE" + + + + + Purple ovals have "Pointer-Events" set to "ALL". + Purple ovals have Pointer-Events set to "NONE". + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-08-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-08-f.svg new file mode 100644 index 000000000..f3a3d3bd0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-08-f.svg @@ -0,0 +1,185 @@ + + + + + + + + + + +

Tests the pointer-events attribute with different 'visible' values, same as the interact-pevents-201-t test but with script instead of declarative animation

+

+ The 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke. + The 4th column (most right column) has a non activatable pointer event as the visibility of the column + is set to hidden. +

+

+ The first row tests the default value for pointer-event, i.e. visible fill and stroke will trigger an event. + The second row tests pointer-events="visiblePainted", i.e. visible fill and stroke will trigger an event. + The third row tests pointer-events="visibleFill", i.e. visible fill only an event. + The fourth row tests pointer-events="visibleStroke", i.e. visible stroke only an event. + The fifth row tests pointer-events="visible", i.e. visible fill and stroke will trigger an event. +

+ + +

+ Slowly move the mouse over the rectangles in each row while checking the pass criteria. +

+
+ +

+ The test is passed if the following conditions are met: +

+
    +
  • In the first row of squares, the fill and stroke of squares 1 and 3 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the second row of squares, the fill and stroke of squares 1 and 3 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the third row of squares, the fill only of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fourth row of squares, the stroke only of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fifth row of squares, the fill and stroke of squares 1, 2 and 3 must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
+
+ + $RCSfile: interact-pevents-08-f.svg,v $ + + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + default : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + visiblePainted : + fill and stroke of rects 1 and 3 must trigger + + + + + + + + + + + + + + + + + + visibleFill : + only fill of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + visibleStroke : + only stroke of rects 1, 2 and 3 must trigger + + + + + + + + + + + + + + + + + + visible : + fill and stroke of rects 1, 2 and 3 must trigger + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-09-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-09-f.svg new file mode 100644 index 000000000..44d7372ec --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-09-f.svg @@ -0,0 +1,174 @@ + + + + + + + + + + +

Tests the pointer-events attribute with different painting values, same as the interact-pevents-202-t test but with script instead of declarative animation

+

+ The 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke. + The 4th column has visibility set to hidden. +

+

+ The first row tests pointer-events="painted", i.e. event on fill and stroke that are set. + The second row tests pointer-events="fill", i.e. event on a fill that is set. + The third row tests pointer-events="stroke", i.e. even on a stroke that is et. + The fourth row tests pointer-events="all", i.e. event on fill and stroke that are set. + The fifth row tests pointer-events="none", i.e. no event. +

+ + +

+ Slowly move the mouse over the rectangles in each row while checking the pass criteria. +

+
+ +

+ The test is passed if the following conditions are met: +

+
    +
  • In the first row of squares, the fill and stroke of squares 1, 3 and 4 only must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the second row of squares, the fill only of all squares must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the third row of squares, the stroke only of all must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fourth row of squares, the fill and stroke of all squares must trigger a pale red rectangle to appear + over the squares on mouseover.
  • +
  • In the fifth row of squares, nothing is to trigger on mouseover.
  • +
+
+ + $RCSfile: interact-pevents-09-f.svg,v $ + + + + + + + + + + + + Testing pointer-events - pale RED rect should appear on mouseover. + + + 2nd and 3rd columns represent respectively rects with no fill/stroke and transparent fill/stroke + + + + + + + + + + + + + + + + painted : + fill and stroke of rects 1, 3 and 4 must trigger + + + + + + + + + + + + + + + fill : + fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + stroke : + stroke of rects 1 to 4 must trigger + + + + + + + + + + + + + + + all : + stroke and fill of rects 1 to 4 must trigger + + + + + + + + + + + + + + + none : + nothing is to trigger + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-10-f.svg new file mode 100644 index 000000000..c05e2b361 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pevents-10-f.svg @@ -0,0 +1,82 @@ + + + + + + + + + + +

+ An element with 'display' set to 'none' or an element whose parent has 'display' set to 'none' is not a target of pointer events. +

+

+ Stack a 'circle' element with 'display' equal to 'none' on another 'circle' element. + Specify an 'onclick' event handler on the 'circle' with 'display' set to 'none' that will change the 'visibility' of 'FAIL' text to 'visible'. + Verify that the event handler does not fire which clicking on the top 'circle' element. + Repeat with another set of 'circle' elements with the parent of one of the 'circle' elements having its 'display' set to 'none'. +

+ + +

+ Click on both black circles. +

+
+ +

+ Test passes if there is no red visible on the page after clicking the black circles. +

+
+ + $RCSfile: interact-pevents-10-f.svg,v $ + + + + + + + + + + + + + + + FAIL + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-01-t.svg new file mode 100644 index 000000000..086d12033 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-01-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + +

+ This tests that zero opacity pixels in a mask do not affect + hit testing for the purpose of pointer event targetting. +

+ + +

+ After loading the test, a rectangle will be displayed. + Move the pointer over the rectangle, and it will change color + to indicate whether the test was passed. +

+
+ +

+ If the rectangle turns green once the pointing device is moved over it, + the test was passed. If instead it turns red (or remains black), + then the test failed. If the rectangle was initially red when + the document was loaded, then that also indicates that the test failed. +

+
+ + $RCSfile: interact-pointer-01-t.svg,v $ + + + + + + + + + + Test pointer events with zero opacity mask pixels + + + + + + + Move the pointing device over the rectangle. + If it is red, you've already failed. + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-02-t.svg new file mode 100644 index 000000000..2e57e378d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-02-t.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +

+ This tests that clipped-out parts of shapes do not receive pointer events. +

+ + +

+ After loading the test, a rectangle will be displayed. + Move the pointer over the rectangle, and it will change color + to indicate whether the test was passed. +

+
+ +

+ If the rectangle turns green once the pointing device is moved over it, + the test was passed. If instead it turns red (or remains black), + then the test failed. If the rectangle was initially red when + the document was loaded, then that also indicates that the test failed. +

+
+ + $RCSfile: interact-pointer-02-t.svg,v $ + + + + + + + + + + Test pointer events with shapes that have clip paths + + + + + + + Move the pointing device over the rectangle. + If it is red, you've already failed. + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-03-t.svg new file mode 100644 index 000000000..7e0c062e9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-03-t.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +

+ This tests that the "painted" keyword for the pointer-events property + does not cause pointer events to be captured when a shape's fill falls + back to "none" because a referenced paint server was not available. +

+ + +

+ After loading the test, a rectangle will be displayed. + Move the pointer over the rectangle, and it will change color + to indicate whether the test was passed. +

+
+ +

+ If the rectangle turns green once the pointing device is moved over it, + the test was passed. If instead it turns red (or remains black), + then the test failed. If the rectangle was initially red when + the document was loaded, then that also indicates that the test failed. +

+
+ + $RCSfile: interact-pointer-03-t.svg,v $ + + + + + + + + + + Test pointer-events="painted" with paint server fallback + + + + + + Move the pointing device over the rectangle. + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-04-f.svg new file mode 100644 index 000000000..7c8ec0e3c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-pointer-04-f.svg @@ -0,0 +1,88 @@ + + + + + + + + + + +

+ +

+ + +

+ +

+
+ +

+ +

+

+ +

+
+ + $RCSfile: interact-pointer-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-01-t.svg new file mode 100644 index 000000000..e9f615823 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-01-t.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + +

+ Verify correct handling by Dynamic (interactive) viewers for the + "zoomAndPan" attribute on the 'svg' element. This is the second of three + tests, and tests the default value. +

+

+ The test consists of a set of black circles with a blue stroke. +

+ + +

+ After the initial picture is displayed, the user should attempt to use + the magnify controls that are required on conforming Dynamic SVG + viewers. +

+
+ +

+ The correct behaviour is that magnification and panning works + correctly, as required by a conformant viewer. +

+
+ + $RCSfile: interact-zoom-01-t.svg,v $ + + + + + + + + + + Test default value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-02-t.svg new file mode 100644 index 000000000..2c211f552 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-02-t.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + +

+ Verify correct handling by Dynamic (interactive) viewers for the + "zoomAndPan" attribute on the 'svg' element. This is the second of three + tests, and tests the value "magnify". +

+

+ The test consists of a set of black circles with a blue stroke. +

+ + +

+ After the initial picture is displayed, the user should attempt to use + the magnify controls that are required on conforming Dynamic SVG + viewers. +

+
+ +

+ The correct behaviour is that magnification and panning works + correctly, as required by a conformant viewer. +

+
+ + $RCSfile: interact-zoom-02-t.svg,v $ + + + + + + + + + + Test "magnify" value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-03-t.svg new file mode 100644 index 000000000..6821e1a4e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/interact-zoom-03-t.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ Verify correct handling by Dynamic (interactive) viewers for the + "zoomAndPan" attribute on the 'svg' element. This is the third of three + tests, and tests the value "disable". +

+

+ The test consists of a set of black circles with a blue stroke. +

+ + + + +

+ After the initial picture is displayed, the user should attempt to use + the magnify controls that are required on conforming Dynamic SVG + viewers. +

+
+ +

+ The correct behaviour is that the magnify and pan controls + shall have no effect -- the viewer shall disable them. +

+
+ + $RCSfile: interact-zoom-03-t.svg,v $ + + + + + + + + + + + Test "disable" value of + zoomAndPan attribute. + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-01-b.svg new file mode 100644 index 000000000..cf397adac --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-01-b.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+ This is the first of a set of three tests that verify the capability to + handle links into SVG content, using + each of the three fragment identifier forms permissible in SVG. +

+

+ There is a colored arrow comprising the content of an 'a' element. The + link destination is in an auxiliary file, linkingCircle-f.svg, and + is expressed by xlink:href="linkingCircle-f.svg#fragmentValue". + The initial view of this test contains one pale blue arrow plus labelling text. +

+

+ The (blue) arrow uses the "bare name" fragment identifier + form, "#circle-2", to target the circle with id "circle-2" in the external + file. +

+ + +

+ The user should activate the link on the center blue arrow. +

+
+ +

+ Upon clicking the first arrow, the full image of the linkingCircle-f.svg + file should replace the initial view of this test case in the viewer frame. +

+

+ The reference image illustrates the correct image after the link is + activated (full view of linkingCircle-f.svg). +

+
+ + $RCSfile: linking-a-01-b.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-03-b.svg new file mode 100644 index 000000000..8e5ef764b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-03-b.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ This is the third of a set of three tests that verify the capability to + handle links into SVG content, using + each of the three fragment identifier forms permissible in SVG. +

+

+ There is a colored arrow comprising the content of an 'a' element. The + link destination is in an auxiliary file, linkingCircle-f.svg, and + is expressed by "xlink:href=linkingCircle-f.svg#fragmentValue". + The initial view of this test contains one green arrow plus labelling text. +

+

+ The (green) arrow uses the SVG view specification form, + "linkingCircle-f.svg#svgView(viewBox(63,226,74,74))", + to target the circle with id "circle-2" + in the external file. +

+ + +

+ The user should activate the link on the center green arrow. +

+
+ +

+ Upon clicking this arrow, circle-2 should fill most of the + viewer frame (white space on each side is 25% of the diameter of the circle). +

+

+ The reference image illustrates the correct image after the link is + activated, with the circle-2's + framing rect filling the viewer frame, uniformly scaled. +

+
+ + $RCSfile: linking-a-03-b.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-04-t.svg new file mode 100644 index 000000000..02db16bfc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-04-t.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + +

+ Verify the capability to handle basic links out of SVG content + using the 'a' element, with the xlink:href attributes. + There are three subtests, in each of which one + of three colored arrows comprise the content of an 'a' element. The + link destination is expressed by "xlink:href=". + The initial view of this test contains the three arrows, a colored + circle, labelling text, and the usual template legend and frame. +

+ +

+ There are several reference images associated with this test case. The first + illustrates the correct "start" or initial state of the rendered SVG file. + The second illustrates the correct image after the first link is activated + (to the linkingToc.svg file). The third (for browser-environment viewers) + should match the current image of the W3C home page, as viewed with a + conventional browser. (Note. This harness does not yet + provide access to multiple PNGs; the first, initial-state PNG is shown.) +

+

+ The test uses the 'rect' and 'polygon' elements, as well as basic fill (solid simple colors), + stroke (black and colored wide and 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ The user should interact with each of the arrows activating each of the links, + using the UA's back mechanism to restart each link test. +

+ +
+ +

+ The top-most (yellow) arrow links to an external SVG file, which is + local (in the same directory). The target file contains SVG 'text' elements + which comprise a TOC and brief description of all of the test files + for Linking. Upon clicking the first arrow, the image of the linkingToc-t.svg + file should replace the initial view of this test case in the viewer frame. +

+

+ The middle (green) arrow links to an object in this SVG test file, the yellow + circle (id="internal-circle") immediately to its right, using "#circle-object" + as the value of of the xlink:href attribute. + There should be no change to the viewer frame upon clicking this arrow. +

+

+ The bottom-most (blue) arrow links to remote non-SVG content, the W3C home page + using xlink:href attribute value "http://www.w3.org". For viewers in a Web + browser environment, the W3C home page should replace the initial view + of this test case in the browser/viewer frame. For other viewers (e.g., + interactive but SVG-only standalone viewers), the result is undefined, but could + include such actions as a diagnostic "Error parsing..." message. +

+
+ + $RCSfile: linking-a-04-t.svg,v $ + + + + + + + + + Basic out-bound links and the 'a' element. + + + + + + + + + + + + + + + + + + + + id="internal-circle" + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-05-t.svg new file mode 100644 index 000000000..7a6360e06 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-05-t.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + +

+ Verify if the 'a' element properly accept the transform + attibute. There are three subtests, in each of which one + of three sets of colored arrows comprise the content of + an 'a' element. The link destination is expressed by + "xlink:href=" as in the test 'linking-a-04-t.svg'. + The arrows transformed is in the brighter color, and the + arrows before transformation is shown in the darker color. + The transformation parameters used for each 'a' element is + shown on the left side of each arrow. +

+

+ The top-most arrow (yellow) is rotated for 20 degree. + The middle arrow (green) is skewed horizontally for + -30 degree, and the last arrow (cyan) is translated + for (-10, -20). +

+ +

+ The test uses the 'rect' and 'polygon' elements, as well as basic fill (solid simple colors and RGB values), + stroke (black and colored wide and 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ The user should interact with each of the arrows activating each of the links, + using the UA's back mechanism to restart each link test. +

+
+ +

+ Each arrow, i.e. link, should behave as described + in 'linking-a-04-t.svg'. The arrows in this test + have the same 'xlink:href' attribute as the 'linking-a-04-t' + test. +

+
+ + $RCSfile: linking-a-05-t.svg,v $ + + + + + + + + + Verify transform attributes in the 'a' element. + + + + + + transform="rotate(20,225,65) + + + + + + + transform="skewX(-30) + + + + + + + + + transform="translate(-10,-20) + + + + id="internal-circle" + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-07-t.svg new file mode 100644 index 000000000..7ea4441c7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-07-t.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + +

+ Verify that the target attribute on the 'a' element takes precedence over the xlink:show attribute. + There are three subtests, in each of which two similarly + colored arrows comprise the content of an 'a' element. The arrow on the left, outlined + in blue, has no "target" attribute; the arrow on the right, outlined in red, has a + "target" attribute. The + link destination is expressed by "xlink:href=". + The initial view of this test contains the six arrows, labelling text, and the usual template legend and frame. +

+

+ The top-most (yellow) arrows link to an external SVG file, which is + local (in the same directory). The target file contains SVG 'text' elements + which comprise a TOC and brief description of all of the test files + for Linking. +

+

+ The middle (green) arrows links to the same external SVG file, but with xlink:show="new". +

+

+ The bottom-most (blue) arrows links to the same external SVG file, but with xlink:show="replace". +

+ + +

+ Click each of the arrows once. +

+
+ +

+ The test has passed if: +

+
    +
  • Upon clicking the left-most yellow arrow, the image of the linkingToc-t.svg + file replaces the initial view of this test case in the viewer frame. On clicking the right-most yellow arrow, + the image of the linkingToc-t.svg appears in a new frame.
  • +
  • Upon clicking any of the green arrows the image of the linkingToc-t.svg appears in a new frame.
  • +
  • Upon clicking the left-most blue arrow, the image of the linkingToc-t.svg file replaces the initial + view of this test case in the viewer frame. + On clicking the right blue arrow produces the image of the linkingToc-t.svg in a new frame.
  • +
+
+ + $RCSfile: linking-a-07-t.svg,v $ + + + + + + + + + xlink 'show' attribute on 'a' element. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-08-t.svg new file mode 100644 index 000000000..c0c2ccdf8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-08-t.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + +

+ This is a simple test for links on text elements. The upper subtest has an 'a' element + inside a 'text' element; the lower subtest has the 'a' outside the 'text'. +

+ + +

+ Click each of the links once. +

+
+ +

+ Both lines of text must be working links, and must take you to the linking TOC svg in the same frame. +

+
+ + $RCSfile: linking-a-08-t.svg,v $ + + + + + + + + + + + Link inside text + + + Link around text + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-09-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-09-b.svg new file mode 100644 index 000000000..1099cd75a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-09-b.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ This is a simple test for links on tspan elements. The upper subtest has an 'a' element + inside a 'tspan' element; the lower subtest has the 'a' outside the tspan. +

+ + +

+ Click each of the links once. +

+
+ +

+ Both lines of text must be working links, and must take you to the linking TOC svg in the same frame. +

+
+ + $RCSfile: linking-a-09-b.svg,v $ + + + + + + + + + + + A + + link + inside tspan + for testing + + + + A + + link + around tspan + + for testing + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-10-f.svg new file mode 100644 index 000000000..5138de88b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-a-10-f.svg @@ -0,0 +1,83 @@ + + + + + + + + + + +

+ Test that the 'a' element supports various types of graphics and container elements as content. +

+ + +

Run the test. No interaction required.

+
+ +

+ Test passes if there are fourteen blue shapes on the page, in the sizes and positions + shown in the reference image. +

+
+ + $RCSfile: linking-a-10-f.svg,v $ + + + + + + + + + + + + + + + X + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-frag-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-frag-01-f.svg new file mode 100644 index 000000000..f69c50208 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-frag-01-f.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + + +

+ Tests svgView(viewBox();transform()) syntax, with and without escaped semicolons. +

+ + +

+ Run the test. Click on the green arrow. If that results in circle-2 being displayed, go back to this test and click on the blue arrow. If that shows a quarter of circle-2, go back to this test and click on the purple arrow. +

+
+ +

+ The test is passed if you clicked on three arrows, and clicking the purple arrow results in a quarter of circle-2 being displayed. +

+
+ + $RCSfile: linking-frag-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-01-b.svg new file mode 100644 index 000000000..eebc9f628 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-01-b.svg @@ -0,0 +1,149 @@ + + + + + + + + + + + + +

+ Verify the capability to handle links to 'view' elements, and the + permissible attributes on those elements. All of the links in this + test case are internal, i.e., to 'view' elements in the same SVG file. +

+

+ This test is identical to linking-uri-02-b except that the links there are external. +

+

+ In the four quadrants of the initial picture are four graphical objects. + Clockwise from upper right, they are + a purple rectangle, blue ellipse, green polygon (pentagon), and yellow + circle. Each is labelled and tightly boxes with a rectangular frame. + These are identical to their counterparts in linking-uri-01-b.svg, in which + file each has an associated 'view' element, with attributes + per the labels in the initial picture. +

+

+ In the center is a gray box with four lines of text, each of which says + "Go to" followed by Rectangle, Ellipse, Polygon, and Circle, respectively. + Each of these is contained within an 'a' element, whose xlink:href names + the respective 'view' element of the respective graphical object. +

+

+ There are several reference images associated with this test case. The first + illustrates the correct initial state of the rendered SVG file, which should + also be the correct picture after the Rectangle link is executed. + The second, third, and fourth illustrate the correct images as described + above after respectively the Ellipse, Polygon, and Circle links are activated. + (Note. This harness does not yet provide access to multiple PNGs; the PNG for the + initial view is shown.) +

+

+ The test uses the 'rect', 'circle', 'ellipse', and 'polygon' elements, + as well as basic fill (solid simple colors), + stroke (black and colored 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ In turn, activate each of the "Rectangle", "Ellipse", "Polygon" and "Circle" links + in the gray box in the middle of the document, navigating back (for example with + the Back button if in a browser) after activating each one. +

+
+ +

+ The test is passed if all of the sub-tests have the correct behavior: +

+
    +
  • After activating the "Rectangle" link, the whole of the linking-uri-01-b.svg + document must be displayed; that is, there will be no visual change. (The + 'view' element has no attributes (other than id), so the correct view in + the frame is of the parent 'svg' element, which is the whole picture.)
  • +
  • After navigating back and activating the "Ellipse" link, the view must change so that it is + zoomed (uniformly scaled) and centered on the ellipse. The black rectangle + surrounding the ellipse must be just within the frame.
  • +
  • After navigating back and activating the "Circle" link, the view must change so that it is + zoomed and centered on the yellow circle. The view is scaled non-uniformly, however, + so that the circle is stretched horizontally ito an ellipse. The black rectangle + surrounding it must be just within the frame.
  • +
  • After navigating back and activating the "Polygon" link, the view must not change.
  • +
+
+ + $RCSfile: linking-uri-01-b.svg,v $ + + + + + + + + + Link test of the 'view' element and its attributes, 1 of 2, internal. + + + + + Go to Rectangle + + + Go to Ellipse + + + Go to Circle + + + Go to Polygon + + Click element's line + to link to its view + + + + + + Rectangle + + No view attributes except id. + + + + Ellipse + + viewBox, should fill frame. + + + + Circle + + viewBox & non-uniform + preserveAspectRatio + + + + Polygon + + viewTarget, no + changes to viewport + + + + $Revision: 1.12 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-02-b.svg new file mode 100644 index 000000000..69d8a4719 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-02-b.svg @@ -0,0 +1,156 @@ + + + + + + + + + + + + +

+ Verify the capability to handle links to 'view' elements, and the + permissible attributes on those elements. All of the links in this + test case are external, i.e., to 'view' elements in another SVG file. + That file is linking-uri-01-b.svg. +

+

+ This test is identical to linking-uri-01-b except that the links here are external. +

+

+ In the four quadrants of the initial picture are four graphical objects. + Clockwise from upper right, they are + a purple rectangle, blue ellipse, green polygon (pentagon), and yellow + circle. Each is labelled and tightly boxes with a rectangular frame. + These are identical to their counterparts in linking-uri-01-b.svg, in which + file each has an associated 'view' element, with attributes + per the labels in the initial picture. +

+

+ In the center is a gray box with four lines of text, each of which says + "Go to" followed by Rectangle, Ellipse, Polygon, and Circle, respectively. + Each of these is contained within an 'a' element, whose xlink:href names + the respective 'view' element of the respective graphical object. +

+

+ There are several reference images associated with this test case. The first + illustrates the correct initial state of the rendered SVG file, which should + also be the correct picture after the Rectangle link is executed. + The second, third, and fourth illustrate the correct images as described + above after respectively the Ellipse, Polygon, and Circle links are activated. + (Note. This harness does not yet provide access to multiple PNGs; the PNG for the + initial view is shown.) +

+

+ The test uses the 'rect', 'circle', 'ellipse', and 'polygon' elements, + as well as basic fill (solid simple colors), + stroke (black and colored 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ In turn, activate each of the "Rectangle", "Ellipse", "Polygon" and "Circle" links + in the gray box in the middle of the document, navigating back (for example with + the Back button if in a browser) after activating each one. +

+
+ +

+ The test is passed if all of the sub-tests have the correct behavior: +

+
    +
  • After activating the "Rectangle" link, the whole of linking-uri-01-b.svg + must be displayed, which is visually similar to this document, linking-uri-02-b.svg. + (The 'view' element has no attributes (other than id), so the correct view in + the frame is of the parent 'svg' element, which is the whole picture.)
  • +
  • After navigating back and activating the "Ellipse" link, the view must change so that it is + zoomed (uniformly scaled) and centered on the ellipse in linking-uri-01-b.svg. + The black rectangle surrounding the ellipse must be just within the frame.
  • +
  • After navigating back and activating the "Circle" link, the view must change so that it is + zoomed and centered on the yellow circle in linking-uri-01-b.svg. The view is scaled non-uniformly, however, + so that the circle is stretched horizontally ito an ellipse. The black rectangle + surrounding it must be just within the frame.
  • +
  • After navigating back and activating the "Polygon" link, the whole of + linking-uri-01-b.svg must be displayed.
  • +
+
+ + $RCSfile: linking-uri-02-b.svg,v $ + + + + + + + + + Link test of the 'view' element and its attributes, 2 of 2, external. + + + + + Go to Rectangle + + + Go to Ellipse + + + Go to Circle + + + Go to Polygon + + Click element's line + to link to its view in + linking-uri-01-b. + + + + + + + Rectangle + + No view attributes except id. + + + + + Ellipse + + viewBox, should fill frame. + + + + + Circle + + viewBox & non-uniform + preserveAspectRatio + + + + + Polygon + + viewTarget, no + changes to viewport + + + + $Revision: 1.10 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-03-t.svg new file mode 100644 index 000000000..52c766e02 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/linking-uri-03-t.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

+ Verify the handling of the allowable xlink attributes on the 'a' element. + The initial view of this test contains a single green triangle, labelling text, + and the usual template legend and frame. +

+

+ The purpose of the test is to + verify that viewers tolerate the presence of xlink attributes on the 'a' + element. The presence of the attributes should not change the behavior of + the test in any way. +

+

+ There are two reference images associated with this test case. The first + illustrates the correct "start" or initial state of the rendered SVG file. + The second illustrates the correct image after the link is activated + (to the linkingToc-t.svg file). (Note. This harness does not yet + provide access to multiple PNGs; the first, initial-state PNG is shown.) +

+

+ The test uses the 'rect' element, as well as basic fill (solid simple colors), + stroke (black and colored wide and 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

Click on the center green triangle.

+
+ +

+ There is a link on the triangle, pointing to an external SVG file, which is + local (in the same directory). The target file contains SVG 'text' elements + which comprise a TOC and brief description of all of the BE test files + for Linking. Upon clicking the triangle, the image of the linkingToc-t.svg + file should replace the initial view of this test case in the viewer frame. +

+

+ The results of executing the link should be identical + to executing the first (topmost) link of linking-a-04-t. +

+
+ + $RCSfile: linking-uri-03-t.svg,v $ + + + + + + + + + Simple exercise of xlink attributes on the 'a' element. + + + + Click for TOC + Link to local file + linkingToc-t.svg. + + xlink:type="simple" + xlink:show="replace" + xlink:actuate="onRequest" + xlink:href="linkingToc-t.svg" + xlink:role="figure-out-a-role" + xlink:title="TOC of Linking BE tests." + target="_self" + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-filter-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-filter-01-f.svg new file mode 100644 index 000000000..777c6c693 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-filter-01-f.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+ This tests that the 'filter' property does not apply to 'mask'. +

+

+ The mask 'm' covers a rectangular area (200 x 200) except for a window + (100 x 100) in the top left hand corner. Initially the mask window is + set on top of the green square. Hence, the green square is shown and + the red square is covered. If filters are supported the window within + the mask will be shifted by an offset of 100,100 placing it on top of + the red square. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if a green square is shown. If any + red shows, the test has failed. +

+
+ + $RCSfile: masking-filter-01-f.svg,v $ + + + + + + + + + + Testing 'filter' applied to 'mask' + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-intro-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-intro-01-f.svg new file mode 100644 index 000000000..4a0357bd7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-intro-01-f.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+ The rules are different regarding the geometry of a shape when clipping and masking. + For example, a clip-path does not take into account the stroke of the shape used for clipping. + It is however, used when masking. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are two identical darkblue circles at the top of the illustration, and + below those two circles, two more circles should appear. They are of lighter appearance, + the one on the left has a darker and thick stroke. +

+
+ + $RCSfile: masking-intro-01-f.svg,v $ + + + + + + + + + + masking-mask-04-f.svg + Tests the impact of strokes within clipPath and mask + Testing stroke inclusion for 'clip-path' and 'mask' + + + + + + + + + + With a 'clip-path': + + + + + + + + + + With a 'mask': + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-01-b.svg new file mode 100644 index 000000000..5928d57ea --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-01-b.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + +

+ Test to see if the masking features using the mask element and mask + property are available. +

+

+ A red rectangle is displayed in the background to help view the result + of transparency and masking. +

+

+ From top to bottom, the tests are as follows. +

+

+ In the top test, a linear gradient is used inside the mask to change the opacity + of the rectangle from 1.0 (at the top) to 0.5 (at the bottom). +

+

+ In the second test, a simple 50% opaque rectangle is used as a mask. +

+

+ In the third test, no mask is used, but a rectangle is shown with 50% opacity. + The second and third test should look the same. +

+

+ Lastly, a string of text has a mask applied to it. The mask only covers a partial + area of the text, so the text should only be half visible. Also the mask consists + of 4 rectangles with various levels of opacity. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except + variations are possible in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: masking-mask-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + Test for mask support + + + + + + + + + + + + + + Mask with linear gradient from + opacity=1 to opactity=0.5 + + + + + + Mask with uniform opacity of 0.5 + + + Rectangle with uniform opacity of 0.5 + + + + + + + + SVG + Text with mask containing rectangles + of various opacities + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-02-f.svg new file mode 100644 index 000000000..38cd9420e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-mask-02-f.svg @@ -0,0 +1,50 @@ + + + + + + + + + + +

+ If the 'mask' property references a 'mask' element containing no children, the element referencing it is not rendered. +

+ + +

Run the test. No interaction required.

+
+ +

+ Test passes if there is a single green rectangle, with no red visible on the page. +

+
+ + $RCSfile: masking-mask-02-f.svg,v $ + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-opacity-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-opacity-01-b.svg new file mode 100644 index 000000000..ce34caeb6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-opacity-01-b.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + +

+ Test to see the effect of applying an opacity property to a group. +

+

+ A blue rectangle with a green rectangle on top are contained in a + group. This opacity of the group and the opacity of the rectangles are + changed in this test. A red rectangle is provided in the background so + that opacity changes are obvious visually. +

+

+ From top to bottom, the tests are as follows. +

+

+ In the top test, the opacities of the group and the individual rectangles are + all set to 1. +

+

+ In the second test, the group is given an opacity of 0.5. +

+

+ In the third test, the group maintains a group opacity of 1 whereas each individual + rectangle is given an opacity of 0.5 in the group. +

+

+ Lastly, the group and individual rectangles are all given an opacity of 0.5. +

+ + + + +

+ Run the test. No interaction required. +

+
+ +

+ In the top test, the green rectangle should appear on top of the blue + rectangle. +

+

+ In the second test, the blue + rectangle should not show through in the region where the green and blue overlap. +

+

+ In the third test, the blue rectangle + should show through in the overlap region. +

+

+ Lastly, the + result should be similar to the previous test only fainter (because the opacity) is + resulting in less contribution. +

+

+ The rendered picture should match the reference image exactly, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: masking-opacity-01-b.svg,v $ + + + + + + + + + Test for opacity property on a group. + + + + + + Group opacity: 1 + Blue rectangle opacity: 1 + Green rectangle opacity: 1 + + + + + Group opacity: 0.5 + Blue rectangle opacity: 1 + Green rectangle opacity: 1 + + + + + Group opacity: 1 + Blue rectangle opacity: 0.5 + Green rectangle opacity: 0.5 + + + + + Group opacity: 0.5 + Blue rectangle opacity: 0.5 + Green rectangle opacity: 0.5 + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-01-b.svg new file mode 100644 index 000000000..81dbc8da5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-01-b.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + +

+ Test to see if the basic clipping works using the clipPath element + and the clip-path property. +

+

+ This test uses the following elements : <clipPath> and the following + properties : clip-path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test at the top shows an orange rectangle (with black stroke) being clipped by another rectangle. + So only the middle portion of the orange rectangle should be visible. Also the black stroke should + only be visible along the top and bottom edge of the rectangle. +

+

+ The example at the bottom has a group containing a text string and two rectangles. The group + has a clipping path defined using two overlapping rectangles. Of concern is the overlapping area + shared by the two rectangles. There should not be holes in this overlapping area, the + clip region is the union of the two rectangles. For clarity, + guide rectangles in grey show the position of the clipping rectangles. +

+

+ The rendered picture should match the reference image exactly, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: masking-path-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + Rectangle being clipped + + + + Line of text to be clipped + + Group being clipped + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-02-b.svg new file mode 100644 index 000000000..d952df142 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-02-b.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + +

+ Test to see if clipPathUnits attribute is handled properly on a + clipPath element. Only tests the userSpaceOnUse and + objectBoundingBox items of the clipPathUnits. userSpace has been + tested by the previous test as it is the default. +

+

+ The test at the top shows a pink rectangle that has been clipped by a + rectangular clipping path. The clipping path is defined using clipPathUnits=objectBoundingBox. + +

+

+ The example at the bottom a rotated blue rectangle that has been clipped by a + rectangular clipping path. The clipping path is defined using clipPathUnits=userSpaceOnUse. + +

+

+ The rendered picture should match the reference image exactly, except for possible + variations in the labelling text (per CSS2 rules). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if the pink rectangle and blue diamond do not have any + color painted outside of their black borders. +

+
+ + $RCSfile: masking-path-02-b.svg,v $ + + + + + + + + + + + + + + + clipPathUnits=objectBoundingBox + + + + + + clipPathUnits=userSpaceOnUse + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-03-b.svg new file mode 100644 index 000000000..92186a6c5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-03-b.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + +

+ Test 'overflow'/'clip' on outermost and inner 'svg' elements. +

+

+ There are two parts to the test. The first part tests viewport clipping + on outermost 'svg' elements. The second part tests viewport clipping + on inner 'svg' elements. +

+

+ The test case also tests the initial value of the 'overflow' property + to ensure that it is set to 'hidden' for all 'svg' elements. + Tester should zoom out and/or pan to check this. +

+

+ To test clipping to the outermost 'svg' element, + a rectangle with a light blue interior, a light red border and a black + string that says "Clip to outer 'svg'" is painted four times such that + it will overflow each of the top, left, right and bottom + sides of the bounds of the outermost 'svg' element, respectively. +

+

+ To test clipping to inner 'svg' elements, a rectangle with a light red + interior, a light blue border and a black string that says "Clip to + inner 'svg'" is painted four times such that it will overflow each of + the top, left, right and bottom sides of the bounds of an inner 'svg' + element, respectively. +

+

+ Note that minor text layout differences, as are permissible under CSS2 + rules, can lead to slightly different visual results regarding where + the text strings get clipped. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if:

+
    +
  • The four "Outer Clip" boxed strings must not render outside the + outermost 'svg' element (the 480x360 rectangular viewport) and + must continue to be clipped to this viewport if the image is zoomed in or out, + or panned.
  • +
  • The four "Inner Clip" boxed strings must not render outside the + bounds of the green rectangle.
  • +
+
+ + $RCSfile: masking-path-03-b.svg,v $ + + + + + + + + + + + Test 'overflow'/'clip' on outermost and inner 'svg' elements + + + + + Outer Clip + + + + Outer Clip + + + + Outer Clip + + + + Outer Clip + + + + + + + + + Inner Clip + + + + Inner Clip + + + + Inner Clip + + + + Inner Clip + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-04-b.svg new file mode 100644 index 000000000..983bfd1b4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-04-b.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ This test exercises basic user-specified clip paths, using a text + string (i.e., content of a 'text' element) as the clip path. +

+

+ There is a rectangular image of a swirly blue pattern with large + yellow text, "Clip Test" superimposed. The image is a PNG file, + imported into the picture via the 'image' element. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary + colors), stroke (black 1-pixel lines), font-family (Arial and + Impact) and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for + possible variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: masking-path-04-b.svg,v $ + + + + + + + + + + + + Clip Test + + + + + + Clip Test + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-05-f.svg new file mode 100644 index 000000000..e6146eabd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-05-f.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ Test to see if clip-rule property has been implemented properly. +

+

+ The test at the top shows a red rectangle that has been clipped by a + clipping path that overlaps itself. +

+

+ The test at the bottom shows a blue rectangle that has been clipped by a + clipping path that overlaps itself. +

+

+ The rendered picture should match the reference image exactly, except for possible + variations in the labelling text (per CSS2 rules). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ In the first rectangle, the clip-rule is defined to be evenodd so the overlap should have a hole in it. + The clip-rule is defined to be nonzero so the overlap should be filled. +

+
+ + $RCSfile: masking-path-05-f.svg,v $ + + + + + + + + + + Test for clip-rule property. + + + + + clip-rule=evenodd + + + + + cliprule=nonzero + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-06-b.svg new file mode 100644 index 000000000..6d0425ab5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-06-b.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + +

+ The intent of this file to test the 'clip' property. In this test, the clipped objects are + raster and SVG images. + + +

+ + +

+ Run the test. No interaction required. +

+
+ +

The UA should render two images inside the red rectangles.

+
+ + $RCSfile: masking-path-06-b.svg,v $ + + + + + + + + + + 'clip' property on images + + + + + <-- raster image + + + + + SVG image --> + + + + $Revision: 1.8 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-07-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-07-b.svg new file mode 100644 index 000000000..63f73d821 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-07-b.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + +

+ This tests that 'clipPath' elements can be used together and how the clipping paths are intersected. +

+

+ There is a gray-white pattern as a background for the two subtest rectangles. This is to show that the holes that are cut out using clip-paths are transparent. + The first subtest verifies that when you use the 'clip-path' property on a child element inside a 'clipPath' element the child element is clipped correctly. + The second subtest verifies that when a 'clipPath' element has a 'clip-path' property the result is the intersection of the two clip paths. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if the following conditions are met: +

+
    +
  • There is no red visible.
  • +
  • No shapes extend outside of the rects that have a thick black border.
  • +
  • For the left subtest: +
      +
    • There must be a large blue rect with a transparent smaller rect in it, and the intersection of two circles.
    • +
    • The borders of the clipregions are shown with black stroke.
    • +
    • The blue shapes must be visible only inside of these stroked regions.
    • +
    +
  • +
  • For the right subtest: +
      +
    • The test on the right must show part of the large blue rect shape with a transparent rect in it, and part of a circle.
    • +
    • The blue shapes must only be visible inside of the circle that has black stroke.
    • +
    +
  • +
+
+ + $RCSfile: masking-path-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test clip unions and intersections + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.11 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-08-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-08-b.svg new file mode 100644 index 000000000..17291ade9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-08-b.svg @@ -0,0 +1,140 @@ + + + + + + + + + + +

+ This tests a few 'clip-path' cases to see that clipping paths are applied and constructed properly. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ There are nine subtests in this test. There should be a big stroked rectangle with nine smaller rectangles inside. If all of the smaller rectangles are green the test has passed. +

+

+ The test has passed if: +

+
    +
  • There is no red visible.
  • +
  • Each of the nine small rectangles are green.
  • +
+
+ + $RCSfile: masking-path-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Establishing a new clipping path + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-09-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-09-b.svg new file mode 100644 index 000000000..d272e605c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-09-b.svg @@ -0,0 +1,73 @@ + + + + + + + + + + +

+ This tests that a clip path applied to an element does not affect + bounding box computation. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the rectangle is green. The test is failed + if any part of the rectangle is red. +

+
+ + $RCSfile: masking-path-09-b.svg,v $ + + + + + + + + + + Test bounding box calculations with clip paths + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-10-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-10-b.svg new file mode 100644 index 000000000..251d34bdf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-10-b.svg @@ -0,0 +1,138 @@ + + + + + + + + + + +

+ This tests a few 'mask' cases to see that masks are applied and constructed properly. +

+

+ There are nine subtests in this test. There should be a big stroked rectangle with nine smaller rectangles inside. If all of the smaller rectangles are green the test has passed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • There is no red visible.
  • +
  • Each of the nine small rectangles are green.
  • +
+
+ + $RCSfile: masking-path-10-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Establishing a new masking path + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-11-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-11-b.svg new file mode 100644 index 000000000..957f85319 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-11-b.svg @@ -0,0 +1,67 @@ + + + + + + + + + + +

+ Test the mask element with child elements with white and black fills, + to create a mask that clips out some text in the middle. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the letters 'ABC' are visible inside a blue + circle, and the letters are transparent, showing the checkered + background image. +

+
+ + $RCSfile: masking-path-11-b.svg,v $ + + + + + + + + + + + + + ABC + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-12-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-12-f.svg new file mode 100644 index 000000000..60c689493 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-12-f.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ Properties inherit into the 'clipPath' element and its children. +

+ + +

Run the test. No interaction required.

+
+ +

+ Test passes if there is a green rect visible, and no red. +

+
+ + $RCSfile: masking-path-12-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-13-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-13-f.svg new file mode 100644 index 000000000..89b85421b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-13-f.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + +

+ Test that the children of the 'clipPath' element are not rendered directly. +

+ + +

+ Test passes if there is a green rectangle, and no red visible on the page. +

+
+ + $RCSfile: masking-path-13-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-14-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-14-f.svg new file mode 100644 index 000000000..b0c39c0f4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/masking-path-14-f.svg @@ -0,0 +1,72 @@ + + + + + + + + + + + + +

+ The 'clipPath' element itself and its children elements do not inherit clipping paths from ancestors of the 'clipPath' element. +

+

+ Overlay a red 'rect' with a black 'rect' of a larger size. Define a 'clipPath' with a 'rect' of the same size as the red 'rect', but different 'x' and 'y' offsets. Reference that 'clipPath' from a 'g' element containing another 'clipPath' element. In this latter 'clipPath', specify a 'rect' of the same size and same 'x' and 'y' offsets as the red 'rect', and reference it from the black 'rect' element. Reference the same 'clipPath' elements, but this time with a black 'rect' which overlays a red 'rect' of a larger size. If there is no red on the page, the first 'clipPath' was not inherited by the second 'clipPath'. +

+ + +

+ Run the test. No interaction required +

+
+ +

+ Test passes if there are two black rectangles, and there is no red visible on the page. +

+
+ + $RCSfile: masking-path-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/metadata-example-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/metadata-example-01-t.svg new file mode 100644 index 000000000..69eda51c9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/metadata-example-01-t.svg @@ -0,0 +1,160 @@ + + + + + + + + + + + + +

+ Check that metadata in a variety of namespaces, inside a metadata + element, does not affect rendering in any way. The file is not valid to + the SVG 1.1 DTD, but is well formed. +

+

The diagram on the table is, by the way, a visualization of the + RDF metadata in the graphic.

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered result should match the reference image and there should be + no error messages or warnings +

+
+ + $RCSfile: metadata-example-01-t.svg,v $ + + + + + + + + + + + + + Line drawing of woman in antique attire, + which looks legal or perhaps mystical. + image/svg+xml + Sibyll Trelawney + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + http://prismstandard.org/vocabularies/1.0/resourcetype.xml#birdsEye + http://prismstandard.org/vocabularies/1.0/resourcetype.xml#illustration + image/svg+xml + Line drawing of woman in antique attire, ... + online: + Sibyll Trelawney + + + http://purl.org/dc/elements/1.1/type + http://purl.org/dc/elements/1.1/format + http://purl.org/dc/elements/1.1/subject + http://purl.org/dc/elements/1.1/type + http://purl.org/dc/elements/1.1/description + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-01-f.svg new file mode 100644 index 000000000..07c1261d5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-01-f.svg @@ -0,0 +1,107 @@ + + + + + + + + + + +

+ Elements are rendered when the 'display' attribute is set to any valid value other than 'none'. +

+

+ For each valid 'display' value (except none), the test creates a 'rect' element with that 'display' value assigned. Under that + element, a red 'rect' is placed at the exact same 'x', 'y' position with the same height and width. Test passes if the 'rect' + with 'display' covers the red 'rect'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if 16 black rectangles are shown and there is no red visible on the page. +

+
+ + $RCSfile: painting-control-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-02-f.svg new file mode 100644 index 000000000..8177e60bf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-02-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ 'Stroke' attributes affected by directionality start at the point at which the graphics element starts. +

+

+ The test creates two 'path' elements that have the same 'stroke-dasharray' assignment. The paths will create the same visual shape, + but the start and end points will be opposite. Test passes if the 'stroke-dasharray' of each path is drawn differently. + Second subtest is the same but with stroke-dashoffset. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there are two lines, each composed of alternating black and orange boxes. +

+
+ + $RCSfile: painting-control-02-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-03-f.svg new file mode 100644 index 000000000..d76402359 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-03-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ Open polyline and path elements are filled as if they were closed with the last point linked to the first point. +

+

+ The test specifies two polylines and two paths on the page with five points each. One polyline/path closes the shape with the fifth + point linking to the first. One polyline/path is open (no link from fifth point to first). Both polylines/paths are filled. + The open subpath is placed over the closed one. Test passes if the open subpath fills over the closed path. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if two black shapes are shown and no red visible on the page. +

+
+ + $RCSfile: painting-control-03-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-04-f.svg new file mode 100644 index 000000000..95b526281 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-04-f.svg @@ -0,0 +1,58 @@ + + + + + + + + + + +

+ A zero length subpath with 'stroke-linecap' set to 'square' or 'round' is stroked, but not stroked when 'stroke-linecap' is set to 'butt'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is a blue circle, a blue square, and no red on the page. +

+
+ + $RCSfile: painting-control-04-f.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-05-f.svg new file mode 100644 index 000000000..48a984d21 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-05-f.svg @@ -0,0 +1,114 @@ + + + + + + + + + + +

+ This tests setting the 'display' property to 'none' on an element that is a child of a 'mask' or 'clipPath' element, which should cause the element to not be + included in the 'mask' or 'clip' region. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are 8 green rectangles visible, and no red. +

+
+ + $RCSfile: painting-control-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-06-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-06-f.svg new file mode 100644 index 000000000..58e4efd32 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-control-06-f.svg @@ -0,0 +1,64 @@ + + + + + + + + + + +

+ Setting the 'visibility' property to 'hidden' on a 'g' tag will affect its children, unless the children of the 'g' tag override the parent setting. +

+

+ Have a 'g' tag with an red filled shape as a child. Set 'visibility: hidden' on the 'g' tag. Verify no red is on the page. + Also, have a 'g' tag with a green filled shape as a child. Set 'visibility: hidden' on the 'g' tag. Set 'visibility: visible' on + the child tag. Verify that the green 'rect' renders on the page. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are two green squares visible on the page, and no red. +

+
+ + $RCSfile: painting-control-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-01-t.svg new file mode 100644 index 000000000..bb66cb0d9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-01-t.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the fill properties fill:none, + and fill with a color (fill:green) +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ There should be two rectangles, the rectangle on the left hollow (fill:none) and the rectangle on the right filled with green. +

+
+ + $RCSfile: painting-fill-01-t.svg,v $ + + + + + + + + + Basic paint: fill properties. + + + + + + + + + + fill="none" + fill="green" + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-02-t.svg new file mode 100644 index 000000000..36413ac73 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-02-t.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + +

+ The test uses the "currentColor" value for the "fill" attribute. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rectangle on the left should be green filled, the rectangle on the right should be blue. + The text above the rectangles should be black. +

+
+ + $RCSfile: painting-fill-02-t.svg,v $ + + + + + + + + + + + Basic paint: fill properties. + fill="currentColor" + + + + + + + + + green + blue + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-03-t.svg new file mode 100644 index 000000000..158f7cf4d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-03-t.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the fill rule properties evenodd and nonzero +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ There should be two green filled stars, the leftmost star should be unfilled in the very center. +

+
+ + $RCSfile: painting-fill-03-t.svg,v $ + + + + + + + + + Basic paint: fill properties. + + + + + + + + fill-rule="evenodd" + fill-rule="nonzero" + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-04-t.svg new file mode 100644 index 000000000..73381091e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-04-t.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ This tests inheritance of three properties: "fill", "stroke" and "stroke-width". There is a "g" element (id="G1") which + sets fill="blue", stroke="purple", and stroke-width="5". The first two rectangles on top should inherit all those + properties. The middle left rectangle has fill="yellow" and stroke-width="2", it should inherit the stroke="purple" + from the parent container. The middle rectangle on the right has stroke="yellow", it should inherit fill and + stroke-width from the parent "g". The bottom two rectangles are in another "g" element (id="G2") which is a child + of "G1". "G2" sets fill="yellow". It should inherit the stroke and stroke width from the parent "G1". The two + bottom rectangles set no fill or stroke properties, they should inherit through the parents, stroke="purple" + and stroke-width="5". +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labeling text (per CSS2 rules). +

+

+ The test uses the "rect" element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Arial) and font-size properties. +

+
+ + $RCSfile: painting-fill-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-05-b.svg new file mode 100644 index 000000000..a508b69b9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-fill-05-b.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + +

+ Test using "fill-opacity" values for "rect" element. + This test verifies that opacity is clamped to the + specified range. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The six rect elements on the left have varying 'fill-opacity' values + within the valid range of 0 to 1. The six elements on the right have + 'fill-opacity' values outside the 0 to 1 range, and must be clamped. + The top three rect elements on the right must have their 'fill-opacity' + clamped to 0, while the bottom three rect elements on the right must + be clamped to 1. +

+
+ + $RCSfile: painting-fill-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-01-f.svg new file mode 100644 index 000000000..b48c390fc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-01-f.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + +

+ Tests the basic support for markers. +

+

+ The top test examines the basic support for the marker element and style. The markers are purple rectangles. +

+

+ The middle test examines the support for the different styles of marker properties. The + "marker-start" property defines the marker to use at the first vertex of the marked path, + in this case a purple rectangle. The "marker-end" property defines the marker to use at the + last vertex of the marked path, in this case a blue triangle. The "marker-mid" property + defines the marker to use at all vertices, other than the first and last, of the marked path, + in this case a green circle. +

+

+ The bottom test examines the support for marker orientation along the + path direction. The second vertex, the top right corner of the path, has a marker that + is rotated 45 degrees, since that is the average of the horizontal and vertical segments + each side. The last vertex, the bottom right corner of the path, has a marker rotated 90 + degrees since that is the direction of the last path segment. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ For the three tests, there should be two identical paths with markers drawn. + The path on the left is rendered using the marker elements. The path on the + right is rendered using the equivalent SVG, showing what the marked path should + look like. +

+

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: painting-marker-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic Markers + + + + + + + + + + + + + + + + + + + + Start, Middle and End + + + + + + + + + + + + + + + + + + + + Automatic Orientation + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-02-f.svg new file mode 100644 index 000000000..bab08fc27 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-02-f.svg @@ -0,0 +1,245 @@ + + + + + + + + + + + + +

+ Tests the rendering of markers, specifically property inheritance. For the four tests, there should + be two identical paths with markers drawn. +

+

+ The top two tests examine the rendering of markers when the marker and the path + referencing it share the same parent and all painting properties are specfied on + that parent. The first test show inheritance of the 'fill' property and the + second the inheritance of the 'paint' property. In both tests, the marker + is painting using the same properties as the referencing object. Because of + scaling transformations on the marker, the stroke on the second test is thinner + than on the referencing object. +

+

+ The third and fourth tests examine the rendering of markers in a situation where the + marker and referencing path do NOT share the same parent and painting + properties are specified both on the parent of the marked path and on the contents + of the marker itself. In both cases, the marker's parent specifies + fill="green" stroke="blue" stroke-width="8". For the third test, the marker contents + override with stroke="black". For the fourth test, the marker contents + override with fill="black". In neither case should you see + fill="orange" or stroke="blue" or "stroke="purple" on the markers as these properties + are specified on the ancestor of the referencing object or the referencing object itself + and thus shouldn't affect the marker. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The path on the left is rendered using the marker elements. + The path on the right is rendered using the equivalent SVG, + showing what the marked path should look like. These should be + identical and match the image to the right. +

+
+ + $RCSfile: painting-marker-02-f.svg,v $ + + + + + + + + + + + + + + + + + + Marker Rendering Properties + + + + + + + + Fill Property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stroke Property + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mixed Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Mixed Properties + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-03-f.svg new file mode 100644 index 000000000..220935193 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-03-f.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + +

+ The SVG specification defines three properties to reference markers: marker-start, marker-mid, + marker-end. It also provides a shorthand property,marker. Using the marker property from a style sheet + is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if the two rows of shapes are identical, and that + all of the shapes have small blue markers (26 in total per row). +

+
+ + $RCSfile: painting-marker-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + 'marker' property test + + 'marker' property + + + + + + + + + 'marker-start', 'marker-mid' & 'marker-end' attribute + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-04-f.svg new file mode 100644 index 000000000..6abd8cefb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-04-f.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + +

+ The SVG specification defines three properties to reference markers: marker-start, marker-mid, + marker-end. It also provides a shorthand property,marker. Using the marker property from a style sheet + is equivalent to using all three (start, mid, end). However, shorthand properties cannot be used as presentation attributes. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if the shapes in the top row have no markers, + while the shapes in the bottom rom have small blue markers + (26 in total). +

+
+ + $RCSfile: painting-marker-04-f.svg,v $ + + + + + + + + + + + + + + + + + + 'marker' attribute test + + 'marker' attribute + + + + + + + + + 'marker-start', 'marker-mid' & 'marker-end' attributes + + + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-05-f.svg new file mode 100644 index 000000000..72aab3820 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-05-f.svg @@ -0,0 +1,240 @@ + + + + + + + + + + + + +

+ Test all the 'overflow' property values except 'inherit' on the 'marker' element. +

+

+ Each column tests a value of the 'overflow' property. + The first row uses the 'marker' property to set the same marker on start-, mid- and end-points on the path. + The second row uses 'marker-start', 'marker-mid' and 'marker-end' to give each point its own marker. + The third row uses the 'marker' property like the first row, but here the marker has orient="auto" set. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: + + The columns labeled 'visible' and 'auto' show markers without clipping them. + All other columns show clipped markers. + The rendered picture matches the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: painting-marker-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test marker overflow + + + default + 'visible' + 'auto' + 'scroll' + 'hidden' + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-06-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-06-f.svg new file mode 100644 index 000000000..c1929f81e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-06-f.svg @@ -0,0 +1,159 @@ + + + + + + + + + + +

+ Tests the basic support for markers. For the three tests, there + should be two identical paths with markers drawn. The path on the left is + rendered using the marker elements. The path on the right is rendered using + the equivalent SVG, showing what the marked path should look like. +

+

+ This test is similar to the painting-marker-01-f.svg test, but has some viewBox attributes + that have a non-zero offset. +

+

+ The top test examines the basic support for the marker element and style. The markers are purple rectangles. +

+

+ The middle test examines the support for the different styles of marker properties. The + "marker-start" property defines the marker to use at the first vertex of the marked path, + in this case a purple rectangle. The "marker-end" property defines the marker to use at the + last vertex of the marked path, in this case a blue triangle. The "marker-mid" property + defines the marker to use at all vertices, other than the first and last, of the marked path, + in this case a green circle. +

+

+ The bottom test examines the support for marker orientation along the + path direction. The second vertex, the top right corner of the path, has a marker that + is rotated 45 degrees, since that is the average of the horizontal and vertical segments + each side. The last vertex, the bottom right corner of the path, has a marker rotated 90 + degrees since that is the direction of the last path segment. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: painting-marker-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic Markers + + + + + + + + + + + + + + + + + + + + Start, Middle and End + + + + + + + + + + + + + + + + + + + + Automatic Orientation + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-07-f.svg new file mode 100644 index 000000000..fc086730e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-07-f.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + +

+ A 'marker' element with 'display' set to 'none' on that + element or any ancestor is rendered when referenced by another element. +

+ + +

+ Run the test. No interaction required +

+
+ +

+ Test passes if there are two green triangles visible on the page. +

+
+ + $RCSfile: painting-marker-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-properties-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-properties-01-f.svg new file mode 100644 index 000000000..cbac3a7db --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-marker-properties-01-f.svg @@ -0,0 +1,95 @@ + + + + + + + + + + +

+ +

+ + +

+ +

+
+ +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-01-b.svg new file mode 100644 index 000000000..6367fb093 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-01-b.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + +

+ This tests shows the same linear gradient used with different values for the + color-interpolation rendering property. The top bar is painted using the + default color-interpolation value, which should produce the same result as + sRGB. The middle bar is painted using the 'sRGB' color-interpolation and + should be the same as the top bar. Finally, the bottom bar is painted using + the linearRGB interpolation, which produces a result visibly different from + the top two bars: the white to blue ramp is whiter, the blue to red ramp + goes through a pinkish color and the red to yellow ramp turns orange before + the similar sRGB rampl. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The top two gradients must look the same, and the bottom gradient must look + different to the top two. The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: painting-render-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basic test of color-interpolation property. + + + + + + + + + + + + + + + + + + + + default (sRGB) + + + + + + + + + + + + + + + + + + + + + sRGB + + + + + + + + + + + + + + + + + + + + + linearRGB + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-02-b.svg new file mode 100644 index 000000000..1845b1842 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-render-02-b.svg @@ -0,0 +1,100 @@ + + + + + + + + + + +

+ This tests that the 'color-interpolation' property is honored when + alpha compositing is performed. +

+

+ The test slide consists of seven rectangular regions, + each of which is filled with either a dark or light + shade of gray. The 'color-interpolation' property + is used on the rectangles to control whether a + dark or light shade of gray appears. Text inside each + rectangular region indicates whether the shade of gray + should be dark or light. The top two rectangular regions + are references against which the remaining five are to + be compared. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • all rectangles marked as "dark" have the same fill color,
  • +
  • all rectangles marked as "light" have the same fill color,
  • +
  • the rectangle marked "dark or light" has the same fill color + as either the "dark" rectangles or the "light" rectangles, and
  • +
  • the rendering matches the reference rendering, except for + any differences in font used to render the text.
  • +
+
+ + $RCSfile: painting-render-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + dark + light + dark + light + dark + dark or light + light + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-01-t.svg new file mode 100644 index 000000000..837a64b2e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-01-t.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the stroke properties ("stroke") + in combination with the "rect" element . + The pair should be rendered as two blue rectangles, + the upper one without a stroke and the lower with a green stroke. +

+

+ The test uses the "rect" element, as well as basic "fill" (solid primary colors), + "stroke", stroke="green", "font-family" and "font-size" attributes. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labeling text (per CSS2 rules). +

+
+ + $RCSfile: painting-stroke-01-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke="none" + stroke="green" + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-02-t.svg new file mode 100644 index 000000000..0bde5eb0d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-02-t.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the stroke properties ("stroke", "stroke-width", + "stroke-linejoin") in combination with the "rect" element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The pair should be rendered as two blue rectangles without an interior fill. + The upper rectangle should have a thick stroke and sharp corners. + The lower rectangle should have a thick stroke and round corners. +

+
+ + $RCSfile: painting-stroke-02-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-width="20" + stroke-linejoin="round" + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-03-t.svg new file mode 100644 index 000000000..719a8b0ae --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-03-t.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

+ This test checks the basic capability of handling the stroke properties ("stroke", "stroke-width" + "stroke-linejoin", "stroke-linecap", "stroke-miterlimit") + with straight-line path commands. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The two paths should be rendered as two blue line segments. + The upper segment should have round end caps. The lower segment + should be chopped off where the two line segments meet. +

+
+ + $RCSfile: painting-stroke-03-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-linecap="round" + stroke-miterlimit="1" + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-04-t.svg new file mode 100644 index 000000000..5e23638f6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-04-t.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

+ This test checks the "stroke-dasharray" and "stroke-dashoffset" properties. Two lines are drawn, one blue + and one black. Both have a "stroke-dasharray" of "10,10" giving a dashed appearance + where the size of the gaps and the size of the dash is equal. +

+ + + Run the test. No interaction required. + + +

+ The black line is lower than but parallel to the blue line. The "stroke-dashoffset" on each line should make the dashes of each line line up with the gaps in the other line. +

+
+ + $RCSfile: painting-stroke-04-t.svg,v $ + + + + + + + + + + + + Basic paint: stroke properties. + + + stroke-dasharray="10, 10" + stroke-dashoffset="10" + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-05-t.svg new file mode 100644 index 000000000..f40270188 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-05-t.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ User agents may render graphical primitives with different levels of accuracy. + This test is aimed at determining how a UA renders thin strokes. +

+

+ The test file contains a number of vertical and horizontal lines. + The stroke width of the vertical lines increase from left to right. + The stroke width of the horizontal lines increase from top to bottom. +

+ + + Run the test. No interaction required. + + +

+ The test is passed if user is able to see a smooth stroke width + increment for the vertical and horizontal lines. The top left hand + corner should contain strokes that are very thin in width and the bottom + right hand corner should contain thick strokes. +

+
+ + $RCSfile: painting-stroke-05-t.svg,v $ + + + + + + + + + Rendering thin strokes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-06-t.svg new file mode 100644 index 000000000..829633f5c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-06-t.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ Test default effects of stroke-dasharray. +

+

+ This specifically tests the values of none and 0. + This also tests an odd number of values in a dash-array attribute + and in combination with an offset. +

+ + + Run the test. No interaction required. + + +

+ The top two lines must be solid black. The next line shows a thick + black line with a thinner blue line on top; both must have the same + dash pattern. The bottom two lines, one black and one blue, must render + so that the gaps of one correspond to the dashes of the other. +

+
+ + $RCSfile: painting-stroke-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-07-t.svg new file mode 100644 index 000000000..853bda408 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-07-t.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + +

+ Test effect of different stroke-miterlimits. For this particular combination of + stroke width and angle, the cut off value of stroke-miterlimit is 18.028. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The first and second subtests should not truncate the stroke, and all the rest must truncate it. +

+
+ + $RCSfile: painting-stroke-07-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-08-t.svg new file mode 100644 index 000000000..a16b2965a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-08-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ Test effects of stroke-opacity range. Values + outside the range 0-1.0 must be clamped. +

+ + + Run the test. No interaction required. + + +

+ There must be no blue bars visible beside the three pink dots. + Four semitransparent blue bars, increasingly more opaque, + must line up with the yellow dots. Three fully opaque + blue bars must line up with the green dots. +

+
+ + $RCSfile: painting-stroke-08-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-09-t.svg new file mode 100644 index 000000000..850962c84 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-09-t.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + +

+ This tests that the "stroke-dasharray" property accepts values + that are separated by white space. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if it matches the reference rendering + by showing a thick stroke with alternating long and short + stroke dashes. +

+
+ + $RCSfile: painting-stroke-09-t.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-10-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-10-t.svg new file mode 100644 index 000000000..1bad081e6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/painting-stroke-10-t.svg @@ -0,0 +1,78 @@ + + + + + + + + + + +

+ This tests that stroking of zero length subpaths will result in + some rendering if the 'stroke-linecap' property is set to + 'square' or 'round', but not if it is set to 'butt'. +

+

+ Simply load the test. Two rows of shapes should be presented, + with a text label describing the row. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Simply load the test. Two rows of shapes should be presented, + with a text label describing the row. +

+
+ + $RCSfile: painting-stroke-10-t.svg,v $ + + + + + + + + + + Test stroking of zero length subpaths + + + + + + + + + + + + + Using an 'L' command: + Using a 'c' command: + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-01-t.svg new file mode 100644 index 000000000..e6b972d7a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-01-t.svg @@ -0,0 +1,151 @@ + + + + + + + + + + + + +

+ Test that the viewer has the basic capability to handle the 'path' + element and its data (d) attribute in combination with the cubic + Bezier curveto commands, C, c, S, s (plus Mm and Zz). +

+

+ There are 8 subtests, each composed from the cubic Bezier path commands per + the label by the subtest. On-curve control points (i.e., the curve position) + are marked by small blue squares. Subtests are filled, or stroked, or + both, using simple style properties and colors. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-01-t.svg,v $ + + + + + + + + + + + + Cubic bezier curves drawn with commands: + + + + + + + + + + + M, C, S, m, c, s + + + + + + + + + + + + M, c, c, c, C, z + + + + + + + + + + M, C, Z + + + + + + + + + + + M, C, c, Z + + + + + + + + + + + m, c, s + + + + + + + + + + M, C + + + + + + + + + + + + M, c, s, s, s, z + + + + + + + + + + m, c, z + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-02-t.svg new file mode 100644 index 000000000..cad5865d6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-02-t.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + +

+ Test that the viewer has the basic capability to handle the 'path' + element and its data (d) attribute in combination with the quadratic + Bezier curveto commands, Q, q, T, t (plus Mm and Zz). +

+

+ There are 7 subtests, each composed from the quadric Bezier path commands per + the label by the subtest. On-curve control points (i.e., the curve position) + are marked by small colored squares. Subtests are filled, or stroked, or + both, using simple style properties and colors. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-02-t.svg,v $ + + + + + + + + + Quadric bezier curves drawn with commands: + + + + + M, Q, M, q, z + + + + + + + + + m, q, z, m, q, z + + + + + + + + + M, Q, Z + + + + + + + M, Q, T, Q, z + + + + + + + + + M, Q, Q, z + + + + + + + + M, q, t, t, t, t, z + + + + + + + + + + + M, q, Q, q, Q, z + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-03-f.svg new file mode 100644 index 000000000..3f087fdce --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-03-f.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + +

+ Test that the viewer has the basic capability to handle the 'path' + element and its data (d) attribute in combination with the elliptical + arc curveto commands, A, a (plus Mm and Zz). +

+

+ There are 6 subtests, each composed from the elliptical arc path commands per + the label by the subtest. The curve positions + are marked by small colored squares. Subtests are filled, or stroked, or + both, using simple style properties and colors. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-03-f.svg,v $ + + + + + + + + + Elliptical arc curves drawn with commands: + + + + + M, A, Z + + + + + + + m, a, z + + + + + + + M, a + + + + + + + M, A, a, a, z + + + + + + + + + M, a, Z, m, A, Z, m, a, z + + + + + + + + + + + M, A, A, A, A + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-04-t.svg new file mode 100644 index 000000000..63fef4358 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-04-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of concentric equilateral triangles are drawn using respectively + M,L,Z and m,l,z. The shapes are identical, with one stroked and + one filled. The fill-mode default of "even-odd" means that + the inner triangle is hollow. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-04-t.svg,v $ + + + + + + + + + + + + + + M, L, L, L, Z, + subpath + M, L, L, L, Z + + + + + + + + stroked + + + + + + + + filled + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-05-t.svg new file mode 100644 index 000000000..cea68ca97 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-05-t.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of concentric equilateral triangles are drawn using respectively + M,L,Z and m,l,z. The shapes in each pair are identical, with one stroked and + one filled. The fill-mode default of "even-odd" means that + the inner triangle is hollow. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-05-t.svg,v $ + + + + + + + + + + + + + m, l, l, l, z, + subpath + m, l, l, l, z + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-06-t.svg new file mode 100644 index 000000000..5e0fa31c1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-06-t.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of staircase figures are drawn using + respectively M,H,V,Z and m,h,v,z. The shapes in each pair are identical, with one stroked and + one filled. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-06-t.svg,v $ + + + + + + + + + + + + + M, H, V, H, + V. H, V, H, + V, Z + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-07-t.svg new file mode 100644 index 000000000..806e0b569 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-07-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of staircase figures are drawn using + respectively M,H,V,Z and m,h,v,z. The shapes in each pair are identical, with one stroked and + one filled. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-07-t.svg,v $ + + + + + + + + + + + + + m, h, v, h + v, h, v, h + v, z + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-08-t.svg new file mode 100644 index 000000000..5b2af84fd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-08-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of concentric equilateral triangles are drawn using + M and Z. No L commands are used in this test as they are implied after + an M or Z command. The shapes are identical, with one stroked and + one filled. The fill-mode default of "even-odd" means that + the inner triangle is hollow. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-08-t.svg,v $ + + + + + + + + + + + + Lines drawn with commands: + M and Z + + + + + + + + + + stroked + + + + + + + + filled + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-09-t.svg new file mode 100644 index 000000000..d2908c207 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-09-t.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the 'path' element, and its data attribute (d) + in combination with the straight-line path commands. + Two pairs of concentric equilateral triangles are drawn using + m and z. No l commands are used in this test as they are implied after + an m or z command. The shapes are identical, with one stroked and + one filled. The fill-mode default of "even-odd" means that + the inner triangle is hollow. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-09-t.svg,v $ + + + + + + + + + + + + Lines drawn with commands: + m and z + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-10-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-10-t.svg new file mode 100644 index 000000000..ebfcda851 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-10-t.svg @@ -0,0 +1,111 @@ + + + + + + + + + + + + +

+ Verify that the viewer renders the line caps and line joins for + open and closed paths properly. + Verify that the open triangular paths are stroked differently at + ends of the path than they are at their intermediate corners. + In contrast, the corners of a closed path should all appear the + same. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image exactly +

+
+ + $RCSfile: paths-data-10-t.svg,v $ + + + + + + + + + + open + join=round + cap=butt + M, L + + + + + + open + join=bevel + cap=round + m, l + + + + + + open + join=miter + cap=square + M, L + + + + + + closed + join=round + cap=butt + M, L, Z + + + + + + closed + join=bevel + cap=round + m, l, z + + + + + + closed + join=miter + cap=square + M, L, Z + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-12-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-12-t.svg new file mode 100644 index 000000000..ef5666c45 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-12-t.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + +

+ Test using multiple coord sets to build a polybeizer, and implicit values for initial S. +

+ + +

+ The rendered picture should match the reference image exactly, except for possible variations in the labelling text (per CSS2 rules). +

+ +
+ +

+ The rendered picture should match the reference image. +

+
+ + $RCSfile: paths-data-12-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-13-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-13-t.svg new file mode 100644 index 000000000..8525043b2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-13-t.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + +

+ Test multiple coordinates for V and H. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test is passed if there is one horizontal green line and one vertical blue line. +

+
+ + $RCSfile: paths-data-13-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-14-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-14-t.svg new file mode 100644 index 000000000..543370e1c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-14-t.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + +

+ Test implicit values for moveto. If the first command is 'm' it should be taken as an absolute moveto, plus implicit lineto. +

+ + +

Run the test. No interaction required.

+
+ +

The test is passed if the three triangles are shown: two concentric, unfilled + triangles with black strokes on the left, and one unfilled triangle with + a thick blue stroke on the right.

+
+ + $RCSfile: paths-data-14-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-15-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-15-t.svg new file mode 100644 index 000000000..7b9dcbbb2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-15-t.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

+ Test using multiple coord sets to build a polybezier, then T with no preceding Q or T. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart from any allowable font selection differences due to CSS2.

+

A purple wavy line above a short, blue horizontal line must be shown. + Small black triangles pointing to the start, middle and end of the blue + line must also be shown.

+
+ + $RCSfile: paths-data-15-t.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-16-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-16-t.svg new file mode 100644 index 000000000..ce768ecca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-16-t.svg @@ -0,0 +1,69 @@ + + + + + + + + + + +

+ This tests that any implicit lineto commands that result from an + 'M' or 'm' command with more than one pair of coordinates are absolute + if the moveto was specified with 'M' and relative if the moveto was + specified with 'm'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ After loading the test, the test is passed if two yellow + triangles with black borders are shown. Otherwise, the + test has failed. +

+
+ + $RCSfile: paths-data-16-t.svg,v $ + + + + + + + + + + Test relative-ness of implicit lineto path commands + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-17-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-17-f.svg new file mode 100644 index 000000000..d6801a864 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-17-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ Test that the 'z' and 'Z' command have the same effect. +

+

+ Specify four 'path' elements that each use three 'L' commands to draw three sides of a square. The fourth line of each + square is drawn via a 'closepath' command. A red square closed via 'z' is covered with a black square closed via 'Z' and + vice versa. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if two black-stroked, unfilled squares are visible and + there is no red visible on the page. +

+
+ + $RCSfile: paths-data-17-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-18-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-18-f.svg new file mode 100644 index 000000000..e50a85079 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-18-f.svg @@ -0,0 +1,100 @@ + + + + + + + + + + +

+ The 'path' element's 'd' attribute ignores additional whitespace, newline characters, and commas, and BNF processing consumes as much content as possible, stopping as soon as a character that doesn't satisfy the production is encountered. +

+

+ Various black path segments are rendered that each demonstrate one of the parsing rules. Each path segment is placed on top + of a similar path segment that lacks the particular parsing rule that is being tested. Test passes if no red is visible. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if seven thick black horizontal lines are shown with corresponding + gold horizontal lines just above them, and the black and gold lines are all of the + same length and horizontal position. +

+
+ + $RCSfile: paths-data-18-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-19-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-19-f.svg new file mode 100644 index 000000000..5d6d49a9e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-19-f.svg @@ -0,0 +1,107 @@ + + + + + + + + + + +

+ Test that additional parameters to pathdata commands are treated as additional calls to the most recent command. +

+

+ Each of the applicable 'pathdata' commands are used in separate 'path' elements. Each command is repeated in red and + overlayed with another 'path' element with identical coordinates specified but without the repeated command in black. + Commands that do not render or do not take parameters are omitted. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is no red visible on the page. +

+
+ + $RCSfile: paths-data-19-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-20-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-20-f.svg new file mode 100644 index 000000000..b0827e5ca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-data-20-f.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-01-f.svg new file mode 100644 index 000000000..7c79f352f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-01-f.svg @@ -0,0 +1,140 @@ + + + + + + + + + + + + +

+ Test the getTotalLength, getPointAtLength and getPathSegAtLength DOM methods. +

+

+ The left green rect should have text around it. The text should start at 50 user units distance-along-the-path, which is the same as half the rect width. + The right green rect should also have text around it, but the text should start 50 units along the path relative to the provided pathLength. Since 50 is + half of the provided pathLength the text will start at the lower right-hand corner, and if the text is too long to fit it will be cut off when reaching + the upper left corner of the rect. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test has passed if:

+
    +
  • the value for getTotalLength is "300" for both rects
  • +
  • the value for getPointAtLength is "(60,80)" for the left rect, and "(300,80)" for the right rect
  • +
  • the value for getPathSegAtLength is "0" on the first line for both rects, and on the second line "m 60 80" for the left rect and "m 300 80" for the right rect
  • +
+
+ + $RCSfile: paths-dom-01-f.svg,v $ + + + + + + + + + + + + + + + Using startOffset="50": + + + + + The text goes around the rect. + + + + Using startOffset="50" and + pathLength="100": + + + + The text goes around the rect. + + + + + getTotalLength: + -1 + -1 + + getPointAtLength(0): + -1 + -1 + + getPathSegAtLength(0): + + -1n/a + + + -1n/a + + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-02-f.svg new file mode 100644 index 000000000..5274ffcfe --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/paths-dom-02-f.svg @@ -0,0 +1,274 @@ + + + + + + + + + + + + +

+ This test is designed to test the PathSegList interface. At first a flower-like shape with 6 petals should be displayed. + The roundness and number of petals are then animated using script. +

+ + +

+ The roundness of the petals is animated from star-like sharp petals to softly rounded petals and back again, and is repeated like that until the animation stops. + The number of petals should increase one by one until the flower has a total of 12 petals, and then go back one by one until it has 6 petals, then increase again one by one until the flower has 9 petals. + Then the animation will stop. The rendered image should look exactly like the reference image. +

+

+ If the flower is clicked after the animation has finished, it will restart the animation and repeat it for some time. +

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: paths-dom-02-f.svg,v $ + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-01-b.svg new file mode 100644 index 000000000..77b756537 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-01-b.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the xlink:href attribute on + linear gradients. The top rectangle has a simple + blue (left) to lime (right) linear gradient. The lower one + has a different gradient definition, but + should look the same as the one above, because the gradient makes a + reference to the first gradient, without modifying any attribute. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ The test is passed if there are two rectangles, both with a blue to lime gradient. +

+
+ + $RCSfile: pservers-grad-01-b.svg,v $ + + + + + + + + + + + + + + + + + + Linear gradient. + + Referencing gradient below. + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-02-b.svg new file mode 100644 index 000000000..bbdfb9b03 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-02-b.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the xlink:href attribute on + radial gradients. +

+

+ There are two rectangles. The top one has + a radial gradient (black to orange) that should appear elliptical + to fit the aspect ratio of the rectangle. The units are + specified in objectBoundingBox space. The gradient + on the lower one + references the gradient of the top rectangle, but modifies + the units to use userSpace instead. So it is only using the + stops from the gradient to the left, with a different geometry. The radial gradient appears circular. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, except + for any differences in text due to CSS2 rules. Specifically:

+
    +
  • The top rectangle is filled with an elliptical radial gradient, + with black in the center and orange at the outside edges of the rectangle.
  • +
  • The bottom rectangle is filled with a circular radial gradient, + with black in the center and orange at the top and bottom edges of the rectangle. + Outside the circular area, the rectangle is filled with plain orange.
  • +
+
+ + $RCSfile: pservers-grad-02-b.svg,v $ + + + + + + + + + + + + + + + + + + Radial gradient. + + Referencing gradient below. + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-03-b.svg new file mode 100644 index 000000000..f3dfc259c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-03-b.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the xlink:href attribute on + patterns. +

+

+ There are two rectangles with a pattern fill made + up of 4 rectangles. The pattern definition of the lower one references the pattern definition + of the upper one, using the xlink:href attribute. Because + the particular way that the patterns and rectangles are + defined in this test case, the two fills will appear the + same - the rectangles are positioned on pattern-size + boundaries, so that the offsets into the pattern at the left + edges of the respective rectangles is identical. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if the rendering matches the reference image, except + for any differences in text due to CSS2 rules. Note that the top rectangle must + look identical to the bottom rectangle.

+
+ + $RCSfile: pservers-grad-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + Pattern fill. + + Referencing pattern fill below. + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-04-b.svg new file mode 100644 index 000000000..876a07a64 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-04-b.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ Test that checks the capability of the stop element in linear and radial + gradients. +

+

+ The first rectangle has a linear gradient fill with a vector starting at top left + and going to bottom right. The stop colors are at 20% spacing apart and are in the + following order : violet, blue, lime, yellow, orange, green. + Because the gradient vector vector goes from (0,0) to (1,1) in object bounding box space + and because the object bounding box has a larger width than height, the gradient vector + is skewed off of a pure 45 degree angle. The gradient stripes are also skewed + so that they are no longer perpendicular to the gradient vector. +

+

+ The next rectangle has a radial gradient fill with a multi-color stops from innermost + to outermost in the following order: black, yellow, orange, blue, white, green. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if the rendering matches the reference image, except for + any differences in text due to CSS2 rules.

+
+ + $RCSfile: pservers-grad-04-b.svg,v $ + + + + + + + + + + + + + + + + + + Multi-color linear gradient. + + + + + + + + + + + + + Multi-color radial gradient. + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-05-b.svg new file mode 100644 index 000000000..d08e1f7e5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-05-b.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + +

+ Test that checks the capability of the stop opacity in linear and radial + gradients. +

+

+ There are two tests which contain rectangles with gradients using stop-opacity properties. + A cyan color text string "Background" is put behind both of the rectangles to help + demonstrate the opacity concept. +

+

+ From top-down the appearance of objects is as follows. +

+

+ The first rectangle has a linear gradient fill with a vector starting at top left + and going to bottom right. The stop colors are at 20% spacing apart and are in the + following order : violet, blue, lime, yellow, orange, black. + Also a stop opacity is given to the colors in the following order: 1, 0.2, 0.5, 0, 0.8, 1 + Because the gradient vector vector goes from (0,0) to (1,1) in object bounding box space + and because the object bounding box has a larger width than height, the gradient vector + is skewed off of a pure 45 degree angle. The gradient stripes are also skewed + so that they are no longer perpendicular to the gradient vector. +

+

+ The next rectangle has a radial gradient fill with a multi-color stops from innermost + to outermost in the following order: black, yellow, red, blue, white, green. + Also a stop opacity is given to the colors in the following order: 1, 0.2, 0.5, 0, 0.8, 1 +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, except for + any differences in text due to CSS2 rules.

+
+ + $RCSfile: pservers-grad-05-b.svg,v $ + + + + + + + + + Background + + + + + + + + + + + Background + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-06-b.svg new file mode 100644 index 000000000..374b1e3e2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-06-b.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the gradientTransform and the patternTransform + attribute on gradients and patterns respectively. +

+

+ From top-down the appearance of objects is as follows. +

+

+ The top rectangle has a linear gradient whose coordinate system has been scaled down by + a half. So the gradient travelling from left to right (from blue to green to lime) should + only occuply the left half the rectangle. +

+

+ The next rectangle has radial gradient that has been translated to the center and skewed + in the positive X direction by 45 degrees. Therefore the gradient should appear + ellipltical and rotated around the center. +

+

+ The last row contains a rectangle with pattern on the fill. The transformation on the + pattern moves the coordinate system to the top left of the rectangle and then scales it + by a factor of 2 and then skew's it in the X direction by 45 degrees. The pattern + consists of a 2 by 2 array of colored rectangles. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Specifically:

+
    +
  • The top rectangle is filled with a linear gradient from blue on the left, + to lime in the middle. The right half of the rectangle is filled with plain lime.
  • +
  • The middle rectangle is filled with an elliptical radial gradient with + black on the inside and orange on the outside. The center point of the gradient + is near the center-bottom of the rectangle. The gradient is skewed, so that it appears + as a rotated elliptical gradient.
  • +
  • The bottom rectangle is filled with a repeating pattern of tiled + red, green, yellow and blue parallelograms.
  • +
+
+ + $RCSfile: pservers-grad-06-b.svg,v $ + + + + + + + + + + + + + + + + + + scale(0.5) on gradient + + + + + + + + + skewX(45) on gradient + + + + + + + + + + + scale(2), skewX(45) on pattern + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-07-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-07-b.svg new file mode 100644 index 000000000..9e9b32dc0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-07-b.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ Test that the viewer has basic capability to handle linear gradients + on fills and stroke of objects and text. +

+

+ This test uses the following elements : <linearGradient>, <stop> + and the following properties : stop-color, fill:url(# ), stroke(url# ) +

+

+ Both elements in this test use the same simple gradient. It is a linear gradient from + blue (left) to lime (right). From top-down the appearance of objects is as follows. +

+

+ The top rectangle should be filled with the gradient. +

+

+ The next rectangle has no fill, but has a thick stroke on which the gradient is + applied. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Specifically:

+
    +
  • The top rectangle is filled with a gradient from blue on the left to lime on the right.
  • +
  • The bottom rectangle is unfilled and stroked with a thick stroke using a gradient from blue on the left to lime on the right.
  • +
+
+ + $RCSfile: pservers-grad-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + Linear gradient filled rectangle + + + + + Linear gradient on stroke of rectangle + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-08-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-08-b.svg new file mode 100644 index 000000000..654ec8d40 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-08-b.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + +

+ Test that the viewer has basic capability to handle linear gradients + on fills and stroke of text. +

+

+ Both elements in this test use the same simple gradient. It is a linear gradient from blue (left) to lime (right). From top-down the appearance of objects is as follows. +

+

+ The first item is a text string "Gradient on fill" with the gradient on the fill of the text. +

+

+ The second item is a text string that is not filled. It has a 2 user unit stroke on which the gradient is applied. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Specifically:

+
    +
  • The text string "Gradient on fill" must be filled with a gradient + from blue on the left to lime on the right.
  • +
  • The text string "Gradient on stroke" must be unfilled and stroked with + a gradient from blue on the left to lime on the right.
  • +
+
+ + $RCSfile: pservers-grad-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gradient on fill + + + + Gradient on stroke + + + + Linear gradient on filled text + Linear gradient on stroke of text + + + + $Revision: 1.13 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-09-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-09-b.svg new file mode 100644 index 000000000..670e914bf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-09-b.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the gradientUnits attribute on linear gradients. + It tests the following values of gradientUnits: default (userSpace), objectBoundingBox, + and userSpaceOnUse. +

+

+ From top-down the appearance of objects is as follows. +

+

+ The first rectangle uses the default attributes on the linearGradient element. + Therefore the linear gradient should default to objectBoundingBox. It should appear + from the left edge of the rectangle (blue) to the right edge of the rectangle (lime). + The rectangle is smaller than the viewport, because a previous version of the SVG spec had the default value be 'viewport'. + The test fails if only a portion of the gradient is shown. +

+

+ The next rectangle uses gradientUnits=objectBoundingBox. The linear gradient should + travel from blue (top) to lime (bottom). +

+

+ The last rectangle uses gradientUnits=userSpaceOnUse. The rectangle element is given it's + own transformation and the gradient is assumed to be in this user space. + The gradient should appear as a linear gradient from lime (left) to blue (right). +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Specifically:

+
    +
  • The top rectangle is filled with a linear gradient from lime on the left to blue on the right.
  • +
  • The middle rectangle is filled with a linear gradient from blue on the top to lime on the bottom.
  • +
  • The bottom rectangle is filled with a linear gradient from lime on the left to blue on the right.
  • +
+
+ + $RCSfile: pservers-grad-09-b.svg,v $ + + + + + + + + + Testing gradientUnits attribute + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-10-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-10-b.svg new file mode 100644 index 000000000..52d893e3e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-10-b.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the spreadMethod attribute on linear gradients. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Each of the + three rectangles is filled with a linear gradient from blue on the left + to lime on the right. The width of the gradient is only a fifth of + the width of the rectangle, so:

+
    +
  • The top rectangle is filled with plain blue in the left two-fifths + and with plain lime in the right two-fifths.
  • +
  • The middle rectangle is filled with alternating copies of the blue-to-lime + gradient. Thus, from left to right, the rectangle is filled with + a gradient that goes from blue to lime to blue to lime to blue to lime.
  • +
  • The bottom rectangle is filled with five copies of the blue-to-lime + gradient. Thus, from left to right, the rectangle is filled with + a gradient that goes from blue to lime, abruptly changing back to blue + then smoothly changing to lime, etc.
  • +
+
+ + $RCSfile: pservers-grad-10-b.svg,v $ + + + + + + + + + Testing spreadMethod attribute + + + + + + + + + spreadMethod=pad + + + + + + + + + spreadMethod=reflect + + + + + + + + + spreadMethod=repeat + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-11-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-11-b.svg new file mode 100644 index 000000000..dc5e21209 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-11-b.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + +

+ Test that the viewer has basic capability to handle radial gradients + on fills and stroke of objects and text. +

+

+ This test uses the following elements : <radialGradient>, <stop> + and the following properties : stop-color, fill:url(# ), stroke(url# ) +

+

+ From top-down (left to right) the appearance of objects is as follows. +

+

+ The top left rectangle should be a radial gradient from dark blue (in) to lime (outside). + The gradient is applied to the fill of the rectangle. +

+

+ The next rectangle has no fill, but has a thick stroke on which the gradient is + applied. The gradient goes from dark orange(in) to pale yellow (out). +

+

+ The next item is a text with a radial gradient on the fill. The gradient goes + from green (in) to yellow (out). +

+

+ The last item is a text with a 2 user unit stroke on which a black (in) to magenta + (out) linear gradient is applied. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering matches the reference image, apart + from any differences in font choice due to CSS2 rules. Specifically:

+
    +
  • The top-left rectangle must be filled with a circular radial gradient + with dark blue inside and lime outside. The center point of the gradient + is in the lower-left quadrant of the rectangle.
  • +
  • The top-right rectangle has no fill, but a thick stroke which is painted + with a radial gradient with dark orange inside and yellow outside. The + center point of this gradient is in the lower-left quadrant of the + rectangle.
  • +
  • The "Gradient on text fill" text must be filled with a circular radial + gradient with green inside and yellow outside. The center point of the + gradient is the center of the text.
  • +
  • The "Gradient on text stroke" has no fill, but a stroke which is painted with + a circular radial gradient with black inside and pink outside. The center point of the + gradient is the center of the text.
  • +
+
+ + $RCSfile: pservers-grad-11-b.svg,v $ + + + + + + + + + + + + + + + + + Radial gradient on fill of rectangle + + + + + + + + + Radial gradient on stroke of rectangle + + + + + + + + Gradient on text fill + Radial gradient on text, black to yellow + + + + + + + + Gradient on text stroke + Radial gradient on stroke of text, black to red + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-12-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-12-b.svg new file mode 100644 index 000000000..d00f73af8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-12-b.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + +

+ Test that the viewer can handle the gradientUnits attribute on radial gradients. + It tests the following values of gradientUnits: default (objectBoundingBox), objectBoundingBox, + and userSpaceOnUse. +

+

+ From top-down the appearance of objects is as follows. +

+

+ The first rectangle uses the default attributes on the radialGradient element. + Therefore the radial gradient should be relative to the object bounding box. It should appear + from the center of the viewport (blue) to the edges of the viewport (lime). + The rectangle is wider than tall so it the gradient should be elliptical, not circular. +

+

+ The next rectangle uses gradientUnits=objectBoundingBox. The radial gradient should + travel from a center of 20%, 20% of the rectangle with a radius of 50%. +

+

+ The last rectangle uses gradientUnits=userSpaceOnUse. The rectangle element is given it's + own transformation and the gradient is assumed to be in this user space. + The gradient should appear in the center of the rectangle as a radial gradient from yellow (center) to blue (edge). +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendering of the three rectangles matches those + in the reference image. Specifically:

+
    +
  • The upper rectangle is filled with an elliptical radial gradient + with blue at the center and lime at its edges.
  • +
  • The middle rectangle is also filled with an elliptical radial + gradient with blue inside and lime outside, but with the center + point of the gradient in the top-left quadrant of the rectangle.
  • +
  • The bottom rectangle is filled with a circular radial gradient + with yellow at the center and blue at its edges. Since it is circular, + most of the rectangle is filled with plain blue.
  • +
+
+ + $RCSfile: pservers-grad-12-b.svg,v $ + + + + + + + + + Testing gradientUnits attribute + + + + + + + + + Radial gradient with default attributes (from blue to yellow) + Gradient is blue at the object center and lime at the object edges + + + + + + + + + gradientUnits=objectBoundingBox + cx=.2, cy=.2, r=.5, fx=.2 fy=.2 + + + + + + + + + gradientUnits=userSpaceOnUse + Gradient is yellow to blue radial gradient from center to horizontal bounds + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-13-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-13-b.svg new file mode 100644 index 000000000..02d67691e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-13-b.svg @@ -0,0 +1,171 @@ + + + + + + + + + + + + +

+ The purpose of this file is to test several values for focal points of radial gradients. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendered image matches the reference image, except + for any differences in font choice due to CSS2.

+
+ + $RCSfile: pservers-grad-13-b.svg,v $ + + + + + + + + + Radial gradient focal point + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-14-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-14-b.svg new file mode 100644 index 000000000..63045cfa6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-14-b.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ The intent of this file is to test the 4 allowed spread methods for linear and radial gradients. + The 4 values (pad, reflect, repeat and default) are available for both types of gradients. + On the left side are the linear gradient results, and on the right, the radial results. + The UA should render a result equivalent to the reference image. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the rendered image matches the reference image, except + for any differences in font choice due to CSS2.

+
+ + $RCSfile: pservers-grad-14-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gradient 'spreadMethod' values + + + spreadMethod="pad" + + + spreadMethod="reflect" + + + spreadMethod="repeat" + + + spreadMethod="default" + + + + spreadMethod="pad" + + + spreadMethod="reflect" + + + spreadMethod="repeat" + + + spreadMethod="default" + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-15-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-15-b.svg new file mode 100644 index 000000000..84ecd8f25 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-15-b.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + +

+ Test linear and radial gradient defaults. Includes + testing defaults for linear grad x1,y1,y2 = 0%, x2 = 100%. + and testing defaults for radial grad cx,cy,r = 50%, fx,fy = cx,cy. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The top rectangle must be blue at the lefthand side and fuchsia at the right + hand side, fading smoothly accross. The lower rectangle must be fuchsia at + the edges with a black centre to the radial gradient at the centre of the + rectangle, and the gradient occupying the whole rectangle. +

+
+ + $RCSfile: pservers-grad-15-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-16-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-16-b.svg new file mode 100644 index 000000000..1f62ca838 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-16-b.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+ Test gradient stop rules. Including: + No stops, like fill = none. + One stop, like fill = black. + If a stop less than all previous stops, it is set equal to the largest stop. + If two stops are equal the last stop controls the color at the overlap point. +

+ + +

+ [[ + Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test. + ]] +

+
+ +

+ The top rectangle must have a pink outline and no fill. The middle rectangle must have a + solid black fill. The lower rectangle must have a yellow to pink to green + linear gradient on the left-hand half and a solid blue fill for the right hand half. +

+
+ + $RCSfile: pservers-grad-16-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-17-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-17-b.svg new file mode 100644 index 000000000..209528935 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-17-b.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

+ This test has a gradient with gradientUnits='objectBoundingBox' which is a fade from black to white. + The gradient is used for the stroke of a line. Vertical and horizontal lines don't have a boundingbox, + since they are one-dimensional, even though the + stroke-width makes it look like they should have a boundingbox with non-zero width and height. + See the coordinate chapter, last paragraph of 7.11. +

+ + +

+ [[ + Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test. + ]] +

+
+ +

+ The left rectangle has four 'line' elements rotated in different ways. The stroke for the lines have a green solid stroke fallback which + should be used if the gradient should be ignored. For this sub-test to pass there must be three lines with solid green stroke, and one line + (from bottom left to top right) with a gradient stroke, visible in the rectangle. +

+

+ The right rectangle is the same as the left rectangle except that the stroke paintservers don't have a fallback specified. + For this sub-test to pass only the line from bottom left to top right must be visible in the rectangle, and it must have a gradient stroke. +

+
+ + $RCSfile: pservers-grad-17-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + With fallback + + + + + + + + + + Without fallback + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-18-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-18-b.svg new file mode 100644 index 000000000..3bb4411c0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-18-b.svg @@ -0,0 +1,114 @@ + + + + + + + + + + + + +

+ This test shows rectangles filled with gradient. + Several gradients are defined, with two stops: +

+ + +

+ For the top-left rectangle's gradient: + The first stop defines a fully-opaque green color. + The second stop explicitly inherits (i.e. using the 'inherit' keyword) its stop-color. +

+

+ For the top-right rectangle's gradient: + The first stop defines a fully-opaque green color. + The second stop defines a green stop-color but explicitly inherits (i.e. using the 'inherit' keyword) the stop-opacity. +

+

+ For the bottom-left rectangle's gradient: + The first stop defines a fully-opaque green color. + The second stop does not specify the stop-color and the stop-opacity. + Since both properties are not inherited, the initial value should be used. +

+

+ For the bottom-right rectangle's gradient: + The first stop defines a fully-opaque green color. + The second stop specifies the stop-color using the 'currentColor' keyword. +

+
+ +

+ The result should be: +

+

+ The top-left rectangle is filled with a gradient from green to pink since + the stop-color is inherited from the location of the gradient definition. +

+

+ The top-right rectangle filled in green with a gradient opacity. +

+

+ The lower-left rectangle filled with a gradient going from fully-opaque green to fully-opaque black. +

+

+ The lower-right rectangle filled with a gradient going from fully-opaque green to fully-opaque yellow. +

+
+ + $RCSfile: pservers-grad-18-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-20-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-20-b.svg new file mode 100644 index 000000000..e1812a12c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-20-b.svg @@ -0,0 +1,92 @@ + + + + + + + + + + +

+ This test has a gradient with gradientUnits='objectBoundingBox' which is a fade from black to white. + The gradient is used for the stroke of a line. Vertical and horizontal lines don't have a boundingbox, since they are one-dimensional, even though the + stroke-width makes it look like they should have a boundingbox with non-zero width and height. + See the coordinate chapter, last paragraph of 7.11. +

+ + +

+ The left rectangle has four 'line' elements rotated in different ways. The stroke for the lines have a green solid stroke fallback which + should be used if the gradient should be ignored. + + The right rectangle is the same as the left rectangle except that the stroke paintservers don't have a fallback specified. +

+
+ +

+ The test is passed if +

+
    +
  • + there are three lines with solid green stroke, and one line + (from bottom left to top right) with a gradient stroke, visible in the left rectangle. +
  • +
  • there is a line from bottom left to top right with a gradient stroke, visible in the right rectangle.
  • +
+
+ + $RCSfile: pservers-grad-20-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + With fallback + + + + + + + + + + Without fallback + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-21-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-21-b.svg new file mode 100644 index 000000000..8024d520b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-21-b.svg @@ -0,0 +1,146 @@ + + + + + + + + + + +

+ Test the inheritance of radial gradient attributes. The test has six ellipses with blue stroke, each filled + with two gradients. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • the gradient fills don't extend outside the blue ellipses
  • +
  • the gradient fills in the left column exactly match the corresponding reference gradient fills in the right column
  • +
+
+ + $RCSfile: pservers-grad-21-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Reference + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-22-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-22-b.svg new file mode 100644 index 000000000..b4289b606 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-22-b.svg @@ -0,0 +1,97 @@ + + + + + + + + + + +

+ Tests that transforms affect the rendering of a gradient. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if each of the two gradient-filled rectangles + towards the top of the test slide is identical to the one below it. +

+
+ + $RCSfile: pservers-grad-22-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-23-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-23-f.svg new file mode 100644 index 000000000..3029214d7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-23-f.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+ +

+

+ +

+ + +

+ Run the test. No interaction required +

+

+ +

+
+ +

+ +

+
+ + $RCSfile: pservers-grad-23-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-24-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-24-f.svg new file mode 100644 index 000000000..2aa02986a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-24-f.svg @@ -0,0 +1,68 @@ + + + + + + + + + + +

+ Test that the 'linearGradient' and 'radialGradient' elements are neither rendered directly nor via the 'use' element. +

+

+ The test defines 'linearGradient' and 'radialGradient' elements with a red 'stop' and references them from a 'use' element. 'linearGradient' + and 'radialGradient' elements with a red 'stop' are also specified outside of a 'defs' tag as if they were regular graphical elements. +

+ + +

Run the test. No interaction required.

+
+ +

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

+
+ + $RCSfile: pservers-grad-24-f.svg,v $ + + + + + + + + + + + + + + + + + There should be no red. + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-stops-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-stops-01-f.svg new file mode 100644 index 000000000..d7d158135 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-grad-stops-01-f.svg @@ -0,0 +1,70 @@ + + + + + + + + + + +

+ Test that gradient offset values less than zero are rounded up to zero and values more than one are rounded down to one. +

+

+ The test defines four gradients, each with a single stop where the 'stop-color' is set to 'blue'. + The four gradients have 'offset' set to '-1', '-1%', '101%' and '2'. Four rectangles reference + the gradients. All of these should render as if they have plain blue fills. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passed if there are four blue boxes on the page. +

+
+ + $RCSfile: pservers-grad-stops-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-01-b.svg new file mode 100644 index 000000000..2081855a4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-01-b.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + +

+ Test that the viewer has basic capability to handle patterns + on fills and stroke of objects and text. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ From top-down the appearance of objects is as follows. +

+

+ The top rectangle should be filled with a pattern composed of a green + rectangle on top of yellow rectangle. A default stroke has been applied to the original + rectangle to see the boundary of the rectangle. +

+

+ The next rectangle has no fill, but has a thick stroke on which the pattern is + applied. The pattern consists of 4 colored rectangles. +

+

+ The next item is a text with a pattern on the fill. The pattern appears as + alternating rows of orange and green. +

+

+ The last item is a text with a 2 user unit stroke on which a pattern is applied. + The pattern appears as alternating columns of maroon and blue. +

+
+ + $RCSfile: pservers-pattern-01-b.svg,v $ + + + + + + + + + + + + + + + + + Pattern created using yellow and green rectangles applied to fill of rectangle + + + + + + + + + + + Pattern of 4 rectangles applied to a stroke of a rectangle. + + + + + + + + Pattern on fill + Pattern consists of orange and green rows + + + + + + + + Pattern on stroke + Pattern consists of maroon and blue columns + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-02-f.svg new file mode 100644 index 000000000..d2e8655ac --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-02-f.svg @@ -0,0 +1,61 @@ + + + + + + + + + + +

+ Test that the 'patternTransform' attribute has an effect on the 'pattern' element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the testframe is filled with a blue and white + diamond pattern. +

+
+ + $RCSfile: pservers-pattern-02-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-03-f.svg new file mode 100644 index 000000000..dbf9f4796 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-03-f.svg @@ -0,0 +1,91 @@ + + + + + + + + + + +

+ Test that empty patterns are not rendered, and that the fallback color is used instead. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are 8 green rectangles visible, and no red. +

+
+ + $RCSfile: pservers-pattern-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-04-f.svg new file mode 100644 index 000000000..e24dd33d3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-04-f.svg @@ -0,0 +1,70 @@ + + + + + + + + + + +

+ Inherited attributes from a referenced 'pattern' are not applied if they are already defined on the referencing 'pattern' element. +

+

+ Define a pattern 'pattern1' with circles that have red fill. Inherit 'pattern1' into 'pattern2' and add circles at different 'y' + attribute and with 'fill' set to 'lime' on 'pattern2'. Reference 'pattern1' from a square using 'fill' attribute. Reference 'pattern2' + from a different square using 'fill' attribute. Position the second square directly over the first square. Verify that there is green visible. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are four green circles visible on the page, and no red. +

+
+ + $RCSfile: pservers-pattern-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-05-f.svg new file mode 100644 index 000000000..4fe22ab11 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-05-f.svg @@ -0,0 +1,64 @@ + + + + + + + + + + +

+ Test that a 'pattern' element can inherit attributes through multiple levels of + 'xlink:href' referencing. +

+

+ The test defines a pattern 'pattern1' with some attributes that scale the contents. The attributes on + 'pattern1' are inherited into 'pattern2' and then inherited from 'pattern2' + into 'pattern3'. 'pattern3' has a green circle as its graphical content. + A 'rect' uses 'pattern3' as its fill, if the attributes are correctly inherited into + 'pattern3', then the green circle will occlude a red circle in the same position. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passed if there is no red visible on the page. +

+
+ + $RCSfile: pservers-pattern-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-06-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-06-f.svg new file mode 100644 index 000000000..721988449 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-06-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ +

+ + +

+ +

+
+ +

+ +

+
+ + $RCSfile: pservers-pattern-06-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-07-f.svg new file mode 100644 index 000000000..8701df130 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-07-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern. + The pattern dimensions and coordinate-system are defined completely on the pattern that has the invalid xlink:href, + to test that they're not overridden by the non-existant pattern that is referenced. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are four green circles visible on the page. +

+
+ + $RCSfile: pservers-pattern-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-08-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-08-f.svg new file mode 100644 index 000000000..e15cb8458 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-08-f.svg @@ -0,0 +1,66 @@ + + + + + + + + + + +

+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern. + This test specifies only 'width' and 'height' on the pattern that is tested in order to catch + incorrectly overridden values from a non-existant pattern. The result is tested + with a reference pattern using slightly different syntax. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are four green circles visible on the page, and no red. +

+
+ + $RCSfile: pservers-pattern-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-09-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-09-f.svg new file mode 100644 index 000000000..4d0ec1ae1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/pservers-pattern-09-f.svg @@ -0,0 +1,70 @@ + + + + + + + + + + +

+ Test that an invalid xlink:href on a 'pattern' element has no effect on the pattern, and that the + pattern isn't rendered since the default 'width' and 'height' is 0. + A subtest that explicitly specifies 'width' and 'height' as 0 is added as a reference. + Both of these cases should result in the fallback color being used. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is a green rectangle visible on the page, and no red. +

+
+ + $RCSfile: pservers-pattern-09-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-01-t.svg new file mode 100644 index 000000000..ec391f88e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-01-t.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

+ Verifies that shapes can be filled. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ There is one pair of octagons. These are filled. +

+
+ + $RCSfile: render-elems-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + Shape fill + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-02-t.svg new file mode 100644 index 000000000..30646c64b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-02-t.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

+ Verifies that shapes can be stroked. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ There is one pair of octagons. These are stroked. +

+
+ + $RCSfile: render-elems-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + Shape stroke + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-03-t.svg new file mode 100644 index 000000000..b5a6b1a9f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-03-t.svg @@ -0,0 +1,63 @@ +"> +]> + + + + + + + + + + + + +

+ Verifies that shapes can be filled, stroked and the order of filling and stroking. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ There is one pair of octagons. These are filled plus stroked. +

+
+ + $RCSfile: render-elems-03-t.svg,v $ + + + + + + + + + + + + + &shape; + &shape; + Shape fill and stroke + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-06-t.svg new file mode 100644 index 000000000..ef2002b05 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-06-t.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ Verifies that text can be filled. +

+ + +

+Run the test. No interaction required. +

+
+ +

+The + test shows two 'G' characters that are filled + (green to the left, and with navy to the right) and not stroked. +

+
+ + $RCSfile: render-elems-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text fill + + G + G + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-07-t.svg new file mode 100644 index 000000000..427e626ea --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-07-t.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Verifies that text can be stroked. The + +

+ + +

+Run the test. No interaction required. +

+
+ +

+ The test shows two characters that are stroked and not filled. +

+
+ + $RCSfile: render-elems-07-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text stroke + + G + G + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-08-t.svg new file mode 100644 index 000000000..fb946e7f9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-elems-08-t.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + +

+ Verifies that text can be stroked. + +

+ + +

+Run the test. No interaction required. +

+
+ +

+ The test shows two 'G' characters that are both stroked and filled. +

+
+ + $RCSfile: render-elems-08-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Text fill and stroke + + G + G + + + + $Revision: 1.10 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-01-b.svg new file mode 100644 index 000000000..035f30c22 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-01-b.svg @@ -0,0 +1,109 @@ + + + + + + + + + + + + +

+ Verifies implicit rendering order (paragraph 3.3) and grouping mechanism (paragraphs 3.4). + It also validates basic Shape, Image and text rendering. +

+ + +

+Run the test. No interaction required. +

+

+ The rendered image should match the reference image exactly. +

+
+ +

+ This test renders 3 elements: a text string "SVG", then + a shape, then an image. Because of their definition order and coordinates, the image + should be on top of the rectangle and the rectangle on top of the text. The + test validates that groups are conceptually rendered offscreen before being + rendered on the canvas. This is done by grouping the same overlapping objects and + rendering the group at half opacity. The background pattern (vertical stripes) should + show through all the group elements. However, none of the "SVG" text string should show through the + rectangle and none of the rectangle should show through the image. +

+
+ + $RCSfile: render-groups-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-03-t.svg new file mode 100644 index 000000000..92f5da0ca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/render-groups-03-t.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + +

+ Verifies implicit rendering order (paragraph 3.3) and grouping mechanism (paragraphs 3.4). + It also validates basic Shape, Image and text rendering. +

+ + +

+Run the test. No interaction required. +

+

+ The rendered image should match the reference image exactly. +

+
+ +

+ This test renders 3 elements: a text string "SVG", then + a shape, then an image. Because of their definition order and coordinates, the image + should be on top of the rectangle and the rectangle on top of the text. None + of the "SVG" text string should show through the + rectangle and none of the rectangle should show through the image. +

+
+ + $RCSfile: render-groups-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVG + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-01-b.svg new file mode 100644 index 000000000..b99bb864f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-01-b.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + +

+ Tests basic mouse event handler and DOM manipulation through + ECMAScript binding. +

+

+ The test uses ECMAScript and initially displays a target with + a message asking the user to click on the target. Once the user + has done so, and if both event handling and DOM manipulation are + supported, then the target and initial text are hidden and a text + message indicating that the test was successful is displayed. +

+ + +

Load the test. Click on the blue square.

+
+ +

The test passes if, after clicking on the blue square, it and + the instruction text "Click on the blue square" is removed + and replaced with green text stating "Scripting Test Passed!".

+
+ + $RCSfile: script-handle-01-b.svg,v $ + + + + + + + + + + + Event and DOM Access Test + + + + + + + + Click on the blue square + + + + Scripting Test Passed! + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-02-b.svg new file mode 100644 index 000000000..b26e98ad0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-02-b.svg @@ -0,0 +1,124 @@ + + + + + + + + + + + + +

+ Resolved to unapproved this test because elements being + focusable and activatable is underdefined in the spec. ACTION-2977 +

+

+ Tests basic mouse event handlers. +

+

+ The test shows a target that can be used to generate the various + kinds of events supported in SVG. Below the + target, the list of events is shown with red markers next to each. +

+

+ If the test passes, all the markers should have turned to green + after the events have been triggered on the target. If any event + has not triggered, its marker will remain red. +

+ + +

Load the test. Focus the gray circle, activate it, then move the focus away from the circle.

+
+ +

The test passes if, after following the operator script, the three rectangles are green.

+
+ + $RCSfile: script-handle-02-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onfocusin + onfocusout + onactivate + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-03-b.svg new file mode 100644 index 000000000..f2280fc0c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-03-b.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ Tests basic mouse event handlers. +

+

+ The test shows a target that can be used to generate the various + kinds of mouse events supported in SVG. Below the + target, the list of events is shown with red markers next to each. +

+

+ If the test passes, all the markers should have turned to green + after the events have been triggered on the target. If any event + has not triggered, its marker will remain red. +

+ + +

Load the test. Click on the gray circle.

+
+ +

The test passes if, after clicking the gray circle, the three rectangles are green.

+
+ + $RCSfile: script-handle-03-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onmousedown + onmouseup + onclick + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-04-b.svg new file mode 100644 index 000000000..2859a4dc6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-handle-04-b.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ Tests basic mouse event handlers. +

+

+ The test shows a target that can be used to generate the various + kinds of mouse events supported in SVG. Below the + target, the list of events is shown with red markers next to each. +

+

+ If the test passes, all the markers should have turned to green + after the events have been triggered on the target. If any event + has not triggered, its marker will remain red. +

+ + +

Load the test. Move the pointing device over the gray circle, and then away from it.

+
+ +

The test passes if, after moving the mouse away from the gray circle, all three rectangles are green.

+
+ + $RCSfile: script-handle-04-b.svg,v $ + + + + + + + + + + + + Mouse event handlers test. + + + + + + + + Target + Use the target to trigger events + + + + + + + + + + + + + + + onmouseover + onmousemove + onmouseout + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-01-f.svg new file mode 100644 index 000000000..a4ea29671 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-01-f.svg @@ -0,0 +1,67 @@ + + + + + + + + + + +

+ Tests the assertion that "The ‘contentScriptType’ attribute on the ‘svg’ element specifies the default scripting language" by setting it to an unknown value and checking the script is not executed. + The test uses an unknown (bogus) script language, which looks exactly like ECMAScript. +

+ + +

Load the test.

+
+ +

+ The test is passed if string "Good, script didn't run" is displayed. + It fails if the string "No! This is not ECMAScript!" is displayed. +

+
+ + $RCSfile: script-specify-01-f.svg,v $ + + + + + + + + + + + contentScriptType Test + + + + + Good, script didn't run. + No! This is not ECMAScript! + + + + $Revision: 1.6 $ + + + + + + DRAFT + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-02-f.svg new file mode 100644 index 000000000..f575b7345 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/script-specify-02-f.svg @@ -0,0 +1,69 @@ + + + + + + + + + + +

+ Tests the assertion that "It is also possible to specify the scripting language for each individual ‘script’ element by specifying a ‘type’ on the ‘script’ element." by setting it to an unknown value and checking the script is not executed. + The test uses an unknown (bogus) script language, which looks exactly like ECMAScript. +

+ + +

Load the test.

+
+ +

+ The test is passed if string "Good, script didn't run" is displayed. + It fails if the string "No! This is not ECMAScript!" is displayed. +

+
+ + $RCSfile: script-specify-02-f.svg,v $ + + + + + + + + + + + Test unknown type attribute value on script element + + + + Good, script didn't run. + No! This is not ECMAScript! + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-01-t.svg new file mode 100644 index 000000000..9d8aa46bc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-01-t.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + +

+Tests the circle element +

+ + +

+Run the test. No interaction required. +

+
+ +

+ Six circles are displayed, with position, size, fill and stroke matching the reference image +

+
+ + $RCSfile: shapes-circle-01-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-02-t.svg new file mode 100644 index 000000000..f058462f8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-circle-02-t.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + +

+ Default attributes test with circle. +

+ + +

+ Run the test. No interaction required +

+
+ +

+ The test is passed if a group of four circles is displayed, arranged as shown in the reference image. +

+
+ + $RCSfile: shapes-circle-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-01-t.svg new file mode 100644 index 000000000..9466f0653 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-01-t.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Test the ellipse element. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ Seven ellipses are displayed, with position, size, fill and stroke matching the reference image +

+
+ + $RCSfile: shapes-ellipse-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-02-t.svg new file mode 100644 index 000000000..dff0bf03d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-02-t.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + +

+ Defaults test with ellipse. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if one blue ellipse is shown completely within the test slide, + and a quarter ellipse is shown in the top-left corner of the test slide.

+
+ + $RCSfile: shapes-ellipse-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-03-f.svg new file mode 100644 index 000000000..21e7aec34 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-ellipse-03-f.svg @@ -0,0 +1,72 @@ + + + + + + + + + + +

+ The 'ellipse' element defines an ellipse which is axis-aligned with the current user coordinate system when it is not the initial user coordinate system. +

+

+ The test shows an 'ellipse' element originating at (0,0) of the current user coordinate system, which has been altered via 'transform' from + the initial user coordinate system. Two perpendicular lines which also originate at (0,0) and advance along the x and y axes of + the current user coordinate system are shown. These lines overlap the top and left edges of the ellipse and verifies that the ellipse is + thus axis-aligned with its current user coordinate system. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if both ellipses are divided into four equal parts by two sets of crossing lines, and the rightmost ellipse and crossing lines are rotated together. +

+
+ + $RCSfile: shapes-ellipse-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-grammar-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-grammar-01-f.svg new file mode 100644 index 000000000..50183a9e7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-grammar-01-f.svg @@ -0,0 +1,71 @@ + + + + + + + + + + +

+Check that negative second coordinate in a coordinate pair does not need separating wsp-comma. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+The test is passed if each shape seems to have a double stroke, dark green and light green. +

+
+ + $RCSfile: shapes-grammar-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-01-t.svg new file mode 100644 index 000000000..0060bf71f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-01-t.svg @@ -0,0 +1,108 @@ + + + + + + + + + + + + +

+ Tests the degenerate cases of the basic shapes. The shapes are positioned + within the black rectangles. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the 11 rectangles are empty.

+
+ + $RCSfile: shapes-intro-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Stroked + Unstroked + Zero width rect + Zero height rect + Zero radius circle + Zero x radius ellipse + Zero y radius ellipse + Zero length line + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-02-f.svg new file mode 100644 index 000000000..668ced413 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-intro-02-f.svg @@ -0,0 +1,89 @@ + + + + + + + + + + +

+ Test that basic shape elements are equivalent to a 'path' element that constructs the same shape. +

+

+ For each basic shape, a 'path' reference element that is red is created. + A basic shape is then placed on top of the 'path' element. + For each basic shape there's also a reverse test that uses the shape as a reference for the 'path' element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is no red visible on the page. +

+
+ + $RCSfile: shapes-intro-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-01-t.svg new file mode 100644 index 000000000..ad6338be3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-01-t.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+Tests the line element. +

+ + +

+Run the test. No interaction required. +

+
+ +

+The test is passed if five diagonal lines are displayed on the top row. On the bottom row, a square wave pattern is displayed. The position, size, fill and stroke of the lines matches the reference image. +

+
+ + $RCSfile: shapes-line-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-02-f.svg new file mode 100644 index 000000000..f6f2bbec5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-line-02-f.svg @@ -0,0 +1,57 @@ + + + + + + + + + + +

+ The 'fill' attribute has no effect on the 'line' element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

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

+
+ + $RCSfile: shapes-line-02-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-01-t.svg new file mode 100644 index 000000000..9d4e76e31 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-01-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

+ This test draws six different polygons excercising portions of the path attribute. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The six polygons drawn should match the reference image. +

+
+ + $RCSfile: shapes-polygon-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-02-t.svg new file mode 100644 index 000000000..d0e4e7ad8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-02-t.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+Checks that polygons and the equivalent paths are indeed equivalent. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+The test is passed if each shape seems to have a double stroke, dark green and light green. +

+
+ + $RCSfile: shapes-polygon-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-03-t.svg new file mode 100644 index 000000000..76c1e4038 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polygon-03-t.svg @@ -0,0 +1,58 @@ + + + + + + + + + + +

+ Test that 'polyline' and 'polygon' elements with an odd number of coordinates render up to the invalid coordinate. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if four green triangles are visible on the page, and no red. +

+
+ + $RCSfile: shapes-polygon-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-01-t.svg new file mode 100644 index 000000000..952f1e513 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-01-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+Tests the polyline element. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ The test is passed if polylines are displayed whose position, size, fill and stroke matches the reference image. +

+
+ + $RCSfile: shapes-polyline-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-02-t.svg new file mode 100644 index 000000000..7cc146ee7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-polyline-02-t.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

+Checks that polylines and the equivalent paths are indeed equivalent. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+The test is passed if each shape seems to have a double stroke, dark green and light green. +

+
+ + $RCSfile: shapes-polyline-02-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-01-t.svg new file mode 100644 index 000000000..219a4764f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-01-t.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + +

+ This is a simple test of the rect element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if all four sets of two rectangles are drawn and + they match the reference image. +

+
+ + $RCSfile: shapes-rect-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-02-t.svg new file mode 100644 index 000000000..6c487d5f2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-02-t.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-03-t.svg new file mode 100644 index 000000000..4e51412cc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-03-t.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/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-04-f.svg new file mode 100644 index 000000000..fdd830595 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-04-f.svg @@ -0,0 +1,66 @@ + + + + + + + + + + +

+ 'Rect' elements with unspecified 'rx' and 'ry' attributes will use the specified 'rx' and 'ry' value if the other one is specified; if neither is specified, the 'rect' has square edges. +

+

+ Creates one 'rect' element with an unspecified 'ry'. Places it over a red 'rect' element with both 'rx' and 'ry' specified. Repeat with unspecified 'rx'. Finally creates a 'rect' element that has neither 'rx' or + 'ry' specified. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if the two shapes on top are rounded rectangles, the shape below has square corners, and no red is visible on the page. +

+
+ + $RCSfile: shapes-rect-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-05-f.svg new file mode 100644 index 000000000..85e82a228 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-05-f.svg @@ -0,0 +1,74 @@ + + + + + + + + + + +

+ The 'rect' element defines a rect which is axis-aligned with the default user coordinate system when it is not the initial user coordinate system. +

+

+ Draws a 'rect' element originating at (0,0) of the current user coordinate system, which has been altered via 'transform' from the + initial user coordinate system. Draws perpendicular lines which also originate at (0,0) and advance along the x and y axes of the + current user coordinate system. Verifies that the lines overlap the top and left edges of the rectangle and that the rectangle is + thus axis-aligned with its current user coordinate system. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if the top and left of the rectangle is black while the right and bottom are orange, and the right half of the diamond is orange and the left half is black. +

+
+ + $RCSfile: shapes-rect-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-06-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-06-f.svg new file mode 100644 index 000000000..0f9d4ea53 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-06-f.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 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-07-f.svg new file mode 100644 index 000000000..7dbe04644 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/shapes-rect-07-f.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 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-01-t.svg new file mode 100644 index 000000000..5238f9fb7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-01-t.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + +

+ This test evaluates a switch statement. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Arial) and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The result should be a green rectangle in the lower left quarter of the output window. +

+
+ + $RCSfile: struct-cond-01-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-02-t.svg new file mode 100644 index 000000000..6883e0a85 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-02-t.svg @@ -0,0 +1,585 @@ + + + + + + + + + + + + +

+ This tests ability to use the 'systemLanguage' as a test attribute within a + switch element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ To pass, either the name (in English) of the current system language, or + the names of the three languages (English, French and Japanese) of W3C + must appear. The second case will occur if either the user language is + not one of the (60 or so) languages present in the test, or if there is + no user language information available. +

+

+ It is an error to display no output; the last child of switch has no test, so + it will always be taken unless a more suitable child has already evaluated to true. +

+

+ In addition, the string "Why don't they just speak <language>" should appear + in the center of the graphic, translated into that language. It is not an error for + some or all of this string to display as 'missing character' glyphs, if no + suitable font is available - however, this is unlikely if the language is indeed + the users primary language. (It can easily occur during testing, however). +

+
+ + $RCSfile: struct-cond-02-t.svg,v $ + + + + + + + + + + + + + + Waarom kan hulle nie net doodgewoon Afrikaans praat nie? + Afrikaans + + + ለáˆáŠ•á‹µáŠá‹ አማርኛ የማይናገሩት᧠+ Amharic + + + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + Arabic (SA) + + + Защо те проÑто не могат да говорÑÑ‚ българÑки ? + Bulgarian + + + ওরা েকন বাংলা বলেত পাের না ? + Bengali + + + + Per què no poden simplement parlar en català ? + Catalan + + + ProÄ prostÄ› nemluví Äesky ? + Czech + + + Pam dydyn nhw ddim yn siarad Cymraeg ? + Welsh + + + Hvorfor kan de ikke bare tale dansk ? + Danish + + + + Warum sprechen sie nicht einfach Deutsch ? + German (DE) + + + Μα γιατί δεν μποÏοÏν να μιλήσουν Ελληνικά ; + Greek (modern, GR) + + + Why can't they just speak English ? + English (US) + + + ¿Por qué no pueden simplemente hablar en castellano ? + Spanish (ES) + + + Zergatik ezin dute  Euzkeraz bakarrik hitzegin? + Basque + + + خب، چرا Ùارسى صحبت نمى كنند؟ + Farsi + + + Miksi he eivät yksinkertaisesti puhu suomea ? + Finnish + + + + Pourquoi, tout simplement, ne parlent-ils pas en Français ? + French (FR) + + + Carson nach eil iad a'bruidhinn na Gàidhlige ? + Scots Gaelic + + + બદà«àª§àª¾ લોકો ગà«àªœàª°àª¾àª¤à«€ કૅમ નથી બોલતા? + Gujarti (IN) + + + + למה ×”× ×¤×©×•×˜ ×œ× ×ž×“×‘×¨×™× ×¢×‘×¨×™×ª ? + Hebrew (modern) + + + यह लोग हिनà¥à¤¦à¥€ कà¥à¤¯à¥‹à¤‚ नहीं बोल सकते हैं ? + Hindi + + + ZaÅ¡to jednostavno ne govore hrvatski ? + Croatian + + + Miért nem beszélnek egyszerűen magyarul ? + Hungarian + + + + Ô»Õ¶Õ¹Õ¸Ö‚Õž Õ¶Ö€Õ¡Õ¶Ö„ Õ¹Õ¥Õ¶ Õ­Õ¸Õ½Õ¸Ö‚Õ´ Õ€Õ¡ÕµÕ¥Ö€Õ¥Õ¶ + + Armenian + + + Mengapa mereka tidak bisa bicara bahasa Indonesia ? + Indonesian + + + Hvers vegna geta þeir ekki réttlátur tala Ãslenska ? + Icelandic + + + Perchè non possono semplicemente parlare italiano ? + Italian + + + + ᓱᒻᒪᓂᒃᑯአáƒá“„ᒃᑎᑠá‘áƒá“ᓇᔭᙱᓚᑦ + Inuktitut + + + ãªãœã€ã¿ã‚“ãªæ—¥æœ¬èªžã‚’話ã—ã¦ãã‚Œãªã„ã®ã‹ï¼Ÿ + Japanese (JP) + + + Kenapa kok ora nganggo  basa Jawa  wae? + Javanese + + + რáƒáƒ¢áƒáƒ› áƒáƒ  ლáƒáƒžáƒáƒ áƒáƒ™áƒáƒ‘ენ ისინი ქáƒáƒ áƒ—ულáƒáƒ“ ? + Georgian + + + Олар неге қазақ Ñ‚iлiнде Ñойлемейдi? + Kazakh + + + ಅವರೠಕನà³à²¨à²¡ ಮಾತನಾಡಬಹà³à²¦à²²à³à²²à²¾? + Kannada + + + ì„¸ê³„ì˜ ëª¨ë“  ì‚¬ëžŒë“¤ì´ í•œêµ­ì–´ 를 ì´í•´í•œë‹¤ë©´ 얼마나 좋ì„까? + Korean + + + Емне үчүн алар кыргызча Ñүйлбйт? + Kirghiz + + + KodÄ—l gi jie nekalba lietuviÅ¡kai ? + Lithuanian + + + Зошто тие едноÑтавно не говорат македонÑки ? + Macedonian + + + लोकांना मराठी का बोलता येत नाही? + Marathi + + + Waarom spreken ze niet gewoon Nederlands ? + Dutch + + + Hvorfor kan de ikke bare snakke norsk ? + Norwegian + + + ସେମାନେ ଉଡିଯା ରେ କହିନà­à¬•à¬¿ କହିବେ ନହିà¬? + Oriya + + + Dlaczego oni nie mówiÄ… po polsku ? + Polish + + + + Porque é que eles não falam simplesmente em Português ? + Portugese (PT) + + + Porque é que eles não falam em Português (do Brasil) ? + Portugese (BR) + + + Porque é que eles não falam simplesmente em Português ? + Portugese + + + De ce ei nu vorbesc moldoveneÅŸte ? + Romanian + + + Почему же они не говорÑÑ‚ по-руÑÑки ? + Russian + + + ते किं संसà¥à¤•à¥ƒà¤¤à¤ƒ माम वदनà¥à¤¤à¤¿ ? + Sanskrit + + + ZaÅ¡to jednostavno ne govore srpski ? + Serbian + + + අà·à¶ºà·’ ඔවුන්ට ඉංගරිස කත෠ෛනබ ? + Sinhalese + + + + Zakaj vendar ne govorijo slovensko ? + Slovenian + + + Pse nuk duan të flasin vetëm shqip ? + Albanian + + + Varför pratar dom inte bara svenska ? + Swedish + + + அவரà¯à®•à®³à¯ à®à®©à¯ தமிழில௠பேசகà¯à®•à¯‚டாத௠? + Tamil + + + + తెలà±à°—ౠలో à°Žà°‚à°¦à±à°•à± మాటà±à°²à°¾à°¡à°°à±? + + Telugu + + + ÄŒaro onho ba zaboni toÄiki gap namezanand? + Tajik + + + ทำไมเขาถึงไม่พูด ภาษาไทย + Thai + + + Bakit hindi na lang sila magsalita ng Tagalog ? + Tagalog (Filipino) + + + Neden Türkçe konuÅŸamıyorlar? + Turkish + + + Ðишләп олар татарча Ñүләша алмыйлар? + Tatar + + + Чому б їм не розмовлÑти українÑькою ? + Ukranian + + + ﻦﻴﻫ ﻰﺘﻠﻭﺒ ﻦﻴﻬﻨ ﻦﻭﻴﻜ ﻮﺪﺭﺃ بس ﻮﻩ ﻟﻮﮒ؟ + Urdu (IN) + + + ﻦﻴﻫ ﻰﺘﻠﻭﺒ ﻦﻴﻬﻨ ﻦﻭﻴﻜ ﻮﺪﺭﺃ بس ﻮﻩ ﻟﻮﮒ؟ + Urdu (PK) + + + + Nega ular uzbek tilinda gapirmaidilar? + Uzbek + + + TaÌ£i sao hoÌ£ không thể chỉ noÌi tiêÌng Việt ? + Vietnamese + + + פֿ×ַרװ×ָס רעדט מען ניט פּשוט ייִדיש ? + Yiddish + + + 他们为什么ä¸è¯´ä¸­æ–‡ (中国) ? + Chinese (CN) + + + 他們爲什麽ä¸èªªä¸­æ–‡ï¼ˆå°ç£ï¼‰ï¼Ÿ + Chinese (TW) + + + + You have no (matching) language preference set + ãªãœã€ã¿ã‚“ãªæ—¥æœ¬èªžã‚’話ã—ã¦ãã‚Œãªã„ã®ã‹ï¼Ÿ + Why can't they just speak English ? + Pourquoi, tout simplement, ne parlent-ils pas en Français ? + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-03-t.svg new file mode 100644 index 000000000..93d54901d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-03-t.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

+ Tests the <switch> element with requiredFeatures. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ On the bottom half of the test, there is a first switch. + Because SVG Tiny does not support DOM, an SVG Tiny implementation + which does not support other SVG Profiles should show a green + rectangle. If the application supports the DOM, meaning that + it does more than just SVG Tiny, it should show a turquoise rectangle. +

+

+ On the bottom half of the test, there is another switch. + The first child has a requiredFeatures set to + http://www.w3.org/TR/SVG11/feature#BasicText which all + SVG Tiny implementations should support. If the application + does, another green rectangle is displayed. Otherwise, + a red rectangle shows. +

+
+ + $RCSfile: struct-cond-03-t.svg,v $ + + + + + + + + + + + + This viewer does more than SVG Tiny + + + + + + + + + + + + + This is not an SVG Tiny Viewer + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-02-f.svg new file mode 100644 index 000000000..f3b14d221 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-02-f.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

+ Test that 'use' instances of elements with failing conditional processing attributes are not rendered. +

+

+ Six blue 'rect' elements are defined. For each conditional processing attribute, a black 'rect' element is defined with that particular conditional + processing attribute set to an arbitrary string that would cause the attribute's requirement test to fail. Each of the black 'rect' elements is + positioned so that it would completely cover the blue 'rect' if it were visible. A corresponding 'use' element is defined for each black 'rect' + and is positioned such that it would cover the remaining three blue 'rect' elements. The six blue 'rect' elements should be visible. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passes if six blue boxes are visible on the page. +

+
+ + $RCSfile: struct-cond-overview-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-03-f.svg new file mode 100644 index 000000000..03d76f187 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-03-f.svg @@ -0,0 +1,61 @@ + + + + + + + + + + +

+ Test that conditional processing attributes set to an empty string are evaluated as false. +

+

+ Three blue 'rect' elements are in the document. For each of the + conditional processing attributes, a black 'rect' element is + specified with a conditional processing attribute set to an empty string. + The black 'rect' is positioned so that it would completely cover the + blue 'rect' if it were visible. The three blue 'rect' + elements should be visible. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passes if three blue boxes are visible on the page. +

+
+ + $RCSfile: struct-cond-overview-03-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-04-f.svg new file mode 100644 index 000000000..72da2a331 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-04-f.svg @@ -0,0 +1,58 @@ + + + + + + + + + + +

+ Test that elements with conditional processing attributes that evaluate to true do not render if their parent contains conditional processing attributes that evaluate to false. +

+

+ The test has a 'g' element with its 'requiredFeatures' attribute set to an arbitrary feature string that would cause the attribute's requirement test to fail. + A red 'rect' element is a child node of the 'g' element. The 'rect' element has the 'requiredFeatures' attribute set to a supported feature string. + 'http://www.w3.org/TR/SVG11/feature#ConditionalProcessing' was chosen as a valid feature string to reduce dependencies on other SVG features. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passed if there is no red visible on the page. +

+
+ + $RCSfile: struct-cond-overview-04-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-05-f.svg new file mode 100644 index 000000000..68f026cf6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-cond-overview-05-f.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + +

+ Elements whose parent elements have failing conditional processing attributes are able to be referenced and rendered by 'use' elements. +

+

+ Define three 'rect' elements that have a 'g' parent with either an invalid 'requiredFeature', 'requiredExtension', or 'systemLanguage'. + Then define three 'use' elements that reference the 'rect' elements. Verify that the 'use' elements render. +

+ + +

+ Run the test. No interaction required +

+
+ +

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

+
+ + $RCSfile: struct-cond-overview-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-defs-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-defs-01-t.svg new file mode 100644 index 000000000..d80888019 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-defs-01-t.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + +

+ Test to verify that the defs element is used as a container correctly. +

+

+ In this test a fill is created which is solid green. The view should be a solid green rectangle + centered in the viewport 100 pixels from from left,top and right,bottom. Also, in the + defs sections there are rectangle defined, one to paint over the entire canvas with + a red fill and the other to obscure most of the green rectangle. +

+ + +

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ +

+ A green rectangle should be visible, and no red. +

+
+ + $RCSfile: struct-defs-01-t.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-01-b.svg new file mode 100644 index 000000000..a7c379e76 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-01-b.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the SVG DOM API. +

+

+ The test is composed of a top + level svg element with an 'onload' event handler and a rect element. Both + the svg and the rect elements have an identifier. The 'onload' handler + invokes SVG-specific DOM API methods which use these identifiers. +

+

+ First, the handler gets the SVG element owner of the rect element and checks it has + the expected identifier. Then, the handler accesses the coordinates of the rect element + and uses them to build a 'shadow' rectangle under the existing one. Finally, the 'shadow' + rectangle is created using the SVGSVGElement's createSVGRect method. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if:

+
    +
  • The text "This document's root identifier is: svg-root" is shown.
  • +
  • A green rectangle with a black shadow is shown.
  • +
+
+ + $RCSfile: struct-dom-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-02-b.svg new file mode 100644 index 000000000..6ac422b43 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-02-b.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the hasFeature DOMImplementation method. + The DOMImplementation instance is retrieved from the Document instance. Then, + its hasFeature method is invoked on the various SVG feature strings. +

+

+ The test displays the set of SVG feature strings and, next to them, a text + string that shows whether the feature is supported or not. +

+

+ Note that this test uses the 'onload' event on the root svg element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for the true and + false values which may differ depending on the implementation. +

+

+ Note that the test passes whether or not the feature is supported (i.e., true or + false are valid). The test fails if no value (true or false) appears next to the feature string + value. +

+
+ + $RCSfile: struct-dom-02-b.svg,v $ + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-03-b.svg new file mode 100644 index 000000000..657466d65 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-03-b.svg @@ -0,0 +1,120 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the hasFeature DOMImplementation method. + The DOMImplementation instance is retrieved from the Document instance. Then, + its hasFeature method is invoked on the various SVG feature strings. +

+

+ The test displays the set of SVG feature strings and, next to them, a text + string that shows whether the feature is supported or not. +

+

+ Note that this test uses the 'onload' event on the root svg element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for the true and + false values which may differ depending on the implementation. +

+

+ Note that the test passes whether or not the feature is supported (i.e., true or + false are valid). The test fails if no value (true or false) appears next to the feature string + value. +

+
+ + $RCSfile: struct-dom-03-b.svg,v $ + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-04-b.svg new file mode 100644 index 000000000..afc0efeda --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-04-b.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the hasFeature DOMImplementation method. + The DOMImplementation instance is retrieved from the Document instance. Then, + its hasFeature method is invoked on the various SVG feature strings. +

+

+ The test displays the set of SVG feature strings and, next to them, a text + string that shows whether the feature is supported or not. +

+

+ Note that this test uses the 'onload' event on the root svg element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for the true and + false values which may differ depending on the implementation. +

+

+ Note that the test passes whether or not the feature is supported (i.e., true or + false are valid). The test fails if no value (true or false) appears next to the feature string + value. +

+
+ + $RCSfile: struct-dom-04-b.svg,v $ + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-05-b.svg new file mode 100644 index 000000000..4667a14ef --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-05-b.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the hasFeature DOMImplementation method. + The DOMImplementation instance is retrieved from the Document instance. Then, + its hasFeature method is invoked on the various SVG feature strings. +

+

+ The test displays the set of SVG feature strings and, next to them, a text + string that shows whether the feature is supported or not. +

+

+ Note that this test uses the 'onload' event on the root svg element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image, except for the true and + false values which may differ depending on the implementation. +

+

+ Note that the test passes whether or not the feature is supported (i.e., true or + false are valid). The test fails if no value (true or false) appears next to the feature string + value. +

+
+ + $RCSfile: struct-dom-05-b.svg,v $ + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-06-b.svg new file mode 100644 index 000000000..b9f51cee4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-06-b.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + +

+ Verify the basic capability to handle the DOM API. The test is composed of a top + level svg element with an onload event handler. This handler invokes core (i.e., non + SVG specific) DOM API methods to modify the document's content: it removes an element, + modifies an attribute and adds elements. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if the text "DOM API is supported" is shown, the text + "Removing DOM Elements is not supported" is not shown, and no red is + visible.

+
+ + $RCSfile: struct-dom-06-b.svg,v $ + + + + + + + + + + + + + + + + + + + + Removing DOM Elements is not supported + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-07-f.svg new file mode 100644 index 000000000..0c212849f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-07-f.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + +

+ The svg contains three use elements that each reference three rects from an svg element in the document. + Before the onload-script is run there should be 9 red rects visible. The script changes the fill of the rects to be green. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if 9 green rectangles are shown. +

+
+ + $RCSfile: struct-dom-07-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-08-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-08-f.svg new file mode 100644 index 000000000..fd248ce7a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-08-f.svg @@ -0,0 +1,84 @@ + + + + + + + + + + +

+ This tests that SVGSVGElement.unsuspendRedraw() does not + throw an exception if the redraw suspend timeout has elapsed. + After loading the test, wait for one second. Some time + before the one second has elapsed, the rectangle should change + color to indicate the result of the test: black if the test + did not run, red if the test failed and green if the test + passed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the rectangle is green one + second after the test is loaded. +

+
+ + $RCSfile: struct-dom-08-f.svg,v $ + + + + + + + + + + Test that unsuspendRedraw() doesn't throw + + + + + + $Revision: 1.8 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-11-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-11-f.svg new file mode 100644 index 000000000..869f8c54e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-11-f.svg @@ -0,0 +1,168 @@ + + + + + + + + + + +

+ This tests that the getIntersectionList() and getEnclosureList() + methods return NodeLists that are not live. +

+

+ After loading the test, two rectangles will be presented. The + upper rectangle indicates the result of testing whether + getIntersectionList() returns a non-live NodeList, while the + lower rectangle indicates so for getEnclosureList(). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if both rectangles are green. +

+
+ + $RCSfile: struct-dom-11-f.svg,v $ + + + + + + + + + + Test getIntersectionList and getEnclosureList return value liveness + + + getIntersectionList + + + getEnclosureList + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-12-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-12-b.svg new file mode 100644 index 000000000..c5746ff3e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-12-b.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + +

+ This test checks two properties from the SVGElementInstance interface, correspondingElement and correspondingUseElement +

+ + +

+ Click the grey rectangle on the right side. +

+
+ +

+ For the test to pass, both lines starting with "Test for" must turn to green + when the grey rectangle on the right side is clicked, and the grey rectangle + must also turn green. +

+
+ + $RCSfile: struct-dom-12-b.svg,v $ + + + + + + + + + + + + + + + + + Click on the grey rectangle to start + Test for correspondingUseElement + Test for correspondingElement + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-13-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-13-f.svg new file mode 100644 index 000000000..028288e6a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-13-f.svg @@ -0,0 +1,167 @@ + + + + + + + + + + +

+ Test for checkIntersection and getIntersectionList. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test passes if 17 green rectangles are displayed and if the legend indicates PASSED. +

+
+ + $RCSfile: struct-dom-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-14-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-14-f.svg new file mode 100644 index 000000000..1f0bb8625 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-14-f.svg @@ -0,0 +1,112 @@ + + + + + + + + + + +

+ Test SVGElementInstance.childNodes. +

+

+ The test has an optional subtest that indicates whether SVGElementInstance.firstChild and + SVGElementInstance.childNodes.item(0) are strictly equal. The status of this subtest is + displayed by a circle in the middle of the testframe, it will be yellow if the objects are + not strictly equal, and green if they are. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is a green rect visible, + and there is a yellow or dark green circle in the middle. + If there's any red visible the test has failed. +

+
+ + $RCSfile: struct-dom-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-15-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-15-f.svg new file mode 100644 index 000000000..b5329b690 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-15-f.svg @@ -0,0 +1,139 @@ + + + + + + + + + + +

+ Test SVGElementInstance and EventTarget.dispatchEvent. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are three green circles visible, and no red. +

+
+ + $RCSfile: struct-dom-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-16-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-16-f.svg new file mode 100644 index 000000000..7747c72f0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-16-f.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + +

+ The 'SVGSVGElement' interface allows for creation of references to various primitive SVG interface types with explicitly defined default values. +

+

+ A reference to an 'SVGSVGElement' is obtained through an 'svg' element in the page's markup. Each of the 'CreateSVG*' methods is called from this + reference and initial values are verified. A counter is used to determine whether all conditions are satisfied. The word 'fail' in red via an SVG + 'text' element is used to indicate failure and the word 'pass' in black is used to indicate passing. +

+ + +

+ Run the test. No interaction required. +

+
+ +

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

+
+ + $RCSfile: struct-dom-16-f.svg,v $ + + + + + + + + + + FAIL + PASS + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-17-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-17-f.svg new file mode 100644 index 000000000..26121e794 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-17-f.svg @@ -0,0 +1,104 @@ + + + + + + + + + + +

+ Tests that the 'getElementById' method for the 'SVGSVGElement' interface is scoped. +

+

+ Two subtrees of 'svg' elements are used, each with 'rect' elements as children. A reference to the first 'svg' element is obtained via the + 'document' element's 'getElementById' method. This reference is used to verify the presence of 'getElementId'. Next, 'getElementById' on + the 'SVGSVGElement' reference is used to locate its child element. Then, 'getElementById' attempts to get an element in a neighboring subtree. + Finally, an element at the sibling level is attempted to be accessed via 'getElementById'. +

+ + + + +

+ The test is passed if there is no red visible on the page. +

+
+ + $RCSfile: struct-dom-17-f.svg,v $ + + + + + + + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-18-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-18-f.svg new file mode 100644 index 000000000..27977a221 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-18-f.svg @@ -0,0 +1,147 @@ + + + + + + + + + + +

+ +

+ + +

+ +

+
+ +

+ +

+
+ + $RCSfile: struct-dom-18-f.svg,v $ + + + + + + + + + + + + + + + + + + + Filler text + + FAIL + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-19-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-19-f.svg new file mode 100644 index 000000000..839a202ef --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-19-f.svg @@ -0,0 +1,92 @@ + + + + + + + + + + +

+ Test that the 'SVGElementInstanceList' element's 'length' attribute correctly reflects the implied element hierarchy on recursive 'use' instances. +

+

+ The test has a 'use' element referencing a 'g' element with another 'use' element referencing the 'use' element. The 'instanceRoot' of the + most indirect 'use' element is used to access the corresponding 'SVGElementInstance'. The test passes if the 'childNodes' attribute's 'length' + attribute for the most indirect 'SVGElementInstance' has a value of '1' and the 'childNodes' attribute's 'length' attribute for the most direct + 'SVGElementInstance' has a value of '0'. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is no red visible on the page. +

+
+ + $RCSfile: struct-dom-19-f.svg,v $ + + + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-20-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-20-f.svg new file mode 100644 index 000000000..09018aea5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-dom-20-f.svg @@ -0,0 +1,139 @@ + + + + + + + + + + +

+ Test SVGElementInstance and EventTarget.dispatchEvent. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are two green circles visible, and no red. +

+
+ + $RCSfile: struct-dom-20-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-01-t.svg new file mode 100644 index 000000000..6fe9bcc33 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-01-t.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + +

+ This is an empty SVG document. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Nothing should be rendered by the User Agent. +

+
+ + $RCSfile: struct-frag-01-t.svg,v $ + + + + + + + + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-02-t.svg new file mode 100644 index 000000000..c52f89469 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-02-t.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + +

+ This test validates the use of the preserveAspectRatio attribute on the + root svg element in an SVG Tiny document. In this document, preserveAspectRatio + is set to none and the width and height of the document set to 100%. +

+

+ The document's viewBox is defined to be 100 by 100 with an origin + in (100, 100). The content is made of 2 red squares and 2 + orange circles. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Because preserveAspectRatio is set to 'none', the content should + appear distorted (if the aspect ratio is not 1): squares show as rectangles and circles show as + ellipses. +

+
+ + $RCSfile: struct-frag-02-t.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-03-t.svg new file mode 100644 index 000000000..9d73f8b1e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-03-t.svg @@ -0,0 +1,66 @@ + + + + + + + + + + + + +

+ This test validates the use of the preserveAspectRatio attribute on the + root svg element in an SVG Tiny document. In this document, preserveAspectRatio + is set to 'xMidYMid meet' and the width and height of the document set to 100%. +

+

+ The document's viewBox is defined to be 100 by 100 with an origin + in (100, 100). The content is made of 2 red squares and 2 + orange circles. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Because preserveAspectRatio is set to 'xMidYMid meet', the content should + appear centered within the viewport: squares show as squares (and not + rectangles) and circles show as circles (and not ellipses). +

+
+ + $RCSfile: struct-frag-03-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-04-t.svg new file mode 100644 index 000000000..bd2fdc7e9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-04-t.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

+ This test validates the operation of the svg element when there is no + viewbox. +

+

+ The document has x/y attributes set to (1000, 1000). Because + x/y are ignored on the root svg element, the x/y origin should have no + effect on the drawing. +

+

+ The document contains squares and circles between the + (100,100) and (200, 200) coordinates. +

+ + +

Run the test. No interaction required. If the test is run outside of the harness, the operator may resize the viewport.

+
+ +

The rendered picture should match the reference image. Changing the viewport + size should have no effect on the placement or scale of the document's content.

+
+ + $RCSfile: struct-frag-04-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-05-t.svg new file mode 100644 index 000000000..a7d2e9430 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-05-t.svg @@ -0,0 +1,86 @@ + + + + + + + + + + + + +

+ This tests that XML Namespaces are correctly implemented, in that the tuple + of local name and namespace URI, rather than the prefix, is important. +

+

+ The first subtest is a + group where the namespace prefix s is bound to the SVG namespace and an s:circle is drawn + in pale yellow. The same group declares the default namespace to be a non-SVG namespace; the + blue circle element in that namespace must not be drawn. +

+

+ The second subtest puts the namespace declarations on the elements themselves. The + prefix toto is bound to the SVG namespace and the XLink namespace is made the default namespace. + Thus, the blue <toto:a href="uri">Valid</toto:a> is a valid link and must be traversable. Select this link, + then go back to the test. +

+

+ The third subtest has no prefix on the element name 'a' and uses the usual xlink: prefix on the href + attribute. However, both the default namespace and the namespace bound to the xlink prefix are + dummy namespaces. Not only should the link not be traversable, it must not even display at all. + If the text 'Invalid' is displayed, the test fails. +

+ + +

Run the test and click on the "Valid" link.

+
+ +

The test passes if the following conditions are met:

+
    +
  • A yellow circle is shown.
  • +
  • A blue circle is not shown.
  • +
  • The text "Valid" is shown in blue.
  • +
  • The text "Invalid" is not shown.
  • +
  • Clicking "Valid" navigates to the "TOC & index of linking tests" document, linkingToc-t.svg.
  • +
+
+ + $RCSfile: struct-frag-05-t.svg,v $ + + + + + + + + + + + + + + + Valid + + + Invalid + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-06-t.svg new file mode 100644 index 000000000..8f22f0d03 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-frag-06-t.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ This test adds testing of some basic XML features SVG User Agents + should support. +

+

+ First, the test checks support for the default entities amp, lt, gt, apos + and quot. This is what the first line shows in gray. +

+

+ Second, the test checks support for hexadecimal and decimal character + entities, as shown in the second line, again in gray +

+

+ Finally, the last line shows usage of an entity defined in the + document's internal DTD subset. The same geometry (a path) is + reused twice, once filled in gray and ones stroked in gray. +

+ + +

Run the test. No interaction required.

+
+ +

The test passes if the following conditions are met:

+
    +
  • The text string &, <, >, ', " is shown in gray.
  • +
  • The text string A hexadecimal (&#x41)= A is shown in gray.
  • +
  • The text string A decimal (&#65)= A is shown in gray.
  • +
  • Two octagons are shown: one gray filled, and one gray stroked & unfilled.
  • +
+
+ + $RCSfile: struct-frag-06-t.svg,v $ + + + + + + + + + Default entities: amp, lt, gt, apos, quot: + &, <, >, ', " + Character references: + A hexadecimal (&#x41)= A + A decimal (&#65)= A + Entity references: + gray + + + + outlined + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-01-t.svg new file mode 100644 index 000000000..3326f1d8c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-01-t.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + +

+ The test checks to see that graphics elements (g) can be nested and that the like attributes can be passed to the children. + All the g elements for this test are in the g element whose id=allGs. +

+ + +

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family and font-size properties. +

+

+ The two blue rectangles and the yellow are in the g labeled rects. + The blue rectangles inherit a fill color the green rect has a fill specified and it should not be overwritten. + The two yellow rectangles should inherit the fill color and the transform attribute, they should be + yellow and rotated at -20 degrees. These two rectangles are in g "yellowNrotate", that g is nested + inside g "gratuitiousG". The black rectangle in the upper right, has no attributes inherited from its parent. + The focus is nesting of g elements and passing on of attributes. +

+
+ +

+ The rendered picture should match the reference image, except for possible + variations in the labelling text (per CSS2 rules). +

+
+ + $RCSfile: struct-group-01-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-02-b.svg new file mode 100644 index 000000000..bbc2a59af --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-02-b.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + +

+ The purpose of this test is to check the nesting of SVG elements. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family and font-size properties. +

+

+ There are 4 svg elements in the test. + The first defines the outer square at 480x360. + The second whose id is lowerRight defines a green rectangle which is 1/4 of the outer svg element. + The third svg whose id is upperLeft defines a region that is the upper 1/4 of the outer svg, + it is filled with a blue rectangle. It has a child svg element that defines an area + half again the size of its parent but sharing the same center point, it is filled with a yellow rectangle. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if: +

+
    +
  • There is a green rectangle covering 1/4 of the testframe area positioned in the lower right corner.
  • +
  • There is a blue rectangle covering 1/4 of the testframe area positioned in the upper left corner.
  • +
  • There is a yellow rectangle centered inside the blue rectangle, covering half of the area of the blue rectangle.
  • +
+
+ + $RCSfile: struct-group-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-03-t.svg new file mode 100644 index 000000000..975e707da --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-group-03-t.svg @@ -0,0 +1,285 @@ + + + + + + + + + + + + +

+ This test validates that properties are inherited (or not, depending on + their defintion), from a group to its children. +

+ + +

+ [[ + Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test. + ]] +

+
+ +

+ The two rows displayed in this test should be identical. In the top row, + each property is set to the value 'inherit'. In the bottom row, which is + the reference, each property is set to the value that should be inherited + in the top row. +

+
+ + $RCSfile: struct-group-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + color + display + fill + fill-rule + stroke + stroke-dasharray + stroke-dashoffset + stroke-linecap + stroke-linejoin + stroke-miterlimit + stroke-width + visibility + font-family + font-size + font-style + font-weight + text-anchor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + + A + + + + A + + + + A + + + + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + + A + + + + A + + + + A + + + + A + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-01-t.svg new file mode 100644 index 000000000..441e62f8a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-01-t.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + +

+ The image test case checks to see if the required raster image formats are supported. +

+

+ The upper right has an JPEG image, the lower right has a PNG image. They are + the same image. + Those positions are relative to the upper left of the entire canvas. + If any of the components are missing, then an image format is not being + properly supported. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if two identical images are shown.

+
+ + $RCSfile: struct-image-01-t.svg,v $ + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-02-b.svg new file mode 100644 index 000000000..403fdefbd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-02-b.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + +

+ To test the 9 structure elements and their relationships. +

+

+ S1 tests the defs element and the rendering of an image via the use element. + S2 tests the defs element and the use element by creating an svg element + that contains a blue rectangle. S3 tests the nesting of an SVG element, a + separate graphics element is defined, its coords relative to the svg element. + S4 tests a switch statement, if there is not a green rectangle showing in + S4 there is probably a problem processing a switch. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the upper left rectangle shows an image, + the upper right a blue rectangle, the lower left a cyan rectangle + and the lower right a green rectangle. +

+
+ + $RCSfile: struct-image-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-03-t.svg new file mode 100644 index 000000000..88487322b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-03-t.svg @@ -0,0 +1,66 @@ + + + + + + + + + + +

+ This test verifies the support for gamma correction of displayed PNG + images. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Several different images are displayed one above the other; + if gamma correction is correctly performed based on the values in + the gAMA chunk in the PNG file, the resulting displayed values are + the same in all of the files (except for rounding error, which gives + some artefacts at the right side of the lowest two images due to the + very high levels of gamma correction needed for this test) +

+
+ + $RCSfile: struct-image-03-t.svg,v $ + + + + + + + + + + + + + + + Gamma correction + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-04-t.svg new file mode 100644 index 000000000..6b4edff3d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-04-t.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + +

+ The image test case checks to see if the basic image formats allowed in + are supported using the data: URI schema and base64 encoding. +

+

+ The upper right has an JPG image the lower right has a PNG image. They are + the same image. + Those positions are relative to the upper left of the entire canvas. + If any of the components are missing, then an image format is not being + properly supported. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if two identical images are shown.

+
+ + $RCSfile: struct-image-04-t.svg,v $ + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-05-b.svg new file mode 100644 index 000000000..f171ff2c9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-05-b.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + +

+ The image test case checks to see if the svg image format are supported. +

+

+ The test uses the 'rect' element, as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family and font-size properties. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rendered picture should match the reference image showing two rectangles, one blue and one yellow. +

+
+ + $RCSfile: struct-image-05-b.svg,v $ + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-06-t.svg new file mode 100644 index 000000000..3322da230 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-06-t.svg @@ -0,0 +1,104 @@ + + + + + + + + + + + + +

+ Check that all the preserveAspectRatio values are supported + for the <image> element. In particular, check that + values which are not supported on the svg element's + preserveAspectRatio are supported for <image>. +

+ + +

Run the test. No interaction required.

+
+ +

The test shows four smiley images: the leftmost one is the reference, + and the three on the right are the three sub-tests. The test is passed + if the following conditions are met: +

+
    +
  • The image in the first sub-test is shown within the blue rectangle, + its aspect ratio preserved and with white bars between the blue rectangle + and the left and right edges of the image.
  • +
  • The image in the second sub-test is shown within the blue rectangle, + its aspect ratio preserved and with white bars between the blue rectangle + and the top and bottom edges of the image.
  • +
  • The image in the third sub-test is shown stretched, having the same + size as the blue rectangle shown on the left of the test slide underneath + the text "Viewport 2".
  • +
+
+ + $RCSfile: struct-image-06-t.svg,v $ + + + + + + + + + + Example PreserveAspectRatio - demonstrate available options + SVG to fit + + + + Viewport 1 + + + + Viewport 2 + + + + + ---------- meet ---------- + + xMid* + + + + + + ---------- meet ---------- + + *YMid + + + + + + ---------- meet ---------- + + *none + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-07-t.svg new file mode 100644 index 000000000..e8ad6299c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-07-t.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + +

+ This test validates that xml:base is properly handled on the + <image> element. +

+

+ It shows the same image three times, with different xml:base and + xlink:href values. +

+ + +

Run the test. No interaction required.

+
+ +

The test is passed if three smiley face images are shown.

+
+ + $RCSfile: struct-image-07-t.svg,v $ + + + + + + + + + + + + no + xml:base + + + + + + xml:base + on image + + + + + + xml:base + on parent + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-08-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-08-t.svg new file mode 100644 index 000000000..b712be813 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-08-t.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + +

+ Tests PNG images with alpha. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The result should be identical to the reference image. +

+
+ + $RCSfile: struct-image-08-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-09-t.svg new file mode 100644 index 000000000..f854040d1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-09-t.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + +

+ Tests PNG images with pallete ransparency (tRNS chunk). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The result should be identical to the reference image. +

+
+ + $RCSfile: struct-image-09-t.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-10-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-10-t.svg new file mode 100644 index 000000000..bf9b3a021 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-10-t.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + +

+ Tests PNG greyscale images with alpha. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The result should be identical to the reference image. +

+
+ + $RCSfile: struct-image-10-t.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-11-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-11-b.svg new file mode 100644 index 000000000..4b7e3d6ba --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-11-b.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + +

+ Test interactivity in an svg image referenced by an 'image' element. +

+

+ This test requires support for CSS2 and referencing SVG and PNG images via the 'image' element. +

+ + +

+ Click each of the three rectangles in the center of the testframe once. +

+
+ +

+ The test is passed if all three rectangles are green after being clicked once each. +

+
+ + $RCSfile: struct-image-11-b.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-12-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-12-b.svg new file mode 100644 index 000000000..7e89072d9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-12-b.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ [[Describe which section and what specific assertion is being tested + by the test. If the test has a number of sub tests, multiple + "testComponent" elements can be specified within the "testDescription" + element.]] +

+ + +

+

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: struct-image-12-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-13-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-13-f.svg new file mode 100644 index 000000000..880907a05 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-13-f.svg @@ -0,0 +1,124 @@ + + + + + + + + + + +

+ Tests that different PNG image types are correctly handled. These images are non-interlaced. +

+

+ This test uses the + PNG Group test suite + created by Willem van Schaik. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if all the small PNG icons are displayed as in the reference image. +

+
+ + $RCSfile: struct-image-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Greyscale, various bit depths, two with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Truecolor and indexed, various bit depths, two with alpha + + Non-interlaced images + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-14-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-14-f.svg new file mode 100644 index 000000000..f6531648d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-14-f.svg @@ -0,0 +1,124 @@ + + + + + + + + + + +

+ Tests that different PNG image types are correctly handled. These images are interlaced. +

+

+ This test uses the + PNG Group test suite + created by Willem van Schaik. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if all the small PNG icons are displayed as in the reference image. +

+
+ + $RCSfile: struct-image-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Greyscale, various bit depths, two with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Truecolor and indexed, various bit depths, two with alpha + + Interlaced images + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-15-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-15-f.svg new file mode 100644 index 000000000..6b406cf73 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-15-f.svg @@ -0,0 +1,138 @@ + + + + + + + + + + +

+ The first row tests that alpha PNG images are correctly displayed as part of an SVG image, + ignoring the background colour in the image which is only used to display the + PNG image stand-alone. +

+

The second row tests indexed PNG transparency (tRNs), again checking that + the background color is ignored when displayed as part of an SVG image. +

+

+ This test uses the + PNG Group test suite + created by Willem van Schaik. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if all the small PNG icons are displayed as in the reference image. +

+
+ + $RCSfile: struct-image-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color, with alpha + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Background color, with transparency + + Handling bKGd and tRNs + + + + + + $Revision: 1.2 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-16-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-16-f.svg new file mode 100644 index 000000000..ba01ef355 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-16-f.svg @@ -0,0 +1,57 @@ + + + + + + + + + + +

+ Test that the 'image' element loads the same resources as when it's standalone. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there's a green rectangle visible, and no red. +

+
+ + $RCSfile: struct-image-16-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-17-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-17-b.svg new file mode 100644 index 000000000..1d78cf3ab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-17-b.svg @@ -0,0 +1,52 @@ + + + + + + + + + + + + +

Verifies that SVG images referenced from an <image> element + do not have any scripting or animation run.

+

The referenced SVG image has a green rectangle. If either animation or + script runs, it will turn the rectangle red.

+ + +

Run the test. No interaction required.

+
+ +

The rendered picture should match the reference image.

+

If the rectangle is red, the test has failed.

+
+ + $RCSfile: struct-image-17-b.svg,v $ + + + + + + + + + Test that SVG images in <image> are not scripted or animated + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-18-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-18-f.svg new file mode 100644 index 000000000..2e5f99c85 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-18-f.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + +

+ Test referencing an svg from an 'image' element, where the referenced + svg has no viewBox and a larger width and height than the 'image' + element viewport. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if a green quarter circle with black stroke is displayed, and no red. +

+
+ + $RCSfile: struct-image-18-f.svg,v $ + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-19-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-19-f.svg new file mode 100644 index 000000000..9a52ccd24 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-image-19-f.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + +

+ Test referencing an svg from an 'image' element, where the referenced + svg has a viewBox and a larger width and height than the 'image' + element viewport. +

+

+ The same image resource is reference twice, and will scale to fit the + viewport that is established by the 'image' element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if two green circles are displayed, and no red. +

+
+ + $RCSfile: struct-image-19-f.svg,v $ + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-01-f.svg new file mode 100644 index 000000000..efa06ed2d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-01-f.svg @@ -0,0 +1,123 @@ + + + + + + + + + + +

+ The default values for 'width' and 'height' are '100%' and 'x' and 'y' are '0' for the 'svg' element. +

+ + +

+ Empty 'svg' element is referenced via 'getElementById()'. From that reference, 'width', 'height', 'x', and 'y' are evaluated + via 'baseVal.valueAsString'. A failure of one or more tests is indicated by the word 'FAIL' in red text. +

+
+ +

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

+
+ + $RCSfile: struct-svg-01-f.svg,v $ + + + + + + + + + + + + Initial value of the 'svg' tag's 'width' attribute: + + + Initial value of the 'svg' tag's 'height' attribute: + + + Initial value of the 'svg' tag's 'x' attribute: + + + Initial value of the 'svg' tag's 'y' attribute: + + + FAIL + + + + + + $Revision: 1.4 $ + + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-02-f.svg new file mode 100644 index 000000000..5fff676a3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-02-f.svg @@ -0,0 +1,143 @@ + + + + + + + + + + +

+ Testing various interactions on the width attribute on an svg element. + The width attribute defaults to "100%" if it's not specified. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if the testframe is filled with green, and there's no red. +

+
+ + $RCSfile: struct-svg-02-f.svg,v $ + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-03-f.svg new file mode 100644 index 000000000..0b03bb426 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-svg-03-f.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + +

+ Test nested svg elements. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Passed if there are two green rectangles visible, and no red. +

+
+ + $RCSfile: struct-svg-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-symbol-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-symbol-01-b.svg new file mode 100644 index 000000000..402a0c737 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-symbol-01-b.svg @@ -0,0 +1,89 @@ + + + + + + + + + + + + +

+ The purpose of the symbol test case is to create some symbols and then + have them rendered when instantiated by the use element. +

+

+ This file contains 3 symbol definitions. Only two are ever rendered. + There is a viewport defined to be 0,0,1000,1000 on the svg element. + Each symbol has is own viewport of the same dimensions. The symbols are + scaled when they are instantiated by the use element, The first set + of symbols is 4 squares, blue and yellow in color they should appear + in the lower right of the view arranged in a checkerboard fashion. + The second symbol to be used is an image which should appear in the + upper left of the view area. The symbol that is not used and should + not be rendered is a large black rectangle. If the symbols don't + appear, there is something askew with the use statement, if they + appear but either overlap each other or in some way aren't in the + correct positions they have not honored either their viewport or + were not scaled when placed by the use element in the area defined by + it. If everything is black then perhaps a symbol was rendered that + should not have been. +

+ + +

+ Run the test. No interaction required. +

+
+ +

The test passes if:

+
    +
  • An image is shown in the top left corner of the document.
  • +
  • A blue and yellow checkerboard pattern is shown in the bottom right corner of the document.
  • +
  • The background of the document is not filled with red.
  • +
+
+ + $RCSfile: struct-symbol-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-01-t.svg new file mode 100644 index 000000000..031723038 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-01-t.svg @@ -0,0 +1,112 @@ + + + + + + + + + + + + +

+ 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/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-03-t.svg new file mode 100644 index 000000000..00c6dc9de --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-03-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

+ The purpose of this test is to validate proper handling of + the x/y attributes on the use element. +

+

+ The test shows a <use> element displayed on the right. + On the left, a group built as described in section + 5.6 of the SVG 1.1 specification validates that the + <use element is properly processed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there are two identical diamond shapes visible. +

+
+ + $RCSfile: struct-use-03-t.svg,v $ + + + + + + + + + + + + + Reference + + <use> + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-04-b.svg new file mode 100644 index 000000000..32fe4a67e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-04-b.svg @@ -0,0 +1,65 @@ + + + + + + + + + + + + +

+ The intent of the file is to determine if the UA supports references to external SVG fragments. +

+ + +

+ See referenced image. +

+
+ +

+ To pass this test, the UA agent must display a total of 8 graphical + primitives (2 rectangles, 2 circles, 2 ellipses and 2 triangles). + For each pair of objects, one is a semi-transparent duplicate + copy at the other displayed at an offset position.. +

+
+ + $RCSfile: struct-use-04-b.svg,v $ + + + + + + + + + + + + + + + + + + External references on <use> + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-05-b.svg new file mode 100644 index 000000000..804a0613b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-05-b.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

+ This file is intented to test the computed values in external references. + Both files (referencing and referenced) define similar colors/gradients via 'color', 'linearGradient' and 'radialGradient'. + The ids of those definitions are the same but the actual appearance are different. These definitions are used to test the + property inheritance feature of SVG. +

+ + +

+ [[ + Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test. + ]] +

+
+ +

+ The top left rectangle should be filled with the blue linear gradient since the 'use' has a specified value + defined in the 'defs' section. The top right rectangle is forestgreen since the 'use' has a computed value. + The bottom left rectangle is also forestgreen since the fill is not inherited from the referenced element's original parent. + The bottom right rectangle is filled with the orange radial gradient since the computed value is given by the CSS cascade. +

+
+ + $RCSfile: struct-use-05-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + External references and computed values + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-06-b.svg new file mode 100644 index 000000000..958eabc6e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-06-b.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

+ Test onlick handlers in externally referenced content. + + There are two 'use' elements, each of them is referencing an external file showing a rectangle. + + The rect elements in the external file have onclick attributes, and the handler will attempt to change the fill of the + referenced rect element to red. +

+ + +

+ Click each of the two green rectangles once. +

+
+ +

+ The test is passed if the two rectangles remain green when clicked, and there is no red visible. +

+
+ + $RCSfile: struct-use-06-b.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-07-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-07-b.svg new file mode 100644 index 000000000..eb1018a22 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-07-b.svg @@ -0,0 +1,77 @@ + + + + + + + + + + + + +

+ This tests interactivity and event handlers on use elements. It also tests + that the SVGElementInstance.correspondingElement property and the + CSSStyleDeclaration.setProperty() method defined in + DOM Level 2 Style. By testing different ways of setting the fill on a rectangle + it verifies that the result is consistent, and that CSS properly overrides + the specified values. +

+ + +

+ You should at first see a pyramid of four pink rects. + Click each of the pink rects once. +

+
+ +

+ If the useragent doesn't support CSS, this test does not apply. +

+

+ The test has passed if when clicking each of the rects the clicked rect turns blue - + note that only the clicked rect must turn blue, if any other rect turns blue too then the test has failed. +

+

+ The reference image shows the final state, what the result should be after all rects have been clicked. +

+
+ + $RCSfile: struct-use-07-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-08-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-08-b.svg new file mode 100644 index 000000000..affccccfc --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-08-b.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ [[Describe which section and what specific assertion is being tested + by the test. If the test has a number of sub tests, multiple + "testComponent" elements can be specified within the "testDescription" + element.]] +

+ + +

+ [[Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test.]] +

+
+ +

+ [[Describe the pass criteria of the test here. The pass criteria is what + should be displayed when the test is run.]] +

+
+ + $RCSfile: struct-use-08-b.svg,v $ + + + + + + + + + + + + 'use' referencing 'svg' element + + + + + + 'use' referencing 'image' element + + + This text should be visible. + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-09-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-09-b.svg new file mode 100644 index 000000000..756ecf1be --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-09-b.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ This tests the use element inside a symbol definition. +

+ + +

Run the test. No interaction required.

+
+ +

+ For the test to pass, 5 nested rectangles with different coloured strokes + (black, yellow, orange, purple and blue) must be rendered. +

+
+ + $RCSfile: struct-use-09-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-10-f.svg new file mode 100644 index 000000000..ebadc034b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-10-f.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + +

+ Properties are inherited according to the 'use' element rules, CSS selectors only apply to the original elements + and not the (conceptually) cloned DOM tree. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if the three rectangles have green fill and a thick darkgreen stroke. If any red shows the test has failed. +

+
+ + $RCSfile: struct-use-10-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + CSS selectors and use element + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-11-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-11-f.svg new file mode 100644 index 000000000..56afadd45 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-11-f.svg @@ -0,0 +1,151 @@ + + + + + + + + + + +

+ CSS selectors that apply to an element referenced via 'use' also apply to the 'use' instance. +

+

+ A 'style' block contains all CSS rules. Various CSS selectors are applied to 'circle' elements. A unique 'class' selector is + used for all cases to ensure that the selectors don't interfere with each other. For each 'circle', there is a corresponding + 'use' instance. For structure-related rules, a 'g' tag is used. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if twelve blue circles and no black circles are visible on the page. +

+
+ + $RCSfile: struct-use-11-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-12-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-12-f.svg new file mode 100644 index 000000000..01660ccde --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-12-f.svg @@ -0,0 +1,104 @@ + + + + + + + + + + +

+ Tests that recursive 'use' instances do not block rendering. +

+

+ Various scenarios that directly and indirectly create circular references via the 'use' tag. A 'g' element is used when + structural elements are necessary. None of the 'use' scenarios render anything. 'useLongCycle' tests a chain of recursive + 'use' instances that eventually cycles back to the first element. In 'useNested' 'use' elements are nested, with the child + referring to the parent. In 'useNestedGroup' a 'use' instance references a parent 'g' element. In 'useIndirectNestedGroup' + a 'use' instance indirectly references its own parent 'g'. In 'useMultipleIndirectNestedGroup', two 'use' instances + reference their parent 'g' elements, and additional 'use' instances refer to these self-referencing 'use' elements. A green + 'rect' is used to verify that rendering was processed up to that point. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there is green visible on the page. +

+
+ + $RCSfile: struct-use-12-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-13-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-13-f.svg new file mode 100644 index 000000000..3117a3a2f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-13-f.svg @@ -0,0 +1,77 @@ + + + + + + + + + + +

+ Test that 'use' elements are synchronized at run time with the elements they reference. +

+

+ This test verifies visual synchronization during run time between 'use' instances and the elements they reference. A 'g' element containing + two 'rect' elements is referenced via 'use'. One 'rect' is red and the other has no fill specified. DOM synchronization is verified visually + by removing the red 'rect'. Presentation attribute synchronization is verified visually by setting the other rect's 'fill' attribute to 'lime'. + The 'g' that is referenced is inside of a 'defs' tag so only the 'use' instance is visible. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is a green square visible on the page, and no red. +

+
+ + $RCSfile: struct-use-13-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-14-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-14-f.svg new file mode 100644 index 000000000..597de799f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-14-f.svg @@ -0,0 +1,74 @@ + + + + + + + + + + +

+ Test that the 'use' element's 'xlink:href' attribute referencing dynamically set 'id' attributes is supported. +

+

+ The test defines a 'use' element with its 'xlink:href' attribute set to 'pass' which is an invalid element id. A green 'rect' element has its 'id' + attribute set to 'pass' via 'setAttribute'. The referenced 'rect' is a child of a 'defs' element so that it does not render, and it is wrapped with a 'g' + element in order to obtain a DOM reference to it. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is a green square visible on the page, and no red. +

+
+ + $RCSfile: struct-use-14-f.svg,v $ + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-15-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-15-f.svg new file mode 100644 index 000000000..90a79d7df --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/struct-use-15-f.svg @@ -0,0 +1,78 @@ + + + + + + + + + + +

+ Test that recursive 'use' elements are synchronized at run time with the originally referenced element. +

+

+ Inside of a 'defs' element, a 'g' element containing two 'rect' elements is referenced via 'use'. Outside of the 'defs', a 'use' element references + the other 'use' element. One 'rect' is orange and the other has no fill specified. DOM synchronization is verified visually by removing the orange 'rect'. + Presentation attribute synchronization is verified visually by setting the other rect's 'fill' attribute to 'blue'. All elements are inside of a 'defs' + element except for the recursive 'use' element to ensure that it is the only element rendered. Verify that blue is visible and orange is not visible. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is a green square visible on the page, and no red. +

+
+ + $RCSfile: struct-use-15-f.svg,v $ + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-class-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-class-01-f.svg new file mode 100644 index 000000000..0eed402f7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-class-01-f.svg @@ -0,0 +1,75 @@ + + + + + + + + + + +

+ The 'class' attribute assigns one or more class names to an element, and shared class names among several element instances are supported. +

+

+ Assigns a class to two elements and specify a 'fill: blue' style rule on the class. On one of the elements, also specify a + second class with a specified 'stroke: orange' style rule. Verify the 'fill' and 'stroke' styles applied appropriately. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if there are two blue rectangles on the page, and the lower right one has an orange border. +

+
+ + $RCSfile: styling-class-01-f.svg,v $ + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-01-b.svg new file mode 100644 index 000000000..c1e629e20 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-01-b.svg @@ -0,0 +1,90 @@ + + + + + + + + + + + + +

+ Test element and class selectors. +

+ + +

+Run the test. No interaction required. +

+
+ +

+The test is passed if all six shapes have a green fill. +

+
+ + $RCSfile: styling-css-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + element selectors: + + + + + + + + + + + + + + + class selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-02-b.svg new file mode 100644 index 000000000..87b5fbaa9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-02-b.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + +

+ Test ID and attribute selectors +

+ + +

Run the test. No interaction required. +

+
+ +

+ The test is passed if all six shapes have a green fill. +

+
+ + $RCSfile: styling-css-02-b.svg,v $ + + + + + + + + + + + + + + + + id selectors: + + + + + + + + + + + + + + attribute selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-03-b.svg new file mode 100644 index 000000000..7a830bd9b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-03-b.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + +

+ Test ancestor, child and sibling selectors. +

+ + +

+ Run the test. No interaction required. +

+ +
+ +

+ The test is passed if all six shapes have a green fill. +

+
+ + + $RCSfile: styling-css-03-b.svg,v $ + + + + + + + + + + + + + + + ancestor selectors and child selectors: + + + + + + + + + + + + + + + ancestor, immediate-sibling and first-child selectors: + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-04-f.svg new file mode 100644 index 000000000..90025a2ba --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-04-f.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + +

+ This purpose of the file is to test some of the CSS2 selector syntax. +

+ + +

+ A UA supporting CSS selectors should render an image identical to the referenced image. +

+ +
+ +

+ The test is passed if a grid of 6x3 squares is shown, the colors in each column + are the same and are those of the reference image (blue, green, orange, gold, purple and silver) +

+

+ For a full analysis of this test, please see + + this explanation. + +

+
+ + $RCSfile: styling-css-04-f.svg,v $ + + + + + + + + + + CSS selector test + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + B + C + D + E + F + 1 + 2 + 3 + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-05-b.svg new file mode 100644 index 000000000..5fa1e7011 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-05-b.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

+ Tests the language selectors, :lang(c). +

+

+ Note that a less specific language (such as fr) also matches a more specific + language (such as fr-CA) but a more specific language (such as en-GB) does not match a less specific language (such as en). + Also note that language tags,and thus language selectors are case-insensitive. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The phrase "Good morning!" should be in green. The phrase "Bon avant-midi!" + should be in blue; in addition, the "avant-midi" should be italic because its Canadian French. +

+
+ + $RCSfile: styling-css-05-b.svg,v $ + + + + + + + + + + + + + + + + Good morning! + + Bon avant-midi! + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-06-b.svg new file mode 100644 index 000000000..a3151451e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-06-b.svg @@ -0,0 +1,198 @@ + + + + + + + + + + + + +

+ Tests the dynamic pseudoclasses :link, :visited, :active, :hover and :focus. +

+ + +

+ For the test to work, you must have previously visited ../linkingToc-t.svg which you can do by + traversing the "Visited" link, then going back to this test file. +

+

+ The links marked "Visited" and "Hover me" should now be purple, + while the "Unvisited" link is blue. +

+

+ Note: If you do not have a pointing device, or if it provides pick but not hover + (eg a stylus on a PDA) skip the hover portion of the test and mark this part as + passed: Hover the pointing device over the "Hover me" and then, over the "And me, too!". + As each of the two text strings text is hovered, it should turn a dark orange color + while the other string should be whatever color it was before being hovered. +

+

+ Note: If the device you are using does not support text selection, e.g. a mobile phone, + you may skip this part of the test and consider this part passed.:Finally, select + some of the "Select me" text. SVG states that text selection causes an element to receive focus. + There is a style rule :focus { fill: rgb( 0, 255, 127); stroke: rgb( 0, 255, 127); stroke-width:3px } + which applies, although since it has specificity + 010 while the following rule text:active {text-decoration: underline; fill: red } + has a higher specificity of 011, the fill is in fact red while the stroke is still green. +

+
+ +

+ Because this is a dynamic test , a single static image cannot fully capture all the + states. The reference image simulates the state during the third subtest. Visited and + unvisited links have the appropriate blue and purple colors. The color and presentation + of the selected text are user-agent dependent, but the unselected part of the "Select me" + text must be red and underlined with a green stroke. +

+
+ + $RCSfile: styling-css-06-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Visited + + + Unvisited + + + Hover me + + And me, too! + Select me + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-07-f.svg new file mode 100644 index 000000000..f036f6dab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-07-f.svg @@ -0,0 +1,62 @@ + + + + + + + + + + +

+ Tests that inline CSS styling (style attributes) is supported. +

+

+ Specifies an inline 'visibility: hidden' style rule on a red element and verifies there is no red on the page. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ Test passes if a green rectangle is visible, and there is no red visible on the page. +

+
+ + $RCSfile: styling-css-07-f.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-08-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-08-f.svg new file mode 100644 index 000000000..8f18acdab --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-08-f.svg @@ -0,0 +1,116 @@ + + + + + + + + + + +

+ Test that CSS styling via the 'style' element is supported. +

+

+ For each of a representative sampling of selectors, specify a 'visibility: hidden' style rule and add a corresponding red + element to the markup. A reference in green is shown for each shape. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if there is no red visible on the page and there are seven green shapes visible. +

+
+ + $RCSfile: styling-css-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-09-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-09-f.svg new file mode 100644 index 000000000..f4be4a175 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-09-f.svg @@ -0,0 +1,82 @@ + + + + + + + + + + +

+ Tests that CSS styling from an external style sheet is supported. +

+

+ For each of a representative sampling of selectors, a 'visibility: hidden' style rule is specified + to match a corresponding element in the markup. Identically shaped and sized elements (but which are not + applicable to any of the style selectors) are placed beneath them and should be visible + if the style sheet was applied correctly. +

+ + +

Run the test. No interaction required.

+
+ +

+ The test passes if there are seven blue shapes on the page. +

+
+ + $RCSfile: styling-css-09-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-10-f.svg new file mode 100644 index 000000000..66884a228 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-css-10-f.svg @@ -0,0 +1,76 @@ + + + + + + + + + + +

+ Checks that stylesheets (style attributes, style elements, +external style sheets) are case-insensitive, unlike presentational attributes.

+ +

Subtest a checks that the invalid attribute +FiLl is ignored. Subtest b checks that the style attribute is +applied, the values being case-insensitive. Subtests c and d check +the same for style elements and imported external style sheets. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ If any red shows, the test fails. If four orange circles are shown, + the test passes and the user agent supports CSS style sheets. If + the top two circles are orange while the bottom two are blue, and the user agent does + not claim to support CSS style sheets, the test also passes. +

+
+ + $RCSfile: styling-css-10-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-elem-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-elem-01-b.svg new file mode 100644 index 000000000..718b231cb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-elem-01-b.svg @@ -0,0 +1,75 @@ + + + + + + + + + + +

+ This tests that the 'type' attribute on a 'style' element is + honored. +

+

+ Once the test is loaded, two rectangles are presented, + the upper indicating the result of a sub-test that checks + whether the 'type' attribute on a 'style' element correctly + defaults to "text/css", and the lower indicating the result + of a sub-test that checks whether a bogus value for 'type' + does not cause the 'style' element contents to be interpreted + as CSS. Each rectangle is green if the sub-test is passed + or red if it failed. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if both rectangles are green. +

+
+ + $RCSfile: styling-elem-01-b.svg,v $ + + + + + + + + + + Test that <style type=""> is honored + + + + No type="" attribute + Rubbish type="" attribute + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-inherit-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-inherit-01-b.svg new file mode 100644 index 000000000..1e49a4b38 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-inherit-01-b.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

+ Verify property inheritance as required by 6.15 "Property + inheritance". Since all implementations are required to do this, only + presentation attributes are used. +

+ + +

+Run the test. No interaction required. +

+
+ +

+ At the center right, there is an ellipse. The fill color is not + specified on that element but on its parent. The ellipse should be filled a solid yellow +

+

+ At the top left, an oval shape is formed from a rectangle + with a radial gradient. The color of the middle stop uses the keyword 'inherit' + and thus takes its parent's value of green, giving a yellow, green, white gradient. +

+

+ At the bottom left, an oval shape is formed from a rectangle + with a radial gradient. The color of the middle stop uses the value 'currentColor' + and thus takes the value its parent's color property, a dark red, + giving a yellow, dark red, white gradient. +

+
+ + $RCSfile: styling-inherit-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-01-t.svg new file mode 100644 index 000000000..72ee060e0 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-01-t.svg @@ -0,0 +1,61 @@ + + + + + + + + + + + + +

+ Tests that !important in a presentation attribute is an unsupported value +

+

+ A fill attribute is set to red with !important. This is an unsupported attribute value, + consequently the fill attribute should be the lacuna value, which is black. Therefore, to pass, the rectangle should be filled with black. +

+

A lime green border is also drawn, to check that rendering continues after the element with the unsupported value.

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The rectangle should be filled with black, with a lime green border. +

+
+ + $RCSfile: styling-pres-01-t.svg,v $ + + + + + + + + + + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-02-f.svg new file mode 100644 index 000000000..3e116fd10 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-02-f.svg @@ -0,0 +1,216 @@ + + + + + + + + + + +

+ This tests that a presentation attribute that is not relevant + to a given element which is otherwise stylable is correctly stored + in the property collection for that element. In particular, + it tests the following presentation attributes: +

+
    +
  • fill on image
  • +
  • stop-opacity on tspan
  • +
  • font-size on rect
  • +
  • font-style on circle
  • +
  • stop-color on text
  • +
  • font-variant on ellipse
  • +
  • letter-spacing on polyline
  • +
  • flood-color on tref
  • +
  • flood-opacity on textPath
  • +
  • color-interpolation-filters on altGlyph
  • +
  • display on linearGradient
  • +
  • fill-rule on stop
  • +
  • visibility on radialGradient
  • +
  • lighting-color on clipPath
  • +
+ + +

+ The test comprises 14 sub-tests, each with a rectangle that indicates + whether a given presentation attribute of the 14 listed in the test + description affects the style of the element on which it is specified. A rectangle + is black if the sub-test did not run, red if the sub-test failed and + green if the sub-test succeeded. +

+
+ +

+ The test is passed if all 14 rectangles are green. +

+
+ + $RCSfile: styling-pres-02-f.svg,v $ + + + + + + + + + Testing inapplicable presentation attributes + + + + + + + + + abc + + + + + + + + fill on image + + + stop-opacity on tspan + + + font-size on rect + + + font-style on circle + + + stop-color on text + + + font-variant on ellipse + + + letter-spacing on polyline + + + flood-color on tref + + + flood-opacity on textPath + + + clr-intp-filters on altGlyph + + + display on linearGradient + + + fill-rule on stop + + + visibility on radialGradient + + + lighting-color on clipPath + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-03-f.svg new file mode 100644 index 000000000..a803a8814 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-03-f.svg @@ -0,0 +1,57 @@ + + + + + + + + + + +

+ Presentation attributes have lower priority than internal CSS style rules. +

+ + +

+ Specify an inline 'fill: none' style rule on an element with 'fill=red' presentation attribute and verify there is no red + on the page. +

+
+ +

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

+
+ + $RCSfile: styling-pres-03-f.svg,v $ + + + + + + + + + + + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-04-f.svg new file mode 100644 index 000000000..8ef604d0b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-04-f.svg @@ -0,0 +1,102 @@ + + + + + + + + + + +

+ Presentation attributes have lower priority than other CSS style rules specified in an internal style sheet. +

+ + +

+ For each of a representative sampling of selectors, specify a 'fill: green' style rule for it, and add a corresponding + element with 'fill=red' presentation attribute to the markup. Verify there is no red on the page. +

+
+ +

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

+
+ + $RCSfile: styling-pres-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-05-f.svg new file mode 100644 index 000000000..38e1c42cb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/styling-pres-05-f.svg @@ -0,0 +1,75 @@ + + + + + + + + + + +

+ Presentation attributes have lower priority than other CSS style rules specified in an external style sheet. +

+ + +

+ For each of a representative sampling of selectors, specify a 'fill: green' style rule for it, and add a corresponding + element with 'fill=red' presentation attribute to the markup. Verify there is no red on the page. +

+
+ +

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

+
+ + $RCSfile: styling-pres-05-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/svgdom-over-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/svgdom-over-01-f.svg new file mode 100644 index 000000000..bf03243ed --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/svgdom-over-01-f.svg @@ -0,0 +1,202 @@ + + + + + + + + + + +

+ This tests how unspecified attributes affect the return values from the + SVG DOM methods related to attributes. +

+

+ After loading the test, you should see a list of red or green rectangles followed by some text describing each subtest. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test has passed if there is a line of text saying "Test status: PASSED", and there is a green rectangle to the left of that text. +

+
+ + $RCSfile: svgdom-over-01-f.svg,v $ + + + + + + + + + + + + + + + + sometext + + + + + + + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-01-b.svg new file mode 100644 index 000000000..d6d6eb5a8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-01-b.svg @@ -0,0 +1,80 @@ + + + + + + + + + + + + +

+ Test 'text-anchor' property (horizontal). +

+

+ The three lines test the three values for property 'text-anchor': start, middle and end. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The lines in pink, 'text-anchor:none' and 'text-anchor:start', should both start from the same horizontal position (indicated by the black circle on each line) and extend to the right. + The green line, 'text-anchor:middle', should be centered horizontally around the black circle. + The blue line, 'text-anchor:end', should be aligned such that the end of the text meets the black circle. +

+
+ + $RCSfile: text-align-01-b.svg,v $ + + + + + + + + + Test 'text-anchor' (horizontal) + + + + + text-anchor:none + + + + + text-anchor:start + + + + + text-anchor:middle + + + + + text-anchor:end + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-02-b.svg new file mode 100644 index 000000000..d172d84c2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-02-b.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + +

+ Test the 'baseline-shift' property (horizontal). +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ This three lines test property 'baseline-shift'. + The first line tests 'baseline-shift:7' (i.e., a length for 'baseline-shift'). + The pink text should be shifted upwards by an amount approximately half of the height of the text. + The second line tests 'baseline-shift:-70%' (i.e., a percentage for 'baseline-shift'). + The pink text should shift downward by about the height of the text. + The third line tests the three keywords 'sub', 'super' and 'normal'. + The string "sub" should be shifted downwards, the string "super" shifted upwards, + and the string "te" (in blue) aligned with the remainder of the text in the line. +

+
+ + $RCSfile: text-align-02-b.svg,v $ + + + + + + + + + Test 'baseline-shift' (horizontal) + + + Normalbaseline-shift:7text + + + Normalbaseline-shift:-70%text + + + Normalsubsupertext + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-03-b.svg new file mode 100644 index 000000000..19bbf7c58 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-03-b.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

+ Test for viewer capibility to handle the basics of the 'textAnchor' + alignment property for 'text' and related elements. +

+

+ This test verify that + the interpreter correctly handles and applies the text-anchor + properties when present on "chunks", which are comprised of tspan elements + with absolute positioning, within the containing 'text' element. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if +

+
    +
  • + The text "Begin with "end"," ends just to the left of the vertical pink + line. +
  • +
  • + The text "switch to "middle" in a tspan," is split by the vertical pink + line roughly through the second 'd' in the world "middle". +
  • +
  • + The text "and "start" ends it." begins just to the right of the + vertical pink line. +
  • +
+
+ + $RCSfile: text-align-03-b.svg,v $ + + + + + + + + + Test of 'text-anchor' + + + + + + Begin with "end", switch to "middle" in a tspan, and "start" ends it. + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-04-b.svg new file mode 100644 index 000000000..812bbc274 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-04-b.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + +

+ Test for viewer capibility to handle the basics of the 'text-anchor' + alignment property for 'text' and related elements. +

+

+ The second group from the top contains sub-tests to verify that the + interpreter handles text-anchor when the text is comprised of other + text related elements, 'tspan', 'tref', and 'textPath'. + The text-anchor property is present on the containing 'text' element + in these cases, not on the contained child elements. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if: +

+
    +
  • + The text "start text pink tspan" begins just to the right of the + vertical pink line. +
  • +
  • + The text "middle text bold tspan" is split by the vertical pink line + between the words "text" and "bold". +
  • +
  • + The text "end text tref" ends just to the left of the vertical pink + line. +
  • +
  • + The text "end text on path" ends just to the left of the vertical pink + line. +
  • +
+
+ + $RCSfile: text-align-04-b.svg,v $ + + + + + + + + + + + + + + Test of 'text-anchor' + + end text tref + + + + Tspan, tref, toap + + + + + start text pink tspan + + + middle text bold tspan + + + + + + Text-anchor: end text on path + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-05-b.svg new file mode 100644 index 000000000..c6fd9bc57 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-05-b.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

+ Test 'text-anchor' property (vertical). +

+

+ This tests the three values for property 'text-anchor': start, middle and end. +

+ + +

+ Run the test. No interaction required. +

+
+ +

+ The test is passed if three vertical lines of text are displayed with + each line containing a single black dot. +

+ +
  • + The first vertical line of text containing the black dot at the top of + the text. +
  • +
  • + The second vertical line of text containing the black dot in the + middle of the text. +
  • +
  • + The third vertical line of text containing the black dot at the bottom + of the text. +
  • +
    +
    + + $RCSfile: text-align-05-b.svg,v $ + + + + + + + + + Test 'text-anchor' (vertical) + + + + + start + + + + middle + + + + end + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-06-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-06-b.svg new file mode 100644 index 000000000..62f97463c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-06-b.svg @@ -0,0 +1,99 @@ + + + + + + + + + + + + +

    + Tests various ways that the 'baseline-shift' property (vertical) can be + altered. +

    +

    + The first sub test sets the 'baseline-shift' to an absolute unit. The + second sub test sets the 'baseline-shift' to a percentage. The third sub + test sets the 'baseline-shift' to "sub". The fourth sub test sets the + 'baseline-shift' to "super". +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if four lines of vertical text are rendered. +

    +
      +
    • + The first vertical line should contain the text "te7xt" with the "7" + part being slightly offset to the right of the rest of the letters + in the text. +
    • +
    • + The second vertical line should contain the text "te-70%xt" with the + "-70%" part of the text being offset to the left of the rest of the + letters in the text. +
    • +
    • + The third vertical line should contain the text "tesubxt" with the + "sub" part of the text being slightly offset to left of the rest of + the letters in the text. +
    • +
    • + The fourth verical line should contain the text "tesuperxt" with the + "super" part of the text being offset to the right of the rest of the + letters in the text. +
    • +
    +
    + + $RCSfile: text-align-06-b.svg,v $ + + + + + + + + + Test 'baseline-shift' (vertic.) + + + + + te7xt + + + te-70%xt + + + tesubxt + + + tesuperxt + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-07-t.svg new file mode 100644 index 000000000..34121ebca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-07-t.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

    ISSUE - http://www.w3.org/2011/02/27-svg-irc#T22-20-51

    +

    + Test horizontal baselines across script and font size changes. +

    +

    + Original test authored by Rodney Hardy at CISRA and modified by + Anthony Grasso. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The dominant baseline should be alphabetic, so the 'a' will be sitting + on the blue line, the Japanese character '犜' will be on the ideographic baseline + and 'ण' is a Devangari character and will use the hanging baseline. The + smaller versions of the characters should be aligned to the same baselines. + So the 'a's on the blue line, the Japanese characters slightly below the line + and the Devangari characters should be hanging from the hanging baseline. +

    +
    + + $RCSfile: text-align-07-t.svg,v $ + + + + + + + + + + + + a犜णa犜णa犜ण + + + + hanging base line + + + + alphabetic base line + + + + ideographic base line + + + + + $Revision: 1.9 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-08-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-08-b.svg new file mode 100644 index 000000000..9541f574d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-align-08-b.svg @@ -0,0 +1,91 @@ + + + + + + + + + + + + +

    ISSUE - http://www.w3.org/2011/02/27-svg-irc#T22-20-51

    +

    + Test horizontal baselines across script and font size changes. It uses an SVG Font, where + the Latin letter "a" is a rectangle, the Japanese letter "犜" is an upward-pointing triangle, + and the Devanagari letter "ण" is a downward-pointing triangle. +

    +

    + Original test authored by Rodney Hardy at CISRA. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The dominant baseline should be alphabetic, so the 'a' will be sitting on the alphabetic (blue) line, + the Japanese glyph (upward pointing triangle) will be aligned on the ideographic (pink) baseline + and 'ण' is a Devangari character (downward pointing triangle) and will use the hanging baseline (green). + The smaller versions of the characters should be aligned to the same baselines as the respective larger + characters, so all like shapes align to the same baseline. +

    +
    + + $RCSfile: text-align-08-b.svg,v $ + + + + + + + + + + + + + + + + + + + + a犜णa犜णa犜ण + + + + + + + + $Revision: 1.10 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-01-b.svg new file mode 100644 index 000000000..db208cea5 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-01-b.svg @@ -0,0 +1,128 @@ + + + + + + + + + + + + +

    + Test 'altGlyph' facilities and many-to-many chars to glyphs. +

    + + +

    + Run the test. No interaction required. +

    +

    + This test requires some support for SVG fonts. +

    +
    + +

    + Three text strings show: the word "HAPPY" in pink, the word "SAD" in green + and the word "SASSY" in blue. +

    +

    + The "HAPPY" and "SAD" strings test the 'altGlyph' facility and + the ability to map multiple glyphs to a single character. + All characters except the "D" are bracketed by 'altGlyph' elements + to use two different glyphs to render each character. + For "HAPPY", the horizontal stroke through the center of the characters + is a smile stroke. + For "SAD", the horizontal stroke through the center of the characters + is a frown stroke. +

    +

    + The "SASSY" string tests a single glyph representing multiple characters + (a ligature). The SVG font in the test case contains an "SS" ligature + so that the "SS" in "SASSY" is rendered with a single glyph, where + the two parts of the "SS" are connected. +

    +
    + + $RCSfile: text-altglyph-01-b.svg,v $ + + + + + + + + + + Test 'altGlyph' facilities + and many-to-many chars to glyphs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +H +A +P +P +Y + + + SAD + + SASSY + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-02-b.svg new file mode 100644 index 000000000..d12e917e4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-02-b.svg @@ -0,0 +1,344 @@ + + + + + + + + + + + + +

    + Test glyph selection using altGlyphDef and altGlyphItem elements. +

    + + +

    + Run the test. No interaction required. +

    +

    + Support for SVG Fonts is required for this test, and the last two text + strings are used to give a quick visual indication this is indeed + supported. +

    +

    + The test shows 24 different text strings with different combinations + of altGlyphItem element count and validity inside the altGlyphDef + elements, and number of characters in the altGlyph elements. The + glyphs are from a sans serif font, except those selected by + altGlyph, which are from a boldface serif font. The text + in the "Actual" columns should appear as shown in the corresponding + "Expected" column text. +

    +
    + +

    The test passes if each pair of (actual,expected) text strings + render identically.

    +
    + + $RCSfile: text-altglyph-02-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Actual + Expected + Actual + Expected + + + + + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + + + + + abde + + + abde + + + abde + + + abde + + + abde + + + abde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + a + b + + + + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abde + + + acde + + + acde + + + acde + + abcde + + + + + + + + + + + + $Revision: 1.10 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-03-b.svg new file mode 100644 index 000000000..4327c9f80 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-altglyph-03-b.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + +

    + Test glyph selection using altGlyphDef and altGlyphItem elements. +

    + + + +

    This test was copied from text-altglyph-02-b.svg revision 1.9, which had some subtests + involving 'altGlyph' elements with no character data removed. All of the subtests + that are common with text-altglyph-02-b.svg can be removed from this test.

    +

    + Run the test. No interaction required. +

    +

    + Support for SVG Fonts is required for this test, and the last two text + strings are used to give a quick visual indication this is indeed + supported. +

    +

    + The test shows 24 different text strings with different combinations + of altGlyphItem element count and validity inside the altGlyphDef + elements, and number of characters in the altGlyph elements. The + glyphs are from a sans serif font, except those selected by + altGlyph, which are from a boldface serif font. The text + in the "Actual" columns should appear as shown in the corresponding + "Expected" column text. +

    +
    + +

    The test passes if each pair of (actual,expected) text strings + render identically.

    +
    + + $RCSfile: text-altglyph-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Actual + Expected + Actual + Expected + + + + + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + + + bcde + + + bcde + + + bcde + + + bcde + + + + + + + abde + + + abde + + + abde + + + abde + + + abde + + + abde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + + + a + b + + + + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abcde + + + abcde + + + abcde + + + abcde + + bcde + + + + + abcde + + + abcde + + + abcde + + + abcde + + + abcde + + abde + + + acde + + + acde + + + acde + + abcde + + + + + + + + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-bidi-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-bidi-01-t.svg new file mode 100644 index 000000000..aff70f3c6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-bidi-01-t.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + +

    + Test directional type, ltr context, arabic. + Assertion: In a left-to-right context, without markup, styling or special characters, a sequence of Arabic characters and spaces will progress from right to left. +

    +

    You will need a font that allows you to distinguish Arabic characters.

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Test passes if the characters follow the same order. +

    +
    + + $RCSfile: text-bidi-01-t.svg,v $ + + + + + + + + + Ù…Ùتاح معايير الويب + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-deco-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-deco-01-b.svg new file mode 100644 index 000000000..609162a97 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-deco-01-b.svg @@ -0,0 +1,82 @@ + + + + + + + + + + + + +

    + Test the 'text-decoration' property. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    The test has passed if:

    +
      +
    • + The first line of text has no decoration. +
    • +
    • + The second line of text has a line through it. +
    • +
    • + The third line of text is underlined. +
    • +
    • + The fourth line of text has a blue underline with a green stroke under + all characters, except the word "different" which has a yellow underline + with a green stroke. +
    • +
    +
    + + $RCSfile: text-deco-01-b.svg,v $ + + + + + + + + + + Normal text + Text with line-through + Underlined text + + + One + word + has + different + underlining + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-01-f.svg new file mode 100644 index 000000000..ed54dc550 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-01-f.svg @@ -0,0 +1,230 @@ + + + + + + + + + + + + +

    + This tests the methods and properties of the SVGTextContentElement interface on the text element with the id 'testText' + and the content 'This is a test of the interface SVGTextContentElement'. The word 'is' has two glyphs with different + rotation values defined with a <tspan/> element. There are 12 subtests testing the 9 methods and 2 properties. + Note that the numeric results of some methods may vary. The additional instructions state where the result may vary + and where it should have an exact value. +

    + + +

    + [[ + Describe how to use the here. The instructions should specify any + steps requied to run the test or any manual operation that need + to be performed to run the test. + ]] +

    +
    + +

    + The first subtest is testing the method .getCharNumAtPosition(svgPt), where svgPt has an x value of 240 and y value of 25. + The result of this subtest must be "30". +

    +

    + The second subtest is testing the method .getComputedTextLength(). The rounded result may vary in the implementations but should be around 364. + A red line below the testText is visually indicating the result of the method .getComputedTextLength() and must look like a red underline + with a length that spans the whole text length from 'T' to '.'. +

    +

    + The third subtest is testing the method .getEndPositionOfChar() at the 11th character ('e'). + The rounded result may vary in the implementations but should be around 131 for the 'x' value and must be 30 for the 'y' value. + Additionally, a red vertical line is indicating the end position of the character 'e'. Its lower 'y' value must be at 30 + and the 'x' values must match the end position of the 11th character 'e'. +

    +

    + The fourth subtest is testing the method .getExtentOfChar() at the 11th character ('e'). + The rounded result may vary in the implementations but should be around '123,16,8,17' for the 'x,y,width,height' values. + A lightblue rectangle below the character 'e' must fully enclose the 11th glyph. +

    +

    + The fifth subtest is testing the method .getNumberOfChars(). The result must be 54. +

    +

    + The sixth subtest is testing the method .getRotationOfChar() for the fifth character. The result must be 45. + Additionally, a lightblue rectangle below the text indicates the extent of the fifth glyph 'i'. + It must fully enclose the diagonally rotated fifth glyph 'i'. +

    +

    + The seventh subtest is testing the method .getStartPositionOfChar() at the 11th character ('e'). + The rounded result may vary in the implementations but should be around 123 for the 'x' value and must be 30 for the 'y' value. + Additionally, a red vertical line is indicating the start position of the character 'e'. Its lower 'y' value must be at 30 + and the 'x' values must match the end position of the 11th character 'e'. +

    +

    + The eighth subtest is testing the method .getSubStringLength(), starting at character 22 and including the 9 following characters. + The result may vary in the implementations but should be around 58. Additionally, a green (lime) line visually indicates + the result of the method. The word 'interface' must be fully underlined with the green line. +

    +

    + The ninth subtest is testing the method .selectSubString(). After loading the file, the word "the" must be selected. +

    +

    + The tenth subtest is testing the property .textLength. The rounded result of .textLength.baseVal.value may vary in + the implementations but should be around 364. + It must match the value calculated in the second subtest (.getComputedTextLength()). +

    +

    + The eleventh subtest is again testing the property .textLength. The rounded result of .textLength.animVal.value may vary in + the implementations but should be around 364. + It must match the value calculated in the second subtest (.getComputedTextLength()). +

    +

    + The twelfth subtest is again testing the property .lengthAdjust. The results of .lengthAdjust.baseVal and + .lengthAdjust.animVal must be 1 and 1. +

    +
    + + $RCSfile: text-dom-01-f.svg,v $ + + + + + + + + + + + + This is a test of the interface SVGTextContentElement. + + .getCharNumAtPosition() result: + .getComputedTextLength() result: + .getEndPositionOfChar(11) result ('e'): + .getExtentOfChar(11) result ('e'): + .getNumberOfChars() result: + .getRotationOfChar(5) result: + .getStartPositionOfChar(11) result: + .getSubStringLength(22,9) result ('interface'): + .selectSubString(18,3) result: the word 'the' should be selected + .textLength.baseVal.value result: + .textLength.animVal.value result: + .lengthAdjust.baseVal and .lengthAdjust.animVal result: + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-02-f.svg new file mode 100644 index 000000000..bcbbe1063 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-02-f.svg @@ -0,0 +1,131 @@ + + + + + + + + + + + + +

    + This tests that methods on the SVGTextContentElement interface + that take an index to a character or a number of characters + actually interpret these as indexes to or numbers of UTF-16 code + units. To test this, a character from outside the Basic Multilingual Plane + (U+10000; LINEAR B SYLLABLE B008) is used in a text string. + This character is stored in UTF-16 as a surrogate pair. +

    +

    + The test consists of two sub-tests, which test those methods + on the SVGTextContentElement interface which do not rely on rendering. The result + of each sub-test is shown as a small rectangle: black + indicates that the sub-test did not run, red indicates that + the sub-test failed and green indicates that the sub-test + succeeded. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if both rectangles are green. +

    +
    + + $RCSfile: text-dom-02-f.svg,v $ + + + + + + + + + Test that SVGTextContentElement methods work on UTF-16 code units + Methods independent of layout + + + + + + + + a𐀀b + + + getNumberOfChars + + + getSubStringLength + + + + + $Revision: 1.10 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-03-f.svg new file mode 100644 index 000000000..325bca68c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-03-f.svg @@ -0,0 +1,130 @@ + + + + + + + + + + + + +

    + This tests that SVGTextContentElement.getSubStringLength() + handles out-of-range charnum and nchars parameter values correctly. +

    +

    + The test consists of 5 sub-tests, which test the different + combinations of values passed to SVGTextContentElement.getSubStringLength(). + The result of each sub-test is shown as a small rectangle: black + indicates that the sub-test did not run, red indicates that + the sub-test failed and green indicates that the sub-test + succeeded. +

    + + +

    + Run the test. No interaction required. The test relies on support for SVG Fonts. +

    +
    + +

    + The test is passed if all 5 rectangles are green. +

    +
    + + $RCSfile: text-dom-03-f.svg,v $ + + + + + + + + + Test that getSubStringLength() handles out-of-range arguments + + + + + + + + + ababa + + + charnum < 0 + + + nchars < 0 + + + charnum = 0, nchars = length + + + charnum = 0, nchars = length + 10 + + + charnum = 1, nchars = -1 + + + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-04-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-04-f.svg new file mode 100644 index 000000000..67d395093 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-04-f.svg @@ -0,0 +1,157 @@ + + + + + + + + + + +

    + This tests the SVGTextContentElement.getSubStringLength method. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + To pass the test there should be no red visible. +

    +
    + + $RCSfile: text-dom-04-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + abca𝍒cb + + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-05-f.svg new file mode 100644 index 000000000..017d9ffe9 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-dom-05-f.svg @@ -0,0 +1,181 @@ + + + + + + + + + + + + +

    + This tests that methods on the SVGTextContentElement interface + that take an index to a character or a number of characters + actually interpret these as indexes to or numbers of UTF-16 code + units. To test this, a character from outside the Basic Multilingual Plane + (U+10000; LINEAR B SYLLABLE B008) is used in a text string. + This character is stored in UTF-16 as a surrogate pair. +

    +

    + The test consists of 5 sub-tests, which test the methods + methods on the SVGTextContentElement interface. The result + of each sub-test is shown as a small rectangle: black + indicates that the sub-test did not run, red indicates that + the sub-test failed and green indicates that the sub-test + succeeded. +

    + + +

    + Run the test. No interaction required. +

    +

    + The test relies on support for WebFonts - either SVG Fonts, or WOFF, or OpenType. +

    +
    + +

    + The test is passed if all 5 rectangles are green. +

    +
    + + $RCSfile: text-dom-05-f.svg,v $ + + + + + + + + + Test that SVGTextContentElement methods work on UTF-16 code units + Methods that rely on layout + + + + + + + + a𐀀b + + + getStartPositionOfChar + + + getEndPositionOfChar + + + getExtentOfChar + + + getRotationOfChar + + + getCharNumAtPosition + + + + + $Revision: 1.6 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-01-t.svg new file mode 100644 index 000000000..30cc2fbd6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-01-t.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

    + Purpose of test is to determine if the font family is being + correctly selected. The top two lines of text test serif fonts; + the top line in maroon tests the generic font family 'serif' + and the second line in black tests a selection of commonly + available named serif fonts. The next two lines of text test + sans-serif fonts; + the top line in maroon tests the generic font family 'sans-serif' + and the second line in black tests a selection of commonly + available named sans serif fonts. The following two lines + of text test monospaced fonts; + the top line in maroon tests the generic font family 'monospaced' + and the second line in black tests a selection of commonly + available named monospaced fonts. The lowercase 'i' and uppercase'W' + should be the same width,for monospaced fonts. +

    +

    + The seventh line of text, in green, tests for + three non-existent fonts (nonsense names). There is no fallback + generic font specified. The text must be displayed anyway. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The first six lines contain two Japanese characters (ç”»åƒ) + at the end of the line. Both of these characters must be displayed, + although it is compliant to display them with the 'missing glyph' + if no suitable font containing Japanese characters can be found. + Most but not all fonts have a visible missing glyph character. + If the selected font has a visible missing glyph character, it should appear + wherever the corresponding glyph is not available. +

    +
    + + $RCSfile: text-fonts-01-t.svg,v $ + + + + + + + + + + A serifed face ç”»åƒ + A sans-serif face ç”»åƒ + A mono (iW) face ç”»åƒ + + A serifed face ç”»åƒ + A sans-serif face ç”»åƒ + A mono (iW) face ç”»åƒ + + This must be displayed + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-02-t.svg new file mode 100644 index 000000000..ba2947149 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-02-t.svg @@ -0,0 +1,92 @@ + + + + + + + + + + + + +

    + Purpose of test is to determine if the font weight is being + correctly rendered. A number of font families are specified. The + numerical weight values (100 to 900) should show the lighter weights + on the lower numbers and the heavier weights on the larger numbers. + Heavier is defined to mean 'no lighter'. +

    +

    + If only one font weight is available, they should all display at the + same weight. The transition from black to green figures shows the + correct light to bold transition for the common case where two + weights are available. If three or more weights are available, see + the CSS2 specification for how these are allocated to the nine + weight numbers. +

    +

    + The absolute keywords 'normal' and bold' are tested + by the first two lines on the right hand side of the test, + the third line of text tests the to 'bolder' + relative keyword and the fourth tests the + 'lighter' relative keyword. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The numerical weight values (100 to 900) should show the lighter weights on the + lower numbers and the heavier weights on the larger numbers. Heavier is defined + to mean 'no lighter'. +

    +
    + + $RCSfile: text-fonts-02-t.svg,v $ + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-03-t.svg new file mode 100644 index 000000000..05a0fc69b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-03-t.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + +

    + Testing font-family attribute. + Two SVG fonts are defined. Various text elements are then + used with varying values for the font-family attribute. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The first two text elements should display in their respective fonts, + the last two should be displayed using the system font since the + value specified for font-family is either invalid or not specified. +

    +
    + + $RCSfile: text-fonts-03-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + font-family = "Haettenschweiler" + ABC + + font-family = "Charlesworth" + ABC + + font-family = "Invalid Name" + ABC + + font-family = not specified + ABC + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-04-t.svg new file mode 100644 index 000000000..e371d71d4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-04-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + +

    + Testing font-family attribute. + Various text elements are + used with varying values for the font-family attribute. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The first two text elements should display in their respective fonts, + Haettenschweiler and + Charlesworth, + if they are installed on the target system. Otherwise, simply + displaying the text in some fallback font is enough to pass the test. + The last two should be displayed using a fallback font since the + value specified for font-family is either invalid or not specified. + Failing to display the text means the test is not passed. +

    +
    + + $RCSfile: text-fonts-04-t.svg,v $ + + + + + + + + + + + font-family = "Haettenschweiler" + ABC + + font-family = "Charlesworth" + ABC + + font-family = "Invalid Name" + ABC + + font-family = not specified + ABC + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-05-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-05-f.svg new file mode 100644 index 000000000..b615e8036 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-05-f.svg @@ -0,0 +1,57 @@ + + + + + + + + + + + + +

    + Test that the 'line-height' property has no effect on text layout. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Test passes if the three blue instances of 'Filler Text' all have the same vertical position on the page. +

    +
    + + $RCSfile: text-fonts-05-f.svg,v $ + + + + + + + + + + FillerText + FillerText + FillerText + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-202-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-202-t.svg new file mode 100644 index 000000000..a26092a97 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-202-t.svg @@ -0,0 +1,100 @@ + + + + + + + + + + + + +

    + This tests the 'font-weight' property when multiple weights are available. A + font family with six weights is specified, with a fallback to 'serif'. +

    +

    + If only one font weight is available, they should all display at the same weight. + The transition from black to green figures shows the correct light to bold transition + for the common case where two weights are available. If three or more weights are + available, see the CSS2 specification for how these are allocated to the nine weight + numbers. The specified font has six weights. +

    +

    + The absolute keywords 'normal' and bold' are tested by the first two lines on the + right hand side of the test, the third line of text tests the to 'bolder' relative + keyword and the fourth tests the 'lighter' relative keyword. +

    + + +

    + If the platform supports installable opentype fonts, please download and install + Zalamander Caps + by Tim Ahrens of Just Another Foundry. + Then, view this test. +

    +
    + +

    + The numerical weight values (100 to 900) should show the lighter weights on the + lower numbers and the heavier weights on the larger numbers. Heavier is defined + to mean 'no lighter'. +

    +
    + + $RCSfile: text-fonts-202-t.svg,v $ + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-203-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-203-t.svg new file mode 100644 index 000000000..0f8d37624 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-203-t.svg @@ -0,0 +1,147 @@ + + + + + + + + + + + + +

    + This tests the 'font-weight' property when multiple weights are available. A + font family with five weights is specified, with a fallback to 'serif'. +

    +

    + The specified font family has five weights - 300, 400, 600, 700 and 800. + See the CSS3 Font specification + for how these are allocated to the nine weight numbers. +

    +

    + The absolute keywords 'normal' and bold' are tested by the first two lines on the + right hand side of the test, the third line of text tests the to 'bolder' relative + keyword and the fourth tests the 'lighter' relative keyword. +

    +

    The fonts are SVG fonts convertted, with the author's explicit permission, + from Zalamander Caps + by Tim Ahrens of Just Another Foundry. + An ASCII subset has been generated for this test. The font names have been + obfuscated, to deter + user agent sniffing for keywords like "Ultrabold". All weights in this generated + family are multiples of 100 and greater or equal to 300.

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The numerical weight values (100 to 900) should show the lighter weights on the + lower numbers and the heavier weights on the larger numbers. Heavier is defined + to mean 'no lighter'. +

    +
    + + $RCSfile: text-fonts-203-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-204-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-204-t.svg new file mode 100644 index 000000000..31f464a11 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-fonts-204-t.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + +

    + This tests the 'font-weight' property when multiple weights are available. A + font family with five weights is specified, with a fallback to 'serif'. +

    +

    + The specified font family has five weights - 300, 400, 600, 700 and 800. + See the CSS3 Font specification + for how these are allocated to the nine weight numbers. +

    +

    + The absolute keywords 'normal' and bold' are tested by the first two lines on the + right hand side of the test, the third line of text tests the to 'bolder' relative + keyword and the fourth tests the 'lighter' relative keyword. +

    +

    The fonts are WOFF fonts convertted, with the author's explicit permission, + from Zalamander Caps + by Tim Ahrens of Just Another Foundry. + The font names have been obfuscated, to deter + user agent sniffing for keywords like "Ultrabold". All weights in this generated + family are multiples of 100 and greater or equal to 300.

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The numerical weight values (100 to 900) should show the lighter weights on the + lower numbers and the heavier weights on the larger numbers. Heavier is defined + to mean 'no lighter'. +

    +
    + + $RCSfile: text-fonts-204-t.svg,v $ + + + + + + + + + + + + + + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + This is bold + This is normal + + Blue is bolder + + + Blue is lighter + + + ZalamanderCaps is an OpenType font + by Tim Ahrens of Just Another Foundry + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-01-t.svg new file mode 100644 index 000000000..6d28e0c5c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-01-t.svg @@ -0,0 +1,95 @@ + + + + + + + + + + + + +

    + Test left-to-right aspect of internationalized text. +

    +

    + Various text strings in various languages appear. The main + purpose of the test is to verify that the correct characters + appear and that they appear in the correct order and orientation, even + though the first choice font does not have the right glyphs. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Correct rendering requires that each character is rendered. It may be rendered + with the 'missing glyph' if no + glyphs are found in the fonts listed in the content, or in any fallback font + that is available. The first choice font + is a special SVG font that only contains the 'missing glyph'. Missing glyph from + other fonts may conformantly be used, however. +

    +

    + The test is passed if the lines of text appear as follows: +

    +
      +
    • Polish: MogÄ™ jeść szkÅ‚o, i mi ...
    • +
    • Russian: Я могу еÑÑ‚ÑŒ Ñтекло, ...
    • +
    • Greek: ΜποÏÏŽ να φάω ...
    • +
    • Hebrew: ×× ×™ יכול ל×כול זכוכית ...
    • +
    • Yiddish: ×יך קען עסן גל×ָז ×ון ...
    • +
    • Chinese:我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。
    • +
    • Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã¾ã™ã€‚
    • +
    +
    + + $RCSfile: text-intro-01-t.svg,v $ + + + + + + + + + + + + + + + Test left-to-right text. + + Polish: MogÄ™ jeść szkÅ‚o, i mi ... + Russian: Я могу еÑÑ‚ÑŒ Ñтекло, ... + Greek: ΜποÏÏŽ να φάω ... + Hebrew: ×× ×™ יכול ל×כול זכוכית ... + Yiddish: ×יך קען עסן גל×ָז ×ון ... + + + Chinese:我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 + + + Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã¾ã™ã€‚ + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-02-b.svg new file mode 100644 index 000000000..1b36814be --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-02-b.svg @@ -0,0 +1,81 @@ + + + + + + + + + + + + +

    + Test various aspects of internationalized text, including + left-to-right, right-to-left, and the + following properties: 'writing-mode', + 'direction' and 'unicode-bidi'. +

    +

    + Various text strings in various languages appear. Ttest of bidi algorithms and support of 'unicode-bidi' and + 'direction' properties. +

    + + +

    + This test requires installation of a system font that supports + the various international characters used in this test case. A + suitable font should be used by the SVG renderer if none of the + specified font families are available (or if they are available but do + not have the required glyphs). +

    +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if the correct characters + appear and they appear in the correct order and orientation. + Ensure that the three lines with Hebrew are ordered + correctly, as shown in the reference image. +

    +
    + + $RCSfile: text-intro-02-b.svg,v $ + + + + + + + + + unicode-bidi="bidi-override" direction="ltr". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + unicode-bidi="bidi-override" direction="rtl". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + unicode-bidi="normal" direction="rtl". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + + + $Revision: 1.10 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-03-b.svg new file mode 100644 index 000000000..8b20a6511 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-03-b.svg @@ -0,0 +1,84 @@ + + + + + + + + + + + + +

    + Test top-to-bottom internationalized text and the + following properties: 'writing-mode', + 'glyph-orientation-vertical', 'glyph-orientation-horizontal'. +

    +

    + Various text strings in various languages appear. The main + purpose of the test is to verify that the correct characters + appear and that they appear in the correct order and orientation. + Ensure that the two lines of + vertical Japanese text have the proper orientation + (test of 'glyph-orientation-vertical' property). +

    + + +

    + This test requires installation of a system font that supports + the various international characters used in this test case. A + suitable font should be used by the SVG renderer if none of the + specified font families are available (or if they are available but do + not have the required glyphs). To + minimize system dependencies, a future version of this test + might include all necessary glyphs as an SVG font. +

    +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if first line of text has the english text "Text" and + "in Chinese" rotated 270 degrees and the Chinese text displayed top to + bottom. The second line of text has the english text "Japanese:" rotated + 270 degrees and the Japanese text displayed top to bottom. The third + line of text has the letters in the english text "Japanese:" displayed + vertically and the Japanese text displayed top to bottom. +

    +
    + + $RCSfile: text-intro-03-b.svg,v $ + + + + + + + + + + Text "我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。" in Chinese + Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 + Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 + xt "æˆ‘èƒ½åž + se: ç§ã¯ + se: ç§ã¯ + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-04-t.svg new file mode 100644 index 000000000..565808ba6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-04-t.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + +

    + Test basic aspect of internationalized text. +

    +

    + Various text strings in various languages appear. The main + purpose of the test is to verify that the correct characters + appear and that they appear in the correct order and orientation. +

    +

    + A future version of this test + might include all necessary glyphs as an SVG font. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Correct rendering requires that each character is rendered. It is not required that a given character + be rendered with any particular font; just that it is rendered. + It may be rendered with the 'missing glyph' if no + glyphs are found in the fonts listed in the content, or in any fallback font that is available. +

    +
    + + $RCSfile: text-intro-04-t.svg,v $ + + + + + + + + + Test horizontal text. + + Polish: MogÄ™ jeść szkÅ‚o, i mi nie szkodzi. + Russian: Я могу еÑÑ‚ÑŒ Ñтекло, Ñто мне не вредит. + Greek: ΜποÏÏŽ να φάω σπασμένα γυαλιά χωÏίς να πάθω τίποτα. + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + Yiddish: ×יך קען עסן גל×ָז ×ון עס טוט מיר נישט װײ. + Chinese:我能åžä¸‹çŽ»ç’ƒè€Œä¸ä¼¤èº«ä½“。 + Japanese: ç§ã¯ã‚¬ãƒ©ã‚¹ã‚’食ã¹ã‚‰ã‚Œã¾ã™ã€‚ãã‚Œã¯ç§ã‚’å‚·ã¤ã‘ã¾ã›ã‚“。 + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-05-t.svg new file mode 100644 index 000000000..9f23827cf --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-05-t.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + +

    + Tests Arabic text using various platform fonts. If these fonts are not available, + a fallback font should be used that has Arabic glyphs. If such a font is not available, + the 'missing glyph' (typically an open rectangle) should be displayed. It is an error + to display the wrong Arabic glyphs, for example to display all isolate forms. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The text should be positioned such that the begining of the start of the + Arabic text is at very right of the test and runs towards the left of + the test border. +

    +
    + + $RCSfile: text-intro-05-t.svg,v $ + + + + + + + + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-06-t.svg new file mode 100644 index 000000000..0e5ac1f92 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-06-t.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + +

    + This test ensures that mandatory ligatures in Arabic are displayed. + This test uses WOFF fonts for rendering, with platform fonts for fallback. +

    +

    + There are two subtests. The first + requires an isolate lam-alef ligature and the second requires + a right-joining lam-alef ligature. +

    +

    + The first subtest has the word for 'tools', آلات + 0622: آ ARABIC LETTER ALEF WITH MADDA ABOVE + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062A: ت ARABIC LETTER TEH +

    +

    + The second subtest has the word for 'three', ثلاثة + 062B: ث ARABIC LETTER THEH + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062B: ث ARABIC LETTER THEH + 0629: ة ARABIC LETTER TEH MARBUTA +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if subtests are displayed as following: +

    +
      +
    • The first subtest has the word for 'tools', آلات
    • +
    • The second subtest has the word for 'three', ثلاثة
    • +
    +

    In the first subtest, there must be an isolate lam-alef ligature + and in the second subtest there must be a right-joining lam-alef + ligature, (so that them, lam and alef are all connected), as in the reference image. +

    +

    The precise glyph shapes will depend on which font was used for rendering, + and do not affect the pass criteria. Only the presence of the + mandatory ligatures is tested here.

    +
    + + $RCSfile: text-intro-06-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + $Revision: 1.10 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-07-t.svg new file mode 100644 index 000000000..f474aa99f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-07-t.svg @@ -0,0 +1,65 @@ + + + + + + + + + + +

    This test ensures that mandatory ligatures in Arabic are displayed.

    +

    + There are two subtests. The first requires an isolate lam-alef ligature + and the second requires a right-joining lam-alef ligature. +

    + + +

    Run the test. No interaction required.

    +
    + +

    + The test is passed if subtests are displayed as following: +

    +
      +
    • The first subtest has the word for 'tools', آلات
    • +
    • The second subtest has the word for 'three', ثلاثة
    • +
    +
    + + $RCSfile: text-intro-07-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + + $Revision: 1.2 $ + + + + \ No newline at end of file diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-09-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-09-b.svg new file mode 100644 index 000000000..1a39e383c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-09-b.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

    + Test various aspects of internationalized text, including + left-to-right, right-to-left, and the + following properties: 'writing-mode', + 'direction' and 'unicode-bidi'. +

    +

    + Various text strings in various languages appear. Test of bidi algorithms and support of 'unicode-bidi' and + 'direction' properties. Uses Webfonts. +

    +

    + This test uses Webfonts; both SVG and WOFF fonts are provided. +

    + + +

    + Run the test. No interaction required. Make sure scripting is enabled. +

    +
    + +

    + The test is passed if the correct characters + appear and they appear in the correct order and orientation. + Ensure that the three lines with Hebrew are ordered + correctly, as shown in the reference image. +

    +
    + + $RCSfile: text-intro-09-b.svg,v $ + + + + + + + + + + + + + + + unicode-bidi="bidi-override" direction="ltr". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + unicode-bidi="bidi-override" direction="rtl". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + unicode-bidi="normal" direction="rtl". + + Text "×× ×™ יכול ל×כול זכוכית וזה ×œ× ×ž×–×™×§ לי" is in Hebrew + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-10-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-10-f.svg new file mode 100644 index 000000000..db0b0fb46 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-10-f.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + +

    + Tests Arabic text using various platform fonts. If these fonts are not available, + a fallback font should be used that has Arabic glyphs. If such a font is not available, + the 'missing glyph' (typically an open rectangle) should be displayed. It is an error + to display the wrong Arabic glyphs, for example to display all isolate forms. +

    +

    This test uses writing-mode and direction to set the text as right-to-left.

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The text should be positioned such that the begining of the start of the + Arabic text is at very right of the test and runs towards the left of + the test border. +

    +
    + + $RCSfile: text-intro-10-f.svg,v $ + + + + + + + + + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + لماذا لا يتكلمون اللّغة العربية Ùحسب؟ + + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-11-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-11-t.svg new file mode 100644 index 000000000..d754b7e3e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-11-t.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + + +

    + This test ensures that mandatory ligatures in Arabic are displayed. + Three values for text-anchor are also tested; + middle, + start and + end. + This test uses platform fonts for rendering. +

    +

    + There are two subtests. The first + requires an isolate lam-alef ligature and the second requires + a right-joining lam-alef ligature. +

    +

    + The first subtest has the word for 'tools', آلات + 0622: آ ARABIC LETTER ALEF WITH MADDA ABOVE + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062A: ت ARABIC LETTER TEH +

    +

    + The second subtest has the word for 'three', ثلاثة + 062B: ث ARABIC LETTER THEH + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062B: ث ARABIC LETTER THEH + 0629: ة ARABIC LETTER TEH MARBUTA +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if the blue glyphs آ and ث touch the first vertical + line. The second vertical line falls in middle of the brown glyphs + inbetween آلا and ت and inbetween ثلا and ثة. The black glyphs ت and ة + touch the last vertical line. +

    +
    + + $RCSfile: text-intro-11-t.svg,v $ + + + + + + + + + + + + + + + آلات + آلات + آلات + ثلاثة + ثلاثة + ثلاثة + + + + $Revision: 1.2 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-12-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-12-t.svg new file mode 100644 index 000000000..0d0902f82 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-intro-12-t.svg @@ -0,0 +1,93 @@ + + + + + + + + + + + + +

    + This test ensures that mandatory ligatures in Arabic are displayed. + This test uses downloaded WOFF fonts for rendering. +

    +

    + There are two subtests. The first + requires an isolate lam-alef ligature and the second requires + a right-joining lam-alef ligature. +

    +

    + The first subtest has the word for 'tools', آلات + 0622: آ ARABIC LETTER ALEF WITH MADDA ABOVE + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062A: ت ARABIC LETTER TEH +

    +

    + The second subtest has the word for 'three', ثلاثة + 062B: ث ARABIC LETTER THEH + 0644: ل ARABIC LETTER LAM + 0627: ا ARABIC LETTER ALEF + 062B: ث ARABIC LETTER THEH + 0629: ة ARABIC LETTER TEH MARBUTA +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if subtests are displayed as following: +

    +
      +
    • The first subtest has the word for 'tools', آلات
    • +
    • The second subtest has the word for 'three', ثلاثة
    • +
    +

    In the first subtest, there must be an isolate lam-alef ligature + and in the second subtest there must be a right-joining lam-alef + ligature, as in the reference image. +

    +
    + + $RCSfile: text-intro-12-t.svg,v $ + + + + + + + + + + + + + آلات + ثلاثة + + + + $Revision: 1.3 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-01-b.svg new file mode 100644 index 000000000..a803ec17b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-01-b.svg @@ -0,0 +1,87 @@ + + + + + + + + + + + + +

    + Test textPath element in combination with the tspan element. Properties + of the text on a path are changed using the tspan element. +

    + + +

    + Run the test. No interaction required. Make sure scripting is enabled. +

    +
    + +

    + For this test to pass the rendered output must match the reference + image. The letters "Te" in first "Text on a path" sentence must be + colored pink and offset from the path in the y direction. +

    +
    + + $RCSfile: text-path-01-b.svg,v $ + + + + + + + + + + + + + + + + + Text on a path + + + + + + + + Text on a path + + + + 'tspan' subelement inside + the 'textPath' element. + + + + + The Text on path + + + 'startOffset' attribute of the + 'textPath' element. + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-02-b.svg new file mode 100644 index 000000000..3513226c2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-path-02-b.svg @@ -0,0 +1,101 @@ + + + + + + + + + + +

    + This tests the 'textPath/startOffset' with both negative and positive values, and + compares it to the case where a 'tspan/dx' attribute is used with the same values. +

    + + +

    + Run the test. No interaction required. Make sure scripting is enabled. +

    +
    + +

    + You should see four paths with text following each path. + The top two paths should show the text "Negative offset", and the bottom two paths should show the text + "Positive offset". +

    +

    + The test has passed if: +

    +
      +
    • the top two paths show the text "Negative offset"
    • +
    • the bottom two paths show the text "Positive offset"
    • +
    • the text on the bottom two paths starts a bit along the path
    • +
    • the text on the top two paths starts close to where the path starts (the first character is allowed to be slightly off the path)
    • +
    +
    + + $RCSfile: text-path-02-b.svg,v $ + + + + + + + + + + + + + + + + + Positive offset Negative offset + + + + + + Positive offset Negative offset + + + + + + + Positive offset Negative offset + + + + + + Positive offset Negative offset + + + + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-spacing-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-spacing-01-b.svg new file mode 100644 index 000000000..e90dfcab7 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-spacing-01-b.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

    + Test properties 'letter-spacing' and 'word-spacing' +

    +

    + The first three lines test property 'letter-spacing', with + values 0, -1 and .3em respectively. +

    +

    + The next three lines test property 'word-spacing', with + values 0, -3 and 3em respectively. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + This test is passed if: +

    +
      +
    • + The first three lines of text have the letters in the word + "letter-spacing" spaced according to the values 0, -1 and 0.3em + respectively. +
    • +
    • + The last three lines of text have the words in the sentence + "Two Words" spaced according to the values 0, -3 and 3em respectively. +
    • +
    +
    + + $RCSfile: text-spacing-01-b.svg,v $ + + + + + + + + + + letter-spacing:0 + letter-spacing:-1 + letter-spacing:.3 + ws:0 - Two Words + ws:-3 - Two Words + ws:3 - Two Words + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-01-b.svg new file mode 100644 index 000000000..19eccf766 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-01-b.svg @@ -0,0 +1,208 @@ + + + + + + + + + + + + +

    + Test viewer capibility to handle basic use of 'textLength' + and 'lengthAdjust' attributes. +

    +

    + There are four pairs of sub-tests. Each pair of sub-tests consists + of the same two strings: "Line to Stretch" on the left, and "this is + a line to squeeze" on the right. +

    +

    + The first (topmost) pair contains no occurrences of the textLength and + lengthAdjust attributes in the 'text' elements. + The pink reference line under each of the top + two strings indicates the approximate length of the strings. Since + the lengths are not constrained by the 'textLength' attribute, small + variations of the lengths are permissible. +

    +

    + The remaining three pairs each applies 'textLength' attributes to the + strings. In the leftmost sub-test of each pair, the 'textLength' value + will cause a stretching of the string of approximately 25% over the + "normal" length. In the rightmost sub-test of each pair, the 'textLength' value + will cause a squeezing of the string of approximately 20% under the + "normal" length for the string. +

    +

    + In each of the sub-tests with an application of 'textLength', the + pink reference lines indicate the exact extent of the rendered text. + The rendered text should fit snugly just within the ticks at the end of + the pink lines. +

    +

    + The second pair from the top contains 'textLength' but no 'lengthAdjust' + attributes. In this case, the effect should be as if the value "spacing" + were specified. Only the inter-character advancement and inter-word spacing + should change. The aspect ratio of the glyphs should be unaffected. The + reference image illustrates one valid way to achieve this, by a + uniform increase or decrease of inter-character advancement. +

    +

    + The third pair from the top explicitly sets 'lengthAdjust' value + to "spacing". Therefore it should be rendered identically to the second pair. +

    +

    + The fourth (bottommost) sub-test pair explicitly sets 'lengthAdjust' value + to "spacingAndGlyphs". The advancements between characters and words, as well as + the glyph aspect ratios should be affected. + The reference image illustrates one valid way to achieve + this, by a uniform expansion or compression of the string as a whole. + This effect is equivalent to application of a "scale(xfactor, 1.0)" transformation + to the 'text' elements. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The rendered picture should match the reference image, except as noted in the Test Description. + In particular, the 'textLength' constraint must be satisfied precisely, + and the basic rules associated with the "spacing" and "spacingAndGlyphs" values + of 'lengthAdjust' must be met, but the precise algorithm for meeting all + of the required contraints is otherwise unspecified. +

    +
    + + $RCSfile: text-text-01-b.svg,v $ + + + + + + + + + Basic test of 'textLength' + and 'lengthAdjust' attributes. + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + + + + + + textLength: default + lengthAdjust: default + textLength: default + lengthAdjust: default + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: default + textLength: 15% shorter + lengthAdjust: default + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: spacing + textLength: 15% shorter + lengthAdjust: spacing + + + + + + + Line to Stretch + this is a line to squeeze + + + + + + + + + + + + + textLength: 25% longer + lengthAdjust: sAG + textLength: 20% shorter + lengthAdjust: sAG + + + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-03-b.svg new file mode 100644 index 000000000..5f8617b7c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-03-b.svg @@ -0,0 +1,94 @@ + + + + + + + + + + + + +

    + Test text element, tspan element and various text decorations +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if: +

    +
      +
    • the word "Plain" is displayed using a blue serif font
    • +
    • the word "Italic" is displayed using a blue italic serif font
    • +
    • the word "Bold" is displayed using a blue serif bold font
    • +
    • the words "Line through" are displayed with a line through, using a pink serif font
    • +
    • the word "Underline" is displayed underlined using a blue serif font
    • +
    • the words "Bold, italic and underlined" are displayed underlined using a bold italic serif font
    • +
    +
    + + $RCSfile: text-text-03-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Plain + Italic + Bold + Underline + Line through + Bold, italic and underlined + + + + Each line of text which flows in a + rectangular box has to be broken + into separated lines. + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-04-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-04-t.svg new file mode 100644 index 000000000..aeeb716f2 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-04-t.svg @@ -0,0 +1,226 @@ + + + + + + + + + + + + +

    + The purpose of this test is to validate proper handling of + the text element's x and y attributes. + In the various samples, a orange marker shows the text's (0,0) + coordinate. The blue markers show the current text positions. + These are either defined by absolute x/y positioning or they + are computed from the embeded font's glyphs advances. +

    +

    + The first text sample shows a reference piece of text. +

    +

    + The second text sample (x all) shows a piece of text where + all the glyphs are positioned along the x axis. +

    +

    + The third text sample (x more) is a text element where there + are more x values than characters (5 values for 4 characters). + The last x value should be ignored and the result should + be the same as the third sample. +

    +

    + The fourth text sample (x fewer) is a text element where there + are fewer x values than characters (3 values for 4 characters). + The last character should not be positioned but laid out normally, + following its previous character sibling. +

    +

    + The fifth (y all), sixth (y more) and seventh (y fewer) text sample + parallel the second, + third and fourth test, but for the y attribute values. +

    +

    + The samples in the right column show combinations of x/y + value sets. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + In all the above tests, blue markers represent the expected glyph + positions. The orange markers are showing positions where no glyph + should appear. The glyphs are black squares of increasing sizes. +

    +
    + + $RCSfile: text-text-04-t.svg,v $ + + + + + + + + + + + + + + + + + + + + Reference + + + + + + 1234 + + + + + + + x all + + + + + + 1234 + + + + x more + + + + + + + 1234 + + + + x fewer + + + + + + 1234 + + + + y all + + + + + 1234 + + + + y more + + + + + 1234 + + + + y fewer + + + + + 1234 + + + + + x/y all + + + + + + 1234 + + + + x/y more + + + + + + + 1234 + + + + x/y fewer + + + + + + 1234 + + + + x all y fewer + + + + + + 1234 + + + + x fewer y all + + + + + + 1234 + + + + + + $Revision: 1.12 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-05-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-05-t.svg new file mode 100644 index 000000000..82affeaca --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-05-t.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + +

    + The purpose of this test is to validate the interaction of text-anchor + and x/y glyph positioning. +

    +

    + Each row shows a different combination of x/y values: 1, more than characters, + fewer than characters. This tests the anchor value: start. +

    +

    + The blue markers show the various x/y absolute positions around which text + chunks should be anchored. The glyphs are black squares of increasing sizes. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Rendered output must match the reference image for the test to pass. +

    +
    + + $RCSfile: text-text-05-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.x 1.y + 4.x 1.y + 2.x 1.y + 1.x 4.y + 4.x 4.y + 2.x 4.y + 1.x 2.y + 4.x 2.y + 2.x 2.y + + + + text-anchor + start + + + + + + 1234 + + + + + + + 1234 + + + + + 1234 + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-06-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-06-t.svg new file mode 100644 index 000000000..abefbc57c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-06-t.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + +

    + The purpose of this test is to validate the interaction of x/y + glyph positioning and ligatures. +

    +

    + The first line shows an example where there is a ligature (fi) which + should be accounted for before breaking into text chunks (see specification + section 10.5, additional x/y/dx/dy processing rules, bullet discussing + ligatures). In this first line, the ligatures cause the x position 180 + (shown in orange), to be ignored. As a result, a glyph should be shown over + each pale blue square markers. The glyphs are black squares of increasing sizes + except for the initial ligature which has the form of two small black triangles + joined at their tops. The ligature should show on the first pale blue + marker position. +

    +

    + The second line shows the same test but using multiple y positions. +

    +

    + The third line shows the same test but using multiple x and y + positions. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if: +

    +
      +
    • + The bottom left hand corners of the first row of black squares are + equal distance apart along the x axis and are centered inside the blue + squares. +
    • +
    • + The bottom left hand corners of the first row of black squares are + equal distance apart along the x and y axis and are centered inside + the blue squares. +
    • +
    • + The bottom left hand corners of the first row of black squares are + same distance apart in the x axis as the first row of squares and are + same distance apart in the y axis as the second row of squares. +
    • +
    +
    + + $RCSfile: text-text-06-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x positioning + y positioning + x/y positioning + + + + + + + + + + fi1234 + + + + + + + + + + fi1234 + + + + + + + + + + fi1234 + + + + + + $Revision: 1.9 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-07-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-07-t.svg new file mode 100644 index 000000000..a4ff44578 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-07-t.svg @@ -0,0 +1,79 @@ + + + + + + + + + + + + +

    + Tests multiple x, y, rotate, with various combinations. Since an + array of values is given, each glyph must use the value from the + corresponding character in the list. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if: +

    +
      +
    • + Each letter in the word "ROTATE" is rotated 10 + degrees more than the previous letter, with the first letter being + rotated at 0 degrees. +
    • +
    • + Each letter in the word "Multi XY" (including the white space) is + shifted in the x and y by 20 pixels more (in user space) than the + previous letter, with the first letter beginning at coordinate + 240, 60. +
    • +
    • + Each letter in the word "Both Together" (including the space) is + rotated and shifted. Each of the rotated letters is rotated -10 + degrees more than the previous letter, with the first letter being + rotated a 0 degrees. Each of the shifted letters is shifted by 20 + pixels more than the previous letter in the x direction and -10 pixels + more than the previous letter in the y direction, with the first + letter beginning at the coordinate 10, 300. +
    • +
    +
    + + $RCSfile: text-text-07-t.svg,v $ + + + + + + + + + Multi X Y + ROTATE + Both Together + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-08-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-08-b.svg new file mode 100644 index 000000000..b3938c1d3 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-08-b.svg @@ -0,0 +1,64 @@ + + + + + + + + + + + + +

    + The three opacity properties (fill-opacity, + stroke-opacity, and opacity) of 'text' elements are + covered in this test. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if: +

    +
      +
    • The text "Normal Text" has a pink stroke with no opacity and a blue fill with no opacity.
    • +
    • The text "Fill Opacity" has a pink stroke with no opacity and a blue fill with 50% opacity.
    • +
    • The text "Stroke Opacity" has a pink stroke with 50% opacity and a blue fill with no opacity.
    • +
    • The text "Opacity" has a pink stroke and a blue fill both with 50% opacity.
    • +
    +
    + + $RCSfile: text-text-08-b.svg,v $ + + + + + + + + + Normal Text + Fill opacity + Stroke opacity + Opacity + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-09-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-09-t.svg new file mode 100644 index 000000000..41b5ee1db --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-09-t.svg @@ -0,0 +1,83 @@ + + + + + + + + + + + + +

    + Tests multiple x, y, rotate, with various combinations. Since an + array of values is given, each glyph must use the value from the + corresponding character in the list. In this test, there are less values + in the array than there are characters. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if: +

    +
      +
    • + In the word "ROTATE", each of the letters "ROTA" is rotated 10 + degrees more than the previous letter, with the first letter being + rotated at 0 degrees. The letters "TE" have the same 30 degree rotation. +
    • +
    • + The first 5 letters in the word "MultiXY" are shifted in the x and y + by 20 pixels more (in user space) than the previous letter, with the + first letter beginning at coordinate 240, 60. The letters 'X' and 'Y' + will have the same y coordinate as the letter 'i' in "Multi". +
    • +
    • + The first 10 letters (including the space) in the word "Both Together" + are rotated and shifted. Each of the rotated letters is rotated -10 + degrees more than the previous letter, with the first letter being + rotated a 0 degrees. Subsequent letters after the first 10 rotated at + -90 degrees. Each of the shifted letters is shifted by 20 pixels more + than the previous letter in the x direction and -10 pixels more than + the previous letter in the y direction, with the first letter + beginning at the coordinate 10, 300. Subsequent letters after the + first 10 will have the same y coordinate as the letter 't' is + "Together". +
    • +
    +
    + + $RCSfile: text-text-09-t.svg,v $ + + + + + + + + + Multi X Y + ROTATE + Both Together + + + $Revision: 1.7 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-10-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-10-t.svg new file mode 100644 index 000000000..57b0e1b9b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-10-t.svg @@ -0,0 +1,76 @@ + + + + + + + + + + +

    + Test rendering of text rotated by a transform attribute. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test has passed if the image shows text rotated by various different angles, the result should closely match the reference image. +

    +
    + + $RCSfile: text-text-10-t.svg,v $ + + + + + + + + + + Rotated 90 degrees + Rotated -90 degrees + Rotated 180 degrees + Unrotated text + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-11-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-11-t.svg new file mode 100644 index 000000000..0316cbd75 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-11-t.svg @@ -0,0 +1,81 @@ + + + + + + + + + + +

    + Test rendering of text rotated by a transform attribute, same as the text-text-10-t test but not using an SVGFont. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test has passed if the image shows text rotated by various different angles, the result should closely match the reference image, but note that the font is allowed + be different from the font used in the reference image. +

    +
    + + $RCSfile: text-text-11-t.svg,v $ + + + + + + + + + + + + Rotated 90 degrees + Rotated -90 degrees + Rotated 180 degrees + Unrotated text + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + Rotated by 10 degrees + + + + + $Revision: 1.3 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-12-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-12-t.svg new file mode 100644 index 000000000..0fb521c4b --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-text-12-t.svg @@ -0,0 +1,186 @@ + + + + + + + + + + + + +

    ISSUE: the glyphs don't cover the entire em-cell, and the spec doesn't require visual alignment - text adjustments are based on advances

    +

    + The purpose of this test is to validate the interaction of text-anchor + and x/y glyph positioning. +

    +

    + Each row shows a different combination of x/y values: 1, more than characters, + fewer than characters. Each column shows different anchor values: middle + and end. +

    +

    + The blue markers show the various x/y absolute positions around which text + chunks should be anchored. The glyphs are black squares of increasing sizes. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Rendered output must match the reference image for the test to pass. +

    +
    + + $RCSfile: text-text-12-t.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.x 1.y + 4.x 1.y + 2.x 1.y + 1.x 4.y + 4.x 4.y + 2.x 4.y + 1.x 2.y + 4.x 2.y + 2.x 2.y + + + + + + + 1234 + + + + + + + 1234 + + + + + 1234 + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + + + + 1234 + + + + + + + 1234 + + + + + + text-anchor + middle + + + + + + text-anchor + end + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-01-b.svg new file mode 100644 index 000000000..10a53a0fd --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-01-b.svg @@ -0,0 +1,73 @@ + + + + + + + + + + + + +

    + Test viewer capability to handle a basic 'tref' element + which points to a text string in an external file. +

    +

    + The test case consists of a single sub-test. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The box in the middle of the frame should + contain green "Simple external referenced text.", + which is obtained by a 'tref' element reference to a 'text' element in a 'defs' + section of another file (text-extTref-BE-18-targ.svg). +

    +
    + + $RCSfile: text-tref-01-b.svg,v $ + + + + + + + + + + Test 'tref' element with an external referenced string. + + + + + + 'tref' to a string in another file + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-02-b.svg new file mode 100644 index 000000000..7773c95e1 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-02-b.svg @@ -0,0 +1,79 @@ + +]> + + + + + + + + + + + + +

    + Test viewer capability to handle 'tref' elements + which point to text strings outside the current SVG document fragment. +

    +

    + The test case consists of two sub-tests; one results in the word "Hello" and the second, the word "World". +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if the phrase "Hello World" is displayed, in green. +

    +
    + + $RCSfile: text-tref-02-b.svg,v $ + + + + + + + + + + Test 'tref' element pointing outside the SVG document fragment. + + + + + + + + + + Hello + + + + + + World + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-03-b.svg new file mode 100644 index 000000000..ba05e5d53 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tref-03-b.svg @@ -0,0 +1,71 @@ + +]> + + + + + + + + + + + + +

    + Test viewer capability to handle 'tref' elements + which point to elements that have children. The flattened text content is to be used. +

    +

    + The test case consists of one sub-test; it results in the word "Flattened" being displayed. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if the phrase "Flattened" is displayed, all in green and at the same font size. +

    +
    + + $RCSfile: text-tref-03-b.svg,v $ + + + + + + + + + + Test 'tref' element uses flattened textContent. + + + + + + + Flattened + + + + + + $Revision: 1.4 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-01-b.svg new file mode 100644 index 000000000..b3a3cb0e4 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-01-b.svg @@ -0,0 +1,74 @@ + + + + + + + + + + + + +

    + Test text selection. +

    +

    + Run the test. Make a text selection in the upper block of text, and verify that text selection is possible and that the selection does not extend across multiple lines. Now make a text selection in the lower block of text, verifying that the selection does extend over multiple lines. + +Thus, it should + be possible to start text selection at the start of the "However" + and drag through the end of "same time." and the all four lines + should be selected. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + For basic viewers conformant acion is as described above if there + is a text selection mechanism. Since text selection is optional + on a basic device if text selection is not implemented then this + test is a pass, move on to the next test. +

    +
    + + $RCSfile: text-tselect-01-b.svg,v $ + + + + + + + + + Test single line and multiline text selection. + + Here is a stand-alone 'text' element. + Here is a second 'text' element just below. + Because these are four separate 'text' elements, + text selection should not go across lines here. + + However, these lines of text are achieved by using + one 'tspan' per line, all contained within the same + 'text' element, so you should be able to select all + four lines at the same time. + + + $Revision: 1.8 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-02-f.svg new file mode 100644 index 000000000..12be0f93f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-02-f.svg @@ -0,0 +1,146 @@ + + + + + + + + + + + + +

    + This test demonstrates text selection of bidirectional text. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The initial result should be that the first 9 characters in logical order + starting from logical position 0 are selected. +

    +

    + Visually the selection is discontigous and these substrings must be selected (listed in visual order): +

    +

    + "abc" +

    +

    + the space between "c" and "ו" +

    +

    + "1" +

    +

    + the space between "3" and "×’" +

    +

    + "×בג" +

    +

    + If only the substrings listed above were selected then the test has passed. +

    +

    + A user agent that allows selecting text in logical order would have generated the same selection + as in this testcase if the user started the selection on the character "a" and ended it on the + character "1". + + A user agent that allows selecting text in visual order would not have a discontigous selection + if the user started the selection on the character "a" and ended it on the character "1". The copied + text would be discontigous instead in this case. + + Note that the SVG DOM method requires logical order text selection, so for both types of user agents + this testcase must look the same. +

    +

    + The testcase also shows what happens when the selection is modified via DOM (click the buttons below + the bidi-text). Compliant viewers must throw an exception when the first parameter handed + to SVGTextContentElement.selectSubString is out-of-range. + That means the variable 'startIndex' must always be in the range 0 <= startIndex <= 18. + It can be noted that the parameter 'numChars' is not restricted in this way. +

    +

    + Note that the color of the text selection is UA dependent and not defined in the SVG specification. +

    +
    + + $RCSfile: text-tselect-02-f.svg,v $ + + + + + + + + + + + + + + StartIndex: 0 NumChars: 0 + + + abc ×בג 123 דהו def + + + + + startIndex++ + + + startIndex-- + + + numChars++ + + + numChars-- + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-03-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-03-f.svg new file mode 100644 index 000000000..9d051088a --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tselect-03-f.svg @@ -0,0 +1,157 @@ + + + + + + + + + + + + +

    + This test demonstrates text selection of bidirectional text. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The initial result should be that the first 9 characters in logical order + starting from logical position 0 are selected. +

    +

    + Visually the selection is discontigous and these substrings must be selected (listed in visual order): +

    +

    + "abc" +

    +

    + the space between "c" and "ו" +

    +

    + "1" +

    +

    + the space between "3" and "×’" +

    +

    + "×בג" +

    +

    + If only the substrings listed above were selected then the test has passed. +

    +

    + A user agent that allows selecting text in logical order would have generated the same selection + as in this testcase if the user started the selection on the character "a" and ended it on the + character "1". + + A user agent that allows selecting text in visual order would not have a discontigous selection + if the user started the selection on the character "a" and ended it on the character "1". The copied + text would be discontigous instead in this case. + + Note that the SVG DOM method requires logical order text selection, so for both types of user agents + this testcase must look the same. +

    +

    + The testcase also shows what happens when the selection is modified via DOM (click the buttons below + the bidi-text). Compliant viewers must throw an exception when the first parameter handed + to SVGTextContentElement.selectSubString is out-of-range. + That means the variable 'startIndex' must always be in the range 0 <= startIndex <= 18. + It can be noted that the parameter 'numChars' is not restricted in this way. +

    +

    + Note that the color of the text selection is UA dependent and not defined in the SVG specification. +

    +
    + + $RCSfile: text-tselect-03-f.svg,v $ + + + + + + + + + + + + + + + + + + + + StartIndex: 0 NumChars: 0 + + + abc ×בג 123 דהו def + + + + + startIndex++ + + + startIndex-- + + + numChars++ + + + numChars-- + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-01-b.svg new file mode 100644 index 000000000..5d10f95d6 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-01-b.svg @@ -0,0 +1,113 @@ + + + + + + + + + + + + +

    + Test tspan element styling and relative position adjustments. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test has passed if: +

    +
      +
    • "You are not a banana" is displayed with the word "not" in bold green, with the rest of the sentence in normal blue.
    • +
    • "But you are a peach!" is displayed with the word "are" in bold green raised above the baseline, and "a peach!" lowered below the baseline.
    • +
    • "Cute and fuzzy" is displayed like there was spaces between each character, and "fuzzy" is displayed on a line below "Cute and".
    • +
    +
    + + $RCSfile: text-tspan-01-b.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Basics of tspan: changing visual properties and positioning. + + + + You are not a banana. + + + Text: "You are not a banana." + 'tspan' changes visual attributes of "not", + to green, bold. + + + + + But youare a peach! + + + Text: "But you are a peach!" + Using dx,dy, 'tspan' raises "are", + 'tspan' lowers "a peach!" + + + + + Cute and + fuzzy. + + + Text: "Cute and fuzzy." + 'tspan' char-by-char placement of "Cute and", + 'tspan' char-by-char "fuzzy", below it. + + + + $Revision: 1.10 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-02-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-02-b.svg new file mode 100644 index 000000000..735b41e9c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-tspan-02-b.svg @@ -0,0 +1,177 @@ + + + + + + + + + + +

    + Tests the rotate attribute in the tspan element. +

    +
      +
    • + Tests the case where more characters than rotate values are + supplied. In this case the last rotate value should propogate to + subsequent characters in the element and child tspan elements that + do not contain a rotate value. +
    • +
    • + Tests the case where more values than characters are supplied. In + this case each character should be rotated by the designated value + remaining unused values propogate to any child tspan elements that + do not contain a rotate value. +
    • +
    • + Tests the case where an ansestor of a tspan element specifies a + rotate value but the tspan itself doesn't. In this case the tspan + should use the current rotate value specified by the ansestor + element. +
    • +
    • + Tests the case where a tspan or text element specifies a rotate + value and contains a text string that is broken due to nested child + tspan. In this case characters after the child tspan element must + be rotated by the current rotate value. +
    • +
    + + +

    + Run the test. No interaction required. +

    +
    + +

    + For this test to pass the text "Not all characters in the text have a + specified rotation" must be displayed in green without any red showing. + If any red shows the test is a fail. +

    +

    + Rotation values: +

    +
      +
    • + The characters in the text "Not" must be rotated by 5,15 and 25 + degrees respectively. +
    • +
    • + The first 3 characters in the text "all characters" must be -10,-20 + and -30 degrees respectively. Subsequent characters in the text must + be each rotated by -40 degrees. +
    • +
    • + All the characters in the text "text have a" must be rotated by -40 + degrees. +
    • +
    • + The characters in the text "in the" must be rotated by 70,60,50,40,30 + and 20 degrees respectively. Note: the space in the text consumes a + rotate value. +
    • +
    • + All the characters in the text "specified" must be rotated by -10 + degrees. +
    • +
    • + All the characters in the text "rotation" must be rotated by 55 + degrees. +
    • +
    +
    + + $RCSfile: text-tspan-02-b.svg,v $ + + + + + + + + + + + Not all characters in the + text have a specified rotation + + + + + Not + + + all characters + + + in + + + the + + + + + text + + + have a + + + + specified + + + rotation + + + + +5 15 25 + + +-10 -20 -30 + + + -40 -40 -40 -40 -40 -40 -40 -40 -40 -40 + + +70 60 + + +40 30 20 + + +-40 -40 -40 -40 -40 -40 -40 -40 -40 + + + -10 -10 -10 -10 -10 -10 -10 -10 + + +-10 + + + 55 55 55 55 55 55 55 55 + + + + + + $Revision: 1.11 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-01-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-01-t.svg new file mode 100644 index 000000000..3d8b66890 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-01-t.svg @@ -0,0 +1,96 @@ + + + + + + + + + + + + + +

    + Test for viewer correct handling of whitespace and the 'xml:space' attribute. + There are two sub-tests, for xml:space value "default". + In each test, the content of the 'text' element is written on + multiple lines. The first test of each pair has indented text with leading + space characters, tabs, etc. The second has no indentation, but a line break + before the content and after it. There are no space (or other whitespace) + characters at the ends of the lines. +

    +

    + The two test cases are self-descriptive. From the top; + first, "default" value applied to 3 lines of content with indents, space characters, tabs, etc; + second, "default" applied to two lines content with no indent; +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + In each test, the test string is in blue and the reference + image is in black. + The rendered picture should approximately match the reference image, + however there is some question in the reference image concerning the + exact amount of space in the long-space areas. The third test uses the nbsp unicode character + to force the reference white spaces display, which provides an accurate match if the font in use + has the same metrics for that character and the default white space. + Also, variations are possible in the text fonts and layout (per CSS2 rules). +

    +

    + The test also uses the 'rect' element, + as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family (Arial) + and font-size properties. +

    +
    + + $RCSfile: text-ws-01-t.svg,v $ + + + + + + + + + Basic: xml:space attribute + & whitespace handling. + + + + WS with indented lines. + WS with indented lines. + + xml:space='default' + + + + + WS + non-indented lines. + + WS non-indented lines. + + xml:space='default' + + + $Revision: 1.8 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-02-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-02-t.svg new file mode 100644 index 000000000..15317ca01 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-02-t.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + +

    + Test for viewer correct handling of whitespace and the 'xml:space' attribute. + There are two sub-tests, for value "preserve". + In each test, the content of the 'text' element is written on + multiple lines. The first test of each pair has indented text with leading + space characters, tabs, etc. The second has no indentation, but a line break + before the content and after it. There are no space (or other whitespace) + characters at the ends of the lines. +

    +

    + The two test cases are self-descriptive. From the top; + first, "preserve" applied to essentially the same content as first; + second, "preserve" applied to essentially the same content as second. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + In each test, the test string is in blue and the reference + image is in black. + The rendered picture should approximately match the reference image, + however there is some question in the reference image concerning the + exact amount of space in the long-space areas. The third test uses the nbsp unicode character + to force the reference white spaces display, which provides an accurate match if the font in use + has the same metrics for that character and the default white space. + Also, variations are possible in the text fonts and layout (per CSS2 rules). +

    +

    + The test also uses the 'rect' element, + as well as basic fill (solid primary colors), + stroke (black 1-pixel lines), font-family + and font-size properties. +

    +
    + + $RCSfile: text-ws-02-t.svg,v $ + + + + + + + + + Basic: xml:space attribute + & whitespace handling. + + + + +WS + with + indented lines. + + +  WS   with  indented lines. + + + xml:space='preserve' + + + + WS +non-indented lines. + + WS non-indented lines. + + xml:space='preserve' + + + $Revision: 1.8 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-03-t.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-03-t.svg new file mode 100644 index 000000000..79854d7de --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/text-ws-03-t.svg @@ -0,0 +1,208 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + This tests that an 'xml:space' attribute on a text element child + will be honored. + + + + + Run the test. No interaction required. + + + + + After loading the test, four blue text strings and + four orange text strings should be presented. + + + The test is passed if all four blue text strings appear + identical (with a large space between the "b" and the "c" + on each line), and all four orange text strings appear + identical (with a small space between the "b" and the "c" + on each line). + + + + $RCSfile: text-ws-03-t.svg,v $ + + + + + + + + + Test that xml:space="" is honored on text element children + + cd + + ab cd + ab cd + ab + ab + + b cd + + ab cd + ab cd + a + a + + + + + $Revision: 1.9 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-01-f.svg new file mode 100644 index 000000000..2be4195b8 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-01-f.svg @@ -0,0 +1,75 @@ + + + + + + + + + + +

    + Tests scientific notation in attribute values; in particular, that numbers + of the form .n with a leading decimal point, are supported +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if all the coloured rectangles are of the same height + and line up with each other and + with the grey marker lines. If any red is visible, the test fails. +

    +
    + + $RCSfile: types-basic-01-f.svg,v $ + + + + + + + + + + + + + + + + + + + + Different forms of the <number> type + + + 50 + 5e1 + .5e2 + + + + + $Revision: 1.5 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-02-f.svg new file mode 100644 index 000000000..53fb16367 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-basic-02-f.svg @@ -0,0 +1,84 @@ + + + + + + + + + + +

    + Tests units and no units on <length> in CSS on a property defined in the SVG specification. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test is passed if there are six circles with the same thick green stroke visible, and no red. + If the SVG user agent doesn't support CSS styling then this test does not apply. +

    +
    + + $RCSfile: types-basic-02-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-01-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-01-b.svg new file mode 100644 index 000000000..60093ac54 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-01-b.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + +

    + This test checks all the methods and properties of the SVGLocatable interface. + Note the use of nested svg elements and testing against different elements in the hierarchy. + Note that the values of .getScreenCTM() and .getCTM() can only be tested correctly if they are + in the html-based test or the width and height of the root element is explicitly set to 480x360. + The methods .getScreenCTM() and .getCTM() are tested from the rotated text element, the method .getBBox(), + .getTransformToElement() is tested between the rotated text and its parent group, the method .getBBox() and + the properties .farthestViewportElement and .nearestViewportElement are tested on the blue circle. +

    + + +

    + Run the test. No interaction required. Make sure scripting is enabled. +

    +
    + +

    + For the test to pass, the values generated by script must match the values provided in the png image. The correct values are: +

    +

    + .getScreenCTM() for id "rotText": 0.42,0.42,-0.42,0.42,70.00,-60.00 +

    +

    + .getCTM() for id "rotText": 0.42,0.42,-0.42,0.42,70.00,-60.00 +

    +

    + .getTransformToElement() between id "rotText" and id "parentGroup": 0.42,0.42,-0.42,0.42,0.00,0.00 +

    +

    + .getBBox() for 'blueCircle': .x=-50,.y=-50,.width=100,.height=100 +

    +

    + .farthestViewportElement of blueCircle=svg-root +

    +

    + .nearestViewportElement of blueCircle=nestedSVG +

    +
    + + $RCSfile: types-dom-01-b.svg,v $ + + + + + + + + + + + + Rotated Text for testing SVGLocatable + Some other text with id 'otherText' + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-02-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-02-f.svg new file mode 100644 index 000000000..cac86de2d --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-02-f.svg @@ -0,0 +1,156 @@ + + + + + + + + + + +

    + This tests that the animVal properties that are objects + are always distinct from their corresponding baseVal properties. + This is tested for interfaces SVGAnimatedNumberList, SVGAnimatedLength, + SVGAnimatedLengthList, SVGAnimatedAngle, SVGAnimatedRect, + SVGAnimatedTransformList and SVGAnimatedPreserveAspectRatio. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Once loaded, the test shows 7 rectangles + representing seven sub-tests reflecting + the result of checking that an animVal object is + not the same object as its corresponding baseVal object. + Each rectangle will be either black to indicate that + the sub-test wasn't run, red to indicate that the + sub-test failed, and green to indicate that the + sub-test passed. +

    +

    + The test is passed if all 7 rectangles are green. +

    +
    + + $RCSfile: types-dom-02-f.svg,v $ + + + + + + + + + + animVal != baseVal: + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + + + abc + + + + + + + + + + $Revision: 1.8 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-03-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-03-b.svg new file mode 100644 index 000000000..b9228250f --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-03-b.svg @@ -0,0 +1,84 @@ + + + + + + + + + + +

    + Test that bounding box geometry can be obtained + before the SVGLoad event is dispatched. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Load the test. A rectangle will be shown indicating + the result of the test. It will be black if test + did not run, red if the test failed and green if + the test passed. +

    +

    + The test is passed if the rectangle is green. +

    +
    + + $RCSfile: types-dom-03-b.svg,v $ + + + + + + + + + + Test that getBBox() works before SVGLoad + + + Abc + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-04-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-04-b.svg new file mode 100644 index 000000000..37df62551 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-04-b.svg @@ -0,0 +1,250 @@ + + + + + + + + + + +

    + This tests that SVG DOM objects that correspond to attributes + are live. + This is tested for interfaces + SVGAnimatedNumberList, SVGAnimatedLength, + SVGAnimatedLengthList, SVGAnimatedAngle, SVGAnimatedRect, + SVGAnimatedTransformList, SVGAnimatedPreserveAspectRatio, + SVGAnimatedBoolean, SVGAnimatedString, SVGAnimatedEnumeration, + SVGAnimatedInteger and SVGAnimatedNumber. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Once loaded, the test shows 12 rectangles, one for + each sub-test. Each sub-test is checking that + an SVG DOM object of a particular interface is live. + The rectangle indicates the result of running the + sub-test: black to indicate that it wasn't run, + red to indicate that it failed, and green to indicate + that it passed. +

    +

    + The test is passed if all 12 rectangles are green. +

    +
    + + $RCSfile: types-dom-04-b.svg,v $ + + + + + + + + + + Testing liveness of SVG DOM objects + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + SVGAnimatedBoolean + + SVGAnimatedString + + SVGAnimatedEnumeration + + SVGAnimatedInteger + + SVGAnimatedNumber + + + + abc + + + + + + + + + + + + + $Revision: 1.7 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-05-b.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-05-b.svg new file mode 100644 index 000000000..52ca38323 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-05-b.svg @@ -0,0 +1,127 @@ + + + + + + + + + + +

    + This tests that assigning a valid length or angle string to + valueAsString on an SVGLength or SVGAngle will affect that object's + unitType, and that assigning an invalid string will throw + a DOMException with code SYNTAX_ERR. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Once the test is loaded, four rectangles are presented, indicating + the result of passing a valid or invalid string to an + SVGLength or SVGAngle object, as indicated. Each rectangle + will be black if the sub-test did not run, red if it + failed or green if it passed. +

    +

    + The test is passed if all four rectangles are green. +

    +
    + + $RCSfile: types-dom-05-b.svg,v $ + + + + + + + + + + Test side effects of assigning to valueAsString + + + + + + + Valid string on SVGLength + Invalid string on SVGLength + Valid string on SVGAngle + Invalid string on SVGAngle + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-06-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-06-f.svg new file mode 100644 index 000000000..09ed98f78 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-06-f.svg @@ -0,0 +1,130 @@ + + + + + + + + + + +

    + This tests parts of the SVGStringList interface. Particularly it tests that + strings that are taken from one SVGStringList and then inserted into another + SVGStringList duplicates the value instead of removing the value from the + first list when it's inserted into the second list. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + The test has passed if there are three green rectangles visible and no red. Red is an indication that the test failed. +

    +
    + + $RCSfile: types-dom-06-f.svg,v $ + + + + + + + + + + + + + + SVGStringList DOM + + + + + + + + + + + + + + + + + $Revision: 1.6 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-07-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-07-f.svg new file mode 100644 index 000000000..6abf6cabb --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-07-f.svg @@ -0,0 +1,156 @@ + + + + + + + + + + +

    + This tests that the contents of an animVal object are read only. + This is tested for interfaces SVGAnimatedNumberList, SVGAnimatedLength, + SVGAnimatedLengthList, SVGAnimatedAngle, SVGAnimatedRect, + SVGAnimatedTransformList and SVGAnimatedPreserveAspectRatio. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + Once loaded, the test shows 7 rectangles + representing seven sub-tests reflecting the result + of checking that an animVal object's contents is read + only. + Each rectangle will be either black to indicate that + the sub-test wasn't run, red to indicate that the + sub-test failed, and green to indicate that the + sub-test passed. +

    +

    + The test is passed if all 7 rectangles are green. +

    +
    + + $RCSfile: types-dom-07-f.svg,v $ + + + + + + + + + + animVal is read only: + + + + SVGAnimatedNumberList + + SVGAnimatedLength + + SVGAnimatedLengthList + + SVGAnimatedAngle + + SVGAnimatedRect + + SVGAnimatedTransformList + + SVGAnimatedPreserveAspectRatio + + + + abc + + + + + + + + + + $Revision: 1.2 $ + + + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-08-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-08-f.svg new file mode 100644 index 000000000..b2d1eaf62 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-08-f.svg @@ -0,0 +1,189 @@ + + + + + + + + + + +

    + This test draws a few basic shapes and checks for correct values from getBBox(). +

    + + +

    + Run the test. No interaction required. +

    +
    + +

    + To pass, each returned bounding box must be correct (indicated by printing the values in green), and when this happens the text in the rect with blue stroke changes from 'failed' to 'passed'. +

    +
    + + $RCSfile: types-dom-08-f.svg,v $ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SVGLocatable.getBBox() - basic test + + + + failed + + + + + + + $Revision: 1.1 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgfittoviewbox-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgfittoviewbox-01-f.svg new file mode 100644 index 000000000..e78792502 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgfittoviewbox-01-f.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + +

    + Retrieving the 'viewBox' and 'preserveAspectRatio' attributes of the 'SVGFitToViewBox' interface is supported. +

    + + +

    + Run the test. No interaction required. +

    +
    + +

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

    +
    + + $RCSfile: types-dom-svgfittoviewbox-01-f.svg,v $ + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svglengthlist-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svglengthlist-01-f.svg new file mode 100644 index 000000000..615cc649e --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svglengthlist-01-f.svg @@ -0,0 +1,114 @@ + + + + + + + + + + +

    + The 'getItem', 'replaceItem', and 'removeItem' operations of the 'SVGLengthList' interface raise the 'INDEX_SIZE_ERR' exception when the specified + index number is greater than the number of items in the list. +

    + + +

    + Retrieve a 'SVGLengthList' object by getting the 'baseVal' attribute from the 'x' object of a 'SVGTextElement'. Attempt to call 'getItem', + 'replaceItem', and 'removeItem' with an index larger than the number of items in the list. For each of these operations, verify there was an + exception of type 'INDEX_SIZE_ERR' thrown. +

    +
    + +

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

    +
    + + $RCSfile: types-dom-svglengthlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgnumberlist-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgnumberlist-01-f.svg new file mode 100644 index 000000000..96e230cfe --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgnumberlist-01-f.svg @@ -0,0 +1,114 @@ + + + + + + + + + + +

    + The 'getItem', 'replaceItem', and 'removeItem' operations of the 'SVGNumberList' interface raise the 'INDEX_SIZE_ERR' exception when the specified + index number is greater than the number of items in the list. +

    + + +

    + Retrieve a 'SVGNumberList' object by getting the 'baseVal' attribute from the 'rotate' object of a 'SVGTextElement'. Attempt to call 'getItem', + 'replaceItem', and 'removeItem' with an index larger than the number of items in the list. For each of these operations, verify there was an + exception of type 'INDEX_SIZE_ERR' thrown. +

    +
    + +

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

    +
    + + $RCSfile: types-dom-svgnumberlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgstringlist-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgstringlist-01-f.svg new file mode 100644 index 000000000..17a457c2c --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgstringlist-01-f.svg @@ -0,0 +1,112 @@ + + + + + + + + + + +

    + The 'getItem', 'replaceItem', and 'removeItem' operations of the 'SVGStringList' interface raise the 'INDEX_SIZE_ERR' exception when the specified index number + is greater than the number of items in the list. +

    + + +

    + Retrieve a 'SVGStringList' object by getting the 'requiredExtensions' attribute from a 'SVGSVGElement'. Attempt to call 'getItem', 'replaceItem', + and 'removeItem' with an index larger than the number of items in the list. For each of these operations, verify there was an exception of type 'INDEX_SIZE_ERR' thrown. +

    +
    + +

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

    +
    + + $RCSfile: types-dom-svgstringlist-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.4 $ + + + + + + DRAFT + + diff --git a/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgtransformable-01-f.svg b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgtransformable-01-f.svg new file mode 100644 index 000000000..15aa68601 --- /dev/null +++ b/Demo-Samples/W3C_SVG_11_TestSuite/svg/types-dom-svgtransformable-01-f.svg @@ -0,0 +1,82 @@ + + + + + + + + + + +

    + Retrieving and setting the 'transform' attribute of the 'SVGTransformable' interface is supported. +

    + + +

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

    +
    + + $RCSfile: types-dom-svgtransformable-01-f.svg,v $ + + + + + + + + + + + FAIL + PASS + + + + + $Revision: 1.5 $ + + + + + + DRAFT + + diff --git a/Demo-iOS.xcodeproj/project.pbxproj b/Demo-iOS.xcodeproj/project.pbxproj index 302557c15..b314f7a88 100644 --- a/Demo-iOS.xcodeproj/project.pbxproj +++ b/Demo-iOS.xcodeproj/project.pbxproj @@ -7,11 +7,95 @@ objects = { /* Begin PBXBuildFile section */ - 6610D719181D5475004F4C11 /* BlankMap-World6-Equirectangular.svg in Resources */ = {isa = PBXBuildFile; fileRef = 6610D718181D5475004F4C11 /* BlankMap-World6-Equirectangular.svg */; }; + 3242C36E217CF0CD0013765F /* Blocky.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 3242C368217CF0CD0013765F /* Blocky.ttf */; }; + 32AF7BBE217389FD00142396 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 529DADF11C415FF00069B076 /* SVGKit.framework */; }; + 32AF7BC021738A0300142396 /* SVGKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 529DADF11C415FF00069B076 /* SVGKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 32D3D5EC2176E3FA00ED20D8 /* Mozilla_Firefox_logo_2013.svg in Resources */ = {isa = PBXBuildFile; fileRef = 32D3D5E62176E3FA00ED20D8 /* Mozilla_Firefox_logo_2013.svg */; }; + 32D3D5F12176FA0700ED20D8 /* Mozilla_Firefox_logo_2013.png in Resources */ = {isa = PBXBuildFile; fileRef = 32D3D5F02176FA0700ED20D8 /* Mozilla_Firefox_logo_2013.png */; }; + 32D42245217AED3900CFD064 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 32D42244217AED3900CFD064 /* LaunchScreen.storyboard */; }; + 4FD8223F1AD057F000E419D3 /* arcs01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 4FD8223D1AD057F000E419D3 /* arcs01.svg */; }; + 4FD822401AD057F000E419D3 /* arcs02.svg in Resources */ = {isa = PBXBuildFile; fileRef = 4FD8223E1AD057F000E419D3 /* arcs02.svg */; }; + 4FD822441AD058AB00E419D3 /* arcs01.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FD822421AD058AB00E419D3 /* arcs01.png */; }; + 4FD822451AD058AB00E419D3 /* arcs02.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FD822431AD058AB00E419D3 /* arcs02.png */; }; + 556C405119A5122800733CBB /* test-stroke-dash-array.svg in Resources */ = {isa = PBXBuildFile; fileRef = 556C405019A5122800733CBB /* test-stroke-dash-array.svg */; }; 661A0DCF161727CF008D5FBE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 661A0DCE161727CF008D5FBE /* UIKit.framework */; }; 661A0DD1161727CF008D5FBE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 661A0DD0161727CF008D5FBE /* Foundation.framework */; }; 661A0DD3161727CF008D5FBE /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 661A0DD2161727CF008D5FBE /* CoreGraphics.framework */; }; 661ADBFA16CC3399006F4BC3 /* rotated-and-skewed-text.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661ADBF916CC3399006F4BC3 /* rotated-and-skewed-text.svg */; }; + 661EEA411ACC02AF007176B0 /* SB~iphone.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA401ACC02AF007176B0 /* SB~iphone.storyboard */; }; + 661EEA431ACC04F2007176B0 /* Licenses.plist in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA421ACC04F2007176B0 /* Licenses.plist */; }; + 661EEA481ACC0667007176B0 /* VCGridOfImagesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 661EEA471ACC0667007176B0 /* VCGridOfImagesViewController.m */; }; + 661EEA4B1ACC140F007176B0 /* SampleFileInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 661EEA4A1ACC140F007176B0 /* SampleFileInfo.m */; }; + 661EEA541ACC1723007176B0 /* Monkey.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA521ACC1723007176B0 /* Monkey.png */; }; + 661EEA551ACC1723007176B0 /* Note.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA531ACC1723007176B0 /* Note.png */; }; + 661EEA701ACC2E31007176B0 /* VCMainMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 661EEA6F1ACC2E31007176B0 /* VCMainMenuViewController.m */; }; + 661EEA7D1ACC2FBB007176B0 /* cubic01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA721ACC2FBB007176B0 /* cubic01.svg */; }; + 661EEA7E1ACC2FBB007176B0 /* fillrule-evenodd.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA731ACC2FBB007176B0 /* fillrule-evenodd.svg */; }; + 661EEA7F1ACC2FBB007176B0 /* lingrad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA741ACC2FBB007176B0 /* lingrad01.svg */; }; + 661EEA801ACC2FBB007176B0 /* opacity01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA751ACC2FBB007176B0 /* opacity01.svg */; }; + 661EEA811ACC2FBB007176B0 /* pattern01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA761ACC2FBB007176B0 /* pattern01.svg */; }; + 661EEA821ACC2FBB007176B0 /* PreserveAspectRatio.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA771ACC2FBB007176B0 /* PreserveAspectRatio.svg */; }; + 661EEA831ACC2FBB007176B0 /* quad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA781ACC2FBB007176B0 /* quad01.svg */; }; + 661EEA841ACC2FBB007176B0 /* radgrad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA791ACC2FBB007176B0 /* radgrad01.svg */; }; + 661EEA851ACC2FBB007176B0 /* StyleAttribute.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA7A1ACC2FBB007176B0 /* StyleAttribute.svg */; }; + 661EEA861ACC2FBB007176B0 /* text01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA7B1ACC2FBB007176B0 /* text01.svg */; }; + 661EEA871ACC2FBB007176B0 /* tspan01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA7C1ACC2FBB007176B0 /* tspan01.svg */; }; + 661EEA941ACC2FD4007176B0 /* cubic01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA891ACC2FD4007176B0 /* cubic01.png */; }; + 661EEA951ACC2FD4007176B0 /* fillrule-evenodd.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8A1ACC2FD4007176B0 /* fillrule-evenodd.png */; }; + 661EEA961ACC2FD4007176B0 /* lingrad01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8B1ACC2FD4007176B0 /* lingrad01.png */; }; + 661EEA971ACC2FD4007176B0 /* opacity01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8C1ACC2FD4007176B0 /* opacity01.png */; }; + 661EEA981ACC2FD4007176B0 /* pattern01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8D1ACC2FD4007176B0 /* pattern01.png */; }; + 661EEA991ACC2FD4007176B0 /* PreserveAspectRatio.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8E1ACC2FD4007176B0 /* PreserveAspectRatio.png */; }; + 661EEA9A1ACC2FD4007176B0 /* quad01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA8F1ACC2FD4007176B0 /* quad01.png */; }; + 661EEA9B1ACC2FD4007176B0 /* radgrad01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA901ACC2FD4007176B0 /* radgrad01.png */; }; + 661EEA9C1ACC2FD4007176B0 /* StyleAttribute.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA911ACC2FD4007176B0 /* StyleAttribute.png */; }; + 661EEA9D1ACC2FD4007176B0 /* text01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA921ACC2FD4007176B0 /* text01.png */; }; + 661EEA9E1ACC2FD4007176B0 /* tspan01.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEA931ACC2FD4007176B0 /* tspan01.png */; }; + 661EEAA41ACC3053007176B0 /* gradients.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAA01ACC3053007176B0 /* gradients.png */; }; + 661EEAA51ACC3053007176B0 /* shapes.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAA11ACC3053007176B0 /* shapes.png */; }; + 661EEAA61ACC3053007176B0 /* strokes.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAA21ACC3053007176B0 /* strokes.png */; }; + 661EEAA71ACC3053007176B0 /* transformations.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAA31ACC3053007176B0 /* transformations.png */; }; + 661EEACA1ACC3444007176B0 /* australia_states_blank.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAA81ACC3444007176B0 /* australia_states_blank.png */; }; + 661EEACC1ACC3444007176B0 /* Blank_Map-Africa.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAA1ACC3444007176B0 /* Blank_Map-Africa.png */; }; + 661EEACD1ACC3444007176B0 /* BlankMap-World6-Equirectangular.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAB1ACC3444007176B0 /* BlankMap-World6-Equirectangular.png */; }; + 661EEACE1ACC3444007176B0 /* breaking-1.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAC1ACC3444007176B0 /* breaking-1.png */; }; + 661EEACF1ACC3444007176B0 /* Coins.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAD1ACC3444007176B0 /* Coins.png */; }; + 661EEAD01ACC3444007176B0 /* CurvedDiamond.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAE1ACC3444007176B0 /* CurvedDiamond.png */; }; + 661EEAD11ACC3444007176B0 /* Europe_states_reduced.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAAF1ACC3444007176B0 /* Europe_states_reduced.png */; }; + 661EEAD21ACC3444007176B0 /* g-element-applies-rotation.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB01ACC3444007176B0 /* g-element-applies-rotation.png */; }; + 661EEAD31ACC3444007176B0 /* groups-and-layers-test.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB11ACC3444007176B0 /* groups-and-layers-test.png */; }; + 661EEAD41ACC3444007176B0 /* ImageAspectRatio.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB21ACC3444007176B0 /* ImageAspectRatio.png */; }; + 661EEAD51ACC3444007176B0 /* imagetag-layer2-sun.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB31ACC3444007176B0 /* imagetag-layer2-sun.png */; }; + 661EEAD61ACC3444007176B0 /* imageWithASinglePointPath.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB41ACC3444007176B0 /* imageWithASinglePointPath.png */; }; + 661EEAD71ACC3444007176B0 /* Lion.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB51ACC3444007176B0 /* Lion.png */; }; + 661EEAD81ACC3444007176B0 /* Location_European_nation_states.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB61ACC3444007176B0 /* Location_European_nation_states.png */; }; + 661EEAD91ACC3444007176B0 /* map-alaska-onlysimple.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB71ACC3444007176B0 /* map-alaska-onlysimple.png */; }; + 661EEADA1ACC3444007176B0 /* Map.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB81ACC3444007176B0 /* Map.png */; }; + 661EEADB1ACC3444007176B0 /* MathCurve-optimized.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAB91ACC3444007176B0 /* MathCurve-optimized.png */; }; + 661EEADC1ACC3444007176B0 /* parent-clip.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABA1ACC3444007176B0 /* parent-clip.png */; }; + 661EEADD1ACC3444007176B0 /* radial-gradient-opacity.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABB1ACC3444007176B0 /* radial-gradient-opacity.png */; }; + 661EEADE1ACC3444007176B0 /* radialGradientTest.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABC1ACC3444007176B0 /* radialGradientTest.png */; }; + 661EEADF1ACC3444007176B0 /* RainbowWing.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABD1ACC3444007176B0 /* RainbowWing.png */; }; + 661EEAE01ACC3444007176B0 /* Reinel_compass_rose-simplified-for-testing.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABE1ACC3444007176B0 /* Reinel_compass_rose-simplified-for-testing.png */; }; + 661EEAE11ACC3444007176B0 /* Reinel_compass_rose.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEABF1ACC3444007176B0 /* Reinel_compass_rose.png */; }; + 661EEAE21ACC3444007176B0 /* rotated-and-skewed-text.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC01ACC3444007176B0 /* rotated-and-skewed-text.png */; }; + 661EEAE31ACC3444007176B0 /* rounded-rects.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC11ACC3444007176B0 /* rounded-rects.png */; }; + 661EEAE41ACC3444007176B0 /* sakamura-default-fill-opacity-test.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC21ACC3444007176B0 /* sakamura-default-fill-opacity-test.png */; }; + 661EEAE51ACC3444007176B0 /* svg-with-explicit-width-large.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC31ACC3444007176B0 /* svg-with-explicit-width-large.png */; }; + 661EEAE61ACC3444007176B0 /* svg-with-explicit-width.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC41ACC3444007176B0 /* svg-with-explicit-width.png */; }; + 661EEAE71ACC3444007176B0 /* test-stroke-dash-array.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC51ACC3444007176B0 /* test-stroke-dash-array.png */; }; + 661EEAE81ACC3444007176B0 /* test-wave-1.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC61ACC3444007176B0 /* test-wave-1.png */; }; + 661EEAE91ACC3444007176B0 /* Text.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC71ACC3444007176B0 /* Text.png */; }; + 661EEAEA1ACC3444007176B0 /* uk-only.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC81ACC3444007176B0 /* uk-only.png */; }; + 661EEAEB1ACC3444007176B0 /* voies.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAC91ACC3444007176B0 /* voies.png */; }; + 661EEAEE1ACC3471007176B0 /* Coin.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAEC1ACC3471007176B0 /* Coin.png */; }; + 661EEAEF1ACC3471007176B0 /* Snowman.png in Resources */ = {isa = PBXBuildFile; fileRef = 661EEAED1ACC3471007176B0 /* Snowman.png */; }; + 6627019A1AD9567600B3AD03 /* Cycling_Lambie.svg in Resources */ = {isa = PBXBuildFile; fileRef = 662701991AD9567600B3AD03 /* Cycling_Lambie.svg */; }; + 6627019D1AD9579900B3AD03 /* Cycling_Lambie.png in Resources */ = {isa = PBXBuildFile; fileRef = 6627019C1AD9579900B3AD03 /* Cycling_Lambie.png */; }; + 6627019F1AD9585C00B3AD03 /* bike-frame.svg in Resources */ = {isa = PBXBuildFile; fileRef = 6627019E1AD9585C00B3AD03 /* bike-frame.svg */; }; + 662701A11AD9587500B3AD03 /* bike-frame.png in Resources */ = {isa = PBXBuildFile; fileRef = 662701A01AD9587500B3AD03 /* bike-frame.png */; }; + 662701A41AD978A800B3AD03 /* VCAllSpecImages.m in Sources */ = {isa = PBXBuildFile; fileRef = 662701A31AD978A800B3AD03 /* VCAllSpecImages.m */; }; + 662712641AD97D7600B3AD03 /* W3C_SVG_11_TestSuite in Resources */ = {isa = PBXBuildFile; fileRef = 662712631AD97D7500B3AD03 /* W3C_SVG_11_TestSuite */; }; 66324BE216D24FA4001C1E83 /* rounded-rects.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66324BE116D24FA4001C1E83 /* rounded-rects.svg */; }; 663FCFF116C9AF1C00CCBFB3 /* gradients.svg in Resources */ = {isa = PBXBuildFile; fileRef = 663FCFED16C9AF1C00CCBFB3 /* gradients.svg */; }; 663FCFF216C9AF1C00CCBFB3 /* shapes.svg in Resources */ = {isa = PBXBuildFile; fileRef = 663FCFEE16C9AF1C00CCBFB3 /* shapes.svg */; }; @@ -20,17 +104,24 @@ 663FCFF616C9AF3C00CCBFB3 /* Sample Licenses from svg-android project.txt in Resources */ = {isa = PBXBuildFile; fileRef = 663FCFF516C9AF3C00CCBFB3 /* Sample Licenses from svg-android project.txt */; }; 663FD00416CAB16B00CCBFB3 /* groups-and-layers-test.svg in Resources */ = {isa = PBXBuildFile; fileRef = 663FD00316CAB16B00CCBFB3 /* groups-and-layers-test.svg */; }; 6649E0AD1617479200AFE92A /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6649E0AC1617479200AFE92A /* QuartzCore.framework */; }; - 6649E10D1617577000AFE92A /* libSVGKit-iOS.1.1.0pre.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6649E10A1617574700AFE92A /* libSVGKit-iOS.1.1.0pre.a */; }; 6649E10F1617578500AFE92A /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 6649E10E1617578500AFE92A /* libxml2.dylib */; }; 665E07F316CE81DD00D6934D /* g-element-applies-rotation.svg in Resources */ = {isa = PBXBuildFile; fileRef = 665E07F216CE81DD00D6934D /* g-element-applies-rotation.svg */; }; 6661A77D1698BBE20061E349 /* CoreText.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6661A77C1698BBE20061E349 /* CoreText.framework */; }; - 66A09CA616CFE67B003CD5CD /* lingrad01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA016CFE67B003CD5CD /* lingrad01.svg */; }; - 66A09CA716CFE67B003CD5CD /* opacity01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA116CFE67B003CD5CD /* opacity01.svg */; }; - 66A09CA816CFE67B003CD5CD /* PreserveAspectRatio.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA216CFE67B003CD5CD /* PreserveAspectRatio.svg */; }; - 66A09CA916CFE67B003CD5CD /* StyleAttribute.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA316CFE67B003CD5CD /* StyleAttribute.svg */; }; - 66A09CAA16CFE67B003CD5CD /* text01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA416CFE67B003CD5CD /* text01.svg */; }; - 66A09CAB16CFE67B003CD5CD /* tspan01.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A09CA516CFE67B003CD5CD /* tspan01.svg */; }; + 666D03161AD07CAE006ED358 /* Reinel_compass_rose-simplified-more.svg in Resources */ = {isa = PBXBuildFile; fileRef = 666D03151AD07CAE006ED358 /* Reinel_compass_rose-simplified-more.svg */; }; + 666D03191AD07CC2006ED358 /* Reinel_compass_rose-simplified-more.png in Resources */ = {isa = PBXBuildFile; fileRef = 666D03181AD07CC2006ED358 /* Reinel_compass_rose-simplified-more.png */; }; + 666D031B1AD07E2E006ED358 /* Reinel_compass_rose-simplified-evenmore.png in Resources */ = {isa = PBXBuildFile; fileRef = 666D031A1AD07E2E006ED358 /* Reinel_compass_rose-simplified-evenmore.png */; }; + 666D031D1AD07E3B006ED358 /* Reinel_compass_rose-simplified-evenmore.svg in Resources */ = {isa = PBXBuildFile; fileRef = 666D031C1AD07E3B006ED358 /* Reinel_compass_rose-simplified-evenmore.svg */; }; + 666D031F1AD080EF006ED358 /* Scale-Negative-Direction.svg in Resources */ = {isa = PBXBuildFile; fileRef = 666D031E1AD080EF006ED358 /* Scale-Negative-Direction.svg */; }; + 666D03211AD08116006ED358 /* Scale-Negative-Direction.png in Resources */ = {isa = PBXBuildFile; fileRef = 666D03201AD08116006ED358 /* Scale-Negative-Direction.png */; }; + 667CA17C181D552A00E49B68 /* BlankMap-World6-Equirectangular.svg in Resources */ = {isa = PBXBuildFile; fileRef = 667CA17B181D552A00E49B68 /* BlankMap-World6-Equirectangular.svg */; }; 66A9F4441688C66E000D4A2E /* RainbowWing.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66A9F4431688C66E000D4A2E /* RainbowWing.svg */; }; + 66B695F2199BFAC900F8E7EE /* imagetag-layered.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66B695EF199BFAC900F8E7EE /* imagetag-layered.svg */; }; + 66B695F3199BFAC900F8E7EE /* bird-1382034603Euc-cropped.png in Resources */ = {isa = PBXBuildFile; fileRef = 66B695F0199BFAC900F8E7EE /* bird-1382034603Euc-cropped.png */; }; + 66B695F4199BFAC900F8E7EE /* imagetag-layer2-sun.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66B695F1199BFAC900F8E7EE /* imagetag-layer2-sun.svg */; }; + 66B86F881ACC686B00C18ECE /* NewTux.png in Resources */ = {isa = PBXBuildFile; fileRef = 66B86F871ACC686B00C18ECE /* NewTux.png */; }; + 66B86F8B1ACC687700C18ECE /* NewTux.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66B86F8A1ACC687700C18ECE /* NewTux.svg */; }; + 66B86F8D1ACC6E7000C18ECE /* MathCurve-optimized.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66B86F8C1ACC6E7000C18ECE /* MathCurve-optimized.svg */; }; + 66C43EA918398E6E00299662 /* sakamura-default-fill-opacity-test.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66C43EA818398E6E00299662 /* sakamura-default-fill-opacity-test.svg */; }; 66E785AB171A228A001EF59D /* svg-with-explicit-width.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E785AA171A228A001EF59D /* svg-with-explicit-width.svg */; }; 66E785AD171A2345001EF59D /* svg-with-explicit-width-large.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E785AC171A2345001EF59D /* svg-with-explicit-width-large.svg */; }; 66E8626B1688BA0B0059C9C4 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E862581688BA0B0059C9C4 /* AppDelegate.m */; }; @@ -43,8 +134,6 @@ 66E862731688BA0B0059C9C4 /* MasterViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 66E862661688BA0B0059C9C4 /* MasterViewController_iPhone.xib */; }; 66E862741688BA0B0059C9C4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E862681688BA0B0059C9C4 /* main.m */; }; 66E862751688BA0B0059C9C4 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8626A1688BA0B0059C9C4 /* MasterViewController.m */; }; - 66E8628E1688BA510059C9C4 /* Monkey.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E862781688BA510059C9C4 /* Monkey.png */; }; - 66E8628F1688BA510059C9C4 /* Note.png in Resources */ = {isa = PBXBuildFile; fileRef = 66E862791688BA510059C9C4 /* Note.png */; }; 66E862911688BA510059C9C4 /* australia_states_blank.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8627C1688BA510059C9C4 /* australia_states_blank.svg */; }; 66E862921688BA510059C9C4 /* Blank_Map-Africa.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8627D1688BA510059C9C4 /* Blank_Map-Africa.svg */; }; 66E862931688BA510059C9C4 /* breaking-1.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8627E1688BA510059C9C4 /* breaking-1.svg */; }; @@ -54,7 +143,6 @@ 66E862971688BA510059C9C4 /* Lion.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862821688BA510059C9C4 /* Lion.svg */; }; 66E862981688BA510059C9C4 /* Location_European_nation_states.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862831688BA510059C9C4 /* Location_European_nation_states.svg */; }; 66E862991688BA510059C9C4 /* Map.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862841688BA510059C9C4 /* Map.svg */; }; - 66E8629A1688BA510059C9C4 /* MathCurve.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862851688BA510059C9C4 /* MathCurve.svg */; }; 66E8629B1688BA510059C9C4 /* Monkey.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862861688BA510059C9C4 /* Monkey.svg */; }; 66E8629C1688BA510059C9C4 /* Note.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862871688BA510059C9C4 /* Note.svg */; }; 66E8629D1688BA510059C9C4 /* Reinel_compass_rose-simplified-for-testing.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E862881688BA510059C9C4 /* Reinel_compass_rose-simplified-for-testing.svg */; }; @@ -63,10 +151,73 @@ 66E862A01688BA510059C9C4 /* Text.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8628B1688BA510059C9C4 /* Text.svg */; }; 66E862A11688BA510059C9C4 /* uk-only.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8628C1688BA510059C9C4 /* uk-only.svg */; }; 66E862A21688BA510059C9C4 /* voies.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66E8628D1688BA510059C9C4 /* voies.svg */; }; + 66F33DCD182FDE50004464AC /* map-alaska-onlysimple.svg in Resources */ = {isa = PBXBuildFile; fileRef = 66F33DCC182FDE50004464AC /* map-alaska-onlysimple.svg */; }; + 8805045B1AA624F20089554C /* radial-gradient-opacity.svg in Resources */ = {isa = PBXBuildFile; fileRef = 8805045A1AA624F20089554C /* radial-gradient-opacity.svg */; }; 9ED79A21179D83580048AA5B /* radialGradientTest.svg in Resources */ = {isa = PBXBuildFile; fileRef = 9ED79A20179D83580048AA5B /* radialGradientTest.svg */; }; + BD15857C199909B800461AA5 /* Coins.svg in Resources */ = {isa = PBXBuildFile; fileRef = BD15857B199909B800461AA5 /* Coins.svg */; }; + BD54E3DB1AB7A13A001039C0 /* parent-clip.svg in Resources */ = {isa = PBXBuildFile; fileRef = BD54E3DA1AB7A13A001039C0 /* parent-clip.svg */; }; + BDC40146199AA41900DFEA27 /* ImageAspectRatio.svg in Resources */ = {isa = PBXBuildFile; fileRef = BDC40145199AA41900DFEA27 /* ImageAspectRatio.svg */; }; + BDC7EAB41B2A5960001F3161 /* CSS.css in Resources */ = {isa = PBXBuildFile; fileRef = BDC7EAB21B2A5960001F3161 /* CSS.css */; }; + BDC7EAB51B2A5960001F3161 /* CSS.svg in Resources */ = {isa = PBXBuildFile; fileRef = BDC7EAB31B2A5960001F3161 /* CSS.svg */; }; + BDC7EAB81B2A7E4A001F3161 /* CSS.png in Resources */ = {isa = PBXBuildFile; fileRef = BDC7EAB71B2A7E4A001F3161 /* CSS.png */; }; + D0B21B532016B17D00974D0A /* heart.svg in Resources */ = {isa = PBXBuildFile; fileRef = D0B21B4D2016B17C00974D0A /* heart.svg */; }; + D0B21B552016BD8A00974D0A /* heart.png in Resources */ = {isa = PBXBuildFile; fileRef = D0B21B542016BD8A00974D0A /* heart.png */; }; + D0D29C9220EC44080003CE47 /* M-to-S-to-T.svg in Resources */ = {isa = PBXBuildFile; fileRef = D0D29C9120EC44080003CE47 /* M-to-S-to-T.svg */; }; + D0D29C9420EC441F0003CE47 /* M-to-S-to-T.png in Resources */ = {isa = PBXBuildFile; fileRef = D0D29C9320EC441F0003CE47 /* M-to-S-to-T.png */; }; + FA5DF7261C434D54005CF231 /* CocoaLumberjack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FA5DF7241C434C58005CF231 /* CocoaLumberjack.framework */; }; + FA5DF7271C434D54005CF231 /* CocoaLumberjack.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FA5DF7241C434C58005CF231 /* CocoaLumberjack.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ + 32AF7BBC217389FD00142396 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 321EAA622171EC8700640504; + remoteInfo = "SVGKitFramework-OSX"; + }; + 32AF7BC121738A0300142396 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 1; + remoteGlobalIDString = 825CDAAE1BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOS"; + }; + 32FBF095218757490043050B /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 32A1F09C21746F4700ABFCE1; + remoteInfo = "SVGKitFramework-OSXTests"; + }; + 529DADF01C415FF00069B076 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAAF1BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOS"; + }; + 529DADF21C415FF00069B076 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAB81BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOSTests"; + }; + 529DADF41C415FF00069B076 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDAD31BDA4D38003C1C12; + remoteInfo = "SVGKitFramework-tvOS"; + }; + 529DADF61C415FF00069B076 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 825CDADC1BDA4D38003C1C12; + remoteInfo = "SVGKitFramework-tvOSTests"; + }; 6649E1091617574700AFE92A /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; @@ -81,15 +232,123 @@ remoteGlobalIDString = 6639618D16145D0400E58CCA; remoteInfo = "SVGKit-iOS"; }; + E203AF8F1A0AC14F000DE028 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 55452BF119EC68A200B75A30; + remoteInfo = "SVGKit-iOS Tests"; + }; /* End PBXContainerItemProxy section */ +/* Begin PBXCopyFilesBuildPhase section */ + FA5DF7281C434D55005CF231 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 32AF7BC021738A0300142396 /* SVGKit.framework in Embed Frameworks */, + FA5DF7271C434D54005CF231 /* CocoaLumberjack.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 6610D718181D5475004F4C11 /* BlankMap-World6-Equirectangular.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "BlankMap-World6-Equirectangular.svg"; sourceTree = ""; }; + 3242C368217CF0CD0013765F /* Blocky.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Blocky.ttf; sourceTree = ""; }; + 32D3D5E62176E3FA00ED20D8 /* Mozilla_Firefox_logo_2013.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Mozilla_Firefox_logo_2013.svg; sourceTree = ""; }; + 32D3D5F02176FA0700ED20D8 /* Mozilla_Firefox_logo_2013.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Mozilla_Firefox_logo_2013.png; sourceTree = ""; }; + 32D42244217AED3900CFD064 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 4FD8223D1AD057F000E419D3 /* arcs01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = arcs01.svg; sourceTree = ""; }; + 4FD8223E1AD057F000E419D3 /* arcs02.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = arcs02.svg; sourceTree = ""; }; + 4FD822421AD058AB00E419D3 /* arcs01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arcs01.png; sourceTree = ""; }; + 4FD822431AD058AB00E419D3 /* arcs02.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = arcs02.png; sourceTree = ""; }; + 556C405019A5122800733CBB /* test-stroke-dash-array.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "test-stroke-dash-array.svg"; sourceTree = ""; }; 661A0DCA161727CF008D5FBE /* Demo-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Demo-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 661A0DCE161727CF008D5FBE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 661A0DD0161727CF008D5FBE /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 661A0DD2161727CF008D5FBE /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 661ADBF916CC3399006F4BC3 /* rotated-and-skewed-text.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "rotated-and-skewed-text.svg"; sourceTree = ""; }; + 661EEA401ACC02AF007176B0 /* SB~iphone.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "SB~iphone.storyboard"; sourceTree = ""; }; + 661EEA421ACC04F2007176B0 /* Licenses.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Licenses.plist; sourceTree = ""; }; + 661EEA461ACC0667007176B0 /* VCGridOfImagesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VCGridOfImagesViewController.h; sourceTree = ""; }; + 661EEA471ACC0667007176B0 /* VCGridOfImagesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VCGridOfImagesViewController.m; sourceTree = ""; }; + 661EEA491ACC140F007176B0 /* SampleFileInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleFileInfo.h; sourceTree = ""; }; + 661EEA4A1ACC140F007176B0 /* SampleFileInfo.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SampleFileInfo.m; sourceTree = ""; }; + 661EEA521ACC1723007176B0 /* Monkey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Monkey.png; sourceTree = ""; }; + 661EEA531ACC1723007176B0 /* Note.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Note.png; sourceTree = ""; }; + 661EEA6E1ACC2E31007176B0 /* VCMainMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VCMainMenuViewController.h; sourceTree = ""; }; + 661EEA6F1ACC2E31007176B0 /* VCMainMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VCMainMenuViewController.m; sourceTree = ""; }; + 661EEA721ACC2FBB007176B0 /* cubic01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = cubic01.svg; sourceTree = ""; }; + 661EEA731ACC2FBB007176B0 /* fillrule-evenodd.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "fillrule-evenodd.svg"; sourceTree = ""; }; + 661EEA741ACC2FBB007176B0 /* lingrad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = lingrad01.svg; sourceTree = ""; }; + 661EEA751ACC2FBB007176B0 /* opacity01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = opacity01.svg; sourceTree = ""; }; + 661EEA761ACC2FBB007176B0 /* pattern01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = pattern01.svg; sourceTree = ""; }; + 661EEA771ACC2FBB007176B0 /* PreserveAspectRatio.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PreserveAspectRatio.svg; sourceTree = ""; }; + 661EEA781ACC2FBB007176B0 /* quad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = quad01.svg; sourceTree = ""; }; + 661EEA791ACC2FBB007176B0 /* radgrad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = radgrad01.svg; sourceTree = ""; }; + 661EEA7A1ACC2FBB007176B0 /* StyleAttribute.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = StyleAttribute.svg; sourceTree = ""; }; + 661EEA7B1ACC2FBB007176B0 /* text01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = text01.svg; sourceTree = ""; }; + 661EEA7C1ACC2FBB007176B0 /* tspan01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tspan01.svg; sourceTree = ""; }; + 661EEA891ACC2FD4007176B0 /* cubic01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = cubic01.png; sourceTree = ""; }; + 661EEA8A1ACC2FD4007176B0 /* fillrule-evenodd.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fillrule-evenodd.png"; sourceTree = ""; }; + 661EEA8B1ACC2FD4007176B0 /* lingrad01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = lingrad01.png; sourceTree = ""; }; + 661EEA8C1ACC2FD4007176B0 /* opacity01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = opacity01.png; sourceTree = ""; }; + 661EEA8D1ACC2FD4007176B0 /* pattern01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pattern01.png; sourceTree = ""; }; + 661EEA8E1ACC2FD4007176B0 /* PreserveAspectRatio.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = PreserveAspectRatio.png; sourceTree = ""; }; + 661EEA8F1ACC2FD4007176B0 /* quad01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = quad01.png; sourceTree = ""; }; + 661EEA901ACC2FD4007176B0 /* radgrad01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = radgrad01.png; sourceTree = ""; }; + 661EEA911ACC2FD4007176B0 /* StyleAttribute.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = StyleAttribute.png; sourceTree = ""; }; + 661EEA921ACC2FD4007176B0 /* text01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = text01.png; sourceTree = ""; }; + 661EEA931ACC2FD4007176B0 /* tspan01.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = tspan01.png; sourceTree = ""; }; + 661EEAA01ACC3053007176B0 /* gradients.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = gradients.png; sourceTree = ""; }; + 661EEAA11ACC3053007176B0 /* shapes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = shapes.png; sourceTree = ""; }; + 661EEAA21ACC3053007176B0 /* strokes.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = strokes.png; sourceTree = ""; }; + 661EEAA31ACC3053007176B0 /* transformations.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = transformations.png; sourceTree = ""; }; + 661EEAA81ACC3444007176B0 /* australia_states_blank.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = australia_states_blank.png; sourceTree = ""; }; + 661EEAAA1ACC3444007176B0 /* Blank_Map-Africa.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Blank_Map-Africa.png"; sourceTree = ""; }; + 661EEAAB1ACC3444007176B0 /* BlankMap-World6-Equirectangular.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "BlankMap-World6-Equirectangular.png"; sourceTree = ""; }; + 661EEAAC1ACC3444007176B0 /* breaking-1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "breaking-1.png"; sourceTree = ""; }; + 661EEAAD1ACC3444007176B0 /* Coins.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Coins.png; sourceTree = ""; }; + 661EEAAE1ACC3444007176B0 /* CurvedDiamond.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CurvedDiamond.png; sourceTree = ""; }; + 661EEAAF1ACC3444007176B0 /* Europe_states_reduced.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Europe_states_reduced.png; sourceTree = ""; }; + 661EEAB01ACC3444007176B0 /* g-element-applies-rotation.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "g-element-applies-rotation.png"; sourceTree = ""; }; + 661EEAB11ACC3444007176B0 /* groups-and-layers-test.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "groups-and-layers-test.png"; sourceTree = ""; }; + 661EEAB21ACC3444007176B0 /* ImageAspectRatio.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ImageAspectRatio.png; sourceTree = ""; }; + 661EEAB31ACC3444007176B0 /* imagetag-layer2-sun.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "imagetag-layer2-sun.png"; sourceTree = ""; }; + 661EEAB41ACC3444007176B0 /* imageWithASinglePointPath.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = imageWithASinglePointPath.png; sourceTree = ""; }; + 661EEAB51ACC3444007176B0 /* Lion.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Lion.png; sourceTree = ""; }; + 661EEAB61ACC3444007176B0 /* Location_European_nation_states.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Location_European_nation_states.png; sourceTree = ""; }; + 661EEAB71ACC3444007176B0 /* map-alaska-onlysimple.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "map-alaska-onlysimple.png"; sourceTree = ""; }; + 661EEAB81ACC3444007176B0 /* Map.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Map.png; sourceTree = ""; }; + 661EEAB91ACC3444007176B0 /* MathCurve-optimized.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "MathCurve-optimized.png"; sourceTree = ""; }; + 661EEABA1ACC3444007176B0 /* parent-clip.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "parent-clip.png"; sourceTree = ""; }; + 661EEABB1ACC3444007176B0 /* radial-gradient-opacity.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "radial-gradient-opacity.png"; sourceTree = ""; }; + 661EEABC1ACC3444007176B0 /* radialGradientTest.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = radialGradientTest.png; sourceTree = ""; }; + 661EEABD1ACC3444007176B0 /* RainbowWing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = RainbowWing.png; sourceTree = ""; }; + 661EEABE1ACC3444007176B0 /* Reinel_compass_rose-simplified-for-testing.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Reinel_compass_rose-simplified-for-testing.png"; sourceTree = ""; }; + 661EEABF1ACC3444007176B0 /* Reinel_compass_rose.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Reinel_compass_rose.png; sourceTree = ""; }; + 661EEAC01ACC3444007176B0 /* rotated-and-skewed-text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rotated-and-skewed-text.png"; sourceTree = ""; }; + 661EEAC11ACC3444007176B0 /* rounded-rects.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "rounded-rects.png"; sourceTree = ""; }; + 661EEAC21ACC3444007176B0 /* sakamura-default-fill-opacity-test.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "sakamura-default-fill-opacity-test.png"; sourceTree = ""; }; + 661EEAC31ACC3444007176B0 /* svg-with-explicit-width-large.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "svg-with-explicit-width-large.png"; sourceTree = ""; }; + 661EEAC41ACC3444007176B0 /* svg-with-explicit-width.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "svg-with-explicit-width.png"; sourceTree = ""; }; + 661EEAC51ACC3444007176B0 /* test-stroke-dash-array.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "test-stroke-dash-array.png"; sourceTree = ""; }; + 661EEAC61ACC3444007176B0 /* test-wave-1.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "test-wave-1.png"; sourceTree = ""; }; + 661EEAC71ACC3444007176B0 /* Text.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Text.png; sourceTree = ""; }; + 661EEAC81ACC3444007176B0 /* uk-only.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "uk-only.png"; sourceTree = ""; }; + 661EEAC91ACC3444007176B0 /* voies.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = voies.png; sourceTree = ""; }; + 661EEAEC1ACC3471007176B0 /* Coin.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Coin.png; sourceTree = ""; }; + 661EEAED1ACC3471007176B0 /* Snowman.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Snowman.png; sourceTree = ""; }; + 662701991AD9567600B3AD03 /* Cycling_Lambie.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Cycling_Lambie.svg; sourceTree = ""; }; + 6627019C1AD9579900B3AD03 /* Cycling_Lambie.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Cycling_Lambie.png; sourceTree = ""; }; + 6627019E1AD9585C00B3AD03 /* bike-frame.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "bike-frame.svg"; sourceTree = ""; }; + 662701A01AD9587500B3AD03 /* bike-frame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bike-frame.png"; sourceTree = ""; }; + 662701A21AD978A800B3AD03 /* VCAllSpecImages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VCAllSpecImages.h; sourceTree = ""; }; + 662701A31AD978A800B3AD03 /* VCAllSpecImages.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VCAllSpecImages.m; sourceTree = ""; }; + 662712631AD97D7500B3AD03 /* W3C_SVG_11_TestSuite */ = {isa = PBXFileReference; lastKnownFileType = folder; path = W3C_SVG_11_TestSuite; sourceTree = ""; }; 66324BE116D24FA4001C1E83 /* rounded-rects.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "rounded-rects.svg"; sourceTree = ""; }; 663FCFED16C9AF1C00CCBFB3 /* gradients.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = gradients.svg; sourceTree = ""; }; 663FCFEE16C9AF1C00CCBFB3 /* shapes.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = shapes.svg; sourceTree = ""; }; @@ -102,13 +361,21 @@ 6649E10E1617578500AFE92A /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; 665E07F216CE81DD00D6934D /* g-element-applies-rotation.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "g-element-applies-rotation.svg"; sourceTree = ""; }; 6661A77C1698BBE20061E349 /* CoreText.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; - 66A09CA016CFE67B003CD5CD /* lingrad01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = lingrad01.svg; sourceTree = ""; }; - 66A09CA116CFE67B003CD5CD /* opacity01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = opacity01.svg; sourceTree = ""; }; - 66A09CA216CFE67B003CD5CD /* PreserveAspectRatio.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = PreserveAspectRatio.svg; sourceTree = ""; }; - 66A09CA316CFE67B003CD5CD /* StyleAttribute.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = StyleAttribute.svg; sourceTree = ""; }; - 66A09CA416CFE67B003CD5CD /* text01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = text01.svg; sourceTree = ""; }; - 66A09CA516CFE67B003CD5CD /* tspan01.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = tspan01.svg; sourceTree = ""; }; + 666D03151AD07CAE006ED358 /* Reinel_compass_rose-simplified-more.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-more.svg"; sourceTree = ""; }; + 666D03181AD07CC2006ED358 /* Reinel_compass_rose-simplified-more.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Reinel_compass_rose-simplified-more.png"; sourceTree = ""; }; + 666D031A1AD07E2E006ED358 /* Reinel_compass_rose-simplified-evenmore.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Reinel_compass_rose-simplified-evenmore.png"; sourceTree = ""; }; + 666D031C1AD07E3B006ED358 /* Reinel_compass_rose-simplified-evenmore.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-evenmore.svg"; sourceTree = ""; }; + 666D031E1AD080EF006ED358 /* Scale-Negative-Direction.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Scale-Negative-Direction.svg"; sourceTree = ""; }; + 666D03201AD08116006ED358 /* Scale-Negative-Direction.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Scale-Negative-Direction.png"; sourceTree = ""; }; + 667CA17B181D552A00E49B68 /* BlankMap-World6-Equirectangular.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "BlankMap-World6-Equirectangular.svg"; sourceTree = ""; }; 66A9F4431688C66E000D4A2E /* RainbowWing.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = RainbowWing.svg; sourceTree = ""; }; + 66B695EF199BFAC900F8E7EE /* imagetag-layered.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "imagetag-layered.svg"; sourceTree = ""; }; + 66B695F0199BFAC900F8E7EE /* bird-1382034603Euc-cropped.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "bird-1382034603Euc-cropped.png"; sourceTree = ""; }; + 66B695F1199BFAC900F8E7EE /* imagetag-layer2-sun.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "imagetag-layer2-sun.svg"; sourceTree = ""; }; + 66B86F871ACC686B00C18ECE /* NewTux.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = NewTux.png; sourceTree = ""; }; + 66B86F8A1ACC687700C18ECE /* NewTux.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = NewTux.svg; sourceTree = ""; }; + 66B86F8C1ACC6E7000C18ECE /* MathCurve-optimized.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "MathCurve-optimized.svg"; sourceTree = ""; }; + 66C43EA818398E6E00299662 /* sakamura-default-fill-opacity-test.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "sakamura-default-fill-opacity-test.svg"; sourceTree = ""; }; 66E785AA171A228A001EF59D /* svg-with-explicit-width.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "svg-with-explicit-width.svg"; sourceTree = ""; }; 66E785AC171A2345001EF59D /* svg-with-explicit-width-large.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "svg-with-explicit-width-large.svg"; sourceTree = ""; }; 66E862571688BA0B0059C9C4 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -126,9 +393,6 @@ 66E862681688BA0B0059C9C4 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 66E862691688BA0B0059C9C4 /* MasterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = ""; }; 66E8626A1688BA0B0059C9C4 /* MasterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = ""; }; - 66E862781688BA510059C9C4 /* Monkey.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Monkey.png; sourceTree = ""; }; - 66E862791688BA510059C9C4 /* Note.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Note.png; sourceTree = ""; }; - 66E8627A1688BA510059C9C4 /* Sample Licenses.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Sample Licenses.txt"; sourceTree = ""; }; 66E8627C1688BA510059C9C4 /* australia_states_blank.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = australia_states_blank.svg; sourceTree = ""; }; 66E8627D1688BA510059C9C4 /* Blank_Map-Africa.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Blank_Map-Africa.svg"; sourceTree = ""; }; 66E8627E1688BA510059C9C4 /* breaking-1.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "breaking-1.svg"; sourceTree = ""; }; @@ -138,7 +402,6 @@ 66E862821688BA510059C9C4 /* Lion.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Lion.svg; sourceTree = ""; }; 66E862831688BA510059C9C4 /* Location_European_nation_states.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Location_European_nation_states.svg; sourceTree = ""; }; 66E862841688BA510059C9C4 /* Map.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Map.svg; sourceTree = ""; }; - 66E862851688BA510059C9C4 /* MathCurve.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = MathCurve.svg; sourceTree = ""; }; 66E862861688BA510059C9C4 /* Monkey.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Monkey.svg; sourceTree = ""; }; 66E862871688BA510059C9C4 /* Note.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Note.svg; sourceTree = ""; }; 66E862881688BA510059C9C4 /* Reinel_compass_rose-simplified-for-testing.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Reinel_compass_rose-simplified-for-testing.svg"; sourceTree = ""; }; @@ -147,7 +410,20 @@ 66E8628B1688BA510059C9C4 /* Text.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Text.svg; sourceTree = ""; }; 66E8628C1688BA510059C9C4 /* uk-only.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "uk-only.svg"; sourceTree = ""; }; 66E8628D1688BA510059C9C4 /* voies.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = voies.svg; sourceTree = ""; }; + 66F33DCC182FDE50004464AC /* map-alaska-onlysimple.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "map-alaska-onlysimple.svg"; sourceTree = ""; }; + 8805045A1AA624F20089554C /* radial-gradient-opacity.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "radial-gradient-opacity.svg"; sourceTree = ""; }; 9ED79A20179D83580048AA5B /* radialGradientTest.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = radialGradientTest.svg; sourceTree = ""; }; + BD15857B199909B800461AA5 /* Coins.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Coins.svg; sourceTree = ""; }; + BD54E3DA1AB7A13A001039C0 /* parent-clip.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "parent-clip.svg"; sourceTree = ""; }; + BDC40145199AA41900DFEA27 /* ImageAspectRatio.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = ImageAspectRatio.svg; sourceTree = ""; }; + BDC7EAB21B2A5960001F3161 /* CSS.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = CSS.css; sourceTree = ""; }; + BDC7EAB31B2A5960001F3161 /* CSS.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = CSS.svg; sourceTree = ""; }; + BDC7EAB71B2A7E4A001F3161 /* CSS.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = CSS.png; sourceTree = ""; }; + D0B21B4D2016B17C00974D0A /* heart.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = heart.svg; sourceTree = ""; }; + D0B21B542016BD8A00974D0A /* heart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = heart.png; sourceTree = ""; }; + D0D29C9120EC44080003CE47 /* M-to-S-to-T.svg */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "M-to-S-to-T.svg"; sourceTree = ""; }; + D0D29C9320EC441F0003CE47 /* M-to-S-to-T.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "M-to-S-to-T.png"; sourceTree = ""; }; + FA5DF7241C434C58005CF231 /* CocoaLumberjack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CocoaLumberjack.framework; path = "3rd-party-frameworks/CocoaLumberjack-2.2.0/iOS/CocoaLumberjack.framework"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -155,9 +431,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 32AF7BBE217389FD00142396 /* SVGKit.framework in Frameworks */, 6661A77D1698BBE20061E349 /* CoreText.framework in Frameworks */, 6649E10F1617578500AFE92A /* libxml2.dylib in Frameworks */, - 6649E10D1617577000AFE92A /* libSVGKit-iOS.1.1.0pre.a in Frameworks */, + FA5DF7261C434D54005CF231 /* CocoaLumberjack.framework in Frameworks */, 6649E0AD1617479200AFE92A /* QuartzCore.framework in Frameworks */, 661A0DCF161727CF008D5FBE /* UIKit.framework in Frameworks */, 661A0DD1161727CF008D5FBE /* Foundation.framework in Frameworks */, @@ -168,10 +445,17 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 3242C367217CF0CD0013765F /* Fonts */ = { + isa = PBXGroup; + children = ( + 3242C368217CF0CD0013765F /* Blocky.ttf */, + ); + path = Fonts; + sourceTree = ""; + }; 661A0DBF161727CF008D5FBE = { isa = PBXGroup; children = ( - 6661A77C1698BBE20061E349 /* CoreText.framework */, 66E862561688BA0B0059C9C4 /* Demo-iOS */, 66E862761688BA510059C9C4 /* Demo-Samples */, 6649E1021617574600AFE92A /* SVGKit-iOS.xcodeproj */, @@ -191,7 +475,9 @@ 661A0DCD161727CF008D5FBE /* Frameworks */ = { isa = PBXGroup; children = ( + FA5DF7241C434C58005CF231 /* CocoaLumberjack.framework */, 6649E10E1617578500AFE92A /* libxml2.dylib */, + 6661A77C1698BBE20061E349 /* CoreText.framework */, 6649E0AC1617479200AFE92A /* QuartzCore.framework */, 661A0DCE161727CF008D5FBE /* UIKit.framework */, 661A0DD0161727CF008D5FBE /* Foundation.framework */, @@ -200,6 +486,111 @@ name = Frameworks; sourceTree = ""; }; + 661EEA511ACC1723007176B0 /* Saved Bitmaps */ = { + isa = PBXGroup; + children = ( + 662701A01AD9587500B3AD03 /* bike-frame.png */, + 6627019C1AD9579900B3AD03 /* Cycling_Lambie.png */, + 666D03201AD08116006ED358 /* Scale-Negative-Direction.png */, + 661EEA9F1ACC3053007176B0 /* apache-licensed-from-svg-android */, + 661EEA881ACC2FD4007176B0 /* www.w3.org-TR-SVG */, + 661EEAA81ACC3444007176B0 /* australia_states_blank.png */, + 661EEAAA1ACC3444007176B0 /* Blank_Map-Africa.png */, + 4FD822421AD058AB00E419D3 /* arcs01.png */, + 4FD822431AD058AB00E419D3 /* arcs02.png */, + 661EEAAB1ACC3444007176B0 /* BlankMap-World6-Equirectangular.png */, + 661EEAAC1ACC3444007176B0 /* breaking-1.png */, + 661EEAAD1ACC3444007176B0 /* Coins.png */, + BDC7EAB71B2A7E4A001F3161 /* CSS.png */, + 661EEAAE1ACC3444007176B0 /* CurvedDiamond.png */, + 661EEAAF1ACC3444007176B0 /* Europe_states_reduced.png */, + 661EEAB01ACC3444007176B0 /* g-element-applies-rotation.png */, + 661EEAB11ACC3444007176B0 /* groups-and-layers-test.png */, + D0B21B542016BD8A00974D0A /* heart.png */, + 661EEAB21ACC3444007176B0 /* ImageAspectRatio.png */, + 661EEAB31ACC3444007176B0 /* imagetag-layer2-sun.png */, + 661EEAB41ACC3444007176B0 /* imageWithASinglePointPath.png */, + 661EEAB51ACC3444007176B0 /* Lion.png */, + 661EEAB61ACC3444007176B0 /* Location_European_nation_states.png */, + 32D3D5F02176FA0700ED20D8 /* Mozilla_Firefox_logo_2013.png */, + D0D29C9320EC441F0003CE47 /* M-to-S-to-T.png */, + 661EEAB71ACC3444007176B0 /* map-alaska-onlysimple.png */, + 661EEAB81ACC3444007176B0 /* Map.png */, + 661EEAB91ACC3444007176B0 /* MathCurve-optimized.png */, + 66B86F871ACC686B00C18ECE /* NewTux.png */, + 661EEABA1ACC3444007176B0 /* parent-clip.png */, + 661EEABB1ACC3444007176B0 /* radial-gradient-opacity.png */, + 661EEABC1ACC3444007176B0 /* radialGradientTest.png */, + 661EEABD1ACC3444007176B0 /* RainbowWing.png */, + 666D031A1AD07E2E006ED358 /* Reinel_compass_rose-simplified-evenmore.png */, + 666D03181AD07CC2006ED358 /* Reinel_compass_rose-simplified-more.png */, + 661EEABE1ACC3444007176B0 /* Reinel_compass_rose-simplified-for-testing.png */, + 661EEABF1ACC3444007176B0 /* Reinel_compass_rose.png */, + 661EEAC01ACC3444007176B0 /* rotated-and-skewed-text.png */, + 661EEAC11ACC3444007176B0 /* rounded-rects.png */, + 661EEAC21ACC3444007176B0 /* sakamura-default-fill-opacity-test.png */, + 661EEAC31ACC3444007176B0 /* svg-with-explicit-width-large.png */, + 661EEAC41ACC3444007176B0 /* svg-with-explicit-width.png */, + 661EEAC51ACC3444007176B0 /* test-stroke-dash-array.png */, + 661EEAC61ACC3444007176B0 /* test-wave-1.png */, + 661EEAC71ACC3444007176B0 /* Text.png */, + 661EEAC81ACC3444007176B0 /* uk-only.png */, + 661EEAC91ACC3444007176B0 /* voies.png */, + 661EEA521ACC1723007176B0 /* Monkey.png */, + 661EEA531ACC1723007176B0 /* Note.png */, + ); + path = "Saved Bitmaps"; + sourceTree = ""; + }; + 661EEA711ACC2FBB007176B0 /* www.w3.org-TR-SVG */ = { + isa = PBXGroup; + children = ( + 4FD8223D1AD057F000E419D3 /* arcs01.svg */, + 4FD8223E1AD057F000E419D3 /* arcs02.svg */, + 661EEA721ACC2FBB007176B0 /* cubic01.svg */, + 661EEA731ACC2FBB007176B0 /* fillrule-evenodd.svg */, + 661EEA741ACC2FBB007176B0 /* lingrad01.svg */, + 661EEA751ACC2FBB007176B0 /* opacity01.svg */, + 661EEA761ACC2FBB007176B0 /* pattern01.svg */, + 661EEA771ACC2FBB007176B0 /* PreserveAspectRatio.svg */, + 661EEA781ACC2FBB007176B0 /* quad01.svg */, + 661EEA791ACC2FBB007176B0 /* radgrad01.svg */, + 661EEA7A1ACC2FBB007176B0 /* StyleAttribute.svg */, + 661EEA7B1ACC2FBB007176B0 /* text01.svg */, + 661EEA7C1ACC2FBB007176B0 /* tspan01.svg */, + ); + path = "www.w3.org-TR-SVG"; + sourceTree = ""; + }; + 661EEA881ACC2FD4007176B0 /* www.w3.org-TR-SVG */ = { + isa = PBXGroup; + children = ( + 661EEA891ACC2FD4007176B0 /* cubic01.png */, + 661EEA8A1ACC2FD4007176B0 /* fillrule-evenodd.png */, + 661EEA8B1ACC2FD4007176B0 /* lingrad01.png */, + 661EEA8C1ACC2FD4007176B0 /* opacity01.png */, + 661EEA8D1ACC2FD4007176B0 /* pattern01.png */, + 661EEA8E1ACC2FD4007176B0 /* PreserveAspectRatio.png */, + 661EEA8F1ACC2FD4007176B0 /* quad01.png */, + 661EEA901ACC2FD4007176B0 /* radgrad01.png */, + 661EEA911ACC2FD4007176B0 /* StyleAttribute.png */, + 661EEA921ACC2FD4007176B0 /* text01.png */, + 661EEA931ACC2FD4007176B0 /* tspan01.png */, + ); + path = "www.w3.org-TR-SVG"; + sourceTree = ""; + }; + 661EEA9F1ACC3053007176B0 /* apache-licensed-from-svg-android */ = { + isa = PBXGroup; + children = ( + 661EEAA01ACC3053007176B0 /* gradients.png */, + 661EEAA11ACC3053007176B0 /* shapes.png */, + 661EEAA21ACC3053007176B0 /* strokes.png */, + 661EEAA31ACC3053007176B0 /* transformations.png */, + ); + path = "apache-licensed-from-svg-android"; + sourceTree = ""; + }; 663FCFEC16C9AF1C00CCBFB3 /* apache-licensed-from-svg-android */ = { isa = PBXGroup; children = ( @@ -215,29 +606,28 @@ 6649E1031617574600AFE92A /* Products */ = { isa = PBXGroup; children = ( - 6649E10A1617574700AFE92A /* libSVGKit-iOS.1.1.0pre.a */, + E203AF901A0AC14F000DE028 /* SVGKit-iOS Tests.xctest */, + 529DADF11C415FF00069B076 /* SVGKit.framework */, + 529DADF31C415FF00069B076 /* SVGKitFramework-iOSTests.xctest */, + 529DADF51C415FF00069B076 /* SVGKit.framework */, + 529DADF71C415FF00069B076 /* SVGKitFramework-tvOSTests.xctest */, + 32AF7BBD217389FD00142396 /* SVGKit.framework */, + 32FBF096218757490043050B /* SVGKitFramework-OSXTests.xctest */, ); name = Products; sourceTree = ""; }; - 66A09C9F16CFE67B003CD5CD /* svg spec examples */ = { - isa = PBXGroup; - children = ( - 66A09CA016CFE67B003CD5CD /* lingrad01.svg */, - 66A09CA116CFE67B003CD5CD /* opacity01.svg */, - 66A09CA216CFE67B003CD5CD /* PreserveAspectRatio.svg */, - 66A09CA316CFE67B003CD5CD /* StyleAttribute.svg */, - 66A09CA416CFE67B003CD5CD /* text01.svg */, - 66A09CA516CFE67B003CD5CD /* tspan01.svg */, - ); - path = "svg spec examples"; - sourceTree = ""; - }; 66E862561688BA0B0059C9C4 /* Demo-iOS */ = { isa = PBXGroup; children = ( 66E862571688BA0B0059C9C4 /* AppDelegate.h */, 66E862581688BA0B0059C9C4 /* AppDelegate.m */, + 661EEA461ACC0667007176B0 /* VCGridOfImagesViewController.h */, + 661EEA471ACC0667007176B0 /* VCGridOfImagesViewController.m */, + 661EEA491ACC140F007176B0 /* SampleFileInfo.h */, + 661EEA4A1ACC140F007176B0 /* SampleFileInfo.m */, + 662701A21AD978A800B3AD03 /* VCAllSpecImages.h */, + 662701A31AD978A800B3AD03 /* VCAllSpecImages.m */, 66E862591688BA0B0059C9C4 /* Default-568h@2x.png */, 66E8625A1688BA0B0059C9C4 /* Demo-iOS-Info.plist */, 66E8625B1688BA0B0059C9C4 /* Demo-iOS-Prefix.pch */, @@ -251,62 +641,82 @@ 66E862681688BA0B0059C9C4 /* main.m */, 66E862691688BA0B0059C9C4 /* MasterViewController.h */, 66E8626A1688BA0B0059C9C4 /* MasterViewController.m */, + 661EEA6E1ACC2E31007176B0 /* VCMainMenuViewController.h */, + 661EEA6F1ACC2E31007176B0 /* VCMainMenuViewController.m */, + 661EEA401ACC02AF007176B0 /* SB~iphone.storyboard */, + 32D42244217AED3900CFD064 /* LaunchScreen.storyboard */, ); name = "Demo-iOS"; - path = "XCodeProjectData/Demo-iOS"; + path = "SVGKitLibrary/Demo-iOS"; sourceTree = ""; }; 66E862761688BA510059C9C4 /* Demo-Samples */ = { isa = PBXGroup; children = ( - 66E8627A1688BA510059C9C4 /* Sample Licenses.txt */, - 66E862771688BA510059C9C4 /* Bitmap */, + 662712631AD97D7500B3AD03 /* W3C_SVG_11_TestSuite */, + 661EEA511ACC1723007176B0 /* Saved Bitmaps */, 66E8627B1688BA510059C9C4 /* SVG */, + 3242C367217CF0CD0013765F /* Fonts */, + 661EEA421ACC04F2007176B0 /* Licenses.plist */, ); path = "Demo-Samples"; sourceTree = ""; }; - 66E862771688BA510059C9C4 /* Bitmap */ = { - isa = PBXGroup; - children = ( - 66E862781688BA510059C9C4 /* Monkey.png */, - 66E862791688BA510059C9C4 /* Note.png */, - ); - path = Bitmap; - sourceTree = ""; - }; 66E8627B1688BA510059C9C4 /* SVG */ = { isa = PBXGroup; children = ( + 662701991AD9567600B3AD03 /* Cycling_Lambie.svg */, + 661EEAEC1ACC3471007176B0 /* Coin.png */, + 661EEAED1ACC3471007176B0 /* Snowman.png */, 663FCFEC16C9AF1C00CCBFB3 /* apache-licensed-from-svg-android */, - 66A09C9F16CFE67B003CD5CD /* svg spec examples */, + 661EEA711ACC2FBB007176B0 /* www.w3.org-TR-SVG */, + 66B695EF199BFAC900F8E7EE /* imagetag-layered.svg */, + 6627019E1AD9585C00B3AD03 /* bike-frame.svg */, + 66B695F0199BFAC900F8E7EE /* bird-1382034603Euc-cropped.png */, + 66B695F1199BFAC900F8E7EE /* imagetag-layer2-sun.svg */, 663FD00316CAB16B00CCBFB3 /* groups-and-layers-test.svg */, 665E07F216CE81DD00D6934D /* g-element-applies-rotation.svg */, 66324BE116D24FA4001C1E83 /* rounded-rects.svg */, 661ADBF916CC3399006F4BC3 /* rotated-and-skewed-text.svg */, 66E8627C1688BA510059C9C4 /* australia_states_blank.svg */, 66E8627D1688BA510059C9C4 /* Blank_Map-Africa.svg */, - 6610D718181D5475004F4C11 /* BlankMap-World6-Equirectangular.svg */, + 667CA17B181D552A00E49B68 /* BlankMap-World6-Equirectangular.svg */, 66E8627E1688BA510059C9C4 /* breaking-1.svg */, 9ED79A20179D83580048AA5B /* radialGradientTest.svg */, 66E8627F1688BA510059C9C4 /* CurvedDiamond.svg */, 66E862801688BA510059C9C4 /* Europe_states_reduced.svg */, + D0B21B4D2016B17C00974D0A /* heart.svg */, 66E862811688BA510059C9C4 /* imageWithASinglePointPath.svg */, 66E862821688BA510059C9C4 /* Lion.svg */, 66E862831688BA510059C9C4 /* Location_European_nation_states.svg */, + 32D3D5E62176E3FA00ED20D8 /* Mozilla_Firefox_logo_2013.svg */, + D0D29C9120EC44080003CE47 /* M-to-S-to-T.svg */, 66E862841688BA510059C9C4 /* Map.svg */, - 66E862851688BA510059C9C4 /* MathCurve.svg */, + 66F33DCC182FDE50004464AC /* map-alaska-onlysimple.svg */, + 66B86F8C1ACC6E7000C18ECE /* MathCurve-optimized.svg */, 66E862861688BA510059C9C4 /* Monkey.svg */, + 66B86F8A1ACC687700C18ECE /* NewTux.svg */, 66E862871688BA510059C9C4 /* Note.svg */, + BD54E3DA1AB7A13A001039C0 /* parent-clip.svg */, 66A9F4431688C66E000D4A2E /* RainbowWing.svg */, + 666D031C1AD07E3B006ED358 /* Reinel_compass_rose-simplified-evenmore.svg */, + 666D03151AD07CAE006ED358 /* Reinel_compass_rose-simplified-more.svg */, 66E862881688BA510059C9C4 /* Reinel_compass_rose-simplified-for-testing.svg */, 66E862891688BA510059C9C4 /* Reinel_compass_rose.svg */, + 66C43EA818398E6E00299662 /* sakamura-default-fill-opacity-test.svg */, + 666D031E1AD080EF006ED358 /* Scale-Negative-Direction.svg */, 66E785AA171A228A001EF59D /* svg-with-explicit-width.svg */, 66E785AC171A2345001EF59D /* svg-with-explicit-width-large.svg */, 66E8628A1688BA510059C9C4 /* test-wave-1.svg */, + 556C405019A5122800733CBB /* test-stroke-dash-array.svg */, 66E8628B1688BA510059C9C4 /* Text.svg */, 66E8628C1688BA510059C9C4 /* uk-only.svg */, 66E8628D1688BA510059C9C4 /* voies.svg */, + BD15857B199909B800461AA5 /* Coins.svg */, + BDC40145199AA41900DFEA27 /* ImageAspectRatio.svg */, + 8805045A1AA624F20089554C /* radial-gradient-opacity.svg */, + BDC7EAB21B2A5960001F3161 /* CSS.css */, + BDC7EAB31B2A5960001F3161 /* CSS.svg */, ); path = SVG; sourceTree = ""; @@ -321,11 +731,13 @@ 661A0DC6161727CF008D5FBE /* Sources */, 661A0DC7161727CF008D5FBE /* Frameworks */, 661A0DC8161727CF008D5FBE /* Resources */, + FA5DF7281C434D55005CF231 /* Embed Frameworks */, ); buildRules = ( ); dependencies = ( 66E785A9171A1208001EF59D /* PBXTargetDependency */, + 32AF7BC221738A0300142396 /* PBXTargetDependency */, ); name = "Demo-iOS"; productName = iOSDemo; @@ -338,7 +750,7 @@ 661A0DC1161727CF008D5FBE /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0440; + LastUpgradeCheck = 1000; ORGANIZATIONNAME = na; }; buildConfigurationList = 661A0DC4161727CF008D5FBE /* Build configuration list for PBXProject "Demo-iOS" */; @@ -365,11 +777,53 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - 6649E10A1617574700AFE92A /* libSVGKit-iOS.1.1.0pre.a */ = { + 32AF7BBD217389FD00142396 /* SVGKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 32AF7BBC217389FD00142396 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 32FBF096218757490043050B /* SVGKitFramework-OSXTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-OSXTests.xctest"; + remoteRef = 32FBF095218757490043050B /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 529DADF11C415FF00069B076 /* SVGKit.framework */ = { + isa = PBXReferenceProxy; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 529DADF01C415FF00069B076 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 529DADF31C415FF00069B076 /* SVGKitFramework-iOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-iOSTests.xctest"; + remoteRef = 529DADF21C415FF00069B076 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 529DADF51C415FF00069B076 /* SVGKit.framework */ = { isa = PBXReferenceProxy; - fileType = archive.ar; - path = "libSVGKit-iOS.1.1.0pre.a"; - remoteRef = 6649E1091617574700AFE92A /* PBXContainerItemProxy */; + fileType = wrapper.framework; + path = SVGKit.framework; + remoteRef = 529DADF41C415FF00069B076 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 529DADF71C415FF00069B076 /* SVGKitFramework-tvOSTests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKitFramework-tvOSTests.xctest"; + remoteRef = 529DADF61C415FF00069B076 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + E203AF901A0AC14F000DE028 /* SVGKit-iOS Tests.xctest */ = { + isa = PBXReferenceProxy; + fileType = wrapper.cfbundle; + path = "SVGKit-iOS Tests.xctest"; + remoteRef = E203AF8F1A0AC14F000DE028 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ @@ -379,52 +833,147 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 662712641AD97D7600B3AD03 /* W3C_SVG_11_TestSuite in Resources */, + 661EEA821ACC2FBB007176B0 /* PreserveAspectRatio.svg in Resources */, + 661EEADB1ACC3444007176B0 /* MathCurve-optimized.png in Resources */, + 8805045B1AA624F20089554C /* radial-gradient-opacity.svg in Resources */, + 661EEAE01ACC3444007176B0 /* Reinel_compass_rose-simplified-for-testing.png in Resources */, + D0D29C9420EC441F0003CE47 /* M-to-S-to-T.png in Resources */, 66E8626C1688BA0B0059C9C4 /* Default-568h@2x.png in Resources */, + 661EEA971ACC2FD4007176B0 /* opacity01.png in Resources */, + 661EEADE1ACC3444007176B0 /* radialGradientTest.png in Resources */, + 4FD8223F1AD057F000E419D3 /* arcs01.svg in Resources */, 66E8626F1688BA0B0059C9C4 /* InfoPlist.strings in Resources */, + 661EEAD51ACC3444007176B0 /* imagetag-layer2-sun.png in Resources */, + 661EEAD31ACC3444007176B0 /* groups-and-layers-test.png in Resources */, 66E862701688BA0B0059C9C4 /* iPadDetailViewController.xib in Resources */, 66E862711688BA0B0059C9C4 /* iPhoneDetailViewController.xib in Resources */, + 32D3D5F12176FA0700ED20D8 /* Mozilla_Firefox_logo_2013.png in Resources */, + 6627019D1AD9579900B3AD03 /* Cycling_Lambie.png in Resources */, + 666D03191AD07CC2006ED358 /* Reinel_compass_rose-simplified-more.png in Resources */, 66E862721688BA0B0059C9C4 /* MasterViewController_iPad.xib in Resources */, 66E862731688BA0B0059C9C4 /* MasterViewController_iPhone.xib in Resources */, - 66E8628E1688BA510059C9C4 /* Monkey.png in Resources */, - 6610D719181D5475004F4C11 /* BlankMap-World6-Equirectangular.svg in Resources */, - 66E8628F1688BA510059C9C4 /* Note.png in Resources */, + 4FD822451AD058AB00E419D3 /* arcs02.png in Resources */, + 661EEAA41ACC3053007176B0 /* gradients.png in Resources */, + 661EEAEB1ACC3444007176B0 /* voies.png in Resources */, + 661EEA9D1ACC2FD4007176B0 /* text01.png in Resources */, + 661EEADD1ACC3444007176B0 /* radial-gradient-opacity.png in Resources */, + 661EEADF1ACC3444007176B0 /* RainbowWing.png in Resources */, + 66F33DCD182FDE50004464AC /* map-alaska-onlysimple.svg in Resources */, + 667CA17C181D552A00E49B68 /* BlankMap-World6-Equirectangular.svg in Resources */, 66E862911688BA510059C9C4 /* australia_states_blank.svg in Resources */, 66E862921688BA510059C9C4 /* Blank_Map-Africa.svg in Resources */, + 661EEAA71ACC3053007176B0 /* transformations.png in Resources */, + 661EEAE41ACC3444007176B0 /* sakamura-default-fill-opacity-test.png in Resources */, + 3242C36E217CF0CD0013765F /* Blocky.ttf in Resources */, + 661EEA991ACC2FD4007176B0 /* PreserveAspectRatio.png in Resources */, 66E862931688BA510059C9C4 /* breaking-1.svg in Resources */, + 661EEA861ACC2FBB007176B0 /* text01.svg in Resources */, + 661EEA831ACC2FBB007176B0 /* quad01.svg in Resources */, + 661EEAA61ACC3053007176B0 /* strokes.png in Resources */, + 661EEA7D1ACC2FBB007176B0 /* cubic01.svg in Resources */, 66E862941688BA510059C9C4 /* CurvedDiamond.svg in Resources */, + 556C405119A5122800733CBB /* test-stroke-dash-array.svg in Resources */, + 66B86F8D1ACC6E7000C18ECE /* MathCurve-optimized.svg in Resources */, + 32D3D5EC2176E3FA00ED20D8 /* Mozilla_Firefox_logo_2013.svg in Resources */, + 661EEACF1ACC3444007176B0 /* Coins.png in Resources */, + 661EEAEA1ACC3444007176B0 /* uk-only.png in Resources */, 66E862951688BA510059C9C4 /* Europe_states_reduced.svg in Resources */, + 666D031F1AD080EF006ED358 /* Scale-Negative-Direction.svg in Resources */, + 661EEADA1ACC3444007176B0 /* Map.png in Resources */, 66E862961688BA510059C9C4 /* imageWithASinglePointPath.svg in Resources */, 66E862971688BA510059C9C4 /* Lion.svg in Resources */, + 661EEADC1ACC3444007176B0 /* parent-clip.png in Resources */, + 661EEAE61ACC3444007176B0 /* svg-with-explicit-width.png in Resources */, + 661EEA411ACC02AF007176B0 /* SB~iphone.storyboard in Resources */, + 4FD822401AD057F000E419D3 /* arcs02.svg in Resources */, + 32D42245217AED3900CFD064 /* LaunchScreen.storyboard in Resources */, 66E862981688BA510059C9C4 /* Location_European_nation_states.svg in Resources */, + D0B21B532016B17D00974D0A /* heart.svg in Resources */, + 661EEAA51ACC3053007176B0 /* shapes.png in Resources */, + BDC7EAB41B2A5960001F3161 /* CSS.css in Resources */, 66E862991688BA510059C9C4 /* Map.svg in Resources */, - 66E8629A1688BA510059C9C4 /* MathCurve.svg in Resources */, 66E8629B1688BA510059C9C4 /* Monkey.svg in Resources */, + 661EEA7F1ACC2FBB007176B0 /* lingrad01.svg in Resources */, + 661EEA951ACC2FD4007176B0 /* fillrule-evenodd.png in Resources */, + 661EEA801ACC2FBB007176B0 /* opacity01.svg in Resources */, + BD15857C199909B800461AA5 /* Coins.svg in Resources */, + 661EEAE91ACC3444007176B0 /* Text.png in Resources */, + 661EEAEE1ACC3471007176B0 /* Coin.png in Resources */, + BDC7EAB81B2A7E4A001F3161 /* CSS.png in Resources */, + 661EEA961ACC2FD4007176B0 /* lingrad01.png in Resources */, 66E8629C1688BA510059C9C4 /* Note.svg in Resources */, 66E8629D1688BA510059C9C4 /* Reinel_compass_rose-simplified-for-testing.svg in Resources */, + 661EEA431ACC04F2007176B0 /* Licenses.plist in Resources */, 66E8629E1688BA510059C9C4 /* Reinel_compass_rose.svg in Resources */, + BDC7EAB51B2A5960001F3161 /* CSS.svg in Resources */, 66E8629F1688BA510059C9C4 /* test-wave-1.svg in Resources */, 66E862A01688BA510059C9C4 /* Text.svg in Resources */, 66E862A11688BA510059C9C4 /* uk-only.svg in Resources */, 66E862A21688BA510059C9C4 /* voies.svg in Resources */, + 661EEACD1ACC3444007176B0 /* BlankMap-World6-Equirectangular.png in Resources */, + 661EEAEF1ACC3471007176B0 /* Snowman.png in Resources */, 66A9F4441688C66E000D4A2E /* RainbowWing.svg in Resources */, 663FCFF116C9AF1C00CCBFB3 /* gradients.svg in Resources */, + 661EEA551ACC1723007176B0 /* Note.png in Resources */, + 661EEA7E1ACC2FBB007176B0 /* fillrule-evenodd.svg in Resources */, + 661EEAD71ACC3444007176B0 /* Lion.png in Resources */, + BDC40146199AA41900DFEA27 /* ImageAspectRatio.svg in Resources */, + 661EEA9A1ACC2FD4007176B0 /* quad01.png in Resources */, + D0B21B552016BD8A00974D0A /* heart.png in Resources */, 663FCFF216C9AF1C00CCBFB3 /* shapes.svg in Resources */, + 661EEACE1ACC3444007176B0 /* breaking-1.png in Resources */, + 6627019A1AD9567600B3AD03 /* Cycling_Lambie.svg in Resources */, + 661EEA941ACC2FD4007176B0 /* cubic01.png in Resources */, + 661EEAE51ACC3444007176B0 /* svg-with-explicit-width-large.png in Resources */, 663FCFF316C9AF1C00CCBFB3 /* strokes.svg in Resources */, + 66B86F881ACC686B00C18ECE /* NewTux.png in Resources */, 663FCFF416C9AF1C00CCBFB3 /* transformations.svg in Resources */, + 666D031D1AD07E3B006ED358 /* Reinel_compass_rose-simplified-evenmore.svg in Resources */, 663FCFF616C9AF3C00CCBFB3 /* Sample Licenses from svg-android project.txt in Resources */, + 661EEAD11ACC3444007176B0 /* Europe_states_reduced.png in Resources */, + 66B695F2199BFAC900F8E7EE /* imagetag-layered.svg in Resources */, 663FD00416CAB16B00CCBFB3 /* groups-and-layers-test.svg in Resources */, + 66B86F8B1ACC687700C18ECE /* NewTux.svg in Resources */, + 661EEA9C1ACC2FD4007176B0 /* StyleAttribute.png in Resources */, + 661EEA9B1ACC2FD4007176B0 /* radgrad01.png in Resources */, + 661EEAD81ACC3444007176B0 /* Location_European_nation_states.png in Resources */, + 662701A11AD9587500B3AD03 /* bike-frame.png in Resources */, + 661EEA851ACC2FBB007176B0 /* StyleAttribute.svg in Resources */, + 6627019F1AD9585C00B3AD03 /* bike-frame.svg in Resources */, 661ADBFA16CC3399006F4BC3 /* rotated-and-skewed-text.svg in Resources */, + 661EEACC1ACC3444007176B0 /* Blank_Map-Africa.png in Resources */, + 666D031B1AD07E2E006ED358 /* Reinel_compass_rose-simplified-evenmore.png in Resources */, + 661EEA981ACC2FD4007176B0 /* pattern01.png in Resources */, + D0D29C9220EC44080003CE47 /* M-to-S-to-T.svg in Resources */, + 661EEAE31ACC3444007176B0 /* rounded-rects.png in Resources */, + 661EEAE71ACC3444007176B0 /* test-stroke-dash-array.png in Resources */, + 661EEA841ACC2FBB007176B0 /* radgrad01.svg in Resources */, 665E07F316CE81DD00D6934D /* g-element-applies-rotation.svg in Resources */, - 66A09CA616CFE67B003CD5CD /* lingrad01.svg in Resources */, - 66A09CA716CFE67B003CD5CD /* opacity01.svg in Resources */, - 66A09CA816CFE67B003CD5CD /* PreserveAspectRatio.svg in Resources */, - 66A09CA916CFE67B003CD5CD /* StyleAttribute.svg in Resources */, - 66A09CAA16CFE67B003CD5CD /* text01.svg in Resources */, - 66A09CAB16CFE67B003CD5CD /* tspan01.svg in Resources */, + 661EEAE11ACC3444007176B0 /* Reinel_compass_rose.png in Resources */, + 661EEAE81ACC3444007176B0 /* test-wave-1.png in Resources */, + 661EEAD21ACC3444007176B0 /* g-element-applies-rotation.png in Resources */, + 666D03161AD07CAE006ED358 /* Reinel_compass_rose-simplified-more.svg in Resources */, + 661EEAD41ACC3444007176B0 /* ImageAspectRatio.png in Resources */, + 66B695F3199BFAC900F8E7EE /* bird-1382034603Euc-cropped.png in Resources */, + 666D03211AD08116006ED358 /* Scale-Negative-Direction.png in Resources */, + 661EEA871ACC2FBB007176B0 /* tspan01.svg in Resources */, + 661EEAE21ACC3444007176B0 /* rotated-and-skewed-text.png in Resources */, + BD54E3DB1AB7A13A001039C0 /* parent-clip.svg in Resources */, + 661EEA9E1ACC2FD4007176B0 /* tspan01.png in Resources */, + 66B695F4199BFAC900F8E7EE /* imagetag-layer2-sun.svg in Resources */, 66324BE216D24FA4001C1E83 /* rounded-rects.svg in Resources */, + 661EEAD91ACC3444007176B0 /* map-alaska-onlysimple.png in Resources */, + 661EEACA1ACC3444007176B0 /* australia_states_blank.png in Resources */, + 661EEAD01ACC3444007176B0 /* CurvedDiamond.png in Resources */, + 661EEAD61ACC3444007176B0 /* imageWithASinglePointPath.png in Resources */, 66E785AB171A228A001EF59D /* svg-with-explicit-width.svg in Resources */, + 661EEA811ACC2FBB007176B0 /* pattern01.svg in Resources */, + 661EEA541ACC1723007176B0 /* Monkey.png in Resources */, 66E785AD171A2345001EF59D /* svg-with-explicit-width-large.svg in Resources */, + 4FD822441AD058AB00E419D3 /* arcs01.png in Resources */, 9ED79A21179D83580048AA5B /* radialGradientTest.svg in Resources */, + 66C43EA918398E6E00299662 /* sakamura-default-fill-opacity-test.svg in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -436,15 +985,24 @@ buildActionMask = 2147483647; files = ( 66E8626B1688BA0B0059C9C4 /* AppDelegate.m in Sources */, + 661EEA701ACC2E31007176B0 /* VCMainMenuViewController.m in Sources */, + 661EEA4B1ACC140F007176B0 /* SampleFileInfo.m in Sources */, 66E8626E1688BA0B0059C9C4 /* DetailViewController.m in Sources */, + 661EEA481ACC0667007176B0 /* VCGridOfImagesViewController.m in Sources */, 66E862741688BA0B0059C9C4 /* main.m in Sources */, 66E862751688BA0B0059C9C4 /* MasterViewController.m in Sources */, + 662701A41AD978A800B3AD03 /* VCAllSpecImages.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ + 32AF7BC221738A0300142396 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = "SVGKitFramework-iOS"; + targetProxy = 32AF7BC121738A0300142396 /* PBXContainerItemProxy */; + }; 66E785A9171A1208001EF59D /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = "SVGKit-iOS"; @@ -500,14 +1058,23 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -515,14 +1082,18 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "../../iOS/**", "../../Core/**", ); - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; PROVISIONING_PROFILE = ""; "PROVISIONING_PROFILE[sdk=iphoneos*]" = ""; SDKROOT = iphoneos; @@ -534,21 +1105,32 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "../../iOS/**", "../../Core/**", ); - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; TARGETED_DEVICE_FAMILY = "1,2"; @@ -559,14 +1141,19 @@ 661A0DF5161727D0008D5FBE /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/3rd-party-frameworks/CocoaLumberjack-2.2.0/iOS", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "XCodeProjectData/Demo-iOS/Demo-iOS-Prefix.pch"; + GCC_PREFIX_HEADER = "SVGKitLibrary/Demo-iOS/Demo-iOS-Prefix.pch"; HEADER_SEARCH_PATHS = ( "Source/**", "calayer-exporter", ); - INFOPLIST_FILE = "XCodeProjectData/Demo-iOS/Demo-iOS-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + INFOPLIST_FILE = "SVGKitLibrary/Demo-iOS/Demo-iOS-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "Demo-iOS"; @@ -577,14 +1164,19 @@ 661A0DF6161727D0008D5FBE /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/3rd-party-frameworks/CocoaLumberjack-2.2.0/iOS", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "XCodeProjectData/Demo-iOS/Demo-iOS-Prefix.pch"; + GCC_PREFIX_HEADER = "SVGKitLibrary/Demo-iOS/Demo-iOS-Prefix.pch"; HEADER_SEARCH_PATHS = ( "Source/**", "calayer-exporter", ); - INFOPLIST_FILE = "XCodeProjectData/Demo-iOS/Demo-iOS-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + INFOPLIST_FILE = "SVGKitLibrary/Demo-iOS/Demo-iOS-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "Demo-iOS"; diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE new file mode 100644 index 000000000..4b35b56de --- /dev/null +++ b/ISSUE_TEMPLATE @@ -0,0 +1,10 @@ +### New Issue Checklist + +* [ ] I have read and understood the [CONTRIBUTING guide](https://github.com/SVGKit/SVGKit/blob/2.x/CONTRIBUTING.md) +* [ ] I have reproduced the problem while running in Xcode, and read the Console log, and acted upon any relevant error or warning messages +* [ ] I have reproduced the problem while running in Xcode's Debugger, and used breakpoints to examine the actual values of variables vs the expected values +* [ ] I am not using CocoaPods, or: I am using CocoaPods, but have verified my podspec points to SVGKit v2.x + +### Issue Description and Steps + +Please fill in the detailed description of the issue (full output of any stack trace, compiler error, ...) and the steps to reproduce the issue. diff --git a/LICENSE b/LICENSE index 7880055ce..efbe8b41e 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,5 @@ -Copyright (c) 2010-2011 Matt Rajca +Copyright (c) 2010-2011 Matt Rajca, 2011-2015 various authors +Parts Copyright (c) Tipbit Inc Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/Package.swift b/Package.swift new file mode 100644 index 000000000..e8aca9e2a --- /dev/null +++ b/Package.swift @@ -0,0 +1,23 @@ +// swift-tools-version:5.1 +import PackageDescription + +let package = Package( + name: "SVGKit", + platforms: [ + .macOS(.v10_10), + .iOS(.v13), + .tvOS(.v13) + ], + products: [ + .library( + name: "SVGKit", + targets: ["SVGKit"] + ) + ], + targets: [ + .target( + name: "SVGKit", + path: "Source" + ) + ] +) diff --git a/README.mdown b/README.mdown index a87b4ccb7..10e56c55c 100644 --- a/README.mdown +++ b/README.mdown @@ -1,94 +1,120 @@ # SVGKit -SVGKit is a Cocoa framework for rendering SVG files natively: it's fast and powerful. +SVGKit is a Cocoa framework for rendering SVG files natively: it's fast and powerful. Some additional info and links [are on the wiki](https://github.com/SVGKit/SVGKit/wiki) -Versions: - - v1.0 - 2013, approximately 90% coverage of the SVG spec. Stable and quite fast - https://github.com/SVGKit/SVGKit/tree/v1.0 - - v1.1.0 - Current branch in development; all pull-requests should be issued against this branch - https://github.com/SVGKit/SVGKit/tree/1.1.0 -## Xcode Projects Included +## Versions: -For 2013, we have a major refactor/rewrite of the core SVGKit, fixing many bugs, adding many features, and making SVGKit much closer to meeting the SVG official Specification - http://www.w3.org/TR/SVG/ +Latest info at: https://github.com/SVGKit/SVGKit/wiki/Versions -Because so much has changed, Adam wrote a series of blog posts to explain how to use the latest versions: + - v3.x = current "in development" branch with latest changes, fixes, features + - NB: this is now automatically selected in GitHub as the "default" branch when you visit SVGKit's project page + +# Getting Started - - GETTING STARTED, plus NEW FEATURES: http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/ - - QUICK RECIPES for common uses:  http://t-machine.org/index.php/2013/01/02/svgkit-2013-recipes/ - - additiona: How to scale an SVG image on screen: http://t-machine.org/index.php/2013/04/14/svgkit-scaling-svg-images/ - - CONTRIBUTING to the project, CORE ARCHITECTURE: http://t-machine.org/index.php/2012/12/31/svgkit-2013-development/ - +## Run the Demo - iOS +1. Open up "Demo-iOS.xcodeproj", and run it (on simulator or device). Try different SVG's. Zoom, pan, and (with the Monkey only:) hit the "Animate" button. Tap the images to see bounding-boxes / hit dectection (might need you to hit the Debug button first) +1. If you have ANY problems building the library and embedding it in your app, compare your build settings to the Demo-iOS build settings - if something's different, it's probably the problem. -### Ultra-quick 'getting started' (iPhone/iPad) ------ +# Installation (add SVGKit to your app) -Open the project "Demo-iOS", select your preferred simulator (or device, if it's plugged in), build and run. Try the sample SVG's packaged with SVGKit. +You have 3 main options for installing SVGKit: -To use SVGKit, either CREATE AND DISPLAY AN IMAGE ON SCREEN: +1. Drag/drop the .framework file into your project <-- PREFERRED / RECOMMENDED +1. Use CocoaPods +1. Use Carthage +1. Drag/drop the static library into your project, and configure the build settings in your project - [self.view addSubview: [[SVGKFastImageView alloc] initWithSVGKImage: [SVGKImage imageNamed:@"mySVGfile.svg"]]]; +NB: the "static library" is our backwards-compatible, manual install that always works if you have problems with CocoaPods/Carthage/Framework. -or LOAD AN IMAGE AND CONVERT TO A UIIMAGE OBJECT: +## OPTION 1: Use the Framework - drag, drop, done! - UIImage* newImage = [SVGKImage imageNamed:@"mySVGfile"].UIImage; +1. Open "SVGKit-iOS.xcodeproj" +1. Build the project once +1. In Project Navigator, expand the Products folder +1. Drag/drop SVGKit.framework into your app-project -WARNING: Due to some bugs in Apple's renderer, SVGKFastImageView doesn't render gradient-fills for anything except rectangles, and cannot use CoreAnimation. For higher accuracy (but slightly worse performance), use SVGKLayeredImageView instead. +NB: Frameworks are the preferred way to use libraries in Xcode. But this is a new feature, it might have bugs. If you have ANY problems, please create an Issue, but also try the Static Library method below -Key methods / properties you might find useful: +You MAY also need to manually add the following Apple Frameworks to your app: + - CoreText + - CoreImage + - libxml2.dylib + - QuartzCore + - CoreGraphics + - UIKit - 1. SVGKImage - all the magic happens here - 1. SVGKImage.DOMTree - a complete DOM tree of the "parsed" SVG/XML document, with ALL TAGS (even if unsupported by current SVGKit - they will be parsed anyway!) - 1. SVGKImage.CALayerTree - a complete, renderable, tree of Apple CALayer objects (only contains layers for features currently supported - if you find something missing, please submit a fix!) +You MAY also need to add the following 3rd party Frameworks to your app (included with SVGKit): + - CocoaLumberjack (in the SVGKit-iOS project, select the "3rd-party-frameworks" folder, and drag/drop whichever versions you need: iOS, tvOS, etc) + Remember to embed the library too (should show under Target -> General -> Embedded Binaries) + +## OPTION 2: Using CocoaPods +[CocoaPods](https://github.com/CocoaPods/CocoaPods) is a dependency manager for CocoaTouch. To do CocoaPods, adding the following in your podfile: +``` +pod 'SVGKit' +``` -## Advanced Features (this branch/fork only!) (iPhone/iPad) +It is also recommended that you setup your podfile to get SVGKit from the latest branch (October 2018: currently 3.x). -There are many new features in this version (2013) of SVGKit. Read the blog posts above for more detail, but briefly: +``` +pod 'SVGKit', :git => 'https://github.com/SVGKit/SVGKit.git', :branch => '3.x' +``` - - use an SVG just like it's a normal PNG file: use SVGKFastImageView like it's UIImageView: - - load an SVG from web, or from disk - - search an SVG file for particular tags / nodes / elements: - - automatic scaling of your SVG to fit their on-screen size (often reduces the memory required) - - Access to the DOM Document Object Model - - Retrieve any part of your SVG document positioned correctly in space - - detailed information on whether and WHY parsing failed: +## OPTION 3: Using Carthage +[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager for Cocoa. To use Carthage, adding the following in your Cartfile: -## Usage - OS X +``` +github "SVGKit/SVGKit" +``` -UNSUPPORTED: the code exists, but none of the maintainers have used it recently, so we're not even sure if the OS X build still works! +It is also recommended that you setup your Cartfile to get SVGKit from the current version (October 2018: 3.x branch). -OS X: ...this needs updating; some minor code changes are needed to "fix" this project. The OS X framework currently DOES NOT BUILD because iOS classes are being referenced in a couple of places. +``` +github "SVGKit/SVGKit" "3.x" +``` -Feel free to report any issues or suggest improvements in the issue tracker +## OPTION 4: Build the static library +We have a build script that automatically builds ALL versions of the library at once, and ships them as a single file: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4/3647187#3647187 -## Installation +It's all setup already, all you need to do is: -There is a sample project you can examine which embeds the entire SVGKit project into an application project. Many people like working this way (although Xcode isn't very good at it. Open the "Demo-iOS" project and poke around. +1. Open "SVGKit-iOS.xcodeproj", switch to "SVGKit-iOS" target and Build it (cmd-B) +3. in left navbar, scroll to bottom, and open the "Products" section +4. right click the library ("libSVGKitBLAHBLAH.a") and select "show in finder" +5. GO UP ONE FOLDER +6. select the "Debug-universal" (or Release-universal if you were building in Release mode) folder +7. Drag/drop the .a file and the "usr" folder into your project (select the "Copy files" checkbox) +8. In Build Settings, select "Other Linker Flags" and add "-ObjC" +9. Edit your build settings and set "C/C++ Compiler Version" = "LLVM Compiler 2.0" +10. Add ALL the frameworks and 3rd party libraries listed below (go to "Build Phases", and "Link Binary with Libraries"): + - CoreText + - CoreImage + - libxml2.dylib + - QuartzCore + - CoreGraphics + - UIKit -Alternatively, most people like to compile an embeddable library: - 1. Open the project "SVGKit-iOS" - 2. Select the target "SVGKit Library" from the dropdown build selector at top left - 3. Build - 4a. (open the Products section on left hand bar in Xcode, right click the product, and select "Show in Finder". THEN GO UP ONE DIRECTORY! You MUST NOT USE the Product that Xcode shows you - it IS WRONG, it is a BUG IN APPLE'S XCODE) - 4. Look in your output directory for a folder named "debug-universal" - this contains a library + headers for: iPhone, iPad, iOS Simulator - 5. Drag/drop the library file, and the headers folder (should be called "usr") into your iPhone/iPad project. - 6. Edit your build settings and set "C/C++ Compiler Version" = "LLVM Compiler 2.0" - 7. Edit your build settings and add "Other Linker Flags" = "-ObjC" - 8. Add all the REQUIRED APPLE FRAMEWORKS (see below) +Everything else is automatic. - 9. (Optional but recommended): Edit your build settings and add "Header Search Paths" = "/usr/include/libxml2" - 10. (Optional but recommended): Add the framework "libxml2.dylib" +## Usage - OS X -### REQUIRED APPLE FRAMEWORKS +Added in version 2.1.0 / Autumn 2018: support for macOS. -You must add the following frameworks for SVGKit to compile - unless you are embedding the whole project file (in which case Apple does it automatically) +You can use nearly the same API like iOS. Including `SVGKFastImageView`, `SVGKLayeredImageView`, and you can use `SVGKImage.NSImage` to export SVG layer to bitmap image. - - CoreText - - CoreImage - - QuartzCore - - CoreGraphics - - UIKit +We also provide a macOS demo for SVGKit. To run the Demo, open `Demo-OSX.xcodeproj` and built to run. You can browser the different SVG files using those two different type of view to check the compatibility. -(only the first two are unusual - the rest you probably have by default in your iOS project template) +## Recipes for using the library + +Here are some old posts (some of these APIs have changed slightly since they were written) on using SVGKit, with advice on which methods to use and why: + + - GETTING STARTED, plus NEW FEATURES: http://t-machine.org/index.php/2012/12/31/svgkit-2013-usage/ + - QUICK RECIPES for common uses:  http://t-machine.org/index.php/2013/01/02/svgkit-2013-recipes/ + - additiona: How to scale an SVG image on screen: http://t-machine.org/index.php/2013/04/14/svgkit-scaling-svg-images/ + - CONTRIBUTING to the project, CORE ARCHITECTURE: http://t-machine.org/index.php/2012/12/31/svgkit-2013-development/ + + - (November 2013): New (experimental) feature - writing SVG's out to disk, preserving any changes you made programmatically: http://t-machine.org/index.php/2013/11/17/svgkit-programmatic-editing-of-svg-files-on-ios/ diff --git a/SVGKit-iOS.xcodeproj/project.pbxproj b/SVGKit-iOS.xcodeproj/project.pbxproj index ce52f1b75..287347f49 100644 --- a/SVGKit-iOS.xcodeproj/project.pbxproj +++ b/SVGKit-iOS.xcodeproj/project.pbxproj @@ -7,23 +7,287 @@ objects = { /* Begin PBXBuildFile section */ - 00E86D631741586600F0FA0A /* DDAbstractDatabaseLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D531741586600F0FA0A /* DDAbstractDatabaseLogger.h */; }; - 00E86D641741586600F0FA0A /* DDAbstractDatabaseLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D541741586600F0FA0A /* DDAbstractDatabaseLogger.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D651741586600F0FA0A /* DDASLLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D551741586600F0FA0A /* DDASLLogger.h */; }; - 00E86D661741586600F0FA0A /* DDASLLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D561741586600F0FA0A /* DDASLLogger.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D671741586600F0FA0A /* DDFileLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D571741586600F0FA0A /* DDFileLogger.h */; }; - 00E86D681741586600F0FA0A /* DDFileLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D581741586600F0FA0A /* DDFileLogger.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D691741586600F0FA0A /* DDLog.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D591741586600F0FA0A /* DDLog.h */; }; - 00E86D6A1741586600F0FA0A /* DDLog.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D5A1741586600F0FA0A /* DDLog.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D6B1741586600F0FA0A /* DDTTYLogger.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D5B1741586600F0FA0A /* DDTTYLogger.h */; }; - 00E86D6C1741586600F0FA0A /* DDTTYLogger.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D5C1741586600F0FA0A /* DDTTYLogger.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D6D1741586600F0FA0A /* ContextFilterLogFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D5E1741586600F0FA0A /* ContextFilterLogFormatter.h */; }; - 00E86D6E1741586600F0FA0A /* ContextFilterLogFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D5F1741586600F0FA0A /* ContextFilterLogFormatter.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; - 00E86D6F1741586600F0FA0A /* DispatchQueueLogFormatter.h in Headers */ = {isa = PBXBuildFile; fileRef = 00E86D601741586600F0FA0A /* DispatchQueueLogFormatter.h */; }; - 00E86D701741586600F0FA0A /* DispatchQueueLogFormatter.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D611741586600F0FA0A /* DispatchQueueLogFormatter.m */; settings = {COMPILER_FLAGS = "-fobjc-arc"; }; }; 00E86D7417415AA000F0FA0A /* SVGKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D7317415AA000F0FA0A /* SVGKit.m */; }; 036A524C16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 036A524D16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */; }; + 321EAA4D2171E51800640504 /* SVGKit-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */; }; + 321EAA4E2171E51800640504 /* SVGKit-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */; }; + 321EAA4F2171E51800640504 /* SVGKit-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */; }; + 321EAA6A2171ECDE00640504 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 321EAA542171E72900640504 /* libxml2.tbd */; }; + 321EAA6B2171ECE200640504 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 321EAA582171E73800640504 /* Foundation.framework */; }; + 321EAA6C2171ECE700640504 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 321EAA562171E73100640504 /* CoreGraphics.framework */; }; + 321EAA6D2171ECEC00640504 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 321EAA5A2171E73E00640504 /* QuartzCore.framework */; }; + 321EAA6E2171ED6900640504 /* AppleSucksDOMImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8630E1688C2770059C9C4 /* AppleSucksDOMImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA6F2171ED6900640504 /* AppleSucksDOMImplementation.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8630F1688C2770059C9C4 /* AppleSucksDOMImplementation.m */; }; + 321EAA702171ED6900640504 /* Attr.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863101688C2770059C9C4 /* Attr.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA712171ED6900640504 /* Attr.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863111688C2770059C9C4 /* Attr.m */; }; + 321EAA722171ED6900640504 /* CDATASection.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863121688C2770059C9C4 /* CDATASection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA732171ED6900640504 /* CDATASection.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863131688C2770059C9C4 /* CDATASection.m */; }; + 321EAA742171ED6900640504 /* CharacterData.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863141688C2770059C9C4 /* CharacterData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA752171ED6900640504 /* CharacterData.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863151688C2770059C9C4 /* CharacterData.m */; }; + 321EAA762171ED6900640504 /* Comment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863161688C2770059C9C4 /* Comment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA772171ED6900640504 /* Comment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863171688C2770059C9C4 /* Comment.m */; }; + 321EAA782171ED6900640504 /* CSSStyleDeclaration.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB1168A001400EC93C7 /* CSSStyleDeclaration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA792171ED6900640504 /* CSSStyleDeclaration.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */; }; + 321EAA7A2171ED6900640504 /* CSSRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB9168A027E00EC93C7 /* CSSRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA7B2171ED6900640504 /* CSSRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBA168A027E00EC93C7 /* CSSRule.m */; }; + 321EAA7C2171ED6900640504 /* CSSStyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DBD168A031100EC93C7 /* CSSStyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA7D2171ED6900640504 /* CSSStyleRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674B8168A511400486B68 /* CSSStyleRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA7E2171ED6900640504 /* CSSStyleRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674B9168A511400486B68 /* CSSStyleRule.m */; }; + 321EAA7F2171ED6900640504 /* CSSStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBE168A031100EC93C7 /* CSSStyleSheet.m */; }; + 321EAA802171ED6900640504 /* CSSRuleList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC1168A038400EC93C7 /* CSSRuleList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA812171ED6900640504 /* CSSRuleList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DC2168A038400EC93C7 /* CSSRuleList.m */; }; + 321EAA822171ED6900640504 /* CSSRuleList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC5168A04D000EC93C7 /* CSSRuleList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA832171ED6900640504 /* CSSPrimitiveValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC9168A0A2300EC93C7 /* CSSPrimitiveValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA842171ED6900640504 /* CSSPrimitiveValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCA168A0A2300EC93C7 /* CSSPrimitiveValue.m */; }; + 321EAA852171ED6900640504 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD9168A2F4200EC93C7 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA862171ED6900640504 /* CSSValueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DCD168A129500EC93C7 /* CSSValueList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA872171ED6900640504 /* CSSValueList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCE168A129500EC93C7 /* CSSValueList.m */; }; + 321EAA882171ED6900640504 /* CSSValue_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD1168A13BC00EC93C7 /* CSSValue_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA892171ED6900640504 /* CSSValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB5168A004D00EC93C7 /* CSSValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA8A2171ED6900640504 /* CSSValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB6168A004D00EC93C7 /* CSSValue.m */; }; + 321EAA8B2171ED6900640504 /* Document+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863181688C2770059C9C4 /* Document+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA8C2171ED6900640504 /* Document.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863191688C2770059C9C4 /* Document.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA8D2171ED6900640504 /* Document.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631A1688C2770059C9C4 /* Document.m */; }; + 321EAA8E2171ED6900640504 /* DocumentCSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BD168A536C00486B68 /* DocumentCSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA8F2171ED6900640504 /* DocumentStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BE168A551300486B68 /* DocumentStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA902171ED6900640504 /* StyleSheetList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674CB168A58D000486B68 /* StyleSheetList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA912171ED6900640504 /* StyleSheetList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BF168A556200486B68 /* StyleSheetList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA922171ED6900640504 /* StyleSheetList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C0168A556300486B68 /* StyleSheetList.m */; }; + 321EAA932171ED6900640504 /* StyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C3168A55AD00486B68 /* StyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA942171ED6900640504 /* StyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C4168A55AE00486B68 /* StyleSheet.m */; }; + 321EAA952171ED6900640504 /* MediaList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C7168A561B00486B68 /* MediaList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA962171ED6900640504 /* MediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C8168A561B00486B68 /* MediaList.m */; }; + 321EAA972171ED6900640504 /* DocumentFragment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631B1688C2770059C9C4 /* DocumentFragment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA982171ED6900640504 /* DocumentFragment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631C1688C2770059C9C4 /* DocumentFragment.m */; }; + 321EAA992171ED6900640504 /* DocumentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631D1688C2770059C9C4 /* DocumentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA9A2171ED6900640504 /* DocumentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631E1688C2770059C9C4 /* DocumentType.m */; }; + 321EAA9B2171ED6900640504 /* DOMHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631F1688C2770059C9C4 /* DOMHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA9C2171ED6900640504 /* DOMHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863201688C2770059C9C4 /* DOMHelperUtilities.m */; }; + 321EAA9D2171ED6900640504 /* Element.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863211688C2770059C9C4 /* Element.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAA9E2171ED6900640504 /* Element.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863221688C2770059C9C4 /* Element.m */; }; + 321EAA9F2171ED6900640504 /* EntityReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863231688C2770059C9C4 /* EntityReference.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA02171ED6900640504 /* EntityReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863241688C2770059C9C4 /* EntityReference.m */; }; + 321EAAA12171ED6900640504 /* NamedNodeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863251688C2770059C9C4 /* NamedNodeMap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA22171ED6900640504 /* NamedNodeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863261688C2770059C9C4 /* NamedNodeMap.m */; }; + 321EAAA32171ED6900640504 /* NamedNodeMap_Iterable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA42171ED6900640504 /* Node+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863271688C2770059C9C4 /* Node+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA52171ED6900640504 /* Node.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863281688C2770059C9C4 /* Node.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA62171ED6900640504 /* Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863291688C2770059C9C4 /* Node.m */; }; + 321EAAA72171ED6900640504 /* NodeList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632A1688C2770059C9C4 /* NodeList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA82171ED6900640504 /* NodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632B1688C2770059C9C4 /* NodeList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAA92171ED6900640504 /* NodeList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632C1688C2770059C9C4 /* NodeList.m */; }; + 321EAAAA2171ED6900640504 /* ProcessingInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632D1688C2770059C9C4 /* ProcessingInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAAB2171ED6900640504 /* ProcessingInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632E1688C2770059C9C4 /* ProcessingInstruction.m */; }; + 321EAAAC2171ED6900640504 /* Text.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632F1688C2770059C9C4 /* Text.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAAD2171ED6900640504 /* Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863301688C2770059C9C4 /* Text.m */; }; + 321EAAAE2171ED6900640504 /* DOMGlobalSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694BB7A16967407007D0947 /* DOMGlobalSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAAF2171ED6F00640504 /* SVGAngle.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863321688C2770059C9C4 /* SVGAngle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAB02171ED6F00640504 /* SVGAngle.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863331688C2770059C9C4 /* SVGAngle.m */; }; + 321EAAB12171ED6F00640504 /* SVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAB22171ED6F00640504 /* SVGAnimatedPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */; }; + 321EAAB32171ED6F00640504 /* SVGClipPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAB42171ED6F00640504 /* SVGClipPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */; }; + 321EAAB52171ED6F00640504 /* SVGDefsElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863341688C2770059C9C4 /* SVGDefsElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAB62171ED6F00640504 /* SVGDefsElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863351688C2770059C9C4 /* SVGDefsElement.m */; }; + 321EAAB72171ED6F00640504 /* SVGDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863361688C2770059C9C4 /* SVGDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAB82171ED6F00640504 /* SVGDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863371688C2770059C9C4 /* SVGDocument.m */; }; + 321EAAB92171ED6F00640504 /* SVGDocument_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863381688C2770059C9C4 /* SVGDocument_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAABA2171ED6F00640504 /* SVGElementInstance.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863391688C2770059C9C4 /* SVGElementInstance.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAABB2171ED6F00640504 /* SVGElementInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633A1688C2770059C9C4 /* SVGElementInstance.m */; }; + 321EAABC2171ED6F00640504 /* SVGElementInstance_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633B1688C2770059C9C4 /* SVGElementInstance_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAABD2171ED6F00640504 /* SVGElementInstanceList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633C1688C2770059C9C4 /* SVGElementInstanceList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAABE2171ED6F00640504 /* SVGElementInstanceList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633D1688C2770059C9C4 /* SVGElementInstanceList.m */; }; + 321EAABF2171ED6F00640504 /* SVGElementInstanceList_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633E1688C2770059C9C4 /* SVGElementInstanceList_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC02171ED6F00640504 /* SVGGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 6668E2061688D3CF00F774A6 /* SVGGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC12171ED6F00640504 /* SVGStylable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DAF1689FF5D00EC93C7 /* SVGStylable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC22171ED6F00640504 /* SVGGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6668E2071688D3CF00F774A6 /* SVGGElement.m */; }; + 321EAAC32171ED6F00640504 /* SVGLength.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633F1688C2770059C9C4 /* SVGLength.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC42171ED6F00640504 /* SVGLength.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863401688C2770059C9C4 /* SVGLength.m */; }; + 321EAAC52171ED6F00640504 /* SVGMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863411688C2770059C9C4 /* SVGMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC62171ED6F00640504 /* SVGMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863421688C2770059C9C4 /* SVGMatrix.m */; }; + 321EAAC72171ED6F00640504 /* SVGNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863431688C2770059C9C4 /* SVGNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC82171ED6F00640504 /* SVGPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863441688C2770059C9C4 /* SVGPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAC92171ED6F00640504 /* SVGPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863451688C2770059C9C4 /* SVGPoint.m */; }; + 321EAACA2171ED6F00640504 /* SVGPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAACB2171ED6F00640504 /* SVGPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */; }; + 321EAACC2171ED6F00640504 /* SVGRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863461688C2770059C9C4 /* SVGRect.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAACD2171ED6F00640504 /* SVGRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 66372F5916960D4E008C6C56 /* SVGRect.m */; }; + 321EAACE2171ED6F00640504 /* SVGSVGElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863471688C2770059C9C4 /* SVGSVGElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAACF2171ED6F00640504 /* SVGTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863481688C2770059C9C4 /* SVGTransform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD02171ED6F00640504 /* SVGTransform.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863491688C2770059C9C4 /* SVGTransform.m */; }; + 321EAAD12171ED6F00640504 /* SVGUseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634A1688C2770059C9C4 /* SVGUseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD22171ED6F00640504 /* SVGUseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8634B1688C2770059C9C4 /* SVGUseElement.m */; }; + 321EAAD32171ED6F00640504 /* SVGUseElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634C1688C2770059C9C4 /* SVGUseElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD42171ED6F00640504 /* SVGViewSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634D1688C2770059C9C4 /* SVGViewSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD52171ED6F00640504 /* SVGHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01216CAEF0B00CCBFB3 /* SVGHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD62171ED6F00640504 /* SVGHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 663FD01316CAEF0C00CCBFB3 /* SVGHelperUtilities.m */; }; + 321EAAD72171ED6F00640504 /* SVGTransformable.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01716CAF05900CCBFB3 /* SVGTransformable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD82171ED6F00640504 /* SVGFitToViewBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 66A09CB016CFF494003CD5CD /* SVGFitToViewBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAD92171ED6F00640504 /* SVGTextPositioningElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF016CC2FBE006F4BC3 /* SVGTextPositioningElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAADA2171ED6F00640504 /* SVGTextPositioningElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF116CC2FBE006F4BC3 /* SVGTextPositioningElement.m */; }; + 321EAADB2171ED6F00640504 /* SVGTextContentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAADC2171ED6F00640504 /* SVGTextContentElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF616CC2FCA006F4BC3 /* SVGTextContentElement.m */; }; + 321EAADD2171ED6F00640504 /* SVGTextPositioningElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBFB16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAADE2171ED6F00640504 /* SVGUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAADF2171ED7E00640504 /* ConverterSVGToCALayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE02171ED7E00640504 /* SVGGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8591688CB37002E2658 /* SVGGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE12171ED7E00640504 /* SVGGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */; }; + 321EAAE22171ED7E00640504 /* SVGGradientStop.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85B1688CB37002E2658 /* SVGGradientStop.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE32171ED7E00640504 /* SVGGradientStop.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85C1688CB37002E2658 /* SVGGradientStop.m */; }; + 321EAAE42171ED7E00640504 /* SVGStyleCatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE52171ED7E00640504 /* SVGStyleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85E1688CB37002E2658 /* SVGStyleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE62171ED7E00640504 /* SVGStyleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85F1688CB37002E2658 /* SVGStyleElement.m */; }; + 321EAAE72171ED7E00640504 /* SVGCircleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634F1688C2770059C9C4 /* SVGCircleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAE82171ED7E00640504 /* SVGCircleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863501688C2770059C9C4 /* SVGCircleElement.m */; }; + 321EAAE92171ED7E00640504 /* SVGDescriptionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863511688C2770059C9C4 /* SVGDescriptionElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAEA2171ED7E00640504 /* SVGDescriptionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863521688C2770059C9C4 /* SVGDescriptionElement.m */; }; + 321EAAEB2171ED7E00640504 /* SVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863531688C2770059C9C4 /* SVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAEC2171ED7E00640504 /* SVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863541688C2770059C9C4 /* SVGElement.m */; }; + 321EAAED2171ED7E00640504 /* SVGElement_ForParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863551688C2770059C9C4 /* SVGElement_ForParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAEE2171ED7E00640504 /* SVGEllipseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863561688C2770059C9C4 /* SVGEllipseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAEF2171ED7E00640504 /* SVGEllipseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863571688C2770059C9C4 /* SVGEllipseElement.m */; }; + 321EAAF02171ED7E00640504 /* SVGGroupElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863581688C2770059C9C4 /* SVGGroupElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAF12171ED7E00640504 /* SVGGroupElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863591688C2770059C9C4 /* SVGGroupElement.m */; }; + 321EAAF22171ED7E00640504 /* SVGImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635A1688C2770059C9C4 /* SVGImageElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAF32171ED7E00640504 /* SVGImageElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635B1688C2770059C9C4 /* SVGImageElement.m */; }; + 321EAAF42171ED7E00640504 /* SVGLineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635D1688C2770059C9C4 /* SVGLineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAF52171ED7E00640504 /* SVGLineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635E1688C2770059C9C4 /* SVGLineElement.m */; }; + 321EAAF62171ED7E00640504 /* SVGPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635F1688C2770059C9C4 /* SVGPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAF72171ED7E00640504 /* SVGPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863601688C2770059C9C4 /* SVGPathElement.m */; }; + 321EAAF82171ED7E00640504 /* SVGPolygonElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863611688C2770059C9C4 /* SVGPolygonElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAF92171ED7E00640504 /* SVGPolygonElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863621688C2770059C9C4 /* SVGPolygonElement.m */; }; + 321EAAFA2171ED7E00640504 /* SVGPolylineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863631688C2770059C9C4 /* SVGPolylineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAFB2171ED7E00640504 /* SVGPolylineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863641688C2770059C9C4 /* SVGPolylineElement.m */; }; + 321EAAFC2171ED7E00640504 /* SVGRectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863651688C2770059C9C4 /* SVGRectElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAFD2171ED7E00640504 /* SVGRectElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863661688C2770059C9C4 /* SVGRectElement.m */; }; + 321EAAFE2171ED7E00640504 /* BaseClassForAllSVGBasicShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863671688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAAFF2171ED7E00640504 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01A16CBEF5C00CCBFB3 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB002171ED7E00640504 /* BaseClassForAllSVGBasicShapes.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863681688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.m */; }; + 321EAB012171ED7E00640504 /* SVGSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863691688C2770059C9C4 /* SVGSVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB022171ED7E00640504 /* SVGSVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636A1688C2770059C9C4 /* SVGSVGElement.m */; }; + 321EAB032171ED7E00640504 /* SVGSwitchElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB042171ED7E00640504 /* SVGSwitchElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */; }; + 321EAB052171ED7E00640504 /* SVGTextElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636B1688C2770059C9C4 /* SVGTextElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB062171ED7E00640504 /* SVGTextElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636C1688C2770059C9C4 /* SVGTextElement.m */; }; + 321EAB072171ED7E00640504 /* SVGTitleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB082171ED7E00640504 /* SVGTitleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */; }; + 321EAB092171ED7E00640504 /* TinySVGTextAreaElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB0A2171ED7E00640504 /* TinySVGTextAreaElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */; }; + 321EAB0D2171ED8200640504 /* SVGKImage+CGContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB0E2171ED8200640504 /* SVGKImage+CGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */; }; + 321EAB0F2171ED8200640504 /* SVGKExporterNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB102171ED8200640504 /* SVGKExporterNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */; }; + 321EAB132171ED8700640504 /* SVGKSourceLocalFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB142171ED8700640504 /* SVGKSourceLocalFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD79175F542A0072AAEF /* SVGKSourceLocalFile.m */; }; + 321EAB152171ED8700640504 /* SVGKSourceNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB162171ED8700640504 /* SVGKSourceNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */; }; + 321EAB172171ED8700640504 /* SVGKSourceString.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB182171ED8700640504 /* SVGKSourceString.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7B175F542A0072AAEF /* SVGKSourceString.m */; }; + 321EAB192171ED8700640504 /* SVGKSourceURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB1A2171ED8700640504 /* SVGKSourceURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7D175F542A0072AAEF /* SVGKSourceURL.m */; }; + 321EAB1B2171ED8D00640504 /* SVGKParserDefsAndUse.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863741688C2770059C9C4 /* SVGKParserDefsAndUse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB1C2171ED8D00640504 /* SVGKParserDefsAndUse.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863751688C2770059C9C4 /* SVGKParserDefsAndUse.m */; }; + 321EAB1D2171ED8D00640504 /* SVGKParserDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863761688C2770059C9C4 /* SVGKParserDOM.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB1E2171ED8D00640504 /* SVGKParserDOM.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863771688C2770059C9C4 /* SVGKParserDOM.m */; }; + 321EAB1F2171ED8D00640504 /* SVGKParserGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8501688CA8A002E2658 /* SVGKParserGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB202171ED8D00640504 /* SVGKParserGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8511688CA8A002E2658 /* SVGKParserGradient.m */; }; + 321EAB212171ED8D00640504 /* SVGKParserPatternsAndGradients.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863781688C2770059C9C4 /* SVGKParserPatternsAndGradients.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB222171ED8D00640504 /* SVGKParserPatternsAndGradients.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863791688C2770059C9C4 /* SVGKParserPatternsAndGradients.m */; }; + 321EAB232171ED8D00640504 /* SVGKParserStyles.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8551688CA94002E2658 /* SVGKParserStyles.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB242171ED8D00640504 /* SVGKParserStyles.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8561688CA94002E2658 /* SVGKParserStyles.m */; }; + 321EAB252171ED8D00640504 /* SVGKParserSVG.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637A1688C2770059C9C4 /* SVGKParserSVG.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB262171ED8D00640504 /* SVGKParserSVG.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637B1688C2770059C9C4 /* SVGKParserSVG.m */; }; + 321EAB272171ED9100640504 /* SVGKParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637C1688C2770059C9C4 /* SVGKParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB282171ED9100640504 /* SVGKParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637D1688C2770059C9C4 /* SVGKParser.m */; }; + 321EAB292171ED9100640504 /* SVGKParseResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637E1688C2770059C9C4 /* SVGKParseResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB2A2171ED9100640504 /* SVGKParseResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637F1688C2770059C9C4 /* SVGKParseResult.m */; }; + 321EAB2B2171ED9100640504 /* SVGKParserExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863801688C2770059C9C4 /* SVGKParserExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB2C2171ED9100640504 /* SVGKPointsAndPathsParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863811688C2770059C9C4 /* SVGKPointsAndPathsParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB2D2171ED9100640504 /* SVGKPointsAndPathsParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863821688C2770059C9C4 /* SVGKPointsAndPathsParser.m */; }; + 321EAB2E2171ED9600640504 /* CALayer+RecursiveClone.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD88175F54680072AAEF /* CALayer+RecursiveClone.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB2F2171ED9600640504 /* CALayer+RecursiveClone.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */; }; + 321EAB302171ED9600640504 /* SVGGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB312171ED9600640504 /* SVGGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */; }; + 321EAB322171ED9600640504 /* CALayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB332171ED9600640504 /* CALayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */; }; + 321EAB342171ED9600640504 /* CAShapeLayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB352171ED9600640504 /* CAShapeLayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */; }; + 321EAB362171ED9600640504 /* CALayerWithChildHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863841688C2770059C9C4 /* CALayerWithChildHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB372171ED9600640504 /* CALayerWithChildHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863851688C2770059C9C4 /* CALayerWithChildHitTest.m */; }; + 321EAB382171ED9600640504 /* CAShapeLayerWithHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863861688C2770059C9C4 /* CAShapeLayerWithHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB392171ED9600640504 /* CAShapeLayerWithHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863871688C2770059C9C4 /* CAShapeLayerWithHitTest.m */; }; + 321EAB3A2171ED9600640504 /* CGPathAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863881688C2770059C9C4 /* CGPathAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB3B2171ED9600640504 /* CGPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863891688C2770059C9C4 /* CGPathAdditions.m */; }; + 321EAB3C2171ED9600640504 /* SVGKLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638A1688C2780059C9C4 /* SVGKLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB3D2171ED9600640504 /* SVGKLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638B1688C2780059C9C4 /* SVGKLayer.m */; }; + 321EAB3E2171ED9900640504 /* SVGKImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638C1688C2780059C9C4 /* SVGKImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB3F2171ED9900640504 /* SVGKImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638D1688C2780059C9C4 /* SVGKImage.m */; }; + 321EAB402171ED9900640504 /* SVGKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638E1688C2780059C9C4 /* SVGKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB412171ED9900640504 /* SVGKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D7317415AA000F0FA0A /* SVGKit.m */; }; + 321EAB422171ED9900640504 /* SVGKSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638F1688C2780059C9C4 /* SVGKSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB432171ED9900640504 /* SVGKSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863901688C2780059C9C4 /* SVGKSource.m */; }; + 321EAB442171ED9900640504 /* SVGKit-Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */; }; + 321EAB452171ED9E00640504 /* NSCharacterSet+SVGKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB462171ED9E00640504 /* NSCharacterSet+SVGKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */; }; + 321EAB4D2171ED9E00640504 /* NSData+NSInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB4E2171ED9E00640504 /* NSData+NSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */; }; + 321EAB4F2171EDA200640504 /* SVGKPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639B1688C2780059C9C4 /* SVGKPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB502171EDA200640504 /* SVGKPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639C1688C2780059C9C4 /* SVGKPattern.m */; }; + 321EAB512171EDA200640504 /* SVGUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639D1688C2780059C9C4 /* SVGUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB522171EDA200640504 /* SVGUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639E1688C2780059C9C4 /* SVGUtils.m */; }; + 321EAB612171FB8100640504 /* SVGKImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 321EAB5B2171FB8100640504 /* SVGKImageRep.m */; }; + 321EAB632171FB8100640504 /* SVGKImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 321EAB5D2171FB8100640504 /* SVGKImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB652171FC0700640504 /* SVGKFastImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863921688C2780059C9C4 /* SVGKFastImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB672171FC0700640504 /* SVGKLayeredImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863961688C2780059C9C4 /* SVGKLayeredImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB682172025200640504 /* SVGKImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863941688C2780059C9C4 /* SVGKImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 321EAB692172029800640504 /* SVGKFastImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863931688C2780059C9C4 /* SVGKFastImageView.m */; }; + 321EAB6A2172029800640504 /* SVGKImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863951688C2780059C9C4 /* SVGKImageView.m */; }; + 321EAB6B2172029800640504 /* SVGKLayeredImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863971688C2780059C9C4 /* SVGKLayeredImageView.m */; }; + 322A5B7D218BF990003D9CF1 /* SVGKInlineResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 322A5B7E218BF990003D9CF1 /* SVGKInlineResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */; }; + 322A5B80218BFE0F003D9CF1 /* SVGKInlineResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 322A5B81218BFE10003D9CF1 /* SVGKInlineResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 322A5B82218BFE11003D9CF1 /* SVGKInlineResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 322A5B84218BFF75003D9CF1 /* SVGKInlineResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */; }; + 322A5B85218BFF76003D9CF1 /* SVGKInlineResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */; }; + 322A5B86218BFF77003D9CF1 /* SVGKInlineResource.m in Sources */ = {isa = PBXBuildFile; fileRef = 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */; }; + 327B2892217DABED004D27FC /* SVGLinearGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 327B2893217DABF3004D27FC /* SVGRadialGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 327B2896217DAC73004D27FC /* SVGLinearGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */; }; + 327B2897217DAC77004D27FC /* SVGRadialGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */; }; + 32A1F09F21746F4700ABFCE1 /* SVGKitFramework_OSXTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 32A1F09E21746F4700ABFCE1 /* SVGKitFramework_OSXTests.m */; }; + 32A1F0A121746F4700ABFCE1 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 321EAA622171EC8700640504 /* SVGKit.framework */; }; + 32C4891E21916F3D007B1F29 /* SVGTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32C4891F21916F3D007B1F29 /* SVGTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32C4892021916F3D007B1F29 /* SVGTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32C4892121916F3D007B1F29 /* SVGTextLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32C4892221916F3D007B1F29 /* SVGTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */; }; + 32C4892321916F3D007B1F29 /* SVGTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */; }; + 32C4892421916F3D007B1F29 /* SVGTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */; }; + 32C4892521916F3D007B1F29 /* SVGTextLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */; }; + 32D3D5D72176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */; }; + 32D3D5D82176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */; }; + 32D3D5D92176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */; }; + 32D3D5DA2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5DB2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5DC2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5DF2176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5E02176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5E12176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32D3D5E22176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */; }; + 32D3D5E32176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */; }; + 32D3D5E42176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */; }; + 32EE37972173441400A23278 /* SVGKDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 32EE37962173441400A23278 /* SVGKDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32EE37982173441400A23278 /* SVGKDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 32EE37962173441400A23278 /* SVGKDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32EE37992173441400A23278 /* SVGKDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 32EE37962173441400A23278 /* SVGKDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32EE379A2173441400A23278 /* SVGKDefine.h in Headers */ = {isa = PBXBuildFile; fileRef = 32EE37962173441400A23278 /* SVGKDefine.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32F206DB217324BB00427F24 /* SVGKExporterNSImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 32F206D9217324BB00427F24 /* SVGKExporterNSImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 32F206DC217324BB00427F24 /* SVGKExporterNSImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 32F206DA217324BB00427F24 /* SVGKExporterNSImage.m */; }; + 4FD821F01AC69F6600E419D3 /* SVGSwitchElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 4FD821F11AC69F6600E419D3 /* SVGSwitchElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */; }; + 55452BF719EC68A200B75A30 /* libSVGKit-iOS.2.1.0.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639618E16145D0400E58CCA /* libSVGKit-iOS.2.1.0.a */; }; + 55452C0E19EC6EC600B75A30 /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639633F16145DDC00E58CCA /* libxml2.dylib */; }; 661ADBF216CC2FBE006F4BC3 /* SVGTextPositioningElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF016CC2FBE006F4BC3 /* SVGTextPositioningElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; 661ADBF316CC2FBE006F4BC3 /* SVGTextPositioningElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF116CC2FBE006F4BC3 /* SVGTextPositioningElement.m */; }; 661ADBF716CC2FCA006F4BC3 /* SVGTextContentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -31,13 +295,10 @@ 661ADBFC16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBFB16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 661AE44916D13DA8005E69D9 /* SVGTransformable.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01716CAF05900CCBFB3 /* SVGTransformable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 661AE44A16D13DAD005E69D9 /* SVGFitToViewBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 66A09CB016CFF494003CD5CD /* SVGFitToViewBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 6636CD7E175F542A0072AAEF /* SVGKSourceLocalFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 663403A4188EFC8A0077005F /* CALayer+RecursiveClone.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD88175F54680072AAEF /* CALayer+RecursiveClone.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6636CD7F175F542A0072AAEF /* SVGKSourceLocalFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD79175F542A0072AAEF /* SVGKSourceLocalFile.m */; }; - 6636CD80175F542A0072AAEF /* SVGKSourceString.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6636CD81175F542A0072AAEF /* SVGKSourceString.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7B175F542A0072AAEF /* SVGKSourceString.m */; }; - 6636CD82175F542A0072AAEF /* SVGKSourceURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6636CD83175F542A0072AAEF /* SVGKSourceURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7D175F542A0072AAEF /* SVGKSourceURL.m */; }; - 6636CD8A175F54680072AAEF /* CALayer+RecursiveClone.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD88175F54680072AAEF /* CALayer+RecursiveClone.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6636CD8B175F54680072AAEF /* CALayer+RecursiveClone.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */; }; 6636CD8D175F54970072AAEF /* ConverterSVGToCALayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66372EEE1695F16A008C6C56 /* DocumentCSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BD168A536C00486B68 /* DocumentCSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -45,7 +306,6 @@ 66372EF01695F193008C6C56 /* SVGStylable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DAF1689FF5D00EC93C7 /* SVGStylable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66372F5A16960D4F008C6C56 /* SVGRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 66372F5916960D4E008C6C56 /* SVGRect.m */; }; 6639619216145D0400E58CCA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639619116145D0400E58CCA /* Foundation.framework */; }; - 6639634016145DDC00E58CCA /* libxml2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639633F16145DDC00E58CCA /* libxml2.dylib */; }; 6639634216148CDF00E58CCA /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639634116148CDF00E58CCA /* QuartzCore.framework */; }; 6639634716148DEC00E58CCA /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639634616148DEC00E58CCA /* CoreGraphics.framework */; }; 663FD01416CAEF0D00CCBFB3 /* SVGHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01216CAEF0B00CCBFB3 /* SVGHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -61,6 +321,17 @@ 666674CA168A561C00486B68 /* MediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C8168A561B00486B68 /* MediaList.m */; }; 6668E2081688D3CF00F774A6 /* SVGGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 6668E2061688D3CF00F774A6 /* SVGGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6668E2091688D3CF00F774A6 /* SVGGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6668E2071688D3CF00F774A6 /* SVGGElement.m */; }; + 6681C5151CBF07CA00272CCC /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD9168A2F4200EC93C7 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6681C5161CBF07FB00272CCC /* StyleSheetList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674CB168A58D000486B68 /* StyleSheetList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 668418BA1867457900C61EC2 /* SVGKImage+CGContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 668418BB1867457900C61EC2 /* SVGKImage+CGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */; }; + 668418C018674A0300C61EC2 /* SVGKExporterNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 668418C118674A0300C61EC2 /* SVGKExporterNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */; }; + 668418C418674BF900C61EC2 /* SVGKExporterUIImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418C218674BF900C61EC2 /* SVGKExporterUIImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 668418C518674BF900C61EC2 /* SVGKExporterUIImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418C318674BF900C61EC2 /* SVGKExporterUIImage.m */; }; + 66849FAD18393EC600AE4F28 /* NamedNodeMap_Iterable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6694B5DD199C10400028CFF6 /* SVGKSourceNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 6694B5DE199C10400028CFF6 /* SVGKSourceNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */; }; 6694BB7B16967407007D0947 /* DOMGlobalSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694BB7A16967407007D0947 /* DOMGlobalSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66988DB3168A001400EC93C7 /* CSSStyleDeclaration.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB1168A001400EC93C7 /* CSSStyleDeclaration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66988DB4168A001400EC93C7 /* CSSStyleDeclaration.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */; }; @@ -78,6 +349,13 @@ 66988DCF168A129500EC93C7 /* CSSValueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DCD168A129500EC93C7 /* CSSValueList.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66988DD0168A129500EC93C7 /* CSSValueList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCE168A129500EC93C7 /* CSSValueList.m */; }; 66988DD3168A13BD00EC93C7 /* CSSValue_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD1168A13BC00EC93C7 /* CSSValue_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66DBE4E51C42A00C00A0F0B7 /* SVGKit_iOS-RetainTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 66DBE4E21C42A00C00A0F0B7 /* SVGKit_iOS-RetainTests.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; + 66DBE4E61C42A00C00A0F0B7 /* SVGKit_iOS_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 66DBE4E31C42A00C00A0F0B7 /* SVGKit_iOS_Tests.m */; }; + 66DBE5011C42A0C900A0F0B7 /* SVGKitFramework_iOSTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 66DBE4FF1C42A0C900A0F0B7 /* SVGKitFramework_iOSTests.m */; }; + 66DBE50D1C42A0D800A0F0B7 /* SVGKitFramework_tvOSTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 66DBE50B1C42A0D800A0F0B7 /* SVGKitFramework_tvOSTests.m */; }; + 66E4E5C4188EF5D3007DFCAA /* SVGKSourceLocalFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66E4E5C5188EF5D3007DFCAA /* SVGKSourceString.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66E4E5C6188EF5D3007DFCAA /* SVGKSourceURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66E8639F1688C2780059C9C4 /* AppleSucksDOMImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8630E1688C2770059C9C4 /* AppleSucksDOMImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66E863A01688C2780059C9C4 /* AppleSucksDOMImplementation.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8630F1688C2770059C9C4 /* AppleSucksDOMImplementation.m */; }; 66E863A11688C2780059C9C4 /* Attr.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863101688C2770059C9C4 /* Attr.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -172,8 +450,6 @@ 66E863FB1688C2780059C9C4 /* SVGTextElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636C1688C2770059C9C4 /* SVGTextElement.m */; }; 66E863FC1688C2780059C9C4 /* SVGTitleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66E863FD1688C2780059C9C4 /* SVGTitleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */; }; - 66E863FE1688C2780059C9C4 /* CALayerExporter.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863701688C2770059C9C4 /* CALayerExporter.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 66E863FF1688C2780059C9C4 /* CALayerExporter.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863711688C2770059C9C4 /* CALayerExporter.m */; }; 66E864001688C2780059C9C4 /* SVGKParserDefsAndUse.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863741688C2770059C9C4 /* SVGKParserDefsAndUse.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66E864011688C2780059C9C4 /* SVGKParserDefsAndUse.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863751688C2770059C9C4 /* SVGKParserDefsAndUse.m */; }; 66E864021688C2780059C9C4 /* SVGKParserDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863761688C2770059C9C4 /* SVGKParserDOM.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -223,10 +499,518 @@ 66EEE8641688CB37002E2658 /* SVGStyleCatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66EEE8651688CB37002E2658 /* SVGStyleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85E1688CB37002E2658 /* SVGStyleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; 66EEE8661688CB37002E2658 /* SVGStyleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85F1688CB37002E2658 /* SVGStyleElement.m */; }; - 9ED79A24179D87790048AA5B /* SVGGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */; }; + 66F33DD0182FE1C4004464AC /* SVGPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66F33DD1182FE1C4004464AC /* SVGPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */; }; + 66F33DD4182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 66F33DD5182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */; }; + 825CDAB91BDA4BC0003C1C12 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAAF1BDA4BC0003C1C12 /* SVGKit.framework */; }; + 825CDAC91BDA4D09003C1C12 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639634116148CDF00E58CCA /* QuartzCore.framework */; }; + 825CDACA1BDA4D0F003C1C12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639619116145D0400E58CCA /* Foundation.framework */; }; + 825CDACB1BDA4D14003C1C12 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6639634616148DEC00E58CCA /* CoreGraphics.framework */; }; + 825CDADD1BDA4D38003C1C12 /* SVGKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAD31BDA4D38003C1C12 /* SVGKit.framework */; }; + 825CDAEE1BDA4E07003C1C12 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAED1BDA4E07003C1C12 /* QuartzCore.framework */; }; + 825CDAF01BDA4E0E003C1C12 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAEF1BDA4E0E003C1C12 /* Foundation.framework */; }; + 825CDAF21BDA4E16003C1C12 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAF11BDA4E16003C1C12 /* CoreGraphics.framework */; }; + 825CDAF71BDA5057003C1C12 /* AppleSucksDOMImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8630E1688C2770059C9C4 /* AppleSucksDOMImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAF81BDA5057003C1C12 /* Attr.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863101688C2770059C9C4 /* Attr.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAF91BDA5057003C1C12 /* CDATASection.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863121688C2770059C9C4 /* CDATASection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFA1BDA5057003C1C12 /* CharacterData.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863141688C2770059C9C4 /* CharacterData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFB1BDA5057003C1C12 /* Comment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863161688C2770059C9C4 /* Comment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFC1BDA5057003C1C12 /* CSSStyleDeclaration.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB1168A001400EC93C7 /* CSSStyleDeclaration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFD1BDA5057003C1C12 /* CSSRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB9168A027E00EC93C7 /* CSSRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFE1BDA5057003C1C12 /* CSSStyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DBD168A031100EC93C7 /* CSSStyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDAFF1BDA5057003C1C12 /* CSSStyleRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674B8168A511400486B68 /* CSSStyleRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB001BDA5057003C1C12 /* CSSRuleList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC1168A038400EC93C7 /* CSSRuleList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB011BDA5057003C1C12 /* CSSRuleList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC5168A04D000EC93C7 /* CSSRuleList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB021BDA5057003C1C12 /* CSSPrimitiveValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC9168A0A2300EC93C7 /* CSSPrimitiveValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB031BDA5057003C1C12 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD9168A2F4200EC93C7 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB041BDA5057003C1C12 /* CSSValueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DCD168A129500EC93C7 /* CSSValueList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB051BDA5057003C1C12 /* CSSValue_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD1168A13BC00EC93C7 /* CSSValue_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB061BDA5057003C1C12 /* CSSValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB5168A004D00EC93C7 /* CSSValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB071BDA5057003C1C12 /* Document+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863181688C2770059C9C4 /* Document+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB081BDA5057003C1C12 /* Document.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863191688C2770059C9C4 /* Document.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB091BDA5057003C1C12 /* DocumentCSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BD168A536C00486B68 /* DocumentCSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0A1BDA5057003C1C12 /* DocumentStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BE168A551300486B68 /* DocumentStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0B1BDA5058003C1C12 /* StyleSheetList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674CB168A58D000486B68 /* StyleSheetList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0C1BDA5058003C1C12 /* StyleSheetList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BF168A556200486B68 /* StyleSheetList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0D1BDA5058003C1C12 /* StyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C3168A55AD00486B68 /* StyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0E1BDA5058003C1C12 /* MediaList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C7168A561B00486B68 /* MediaList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB0F1BDA5058003C1C12 /* DocumentFragment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631B1688C2770059C9C4 /* DocumentFragment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB101BDA5058003C1C12 /* DocumentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631D1688C2770059C9C4 /* DocumentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB111BDA5058003C1C12 /* DOMHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631F1688C2770059C9C4 /* DOMHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB121BDA5058003C1C12 /* Element.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863211688C2770059C9C4 /* Element.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB131BDA5058003C1C12 /* EntityReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863231688C2770059C9C4 /* EntityReference.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB141BDA5058003C1C12 /* NamedNodeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863251688C2770059C9C4 /* NamedNodeMap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB151BDA5058003C1C12 /* NamedNodeMap_Iterable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB161BDA5058003C1C12 /* Node+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863271688C2770059C9C4 /* Node+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB171BDA5058003C1C12 /* Node.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863281688C2770059C9C4 /* Node.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB181BDA5058003C1C12 /* NodeList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632A1688C2770059C9C4 /* NodeList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB191BDA5058003C1C12 /* NodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632B1688C2770059C9C4 /* NodeList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1A1BDA5058003C1C12 /* ProcessingInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632D1688C2770059C9C4 /* ProcessingInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1B1BDA5058003C1C12 /* Text.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632F1688C2770059C9C4 /* Text.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1C1BDA5058003C1C12 /* DOMGlobalSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694BB7A16967407007D0947 /* DOMGlobalSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1D1BDA5058003C1C12 /* SVGAngle.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863321688C2770059C9C4 /* SVGAngle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1E1BDA5059003C1C12 /* SVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB1F1BDA5059003C1C12 /* SVGClipPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB201BDA5059003C1C12 /* SVGDefsElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863341688C2770059C9C4 /* SVGDefsElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB211BDA5059003C1C12 /* SVGDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863361688C2770059C9C4 /* SVGDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB221BDA5059003C1C12 /* SVGDocument_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863381688C2770059C9C4 /* SVGDocument_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB231BDA5059003C1C12 /* SVGElementInstance.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863391688C2770059C9C4 /* SVGElementInstance.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB241BDA5059003C1C12 /* SVGElementInstance_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633B1688C2770059C9C4 /* SVGElementInstance_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB251BDA5059003C1C12 /* SVGElementInstanceList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633C1688C2770059C9C4 /* SVGElementInstanceList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB261BDA5059003C1C12 /* SVGElementInstanceList_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633E1688C2770059C9C4 /* SVGElementInstanceList_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB271BDA5059003C1C12 /* SVGGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 6668E2061688D3CF00F774A6 /* SVGGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB281BDA5059003C1C12 /* SVGStylable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DAF1689FF5D00EC93C7 /* SVGStylable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB291BDA5059003C1C12 /* SVGLength.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633F1688C2770059C9C4 /* SVGLength.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2A1BDA5059003C1C12 /* SVGMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863411688C2770059C9C4 /* SVGMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2B1BDA505A003C1C12 /* SVGNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863431688C2770059C9C4 /* SVGNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2C1BDA505A003C1C12 /* SVGPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863441688C2770059C9C4 /* SVGPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2D1BDA505A003C1C12 /* SVGPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2E1BDA505A003C1C12 /* SVGRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863461688C2770059C9C4 /* SVGRect.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB2F1BDA505A003C1C12 /* SVGSVGElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863471688C2770059C9C4 /* SVGSVGElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB301BDA505A003C1C12 /* SVGTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863481688C2770059C9C4 /* SVGTransform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB311BDA505A003C1C12 /* SVGUseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634A1688C2770059C9C4 /* SVGUseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB321BDA505A003C1C12 /* SVGUseElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634C1688C2770059C9C4 /* SVGUseElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB331BDA505A003C1C12 /* SVGViewSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634D1688C2770059C9C4 /* SVGViewSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB341BDA505B003C1C12 /* SVGHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01216CAEF0B00CCBFB3 /* SVGHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB351BDA505B003C1C12 /* SVGTransformable.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01716CAF05900CCBFB3 /* SVGTransformable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB361BDA505B003C1C12 /* SVGFitToViewBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 66A09CB016CFF494003CD5CD /* SVGFitToViewBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB371BDA505B003C1C12 /* SVGTextPositioningElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF016CC2FBE006F4BC3 /* SVGTextPositioningElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB381BDA505B003C1C12 /* SVGTextContentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB391BDA505B003C1C12 /* SVGTextPositioningElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBFB16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3A1BDA505B003C1C12 /* SVGUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3B1BDA505B003C1C12 /* ConverterSVGToCALayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3C1BDA505C003C1C12 /* SVGGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8591688CB37002E2658 /* SVGGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3D1BDA505C003C1C12 /* SVGGradientStop.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85B1688CB37002E2658 /* SVGGradientStop.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3E1BDA505C003C1C12 /* SVGStyleCatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB3F1BDA505C003C1C12 /* SVGStyleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85E1688CB37002E2658 /* SVGStyleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB401BDA505C003C1C12 /* SVGCircleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634F1688C2770059C9C4 /* SVGCircleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB411BDA505C003C1C12 /* SVGDescriptionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863511688C2770059C9C4 /* SVGDescriptionElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB421BDA505C003C1C12 /* SVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863531688C2770059C9C4 /* SVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB431BDA505D003C1C12 /* SVGElement_ForParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863551688C2770059C9C4 /* SVGElement_ForParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB441BDA505D003C1C12 /* SVGEllipseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863561688C2770059C9C4 /* SVGEllipseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB451BDA505D003C1C12 /* SVGGroupElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863581688C2770059C9C4 /* SVGGroupElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB461BDA505D003C1C12 /* SVGImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635A1688C2770059C9C4 /* SVGImageElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB471BDA505D003C1C12 /* SVGLineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635D1688C2770059C9C4 /* SVGLineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB481BDA505D003C1C12 /* SVGPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635F1688C2770059C9C4 /* SVGPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB491BDA505E003C1C12 /* SVGPolygonElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863611688C2770059C9C4 /* SVGPolygonElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4A1BDA505E003C1C12 /* SVGPolylineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863631688C2770059C9C4 /* SVGPolylineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4B1BDA505E003C1C12 /* SVGRectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863651688C2770059C9C4 /* SVGRectElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4C1BDA505E003C1C12 /* BaseClassForAllSVGBasicShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863671688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4D1BDA505E003C1C12 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01A16CBEF5C00CCBFB3 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4E1BDA505E003C1C12 /* SVGSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863691688C2770059C9C4 /* SVGSVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB4F1BDA505F003C1C12 /* SVGSwitchElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB501BDA505F003C1C12 /* SVGTextElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636B1688C2770059C9C4 /* SVGTextElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB511BDA505F003C1C12 /* SVGTitleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB521BDA505F003C1C12 /* TinySVGTextAreaElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB541BDA5060003C1C12 /* SVGKImage+CGContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB551BDA5060003C1C12 /* SVGKExporterNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB561BDA5060003C1C12 /* SVGKExporterUIImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418C218674BF900C61EC2 /* SVGKExporterUIImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB571BDA5060003C1C12 /* SVGKSourceLocalFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB581BDA5061003C1C12 /* SVGKSourceNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB591BDA5061003C1C12 /* SVGKSourceString.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5A1BDA5061003C1C12 /* SVGKSourceURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5B1BDA5061003C1C12 /* SVGKParserDefsAndUse.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863741688C2770059C9C4 /* SVGKParserDefsAndUse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5C1BDA5062003C1C12 /* SVGKParserDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863761688C2770059C9C4 /* SVGKParserDOM.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5D1BDA5062003C1C12 /* SVGKParserGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8501688CA8A002E2658 /* SVGKParserGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5E1BDA5062003C1C12 /* SVGKParserPatternsAndGradients.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863781688C2770059C9C4 /* SVGKParserPatternsAndGradients.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB5F1BDA5062003C1C12 /* SVGKParserStyles.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8551688CA94002E2658 /* SVGKParserStyles.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB601BDA5063003C1C12 /* SVGKParserSVG.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637A1688C2770059C9C4 /* SVGKParserSVG.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB611BDA5063003C1C12 /* SVGKParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637C1688C2770059C9C4 /* SVGKParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB621BDA5063003C1C12 /* SVGKParseResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637E1688C2770059C9C4 /* SVGKParseResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB631BDA5063003C1C12 /* SVGKParserExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863801688C2770059C9C4 /* SVGKParserExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB641BDA5064003C1C12 /* SVGKPointsAndPathsParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863811688C2770059C9C4 /* SVGKPointsAndPathsParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB651BDA5064003C1C12 /* CALayer+RecursiveClone.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD88175F54680072AAEF /* CALayer+RecursiveClone.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB661BDA5064003C1C12 /* SVGGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB671BDA5064003C1C12 /* CALayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB681BDA5065003C1C12 /* CAShapeLayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB691BDA5065003C1C12 /* CALayerWithChildHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863841688C2770059C9C4 /* CALayerWithChildHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6A1BDA5065003C1C12 /* CAShapeLayerWithHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863861688C2770059C9C4 /* CAShapeLayerWithHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6B1BDA5066003C1C12 /* CGPathAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863881688C2770059C9C4 /* CGPathAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6C1BDA5066003C1C12 /* SVGKLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638A1688C2780059C9C4 /* SVGKLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6D1BDA5066003C1C12 /* SVGKImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638C1688C2780059C9C4 /* SVGKImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6E1BDA5067003C1C12 /* SVGKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638E1688C2780059C9C4 /* SVGKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB6F1BDA5067003C1C12 /* SVGKSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638F1688C2780059C9C4 /* SVGKSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB701BDA5067003C1C12 /* NSCharacterSet+SVGKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB711BDA5068003C1C12 /* SVGKFastImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863921688C2780059C9C4 /* SVGKFastImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB721BDA5068003C1C12 /* SVGKImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863941688C2780059C9C4 /* SVGKImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB731BDA5069003C1C12 /* SVGKLayeredImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863961688C2780059C9C4 /* SVGKLayeredImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB741BDA5069003C1C12 /* NSData+NSInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB751BDA5069003C1C12 /* SVGKPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639B1688C2780059C9C4 /* SVGKPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB761BDA506A003C1C12 /* SVGUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639D1688C2780059C9C4 /* SVGUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB771BDA50B3003C1C12 /* AppleSucksDOMImplementation.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8630E1688C2770059C9C4 /* AppleSucksDOMImplementation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB781BDA50B3003C1C12 /* Attr.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863101688C2770059C9C4 /* Attr.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB791BDA50B3003C1C12 /* CDATASection.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863121688C2770059C9C4 /* CDATASection.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7A1BDA50B3003C1C12 /* CharacterData.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863141688C2770059C9C4 /* CharacterData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7B1BDA50B3003C1C12 /* Comment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863161688C2770059C9C4 /* Comment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7C1BDA50B3003C1C12 /* CSSStyleDeclaration.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB1168A001400EC93C7 /* CSSStyleDeclaration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7D1BDA50B3003C1C12 /* CSSRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB9168A027E00EC93C7 /* CSSRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7E1BDA50B3003C1C12 /* CSSStyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DBD168A031100EC93C7 /* CSSStyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB7F1BDA50B3003C1C12 /* CSSStyleRule.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674B8168A511400486B68 /* CSSStyleRule.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB801BDA50B3003C1C12 /* CSSRuleList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC1168A038400EC93C7 /* CSSRuleList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB811BDA50B3003C1C12 /* CSSRuleList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC5168A04D000EC93C7 /* CSSRuleList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB821BDA50B3003C1C12 /* CSSPrimitiveValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DC9168A0A2300EC93C7 /* CSSPrimitiveValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB831BDA50B3003C1C12 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD9168A2F4200EC93C7 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB841BDA50B3003C1C12 /* CSSValueList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DCD168A129500EC93C7 /* CSSValueList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB851BDA50B3003C1C12 /* CSSValue_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DD1168A13BC00EC93C7 /* CSSValue_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB861BDA50B3003C1C12 /* CSSValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DB5168A004D00EC93C7 /* CSSValue.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB871BDA50B3003C1C12 /* Document+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863181688C2770059C9C4 /* Document+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB881BDA50B3003C1C12 /* Document.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863191688C2770059C9C4 /* Document.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB891BDA50B3003C1C12 /* DocumentCSS.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BD168A536C00486B68 /* DocumentCSS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8A1BDA50B3003C1C12 /* DocumentStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BE168A551300486B68 /* DocumentStyle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8B1BDA50B3003C1C12 /* StyleSheetList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674CB168A58D000486B68 /* StyleSheetList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8C1BDA50B3003C1C12 /* StyleSheetList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674BF168A556200486B68 /* StyleSheetList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8D1BDA50B3003C1C12 /* StyleSheet.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C3168A55AD00486B68 /* StyleSheet.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8E1BDA50B3003C1C12 /* MediaList.h in Headers */ = {isa = PBXBuildFile; fileRef = 666674C7168A561B00486B68 /* MediaList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB8F1BDA50B3003C1C12 /* DocumentFragment.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631B1688C2770059C9C4 /* DocumentFragment.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB901BDA50B3003C1C12 /* DocumentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631D1688C2770059C9C4 /* DocumentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB911BDA50B3003C1C12 /* DOMHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8631F1688C2770059C9C4 /* DOMHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB921BDA50B3003C1C12 /* Element.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863211688C2770059C9C4 /* Element.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB931BDA50B3003C1C12 /* EntityReference.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863231688C2770059C9C4 /* EntityReference.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB941BDA50B3003C1C12 /* NamedNodeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863251688C2770059C9C4 /* NamedNodeMap.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB951BDA50B3003C1C12 /* NamedNodeMap_Iterable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB961BDA50B3003C1C12 /* Node+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863271688C2770059C9C4 /* Node+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB971BDA50B4003C1C12 /* Node.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863281688C2770059C9C4 /* Node.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB981BDA50B4003C1C12 /* NodeList+Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632A1688C2770059C9C4 /* NodeList+Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB991BDA50B4003C1C12 /* NodeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632B1688C2770059C9C4 /* NodeList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9A1BDA50B4003C1C12 /* ProcessingInstruction.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632D1688C2770059C9C4 /* ProcessingInstruction.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9B1BDA50B4003C1C12 /* Text.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8632F1688C2770059C9C4 /* Text.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9C1BDA50B4003C1C12 /* DOMGlobalSettings.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694BB7A16967407007D0947 /* DOMGlobalSettings.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9D1BDA50B4003C1C12 /* SVGAngle.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863321688C2770059C9C4 /* SVGAngle.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9E1BDA50B4003C1C12 /* SVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDB9F1BDA50B4003C1C12 /* SVGClipPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA01BDA50B4003C1C12 /* SVGDefsElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863341688C2770059C9C4 /* SVGDefsElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA11BDA50B4003C1C12 /* SVGDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863361688C2770059C9C4 /* SVGDocument.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA21BDA50B4003C1C12 /* SVGDocument_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863381688C2770059C9C4 /* SVGDocument_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA31BDA50B4003C1C12 /* SVGElementInstance.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863391688C2770059C9C4 /* SVGElementInstance.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA41BDA50B4003C1C12 /* SVGElementInstance_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633B1688C2770059C9C4 /* SVGElementInstance_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA51BDA50B5003C1C12 /* SVGElementInstanceList.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633C1688C2770059C9C4 /* SVGElementInstanceList.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA61BDA50B5003C1C12 /* SVGElementInstanceList_Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633E1688C2770059C9C4 /* SVGElementInstanceList_Internal.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA71BDA50B5003C1C12 /* SVGGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 6668E2061688D3CF00F774A6 /* SVGGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA81BDA50B5003C1C12 /* SVGStylable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66988DAF1689FF5D00EC93C7 /* SVGStylable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBA91BDA50B5003C1C12 /* SVGLength.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8633F1688C2770059C9C4 /* SVGLength.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAA1BDA50B5003C1C12 /* SVGMatrix.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863411688C2770059C9C4 /* SVGMatrix.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAB1BDA50B5003C1C12 /* SVGNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863431688C2770059C9C4 /* SVGNumber.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAC1BDA50B5003C1C12 /* SVGPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863441688C2770059C9C4 /* SVGPoint.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAD1BDA50B5003C1C12 /* SVGPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAE1BDA50B5003C1C12 /* SVGRect.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863461688C2770059C9C4 /* SVGRect.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBAF1BDA50B5003C1C12 /* SVGSVGElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863471688C2770059C9C4 /* SVGSVGElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB01BDA50B6003C1C12 /* SVGTransform.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863481688C2770059C9C4 /* SVGTransform.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB11BDA50B6003C1C12 /* SVGUseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634A1688C2770059C9C4 /* SVGUseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB21BDA50B6003C1C12 /* SVGUseElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634C1688C2770059C9C4 /* SVGUseElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB31BDA50B6003C1C12 /* SVGViewSpec.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634D1688C2770059C9C4 /* SVGViewSpec.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB41BDA50B6003C1C12 /* SVGHelperUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01216CAEF0B00CCBFB3 /* SVGHelperUtilities.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB51BDA50B6003C1C12 /* SVGTransformable.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01716CAF05900CCBFB3 /* SVGTransformable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB61BDA50B6003C1C12 /* SVGFitToViewBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 66A09CB016CFF494003CD5CD /* SVGFitToViewBox.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB71BDA50B6003C1C12 /* SVGTextPositioningElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF016CC2FBE006F4BC3 /* SVGTextPositioningElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB81BDA50B7003C1C12 /* SVGTextContentElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBB91BDA50B7003C1C12 /* SVGTextPositioningElement_Mutable.h in Headers */ = {isa = PBXBuildFile; fileRef = 661ADBFB16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBA1BDA50B7003C1C12 /* SVGUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBB1BDA50B7003C1C12 /* ConverterSVGToCALayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBC1BDA50B7003C1C12 /* SVGGradientElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8591688CB37002E2658 /* SVGGradientElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBD1BDA50B7003C1C12 /* SVGGradientStop.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85B1688CB37002E2658 /* SVGGradientStop.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBE1BDA50B7003C1C12 /* SVGStyleCatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBBF1BDA50B7003C1C12 /* SVGStyleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE85E1688CB37002E2658 /* SVGStyleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC01BDA50B8003C1C12 /* SVGCircleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8634F1688C2770059C9C4 /* SVGCircleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC11BDA50B8003C1C12 /* SVGDescriptionElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863511688C2770059C9C4 /* SVGDescriptionElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC21BDA50B8003C1C12 /* SVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863531688C2770059C9C4 /* SVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC31BDA50B8003C1C12 /* SVGElement_ForParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863551688C2770059C9C4 /* SVGElement_ForParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC41BDA50B8003C1C12 /* SVGEllipseElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863561688C2770059C9C4 /* SVGEllipseElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC51BDA50B8003C1C12 /* SVGGroupElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863581688C2770059C9C4 /* SVGGroupElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC61BDA50B9003C1C12 /* SVGImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635A1688C2770059C9C4 /* SVGImageElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC71BDA50B9003C1C12 /* SVGLineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635D1688C2770059C9C4 /* SVGLineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC81BDA50B9003C1C12 /* SVGPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8635F1688C2770059C9C4 /* SVGPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBC91BDA50B9003C1C12 /* SVGPolygonElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863611688C2770059C9C4 /* SVGPolygonElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCA1BDA50B9003C1C12 /* SVGPolylineElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863631688C2770059C9C4 /* SVGPolylineElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCB1BDA50B9003C1C12 /* SVGRectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863651688C2770059C9C4 /* SVGRectElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCC1BDA50BA003C1C12 /* BaseClassForAllSVGBasicShapes.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863671688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCD1BDA50BA003C1C12 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */ = {isa = PBXBuildFile; fileRef = 663FD01A16CBEF5C00CCBFB3 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCE1BDA50BA003C1C12 /* SVGSVGElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863691688C2770059C9C4 /* SVGSVGElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBCF1BDA50BA003C1C12 /* SVGSwitchElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD01BDA50BA003C1C12 /* SVGTextElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636B1688C2770059C9C4 /* SVGTextElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD11BDA50BB003C1C12 /* SVGTitleElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD21BDA50BB003C1C12 /* TinySVGTextAreaElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD41BDA50BB003C1C12 /* SVGKImage+CGContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD51BDA50BB003C1C12 /* SVGKExporterNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD61BDA50BC003C1C12 /* SVGKExporterUIImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 668418C218674BF900C61EC2 /* SVGKExporterUIImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD71BDA50BC003C1C12 /* SVGKSourceLocalFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD81BDA50BC003C1C12 /* SVGKSourceNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBD91BDA50BC003C1C12 /* SVGKSourceString.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDA1BDA50BD003C1C12 /* SVGKSourceURL.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDB1BDA50BD003C1C12 /* SVGKParserDefsAndUse.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863741688C2770059C9C4 /* SVGKParserDefsAndUse.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDC1BDA50BD003C1C12 /* SVGKParserDOM.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863761688C2770059C9C4 /* SVGKParserDOM.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDD1BDA50BD003C1C12 /* SVGKParserGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8501688CA8A002E2658 /* SVGKParserGradient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDE1BDA50BE003C1C12 /* SVGKParserPatternsAndGradients.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863781688C2770059C9C4 /* SVGKParserPatternsAndGradients.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBDF1BDA50BE003C1C12 /* SVGKParserStyles.h in Headers */ = {isa = PBXBuildFile; fileRef = 66EEE8551688CA94002E2658 /* SVGKParserStyles.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE01BDA50BE003C1C12 /* SVGKParserSVG.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637A1688C2770059C9C4 /* SVGKParserSVG.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE11BDA50BE003C1C12 /* SVGKParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637C1688C2770059C9C4 /* SVGKParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE21BDA50BF003C1C12 /* SVGKParseResult.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8637E1688C2770059C9C4 /* SVGKParseResult.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE31BDA50BF003C1C12 /* SVGKParserExtension.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863801688C2770059C9C4 /* SVGKParserExtension.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE41BDA50BF003C1C12 /* SVGKPointsAndPathsParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863811688C2770059C9C4 /* SVGKPointsAndPathsParser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE51BDA50BF003C1C12 /* CALayer+RecursiveClone.h in Headers */ = {isa = PBXBuildFile; fileRef = 6636CD88175F54680072AAEF /* CALayer+RecursiveClone.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE61BDA50C0003C1C12 /* SVGGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE71BDA50C0003C1C12 /* CALayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE81BDA50C0003C1C12 /* CAShapeLayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBE91BDA50C1003C1C12 /* CALayerWithChildHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863841688C2770059C9C4 /* CALayerWithChildHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBEA1BDA50C1003C1C12 /* CAShapeLayerWithHitTest.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863861688C2770059C9C4 /* CAShapeLayerWithHitTest.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBEB1BDA50C1003C1C12 /* CGPathAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863881688C2770059C9C4 /* CGPathAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBEC1BDA50C1003C1C12 /* SVGKLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638A1688C2780059C9C4 /* SVGKLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBED1BDA50C2003C1C12 /* SVGKImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638C1688C2780059C9C4 /* SVGKImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBEE1BDA50C2003C1C12 /* SVGKit.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638E1688C2780059C9C4 /* SVGKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBEF1BDA50C2003C1C12 /* SVGKSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8638F1688C2780059C9C4 /* SVGKSource.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF01BDA50C3003C1C12 /* NSCharacterSet+SVGKExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF11BDA50C3003C1C12 /* SVGKFastImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863921688C2780059C9C4 /* SVGKFastImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF21BDA50C4003C1C12 /* SVGKImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863941688C2780059C9C4 /* SVGKImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF31BDA50C4003C1C12 /* SVGKLayeredImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E863961688C2780059C9C4 /* SVGKLayeredImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF41BDA50C4003C1C12 /* NSData+NSInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF51BDA50C5003C1C12 /* SVGKPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639B1688C2780059C9C4 /* SVGKPattern.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF61BDA50C5003C1C12 /* SVGUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 66E8639D1688C2780059C9C4 /* SVGUtils.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 825CDBF71BDA511C003C1C12 /* AppleSucksDOMImplementation.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8630F1688C2770059C9C4 /* AppleSucksDOMImplementation.m */; }; + 825CDBF81BDA511C003C1C12 /* Attr.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863111688C2770059C9C4 /* Attr.m */; }; + 825CDBF91BDA511C003C1C12 /* CDATASection.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863131688C2770059C9C4 /* CDATASection.m */; }; + 825CDBFA1BDA511C003C1C12 /* CharacterData.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863151688C2770059C9C4 /* CharacterData.m */; }; + 825CDBFB1BDA511C003C1C12 /* Comment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863171688C2770059C9C4 /* Comment.m */; }; + 825CDBFC1BDA511C003C1C12 /* CSSStyleDeclaration.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */; }; + 825CDBFD1BDA511C003C1C12 /* CSSRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBA168A027E00EC93C7 /* CSSRule.m */; }; + 825CDBFE1BDA511C003C1C12 /* CSSStyleRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674B9168A511400486B68 /* CSSStyleRule.m */; }; + 825CDBFF1BDA511C003C1C12 /* CSSStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBE168A031100EC93C7 /* CSSStyleSheet.m */; }; + 825CDC001BDA511C003C1C12 /* CSSRuleList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DC2168A038400EC93C7 /* CSSRuleList.m */; }; + 825CDC011BDA511C003C1C12 /* CSSPrimitiveValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCA168A0A2300EC93C7 /* CSSPrimitiveValue.m */; }; + 825CDC021BDA511C003C1C12 /* CSSValueList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCE168A129500EC93C7 /* CSSValueList.m */; }; + 825CDC031BDA511C003C1C12 /* CSSValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB6168A004D00EC93C7 /* CSSValue.m */; }; + 825CDC041BDA511C003C1C12 /* Document.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631A1688C2770059C9C4 /* Document.m */; }; + 825CDC051BDA511C003C1C12 /* StyleSheetList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C0168A556300486B68 /* StyleSheetList.m */; }; + 825CDC061BDA511C003C1C12 /* StyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C4168A55AE00486B68 /* StyleSheet.m */; }; + 825CDC071BDA511C003C1C12 /* MediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C8168A561B00486B68 /* MediaList.m */; }; + 825CDC081BDA511C003C1C12 /* DocumentFragment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631C1688C2770059C9C4 /* DocumentFragment.m */; }; + 825CDC091BDA511C003C1C12 /* DocumentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631E1688C2770059C9C4 /* DocumentType.m */; }; + 825CDC0A1BDA511C003C1C12 /* DOMHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863201688C2770059C9C4 /* DOMHelperUtilities.m */; }; + 825CDC0B1BDA511C003C1C12 /* Element.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863221688C2770059C9C4 /* Element.m */; }; + 825CDC0C1BDA511C003C1C12 /* EntityReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863241688C2770059C9C4 /* EntityReference.m */; }; + 825CDC0D1BDA511C003C1C12 /* NamedNodeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863261688C2770059C9C4 /* NamedNodeMap.m */; }; + 825CDC0E1BDA511C003C1C12 /* Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863291688C2770059C9C4 /* Node.m */; }; + 825CDC0F1BDA511C003C1C12 /* NodeList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632C1688C2770059C9C4 /* NodeList.m */; }; + 825CDC101BDA511C003C1C12 /* ProcessingInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632E1688C2770059C9C4 /* ProcessingInstruction.m */; }; + 825CDC111BDA511C003C1C12 /* Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863301688C2770059C9C4 /* Text.m */; }; + 825CDC121BDA511C003C1C12 /* SVGAngle.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863331688C2770059C9C4 /* SVGAngle.m */; }; + 825CDC131BDA511C003C1C12 /* SVGAnimatedPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */; }; + 825CDC141BDA511C003C1C12 /* SVGClipPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */; }; + 825CDC151BDA511C003C1C12 /* SVGDefsElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863351688C2770059C9C4 /* SVGDefsElement.m */; }; + 825CDC161BDA511C003C1C12 /* SVGDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863371688C2770059C9C4 /* SVGDocument.m */; }; + 825CDC171BDA511C003C1C12 /* SVGElementInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633A1688C2770059C9C4 /* SVGElementInstance.m */; }; + 825CDC181BDA511C003C1C12 /* SVGElementInstanceList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633D1688C2770059C9C4 /* SVGElementInstanceList.m */; }; + 825CDC191BDA511C003C1C12 /* SVGGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6668E2071688D3CF00F774A6 /* SVGGElement.m */; }; + 825CDC1A1BDA511C003C1C12 /* SVGLength.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863401688C2770059C9C4 /* SVGLength.m */; }; + 825CDC1B1BDA511C003C1C12 /* SVGMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863421688C2770059C9C4 /* SVGMatrix.m */; }; + 825CDC1C1BDA511C003C1C12 /* SVGPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863451688C2770059C9C4 /* SVGPoint.m */; }; + 825CDC1D1BDA511C003C1C12 /* SVGPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */; }; + 825CDC1E1BDA511C003C1C12 /* SVGRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 66372F5916960D4E008C6C56 /* SVGRect.m */; }; + 825CDC1F1BDA511C003C1C12 /* SVGTransform.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863491688C2770059C9C4 /* SVGTransform.m */; }; + 825CDC201BDA511C003C1C12 /* SVGUseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8634B1688C2770059C9C4 /* SVGUseElement.m */; }; + 825CDC211BDA511C003C1C12 /* SVGHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 663FD01316CAEF0C00CCBFB3 /* SVGHelperUtilities.m */; }; + 825CDC221BDA511C003C1C12 /* SVGTextPositioningElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF116CC2FBE006F4BC3 /* SVGTextPositioningElement.m */; }; + 825CDC231BDA511C003C1C12 /* SVGTextContentElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF616CC2FCA006F4BC3 /* SVGTextContentElement.m */; }; + 825CDC241BDA511C003C1C12 /* SVGGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */; }; + 825CDC251BDA511C003C1C12 /* SVGGradientStop.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85C1688CB37002E2658 /* SVGGradientStop.m */; }; + 825CDC261BDA511C003C1C12 /* SVGStyleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85F1688CB37002E2658 /* SVGStyleElement.m */; }; + 825CDC271BDA511C003C1C12 /* SVGCircleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863501688C2770059C9C4 /* SVGCircleElement.m */; }; + 825CDC281BDA511C003C1C12 /* SVGDescriptionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863521688C2770059C9C4 /* SVGDescriptionElement.m */; }; + 825CDC291BDA511C003C1C12 /* SVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863541688C2770059C9C4 /* SVGElement.m */; }; + 825CDC2A1BDA511C003C1C12 /* SVGEllipseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863571688C2770059C9C4 /* SVGEllipseElement.m */; }; + 825CDC2B1BDA511C003C1C12 /* SVGGroupElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863591688C2770059C9C4 /* SVGGroupElement.m */; }; + 825CDC2C1BDA511C003C1C12 /* SVGImageElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635B1688C2770059C9C4 /* SVGImageElement.m */; }; + 825CDC2D1BDA511C003C1C12 /* SVGLineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635E1688C2770059C9C4 /* SVGLineElement.m */; }; + 825CDC2E1BDA511C003C1C12 /* SVGPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863601688C2770059C9C4 /* SVGPathElement.m */; }; + 825CDC2F1BDA511C003C1C12 /* SVGPolygonElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863621688C2770059C9C4 /* SVGPolygonElement.m */; }; + 825CDC301BDA511C003C1C12 /* SVGPolylineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863641688C2770059C9C4 /* SVGPolylineElement.m */; }; + 825CDC311BDA511C003C1C12 /* SVGRectElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863661688C2770059C9C4 /* SVGRectElement.m */; }; + 825CDC321BDA511C003C1C12 /* BaseClassForAllSVGBasicShapes.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863681688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.m */; }; + 825CDC331BDA511C003C1C12 /* SVGSVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636A1688C2770059C9C4 /* SVGSVGElement.m */; }; + 825CDC341BDA511C003C1C12 /* SVGSwitchElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */; }; + 825CDC351BDA511C003C1C12 /* SVGTextElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636C1688C2770059C9C4 /* SVGTextElement.m */; }; + 825CDC361BDA511C003C1C12 /* SVGTitleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */; }; + 825CDC371BDA511C003C1C12 /* TinySVGTextAreaElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */; }; + 825CDC391BDA511C003C1C12 /* SVGKImage+CGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */; }; + 825CDC3A1BDA511C003C1C12 /* SVGKExporterNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */; }; + 825CDC3B1BDA511C003C1C12 /* SVGKExporterUIImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418C318674BF900C61EC2 /* SVGKExporterUIImage.m */; }; + 825CDC3C1BDA511C003C1C12 /* SVGKSourceLocalFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD79175F542A0072AAEF /* SVGKSourceLocalFile.m */; }; + 825CDC3D1BDA511C003C1C12 /* SVGKSourceNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */; }; + 825CDC3E1BDA511C003C1C12 /* SVGKSourceString.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7B175F542A0072AAEF /* SVGKSourceString.m */; }; + 825CDC3F1BDA511C003C1C12 /* SVGKSourceURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7D175F542A0072AAEF /* SVGKSourceURL.m */; }; + 825CDC401BDA511C003C1C12 /* SVGKParserDefsAndUse.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863751688C2770059C9C4 /* SVGKParserDefsAndUse.m */; }; + 825CDC411BDA511C003C1C12 /* SVGKParserDOM.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863771688C2770059C9C4 /* SVGKParserDOM.m */; }; + 825CDC421BDA511C003C1C12 /* SVGKParserGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8511688CA8A002E2658 /* SVGKParserGradient.m */; }; + 825CDC431BDA511C003C1C12 /* SVGKParserPatternsAndGradients.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863791688C2770059C9C4 /* SVGKParserPatternsAndGradients.m */; }; + 825CDC441BDA511C003C1C12 /* SVGKParserStyles.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8561688CA94002E2658 /* SVGKParserStyles.m */; }; + 825CDC451BDA511C003C1C12 /* SVGKParserSVG.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637B1688C2770059C9C4 /* SVGKParserSVG.m */; }; + 825CDC461BDA511C003C1C12 /* SVGKParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637D1688C2770059C9C4 /* SVGKParser.m */; }; + 825CDC471BDA511C003C1C12 /* SVGKParseResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637F1688C2770059C9C4 /* SVGKParseResult.m */; }; + 825CDC481BDA511C003C1C12 /* SVGKPointsAndPathsParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863821688C2770059C9C4 /* SVGKPointsAndPathsParser.m */; }; + 825CDC491BDA511C003C1C12 /* CALayer+RecursiveClone.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */; }; + 825CDC4A1BDA511C003C1C12 /* SVGGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */; }; + 825CDC4B1BDA511C003C1C12 /* CALayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */; }; + 825CDC4C1BDA511C003C1C12 /* CAShapeLayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */; }; + 825CDC4D1BDA511C003C1C12 /* CALayerWithChildHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863851688C2770059C9C4 /* CALayerWithChildHitTest.m */; }; + 825CDC4E1BDA511C003C1C12 /* CAShapeLayerWithHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863871688C2770059C9C4 /* CAShapeLayerWithHitTest.m */; }; + 825CDC4F1BDA511C003C1C12 /* CGPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863891688C2770059C9C4 /* CGPathAdditions.m */; }; + 825CDC501BDA511C003C1C12 /* SVGKLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638B1688C2780059C9C4 /* SVGKLayer.m */; }; + 825CDC511BDA511C003C1C12 /* SVGKImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638D1688C2780059C9C4 /* SVGKImage.m */; }; + 825CDC521BDA511C003C1C12 /* SVGKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D7317415AA000F0FA0A /* SVGKit.m */; }; + 825CDC531BDA511C003C1C12 /* SVGKSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863901688C2780059C9C4 /* SVGKSource.m */; }; + 825CDC541BDA511C003C1C12 /* NSCharacterSet+SVGKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */; }; + 825CDC551BDA511C003C1C12 /* SVGKFastImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863931688C2780059C9C4 /* SVGKFastImageView.m */; }; + 825CDC561BDA511C003C1C12 /* SVGKImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863951688C2780059C9C4 /* SVGKImageView.m */; }; + 825CDC571BDA511C003C1C12 /* SVGKLayeredImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863971688C2780059C9C4 /* SVGKLayeredImageView.m */; }; + 825CDC581BDA511C003C1C12 /* NSData+NSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */; }; + 825CDC591BDA511C003C1C12 /* SVGKPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639C1688C2780059C9C4 /* SVGKPattern.m */; }; + 825CDC5A1BDA511C003C1C12 /* SVGUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639E1688C2780059C9C4 /* SVGUtils.m */; }; + 825CDC5B1BDA5144003C1C12 /* AppleSucksDOMImplementation.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8630F1688C2770059C9C4 /* AppleSucksDOMImplementation.m */; }; + 825CDC5C1BDA5144003C1C12 /* Attr.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863111688C2770059C9C4 /* Attr.m */; }; + 825CDC5D1BDA5144003C1C12 /* CDATASection.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863131688C2770059C9C4 /* CDATASection.m */; }; + 825CDC5E1BDA5144003C1C12 /* CharacterData.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863151688C2770059C9C4 /* CharacterData.m */; }; + 825CDC5F1BDA5144003C1C12 /* Comment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863171688C2770059C9C4 /* Comment.m */; }; + 825CDC601BDA5144003C1C12 /* CSSStyleDeclaration.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */; }; + 825CDC611BDA5144003C1C12 /* CSSRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBA168A027E00EC93C7 /* CSSRule.m */; }; + 825CDC621BDA5144003C1C12 /* CSSStyleRule.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674B9168A511400486B68 /* CSSStyleRule.m */; }; + 825CDC631BDA5144003C1C12 /* CSSStyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DBE168A031100EC93C7 /* CSSStyleSheet.m */; }; + 825CDC641BDA5144003C1C12 /* CSSRuleList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DC2168A038400EC93C7 /* CSSRuleList.m */; }; + 825CDC651BDA5144003C1C12 /* CSSPrimitiveValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCA168A0A2300EC93C7 /* CSSPrimitiveValue.m */; }; + 825CDC661BDA5144003C1C12 /* CSSValueList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DCE168A129500EC93C7 /* CSSValueList.m */; }; + 825CDC671BDA5144003C1C12 /* CSSValue.m in Sources */ = {isa = PBXBuildFile; fileRef = 66988DB6168A004D00EC93C7 /* CSSValue.m */; }; + 825CDC681BDA5144003C1C12 /* Document.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631A1688C2770059C9C4 /* Document.m */; }; + 825CDC691BDA5144003C1C12 /* StyleSheetList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C0168A556300486B68 /* StyleSheetList.m */; }; + 825CDC6A1BDA5144003C1C12 /* StyleSheet.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C4168A55AE00486B68 /* StyleSheet.m */; }; + 825CDC6B1BDA5144003C1C12 /* MediaList.m in Sources */ = {isa = PBXBuildFile; fileRef = 666674C8168A561B00486B68 /* MediaList.m */; }; + 825CDC6C1BDA5144003C1C12 /* DocumentFragment.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631C1688C2770059C9C4 /* DocumentFragment.m */; }; + 825CDC6D1BDA5144003C1C12 /* DocumentType.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8631E1688C2770059C9C4 /* DocumentType.m */; }; + 825CDC6E1BDA5144003C1C12 /* DOMHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863201688C2770059C9C4 /* DOMHelperUtilities.m */; }; + 825CDC6F1BDA5144003C1C12 /* Element.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863221688C2770059C9C4 /* Element.m */; }; + 825CDC701BDA5144003C1C12 /* EntityReference.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863241688C2770059C9C4 /* EntityReference.m */; }; + 825CDC711BDA5144003C1C12 /* NamedNodeMap.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863261688C2770059C9C4 /* NamedNodeMap.m */; }; + 825CDC721BDA5144003C1C12 /* Node.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863291688C2770059C9C4 /* Node.m */; }; + 825CDC731BDA5144003C1C12 /* NodeList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632C1688C2770059C9C4 /* NodeList.m */; }; + 825CDC741BDA5144003C1C12 /* ProcessingInstruction.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8632E1688C2770059C9C4 /* ProcessingInstruction.m */; }; + 825CDC751BDA5144003C1C12 /* Text.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863301688C2770059C9C4 /* Text.m */; }; + 825CDC761BDA5144003C1C12 /* SVGAngle.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863331688C2770059C9C4 /* SVGAngle.m */; }; + 825CDC771BDA5144003C1C12 /* SVGAnimatedPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */; }; + 825CDC781BDA5144003C1C12 /* SVGClipPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */; }; + 825CDC791BDA5144003C1C12 /* SVGDefsElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863351688C2770059C9C4 /* SVGDefsElement.m */; }; + 825CDC7A1BDA5144003C1C12 /* SVGDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863371688C2770059C9C4 /* SVGDocument.m */; }; + 825CDC7B1BDA5144003C1C12 /* SVGElementInstance.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633A1688C2770059C9C4 /* SVGElementInstance.m */; }; + 825CDC7C1BDA5144003C1C12 /* SVGElementInstanceList.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8633D1688C2770059C9C4 /* SVGElementInstanceList.m */; }; + 825CDC7D1BDA5144003C1C12 /* SVGGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 6668E2071688D3CF00F774A6 /* SVGGElement.m */; }; + 825CDC7E1BDA5144003C1C12 /* SVGLength.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863401688C2770059C9C4 /* SVGLength.m */; }; + 825CDC7F1BDA5144003C1C12 /* SVGMatrix.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863421688C2770059C9C4 /* SVGMatrix.m */; }; + 825CDC801BDA5144003C1C12 /* SVGPoint.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863451688C2770059C9C4 /* SVGPoint.m */; }; + 825CDC811BDA5144003C1C12 /* SVGPreserveAspectRatio.m in Sources */ = {isa = PBXBuildFile; fileRef = 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */; }; + 825CDC821BDA5144003C1C12 /* SVGRect.m in Sources */ = {isa = PBXBuildFile; fileRef = 66372F5916960D4E008C6C56 /* SVGRect.m */; }; + 825CDC831BDA5144003C1C12 /* SVGTransform.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863491688C2770059C9C4 /* SVGTransform.m */; }; + 825CDC841BDA5144003C1C12 /* SVGUseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8634B1688C2770059C9C4 /* SVGUseElement.m */; }; + 825CDC851BDA5144003C1C12 /* SVGHelperUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 663FD01316CAEF0C00CCBFB3 /* SVGHelperUtilities.m */; }; + 825CDC861BDA5144003C1C12 /* SVGTextPositioningElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF116CC2FBE006F4BC3 /* SVGTextPositioningElement.m */; }; + 825CDC871BDA5144003C1C12 /* SVGTextContentElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 661ADBF616CC2FCA006F4BC3 /* SVGTextContentElement.m */; }; + 825CDC881BDA5144003C1C12 /* SVGGradientElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */; }; + 825CDC891BDA5144003C1C12 /* SVGGradientStop.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85C1688CB37002E2658 /* SVGGradientStop.m */; }; + 825CDC8A1BDA5144003C1C12 /* SVGStyleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE85F1688CB37002E2658 /* SVGStyleElement.m */; }; + 825CDC8B1BDA5144003C1C12 /* SVGCircleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863501688C2770059C9C4 /* SVGCircleElement.m */; }; + 825CDC8C1BDA5144003C1C12 /* SVGDescriptionElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863521688C2770059C9C4 /* SVGDescriptionElement.m */; }; + 825CDC8D1BDA5144003C1C12 /* SVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863541688C2770059C9C4 /* SVGElement.m */; }; + 825CDC8E1BDA5144003C1C12 /* SVGEllipseElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863571688C2770059C9C4 /* SVGEllipseElement.m */; }; + 825CDC8F1BDA5144003C1C12 /* SVGGroupElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863591688C2770059C9C4 /* SVGGroupElement.m */; }; + 825CDC901BDA5144003C1C12 /* SVGImageElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635B1688C2770059C9C4 /* SVGImageElement.m */; }; + 825CDC911BDA5144003C1C12 /* SVGLineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8635E1688C2770059C9C4 /* SVGLineElement.m */; }; + 825CDC921BDA5144003C1C12 /* SVGPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863601688C2770059C9C4 /* SVGPathElement.m */; }; + 825CDC931BDA5144003C1C12 /* SVGPolygonElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863621688C2770059C9C4 /* SVGPolygonElement.m */; }; + 825CDC941BDA5144003C1C12 /* SVGPolylineElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863641688C2770059C9C4 /* SVGPolylineElement.m */; }; + 825CDC951BDA5144003C1C12 /* SVGRectElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863661688C2770059C9C4 /* SVGRectElement.m */; }; + 825CDC961BDA5144003C1C12 /* BaseClassForAllSVGBasicShapes.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863681688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.m */; }; + 825CDC971BDA5144003C1C12 /* SVGSVGElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636A1688C2770059C9C4 /* SVGSVGElement.m */; }; + 825CDC981BDA5144003C1C12 /* SVGSwitchElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */; }; + 825CDC991BDA5144003C1C12 /* SVGTextElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636C1688C2770059C9C4 /* SVGTextElement.m */; }; + 825CDC9A1BDA5144003C1C12 /* SVGTitleElement.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */; }; + 825CDC9B1BDA5144003C1C12 /* TinySVGTextAreaElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */; }; + 825CDC9D1BDA5144003C1C12 /* SVGKImage+CGContext.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */; }; + 825CDC9E1BDA5144003C1C12 /* SVGKExporterNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */; }; + 825CDC9F1BDA5144003C1C12 /* SVGKExporterUIImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 668418C318674BF900C61EC2 /* SVGKExporterUIImage.m */; }; + 825CDCA01BDA5144003C1C12 /* SVGKSourceLocalFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD79175F542A0072AAEF /* SVGKSourceLocalFile.m */; }; + 825CDCA11BDA5144003C1C12 /* SVGKSourceNSData.m in Sources */ = {isa = PBXBuildFile; fileRef = 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */; }; + 825CDCA21BDA5144003C1C12 /* SVGKSourceString.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7B175F542A0072AAEF /* SVGKSourceString.m */; }; + 825CDCA31BDA5144003C1C12 /* SVGKSourceURL.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD7D175F542A0072AAEF /* SVGKSourceURL.m */; }; + 825CDCA41BDA5144003C1C12 /* SVGKParserDefsAndUse.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863751688C2770059C9C4 /* SVGKParserDefsAndUse.m */; }; + 825CDCA51BDA5144003C1C12 /* SVGKParserDOM.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863771688C2770059C9C4 /* SVGKParserDOM.m */; }; + 825CDCA61BDA5144003C1C12 /* SVGKParserGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8511688CA8A002E2658 /* SVGKParserGradient.m */; }; + 825CDCA71BDA5144003C1C12 /* SVGKParserPatternsAndGradients.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863791688C2770059C9C4 /* SVGKParserPatternsAndGradients.m */; }; + 825CDCA81BDA5144003C1C12 /* SVGKParserStyles.m in Sources */ = {isa = PBXBuildFile; fileRef = 66EEE8561688CA94002E2658 /* SVGKParserStyles.m */; }; + 825CDCA91BDA5144003C1C12 /* SVGKParserSVG.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637B1688C2770059C9C4 /* SVGKParserSVG.m */; }; + 825CDCAA1BDA5144003C1C12 /* SVGKParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637D1688C2770059C9C4 /* SVGKParser.m */; }; + 825CDCAB1BDA5144003C1C12 /* SVGKParseResult.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8637F1688C2770059C9C4 /* SVGKParseResult.m */; }; + 825CDCAC1BDA5144003C1C12 /* SVGKPointsAndPathsParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863821688C2770059C9C4 /* SVGKPointsAndPathsParser.m */; }; + 825CDCAD1BDA5144003C1C12 /* CALayer+RecursiveClone.m in Sources */ = {isa = PBXBuildFile; fileRef = 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */; }; + 825CDCAE1BDA5144003C1C12 /* SVGGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */; }; + 825CDCAF1BDA5144003C1C12 /* CALayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */; }; + 825CDCB01BDA5144003C1C12 /* CAShapeLayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */; }; + 825CDCB11BDA5144003C1C12 /* CALayerWithChildHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863851688C2770059C9C4 /* CALayerWithChildHitTest.m */; }; + 825CDCB21BDA5144003C1C12 /* CAShapeLayerWithHitTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863871688C2770059C9C4 /* CAShapeLayerWithHitTest.m */; }; + 825CDCB31BDA5144003C1C12 /* CGPathAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863891688C2770059C9C4 /* CGPathAdditions.m */; }; + 825CDCB41BDA5144003C1C12 /* SVGKLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638B1688C2780059C9C4 /* SVGKLayer.m */; }; + 825CDCB51BDA5144003C1C12 /* SVGKImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8638D1688C2780059C9C4 /* SVGKImage.m */; }; + 825CDCB61BDA5144003C1C12 /* SVGKit.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E86D7317415AA000F0FA0A /* SVGKit.m */; }; + 825CDCB71BDA5144003C1C12 /* SVGKSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863901688C2780059C9C4 /* SVGKSource.m */; }; + 825CDCB81BDA5144003C1C12 /* NSCharacterSet+SVGKExtensions.m in Sources */ = {isa = PBXBuildFile; fileRef = 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */; }; + 825CDCB91BDA5144003C1C12 /* SVGKFastImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863931688C2780059C9C4 /* SVGKFastImageView.m */; }; + 825CDCBA1BDA5144003C1C12 /* SVGKImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863951688C2780059C9C4 /* SVGKImageView.m */; }; + 825CDCBB1BDA5144003C1C12 /* SVGKLayeredImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E863971688C2780059C9C4 /* SVGKLayeredImageView.m */; }; + 825CDCBC1BDA5144003C1C12 /* NSData+NSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */; }; + 825CDCBD1BDA5144003C1C12 /* SVGKPattern.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639C1688C2780059C9C4 /* SVGKPattern.m */; }; + 825CDCBE1BDA5144003C1C12 /* SVGUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 66E8639E1688C2780059C9C4 /* SVGUtils.m */; }; + 825CDCC51BDA5314003C1C12 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDACC1BDA4D20003C1C12 /* libxml2.tbd */; }; + 825CDCC61BDA531A003C1C12 /* libxml2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 825CDAF31BDA4E1F003C1C12 /* libxml2.tbd */; }; + 9ED79A24179D87790048AA5B /* SVGGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9ED79A25179D87790048AA5B /* SVGGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */; }; + BD0AFF8C19AE442F0001578E /* SVGUnitTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD1585731996B13F00461AA5 /* NSData+NSInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD1585751996B17C00461AA5 /* NSData+NSInputStream.m in Sources */ = {isa = PBXBuildFile; fileRef = BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */; }; + BD2F8C51199D0897008AE06D /* SVGClipPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD2F8C52199D0897008AE06D /* SVGClipPathElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */; }; + BD2F8C55199D14D6008AE06D /* CALayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD2F8C56199D14D6008AE06D /* CALayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */; }; + BD4C56DC199D55CC00AF04AD /* CAShapeLayerWithClipRender.h in Headers */ = {isa = PBXBuildFile; fileRef = BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BD4C56DD199D55CC00AF04AD /* CAShapeLayerWithClipRender.m in Sources */ = {isa = PBXBuildFile; fileRef = BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */; }; + BDA133B719AD0E81003C9945 /* TinySVGTextAreaElement.h in Headers */ = {isa = PBXBuildFile; fileRef = BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */; settings = {ATTRIBUTES = (Public, ); }; }; + BDA133B819AD0E81003C9945 /* TinySVGTextAreaElement.m in Sources */ = {isa = PBXBuildFile; fileRef = BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + 32A1F0A221746F4700ABFCE1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6639618516145D0400E58CCA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 321EAA612171EC8700640504; + remoteInfo = "SVGKitFramework-OSX"; + }; + 55452BF819EC68A200B75A30 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6639618516145D0400E58CCA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 6639618D16145D0400E58CCA; + remoteInfo = "SVGKit-iOS"; + }; + 825CDABA1BDA4BC0003C1C12 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6639618516145D0400E58CCA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 825CDAAE1BDA4BC0003C1C12; + remoteInfo = "SVGKitFramework-iOS"; + }; + 825CDADE1BDA4D38003C1C12 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 6639618516145D0400E58CCA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 825CDAD21BDA4D38003C1C12; + remoteInfo = "SVGKitFramework-tvOS"; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXCopyFilesBuildPhase section */ 6639618C16145D0400E58CCA /* CopyFiles */ = { isa = PBXCopyFilesBuildPhase; @@ -240,24 +1024,35 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 00E86D531741586600F0FA0A /* DDAbstractDatabaseLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDAbstractDatabaseLogger.h; sourceTree = ""; }; - 00E86D541741586600F0FA0A /* DDAbstractDatabaseLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDAbstractDatabaseLogger.m; sourceTree = ""; }; - 00E86D551741586600F0FA0A /* DDASLLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDASLLogger.h; sourceTree = ""; }; - 00E86D561741586600F0FA0A /* DDASLLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDASLLogger.m; sourceTree = ""; }; - 00E86D571741586600F0FA0A /* DDFileLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDFileLogger.h; sourceTree = ""; }; - 00E86D581741586600F0FA0A /* DDFileLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDFileLogger.m; sourceTree = ""; }; - 00E86D591741586600F0FA0A /* DDLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDLog.h; sourceTree = ""; }; - 00E86D5A1741586600F0FA0A /* DDLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDLog.m; sourceTree = ""; }; - 00E86D5B1741586600F0FA0A /* DDTTYLogger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DDTTYLogger.h; sourceTree = ""; }; - 00E86D5C1741586600F0FA0A /* DDTTYLogger.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DDTTYLogger.m; sourceTree = ""; }; - 00E86D5E1741586600F0FA0A /* ContextFilterLogFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ContextFilterLogFormatter.h; sourceTree = ""; }; - 00E86D5F1741586600F0FA0A /* ContextFilterLogFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ContextFilterLogFormatter.m; sourceTree = ""; }; - 00E86D601741586600F0FA0A /* DispatchQueueLogFormatter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DispatchQueueLogFormatter.h; sourceTree = ""; }; - 00E86D611741586600F0FA0A /* DispatchQueueLogFormatter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DispatchQueueLogFormatter.m; sourceTree = ""; }; - 00E86D621741586600F0FA0A /* README.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README.txt; sourceTree = ""; }; 00E86D7317415AA000F0FA0A /* SVGKit.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKit.m; sourceTree = ""; }; 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSCharacterSet+SVGKExtensions.h"; sourceTree = ""; }; - 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSCharacterSet+SVGKExtensions.m"; sourceTree = ""; }; + 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "NSCharacterSet+SVGKExtensions.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 321EAA3B2171E2C800640504 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SVGKit-Prefix.pch"; sourceTree = ""; }; + 321EAA542171E72900640504 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; + 321EAA562171E73100640504 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 321EAA582171E73800640504 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 321EAA5A2171E73E00640504 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 321EAA622171EC8700640504 /* SVGKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SVGKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 321EAB5B2171FB8100640504 /* SVGKImageRep.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKImageRep.m; sourceTree = ""; }; + 321EAB5D2171FB8100640504 /* SVGKImageRep.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKImageRep.h; sourceTree = ""; }; + 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGKInlineResource.h; sourceTree = ""; }; + 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGKInlineResource.m; sourceTree = ""; }; + 32A1F09C21746F4700ABFCE1 /* SVGKitFramework-OSXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SVGKitFramework-OSXTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 32A1F09E21746F4700ABFCE1 /* SVGKitFramework_OSXTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGKitFramework_OSXTests.m; sourceTree = ""; }; + 32A1F0A021746F4700ABFCE1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGTextLayer.h; sourceTree = ""; }; + 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SVGTextLayer.m; sourceTree = ""; }; + 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGLinearGradientElement.m; sourceTree = ""; }; + 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLinearGradientElement.h; sourceTree = ""; }; + 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGRadialGradientElement.h; sourceTree = ""; }; + 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGRadialGradientElement.m; sourceTree = ""; }; + 32EE37962173441400A23278 /* SVGKDefine.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGKDefine.h; sourceTree = ""; }; + 32F206D9217324BB00427F24 /* SVGKExporterNSImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKExporterNSImage.h; sourceTree = ""; }; + 32F206DA217324BB00427F24 /* SVGKExporterNSImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKExporterNSImage.m; sourceTree = ""; }; + 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGSwitchElement.h; sourceTree = ""; }; + 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGSwitchElement.m; sourceTree = ""; }; + 55452BF119EC68A200B75A30 /* SVGKit-iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SVGKit-iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 661ADBF016CC2FBE006F4BC3 /* SVGTextPositioningElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextPositioningElement.h; sourceTree = ""; }; 661ADBF116CC2FBE006F4BC3 /* SVGTextPositioningElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGTextPositioningElement.m; sourceTree = ""; }; 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextContentElement.h; sourceTree = ""; }; @@ -273,16 +1068,15 @@ 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "CALayer+RecursiveClone.m"; sourceTree = ""; }; 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConverterSVGToCALayer.h; sourceTree = ""; }; 66372F5916960D4E008C6C56 /* SVGRect.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGRect.m; sourceTree = ""; }; - 6639618E16145D0400E58CCA /* libSVGKit-iOS.1.1.0.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSVGKit-iOS.1.1.0.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 6639618E16145D0400E58CCA /* libSVGKit-iOS.2.1.0.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libSVGKit-iOS.2.1.0.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6639619116145D0400E58CCA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 6639633F16145DDC00E58CCA /* libxml2.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libxml2.dylib; path = usr/lib/libxml2.dylib; sourceTree = SDKROOT; }; 6639634116148CDF00E58CCA /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 6639634616148DEC00E58CCA /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 663FD01216CAEF0B00CCBFB3 /* SVGHelperUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGHelperUtilities.h; sourceTree = ""; }; - 663FD01316CAEF0C00CCBFB3 /* SVGHelperUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGHelperUtilities.m; sourceTree = ""; }; + 663FD01316CAEF0C00CCBFB3 /* SVGHelperUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGHelperUtilities.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 663FD01716CAF05900CCBFB3 /* SVGTransformable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGTransformable.h; sourceTree = ""; }; 663FD01A16CBEF5C00CCBFB3 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseClassForAllSVGBasicShapes_ForSubclasses.h; sourceTree = ""; }; - 6649E05F16172CE200AFE92A /* SVGKit-iOS-Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SVGKit-iOS-Prefix.pch"; sourceTree = ""; }; 666674B8168A511400486B68 /* CSSStyleRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSStyleRule.h; sourceTree = ""; }; 666674B9168A511400486B68 /* CSSStyleRule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSStyleRule.m; sourceTree = ""; }; 666674BD168A536C00486B68 /* DocumentCSS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DocumentCSS.h; path = "Source/DOM classes/Core DOM/DocumentCSS.h"; sourceTree = SOURCE_ROOT; }; @@ -296,26 +1090,44 @@ 666674CB168A58D000486B68 /* StyleSheetList+Mutable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "StyleSheetList+Mutable.h"; sourceTree = ""; }; 6668E2061688D3CF00F774A6 /* SVGGElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGGElement.h; sourceTree = ""; }; 6668E2071688D3CF00F774A6 /* SVGGElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGGElement.m; sourceTree = ""; }; + 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "SVGKImage+CGContext.h"; sourceTree = ""; }; + 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "SVGKImage+CGContext.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKExporterNSData.h; sourceTree = ""; }; + 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKExporterNSData.m; sourceTree = ""; }; + 668418C218674BF900C61EC2 /* SVGKExporterUIImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKExporterUIImage.h; sourceTree = ""; }; + 668418C318674BF900C61EC2 /* SVGKExporterUIImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKExporterUIImage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NamedNodeMap_Iterable.h; sourceTree = ""; }; + 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKSourceNSData.h; sourceTree = ""; }; + 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKSourceNSData.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 6694BB7A16967407007D0947 /* DOMGlobalSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMGlobalSettings.h; sourceTree = ""; }; 66988DAF1689FF5D00EC93C7 /* SVGStylable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGStylable.h; sourceTree = ""; }; 66988DB1168A001400EC93C7 /* CSSStyleDeclaration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSStyleDeclaration.h; sourceTree = ""; }; - 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSStyleDeclaration.m; sourceTree = ""; }; + 66988DB2168A001400EC93C7 /* CSSStyleDeclaration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CSSStyleDeclaration.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66988DB5168A004D00EC93C7 /* CSSValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSValue.h; sourceTree = ""; }; 66988DB6168A004D00EC93C7 /* CSSValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSValue.m; sourceTree = ""; }; 66988DB9168A027E00EC93C7 /* CSSRule.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSRule.h; sourceTree = ""; }; 66988DBA168A027E00EC93C7 /* CSSRule.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSRule.m; sourceTree = ""; }; 66988DBD168A031100EC93C7 /* CSSStyleSheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSStyleSheet.h; sourceTree = ""; }; - 66988DBE168A031100EC93C7 /* CSSStyleSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSStyleSheet.m; sourceTree = ""; }; + 66988DBE168A031100EC93C7 /* CSSStyleSheet.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CSSStyleSheet.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66988DC1168A038400EC93C7 /* CSSRuleList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSRuleList.h; sourceTree = ""; }; 66988DC2168A038400EC93C7 /* CSSRuleList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSRuleList.m; sourceTree = ""; }; 66988DC5168A04D000EC93C7 /* CSSRuleList+Mutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "CSSRuleList+Mutable.h"; sourceTree = ""; }; 66988DC9168A0A2300EC93C7 /* CSSPrimitiveValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSPrimitiveValue.h; sourceTree = ""; }; - 66988DCA168A0A2300EC93C7 /* CSSPrimitiveValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSPrimitiveValue.m; sourceTree = ""; }; + 66988DCA168A0A2300EC93C7 /* CSSPrimitiveValue.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CSSPrimitiveValue.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66988DCD168A129500EC93C7 /* CSSValueList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSValueList.h; sourceTree = ""; }; - 66988DCE168A129500EC93C7 /* CSSValueList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CSSValueList.m; sourceTree = ""; }; + 66988DCE168A129500EC93C7 /* CSSValueList.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CSSValueList.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66988DD1168A13BC00EC93C7 /* CSSValue_ForSubclasses.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSValue_ForSubclasses.h; sourceTree = ""; }; 66988DD9168A2F4200EC93C7 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CSSPrimitiveValue_ConfigurablePixelsPerInch.h; sourceTree = ""; }; 66A09CB016CFF494003CD5CD /* SVGFitToViewBox.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGFitToViewBox.h; sourceTree = ""; }; + 66DBE4E11C42A00C00A0F0B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 66DBE4E21C42A00C00A0F0B7 /* SVGKit_iOS-RetainTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "SVGKit_iOS-RetainTests.m"; sourceTree = ""; }; + 66DBE4E31C42A00C00A0F0B7 /* SVGKit_iOS_Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKit_iOS_Tests.m; sourceTree = ""; }; + 66DBE4F71C42A0C100A0F0B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 66DBE4FE1C42A0C900A0F0B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 66DBE4FF1C42A0C900A0F0B7 /* SVGKitFramework_iOSTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKitFramework_iOSTests.m; sourceTree = ""; }; + 66DBE5031C42A0D200A0F0B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 66DBE50A1C42A0D800A0F0B7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 66DBE50B1C42A0D800A0F0B7 /* SVGKitFramework_tvOSTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKitFramework_tvOSTests.m; sourceTree = ""; }; 66E8630E1688C2770059C9C4 /* AppleSucksDOMImplementation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppleSucksDOMImplementation.h; sourceTree = ""; }; 66E8630F1688C2770059C9C4 /* AppleSucksDOMImplementation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppleSucksDOMImplementation.m; sourceTree = ""; }; 66E863101688C2770059C9C4 /* Attr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Attr.h; sourceTree = ""; }; @@ -328,13 +1140,13 @@ 66E863171688C2770059C9C4 /* Comment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Comment.m; sourceTree = ""; }; 66E863181688C2770059C9C4 /* Document+Mutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Document+Mutable.h"; sourceTree = ""; }; 66E863191688C2770059C9C4 /* Document.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Document.h; sourceTree = ""; }; - 66E8631A1688C2770059C9C4 /* Document.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Document.m; sourceTree = ""; }; + 66E8631A1688C2770059C9C4 /* Document.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = Document.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8631B1688C2770059C9C4 /* DocumentFragment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentFragment.h; sourceTree = ""; }; 66E8631C1688C2770059C9C4 /* DocumentFragment.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DocumentFragment.m; sourceTree = ""; }; 66E8631D1688C2770059C9C4 /* DocumentType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocumentType.h; sourceTree = ""; }; 66E8631E1688C2770059C9C4 /* DocumentType.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DocumentType.m; sourceTree = ""; }; 66E8631F1688C2770059C9C4 /* DOMHelperUtilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMHelperUtilities.h; sourceTree = ""; }; - 66E863201688C2770059C9C4 /* DOMHelperUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DOMHelperUtilities.m; sourceTree = ""; }; + 66E863201688C2770059C9C4 /* DOMHelperUtilities.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = DOMHelperUtilities.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863211688C2770059C9C4 /* Element.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Element.h; sourceTree = ""; }; 66E863221688C2770059C9C4 /* Element.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Element.m; sourceTree = ""; }; 66E863231688C2770059C9C4 /* EntityReference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EntityReference.h; sourceTree = ""; }; @@ -356,7 +1168,7 @@ 66E863341688C2770059C9C4 /* SVGDefsElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGDefsElement.h; sourceTree = ""; }; 66E863351688C2770059C9C4 /* SVGDefsElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGDefsElement.m; sourceTree = ""; }; 66E863361688C2770059C9C4 /* SVGDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGDocument.h; sourceTree = ""; }; - 66E863371688C2770059C9C4 /* SVGDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGDocument.m; sourceTree = ""; }; + 66E863371688C2770059C9C4 /* SVGDocument.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGDocument.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863381688C2770059C9C4 /* SVGDocument_Mutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGDocument_Mutable.h; sourceTree = ""; }; 66E863391688C2770059C9C4 /* SVGElementInstance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGElementInstance.h; sourceTree = ""; }; 66E8633A1688C2770059C9C4 /* SVGElementInstance.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGElementInstance.m; sourceTree = ""; }; @@ -380,18 +1192,18 @@ 66E8634C1688C2770059C9C4 /* SVGUseElement_Mutable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGUseElement_Mutable.h; sourceTree = ""; }; 66E8634D1688C2770059C9C4 /* SVGViewSpec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGViewSpec.h; sourceTree = ""; }; 66E8634F1688C2770059C9C4 /* SVGCircleElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGCircleElement.h; sourceTree = ""; }; - 66E863501688C2770059C9C4 /* SVGCircleElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGCircleElement.m; sourceTree = ""; }; + 66E863501688C2770059C9C4 /* SVGCircleElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGCircleElement.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863511688C2770059C9C4 /* SVGDescriptionElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGDescriptionElement.h; sourceTree = ""; }; 66E863521688C2770059C9C4 /* SVGDescriptionElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGDescriptionElement.m; sourceTree = ""; }; 66E863531688C2770059C9C4 /* SVGElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGElement.h; sourceTree = ""; }; - 66E863541688C2770059C9C4 /* SVGElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGElement.m; sourceTree = ""; }; + 66E863541688C2770059C9C4 /* SVGElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGElement.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863551688C2770059C9C4 /* SVGElement_ForParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGElement_ForParser.h; sourceTree = ""; }; 66E863561688C2770059C9C4 /* SVGEllipseElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGEllipseElement.h; sourceTree = ""; }; 66E863571688C2770059C9C4 /* SVGEllipseElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGEllipseElement.m; sourceTree = ""; }; 66E863581688C2770059C9C4 /* SVGGroupElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGGroupElement.h; sourceTree = ""; }; 66E863591688C2770059C9C4 /* SVGGroupElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGGroupElement.m; sourceTree = ""; }; 66E8635A1688C2770059C9C4 /* SVGImageElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGImageElement.h; sourceTree = ""; }; - 66E8635B1688C2770059C9C4 /* SVGImageElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGImageElement.m; sourceTree = ""; }; + 66E8635B1688C2770059C9C4 /* SVGImageElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGImageElement.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8635D1688C2770059C9C4 /* SVGLineElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLineElement.h; sourceTree = ""; }; 66E8635E1688C2770059C9C4 /* SVGLineElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGLineElement.m; sourceTree = ""; }; 66E8635F1688C2770059C9C4 /* SVGPathElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathElement.h; sourceTree = ""; }; @@ -410,8 +1222,6 @@ 66E8636C1688C2770059C9C4 /* SVGTextElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGTextElement.m; sourceTree = ""; }; 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTitleElement.h; sourceTree = ""; }; 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGTitleElement.m; sourceTree = ""; }; - 66E863701688C2770059C9C4 /* CALayerExporter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CALayerExporter.h; sourceTree = ""; }; - 66E863711688C2770059C9C4 /* CALayerExporter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CALayerExporter.m; sourceTree = ""; }; 66E863741688C2770059C9C4 /* SVGKParserDefsAndUse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserDefsAndUse.h; sourceTree = ""; }; 66E863751688C2770059C9C4 /* SVGKParserDefsAndUse.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParserDefsAndUse.m; sourceTree = ""; }; 66E863761688C2770059C9C4 /* SVGKParserDOM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserDOM.h; sourceTree = ""; }; @@ -419,33 +1229,33 @@ 66E863781688C2770059C9C4 /* SVGKParserPatternsAndGradients.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserPatternsAndGradients.h; sourceTree = ""; }; 66E863791688C2770059C9C4 /* SVGKParserPatternsAndGradients.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParserPatternsAndGradients.m; sourceTree = ""; }; 66E8637A1688C2770059C9C4 /* SVGKParserSVG.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserSVG.h; sourceTree = ""; }; - 66E8637B1688C2770059C9C4 /* SVGKParserSVG.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParserSVG.m; sourceTree = ""; }; + 66E8637B1688C2770059C9C4 /* SVGKParserSVG.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKParserSVG.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8637C1688C2770059C9C4 /* SVGKParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParser.h; sourceTree = ""; }; - 66E8637D1688C2770059C9C4 /* SVGKParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParser.m; sourceTree = ""; }; + 66E8637D1688C2770059C9C4 /* SVGKParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKParser.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8637E1688C2770059C9C4 /* SVGKParseResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParseResult.h; sourceTree = ""; }; - 66E8637F1688C2770059C9C4 /* SVGKParseResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParseResult.m; sourceTree = ""; }; + 66E8637F1688C2770059C9C4 /* SVGKParseResult.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKParseResult.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863801688C2770059C9C4 /* SVGKParserExtension.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserExtension.h; sourceTree = ""; }; 66E863811688C2770059C9C4 /* SVGKPointsAndPathsParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKPointsAndPathsParser.h; sourceTree = ""; }; - 66E863821688C2770059C9C4 /* SVGKPointsAndPathsParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKPointsAndPathsParser.m; sourceTree = ""; }; + 66E863821688C2770059C9C4 /* SVGKPointsAndPathsParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKPointsAndPathsParser.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863841688C2770059C9C4 /* CALayerWithChildHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CALayerWithChildHitTest.h; sourceTree = ""; }; 66E863851688C2770059C9C4 /* CALayerWithChildHitTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CALayerWithChildHitTest.m; sourceTree = ""; }; 66E863861688C2770059C9C4 /* CAShapeLayerWithHitTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAShapeLayerWithHitTest.h; sourceTree = ""; }; - 66E863871688C2770059C9C4 /* CAShapeLayerWithHitTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAShapeLayerWithHitTest.m; sourceTree = ""; }; + 66E863871688C2770059C9C4 /* CAShapeLayerWithHitTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = CAShapeLayerWithHitTest.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863881688C2770059C9C4 /* CGPathAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CGPathAdditions.h; sourceTree = ""; }; 66E863891688C2770059C9C4 /* CGPathAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CGPathAdditions.m; sourceTree = ""; }; 66E8638A1688C2780059C9C4 /* SVGKLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKLayer.h; sourceTree = ""; }; - 66E8638B1688C2780059C9C4 /* SVGKLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKLayer.m; sourceTree = ""; }; + 66E8638B1688C2780059C9C4 /* SVGKLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKLayer.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8638C1688C2780059C9C4 /* SVGKImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKImage.h; sourceTree = ""; }; - 66E8638D1688C2780059C9C4 /* SVGKImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKImage.m; sourceTree = ""; }; + 66E8638D1688C2780059C9C4 /* SVGKImage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKImage.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8638E1688C2780059C9C4 /* SVGKit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKit.h; sourceTree = ""; }; 66E8638F1688C2780059C9C4 /* SVGKSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKSource.h; sourceTree = ""; }; 66E863901688C2780059C9C4 /* SVGKSource.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKSource.m; sourceTree = ""; }; 66E863921688C2780059C9C4 /* SVGKFastImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKFastImageView.h; sourceTree = ""; }; - 66E863931688C2780059C9C4 /* SVGKFastImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKFastImageView.m; sourceTree = ""; }; + 66E863931688C2780059C9C4 /* SVGKFastImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKFastImageView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E863941688C2780059C9C4 /* SVGKImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKImageView.h; sourceTree = ""; }; 66E863951688C2780059C9C4 /* SVGKImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKImageView.m; sourceTree = ""; }; 66E863961688C2780059C9C4 /* SVGKLayeredImageView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKLayeredImageView.h; sourceTree = ""; }; - 66E863971688C2780059C9C4 /* SVGKLayeredImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKLayeredImageView.m; sourceTree = ""; }; + 66E863971688C2780059C9C4 /* SVGKLayeredImageView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGKLayeredImageView.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66E8639B1688C2780059C9C4 /* SVGKPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKPattern.h; sourceTree = ""; }; 66E8639C1688C2780059C9C4 /* SVGKPattern.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKPattern.m; sourceTree = ""; }; 66E8639D1688C2780059C9C4 /* SVGUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGUtils.h; sourceTree = ""; }; @@ -455,67 +1265,155 @@ 66EEE8551688CA94002E2658 /* SVGKParserStyles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGKParserStyles.h; sourceTree = ""; }; 66EEE8561688CA94002E2658 /* SVGKParserStyles.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGKParserStyles.m; sourceTree = ""; }; 66EEE8591688CB37002E2658 /* SVGGradientElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGGradientElement.h; sourceTree = ""; }; - 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGGradientElement.m; sourceTree = ""; }; + 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGGradientElement.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; 66EEE85B1688CB37002E2658 /* SVGGradientStop.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGGradientStop.h; sourceTree = ""; }; 66EEE85C1688CB37002E2658 /* SVGGradientStop.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGGradientStop.m; sourceTree = ""; }; 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGStyleCatcher.h; sourceTree = ""; }; 66EEE85E1688CB37002E2658 /* SVGStyleElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGStyleElement.h; sourceTree = ""; }; 66EEE85F1688CB37002E2658 /* SVGStyleElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGStyleElement.m; sourceTree = ""; }; + 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPreserveAspectRatio.h; sourceTree = ""; }; + 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGPreserveAspectRatio.m; sourceTree = ""; }; + 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPreserveAspectRatio.h; sourceTree = ""; }; + 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGAnimatedPreserveAspectRatio.m; sourceTree = ""; }; + 825CDAAF1BDA4BC0003C1C12 /* SVGKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SVGKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 825CDAB81BDA4BC0003C1C12 /* SVGKitFramework-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SVGKitFramework-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 825CDACC1BDA4D20003C1C12 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = usr/lib/libxml2.tbd; sourceTree = SDKROOT; }; + 825CDAD31BDA4D38003C1C12 /* SVGKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SVGKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 825CDADC1BDA4D38003C1C12 /* SVGKitFramework-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SVGKitFramework-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 825CDAED1BDA4E07003C1C12 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; + 825CDAEF1BDA4E0E003C1C12 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 825CDAF11BDA4E16003C1C12 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; + 825CDAF31BDA4E1F003C1C12 /* libxml2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libxml2.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS9.0.sdk/usr/lib/libxml2.tbd; sourceTree = DEVELOPER_DIR; }; 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGGradientLayer.h; sourceTree = ""; }; 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVGGradientLayer.m; sourceTree = ""; }; + BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSData+NSInputStream.h"; sourceTree = ""; }; + BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = "NSData+NSInputStream.m"; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGUnitTypes.h; sourceTree = ""; }; + BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGClipPathElement.h; sourceTree = ""; }; + BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; lineEnding = 0; path = SVGClipPathElement.m; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objc; }; + BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CALayerWithClipRender.h; sourceTree = ""; }; + BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CALayerWithClipRender.m; sourceTree = ""; }; + BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAShapeLayerWithClipRender.h; sourceTree = ""; }; + BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CAShapeLayerWithClipRender.m; sourceTree = ""; }; + BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TinySVGTextAreaElement.h; sourceTree = ""; }; + BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TinySVGTextAreaElement.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 321EAA5F2171EC8700640504 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 321EAA6A2171ECDE00640504 /* libxml2.tbd in Frameworks */, + 321EAA6B2171ECE200640504 /* Foundation.framework in Frameworks */, + 321EAA6D2171ECEC00640504 /* QuartzCore.framework in Frameworks */, + 321EAA6C2171ECE700640504 /* CoreGraphics.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 32A1F09921746F4700ABFCE1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 32A1F0A121746F4700ABFCE1 /* SVGKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 55452BEE19EC68A200B75A30 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 55452C0E19EC6EC600B75A30 /* libxml2.dylib in Frameworks */, + 55452BF719EC68A200B75A30 /* libSVGKit-iOS.2.1.0.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6639618B16145D0400E58CCA /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 6639634716148DEC00E58CCA /* CoreGraphics.framework in Frameworks */, 6639634216148CDF00E58CCA /* QuartzCore.framework in Frameworks */, - 6639634016145DDC00E58CCA /* libxml2.dylib in Frameworks */, 6639619216145D0400E58CCA /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; + 825CDAAB1BDA4BC0003C1C12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDCC51BDA5314003C1C12 /* libxml2.tbd in Frameworks */, + 825CDACB1BDA4D14003C1C12 /* CoreGraphics.framework in Frameworks */, + 825CDACA1BDA4D0F003C1C12 /* Foundation.framework in Frameworks */, + 825CDAC91BDA4D09003C1C12 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAB51BDA4BC0003C1C12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDAB91BDA4BC0003C1C12 /* SVGKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDACF1BDA4D38003C1C12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDCC61BDA531A003C1C12 /* libxml2.tbd in Frameworks */, + 825CDAF21BDA4E16003C1C12 /* CoreGraphics.framework in Frameworks */, + 825CDAF01BDA4E0E003C1C12 /* Foundation.framework in Frameworks */, + 825CDAEE1BDA4E07003C1C12 /* QuartzCore.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAD91BDA4D38003C1C12 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDADD1BDA4D38003C1C12 /* SVGKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 00E86D511741586600F0FA0A /* Vendor */ = { + 321EAA392171E2C800640504 /* SVGKitFramework-OSX */ = { + isa = PBXGroup; + children = ( + 321EAA3B2171E2C800640504 /* Info.plist */, + ); + path = "SVGKitFramework-OSX"; + sourceTree = ""; + }; + 321EAB532171F97800640504 /* Foundation additions */ = { isa = PBXGroup; children = ( - 00E86D521741586600F0FA0A /* Lumberjack */, + 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */, + 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */, + BD1585721996B13F00461AA5 /* NSData+NSInputStream.h */, + BD1585741996B17C00461AA5 /* NSData+NSInputStream.m */, ); - path = Vendor; + path = "Foundation additions"; sourceTree = ""; }; - 00E86D521741586600F0FA0A /* Lumberjack */ = { + 321EAB582171FB8100640504 /* AppKit additions */ = { isa = PBXGroup; children = ( - 00E86D531741586600F0FA0A /* DDAbstractDatabaseLogger.h */, - 00E86D541741586600F0FA0A /* DDAbstractDatabaseLogger.m */, - 00E86D551741586600F0FA0A /* DDASLLogger.h */, - 00E86D561741586600F0FA0A /* DDASLLogger.m */, - 00E86D571741586600F0FA0A /* DDFileLogger.h */, - 00E86D581741586600F0FA0A /* DDFileLogger.m */, - 00E86D591741586600F0FA0A /* DDLog.h */, - 00E86D5A1741586600F0FA0A /* DDLog.m */, - 00E86D5B1741586600F0FA0A /* DDTTYLogger.h */, - 00E86D5C1741586600F0FA0A /* DDTTYLogger.m */, - 00E86D5D1741586600F0FA0A /* Extensions */, - ); - path = Lumberjack; + 321EAB5D2171FB8100640504 /* SVGKImageRep.h */, + 321EAB5B2171FB8100640504 /* SVGKImageRep.m */, + ); + path = "AppKit additions"; sourceTree = ""; }; - 00E86D5D1741586600F0FA0A /* Extensions */ = { + 32A1F09D21746F4700ABFCE1 /* SVGKitFramework-OSXTests */ = { isa = PBXGroup; children = ( - 00E86D5E1741586600F0FA0A /* ContextFilterLogFormatter.h */, - 00E86D5F1741586600F0FA0A /* ContextFilterLogFormatter.m */, - 00E86D601741586600F0FA0A /* DispatchQueueLogFormatter.h */, - 00E86D611741586600F0FA0A /* DispatchQueueLogFormatter.m */, - 00E86D621741586600F0FA0A /* README.txt */, + 32A1F09E21746F4700ABFCE1 /* SVGKitFramework_OSXTests.m */, + 32A1F0A021746F4700ABFCE1 /* Info.plist */, ); - path = Extensions; + path = "SVGKitFramework-OSXTests"; sourceTree = ""; }; 6636CD77175F542A0072AAEF /* Sources */ = { @@ -523,6 +1421,8 @@ children = ( 6636CD78175F542A0072AAEF /* SVGKSourceLocalFile.h */, 6636CD79175F542A0072AAEF /* SVGKSourceLocalFile.m */, + 6694B5DB199C10400028CFF6 /* SVGKSourceNSData.h */, + 6694B5DC199C10400028CFF6 /* SVGKSourceNSData.m */, 6636CD7A175F542A0072AAEF /* SVGKSourceString.h */, 6636CD7B175F542A0072AAEF /* SVGKSourceString.m */, 6636CD7C175F542A0072AAEF /* SVGKSourceURL.h */, @@ -535,7 +1435,8 @@ isa = PBXGroup; children = ( 6639633E16145D7700E58CCA /* EXTERNAL REFERENCES */, - 6649E05E16172CE200AFE92A /* SVGKit-iOS */, + 66DBE4B81C429FF100A0F0B7 /* SVGKitLibrary */, + 66DBE4E71C42A0AD00A0F0B7 /* SVGKitFrameworks */, 6639619016145D0400E58CCA /* Frameworks */, 6639618F16145D0400E58CCA /* Products */, ); @@ -544,7 +1445,14 @@ 6639618F16145D0400E58CCA /* Products */ = { isa = PBXGroup; children = ( - 6639618E16145D0400E58CCA /* libSVGKit-iOS.1.1.0.a */, + 6639618E16145D0400E58CCA /* libSVGKit-iOS.2.1.0.a */, + 55452BF119EC68A200B75A30 /* SVGKit-iOS Tests.xctest */, + 825CDAAF1BDA4BC0003C1C12 /* SVGKit.framework */, + 825CDAB81BDA4BC0003C1C12 /* SVGKitFramework-iOSTests.xctest */, + 825CDAD31BDA4D38003C1C12 /* SVGKit.framework */, + 825CDADC1BDA4D38003C1C12 /* SVGKitFramework-tvOSTests.xctest */, + 321EAA622171EC8700640504 /* SVGKit.framework */, + 32A1F09C21746F4700ABFCE1 /* SVGKitFramework-OSXTests.xctest */, ); name = Products; sourceTree = ""; @@ -552,6 +1460,15 @@ 6639619016145D0400E58CCA /* Frameworks */ = { isa = PBXGroup; children = ( + 321EAA5A2171E73E00640504 /* QuartzCore.framework */, + 321EAA582171E73800640504 /* Foundation.framework */, + 321EAA562171E73100640504 /* CoreGraphics.framework */, + 825CDAF31BDA4E1F003C1C12 /* libxml2.tbd */, + 321EAA542171E72900640504 /* libxml2.tbd */, + 825CDAF11BDA4E16003C1C12 /* CoreGraphics.framework */, + 825CDAEF1BDA4E0E003C1C12 /* Foundation.framework */, + 825CDAED1BDA4E07003C1C12 /* QuartzCore.framework */, + 825CDACC1BDA4D20003C1C12 /* libxml2.tbd */, 6639633F16145DDC00E58CCA /* libxml2.dylib */, 6639634616148DEC00E58CCA /* CoreGraphics.framework */, 6639634116148CDF00E58CCA /* QuartzCore.framework */, @@ -576,26 +1493,93 @@ 6636CD77175F542A0072AAEF /* Sources */, 66E863721688C2770059C9C4 /* Parsers */, 66E863831688C2770059C9C4 /* QuartzCore additions */, + 321EAB532171F97800640504 /* Foundation additions */, + 66E863911688C2780059C9C4 /* UIKit additions */, + 321EAB582171FB8100640504 /* AppKit additions */, + 66E863981688C2780059C9C4 /* Utils */, 66E8638C1688C2780059C9C4 /* SVGKImage.h */, 66E8638D1688C2780059C9C4 /* SVGKImage.m */, 66E8638E1688C2780059C9C4 /* SVGKit.h */, 00E86D7317415AA000F0FA0A /* SVGKit.m */, 66E8638F1688C2780059C9C4 /* SVGKSource.h */, 66E863901688C2780059C9C4 /* SVGKSource.m */, - 66E863911688C2780059C9C4 /* UIKit additions */, - 66E863981688C2780059C9C4 /* Unsorted */, - 00E86D511741586600F0FA0A /* Vendor */, + 32EE37962173441400A23278 /* SVGKDefine.h */, ); path = Source; sourceTree = ""; }; - 6649E05E16172CE200AFE92A /* SVGKit-iOS */ = { + 66DBE4B81C429FF100A0F0B7 /* SVGKitLibrary */ = { isa = PBXGroup; children = ( - 6649E05F16172CE200AFE92A /* SVGKit-iOS-Prefix.pch */, + 66DBE4DD1C42A00000A0F0B7 /* SVGKit-iOS */, + 66DBE4E01C42A00C00A0F0B7 /* SVGKit-iOS Tests */, ); - name = "SVGKit-iOS"; - path = "XCodeProjectData/SVGKit-iOS"; + path = SVGKitLibrary; + sourceTree = ""; + }; + 66DBE4DD1C42A00000A0F0B7 /* SVGKit-iOS */ = { + isa = PBXGroup; + children = ( + 321EAA4C2171E51800640504 /* SVGKit-Prefix.pch */, + ); + path = "SVGKit-iOS"; + sourceTree = ""; + }; + 66DBE4E01C42A00C00A0F0B7 /* SVGKit-iOS Tests */ = { + isa = PBXGroup; + children = ( + 66DBE4E11C42A00C00A0F0B7 /* Info.plist */, + 66DBE4E21C42A00C00A0F0B7 /* SVGKit_iOS-RetainTests.m */, + 66DBE4E31C42A00C00A0F0B7 /* SVGKit_iOS_Tests.m */, + ); + path = "SVGKit-iOS Tests"; + sourceTree = ""; + }; + 66DBE4E71C42A0AD00A0F0B7 /* SVGKitFrameworks */ = { + isa = PBXGroup; + children = ( + 66DBE4F61C42A0C100A0F0B7 /* SVGKitFramework-iOS */, + 66DBE4FD1C42A0C900A0F0B7 /* SVGKitFramework-iOSTests */, + 66DBE5021C42A0D200A0F0B7 /* SVGKitFramework-tvOS */, + 66DBE5091C42A0D800A0F0B7 /* SVGKitFramework-tvOSTests */, + 321EAA392171E2C800640504 /* SVGKitFramework-OSX */, + 32A1F09D21746F4700ABFCE1 /* SVGKitFramework-OSXTests */, + ); + path = SVGKitFrameworks; + sourceTree = ""; + }; + 66DBE4F61C42A0C100A0F0B7 /* SVGKitFramework-iOS */ = { + isa = PBXGroup; + children = ( + 66DBE4F71C42A0C100A0F0B7 /* Info.plist */, + ); + path = "SVGKitFramework-iOS"; + sourceTree = ""; + }; + 66DBE4FD1C42A0C900A0F0B7 /* SVGKitFramework-iOSTests */ = { + isa = PBXGroup; + children = ( + 66DBE4FE1C42A0C900A0F0B7 /* Info.plist */, + 66DBE4FF1C42A0C900A0F0B7 /* SVGKitFramework_iOSTests.m */, + ); + path = "SVGKitFramework-iOSTests"; + sourceTree = ""; + }; + 66DBE5021C42A0D200A0F0B7 /* SVGKitFramework-tvOS */ = { + isa = PBXGroup; + children = ( + 66DBE5031C42A0D200A0F0B7 /* Info.plist */, + ); + path = "SVGKitFramework-tvOS"; + sourceTree = ""; + }; + 66DBE5091C42A0D800A0F0B7 /* SVGKitFramework-tvOSTests */ = { + isa = PBXGroup; + children = ( + 66DBE50A1C42A0D800A0F0B7 /* Info.plist */, + 66DBE50B1C42A0D800A0F0B7 /* SVGKitFramework_tvOSTests.m */, + ); + path = "SVGKitFramework-tvOSTests"; sourceTree = ""; }; 66E8630C1688C2770059C9C4 /* DOM classes */ = { @@ -664,6 +1648,7 @@ 66E863241688C2770059C9C4 /* EntityReference.m */, 66E863251688C2770059C9C4 /* NamedNodeMap.h */, 66E863261688C2770059C9C4 /* NamedNodeMap.m */, + 66849FAC18393D3100AE4F28 /* NamedNodeMap_Iterable.h */, 66E863271688C2770059C9C4 /* Node+Mutable.h */, 66E863281688C2770059C9C4 /* Node.h */, 66E863291688C2770059C9C4 /* Node.m */, @@ -684,6 +1669,10 @@ children = ( 66E863321688C2770059C9C4 /* SVGAngle.h */, 66E863331688C2770059C9C4 /* SVGAngle.m */, + 66F33DD2182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h */, + 66F33DD3182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m */, + BD2F8C4F199D0897008AE06D /* SVGClipPathElement.h */, + BD2F8C50199D0897008AE06D /* SVGClipPathElement.m */, 66E863341688C2770059C9C4 /* SVGDefsElement.h */, 66E863351688C2770059C9C4 /* SVGDefsElement.m */, 66E863361688C2770059C9C4 /* SVGDocument.h */, @@ -705,6 +1694,8 @@ 66E863431688C2770059C9C4 /* SVGNumber.h */, 66E863441688C2770059C9C4 /* SVGPoint.h */, 66E863451688C2770059C9C4 /* SVGPoint.m */, + 66F33DCE182FE1C4004464AC /* SVGPreserveAspectRatio.h */, + 66F33DCF182FE1C4004464AC /* SVGPreserveAspectRatio.m */, 66E863461688C2770059C9C4 /* SVGRect.h */, 66372F5916960D4E008C6C56 /* SVGRect.m */, 66E863471688C2770059C9C4 /* SVGSVGElement_Mutable.h */, @@ -723,6 +1714,7 @@ 661ADBF516CC2FCA006F4BC3 /* SVGTextContentElement.h */, 661ADBF616CC2FCA006F4BC3 /* SVGTextContentElement.m */, 661ADBFB16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h */, + BD2F8C4E199D0792008AE06D /* SVGUnitTypes.h */, ); path = "SVG-DOM"; sourceTree = ""; @@ -733,6 +1725,10 @@ 6636CD8C175F54970072AAEF /* ConverterSVGToCALayer.h */, 66EEE8591688CB37002E2658 /* SVGGradientElement.h */, 66EEE85A1688CB37002E2658 /* SVGGradientElement.m */, + 32D3D5D62176E00D00ED20D8 /* SVGLinearGradientElement.h */, + 32D3D5D52176E00D00ED20D8 /* SVGLinearGradientElement.m */, + 32D3D5DD2176E01400ED20D8 /* SVGRadialGradientElement.h */, + 32D3D5DE2176E01400ED20D8 /* SVGRadialGradientElement.m */, 66EEE85B1688CB37002E2658 /* SVGGradientStop.h */, 66EEE85C1688CB37002E2658 /* SVGGradientStop.m */, 66EEE85D1688CB37002E2658 /* SVGStyleCatcher.h */, @@ -766,10 +1762,14 @@ 66E863681688C2770059C9C4 /* BaseClassForAllSVGBasicShapes.m */, 66E863691688C2770059C9C4 /* SVGSVGElement.h */, 66E8636A1688C2770059C9C4 /* SVGSVGElement.m */, + 4FD821EE1AC69F6600E419D3 /* SVGSwitchElement.h */, + 4FD821EF1AC69F6600E419D3 /* SVGSwitchElement.m */, 66E8636B1688C2770059C9C4 /* SVGTextElement.h */, 66E8636C1688C2770059C9C4 /* SVGTextElement.m */, 66E8636D1688C2770059C9C4 /* SVGTitleElement.h */, 66E8636E1688C2770059C9C4 /* SVGTitleElement.m */, + BDA133B519AD0E81003C9945 /* TinySVGTextAreaElement.h */, + BDA133B619AD0E81003C9945 /* TinySVGTextAreaElement.m */, ); path = "Unported or Partial DOM"; sourceTree = ""; @@ -777,8 +1777,14 @@ 66E8636F1688C2770059C9C4 /* Exporters */ = { isa = PBXGroup; children = ( - 66E863701688C2770059C9C4 /* CALayerExporter.h */, - 66E863711688C2770059C9C4 /* CALayerExporter.m */, + 668418B81867457900C61EC2 /* SVGKImage+CGContext.h */, + 668418B91867457900C61EC2 /* SVGKImage+CGContext.m */, + 668418BE18674A0300C61EC2 /* SVGKExporterNSData.h */, + 668418BF18674A0300C61EC2 /* SVGKExporterNSData.m */, + 668418C218674BF900C61EC2 /* SVGKExporterUIImage.h */, + 668418C318674BF900C61EC2 /* SVGKExporterUIImage.m */, + 32F206D9217324BB00427F24 /* SVGKExporterNSImage.h */, + 32F206DA217324BB00427F24 /* SVGKExporterNSImage.m */, ); path = Exporters; sourceTree = ""; @@ -824,6 +1830,12 @@ 6636CD89175F54680072AAEF /* CALayer+RecursiveClone.m */, 9ED79A22179D87790048AA5B /* SVGGradientLayer.h */, 9ED79A23179D87790048AA5B /* SVGGradientLayer.m */, + 32C4891C21916F3D007B1F29 /* SVGTextLayer.h */, + 32C4891D21916F3D007B1F29 /* SVGTextLayer.m */, + BD2F8C53199D14D6008AE06D /* CALayerWithClipRender.h */, + BD2F8C54199D14D6008AE06D /* CALayerWithClipRender.m */, + BD4C56DA199D55CC00AF04AD /* CAShapeLayerWithClipRender.h */, + BD4C56DB199D55CC00AF04AD /* CAShapeLayerWithClipRender.m */, 66E863841688C2770059C9C4 /* CALayerWithChildHitTest.h */, 66E863851688C2770059C9C4 /* CALayerWithChildHitTest.m */, 66E863861688C2770059C9C4 /* CAShapeLayerWithHitTest.h */, @@ -839,8 +1851,6 @@ 66E863911688C2780059C9C4 /* UIKit additions */ = { isa = PBXGroup; children = ( - 036A524A16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h */, - 036A524B16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m */, 66E863921688C2780059C9C4 /* SVGKFastImageView.h */, 66E863931688C2780059C9C4 /* SVGKFastImageView.m */, 66E863941688C2780059C9C4 /* SVGKImageView.h */, @@ -851,27 +1861,177 @@ path = "UIKit additions"; sourceTree = ""; }; - 66E863981688C2780059C9C4 /* Unsorted */ = { + 66E863981688C2780059C9C4 /* Utils */ = { isa = PBXGroup; children = ( 66E8639B1688C2780059C9C4 /* SVGKPattern.h */, 66E8639C1688C2780059C9C4 /* SVGKPattern.m */, 66E8639D1688C2780059C9C4 /* SVGUtils.h */, 66E8639E1688C2780059C9C4 /* SVGUtils.m */, + 322A5B7B218BF990003D9CF1 /* SVGKInlineResource.h */, + 322A5B7C218BF990003D9CF1 /* SVGKInlineResource.m */, ); - path = Unsorted; + path = Utils; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 321EAA5D2171EC8700640504 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 321EAA7C2171ED6900640504 /* CSSStyleSheet.h in Headers */, + 321EAAD82171ED6F00640504 /* SVGFitToViewBox.h in Headers */, + 321EAB4D2171ED9E00640504 /* NSData+NSInputStream.h in Headers */, + 32C4892121916F3D007B1F29 /* SVGTextLayer.h in Headers */, + 321EAB1B2171ED8D00640504 /* SVGKParserDefsAndUse.h in Headers */, + 321EAAB32171ED6F00640504 /* SVGClipPathElement.h in Headers */, + 321EAAC52171ED6F00640504 /* SVGMatrix.h in Headers */, + 321EAAF22171ED7E00640504 /* SVGImageElement.h in Headers */, + 321EAB052171ED7E00640504 /* SVGTextElement.h in Headers */, + 321EAB232171ED8D00640504 /* SVGKParserStyles.h in Headers */, + 321EAB342171ED9600640504 /* CAShapeLayerWithClipRender.h in Headers */, + 321EAAC72171ED6F00640504 /* SVGNumber.h in Headers */, + 321EAA7A2171ED6900640504 /* CSSRule.h in Headers */, + 321EAB442171ED9900640504 /* SVGKit-Prefix.pch in Headers */, + 321EAAC12171ED6F00640504 /* SVGStylable.h in Headers */, + 321EAB682172025200640504 /* SVGKImageView.h in Headers */, + 321EAA802171ED6900640504 /* CSSRuleList.h in Headers */, + 321EAB092171ED7E00640504 /* TinySVGTextAreaElement.h in Headers */, + 321EAA9B2171ED6900640504 /* DOMHelperUtilities.h in Headers */, + 321EAAAA2171ED6900640504 /* ProcessingInstruction.h in Headers */, + 327B2892217DABED004D27FC /* SVGLinearGradientElement.h in Headers */, + 321EAA742171ED6900640504 /* CharacterData.h in Headers */, + 321EAB2E2171ED9600640504 /* CALayer+RecursiveClone.h in Headers */, + 321EAAE22171ED7E00640504 /* SVGGradientStop.h in Headers */, + 321EAB272171ED9100640504 /* SVGKParser.h in Headers */, + 321EAACF2171ED6F00640504 /* SVGTransform.h in Headers */, + 321EAB2B2171ED9100640504 /* SVGKParserExtension.h in Headers */, + 321EAAB92171ED6F00640504 /* SVGDocument_Mutable.h in Headers */, + 321EAB132171ED8700640504 /* SVGKSourceLocalFile.h in Headers */, + 321EAAA32171ED6900640504 /* NamedNodeMap_Iterable.h in Headers */, + 321EAA912171ED6900640504 /* StyleSheetList.h in Headers */, + 321EAADD2171ED6F00640504 /* SVGTextPositioningElement_Mutable.h in Headers */, + 321EAAFE2171ED7E00640504 /* BaseClassForAllSVGBasicShapes.h in Headers */, + 321EAB1D2171ED8D00640504 /* SVGKParserDOM.h in Headers */, + 321EAABF2171ED6F00640504 /* SVGElementInstanceList_Internal.h in Headers */, + 321EAA952171ED6900640504 /* MediaList.h in Headers */, + 321EAAAE2171ED6900640504 /* DOMGlobalSettings.h in Headers */, + 321EAAAF2171ED6F00640504 /* SVGAngle.h in Headers */, + 321EAAD52171ED6F00640504 /* SVGHelperUtilities.h in Headers */, + 321EAAF42171ED7E00640504 /* SVGLineElement.h in Headers */, + 321EAA8B2171ED6900640504 /* Document+Mutable.h in Headers */, + 321EAA972171ED6900640504 /* DocumentFragment.h in Headers */, + 321EAAB52171ED6F00640504 /* SVGDefsElement.h in Headers */, + 321EAAE02171ED7E00640504 /* SVGGradientElement.h in Headers */, + 321EAA9D2171ED6900640504 /* Element.h in Headers */, + 321EAB452171ED9E00640504 /* NSCharacterSet+SVGKExtensions.h in Headers */, + 321EAB362171ED9600640504 /* CALayerWithChildHitTest.h in Headers */, + 321EAB032171ED7E00640504 /* SVGSwitchElement.h in Headers */, + 321EAAFF2171ED7E00640504 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */, + 321EAB0F2171ED8200640504 /* SVGKExporterNSData.h in Headers */, + 321EAACC2171ED6F00640504 /* SVGRect.h in Headers */, + 321EAB382171ED9600640504 /* CAShapeLayerWithHitTest.h in Headers */, + 321EAAA72171ED6900640504 /* NodeList+Mutable.h in Headers */, + 321EAA8C2171ED6900640504 /* Document.h in Headers */, + 321EAAB12171ED6F00640504 /* SVGAnimatedPreserveAspectRatio.h in Headers */, + 321EAA722171ED6900640504 /* CDATASection.h in Headers */, + 321EAAC02171ED6F00640504 /* SVGGElement.h in Headers */, + 321EAAD12171ED6F00640504 /* SVGUseElement.h in Headers */, + 321EAAD32171ED6F00640504 /* SVGUseElement_Mutable.h in Headers */, + 321EAA8E2171ED6900640504 /* DocumentCSS.h in Headers */, + 321EAB4F2171EDA200640504 /* SVGKPattern.h in Headers */, + 321EAACE2171ED6F00640504 /* SVGSVGElement_Mutable.h in Headers */, + 321EAA932171ED6900640504 /* StyleSheet.h in Headers */, + 321EAAA82171ED6900640504 /* NodeList.h in Headers */, + 327B2893217DABF3004D27FC /* SVGRadialGradientElement.h in Headers */, + 321EAABD2171ED6F00640504 /* SVGElementInstanceList.h in Headers */, + 321EAB3E2171ED9900640504 /* SVGKImage.h in Headers */, + 321EAABC2171ED6F00640504 /* SVGElementInstance_Mutable.h in Headers */, + 321EAAE52171ED7E00640504 /* SVGStyleElement.h in Headers */, + 321EAA6E2171ED6900640504 /* AppleSucksDOMImplementation.h in Headers */, + 321EAAB72171ED6F00640504 /* SVGDocument.h in Headers */, + 321EAAA52171ED6900640504 /* Node.h in Headers */, + 321EAB322171ED9600640504 /* CALayerWithClipRender.h in Headers */, + 321EAB422171ED9900640504 /* SVGKSource.h in Headers */, + 321EAAF02171ED7E00640504 /* SVGGroupElement.h in Headers */, + 321EAAEE2171ED7E00640504 /* SVGEllipseElement.h in Headers */, + 321EAB172171ED8700640504 /* SVGKSourceString.h in Headers */, + 321EAA892171ED6900640504 /* CSSValue.h in Headers */, + 321EAAD92171ED6F00640504 /* SVGTextPositioningElement.h in Headers */, + 321EAB652171FC0700640504 /* SVGKFastImageView.h in Headers */, + 321EAB1F2171ED8D00640504 /* SVGKParserGradient.h in Headers */, + 321EAA7D2171ED6900640504 /* CSSStyleRule.h in Headers */, + 321EAA852171ED6900640504 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */, + 321EAA902171ED6900640504 /* StyleSheetList+Mutable.h in Headers */, + 321EAA822171ED6900640504 /* CSSRuleList+Mutable.h in Headers */, + 321EAA8F2171ED6900640504 /* DocumentStyle.h in Headers */, + 321EAAA12171ED6900640504 /* NamedNodeMap.h in Headers */, + 321EAADF2171ED7E00640504 /* ConverterSVGToCALayer.h in Headers */, + 321EAA832171ED6900640504 /* CSSPrimitiveValue.h in Headers */, + 321EAAF62171ED7E00640504 /* SVGPathElement.h in Headers */, + 321EAA862171ED6900640504 /* CSSValueList.h in Headers */, + 321EAAEB2171ED7E00640504 /* SVGElement.h in Headers */, + 32EE379A2173441400A23278 /* SVGKDefine.h in Headers */, + 321EAB252171ED8D00640504 /* SVGKParserSVG.h in Headers */, + 321EAAD72171ED6F00640504 /* SVGTransformable.h in Headers */, + 321EAADE2171ED6F00640504 /* SVGUnitTypes.h in Headers */, + 321EAA782171ED6900640504 /* CSSStyleDeclaration.h in Headers */, + 321EAA762171ED6900640504 /* Comment.h in Headers */, + 321EAB0D2171ED8200640504 /* SVGKImage+CGContext.h in Headers */, + 321EAB192171ED8700640504 /* SVGKSourceURL.h in Headers */, + 321EAAD42171ED6F00640504 /* SVGViewSpec.h in Headers */, + 321EAB292171ED9100640504 /* SVGKParseResult.h in Headers */, + 321EAAF82171ED7E00640504 /* SVGPolygonElement.h in Headers */, + 321EAA882171ED6900640504 /* CSSValue_ForSubclasses.h in Headers */, + 321EAAED2171ED7E00640504 /* SVGElement_ForParser.h in Headers */, + 321EAAFC2171ED7E00640504 /* SVGRectElement.h in Headers */, + 321EAA9F2171ED6900640504 /* EntityReference.h in Headers */, + 321EAB152171ED8700640504 /* SVGKSourceNSData.h in Headers */, + 321EAA702171ED6900640504 /* Attr.h in Headers */, + 321EAB632171FB8100640504 /* SVGKImageRep.h in Headers */, + 321EAA992171ED6900640504 /* DocumentType.h in Headers */, + 321EAAAC2171ED6900640504 /* Text.h in Headers */, + 321EAAC82171ED6F00640504 /* SVGPoint.h in Headers */, + 321EAB072171ED7E00640504 /* SVGTitleElement.h in Headers */, + 321EAB512171EDA200640504 /* SVGUtils.h in Headers */, + 321EAAE42171ED7E00640504 /* SVGStyleCatcher.h in Headers */, + 321EAB3C2171ED9600640504 /* SVGKLayer.h in Headers */, + 321EAB302171ED9600640504 /* SVGGradientLayer.h in Headers */, + 321EAB012171ED7E00640504 /* SVGSVGElement.h in Headers */, + 321EAAC32171ED6F00640504 /* SVGLength.h in Headers */, + 321EAB672171FC0700640504 /* SVGKLayeredImageView.h in Headers */, + 321EAACA2171ED6F00640504 /* SVGPreserveAspectRatio.h in Headers */, + 32F206DB217324BB00427F24 /* SVGKExporterNSImage.h in Headers */, + 321EAAE72171ED7E00640504 /* SVGCircleElement.h in Headers */, + 322A5B82218BFE11003D9CF1 /* SVGKInlineResource.h in Headers */, + 321EAADB2171ED6F00640504 /* SVGTextContentElement.h in Headers */, + 321EAAFA2171ED7E00640504 /* SVGPolylineElement.h in Headers */, + 321EAB2C2171ED9100640504 /* SVGKPointsAndPathsParser.h in Headers */, + 321EAAE92171ED7E00640504 /* SVGDescriptionElement.h in Headers */, + 321EAAA42171ED6900640504 /* Node+Mutable.h in Headers */, + 321EAB3A2171ED9600640504 /* CGPathAdditions.h in Headers */, + 321EAB212171ED8D00640504 /* SVGKParserPatternsAndGradients.h in Headers */, + 321EAABA2171ED6F00640504 /* SVGElementInstance.h in Headers */, + 321EAB402171ED9900640504 /* SVGKit.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6639624616145D3E00E58CCA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 66E8639F1688C2780059C9C4 /* AppleSucksDOMImplementation.h in Headers */, + 66E4E5C4188EF5D3007DFCAA /* SVGKSourceLocalFile.h in Headers */, + 6681C5161CBF07FB00272CCC /* StyleSheetList+Mutable.h in Headers */, + 6681C5151CBF07CA00272CCC /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */, + 66E4E5C5188EF5D3007DFCAA /* SVGKSourceString.h in Headers */, + 66E4E5C6188EF5D3007DFCAA /* SVGKSourceURL.h in Headers */, + 66849FAD18393EC600AE4F28 /* NamedNodeMap_Iterable.h in Headers */, 66E863A11688C2780059C9C4 /* Attr.h in Headers */, 66E863A31688C2780059C9C4 /* CDATASection.h in Headers */, + 32D3D5DF2176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */, 66E863A51688C2780059C9C4 /* CharacterData.h in Headers */, 66E863A71688C2780059C9C4 /* Comment.h in Headers */, 66E863A91688C2780059C9C4 /* Document+Mutable.h in Headers */, @@ -880,6 +2040,7 @@ 66E863AC1688C2780059C9C4 /* DocumentFragment.h in Headers */, 66372EEF1695F17F008C6C56 /* DocumentStyle.h in Headers */, 66E863AE1688C2780059C9C4 /* DocumentType.h in Headers */, + 32C4891E21916F3D007B1F29 /* SVGTextLayer.h in Headers */, 66E863B01688C2780059C9C4 /* DOMHelperUtilities.h in Headers */, 66E863B21688C2780059C9C4 /* Element.h in Headers */, 66E863B41688C2780059C9C4 /* EntityReference.h in Headers */, @@ -903,6 +2064,7 @@ 66E863D31688C2780059C9C4 /* SVGNumber.h in Headers */, 66E863D41688C2780059C9C4 /* SVGPoint.h in Headers */, 66E863D61688C2780059C9C4 /* SVGRect.h in Headers */, + 668418C418674BF900C61EC2 /* SVGKExporterUIImage.h in Headers */, 66E863D71688C2780059C9C4 /* SVGSVGElement_Mutable.h in Headers */, 66E863D81688C2780059C9C4 /* SVGTransform.h in Headers */, 66E863DA1688C2780059C9C4 /* SVGUseElement.h in Headers */, @@ -914,7 +2076,9 @@ 66E863E41688C2780059C9C4 /* SVGElement_ForParser.h in Headers */, 66E863E51688C2780059C9C4 /* SVGEllipseElement.h in Headers */, 66E863E71688C2780059C9C4 /* SVGGroupElement.h in Headers */, + 32EE37972173441400A23278 /* SVGKDefine.h in Headers */, 66E863E91688C2780059C9C4 /* SVGImageElement.h in Headers */, + 668418BA1867457900C61EC2 /* SVGKImage+CGContext.h in Headers */, 66E863EC1688C2780059C9C4 /* SVGLineElement.h in Headers */, 66E863EE1688C2780059C9C4 /* SVGPathElement.h in Headers */, 66E863F01688C2780059C9C4 /* SVGPolygonElement.h in Headers */, @@ -924,7 +2088,6 @@ 66E863F81688C2780059C9C4 /* SVGSVGElement.h in Headers */, 66E863FA1688C2780059C9C4 /* SVGTextElement.h in Headers */, 66E863FC1688C2780059C9C4 /* SVGTitleElement.h in Headers */, - 66E863FE1688C2780059C9C4 /* CALayerExporter.h in Headers */, 66E864001688C2780059C9C4 /* SVGKParserDefsAndUse.h in Headers */, 66E864021688C2780059C9C4 /* SVGKParserDOM.h in Headers */, 66E864041688C2780059C9C4 /* SVGKParserPatternsAndGradients.h in Headers */, @@ -935,6 +2098,8 @@ 66E8640D1688C2780059C9C4 /* SVGKPointsAndPathsParser.h in Headers */, 66E8640F1688C2780059C9C4 /* CALayerWithChildHitTest.h in Headers */, 66E864111688C2780059C9C4 /* CAShapeLayerWithHitTest.h in Headers */, + 663403A4188EFC8A0077005F /* CALayer+RecursiveClone.h in Headers */, + 322A5B7D218BF990003D9CF1 /* SVGKInlineResource.h in Headers */, 66E864131688C2780059C9C4 /* CGPathAdditions.h in Headers */, 66E864151688C2780059C9C4 /* SVGKLayer.h in Headers */, 66E864171688C2780059C9C4 /* SVGKImage.h in Headers */, @@ -956,11 +2121,13 @@ 66988DB3168A001400EC93C7 /* CSSStyleDeclaration.h in Headers */, 66988DB7168A004D00EC93C7 /* CSSValue.h in Headers */, 66988DBB168A027E00EC93C7 /* CSSRule.h in Headers */, + 668418C018674A0300C61EC2 /* SVGKExporterNSData.h in Headers */, 66988DBF168A031200EC93C7 /* CSSStyleSheet.h in Headers */, 66988DC3168A038400EC93C7 /* CSSRuleList.h in Headers */, 66988DC7168A04D100EC93C7 /* CSSRuleList+Mutable.h in Headers */, 66988DCB168A0A2300EC93C7 /* CSSPrimitiveValue.h in Headers */, 66988DCF168A129500EC93C7 /* CSSValueList.h in Headers */, + 32D3D5DA2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */, 66988DD3168A13BD00EC93C7 /* CSSValue_ForSubclasses.h in Headers */, 666674BA168A511400486B68 /* CSSStyleRule.h in Headers */, 666674C1168A556300486B68 /* StyleSheetList.h in Headers */, @@ -970,34 +2137,364 @@ 663FD01416CAEF0D00CCBFB3 /* SVGHelperUtilities.h in Headers */, 663FD01B16CBEF5E00CCBFB3 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */, 661ADBF216CC2FBE006F4BC3 /* SVGTextPositioningElement.h in Headers */, + 321EAA4D2171E51800640504 /* SVGKit-Prefix.pch in Headers */, 661ADBF716CC2FCA006F4BC3 /* SVGTextContentElement.h in Headers */, 661ADBFC16CC364F006F4BC3 /* SVGTextPositioningElement_Mutable.h in Headers */, 661AE44916D13DA8005E69D9 /* SVGTransformable.h in Headers */, 661AE44A16D13DAD005E69D9 /* SVGFitToViewBox.h in Headers */, 036A524C16E87693008C1140 /* NSCharacterSet+SVGKExtensions.h in Headers */, 6636CD8D175F54970072AAEF /* ConverterSVGToCALayer.h in Headers */, - 6636CD7E175F542A0072AAEF /* SVGKSourceLocalFile.h in Headers */, - 6636CD80175F542A0072AAEF /* SVGKSourceString.h in Headers */, - 6636CD82175F542A0072AAEF /* SVGKSourceURL.h in Headers */, - 6636CD8A175F54680072AAEF /* CALayer+RecursiveClone.h in Headers */, - 00E86D631741586600F0FA0A /* DDAbstractDatabaseLogger.h in Headers */, - 00E86D651741586600F0FA0A /* DDASLLogger.h in Headers */, - 00E86D671741586600F0FA0A /* DDFileLogger.h in Headers */, - 00E86D691741586600F0FA0A /* DDLog.h in Headers */, - 00E86D6B1741586600F0FA0A /* DDTTYLogger.h in Headers */, - 00E86D6D1741586600F0FA0A /* ContextFilterLogFormatter.h in Headers */, - 00E86D6F1741586600F0FA0A /* DispatchQueueLogFormatter.h in Headers */, - 6636CD7E175F542A0072AAEF /* SVGKSourceLocalFile.h in Headers */, - 6636CD80175F542A0072AAEF /* SVGKSourceString.h in Headers */, - 6636CD82175F542A0072AAEF /* SVGKSourceURL.h in Headers */, - 6636CD8A175F54680072AAEF /* CALayer+RecursiveClone.h in Headers */, + 66F33DD0182FE1C4004464AC /* SVGPreserveAspectRatio.h in Headers */, + 66F33DD4182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.h in Headers */, 9ED79A24179D87790048AA5B /* SVGGradientLayer.h in Headers */, + BD2F8C51199D0897008AE06D /* SVGClipPathElement.h in Headers */, + BD4C56DC199D55CC00AF04AD /* CAShapeLayerWithClipRender.h in Headers */, + BDA133B719AD0E81003C9945 /* TinySVGTextAreaElement.h in Headers */, + BD2F8C55199D14D6008AE06D /* CALayerWithClipRender.h in Headers */, + 6694B5DD199C10400028CFF6 /* SVGKSourceNSData.h in Headers */, + BD1585731996B13F00461AA5 /* NSData+NSInputStream.h in Headers */, + 4FD821F01AC69F6600E419D3 /* SVGSwitchElement.h in Headers */, + BD0AFF8C19AE442F0001578E /* SVGUnitTypes.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAAC1BDA4BC0003C1C12 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDAF71BDA5057003C1C12 /* AppleSucksDOMImplementation.h in Headers */, + 825CDAF81BDA5057003C1C12 /* Attr.h in Headers */, + 825CDAF91BDA5057003C1C12 /* CDATASection.h in Headers */, + 825CDAFA1BDA5057003C1C12 /* CharacterData.h in Headers */, + 825CDAFB1BDA5057003C1C12 /* Comment.h in Headers */, + 825CDAFC1BDA5057003C1C12 /* CSSStyleDeclaration.h in Headers */, + 825CDAFD1BDA5057003C1C12 /* CSSRule.h in Headers */, + 825CDAFE1BDA5057003C1C12 /* CSSStyleSheet.h in Headers */, + 825CDAFF1BDA5057003C1C12 /* CSSStyleRule.h in Headers */, + 825CDB001BDA5057003C1C12 /* CSSRuleList.h in Headers */, + 825CDB011BDA5057003C1C12 /* CSSRuleList+Mutable.h in Headers */, + 825CDB021BDA5057003C1C12 /* CSSPrimitiveValue.h in Headers */, + 825CDB031BDA5057003C1C12 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */, + 825CDB041BDA5057003C1C12 /* CSSValueList.h in Headers */, + 825CDB051BDA5057003C1C12 /* CSSValue_ForSubclasses.h in Headers */, + 825CDB061BDA5057003C1C12 /* CSSValue.h in Headers */, + 32D3D5DB2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */, + 825CDB071BDA5057003C1C12 /* Document+Mutable.h in Headers */, + 32C4891F21916F3D007B1F29 /* SVGTextLayer.h in Headers */, + 825CDB081BDA5057003C1C12 /* Document.h in Headers */, + 825CDB091BDA5057003C1C12 /* DocumentCSS.h in Headers */, + 825CDB0A1BDA5057003C1C12 /* DocumentStyle.h in Headers */, + 825CDB0B1BDA5058003C1C12 /* StyleSheetList+Mutable.h in Headers */, + 825CDB0C1BDA5058003C1C12 /* StyleSheetList.h in Headers */, + 825CDB0D1BDA5058003C1C12 /* StyleSheet.h in Headers */, + 825CDB0E1BDA5058003C1C12 /* MediaList.h in Headers */, + 825CDB0F1BDA5058003C1C12 /* DocumentFragment.h in Headers */, + 825CDB101BDA5058003C1C12 /* DocumentType.h in Headers */, + 825CDB111BDA5058003C1C12 /* DOMHelperUtilities.h in Headers */, + 825CDB121BDA5058003C1C12 /* Element.h in Headers */, + 825CDB131BDA5058003C1C12 /* EntityReference.h in Headers */, + 825CDB141BDA5058003C1C12 /* NamedNodeMap.h in Headers */, + 825CDB151BDA5058003C1C12 /* NamedNodeMap_Iterable.h in Headers */, + 825CDB161BDA5058003C1C12 /* Node+Mutable.h in Headers */, + 825CDB171BDA5058003C1C12 /* Node.h in Headers */, + 825CDB181BDA5058003C1C12 /* NodeList+Mutable.h in Headers */, + 825CDB191BDA5058003C1C12 /* NodeList.h in Headers */, + 825CDB1A1BDA5058003C1C12 /* ProcessingInstruction.h in Headers */, + 825CDB1B1BDA5058003C1C12 /* Text.h in Headers */, + 825CDB1C1BDA5058003C1C12 /* DOMGlobalSettings.h in Headers */, + 825CDB1D1BDA5058003C1C12 /* SVGAngle.h in Headers */, + 825CDB1E1BDA5059003C1C12 /* SVGAnimatedPreserveAspectRatio.h in Headers */, + 825CDB1F1BDA5059003C1C12 /* SVGClipPathElement.h in Headers */, + 825CDB201BDA5059003C1C12 /* SVGDefsElement.h in Headers */, + 825CDB211BDA5059003C1C12 /* SVGDocument.h in Headers */, + 825CDB221BDA5059003C1C12 /* SVGDocument_Mutable.h in Headers */, + 825CDB231BDA5059003C1C12 /* SVGElementInstance.h in Headers */, + 825CDB241BDA5059003C1C12 /* SVGElementInstance_Mutable.h in Headers */, + 825CDB251BDA5059003C1C12 /* SVGElementInstanceList.h in Headers */, + 825CDB261BDA5059003C1C12 /* SVGElementInstanceList_Internal.h in Headers */, + 825CDB271BDA5059003C1C12 /* SVGGElement.h in Headers */, + 825CDB281BDA5059003C1C12 /* SVGStylable.h in Headers */, + 825CDB291BDA5059003C1C12 /* SVGLength.h in Headers */, + 825CDB2A1BDA5059003C1C12 /* SVGMatrix.h in Headers */, + 32EE37982173441400A23278 /* SVGKDefine.h in Headers */, + 825CDB2B1BDA505A003C1C12 /* SVGNumber.h in Headers */, + 825CDB2C1BDA505A003C1C12 /* SVGPoint.h in Headers */, + 321EAA4E2171E51800640504 /* SVGKit-Prefix.pch in Headers */, + 825CDB2D1BDA505A003C1C12 /* SVGPreserveAspectRatio.h in Headers */, + 825CDB2E1BDA505A003C1C12 /* SVGRect.h in Headers */, + 825CDB2F1BDA505A003C1C12 /* SVGSVGElement_Mutable.h in Headers */, + 825CDB301BDA505A003C1C12 /* SVGTransform.h in Headers */, + 825CDB311BDA505A003C1C12 /* SVGUseElement.h in Headers */, + 825CDB321BDA505A003C1C12 /* SVGUseElement_Mutable.h in Headers */, + 825CDB331BDA505A003C1C12 /* SVGViewSpec.h in Headers */, + 825CDB341BDA505B003C1C12 /* SVGHelperUtilities.h in Headers */, + 825CDB351BDA505B003C1C12 /* SVGTransformable.h in Headers */, + 825CDB361BDA505B003C1C12 /* SVGFitToViewBox.h in Headers */, + 825CDB371BDA505B003C1C12 /* SVGTextPositioningElement.h in Headers */, + 825CDB381BDA505B003C1C12 /* SVGTextContentElement.h in Headers */, + 825CDB391BDA505B003C1C12 /* SVGTextPositioningElement_Mutable.h in Headers */, + 825CDB3A1BDA505B003C1C12 /* SVGUnitTypes.h in Headers */, + 825CDB3B1BDA505B003C1C12 /* ConverterSVGToCALayer.h in Headers */, + 825CDB3C1BDA505C003C1C12 /* SVGGradientElement.h in Headers */, + 825CDB3D1BDA505C003C1C12 /* SVGGradientStop.h in Headers */, + 825CDB3E1BDA505C003C1C12 /* SVGStyleCatcher.h in Headers */, + 825CDB3F1BDA505C003C1C12 /* SVGStyleElement.h in Headers */, + 322A5B80218BFE0F003D9CF1 /* SVGKInlineResource.h in Headers */, + 825CDB401BDA505C003C1C12 /* SVGCircleElement.h in Headers */, + 825CDB411BDA505C003C1C12 /* SVGDescriptionElement.h in Headers */, + 825CDB421BDA505C003C1C12 /* SVGElement.h in Headers */, + 825CDB431BDA505D003C1C12 /* SVGElement_ForParser.h in Headers */, + 825CDB441BDA505D003C1C12 /* SVGEllipseElement.h in Headers */, + 825CDB451BDA505D003C1C12 /* SVGGroupElement.h in Headers */, + 825CDB461BDA505D003C1C12 /* SVGImageElement.h in Headers */, + 825CDB471BDA505D003C1C12 /* SVGLineElement.h in Headers */, + 825CDB481BDA505D003C1C12 /* SVGPathElement.h in Headers */, + 825CDB491BDA505E003C1C12 /* SVGPolygonElement.h in Headers */, + 825CDB4A1BDA505E003C1C12 /* SVGPolylineElement.h in Headers */, + 825CDB4B1BDA505E003C1C12 /* SVGRectElement.h in Headers */, + 825CDB4C1BDA505E003C1C12 /* BaseClassForAllSVGBasicShapes.h in Headers */, + 825CDB4D1BDA505E003C1C12 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */, + 825CDB4E1BDA505E003C1C12 /* SVGSVGElement.h in Headers */, + 825CDB4F1BDA505F003C1C12 /* SVGSwitchElement.h in Headers */, + 825CDB501BDA505F003C1C12 /* SVGTextElement.h in Headers */, + 825CDB511BDA505F003C1C12 /* SVGTitleElement.h in Headers */, + 825CDB521BDA505F003C1C12 /* TinySVGTextAreaElement.h in Headers */, + 825CDB541BDA5060003C1C12 /* SVGKImage+CGContext.h in Headers */, + 825CDB551BDA5060003C1C12 /* SVGKExporterNSData.h in Headers */, + 825CDB561BDA5060003C1C12 /* SVGKExporterUIImage.h in Headers */, + 825CDB571BDA5060003C1C12 /* SVGKSourceLocalFile.h in Headers */, + 825CDB581BDA5061003C1C12 /* SVGKSourceNSData.h in Headers */, + 825CDB591BDA5061003C1C12 /* SVGKSourceString.h in Headers */, + 825CDB5A1BDA5061003C1C12 /* SVGKSourceURL.h in Headers */, + 825CDB5B1BDA5061003C1C12 /* SVGKParserDefsAndUse.h in Headers */, + 825CDB5C1BDA5062003C1C12 /* SVGKParserDOM.h in Headers */, + 825CDB5D1BDA5062003C1C12 /* SVGKParserGradient.h in Headers */, + 825CDB5E1BDA5062003C1C12 /* SVGKParserPatternsAndGradients.h in Headers */, + 825CDB5F1BDA5062003C1C12 /* SVGKParserStyles.h in Headers */, + 825CDB601BDA5063003C1C12 /* SVGKParserSVG.h in Headers */, + 825CDB611BDA5063003C1C12 /* SVGKParser.h in Headers */, + 825CDB621BDA5063003C1C12 /* SVGKParseResult.h in Headers */, + 825CDB631BDA5063003C1C12 /* SVGKParserExtension.h in Headers */, + 825CDB641BDA5064003C1C12 /* SVGKPointsAndPathsParser.h in Headers */, + 825CDB651BDA5064003C1C12 /* CALayer+RecursiveClone.h in Headers */, + 825CDB661BDA5064003C1C12 /* SVGGradientLayer.h in Headers */, + 825CDB671BDA5064003C1C12 /* CALayerWithClipRender.h in Headers */, + 825CDB681BDA5065003C1C12 /* CAShapeLayerWithClipRender.h in Headers */, + 825CDB691BDA5065003C1C12 /* CALayerWithChildHitTest.h in Headers */, + 825CDB6A1BDA5065003C1C12 /* CAShapeLayerWithHitTest.h in Headers */, + 825CDB6B1BDA5066003C1C12 /* CGPathAdditions.h in Headers */, + 825CDB6C1BDA5066003C1C12 /* SVGKLayer.h in Headers */, + 825CDB6D1BDA5066003C1C12 /* SVGKImage.h in Headers */, + 825CDB6E1BDA5067003C1C12 /* SVGKit.h in Headers */, + 825CDB6F1BDA5067003C1C12 /* SVGKSource.h in Headers */, + 825CDB701BDA5067003C1C12 /* NSCharacterSet+SVGKExtensions.h in Headers */, + 32D3D5E02176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */, + 825CDB711BDA5068003C1C12 /* SVGKFastImageView.h in Headers */, + 825CDB721BDA5068003C1C12 /* SVGKImageView.h in Headers */, + 825CDB731BDA5069003C1C12 /* SVGKLayeredImageView.h in Headers */, + 825CDB741BDA5069003C1C12 /* NSData+NSInputStream.h in Headers */, + 825CDB751BDA5069003C1C12 /* SVGKPattern.h in Headers */, + 825CDB761BDA506A003C1C12 /* SVGUtils.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAD01BDA4D38003C1C12 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDB771BDA50B3003C1C12 /* AppleSucksDOMImplementation.h in Headers */, + 825CDB781BDA50B3003C1C12 /* Attr.h in Headers */, + 825CDB791BDA50B3003C1C12 /* CDATASection.h in Headers */, + 825CDB7A1BDA50B3003C1C12 /* CharacterData.h in Headers */, + 825CDB7B1BDA50B3003C1C12 /* Comment.h in Headers */, + 825CDB7C1BDA50B3003C1C12 /* CSSStyleDeclaration.h in Headers */, + 825CDB7D1BDA50B3003C1C12 /* CSSRule.h in Headers */, + 825CDB7E1BDA50B3003C1C12 /* CSSStyleSheet.h in Headers */, + 825CDB7F1BDA50B3003C1C12 /* CSSStyleRule.h in Headers */, + 825CDB801BDA50B3003C1C12 /* CSSRuleList.h in Headers */, + 825CDB811BDA50B3003C1C12 /* CSSRuleList+Mutable.h in Headers */, + 825CDB821BDA50B3003C1C12 /* CSSPrimitiveValue.h in Headers */, + 825CDB831BDA50B3003C1C12 /* CSSPrimitiveValue_ConfigurablePixelsPerInch.h in Headers */, + 825CDB841BDA50B3003C1C12 /* CSSValueList.h in Headers */, + 825CDB851BDA50B3003C1C12 /* CSSValue_ForSubclasses.h in Headers */, + 825CDB861BDA50B3003C1C12 /* CSSValue.h in Headers */, + 32D3D5DC2176E00E00ED20D8 /* SVGLinearGradientElement.h in Headers */, + 825CDB871BDA50B3003C1C12 /* Document+Mutable.h in Headers */, + 32C4892021916F3D007B1F29 /* SVGTextLayer.h in Headers */, + 825CDB881BDA50B3003C1C12 /* Document.h in Headers */, + 825CDB891BDA50B3003C1C12 /* DocumentCSS.h in Headers */, + 825CDB8A1BDA50B3003C1C12 /* DocumentStyle.h in Headers */, + 825CDB8B1BDA50B3003C1C12 /* StyleSheetList+Mutable.h in Headers */, + 825CDB8C1BDA50B3003C1C12 /* StyleSheetList.h in Headers */, + 825CDB8D1BDA50B3003C1C12 /* StyleSheet.h in Headers */, + 825CDB8E1BDA50B3003C1C12 /* MediaList.h in Headers */, + 825CDB8F1BDA50B3003C1C12 /* DocumentFragment.h in Headers */, + 825CDB901BDA50B3003C1C12 /* DocumentType.h in Headers */, + 825CDB911BDA50B3003C1C12 /* DOMHelperUtilities.h in Headers */, + 825CDB921BDA50B3003C1C12 /* Element.h in Headers */, + 825CDB931BDA50B3003C1C12 /* EntityReference.h in Headers */, + 825CDB941BDA50B3003C1C12 /* NamedNodeMap.h in Headers */, + 825CDB951BDA50B3003C1C12 /* NamedNodeMap_Iterable.h in Headers */, + 825CDB961BDA50B3003C1C12 /* Node+Mutable.h in Headers */, + 825CDB971BDA50B4003C1C12 /* Node.h in Headers */, + 825CDB981BDA50B4003C1C12 /* NodeList+Mutable.h in Headers */, + 825CDB991BDA50B4003C1C12 /* NodeList.h in Headers */, + 825CDB9A1BDA50B4003C1C12 /* ProcessingInstruction.h in Headers */, + 825CDB9B1BDA50B4003C1C12 /* Text.h in Headers */, + 825CDB9C1BDA50B4003C1C12 /* DOMGlobalSettings.h in Headers */, + 825CDB9D1BDA50B4003C1C12 /* SVGAngle.h in Headers */, + 825CDB9E1BDA50B4003C1C12 /* SVGAnimatedPreserveAspectRatio.h in Headers */, + 825CDB9F1BDA50B4003C1C12 /* SVGClipPathElement.h in Headers */, + 825CDBA01BDA50B4003C1C12 /* SVGDefsElement.h in Headers */, + 825CDBA11BDA50B4003C1C12 /* SVGDocument.h in Headers */, + 825CDBA21BDA50B4003C1C12 /* SVGDocument_Mutable.h in Headers */, + 825CDBA31BDA50B4003C1C12 /* SVGElementInstance.h in Headers */, + 825CDBA41BDA50B4003C1C12 /* SVGElementInstance_Mutable.h in Headers */, + 825CDBA51BDA50B5003C1C12 /* SVGElementInstanceList.h in Headers */, + 825CDBA61BDA50B5003C1C12 /* SVGElementInstanceList_Internal.h in Headers */, + 825CDBA71BDA50B5003C1C12 /* SVGGElement.h in Headers */, + 825CDBA81BDA50B5003C1C12 /* SVGStylable.h in Headers */, + 825CDBA91BDA50B5003C1C12 /* SVGLength.h in Headers */, + 825CDBAA1BDA50B5003C1C12 /* SVGMatrix.h in Headers */, + 32EE37992173441400A23278 /* SVGKDefine.h in Headers */, + 825CDBAB1BDA50B5003C1C12 /* SVGNumber.h in Headers */, + 825CDBAC1BDA50B5003C1C12 /* SVGPoint.h in Headers */, + 321EAA4F2171E51800640504 /* SVGKit-Prefix.pch in Headers */, + 825CDBAD1BDA50B5003C1C12 /* SVGPreserveAspectRatio.h in Headers */, + 825CDBAE1BDA50B5003C1C12 /* SVGRect.h in Headers */, + 825CDBAF1BDA50B5003C1C12 /* SVGSVGElement_Mutable.h in Headers */, + 825CDBB01BDA50B6003C1C12 /* SVGTransform.h in Headers */, + 825CDBB11BDA50B6003C1C12 /* SVGUseElement.h in Headers */, + 825CDBB21BDA50B6003C1C12 /* SVGUseElement_Mutable.h in Headers */, + 825CDBB31BDA50B6003C1C12 /* SVGViewSpec.h in Headers */, + 825CDBB41BDA50B6003C1C12 /* SVGHelperUtilities.h in Headers */, + 825CDBB51BDA50B6003C1C12 /* SVGTransformable.h in Headers */, + 825CDBB61BDA50B6003C1C12 /* SVGFitToViewBox.h in Headers */, + 825CDBB71BDA50B6003C1C12 /* SVGTextPositioningElement.h in Headers */, + 825CDBB81BDA50B7003C1C12 /* SVGTextContentElement.h in Headers */, + 825CDBB91BDA50B7003C1C12 /* SVGTextPositioningElement_Mutable.h in Headers */, + 825CDBBA1BDA50B7003C1C12 /* SVGUnitTypes.h in Headers */, + 825CDBBB1BDA50B7003C1C12 /* ConverterSVGToCALayer.h in Headers */, + 825CDBBC1BDA50B7003C1C12 /* SVGGradientElement.h in Headers */, + 825CDBBD1BDA50B7003C1C12 /* SVGGradientStop.h in Headers */, + 825CDBBE1BDA50B7003C1C12 /* SVGStyleCatcher.h in Headers */, + 825CDBBF1BDA50B7003C1C12 /* SVGStyleElement.h in Headers */, + 322A5B81218BFE10003D9CF1 /* SVGKInlineResource.h in Headers */, + 825CDBC01BDA50B8003C1C12 /* SVGCircleElement.h in Headers */, + 825CDBC11BDA50B8003C1C12 /* SVGDescriptionElement.h in Headers */, + 825CDBC21BDA50B8003C1C12 /* SVGElement.h in Headers */, + 825CDBC31BDA50B8003C1C12 /* SVGElement_ForParser.h in Headers */, + 825CDBC41BDA50B8003C1C12 /* SVGEllipseElement.h in Headers */, + 825CDBC51BDA50B8003C1C12 /* SVGGroupElement.h in Headers */, + 825CDBC61BDA50B9003C1C12 /* SVGImageElement.h in Headers */, + 825CDBC71BDA50B9003C1C12 /* SVGLineElement.h in Headers */, + 825CDBC81BDA50B9003C1C12 /* SVGPathElement.h in Headers */, + 825CDBC91BDA50B9003C1C12 /* SVGPolygonElement.h in Headers */, + 825CDBCA1BDA50B9003C1C12 /* SVGPolylineElement.h in Headers */, + 825CDBCB1BDA50B9003C1C12 /* SVGRectElement.h in Headers */, + 825CDBCC1BDA50BA003C1C12 /* BaseClassForAllSVGBasicShapes.h in Headers */, + 825CDBCD1BDA50BA003C1C12 /* BaseClassForAllSVGBasicShapes_ForSubclasses.h in Headers */, + 825CDBCE1BDA50BA003C1C12 /* SVGSVGElement.h in Headers */, + 825CDBCF1BDA50BA003C1C12 /* SVGSwitchElement.h in Headers */, + 825CDBD01BDA50BA003C1C12 /* SVGTextElement.h in Headers */, + 825CDBD11BDA50BB003C1C12 /* SVGTitleElement.h in Headers */, + 825CDBD21BDA50BB003C1C12 /* TinySVGTextAreaElement.h in Headers */, + 825CDBD41BDA50BB003C1C12 /* SVGKImage+CGContext.h in Headers */, + 825CDBD51BDA50BB003C1C12 /* SVGKExporterNSData.h in Headers */, + 825CDBD61BDA50BC003C1C12 /* SVGKExporterUIImage.h in Headers */, + 825CDBD71BDA50BC003C1C12 /* SVGKSourceLocalFile.h in Headers */, + 825CDBD81BDA50BC003C1C12 /* SVGKSourceNSData.h in Headers */, + 825CDBD91BDA50BC003C1C12 /* SVGKSourceString.h in Headers */, + 825CDBDA1BDA50BD003C1C12 /* SVGKSourceURL.h in Headers */, + 825CDBDB1BDA50BD003C1C12 /* SVGKParserDefsAndUse.h in Headers */, + 825CDBDC1BDA50BD003C1C12 /* SVGKParserDOM.h in Headers */, + 825CDBDD1BDA50BD003C1C12 /* SVGKParserGradient.h in Headers */, + 825CDBDE1BDA50BE003C1C12 /* SVGKParserPatternsAndGradients.h in Headers */, + 825CDBDF1BDA50BE003C1C12 /* SVGKParserStyles.h in Headers */, + 825CDBE01BDA50BE003C1C12 /* SVGKParserSVG.h in Headers */, + 825CDBE11BDA50BE003C1C12 /* SVGKParser.h in Headers */, + 825CDBE21BDA50BF003C1C12 /* SVGKParseResult.h in Headers */, + 825CDBE31BDA50BF003C1C12 /* SVGKParserExtension.h in Headers */, + 825CDBE41BDA50BF003C1C12 /* SVGKPointsAndPathsParser.h in Headers */, + 825CDBE51BDA50BF003C1C12 /* CALayer+RecursiveClone.h in Headers */, + 825CDBE61BDA50C0003C1C12 /* SVGGradientLayer.h in Headers */, + 825CDBE71BDA50C0003C1C12 /* CALayerWithClipRender.h in Headers */, + 825CDBE81BDA50C0003C1C12 /* CAShapeLayerWithClipRender.h in Headers */, + 825CDBE91BDA50C1003C1C12 /* CALayerWithChildHitTest.h in Headers */, + 825CDBEA1BDA50C1003C1C12 /* CAShapeLayerWithHitTest.h in Headers */, + 825CDBEB1BDA50C1003C1C12 /* CGPathAdditions.h in Headers */, + 825CDBEC1BDA50C1003C1C12 /* SVGKLayer.h in Headers */, + 825CDBED1BDA50C2003C1C12 /* SVGKImage.h in Headers */, + 825CDBEE1BDA50C2003C1C12 /* SVGKit.h in Headers */, + 825CDBEF1BDA50C2003C1C12 /* SVGKSource.h in Headers */, + 825CDBF01BDA50C3003C1C12 /* NSCharacterSet+SVGKExtensions.h in Headers */, + 32D3D5E12176E01400ED20D8 /* SVGRadialGradientElement.h in Headers */, + 825CDBF11BDA50C3003C1C12 /* SVGKFastImageView.h in Headers */, + 825CDBF21BDA50C4003C1C12 /* SVGKImageView.h in Headers */, + 825CDBF31BDA50C4003C1C12 /* SVGKLayeredImageView.h in Headers */, + 825CDBF41BDA50C4003C1C12 /* NSData+NSInputStream.h in Headers */, + 825CDBF51BDA50C5003C1C12 /* SVGKPattern.h in Headers */, + 825CDBF61BDA50C5003C1C12 /* SVGUtils.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 321EAA612171EC8700640504 /* SVGKitFramework-OSX */ = { + isa = PBXNativeTarget; + buildConfigurationList = 321EAA672171EC8700640504 /* Build configuration list for PBXNativeTarget "SVGKitFramework-OSX" */; + buildPhases = ( + 321EAA5D2171EC8700640504 /* Headers */, + 321EAA5E2171EC8700640504 /* Sources */, + 321EAA5F2171EC8700640504 /* Frameworks */, + 321EAA602171EC8700640504 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SVGKitFramework-OSX"; + productName = SVGKit; + productReference = 321EAA622171EC8700640504 /* SVGKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 32A1F09B21746F4700ABFCE1 /* SVGKitFramework-OSXTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 32A1F0A621746F4700ABFCE1 /* Build configuration list for PBXNativeTarget "SVGKitFramework-OSXTests" */; + buildPhases = ( + 32A1F09821746F4700ABFCE1 /* Sources */, + 32A1F09921746F4700ABFCE1 /* Frameworks */, + 32A1F09A21746F4700ABFCE1 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 32A1F0A321746F4700ABFCE1 /* PBXTargetDependency */, + ); + name = "SVGKitFramework-OSXTests"; + productName = "SVGKitFramework-OSXTests"; + productReference = 32A1F09C21746F4700ABFCE1 /* SVGKitFramework-OSXTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 55452BF019EC68A200B75A30 /* SVGKit-iOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 55452BFC19EC68A200B75A30 /* Build configuration list for PBXNativeTarget "SVGKit-iOS Tests" */; + buildPhases = ( + 55452BED19EC68A200B75A30 /* Sources */, + 55452BEE19EC68A200B75A30 /* Frameworks */, + 55452BEF19EC68A200B75A30 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 55452BF919EC68A200B75A30 /* PBXTargetDependency */, + ); + name = "SVGKit-iOS Tests"; + productName = "SVGKit-iOS Tests"; + productReference = 55452BF119EC68A200B75A30 /* SVGKit-iOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 6639618D16145D0400E58CCA /* SVGKit-iOS */ = { isa = PBXNativeTarget; buildConfigurationList = 6639619C16145D0400E58CCA /* Build configuration list for PBXNativeTarget "SVGKit-iOS" */; @@ -1014,17 +2511,115 @@ ); name = "SVGKit-iOS"; productName = "SVGKit-iOS"; - productReference = 6639618E16145D0400E58CCA /* libSVGKit-iOS.1.1.0.a */; + productReference = 6639618E16145D0400E58CCA /* libSVGKit-iOS.2.1.0.a */; productType = "com.apple.product-type.library.static"; }; + 825CDAAE1BDA4BC0003C1C12 /* SVGKitFramework-iOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 825CDAC41BDA4BC0003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-iOS" */; + buildPhases = ( + 825CDAAA1BDA4BC0003C1C12 /* Sources */, + 825CDAAB1BDA4BC0003C1C12 /* Frameworks */, + 825CDAAC1BDA4BC0003C1C12 /* Headers */, + 825CDAAD1BDA4BC0003C1C12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SVGKitFramework-iOS"; + productName = "SVGKitFramework-iOS"; + productReference = 825CDAAF1BDA4BC0003C1C12 /* SVGKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 825CDAB71BDA4BC0003C1C12 /* SVGKitFramework-iOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 825CDAC51BDA4BC0003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-iOSTests" */; + buildPhases = ( + 825CDAB41BDA4BC0003C1C12 /* Sources */, + 825CDAB51BDA4BC0003C1C12 /* Frameworks */, + 825CDAB61BDA4BC0003C1C12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 825CDABB1BDA4BC0003C1C12 /* PBXTargetDependency */, + ); + name = "SVGKitFramework-iOSTests"; + productName = "SVGKitFramework-iOSTests"; + productReference = 825CDAB81BDA4BC0003C1C12 /* SVGKitFramework-iOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 825CDAD21BDA4D38003C1C12 /* SVGKitFramework-tvOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 825CDAE41BDA4D39003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-tvOS" */; + buildPhases = ( + 825CDACE1BDA4D38003C1C12 /* Sources */, + 825CDACF1BDA4D38003C1C12 /* Frameworks */, + 825CDAD01BDA4D38003C1C12 /* Headers */, + 825CDAD11BDA4D38003C1C12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "SVGKitFramework-tvOS"; + productName = "SVGKitFramework-tvOS"; + productReference = 825CDAD31BDA4D38003C1C12 /* SVGKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 825CDADB1BDA4D38003C1C12 /* SVGKitFramework-tvOSTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 825CDAE71BDA4D39003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-tvOSTests" */; + buildPhases = ( + 825CDAD81BDA4D38003C1C12 /* Sources */, + 825CDAD91BDA4D38003C1C12 /* Frameworks */, + 825CDADA1BDA4D38003C1C12 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 825CDADF1BDA4D38003C1C12 /* PBXTargetDependency */, + ); + name = "SVGKitFramework-tvOSTests"; + productName = "SVGKitFramework-tvOSTests"; + productReference = 825CDADC1BDA4D38003C1C12 /* SVGKitFramework-tvOSTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 6639618516145D0400E58CCA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0440; + DefaultBuildSystemTypeForWorkspace = Original; + LastUpgradeCheck = 0720; ORGANIZATIONNAME = na; + TargetAttributes = { + 321EAA612171EC8700640504 = { + CreatedOnToolsVersion = 10.0; + ProvisioningStyle = Automatic; + }; + 32A1F09B21746F4700ABFCE1 = { + CreatedOnToolsVersion = 10.0; + ProvisioningStyle = Automatic; + }; + 55452BF019EC68A200B75A30 = { + CreatedOnToolsVersion = 6.1; + }; + 825CDAAE1BDA4BC0003C1C12 = { + CreatedOnToolsVersion = 7.1; + }; + 825CDAB71BDA4BC0003C1C12 = { + CreatedOnToolsVersion = 7.1; + }; + 825CDAD21BDA4D38003C1C12 = { + CreatedOnToolsVersion = 7.1; + }; + 825CDADB1BDA4D38003C1C12 = { + CreatedOnToolsVersion = 7.1; + }; + }; }; buildConfigurationList = 6639618816145D0400E58CCA /* Build configuration list for PBXProject "SVGKit-iOS" */; compatibilityVersion = "Xcode 3.2"; @@ -1032,6 +2627,7 @@ hasScannedForEncodings = 0; knownRegions = ( en, + English, ); mainGroup = 6639618316145D0400E58CCA; productRefGroup = 6639618F16145D0400E58CCA /* Products */; @@ -1039,10 +2635,69 @@ projectRoot = ""; targets = ( 6639618D16145D0400E58CCA /* SVGKit-iOS */, + 55452BF019EC68A200B75A30 /* SVGKit-iOS Tests */, + 825CDAAE1BDA4BC0003C1C12 /* SVGKitFramework-iOS */, + 825CDAB71BDA4BC0003C1C12 /* SVGKitFramework-iOSTests */, + 825CDAD21BDA4D38003C1C12 /* SVGKitFramework-tvOS */, + 825CDADB1BDA4D38003C1C12 /* SVGKitFramework-tvOSTests */, + 321EAA612171EC8700640504 /* SVGKitFramework-OSX */, + 32A1F09B21746F4700ABFCE1 /* SVGKitFramework-OSXTests */, ); }; /* End PBXProject section */ +/* Begin PBXResourcesBuildPhase section */ + 321EAA602171EC8700640504 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 32A1F09A21746F4700ABFCE1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 55452BEF19EC68A200B75A30 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAAD1BDA4BC0003C1C12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAB61BDA4BC0003C1C12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAD11BDA4D38003C1C12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDADA1BDA4D38003C1C12 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + /* Begin PBXShellScriptBuildPhase section */ 663963481614968A00E58CCA /* ShellScript */ = { isa = PBXShellScriptBuildPhase; @@ -1055,22 +2710,152 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#\n# c.f. StackOverflow question/answer here: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4\n#\n# Version 2.3\n#\n# Latest Change:\n# - Apple's handling of \"project files\" is broken; added a workaround for Xcode 4.5\n# - Added automatic FAIL BUILD if any of the internal commands fail\n# \n# Purpose:\n# Create a static library for iPhone from within XCode\n# Because Apple staff DELIBERATELY broke Xcode to make this impossible from the GUI (Xcode 3.2.3 specifically states this in the Release notes!)\n# ...no, I don't understand why they did this!\n#\n# Author: Adam Martin - http://twitter.com/redglassesapps\n# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)\n#\n\nset -e\nset -o pipefail\n\n#################[ Tests: helps workaround any future bugs in Xcode ]########\n#\nDEBUG_THIS_SCRIPT=\"true\"\n\nif [ $DEBUG_THIS_SCRIPT = \"true\" ]\nthen\necho \"########### TESTS #############\"\necho \"Use the following variables when debugging this script; note that they may change on recursions\"\necho \"BUILD_DIR = $BUILD_DIR\"\necho \"BUILD_ROOT = $BUILD_ROOT\"\necho \"CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR\"\necho \"BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR\"\necho \"CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR\"\necho \"TARGET_BUILD_DIR = $TARGET_BUILD_DIR\"\nfi\n\n#####################[ part 1 ]##################\n# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)\n# (incidental: searching for substrings in sh is a nightmare! Sob)\n\nSDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\\{3\\}$')\n\n# Next, work out if we're in SIM or DEVICE\n\nif [ ${PLATFORM_NAME} = \"iphonesimulator\" ]\nthen\nOTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}\nelse\nOTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}\nfi\n\necho \"XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})\"\necho \"...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}\"\n#\n#####################[ end of part 1 ]##################\n\n#####################[ part 2 ]##################\n#\n# IF this is the original invocation, invoke WHATEVER other builds are required\n#\n# Xcode is already building ONE target...\n#\n# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.\n# ...we need to build ALL targets\n# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)\n#\n#\n# So: build ONLY the missing platforms/configurations.\n\nif [ \"true\" == ${ALREADYINVOKED:-false} ]\nthen\necho \"RECURSION: I am NOT the root invocation, so I'm NOT going to recurse\"\nelse\n# CRITICAL:\n# Prevent infinite recursion (Xcode sucks)\nexport ALREADYINVOKED=\"true\"\n\necho \"RECURSION: I am the root ... recursing all missing build targets NOW...\"\necho \"RECURSION: ...about to invoke: xcodebuild -configuration \\\"${CONFIGURATION}\\\" -project \\\"${PROJECT_NAME}.xcodeproj\\\" -target \\\"${TARGET_NAME}\\\" -sdk \\\"${OTHER_SDK_TO_BUILD}\\\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO\" BUILD_DIR=\\\"${BUILD_DIR}\\\" BUILD_ROOT=\\\"${BUILD_ROOT}\\\"\n\nxcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\"\n\nACTION=\"build\"\n\n#Merge all platform binaries as a fat binary for each configurations.\n\n# Calculate where the (multiple) built files are coming from:\nCURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos\nCURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator\n\necho \"Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}\"\necho \"Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}\"\n\nCREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal\necho \"...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}\"\n\n# ... remove the products of previous runs of this script\n# NB: this directory is ONLY created by this script - it should be safe to delete!\n\nrm -rf \"${CREATING_UNIVERSAL_DIR}\"\nmkdir \"${CREATING_UNIVERSAL_DIR}\"\n\n#\necho \"Abou to call: lipo -create -output \\\"${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}\\\" \\\"${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}\\\" \\\"${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}\\\"\"\n\nlipo -create -output \"${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}\" \"${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}\" \"${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}\"\n\n#########\n#\n# Added: StackOverflow suggestion to also copy \"include\" files\n# (untested, but should work OK)\n#\nif [ -d \"${CURRENTCONFIG_DEVICE_DIR}/usr/local/include\" ]\nthen\nmkdir -p \"${CREATING_UNIVERSAL_DIR}/usr/local/include\"\n# * needs to be outside the double quotes?\ncp -r \"${CURRENTCONFIG_DEVICE_DIR}/usr/local/include/\"* \"${CREATING_UNIVERSAL_DIR}/usr/local/include\"\nfi\nfi\n"; + shellScript = "#\n# c.f. StackOverflow question/answer here: http://stackoverflow.com/questions/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4\n#\n# Version 2.3\n#\n# Latest Change:\n# - Apple's handling of \"project files\" is broken; added a workaround for Xcode 4.5\n# - Added automatic FAIL BUILD if any of the internal commands fail\n# \n# Purpose:\n# Create a static library for iPhone from within XCode\n# Because Apple staff DELIBERATELY broke Xcode to make this impossible from the GUI (Xcode 3.2.3 specifically states this in the Release notes!)\n# ...no, I don't understand why they did this!\n#\n# Author: Adam Martin - http://twitter.com/redglassesapps\n# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)\n#\n\nset -e\nset -o pipefail\n\n#################[ Tests: helps workaround any future bugs in Xcode ]########\n#\nDEBUG_THIS_SCRIPT=\"true\"\n\nif [ $DEBUG_THIS_SCRIPT = \"true\" ]\nthen\necho \"########### TESTS #############\"\necho \"Use the following variables when debugging this script; note that they may change on recursions\"\necho \"BUILD_DIR = $BUILD_DIR\"\necho \"BUILD_ROOT = $BUILD_ROOT\"\necho \"CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR\"\necho \"BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR\"\necho \"CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR\"\necho \"TARGET_BUILD_DIR = $TARGET_BUILD_DIR\"\nfi\n\n#####################[ part 1 ]##################\n# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)\n# (incidental: searching for substrings in sh is a nightmare! Sob)\n\nSDK_VERSION=$(echo ${SDK_NAME} | grep -o '\\d\\{1,2\\}\\.\\d\\{1,2\\}$')\n\n# Next, work out if we're in SIM or DEVICE\n\nif [ ${PLATFORM_NAME} = \"iphonesimulator\" ]\nthen\nOTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}\nelse\nOTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}\nfi\n\necho \"XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})\"\necho \"...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}\"\n#\n#####################[ end of part 1 ]##################\n\n#####################[ part 2 ]##################\n#\n# IF this is the original invocation, invoke WHATEVER other builds are required\n#\n# Xcode is already building ONE target...\n#\n# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.\n# ...we need to build ALL targets\n# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)\n#\n#\n# So: build ONLY the missing platforms/configurations.\n\nif [ \"true\" == ${ALREADYINVOKED:-false} ]\nthen\necho \"RECURSION: I am NOT the root invocation, so I'm NOT going to recurse\"\nelse\n# CRITICAL:\n# Prevent infinite recursion (Xcode sucks)\nexport ALREADYINVOKED=\"true\"\n\necho \"RECURSION: I am the root ... recursing all missing build targets NOW...\"\necho \"RECURSION: ...about to invoke: xcodebuild -configuration \\\"${CONFIGURATION}\\\" -project \\\"${PROJECT_NAME}.xcodeproj\\\" -target \\\"${TARGET_NAME}\\\" -sdk \\\"${OTHER_SDK_TO_BUILD}\\\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO\" BUILD_DIR=\\\"${BUILD_DIR}\\\" BUILD_ROOT=\\\"${BUILD_ROOT}\\\"\n\nxcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\"\n\nACTION=\"build\"\n\n#Merge all platform binaries as a fat binary for each configurations.\n\n# Calculate where the (multiple) built files are coming from:\nCURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos\nCURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator\n\necho \"Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}\"\necho \"Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}\"\n\nCREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal\necho \"...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}\"\n\n# ... remove the products of previous runs of this script\n# NB: this directory is ONLY created by this script - it should be safe to delete!\n\nrm -rf \"${CREATING_UNIVERSAL_DIR}\"\nmkdir \"${CREATING_UNIVERSAL_DIR}\"\n\n#\necho \"Abou to call: lipo -create -output \\\"${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}\\\" \\\"${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}\\\" \\\"${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}\\\"\"\n\nlipo -create -output \"${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}\" \"${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}\" \"${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}\"\n\n#########\n#\n# Added: StackOverflow suggestion to also copy \"include\" files\n# (untested, but should work OK)\n#\nif [ -d \"${CURRENTCONFIG_DEVICE_DIR}/usr/local/include\" ]\nthen\nmkdir -p \"${CREATING_UNIVERSAL_DIR}/usr/local/include\"\n# * needs to be outside the double quotes?\ncp -r \"${CURRENTCONFIG_DEVICE_DIR}/usr/local/include/\"* \"${CREATING_UNIVERSAL_DIR}/usr/local/include\"\nfi\nfi\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 321EAA5E2171EC8700640504 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 32F206DC217324BB00427F24 /* SVGKExporterNSImage.m in Sources */, + 321EAB692172029800640504 /* SVGKFastImageView.m in Sources */, + 321EAB6A2172029800640504 /* SVGKImageView.m in Sources */, + 321EAB6B2172029800640504 /* SVGKLayeredImageView.m in Sources */, + 32C4892521916F3D007B1F29 /* SVGTextLayer.m in Sources */, + 321EAADA2171ED6F00640504 /* SVGTextPositioningElement.m in Sources */, + 321EAAC42171ED6F00640504 /* SVGLength.m in Sources */, + 321EAB0A2171ED7E00640504 /* TinySVGTextAreaElement.m in Sources */, + 321EAAB42171ED6F00640504 /* SVGClipPathElement.m in Sources */, + 321EAAB02171ED6F00640504 /* SVGAngle.m in Sources */, + 321EAA9A2171ED6900640504 /* DocumentType.m in Sources */, + 322A5B86218BFF77003D9CF1 /* SVGKInlineResource.m in Sources */, + 321EAB372171ED9600640504 /* CALayerWithChildHitTest.m in Sources */, + 321EAAAB2171ED6900640504 /* ProcessingInstruction.m in Sources */, + 321EAAC62171ED6F00640504 /* SVGMatrix.m in Sources */, + 321EAB1A2171ED8700640504 /* SVGKSourceURL.m in Sources */, + 321EAAF32171ED7E00640504 /* SVGImageElement.m in Sources */, + 321EAAE62171ED7E00640504 /* SVGStyleElement.m in Sources */, + 321EAB1C2171ED8D00640504 /* SVGKParserDefsAndUse.m in Sources */, + 321EAAA92171ED6900640504 /* NodeList.m in Sources */, + 321EAB2D2171ED9100640504 /* SVGKPointsAndPathsParser.m in Sources */, + 321EAB392171ED9600640504 /* CAShapeLayerWithHitTest.m in Sources */, + 327B2896217DAC73004D27FC /* SVGLinearGradientElement.m in Sources */, + 321EAAD22171ED6F00640504 /* SVGUseElement.m in Sources */, + 321EAB042171ED7E00640504 /* SVGSwitchElement.m in Sources */, + 321EAAE32171ED7E00640504 /* SVGGradientStop.m in Sources */, + 321EAA792171ED6900640504 /* CSSStyleDeclaration.m in Sources */, + 321EAA942171ED6900640504 /* StyleSheet.m in Sources */, + 321EAA712171ED6900640504 /* Attr.m in Sources */, + 321EAAEF2171ED7E00640504 /* SVGEllipseElement.m in Sources */, + 321EAA842171ED6900640504 /* CSSPrimitiveValue.m in Sources */, + 321EAA872171ED6900640504 /* CSSValueList.m in Sources */, + 321EAB242171ED8D00640504 /* SVGKParserStyles.m in Sources */, + 321EAB2A2171ED9100640504 /* SVGKParseResult.m in Sources */, + 321EAAA02171ED6900640504 /* EntityReference.m in Sources */, + 321EAA752171ED6900640504 /* CharacterData.m in Sources */, + 321EAB202171ED8D00640504 /* SVGKParserGradient.m in Sources */, + 321EAA7E2171ED6900640504 /* CSSStyleRule.m in Sources */, + 321EAAF92171ED7E00640504 /* SVGPolygonElement.m in Sources */, + 321EAB2F2171ED9600640504 /* CALayer+RecursiveClone.m in Sources */, + 321EAB462171ED9E00640504 /* NSCharacterSet+SVGKExtensions.m in Sources */, + 321EAB312171ED9600640504 /* SVGGradientLayer.m in Sources */, + 321EAB612171FB8100640504 /* SVGKImageRep.m in Sources */, + 321EAB3F2171ED9900640504 /* SVGKImage.m in Sources */, + 321EAB142171ED8700640504 /* SVGKSourceLocalFile.m in Sources */, + 321EAAAD2171ED6900640504 /* Text.m in Sources */, + 321EAADC2171ED6F00640504 /* SVGTextContentElement.m in Sources */, + 321EAA8A2171ED6900640504 /* CSSValue.m in Sources */, + 321EAA982171ED6900640504 /* DocumentFragment.m in Sources */, + 321EAB1E2171ED8D00640504 /* SVGKParserDOM.m in Sources */, + 321EAA922171ED6900640504 /* StyleSheetList.m in Sources */, + 321EAB102171ED8200640504 /* SVGKExporterNSData.m in Sources */, + 321EAAC92171ED6F00640504 /* SVGPoint.m in Sources */, + 321EAB3B2171ED9600640504 /* CGPathAdditions.m in Sources */, + 321EAAA22171ED6900640504 /* NamedNodeMap.m in Sources */, + 321EAAB22171ED6F00640504 /* SVGAnimatedPreserveAspectRatio.m in Sources */, + 321EAACB2171ED6F00640504 /* SVGPreserveAspectRatio.m in Sources */, + 321EAA7B2171ED6900640504 /* CSSRule.m in Sources */, + 321EAAF52171ED7E00640504 /* SVGLineElement.m in Sources */, + 321EAAD62171ED6F00640504 /* SVGHelperUtilities.m in Sources */, + 321EAABE2171ED6F00640504 /* SVGElementInstanceList.m in Sources */, + 321EAB182171ED8700640504 /* SVGKSourceString.m in Sources */, + 321EAB062171ED7E00640504 /* SVGTextElement.m in Sources */, + 321EAA9E2171ED6900640504 /* Element.m in Sources */, + 321EAB262171ED8D00640504 /* SVGKParserSVG.m in Sources */, + 321EAB432171ED9900640504 /* SVGKSource.m in Sources */, + 321EAB4E2171ED9E00640504 /* NSData+NSInputStream.m in Sources */, + 321EAA732171ED6900640504 /* CDATASection.m in Sources */, + 321EAB002171ED7E00640504 /* BaseClassForAllSVGBasicShapes.m in Sources */, + 321EAB082171ED7E00640504 /* SVGTitleElement.m in Sources */, + 321EAB222171ED8D00640504 /* SVGKParserPatternsAndGradients.m in Sources */, + 321EAB162171ED8700640504 /* SVGKSourceNSData.m in Sources */, + 321EAAE82171ED7E00640504 /* SVGCircleElement.m in Sources */, + 321EAA772171ED6900640504 /* Comment.m in Sources */, + 321EAB522171EDA200640504 /* SVGUtils.m in Sources */, + 321EAAFB2171ED7E00640504 /* SVGPolylineElement.m in Sources */, + 321EAAB82171ED6F00640504 /* SVGDocument.m in Sources */, + 321EAA962171ED6900640504 /* MediaList.m in Sources */, + 327B2897217DAC77004D27FC /* SVGRadialGradientElement.m in Sources */, + 321EAAB62171ED6F00640504 /* SVGDefsElement.m in Sources */, + 321EAAEC2171ED7E00640504 /* SVGElement.m in Sources */, + 321EAAF72171ED7E00640504 /* SVGPathElement.m in Sources */, + 321EAA9C2171ED6900640504 /* DOMHelperUtilities.m in Sources */, + 321EAABB2171ED6F00640504 /* SVGElementInstance.m in Sources */, + 321EAA8D2171ED6900640504 /* Document.m in Sources */, + 321EAB352171ED9600640504 /* CAShapeLayerWithClipRender.m in Sources */, + 321EAACD2171ED6F00640504 /* SVGRect.m in Sources */, + 321EAB022171ED7E00640504 /* SVGSVGElement.m in Sources */, + 321EAB0E2171ED8200640504 /* SVGKImage+CGContext.m in Sources */, + 321EAB3D2171ED9600640504 /* SVGKLayer.m in Sources */, + 321EAAEA2171ED7E00640504 /* SVGDescriptionElement.m in Sources */, + 321EAAC22171ED6F00640504 /* SVGGElement.m in Sources */, + 321EAAF12171ED7E00640504 /* SVGGroupElement.m in Sources */, + 321EAA812171ED6900640504 /* CSSRuleList.m in Sources */, + 321EAAE12171ED7E00640504 /* SVGGradientElement.m in Sources */, + 321EAA6F2171ED6900640504 /* AppleSucksDOMImplementation.m in Sources */, + 321EAAFD2171ED7E00640504 /* SVGRectElement.m in Sources */, + 321EAB502171EDA200640504 /* SVGKPattern.m in Sources */, + 321EAA7F2171ED6900640504 /* CSSStyleSheet.m in Sources */, + 321EAB412171ED9900640504 /* SVGKit.m in Sources */, + 321EAAA62171ED6900640504 /* Node.m in Sources */, + 321EAB332171ED9600640504 /* CALayerWithClipRender.m in Sources */, + 321EAAD02171ED6F00640504 /* SVGTransform.m in Sources */, + 321EAB282171ED9100640504 /* SVGKParser.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 32A1F09821746F4700ABFCE1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 32A1F09F21746F4700ABFCE1 /* SVGKitFramework_OSXTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 55452BED19EC68A200B75A30 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 66DBE4E51C42A00C00A0F0B7 /* SVGKit_iOS-RetainTests.m in Sources */, + 66DBE4E61C42A00C00A0F0B7 /* SVGKit_iOS_Tests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 6639618A16145D0400E58CCA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 66E863A01688C2780059C9C4 /* AppleSucksDOMImplementation.m in Sources */, 66E863A21688C2780059C9C4 /* Attr.m in Sources */, + 6694B5DE199C10400028CFF6 /* SVGKSourceNSData.m in Sources */, 66E863A41688C2780059C9C4 /* CDATASection.m in Sources */, 66E863A61688C2780059C9C4 /* CharacterData.m in Sources */, 66E863A81688C2780059C9C4 /* Comment.m in Sources */, 66E863AB1688C2780059C9C4 /* Document.m in Sources */, + 32C4892221916F3D007B1F29 /* SVGTextLayer.m in Sources */, 66E863AD1688C2780059C9C4 /* DocumentFragment.m in Sources */, 66E863AF1688C2780059C9C4 /* DocumentType.m in Sources */, 66E863B11688C2780059C9C4 /* DOMHelperUtilities.m in Sources */, @@ -1079,19 +2864,24 @@ 66E863B71688C2780059C9C4 /* NamedNodeMap.m in Sources */, 66E863BA1688C2780059C9C4 /* Node.m in Sources */, 66E863BD1688C2780059C9C4 /* NodeList.m in Sources */, + BD4C56DD199D55CC00AF04AD /* CAShapeLayerWithClipRender.m in Sources */, 66E863BF1688C2780059C9C4 /* ProcessingInstruction.m in Sources */, 66E863C11688C2780059C9C4 /* Text.m in Sources */, 66E863C31688C2780059C9C4 /* SVGAngle.m in Sources */, 66E863C51688C2780059C9C4 /* SVGDefsElement.m in Sources */, 66E863C71688C2780059C9C4 /* SVGDocument.m in Sources */, + BD1585751996B17C00461AA5 /* NSData+NSInputStream.m in Sources */, 66E863CA1688C2780059C9C4 /* SVGElementInstance.m in Sources */, 66E863CD1688C2780059C9C4 /* SVGElementInstanceList.m in Sources */, + 32D3D5E22176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */, + 668418C518674BF900C61EC2 /* SVGKExporterUIImage.m in Sources */, 66E863D01688C2780059C9C4 /* SVGLength.m in Sources */, 66E863D21688C2780059C9C4 /* SVGMatrix.m in Sources */, 66E863D51688C2780059C9C4 /* SVGPoint.m in Sources */, 66E863D91688C2780059C9C4 /* SVGTransform.m in Sources */, 66E863DB1688C2780059C9C4 /* SVGUseElement.m in Sources */, 66E863DF1688C2780059C9C4 /* SVGCircleElement.m in Sources */, + BD2F8C52199D0897008AE06D /* SVGClipPathElement.m in Sources */, 66E863E11688C2780059C9C4 /* SVGDescriptionElement.m in Sources */, 66E863E31688C2780059C9C4 /* SVGElement.m in Sources */, 66E863E61688C2780059C9C4 /* SVGEllipseElement.m in Sources */, @@ -1100,20 +2890,22 @@ 66E863ED1688C2780059C9C4 /* SVGLineElement.m in Sources */, 66E863EF1688C2780059C9C4 /* SVGPathElement.m in Sources */, 66E863F11688C2780059C9C4 /* SVGPolygonElement.m in Sources */, + BD2F8C56199D14D6008AE06D /* CALayerWithClipRender.m in Sources */, 66E863F31688C2780059C9C4 /* SVGPolylineElement.m in Sources */, 66E863F51688C2780059C9C4 /* SVGRectElement.m in Sources */, 66E863F71688C2780059C9C4 /* BaseClassForAllSVGBasicShapes.m in Sources */, 66E863F91688C2780059C9C4 /* SVGSVGElement.m in Sources */, 66E863FB1688C2780059C9C4 /* SVGTextElement.m in Sources */, 66E863FD1688C2780059C9C4 /* SVGTitleElement.m in Sources */, - 66E863FF1688C2780059C9C4 /* CALayerExporter.m in Sources */, 66E864011688C2780059C9C4 /* SVGKParserDefsAndUse.m in Sources */, 66E864031688C2780059C9C4 /* SVGKParserDOM.m in Sources */, 66E864051688C2780059C9C4 /* SVGKParserPatternsAndGradients.m in Sources */, 66E864071688C2780059C9C4 /* SVGKParserSVG.m in Sources */, + 66F33DD1182FE1C4004464AC /* SVGPreserveAspectRatio.m in Sources */, 66E864091688C2780059C9C4 /* SVGKParser.m in Sources */, 66E8640B1688C2780059C9C4 /* SVGKParseResult.m in Sources */, 66E8640E1688C2780059C9C4 /* SVGKPointsAndPathsParser.m in Sources */, + 668418BB1867457900C61EC2 /* SVGKImage+CGContext.m in Sources */, 66E864101688C2780059C9C4 /* CALayerWithChildHitTest.m in Sources */, 66E864121688C2780059C9C4 /* CAShapeLayerWithHitTest.m in Sources */, 66E864141688C2780059C9C4 /* CGPathAdditions.m in Sources */, @@ -1123,6 +2915,7 @@ 66E8641D1688C2780059C9C4 /* SVGKFastImageView.m in Sources */, 66E8641F1688C2780059C9C4 /* SVGKImageView.m in Sources */, 66E864211688C2780059C9C4 /* SVGKLayeredImageView.m in Sources */, + 32D3D5D72176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */, 66E864251688C2780059C9C4 /* SVGKPattern.m in Sources */, 66E864271688C2780059C9C4 /* SVGUtils.m in Sources */, 66EEE8531688CA8A002E2658 /* SVGKParserGradient.m in Sources */, @@ -1133,12 +2926,16 @@ 6668E2091688D3CF00F774A6 /* SVGGElement.m in Sources */, 66988DB4168A001400EC93C7 /* CSSStyleDeclaration.m in Sources */, 66988DB8168A004D00EC93C7 /* CSSValue.m in Sources */, + 322A5B7E218BF990003D9CF1 /* SVGKInlineResource.m in Sources */, 66988DBC168A027E00EC93C7 /* CSSRule.m in Sources */, + BDA133B819AD0E81003C9945 /* TinySVGTextAreaElement.m in Sources */, 66988DC0168A031200EC93C7 /* CSSStyleSheet.m in Sources */, 66988DC4168A038400EC93C7 /* CSSRuleList.m in Sources */, 66988DCC168A0A2300EC93C7 /* CSSPrimitiveValue.m in Sources */, + 668418C118674A0300C61EC2 /* SVGKExporterNSData.m in Sources */, 66988DD0168A129500EC93C7 /* CSSValueList.m in Sources */, 666674BB168A511400486B68 /* CSSStyleRule.m in Sources */, + 66F33DD5182FE2C3004464AC /* SVGAnimatedPreserveAspectRatio.m in Sources */, 666674C2168A556300486B68 /* StyleSheetList.m in Sources */, 666674C6168A55AF00486B68 /* StyleSheet.m in Sources */, 666674CA168A561C00486B68 /* MediaList.m in Sources */, @@ -1147,36 +2944,574 @@ 661ADBF316CC2FBE006F4BC3 /* SVGTextPositioningElement.m in Sources */, 661ADBF816CC2FCA006F4BC3 /* SVGTextContentElement.m in Sources */, 036A524D16E87693008C1140 /* NSCharacterSet+SVGKExtensions.m in Sources */, - 00E86D641741586600F0FA0A /* DDAbstractDatabaseLogger.m in Sources */, - 00E86D661741586600F0FA0A /* DDASLLogger.m in Sources */, - 00E86D681741586600F0FA0A /* DDFileLogger.m in Sources */, - 00E86D6A1741586600F0FA0A /* DDLog.m in Sources */, - 00E86D6C1741586600F0FA0A /* DDTTYLogger.m in Sources */, - 00E86D6E1741586600F0FA0A /* ContextFilterLogFormatter.m in Sources */, - 00E86D701741586600F0FA0A /* DispatchQueueLogFormatter.m in Sources */, 00E86D7417415AA000F0FA0A /* SVGKit.m in Sources */, 6636CD7F175F542A0072AAEF /* SVGKSourceLocalFile.m in Sources */, 6636CD81175F542A0072AAEF /* SVGKSourceString.m in Sources */, 6636CD83175F542A0072AAEF /* SVGKSourceURL.m in Sources */, 6636CD8B175F54680072AAEF /* CALayer+RecursiveClone.m in Sources */, 9ED79A25179D87790048AA5B /* SVGGradientLayer.m in Sources */, + 4FD821F11AC69F6600E419D3 /* SVGSwitchElement.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAAA1BDA4BC0003C1C12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDBF71BDA511C003C1C12 /* AppleSucksDOMImplementation.m in Sources */, + 825CDBF81BDA511C003C1C12 /* Attr.m in Sources */, + 825CDBF91BDA511C003C1C12 /* CDATASection.m in Sources */, + 825CDBFA1BDA511C003C1C12 /* CharacterData.m in Sources */, + 825CDBFB1BDA511C003C1C12 /* Comment.m in Sources */, + 825CDBFC1BDA511C003C1C12 /* CSSStyleDeclaration.m in Sources */, + 825CDBFD1BDA511C003C1C12 /* CSSRule.m in Sources */, + 32C4892321916F3D007B1F29 /* SVGTextLayer.m in Sources */, + 825CDBFE1BDA511C003C1C12 /* CSSStyleRule.m in Sources */, + 825CDBFF1BDA511C003C1C12 /* CSSStyleSheet.m in Sources */, + 825CDC001BDA511C003C1C12 /* CSSRuleList.m in Sources */, + 825CDC011BDA511C003C1C12 /* CSSPrimitiveValue.m in Sources */, + 825CDC021BDA511C003C1C12 /* CSSValueList.m in Sources */, + 825CDC031BDA511C003C1C12 /* CSSValue.m in Sources */, + 825CDC041BDA511C003C1C12 /* Document.m in Sources */, + 825CDC051BDA511C003C1C12 /* StyleSheetList.m in Sources */, + 825CDC061BDA511C003C1C12 /* StyleSheet.m in Sources */, + 825CDC071BDA511C003C1C12 /* MediaList.m in Sources */, + 825CDC081BDA511C003C1C12 /* DocumentFragment.m in Sources */, + 825CDC091BDA511C003C1C12 /* DocumentType.m in Sources */, + 825CDC0A1BDA511C003C1C12 /* DOMHelperUtilities.m in Sources */, + 825CDC0B1BDA511C003C1C12 /* Element.m in Sources */, + 825CDC0C1BDA511C003C1C12 /* EntityReference.m in Sources */, + 825CDC0D1BDA511C003C1C12 /* NamedNodeMap.m in Sources */, + 825CDC0E1BDA511C003C1C12 /* Node.m in Sources */, + 32D3D5E32176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */, + 825CDC0F1BDA511C003C1C12 /* NodeList.m in Sources */, + 825CDC101BDA511C003C1C12 /* ProcessingInstruction.m in Sources */, + 825CDC111BDA511C003C1C12 /* Text.m in Sources */, + 825CDC121BDA511C003C1C12 /* SVGAngle.m in Sources */, + 825CDC131BDA511C003C1C12 /* SVGAnimatedPreserveAspectRatio.m in Sources */, + 825CDC141BDA511C003C1C12 /* SVGClipPathElement.m in Sources */, + 825CDC151BDA511C003C1C12 /* SVGDefsElement.m in Sources */, + 825CDC161BDA511C003C1C12 /* SVGDocument.m in Sources */, + 825CDC171BDA511C003C1C12 /* SVGElementInstance.m in Sources */, + 825CDC181BDA511C003C1C12 /* SVGElementInstanceList.m in Sources */, + 825CDC191BDA511C003C1C12 /* SVGGElement.m in Sources */, + 825CDC1A1BDA511C003C1C12 /* SVGLength.m in Sources */, + 825CDC1B1BDA511C003C1C12 /* SVGMatrix.m in Sources */, + 825CDC1C1BDA511C003C1C12 /* SVGPoint.m in Sources */, + 825CDC1D1BDA511C003C1C12 /* SVGPreserveAspectRatio.m in Sources */, + 825CDC1E1BDA511C003C1C12 /* SVGRect.m in Sources */, + 825CDC1F1BDA511C003C1C12 /* SVGTransform.m in Sources */, + 825CDC201BDA511C003C1C12 /* SVGUseElement.m in Sources */, + 825CDC211BDA511C003C1C12 /* SVGHelperUtilities.m in Sources */, + 825CDC221BDA511C003C1C12 /* SVGTextPositioningElement.m in Sources */, + 825CDC231BDA511C003C1C12 /* SVGTextContentElement.m in Sources */, + 825CDC241BDA511C003C1C12 /* SVGGradientElement.m in Sources */, + 825CDC251BDA511C003C1C12 /* SVGGradientStop.m in Sources */, + 825CDC261BDA511C003C1C12 /* SVGStyleElement.m in Sources */, + 825CDC271BDA511C003C1C12 /* SVGCircleElement.m in Sources */, + 825CDC281BDA511C003C1C12 /* SVGDescriptionElement.m in Sources */, + 825CDC291BDA511C003C1C12 /* SVGElement.m in Sources */, + 825CDC2A1BDA511C003C1C12 /* SVGEllipseElement.m in Sources */, + 825CDC2B1BDA511C003C1C12 /* SVGGroupElement.m in Sources */, + 825CDC2C1BDA511C003C1C12 /* SVGImageElement.m in Sources */, + 825CDC2D1BDA511C003C1C12 /* SVGLineElement.m in Sources */, + 825CDC2E1BDA511C003C1C12 /* SVGPathElement.m in Sources */, + 825CDC2F1BDA511C003C1C12 /* SVGPolygonElement.m in Sources */, + 825CDC301BDA511C003C1C12 /* SVGPolylineElement.m in Sources */, + 825CDC311BDA511C003C1C12 /* SVGRectElement.m in Sources */, + 825CDC321BDA511C003C1C12 /* BaseClassForAllSVGBasicShapes.m in Sources */, + 825CDC331BDA511C003C1C12 /* SVGSVGElement.m in Sources */, + 825CDC341BDA511C003C1C12 /* SVGSwitchElement.m in Sources */, + 825CDC351BDA511C003C1C12 /* SVGTextElement.m in Sources */, + 825CDC361BDA511C003C1C12 /* SVGTitleElement.m in Sources */, + 825CDC371BDA511C003C1C12 /* TinySVGTextAreaElement.m in Sources */, + 32D3D5D82176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */, + 825CDC391BDA511C003C1C12 /* SVGKImage+CGContext.m in Sources */, + 825CDC3A1BDA511C003C1C12 /* SVGKExporterNSData.m in Sources */, + 825CDC3B1BDA511C003C1C12 /* SVGKExporterUIImage.m in Sources */, + 825CDC3C1BDA511C003C1C12 /* SVGKSourceLocalFile.m in Sources */, + 825CDC3D1BDA511C003C1C12 /* SVGKSourceNSData.m in Sources */, + 825CDC3E1BDA511C003C1C12 /* SVGKSourceString.m in Sources */, + 825CDC3F1BDA511C003C1C12 /* SVGKSourceURL.m in Sources */, + 825CDC401BDA511C003C1C12 /* SVGKParserDefsAndUse.m in Sources */, + 825CDC411BDA511C003C1C12 /* SVGKParserDOM.m in Sources */, + 825CDC421BDA511C003C1C12 /* SVGKParserGradient.m in Sources */, + 322A5B84218BFF75003D9CF1 /* SVGKInlineResource.m in Sources */, + 825CDC431BDA511C003C1C12 /* SVGKParserPatternsAndGradients.m in Sources */, + 825CDC441BDA511C003C1C12 /* SVGKParserStyles.m in Sources */, + 825CDC451BDA511C003C1C12 /* SVGKParserSVG.m in Sources */, + 825CDC461BDA511C003C1C12 /* SVGKParser.m in Sources */, + 825CDC471BDA511C003C1C12 /* SVGKParseResult.m in Sources */, + 825CDC481BDA511C003C1C12 /* SVGKPointsAndPathsParser.m in Sources */, + 825CDC491BDA511C003C1C12 /* CALayer+RecursiveClone.m in Sources */, + 825CDC4A1BDA511C003C1C12 /* SVGGradientLayer.m in Sources */, + 825CDC4B1BDA511C003C1C12 /* CALayerWithClipRender.m in Sources */, + 825CDC4C1BDA511C003C1C12 /* CAShapeLayerWithClipRender.m in Sources */, + 825CDC4D1BDA511C003C1C12 /* CALayerWithChildHitTest.m in Sources */, + 825CDC4E1BDA511C003C1C12 /* CAShapeLayerWithHitTest.m in Sources */, + 825CDC4F1BDA511C003C1C12 /* CGPathAdditions.m in Sources */, + 825CDC501BDA511C003C1C12 /* SVGKLayer.m in Sources */, + 825CDC511BDA511C003C1C12 /* SVGKImage.m in Sources */, + 825CDC521BDA511C003C1C12 /* SVGKit.m in Sources */, + 825CDC531BDA511C003C1C12 /* SVGKSource.m in Sources */, + 825CDC541BDA511C003C1C12 /* NSCharacterSet+SVGKExtensions.m in Sources */, + 825CDC551BDA511C003C1C12 /* SVGKFastImageView.m in Sources */, + 825CDC561BDA511C003C1C12 /* SVGKImageView.m in Sources */, + 825CDC571BDA511C003C1C12 /* SVGKLayeredImageView.m in Sources */, + 825CDC581BDA511C003C1C12 /* NSData+NSInputStream.m in Sources */, + 825CDC591BDA511C003C1C12 /* SVGKPattern.m in Sources */, + 825CDC5A1BDA511C003C1C12 /* SVGUtils.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAB41BDA4BC0003C1C12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 66DBE5011C42A0C900A0F0B7 /* SVGKitFramework_iOSTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDACE1BDA4D38003C1C12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 825CDC5B1BDA5144003C1C12 /* AppleSucksDOMImplementation.m in Sources */, + 825CDC5C1BDA5144003C1C12 /* Attr.m in Sources */, + 825CDC5D1BDA5144003C1C12 /* CDATASection.m in Sources */, + 825CDC5E1BDA5144003C1C12 /* CharacterData.m in Sources */, + 825CDC5F1BDA5144003C1C12 /* Comment.m in Sources */, + 825CDC601BDA5144003C1C12 /* CSSStyleDeclaration.m in Sources */, + 825CDC611BDA5144003C1C12 /* CSSRule.m in Sources */, + 32C4892421916F3D007B1F29 /* SVGTextLayer.m in Sources */, + 825CDC621BDA5144003C1C12 /* CSSStyleRule.m in Sources */, + 825CDC631BDA5144003C1C12 /* CSSStyleSheet.m in Sources */, + 825CDC641BDA5144003C1C12 /* CSSRuleList.m in Sources */, + 825CDC651BDA5144003C1C12 /* CSSPrimitiveValue.m in Sources */, + 825CDC661BDA5144003C1C12 /* CSSValueList.m in Sources */, + 825CDC671BDA5144003C1C12 /* CSSValue.m in Sources */, + 825CDC681BDA5144003C1C12 /* Document.m in Sources */, + 825CDC691BDA5144003C1C12 /* StyleSheetList.m in Sources */, + 825CDC6A1BDA5144003C1C12 /* StyleSheet.m in Sources */, + 825CDC6B1BDA5144003C1C12 /* MediaList.m in Sources */, + 825CDC6C1BDA5144003C1C12 /* DocumentFragment.m in Sources */, + 825CDC6D1BDA5144003C1C12 /* DocumentType.m in Sources */, + 825CDC6E1BDA5144003C1C12 /* DOMHelperUtilities.m in Sources */, + 825CDC6F1BDA5144003C1C12 /* Element.m in Sources */, + 825CDC701BDA5144003C1C12 /* EntityReference.m in Sources */, + 825CDC711BDA5144003C1C12 /* NamedNodeMap.m in Sources */, + 825CDC721BDA5144003C1C12 /* Node.m in Sources */, + 32D3D5E42176E01400ED20D8 /* SVGRadialGradientElement.m in Sources */, + 825CDC731BDA5144003C1C12 /* NodeList.m in Sources */, + 825CDC741BDA5144003C1C12 /* ProcessingInstruction.m in Sources */, + 825CDC751BDA5144003C1C12 /* Text.m in Sources */, + 825CDC761BDA5144003C1C12 /* SVGAngle.m in Sources */, + 825CDC771BDA5144003C1C12 /* SVGAnimatedPreserveAspectRatio.m in Sources */, + 825CDC781BDA5144003C1C12 /* SVGClipPathElement.m in Sources */, + 825CDC791BDA5144003C1C12 /* SVGDefsElement.m in Sources */, + 825CDC7A1BDA5144003C1C12 /* SVGDocument.m in Sources */, + 825CDC7B1BDA5144003C1C12 /* SVGElementInstance.m in Sources */, + 825CDC7C1BDA5144003C1C12 /* SVGElementInstanceList.m in Sources */, + 825CDC7D1BDA5144003C1C12 /* SVGGElement.m in Sources */, + 825CDC7E1BDA5144003C1C12 /* SVGLength.m in Sources */, + 825CDC7F1BDA5144003C1C12 /* SVGMatrix.m in Sources */, + 825CDC801BDA5144003C1C12 /* SVGPoint.m in Sources */, + 825CDC811BDA5144003C1C12 /* SVGPreserveAspectRatio.m in Sources */, + 825CDC821BDA5144003C1C12 /* SVGRect.m in Sources */, + 825CDC831BDA5144003C1C12 /* SVGTransform.m in Sources */, + 825CDC841BDA5144003C1C12 /* SVGUseElement.m in Sources */, + 825CDC851BDA5144003C1C12 /* SVGHelperUtilities.m in Sources */, + 825CDC861BDA5144003C1C12 /* SVGTextPositioningElement.m in Sources */, + 825CDC871BDA5144003C1C12 /* SVGTextContentElement.m in Sources */, + 825CDC881BDA5144003C1C12 /* SVGGradientElement.m in Sources */, + 825CDC891BDA5144003C1C12 /* SVGGradientStop.m in Sources */, + 825CDC8A1BDA5144003C1C12 /* SVGStyleElement.m in Sources */, + 825CDC8B1BDA5144003C1C12 /* SVGCircleElement.m in Sources */, + 825CDC8C1BDA5144003C1C12 /* SVGDescriptionElement.m in Sources */, + 825CDC8D1BDA5144003C1C12 /* SVGElement.m in Sources */, + 825CDC8E1BDA5144003C1C12 /* SVGEllipseElement.m in Sources */, + 825CDC8F1BDA5144003C1C12 /* SVGGroupElement.m in Sources */, + 825CDC901BDA5144003C1C12 /* SVGImageElement.m in Sources */, + 825CDC911BDA5144003C1C12 /* SVGLineElement.m in Sources */, + 825CDC921BDA5144003C1C12 /* SVGPathElement.m in Sources */, + 825CDC931BDA5144003C1C12 /* SVGPolygonElement.m in Sources */, + 825CDC941BDA5144003C1C12 /* SVGPolylineElement.m in Sources */, + 825CDC951BDA5144003C1C12 /* SVGRectElement.m in Sources */, + 825CDC961BDA5144003C1C12 /* BaseClassForAllSVGBasicShapes.m in Sources */, + 825CDC971BDA5144003C1C12 /* SVGSVGElement.m in Sources */, + 825CDC981BDA5144003C1C12 /* SVGSwitchElement.m in Sources */, + 825CDC991BDA5144003C1C12 /* SVGTextElement.m in Sources */, + 825CDC9A1BDA5144003C1C12 /* SVGTitleElement.m in Sources */, + 825CDC9B1BDA5144003C1C12 /* TinySVGTextAreaElement.m in Sources */, + 32D3D5D92176E00E00ED20D8 /* SVGLinearGradientElement.m in Sources */, + 825CDC9D1BDA5144003C1C12 /* SVGKImage+CGContext.m in Sources */, + 825CDC9E1BDA5144003C1C12 /* SVGKExporterNSData.m in Sources */, + 825CDC9F1BDA5144003C1C12 /* SVGKExporterUIImage.m in Sources */, + 825CDCA01BDA5144003C1C12 /* SVGKSourceLocalFile.m in Sources */, + 825CDCA11BDA5144003C1C12 /* SVGKSourceNSData.m in Sources */, + 825CDCA21BDA5144003C1C12 /* SVGKSourceString.m in Sources */, + 825CDCA31BDA5144003C1C12 /* SVGKSourceURL.m in Sources */, + 825CDCA41BDA5144003C1C12 /* SVGKParserDefsAndUse.m in Sources */, + 825CDCA51BDA5144003C1C12 /* SVGKParserDOM.m in Sources */, + 825CDCA61BDA5144003C1C12 /* SVGKParserGradient.m in Sources */, + 322A5B85218BFF76003D9CF1 /* SVGKInlineResource.m in Sources */, + 825CDCA71BDA5144003C1C12 /* SVGKParserPatternsAndGradients.m in Sources */, + 825CDCA81BDA5144003C1C12 /* SVGKParserStyles.m in Sources */, + 825CDCA91BDA5144003C1C12 /* SVGKParserSVG.m in Sources */, + 825CDCAA1BDA5144003C1C12 /* SVGKParser.m in Sources */, + 825CDCAB1BDA5144003C1C12 /* SVGKParseResult.m in Sources */, + 825CDCAC1BDA5144003C1C12 /* SVGKPointsAndPathsParser.m in Sources */, + 825CDCAD1BDA5144003C1C12 /* CALayer+RecursiveClone.m in Sources */, + 825CDCAE1BDA5144003C1C12 /* SVGGradientLayer.m in Sources */, + 825CDCAF1BDA5144003C1C12 /* CALayerWithClipRender.m in Sources */, + 825CDCB01BDA5144003C1C12 /* CAShapeLayerWithClipRender.m in Sources */, + 825CDCB11BDA5144003C1C12 /* CALayerWithChildHitTest.m in Sources */, + 825CDCB21BDA5144003C1C12 /* CAShapeLayerWithHitTest.m in Sources */, + 825CDCB31BDA5144003C1C12 /* CGPathAdditions.m in Sources */, + 825CDCB41BDA5144003C1C12 /* SVGKLayer.m in Sources */, + 825CDCB51BDA5144003C1C12 /* SVGKImage.m in Sources */, + 825CDCB61BDA5144003C1C12 /* SVGKit.m in Sources */, + 825CDCB71BDA5144003C1C12 /* SVGKSource.m in Sources */, + 825CDCB81BDA5144003C1C12 /* NSCharacterSet+SVGKExtensions.m in Sources */, + 825CDCB91BDA5144003C1C12 /* SVGKFastImageView.m in Sources */, + 825CDCBA1BDA5144003C1C12 /* SVGKImageView.m in Sources */, + 825CDCBB1BDA5144003C1C12 /* SVGKLayeredImageView.m in Sources */, + 825CDCBC1BDA5144003C1C12 /* NSData+NSInputStream.m in Sources */, + 825CDCBD1BDA5144003C1C12 /* SVGKPattern.m in Sources */, + 825CDCBE1BDA5144003C1C12 /* SVGUtils.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 825CDAD81BDA4D38003C1C12 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 66DBE50D1C42A0D800A0F0B7 /* SVGKitFramework_tvOSTests.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 32A1F0A321746F4700ABFCE1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 321EAA612171EC8700640504 /* SVGKitFramework-OSX */; + targetProxy = 32A1F0A221746F4700ABFCE1 /* PBXContainerItemProxy */; + }; + 55452BF919EC68A200B75A30 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 6639618D16145D0400E58CCA /* SVGKit-iOS */; + targetProxy = 55452BF819EC68A200B75A30 /* PBXContainerItemProxy */; + }; + 825CDABB1BDA4BC0003C1C12 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 825CDAAE1BDA4BC0003C1C12 /* SVGKitFramework-iOS */; + targetProxy = 825CDABA1BDA4BC0003C1C12 /* PBXContainerItemProxy */; + }; + 825CDADF1BDA4D38003C1C12 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 825CDAD21BDA4D38003C1C12 /* SVGKitFramework-tvOS */; + targetProxy = 825CDADE1BDA4D38003C1C12 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin XCBuildConfiguration section */ + 321EAA682171EC8700640504 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-OSX/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-OSX"; + PRODUCT_NAME = SVGKit; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 321EAA692171EC8700640504 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-OSX/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-OSX"; + PRODUCT_NAME = SVGKit; + SDKROOT = macosx; + SKIP_INSTALL = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 32A1F0A421746F4700ABFCE1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "SVGKitFramework-OSXTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-OSXTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Debug; + }; + 32A1F0A521746F4700ABFCE1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "-"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "SVGKitFramework-OSXTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.13; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-OSXTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + }; + name = Release; + }; + 55452BFA19EC68A200B75A30 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + HEADER_SEARCH_PATHS = ( + "Source/**", + "$(inherited)", + ); + INFOPLIST_FILE = "SVGKitLibrary/SVGKit-iOS Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ( + "-ObjC", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.github.MaddTheSane.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 55452BFB19EC68A200B75A30 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + HEADER_SEARCH_PATHS = ( + "Source/**", + "$(inherited)", + ); + INFOPLIST_FILE = "SVGKitLibrary/SVGKit-iOS Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ( + "-ObjC", + "$(inherited)", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.github.MaddTheSane.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; 6639619A16145D0400E58CCA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Lei Lei (JV5Y7A3TGE)"; COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -1184,11 +3519,14 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - PROVISIONING_PROFILE = "B8829AC4-04C1-4193-8D27-8543F41E0D20"; + MACOSX_DEPLOYMENT_TARGET = 10.9; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -1197,18 +3535,29 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "iPhone Developer: Lei Lei (JV5Y7A3TGE)"; COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ""; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 5.1; - PROVISIONING_PROFILE = "B8829AC4-04C1-4193-8D27-8543F41E0D20"; + MACOSX_DEPLOYMENT_TARGET = 10.9; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; }; @@ -1217,17 +3566,22 @@ 6639619D16145D0400E58CCA /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; DSTROOT = /tmp/SVGKit_iOS.dst; - DYLIB_CURRENT_VERSION = 1.1.0; + DYLIB_CURRENT_VERSION = 2.1.0; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "XCodeProjectData/SVGKit-iOS/SVGKit-iOS-Prefix.pch"; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; HEADER_SEARCH_PATHS = /usr/include/libxml2; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/Source/Core\"", ); - OTHER_LDFLAGS = "-ObjC"; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = "-fembed-bitcode"; PRODUCT_NAME = "$(TARGET_NAME).${DYLIB_CURRENT_VERSION}"; SKIP_INSTALL = YES; }; @@ -1236,25 +3590,327 @@ 6639619E16145D0400E58CCA /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_MODULES = YES; DSTROOT = /tmp/SVGKit_iOS.dst; - DYLIB_CURRENT_VERSION = 1.1.0; + DYLIB_CURRENT_VERSION = 2.1.0; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + ); GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "XCodeProjectData/SVGKit-iOS/SVGKit-iOS-Prefix.pch"; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; HEADER_SEARCH_PATHS = /usr/include/libxml2; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 6.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/Source/Core\"", ); - OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = "$(TARGET_NAME).${DYLIB_CURRENT_VERSION}"; SKIP_INSTALL = YES; }; name = Release; }; + 825CDAC01BDA4BC0003C1C12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CURRENT_PROJECT_VERSION = 2; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = 2; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-iOS"; + PRODUCT_NAME = SVGKit; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 825CDAC11BDA4BC0003C1C12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 2; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = 2; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-iOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-iOS"; + PRODUCT_NAME = SVGKit; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 825CDAC21BDA4BC0003C1C12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-iOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 825CDAC31BDA4BC0003C1C12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-iOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-iOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 825CDAE51BDA4D39003C1C12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CURRENT_PROJECT_VERSION = 2; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = 2; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-tvOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-tvOS"; + PRODUCT_NAME = SVGKit; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 825CDAE61BDA4D39003C1C12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 2; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 2; + DYLIB_CURRENT_VERSION = 2; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/tvOS", + ); + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + HEADER_SEARCH_PATHS = /usr/include/libxml2; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-tvOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-tvOS"; + PRODUCT_NAME = SVGKit; + SDKROOT = appletvos; + SKIP_INSTALL = YES; + TARGETED_DEVICE_FAMILY = 3; + TVOS_DEPLOYMENT_TARGET = 9.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 825CDAE81BDA4D39003C1C12 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Debug; + }; + 825CDAE91BDA4D39003C1C12 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "SVGKitFrameworks/SVGKitFramework-tvOSTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "SVGKit.SVGKitFramework-tvOSTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = appletvos; + TVOS_DEPLOYMENT_TARGET = 9.0; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 321EAA672171EC8700640504 /* Build configuration list for PBXNativeTarget "SVGKitFramework-OSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 321EAA682171EC8700640504 /* Debug */, + 321EAA692171EC8700640504 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 32A1F0A621746F4700ABFCE1 /* Build configuration list for PBXNativeTarget "SVGKitFramework-OSXTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 32A1F0A421746F4700ABFCE1 /* Debug */, + 32A1F0A521746F4700ABFCE1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 55452BFC19EC68A200B75A30 /* Build configuration list for PBXNativeTarget "SVGKit-iOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 55452BFA19EC68A200B75A30 /* Debug */, + 55452BFB19EC68A200B75A30 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 6639618816145D0400E58CCA /* Build configuration list for PBXProject "SVGKit-iOS" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1273,6 +3929,42 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + 825CDAC41BDA4BC0003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-iOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 825CDAC01BDA4BC0003C1C12 /* Debug */, + 825CDAC11BDA4BC0003C1C12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 825CDAC51BDA4BC0003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-iOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 825CDAC21BDA4BC0003C1C12 /* Debug */, + 825CDAC31BDA4BC0003C1C12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 825CDAE41BDA4D39003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-tvOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 825CDAE51BDA4D39003C1C12 /* Debug */, + 825CDAE61BDA4D39003C1C12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 825CDAE71BDA4D39003C1C12 /* Build configuration list for PBXNativeTarget "SVGKitFramework-tvOSTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 825CDAE81BDA4D39003C1C12 /* Debug */, + 825CDAE91BDA4D39003C1C12 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = 6639618516145D0400E58CCA /* Project object */; diff --git a/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-OSX.xcscheme b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-OSX.xcscheme new file mode 100644 index 000000000..c7ff0c4d9 --- /dev/null +++ b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-OSX.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-iOS.xcscheme b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-iOS.xcscheme new file mode 100644 index 000000000..d909a9a44 --- /dev/null +++ b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-iOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-tvOS.xcscheme b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-tvOS.xcscheme new file mode 100644 index 000000000..36571618c --- /dev/null +++ b/SVGKit-iOS.xcodeproj/xcshareddata/xcschemes/SVGKitFramework-tvOS.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGKit.podspec b/SVGKit.podspec new file mode 100644 index 000000000..47cc43214 --- /dev/null +++ b/SVGKit.podspec @@ -0,0 +1,33 @@ +Pod::Spec.new do |s| + s.name = 'SVGKit' + s.version = '2.1.0' + s.license = 'MIT' + s.osx.deployment_target = '10.9' + s.ios.deployment_target = '5.0' + s.tvos.deployment_target = '9.0' + s.summary = "Display and interact with SVG Images on iOS, using native rendering (CoreAnimation)." + s.homepage = 'https://github.com/SVGKit/SVGKit' + s.author = { 'Steven Fusco' => 'github@stevenfusco.com', + 'adamgit' => 'adam.m.s.martin@gmail.com', + 'Kevin Stich' => 'stich@50cubes.com', + 'Joshua May' => 'notjosh@gmail.com', + 'Eric Man' => 'meric.au@gmail.com', + 'Matt Rajca' => 'matt.rajca@me.com', + 'Moritz Pfeiffer' => 'moritz.pfeiffer@alp-phone.ch' } + s.source = { :git => 'https://github.com/SVGKit/SVGKit.git', :tag => s.version.to_s } + + s.source_files = 'Source/*.{h,m}', 'Source/**/*.{h,m}' + s.ios.exclude_files = 'Source/AppKit additions/*.{h,m}', 'Source/Exporters/SVGKExporterNSImage.{h,m}' + s.tvos.exclude_files = 'Source/AppKit additions/*.{h,m}', 'Source/Exporters/SVGKExporterNSImage.{h,m}' + s.osx.exclude_files = 'Source/Exporters/SVGKExporterUIImage.{h,m}' + s.libraries = 'xml2' + s.framework = 'QuartzCore', 'CoreText' + s.prefix_header_file = 'SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch' + s.module_map = 'SVGKitLibrary/SVGKit-iOS/SVGKit.modulemap' + s.requires_arc = true + s.xcconfig = { + 'CLANG_CXX_LANGUAGE_STANDARD' => 'gnu++11', + 'CLANG_CXX_LIBRARY' => 'libc++', + 'HEADER_SEARCH_PATHS' => '$(SDKROOT)/usr/include/libxml2' + } +end diff --git a/SVGKitFrameworks/SVGKitFramework-OSX/Info.plist b/SVGKitFrameworks/SVGKitFramework-OSX/Info.plist new file mode 100644 index 000000000..dca568ec0 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-OSX/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/SVGKitFrameworks/SVGKitFramework-OSXTests/Info.plist b/SVGKitFrameworks/SVGKitFramework-OSXTests/Info.plist new file mode 100644 index 000000000..6c40a6cd0 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-OSXTests/Info.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/SVGKitFrameworks/SVGKitFramework-OSXTests/SVGKitFramework_OSXTests.m b/SVGKitFrameworks/SVGKitFramework-OSXTests/SVGKitFramework_OSXTests.m new file mode 100644 index 000000000..211229b7b --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-OSXTests/SVGKitFramework_OSXTests.m @@ -0,0 +1,37 @@ +// +// SVGKitFramework_OSXTests.m +// SVGKitFramework-OSXTests +// +// Created by lizhuoli on 2018/10/15. +// Copyright © 2018年 na. All rights reserved. +// + +#import + +@interface SVGKitFramework_OSXTests : XCTestCase + +@end + +@implementation SVGKitFramework_OSXTests + +- (void)setUp { + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/SVGKitFrameworks/SVGKitFramework-iOS/Info.plist b/SVGKitFrameworks/SVGKitFramework-iOS/Info.plist new file mode 100644 index 000000000..dca568ec0 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-iOS/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/SVGKitFrameworks/SVGKitFramework-iOSTests/Info.plist b/SVGKitFrameworks/SVGKitFramework-iOSTests/Info.plist new file mode 100644 index 000000000..ba72822e8 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-iOSTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/SVGKitFrameworks/SVGKitFramework-iOSTests/SVGKitFramework_iOSTests.m b/SVGKitFrameworks/SVGKitFramework-iOSTests/SVGKitFramework_iOSTests.m new file mode 100644 index 000000000..6af7f6ec2 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-iOSTests/SVGKitFramework_iOSTests.m @@ -0,0 +1,39 @@ +// +// SVGKitFramework_iOSTests.m +// SVGKitFramework-iOSTests +// +// Created by Cihat Gündüz on 23.10.15. +// Copyright © 2015 na. All rights reserved. +// + +#import + +@interface SVGKitFramework_iOSTests : XCTestCase + +@end + +@implementation SVGKitFramework_iOSTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/SVGKitFrameworks/SVGKitFramework-tvOS/Info.plist b/SVGKitFrameworks/SVGKitFramework-tvOS/Info.plist new file mode 100644 index 000000000..dca568ec0 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-tvOS/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 2.1.0 + CFBundleSignature + ???? + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSPrincipalClass + + + diff --git a/SVGKitFrameworks/SVGKitFramework-tvOSTests/Info.plist b/SVGKitFrameworks/SVGKitFramework-tvOSTests/Info.plist new file mode 100644 index 000000000..ba72822e8 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-tvOSTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/SVGKitFrameworks/SVGKitFramework-tvOSTests/SVGKitFramework_tvOSTests.m b/SVGKitFrameworks/SVGKitFramework-tvOSTests/SVGKitFramework_tvOSTests.m new file mode 100644 index 000000000..306359e05 --- /dev/null +++ b/SVGKitFrameworks/SVGKitFramework-tvOSTests/SVGKitFramework_tvOSTests.m @@ -0,0 +1,39 @@ +// +// SVGKitFramework_tvOSTests.m +// SVGKitFramework-tvOSTests +// +// Created by Cihat Gündüz on 23.10.15. +// Copyright © 2015 na. All rights reserved. +// + +#import + +@interface SVGKitFramework_tvOSTests : XCTestCase + +@end + +@implementation SVGKitFramework_tvOSTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/SVGKitLibrary/Demo-OSX/AppDelegate.h b/SVGKitLibrary/Demo-OSX/AppDelegate.h new file mode 100644 index 000000000..17ea85ac4 --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/AppDelegate.h @@ -0,0 +1,29 @@ +// +// SKAppDelegate.h +// Demo-OSX +// +// Created by C.W. Betts on 6/7/13. +// Copyright (c) 2013 C.W. Betts. All rights reserved. +// + +#import +#import + +@interface AppDelegate : NSObject + +@property (readonly, strong) NSArray *svgArray; + +@property (weak) IBOutlet NSWindow *layeredWindow; +@property (weak) IBOutlet SVGKLayeredImageView *layeredView; +@property (weak) IBOutlet NSTableView *layeredTable; + +@property (weak) IBOutlet NSWindow *quickWindow; +@property (weak) IBOutlet SVGKFastImageView *fastView; +@property (weak) IBOutlet NSTableView *fastTable; +@property (nonatomic, getter = isCacheEnabled) BOOL cacheEnabled; + +- (IBAction)clearSVGCache:(id)sender; +- (IBAction)showLayeredWindow:(id)sender; +- (IBAction)showFastWindow:(id)sender; + +@end diff --git a/SVGKitLibrary/Demo-OSX/AppDelegate.m b/SVGKitLibrary/Demo-OSX/AppDelegate.m new file mode 100644 index 000000000..3bc3cf4d8 --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/AppDelegate.m @@ -0,0 +1,200 @@ +// +// SKAppDelegate.m +// Demo-OSX +// +// Created by C.W. Betts on 6/7/13. +// Copyright (c) 2013 C.W. Betts. All rights reserved. +// + +#import "AppDelegate.h" +#import "DemoSVGObject.h" + +#ifndef DEBUG +#define DEBUG 0 +#endif + +@interface RoseReturnFunc : NSObject + +@property (weak) SVGKImageView *theView; +@property (strong) NSObject *imagePath; + +@end + +@implementation RoseReturnFunc + +@end + +@interface AppDelegate () +@property (readwrite, strong) NSArray *svgArray; +@end + +@implementation AppDelegate + +- (void)applicationDidFinishLaunching:(NSNotification *)aNotification +{ + NSMutableArray *tmpArray = [[NSMutableArray alloc] init]; + NSString *pname; + + _cacheEnabled = NO; + + NSDirectoryEnumerator *dirEnum = [[NSFileManager defaultManager] enumeratorAtPath:[[NSBundle mainBundle] resourcePath]]; + + while (pname = [dirEnum nextObject]) { + //Only look for SVGs that are in the resources folder and the language subfolders. + if ([[dirEnum fileAttributes][NSFileType] isEqualToString:NSFileTypeDirectory]) { + if (!(NSOrderedSame == [[pname pathExtension] caseInsensitiveCompare:@"lproj"])) { + [dirEnum skipDescendants]; + } + continue; + } + if (NSOrderedSame == [[[pname lastPathComponent] pathExtension] caseInsensitiveCompare:@"svg"]) { + DemoSVGObject *tmpObj = [[DemoSVGBundleObject alloc] initWithName:[pname lastPathComponent]]; + if (![tmpArray containsObject:tmpObj]) { + [tmpArray addObject:tmpObj]; + } + } + } + + //[tmpArray addObject:[[DemoSVGURLObject alloc] initWithURL:[NSURL URLWithString:@"http://upload.wikimedia.org/wikipedia/commons/f/f9/BlankMap-Africa.svg"]]]; + + @autoreleasepool { + [tmpArray sortUsingComparator:^NSComparisonResult(id rhs, id lhs) { + NSString *rhsString = [rhs fileName]; + NSString *lhsString = [lhs fileName]; + NSComparisonResult result = [rhsString localizedStandardCompare:lhsString]; + return result; + }]; + } + + self.svgArray = [[NSArray alloc] initWithArray:tmpArray]; +} + +- (void)tableViewSelectionDidChange:(NSNotification *)notification +{ + NSTableView *tmpView = [notification object]; + NSInteger selRow = [tmpView selectedRow]; + if (selRow > -1 && selRow < [self.svgArray count]) { + NSObject *tmpObj = (self.svgArray)[selRow]; + SVGKImage *theImage; + SVGKImageView *theImageView; + NSWindow *imageWindow; + if (tmpView == self.fastTable) { + imageWindow = self.quickWindow; + theImageView = self.fastView; + } else if (tmpView == self.layeredTable) { + imageWindow = self.layeredWindow; + theImageView = self.layeredView; + } else { + NSLog(@"This shouldn't happen..."); + return; + } + if ([tmpObj.fullFileName hasPrefix:@"Reinel_compass_rose"]) { + RoseReturnFunc *theFunc = [RoseReturnFunc new]; + theFunc.theView = theImageView; + theFunc.imagePath = tmpObj; + NSBeginAlertSheet(@"Complex SVG", @"No", @"Yes", nil, imageWindow, self, + @selector(sheetDidEnd:returnCode:contextInfo:), NULL, (void*)CFBridgingRetain(theFunc), + @"The image \"%@\" has rendering issues on SVGKit. If you want to load the image, " + @"it will probably crash the app or, more likely, cause the view to become unresponsive." + @"\n\nAre you sure you want to load the image?", tmpObj.fileName); + return; + } + + if ([tmpObj isKindOfClass:[DemoSVGBundleObject class]]) { + //This should also take care of the default use case, which uses the main bundle + theImage = [SVGKImage imageNamed:tmpObj.fullFileName inBundle:((DemoSVGBundleObject*)tmpObj).theBundle]; + } else { + theImage = [SVGKImage imageWithContentsOfURL:[tmpObj svgURL]]; + } + + if (![theImage hasSize]) { + theImage.size = NSMakeSize(32, 32); + } + + theImageView.frameSize = theImage.size; + theImageView.image = theImage; + }else + NSBeep(); +} + +static inline NSString *exceptionInfo(NSException *e) +{ + NSString *debugStr; +#if 0 + debugStr = [NSString stringWithFormat:@", call stack: { %@ }", [NSDictionary dictionaryWithObjects:e.callStackReturnAddresses forKeys:e.callStackSymbols]]; +#else + debugStr = [NSString stringWithFormat:@", call stack symbols: {%@}",e.callStackSymbols]; +#endif + + return [NSString stringWithFormat:@"Exception name: \"%@\" reason: %@%@", e.name, e.reason, DEBUG ? debugStr : @""]; +} + +- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo +{ + CFTypeRef CFCtx = contextInfo; + RoseReturnFunc *theFunc = CFBridgingRelease(CFCtx); + + if (returnCode != NSAlertDefaultReturn) { + SVGKImage *tmpImage; + @try { + tmpImage = [SVGKImage imageWithContentsOfURL:theFunc.imagePath.svgURL]; + } + @catch (NSException *e) { + NSLog(@"EXCEPTION while loading %@: %@", theFunc.imagePath.fileName, exceptionInfo(e)); + return; + } + if (![tmpImage hasSize]) { + tmpImage.size = NSMakeSize(32, 32); + } + + @try { + theFunc.theView.image = tmpImage; + theFunc.theView.frameSize = tmpImage.size; + } + @catch (NSException *e) { + theFunc.theView.image = nil; + theFunc.theView.frameSize = NSMakeSize(100, 100); + NSLog(@"EXCEPTION while setting image %@ %@: %@", tmpImage, theFunc.imagePath.fileName, exceptionInfo(e)); + } + } +} + +- (IBAction)showLayeredWindow:(id)sender +{ + if (![self.layeredWindow isVisible]) { + [self.layeredWindow orderFront:nil]; + } +} + +- (IBAction)showFastWindow:(id)sender +{ + if (![self.quickWindow isVisible]) { + [self.quickWindow orderFront:nil]; + } +} + +- (IBAction)clearSVGCache:(id)sender +{ +// if ([SVGKImage isCacheEnabled]) { +// [SVGKImage clearSVGImageCache]; +// } else { +// NSRunAlertPanel(@"Cached Images", @"Cached images are not enabled at the moment.", nil, nil, nil); +// } +} + +@synthesize cacheEnabled = _cacheEnabled; +- (void)setCacheEnabled:(BOOL)cacheEnabled +{ + _cacheEnabled = cacheEnabled; +// if (_cacheEnabled) { +// static dispatch_once_t onceToken; +// dispatch_once(&onceToken, ^{ +// NSRunInformationalAlertPanel(@"Image Caching", @"Image caching has been enabled. Note that there might be issues if you load the image to the fast image view, then load it to the layered image view.\n\nThis warning will only show once.", nil, nil, nil); +// }); +// [SVGKImage enableCache]; +// } else { +// [SVGKImage disableCache]; +// } +} + +@end diff --git a/SVGKitLibrary/Demo-OSX/Demo-OSX-Info.plist b/SVGKitLibrary/Demo-OSX/Demo-OSX-Info.plist new file mode 100644 index 000000000..d0bc24cdf --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/Demo-OSX-Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSMinimumSystemVersion + ${MACOSX_DEPLOYMENT_TARGET} + NSHumanReadableCopyright + Copyright © 2013 C.W. Betts. All rights reserved. + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + + + diff --git a/SVGKitLibrary/Demo-OSX/Demo-OSX-Prefix.pch b/SVGKitLibrary/Demo-OSX/Demo-OSX-Prefix.pch new file mode 100644 index 000000000..47e7517ed --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/Demo-OSX-Prefix.pch @@ -0,0 +1,9 @@ +// +// Prefix header for all source files of the 'Demo-OSX' target in the 'Demo-OSX' project +// + +#import + +#ifdef __OBJC__ + #import +#endif diff --git a/SVGKitLibrary/Demo-OSX/DemoSVGObject.h b/SVGKitLibrary/Demo-OSX/DemoSVGObject.h new file mode 100644 index 000000000..a294381d3 --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/DemoSVGObject.h @@ -0,0 +1,40 @@ +// +// DemoSVGObject.h +// Demo-OSX +// +// Created by C.W. Betts on 6/7/13. +// Copyright (c) 2013 C.W. Betts. All rights reserved. +// + +#import + +@protocol DemoSVGObject + +- (NSURL *)svgURL; +- (NSString *)fileName; +- (NSString *)fullFileName; + +@end + +@interface DemoSVGObject : NSObject + +- (BOOL)isEqualToURL:(NSURL*)theURL; + +@end + +@interface DemoSVGBundleObject : DemoSVGObject + +@property (readonly, strong) NSBundle *theBundle; +@property (readonly, copy) NSString* fullFileName; +- (id)initWithName:(NSString *)theName; +- (id)initWithName:(NSString *)theName bundle:(NSBundle*)aBundle; + +@end + +@interface DemoSVGURLObject : DemoSVGObject + +@property (strong, readonly) NSURL *svgURL; + +- (id)initWithURL:(NSURL *)aURL; + +@end diff --git a/SVGKitLibrary/Demo-OSX/DemoSVGObject.m b/SVGKitLibrary/Demo-OSX/DemoSVGObject.m new file mode 100644 index 000000000..1eff56f5b --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/DemoSVGObject.m @@ -0,0 +1,178 @@ +// +// DemoSVGObject.m +// Demo-OSX +// +// Created by C.W. Betts on 6/7/13. +// Copyright (c) 2013 C.W. Betts. All rights reserved. +// + +#import "DemoSVGObject.h" + +@implementation DemoSVGObject + +#define NotImplemented() \ +if ([self isMemberOfClass:[DemoSVGObject class]]) { \ +NSLog(@"The class %@ is meant to be subclassed, and not accessed directly.", [self class]); \ +} else { \ +NSLog(@"The subclass %@ of class %@ should implement %s.", [self class], [DemoSVGObject class], sel_getName(_cmd)); \ +} \ +[self doesNotRecognizeSelector:_cmd]; \ +return nil + +- (NSURL *)svgURL +{ + NotImplemented(); +} + +- (NSString *)fileName +{ + NotImplemented(); +} + +- (NSString *)fullFileName +{ + NotImplemented(); +} + +- (BOOL)isEqualToURL:(NSURL*)theURL +{ + if ([self.svgURL isFileURL] && [theURL isFileURL]) { + id dat1, dat2; + BOOL bothareValid = YES; + BOOL theSame = NO; + if (![[self svgURL] getResourceValue:&dat1 forKey:NSURLFileResourceIdentifierKey error:NULL]) { + bothareValid = NO; + } + if (![theURL getResourceValue:&dat2 forKey:NSURLFileResourceIdentifierKey error:NULL]) { + bothareValid = NO; + } + if (bothareValid) { + theSame = [dat1 isEqual:dat2]; + } + return theSame; + } else if (![self.svgURL isFileURL] && ![theURL isFileURL]) { + return [[self.svgURL absoluteURL] isEqual:[theURL absoluteURL]]; + } else + return NO; +} + +- (NSUInteger)hash +{ + return [[[self svgURL] absoluteURL] hash]; +} + +@end + +@interface DemoSVGBundleObject () +@property (readwrite, copy) NSString* fullFileName; +@property (readwrite, strong) NSBundle *theBundle; +@end + +@implementation DemoSVGBundleObject + +- (id)initWithName:(NSString *)theName +{ + return [self initWithName:theName bundle:[NSBundle mainBundle]]; +} + +- (id)initWithName:(NSString *)theName bundle:(NSBundle*)aBundle +{ + if (self = [super init]) { + self.fullFileName = theName; + self.theBundle = aBundle; + } + return self; +} + +- (void)getFileName:(out NSString **)filNam extension:(out NSString **)ext +{ + NSParameterAssert(filNam != nil); + NSParameterAssert(ext != nil); + + *filNam = [self.fullFileName stringByDeletingPathExtension]; + NSString *extension = [self.fullFileName pathExtension]; + *ext = extension ? extension : @"svg"; +} + +- (NSURL*)svgURL +{ + NSString *newName; + NSString *extension; + [self getFileName:&newName extension:&extension]; + + NSURL *retURL = [self.theBundle URLForResource:newName withExtension:extension]; + return retURL; +} + +- (NSString*)fileName +{ + NSString *newName; + NSString *extension; + [self getFileName:&newName extension:&extension]; + + NSString *fullPath = [self.theBundle pathForResource:newName ofType:extension]; + NSString *retShortName = [[NSFileManager defaultManager] displayNameAtPath:fullPath]; + return retShortName; +} + +- (BOOL)isEqual:(id)object +{ + if ([object isKindOfClass:[DemoSVGBundleObject class]]) { + DemoSVGBundleObject* bundObj = object; + return [bundObj.fullFileName isEqualToString:self.fullFileName] && [bundObj.theBundle isEqual:self.theBundle]; + } else if ([object conformsToProtocol:@protocol(DemoSVGObject)] || [object isKindOfClass:[DemoSVGObject class]]) { + return [self isEqualToURL:[object svgURL]]; + } else { + return NO; + } +} + +@end + +@interface DemoSVGURLObject () +@property (strong, readwrite) NSURL *svgURL; +@end + +@implementation DemoSVGURLObject + +- (id)initWithURL:(NSURL *)aURL +{ + if (self = [super init]) { + self.svgURL = aURL; + } + return self; +} + +- (NSString *)fileName +{ + NSURL *tmpURL = self.svgURL; + + if([tmpURL isFileURL]){ + NSString *val; + NSError *err; + if([tmpURL getResourceValue:&val forKey:NSURLLocalizedNameKey error:&err] == NO) + { + NSLog(@"DemoSVGObject: Could not find out if extension is hidden in file \"%@\", error: %@", [tmpURL path], [err localizedDescription]); + return [tmpURL lastPathComponent]; + } else { + return val; + } + } + else return [tmpURL lastPathComponent]; +} + +- (NSString*)fullFileName +{ + return [self.svgURL lastPathComponent]; +} + +- (BOOL)isEqual:(id)object +{ + if (/*[object isKindOfClass:[DemoSVGURLObject class]] ||*/ [object conformsToProtocol:@protocol(DemoSVGObject)] || [object isKindOfClass:[DemoSVGObject class]]) { + return [self isEqualToURL:[object svgURL]]; + } else { + return NO; + } +} + +@end diff --git a/XCodeProjectData/Demo-iOS/en.lproj/InfoPlist.strings b/SVGKitLibrary/Demo-OSX/en.lproj/InfoPlist.strings similarity index 100% rename from XCodeProjectData/Demo-iOS/en.lproj/InfoPlist.strings rename to SVGKitLibrary/Demo-OSX/en.lproj/InfoPlist.strings diff --git a/SVGKitLibrary/Demo-OSX/en.lproj/MainMenu.xib b/SVGKitLibrary/Demo-OSX/en.lproj/MainMenu.xib new file mode 100644 index 000000000..bdca952cf --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/en.lproj/MainMenu.xib @@ -0,0 +1,870 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGKitLibrary/Demo-OSX/main.m b/SVGKitLibrary/Demo-OSX/main.m new file mode 100644 index 000000000..18748da23 --- /dev/null +++ b/SVGKitLibrary/Demo-OSX/main.m @@ -0,0 +1,59 @@ +// +// main.m +// Demo-OSX +// +// Created by C.W. Betts on 6/7/13. +// Copyright (c) 2013 C.W. Betts. All rights reserved. +// + +#import +#import + +#ifndef TESTSVGKPARSERASYNCHRONOUS +#define TESTSVGKPARSERASYNCHRONOUS 0 +#endif + +#if TESTSVGKPARSERASYNCHRONOUS +@interface TestDelegate : NSObject + +@end + +@implementation TestDelegate + +- (void)parser:(SVGKParser *)parserPassed DidFinishParsingWithResult:(SVGKParseResult *)result +{ + NSLog(@"Parse Complete"); +} + +@end +#endif + +int main(int argc, char *argv[]) +{ + @autoreleasepool { + [SVGKit enableLogging]; + } + +#if TESTSVGKPARSERASYNCHRONOUS + //SVGKParser parseAsynchronously tester + @autoreleasepool { + NSString *path = [[NSBundle mainBundle] pathForResource:@"CurvedDiamond" ofType:@"svg"]; + SVGKSource *theSource = [SVGKSource sourceFromFilename:path]; + SVGKParser *theParser = [[SVGKParser alloc] initWithSource:theSource]; + [theParser addDefaultSVGParserExtensions]; + [theParser parseAsynchronously]; + TestDelegate *theTest = [TestDelegate new]; + [theParser parseAsynchronouslyWithDelegate:theTest]; + dispatch_async(dispatch_get_global_queue(0, 0), ^{ + sleep(20); + dispatch_sync(dispatch_get_main_queue(), ^{ + [theParser parseAsynchronouslyWithDelegate:theTest]; + + }); + }); + } +#endif + + return NSApplicationMain(argc, (const char **)argv); + +} diff --git a/XCodeProjectData/Demo-iOS/AppDelegate.h b/SVGKitLibrary/Demo-iOS/AppDelegate.h similarity index 100% rename from XCodeProjectData/Demo-iOS/AppDelegate.h rename to SVGKitLibrary/Demo-iOS/AppDelegate.h diff --git a/XCodeProjectData/Demo-iOS/AppDelegate.m b/SVGKitLibrary/Demo-iOS/AppDelegate.m similarity index 96% rename from XCodeProjectData/Demo-iOS/AppDelegate.m rename to SVGKitLibrary/Demo-iOS/AppDelegate.m index 6533409e5..8590ba93e 100644 --- a/XCodeProjectData/Demo-iOS/AppDelegate.m +++ b/SVGKitLibrary/Demo-iOS/AppDelegate.m @@ -17,19 +17,12 @@ @implementation AppDelegate @synthesize navigationController = _navigationController; @synthesize splitViewController = _splitViewController; -- (void)dealloc -{ - [_window release]; - [_navigationController release]; - [_splitViewController release]; - [super dealloc]; -} - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [SVGKit enableLogging]; - +#if DSFDSF self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { @@ -60,7 +53,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( self.window.rootViewController = self.splitViewController; } - [self.window makeKeyAndVisible]; +#endif + // [self.window makeKeyAndVisible]; return YES; } diff --git a/XCodeProjectData/Demo-iOS/Default-568h@2x.png b/SVGKitLibrary/Demo-iOS/Default-568h@2x.png similarity index 100% rename from XCodeProjectData/Demo-iOS/Default-568h@2x.png rename to SVGKitLibrary/Demo-iOS/Default-568h@2x.png diff --git a/XCodeProjectData/Demo-iOS/Demo-iOS-Info.plist b/SVGKitLibrary/Demo-iOS/Demo-iOS-Info.plist similarity index 88% rename from XCodeProjectData/Demo-iOS/Demo-iOS-Info.plist rename to SVGKitLibrary/Demo-iOS/Demo-iOS-Info.plist index af4296405..a99a8d5cf 100644 --- a/XCodeProjectData/Demo-iOS/Demo-iOS-Info.plist +++ b/SVGKitLibrary/Demo-iOS/Demo-iOS-Info.plist @@ -24,6 +24,14 @@ 1.0 LSRequiresIPhoneOS + UIAppFonts + + Blocky.ttf + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + SB~iphone UIRequiredDeviceCapabilities armv7 diff --git a/XCodeProjectData/Demo-iOS/Demo-iOS-Prefix.pch b/SVGKitLibrary/Demo-iOS/Demo-iOS-Prefix.pch similarity index 100% rename from XCodeProjectData/Demo-iOS/Demo-iOS-Prefix.pch rename to SVGKitLibrary/Demo-iOS/Demo-iOS-Prefix.pch diff --git a/XCodeProjectData/Demo-iOS/DetailViewController.h b/SVGKitLibrary/Demo-iOS/DetailViewController.h similarity index 51% rename from XCodeProjectData/Demo-iOS/DetailViewController.h rename to SVGKitLibrary/Demo-iOS/DetailViewController.h index 3fc64f1a0..3c59f08a2 100644 --- a/XCodeProjectData/Demo-iOS/DetailViewController.h +++ b/SVGKitLibrary/Demo-iOS/DetailViewController.h @@ -9,33 +9,36 @@ #import #import "SVGKit.h" -#import "CALayerExporter.h" #import "SVGKImage.h" +#define LOAD_SYNCHRONOUSLY 0 // Synchronous load is less code, easier to write - but poor for large images + #define ALLOW_2X_STYLE_SCALING_OF_SVGS_AS_AN_EXAMPLE 1 // demonstrates using the "SVGKImage.scale" property to scale an SVG *before it generates output image data* #define ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING 1 // only exists because people ignore the docs and try to do this when they clearly shouldn't. If you're foolish enough to do this, this code will show you how to do it CORRECTLY. Look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! #define SHOW_DEBUG_INFO_ON_EACH_TAPPED_LAYER 1 // each time you tap and select a layer, that layer's info is displayed on-screen -@interface DetailViewController : UIViewController < UIPopoverControllerDelegate, UISplitViewControllerDelegate , CALayerExporterDelegate, UIScrollViewDelegate> +@interface DetailViewController : UIViewController < UIPopoverControllerDelegate, UISplitViewControllerDelegate, UIScrollViewDelegate> -@property (nonatomic, retain) NSString *name; -@property (nonatomic, retain) UITextView* exportText; -@property (nonatomic, retain) NSMutableString* exportLog; -@property (nonatomic, retain) CALayerExporter* layerExporter; -@property (nonatomic, retain) UITapGestureRecognizer* tapGestureRecognizer; +@property (nonatomic, strong) SVGKSource *sourceOfCurrentDocument; +@property (nonatomic, strong) UITextView* exportText; +@property (nonatomic, strong) NSMutableString* exportLog; +@property (nonatomic, strong) UITapGestureRecognizer* tapGestureRecognizer; -@property (nonatomic, retain) IBOutlet UIToolbar *toolbar; -@property (nonatomic, retain) IBOutlet UIScrollView *scrollViewForSVG; -@property (nonatomic, retain) IBOutlet SVGKImageView *contentView; -@property (nonatomic, retain) IBOutlet UIActivityIndicatorView *viewActivityIndicator; +@property (nonatomic, strong) IBOutlet UIToolbar *toolbar; +@property (nonatomic, strong) IBOutlet UIScrollView *scrollViewForSVG; +@property (nonatomic, strong) IBOutlet SVGKImageView *contentView; +@property (nonatomic, strong) IBOutlet UIActivityIndicatorView *viewActivityIndicator; +@property (nonatomic, strong) IBOutlet UIProgressView* progressLoading; +@property (nonatomic, strong) IBOutlet UIView* subViewLoadingPopup; -@property (nonatomic, retain) id detailItem; +@property(nonatomic,strong) IBOutlet UILabel* labelParseTime; +@property(nonatomic) BOOL requiresLayeredImageView; +@property (nonatomic, strong) id detailItem; - (IBAction)animate:(id)sender; -- (IBAction)exportLayers:(id)sender; - (IBAction) showHideBorder:(id)sender; diff --git a/SVGKitLibrary/Demo-iOS/DetailViewController.m b/SVGKitLibrary/Demo-iOS/DetailViewController.m new file mode 100644 index 000000000..8a59aef19 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/DetailViewController.m @@ -0,0 +1,731 @@ +// +// DetailViewController.m +// iOSDemo +// +// Created by adam on 29/09/2012. +// Copyright (c) 2012 na. All rights reserved. +// +#import "DetailViewController.h" + +@interface ImageLoadingOptions : NSObject +@property(nonatomic) CGSize overrideImageSize; +@property(nonatomic) float overrideImageRenderScale; +@property(nonatomic,strong) SVGKSourceLocalFile* localFileSource; +- (id)initWithSource:(SVGKSource*) source; +@end + +static NSString * const kTimeIntervalForLastReRenderOfSVGFromMemory = @"timeIntervalForLastReRenderOfSVGFromMemory"; + +@implementation ImageLoadingOptions +- (id)initWithSource:(SVGKSource*) source +{ + self = [super init]; + if (self) { + if( [source isKindOfClass:[SVGKSourceLocalFile class]]) + self.localFileSource = (SVGKSourceLocalFile*) source; + else + ; // cannot auto-select loading options for anything except local files / bundle files + + self.overrideImageRenderScale = 1.0; + self.overrideImageSize = CGSizeZero; + } + return self; +} +@end + +@interface DetailViewController () + +@property (nonatomic, strong) UIPopoverController *popoverController; + +@property (nonatomic, strong) NSDate* startParseTime, * endParseTime; + +- (void)loadSVGFrom:(SVGKSource *) svgSource; +- (void)shakeHead; + +/** Apple's NSTimer class is an old OS X class that doesn't place nicely with ObjC blocks + (Apple needs to upgrade it). It sets up some nasty retain cycles and you can't set + the .userInfo after its started (a side-effect of the internal retain'ing Apple does) + + By storing this reference here, we can give a block a reference in advance, while also + giving the block's output to the timer as .userinfo at creation time + */ +@property (nonatomic, strong) NSTimer* tickerLoadingApplesNSTimerSucks; + +@end + + +@implementation DetailViewController +@synthesize scrollViewForSVG; + +@synthesize toolbar, popoverController, contentView, detailItem; +@synthesize viewActivityIndicator; +@synthesize exportText = _exportText; + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + } + return self; +} + +- (void)dealloc { + self.detailItem = nil; + self.contentView = nil; +} + +-(void)viewDidLoad +{ + [super viewDidLoad]; + self.scrollViewForSVG.delegate = self; +} + +- (void)viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [self setupNavigationBar]; +} + +CALayer* lastTappedLayer; +CGFloat lastTappedLayerOriginalBorderWidth; +CGColorRef lastTappedLayerOriginalBorderColor; +CATextLayer *textLayerForLastTappedLayer; +-(void) deselectTappedLayer +{ + if( lastTappedLayer != nil ) + { +#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING + if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) + { + [lastTappedLayer removeFromSuperlayer]; // nothing else needed + } + else +#endif + { + lastTappedLayer.borderWidth = lastTappedLayerOriginalBorderWidth; + lastTappedLayer.borderColor = lastTappedLayerOriginalBorderColor; + } + + [textLayerForLastTappedLayer removeFromSuperlayer]; + textLayerForLastTappedLayer = nil; + + lastTappedLayer = nil; + } +} + +- (void)setupNavigationBar { + NSString *renderTitle = self.requiresLayeredImageView ? @"LayeredImageView" : @"FastImageView"; + UIBarButtonItem *renderItem = [[UIBarButtonItem alloc] initWithTitle:renderTitle style:UIBarButtonItemStylePlain target:self action:@selector(toggleRender:)]; + UIBarButtonItem *debugItem = [[UIBarButtonItem alloc] initWithTitle:@"Debug" style:UIBarButtonItemStylePlain target:self action:@selector(showHideBorder:)]; + UIBarButtonItem *animateItem = [[UIBarButtonItem alloc] initWithTitle:@"Animate" style:UIBarButtonItemStylePlain target:self action:@selector(animate:)]; + self.navigationItem.rightBarButtonItems = @[renderItem, debugItem, animateItem]; +} + +-(NSString*) layerInfo:(CALayer*) l +{ + return [NSString stringWithFormat:@"%@:%@", [l class], NSStringFromCGRect(l.frame)]; +} + +/** + Example of how to handle gaps on an SVG + */ +-(void) handleTapGesture:(UITapGestureRecognizer*) recognizer +{ + CGPoint p = [recognizer locationInView:self.scrollViewForSVG]; + +#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! + SVGKImage* svgImage = nil; // ONLY used for the hacky code below that demonstrates how complex hit-testing is on an SVGKFastImageView + + /** + WARNING: + + Whenever you're using SVGKFastImageView, it "hides" the raw CALayers from you, and Apple + doesn't provide an easy way around this (we do it this way because there are missing methods + and bugs in Apple's UIScrollView, which SVGKFastImageView fixes). + + So, you cannot do a hittest on "SVGKFastImageView.layer" - that will always return the root, + empty, full-size layer. + + Instead, you have to hit-test the layer INSIDE the fast imageview. + + -------- + + HOWEVER: YOU SHOULD NOT BE DOING THIS! + + IF YOU NEED TO DO HIT-TESTING, USE SVGKLayeredImageView (as per the docs!) + + THE EXAMPLE CODE HERE SHOWS YOU HOW YOU COULD, IN THEORY, DO HIT-TESTING WITH EITHER, BUT IT + IS HIGHLY RECOMMENDED NEVER TO USE HIT-TESTING WITH SVGKFastImageView! + */ +#endif + CALayer* layerForHitTesting; + +#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! + if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) + { + layerForHitTesting = ((SVGKFastImageView*)self.contentView).image.CALayerTree; + svgImage = ((SVGKFastImageView*)self.contentView).image; + + /** + ALSO, because SVGKFastImageView DOES NOT ALTER the underlying layers when it zooms + (the zoom is handled "fast" and done internally at 100% accuracy), + any zoom will be ignored for the hit-test - we have to MANUALLY apply the zoom + */ + CGSize scaleConvertImageToViewForHitTest = CGSizeMake( self.contentView.bounds.size.width / svgImage.size.width, self.contentView.bounds.size.height / svgImage.size.height ); // this is a copy/paste of the internal "SCALING" logic used in SVGKFastImageView + + p = CGPointApplyAffineTransform( p, CGAffineTransformInvert( CGAffineTransformMakeScale( scaleConvertImageToViewForHitTest.width, scaleConvertImageToViewForHitTest.height)) ); // must do the OPPOSITE of the zoom (to convert the 'seeming' point to the 'actual' point + } + else +#endif + layerForHitTesting = self.contentView.layer; + + + CALayer* hitLayer = [layerForHitTesting hitTest:p]; + + if( hitLayer == lastTappedLayer ) + [self deselectTappedLayer]; // do this both ways, but have to do it AFTER the if-test because it nil's one of the if-phrases! + else { + [self deselectTappedLayer]; // do this both ways, but have to do it AFTER the if-test because it nil's one of the if-phrases! + +#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! + if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) + { + /** NEVER DO THIS - this is a proof-of-concept, but instead you should ALWAYS + use SVGKLayeredImageView if you want to do hit-testing! + */ + NSLog(@"WARNING: don't use SVGKFastImageView for hit-testing"); + + /** + Because SVGKFastImageView "hides" the layers, any visual changes we make + will NOT be reflected on-screen. + + Instead, we have to put a NEW layer over the top + */ + CALayer* absolutePositionedCloneLayer = [svgImage newCopyPositionedAbsoluteOfLayer:hitLayer]; + + lastTappedLayer = [[CALayer alloc] init]; + lastTappedLayer.frame = absolutePositionedCloneLayer.frame; + + /** + ALSO, because SVGKFastImageView DOES NOT ALTER the underlying layers when it zooms + (the zoom is handled "fast" and done internally at 100% accuracy), + any zoom will be ignored for the new layer - we have to MANUALLY apply the zoom + */ + CGSize scaleConvertImageToView = CGSizeMake( self.contentView.bounds.size.width / svgImage.size.width, self.contentView.bounds.size.height / svgImage.size.height ); // this is a copy/paste of the internal "SCALING" logic used in SVGKFastImageView + lastTappedLayer.frame = CGRectApplyAffineTransform( lastTappedLayer.frame, CGAffineTransformMakeScale(scaleConvertImageToView.width, scaleConvertImageToView.height)); + + [self.contentView.layer addSublayer:lastTappedLayer]; + } + else +#endif + lastTappedLayer = hitLayer; + + if( lastTappedLayer != nil ) + { + lastTappedLayerOriginalBorderColor = lastTappedLayer.borderColor; + lastTappedLayerOriginalBorderWidth = lastTappedLayer.borderWidth; + + lastTappedLayer.borderColor = [UIColor greenColor].CGColor; + lastTappedLayer.borderWidth = 3.0; + +#if SHOW_DEBUG_INFO_ON_EACH_TAPPED_LAYER + /** mtrubnikov's code for adding a text overlay showing exactly what you tapped + */ + NSString* textToDraw = [NSString stringWithFormat:@"%@ (%@): {%.1f, %.1f} {%.1f, %.1f}", hitLayer.name, [hitLayer class], lastTappedLayer.frame.origin.x, lastTappedLayer.frame.origin.y, lastTappedLayer.frame.size.width, lastTappedLayer.frame.size.height]; + + UIFont* fontToDraw = [UIFont fontWithName:@"Helvetica" + size:14.0f]; + CGSize sizeOfTextRect = [textToDraw sizeWithAttributes:@{NSFontAttributeName: fontToDraw}]; + + textLayerForLastTappedLayer = [[CATextLayer alloc] init]; + [textLayerForLastTappedLayer setFont:@"Helvetica"]; + [textLayerForLastTappedLayer setFontSize:14.0f]; + [textLayerForLastTappedLayer setFrame:CGRectMake(0, 0, sizeOfTextRect.width, sizeOfTextRect.height)]; + [textLayerForLastTappedLayer setString:textToDraw]; + [textLayerForLastTappedLayer setAlignmentMode:kCAAlignmentLeft]; + [textLayerForLastTappedLayer setForegroundColor:[UIColor redColor].CGColor]; + [textLayerForLastTappedLayer setContentsScale:[[UIScreen mainScreen] scale]]; + [textLayerForLastTappedLayer setShouldRasterize:NO]; + [self.contentView.layer addSublayer:textLayerForLastTappedLayer]; + /* + * mtrubnikov's code for adding a text overlay showing exactly what you tapped*/ +#endif + } + } +} + +#pragma mark - CRITICAL: this method makes Apple render SVGs in sharp focus + +-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)finalScale +{ + /** NB: very important! The "finalScale" parameter to this method is SLIGHTLY DIFFERENT from the scale that Apple reports in the other delegate methods + + This is very confusing, clearly it's bit of a hack - the other methods get called + at slightly the wrong time, and so their data is slightly wrong (out-by-one animation step). + + ONLY the values passed as params to this method are correct! + */ + + /** + * If we use the SVGKLayeredImageView then there is no need to redraw the image - only update scale on text elements + */ + if ([self.contentView isKindOfClass:[SVGKLayeredImageView class]]) { + finalScale *= [UIScreen mainScreen].scale; + + NSMutableDictionary + * newActions = [@{kCAOnOrderIn : [NSNull null], kCAOnOrderOut : [NSNull null], @"sublayers" : [NSNull null], @"contents" : [NSNull null], @"bounds" : [NSNull null]} mutableCopy]; + + [CATransaction begin]; + [CATransaction setDisableActions:YES]; + + // Override actions to prevent implicit CALayer animations that happen when setting scale + [self setActions:newActions andUpdateScale:finalScale onTextSublayersOf:((SVGKLayeredImageView*)view).image.CALayerTree]; + + [CATransaction commit]; + } + else + { + /** + + Apple's implementation of zooming is EXTREMELY poorly designed; it's a hack onto a class + that was only designed to do panning (hence the name: uiSCROLLview) + + So ... "zooming" via a UIScrollView is NOT integrated with UIView + rendering - in a UIView subclass, you CANNOT KNOW whether you have been "zoomed" + (i.e.: had your view contents ruined horribly by Apple's class) + + The three lines that follow are - allegedly - Apple's preferred way of handling + the situation. Note that we DO NOT SET view.frame! According to official docs, + view.frame is UNDEFINED (this is very worrying, breaks a huge amount of UIKit-related code, + but that's how Apple has documented / implemented it!) + */ + view.transform = CGAffineTransformIdentity; // this alters view.frame! But *not* view.bounds + view.bounds = CGRectApplyAffineTransform(view.bounds, CGAffineTransformMakeScale(finalScale, finalScale)); + [view setNeedsDisplay]; + + /** + Workaround for another bug in Apple's hacks for UIScrollView: + + - when you reset the transform, as advised by Apple, you "break" Apple's memory of the scroll factor. + ... because they "forgot" to store it anywhere (they read your view.transform as if it were a private + variable inside UIScrollView! This causes MANY bugs in applications :( ) + */ + self.scrollViewForSVG.minimumZoomScale /= finalScale; + self.scrollViewForSVG.maximumZoomScale /= finalScale; + } +} + +- (void) setActions:(NSMutableDictionary*)actions andUpdateScale:(float)scale onTextSublayersOf:(CALayer*)layer { + if ([layer isKindOfClass:[CATextLayer class]]){ + layer.actions = actions; + layer.contentsScale = scale; + } + + for (CALayer* sublayer in layer.sublayers) { + [self setActions:actions andUpdateScale:scale onTextSublayersOf:sublayer]; + } +} + +#pragma mark - rest of class + +- (void)setDetailItem:(id)newDetailItem { + if (detailItem != newDetailItem) { + detailItem = newDetailItem; + [self reload]; + } + + if (self.popoverController) { + [self.popoverController dismissPopoverAnimated:YES]; + } +} + +- (void)setContentView:(SVGKImageView *)newContentView { + if (contentView == newContentView) { + return; + } + if (contentView) { + [contentView removeObserver:self forKeyPath:kTimeIntervalForLastReRenderOfSVGFromMemory]; + } + if (newContentView) { + /** Fast image view renders asynchronously, so we have to wait for a callback that its finished a render... */ + [newContentView addObserver:self forKeyPath:kTimeIntervalForLastReRenderOfSVGFromMemory options:0 context:nil]; + } + contentView = newContentView; +} + +-(void)reload { + [self deselectTappedLayer]; // do this first because it DEPENDS UPON the type of self.contentView BEFORE the change in value + // FIXME: re-write this class so that this method does NOT require self.view to exist + [self view]; // Apple's design to trigger the creation of view. Original design of THIS class is that it breaks if view isn't already existing + if (self.detailItem) { + [self loadSVGFrom:self.detailItem]; + } +} + +-(void) willLoadNewResource +{ + // update the view + self.subViewLoadingPopup.hidden = FALSE; + self.progressLoading.progress = 0; + [self.viewActivityIndicator startAnimating]; + /** Move the gesture recognizer off the old view */ + if( self.contentView != nil + && self.tapGestureRecognizer != nil ) + [self.contentView removeGestureRecognizer:self.tapGestureRecognizer]; + + [self.labelParseTime removeFromSuperview]; // we'll re-add to the new one + [self.contentView removeFromSuperview]; +} + +/** + If you want to emulate Apple's @2x naming system for UIImage, you can... + */ +-(void) preProcessImageFor2X:(ImageLoadingOptions*) options +{ +#if ALLOW_2X_STYLE_SCALING_OF_SVGS_AS_AN_EXAMPLE + if( [options.localFileSource.filePath hasSuffix:@"@2x"]) + { + SVGKSourceLocalFile* modifiedSource = [options.localFileSource copy]; + modifiedSource.filePath = [modifiedSource.filePath substringToIndex:modifiedSource.filePath.length - @"@2x".length]; + options.overrideImageRenderScale = 2.0; + options.localFileSource = modifiedSource; + } +#endif +} + +/** + If you want to emulate Apple's @WxH naming system for UIImage, you can... + */ +-(void) preProcessImageForAt160x240:(ImageLoadingOptions*) options +{ + if( [options.localFileSource.filePath hasSuffix:@"@160x240"]) // could be any 999x999 you want, up to you to implement! + { + SVGKSourceLocalFile* modifiedSource = [options.localFileSource copy]; + + modifiedSource.filePath = [modifiedSource.filePath substringToIndex:modifiedSource.filePath.length - @"@160x240".length]; + options.overrideImageSize = CGSizeMake( 160, 240 ); + + options.localFileSource = modifiedSource; + } +} + +- (void)loadSVGFrom:(SVGKSource *) svgSource +{ + [self willLoadNewResource]; + [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; // makes the animation appear + + self.startParseTime = self.endParseTime = [NSDate date]; // reset them + + SVGKImage *document = nil; + ImageLoadingOptions* loadingOptions = [[ImageLoadingOptions alloc] initWithSource:svgSource]; + + /** Detect URL vs file */ + self.startParseTime = [NSDate date]; + if( [svgSource isKindOfClass:[SVGKSourceURL class]]) + { + @try + { + /** + This would work, but won't let us read any errors: + + document = [SVGKImage imageWithContentsOfURL:[NSURL URLWithString:name]]; + + so, instead, we create an SVGKSource explicitly (as this demo app is taking + user-input, and we have no idea how valid it is!) + + + */ + document = [SVGKImage imageWithSource:svgSource]; + + [self internalLoadedResource:svgSource withOptions:loadingOptions parserOutput:(document==nil)?nil:document.parseErrorsAndWarnings createImageViewFromDocument:document]; + } + @catch( NSException* e ) + { + [[[UIAlertView alloc] initWithTitle:@"SVG load failed" message:[NSString stringWithFormat:@"Error = %@", e] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; + + [self internalLoadedResource:svgSource withOptions:loadingOptions parserOutput:nil createImageViewFromDocument:nil]; + } + + } + else if( [svgSource isKindOfClass:[SVGKSourceLocalFile class]]) + { + + /** This demo shows different images being used in different ways. + Here we setup special conditions based on the filename etc: + */ + + [self preProcessImageFor2X:loadingOptions]; + [self preProcessImageForAt160x240:loadingOptions]; + + /** Detect the magic name(s) for the nil-demos */ + if( svgSource == nil ) + { + /** This demonstrates / tests what happens if you create an SVGKLayeredImageView with a nil SVGKImage + */ + [self didLoadNewResourceCreatingImageView:[[SVGKLayeredImageView alloc] init]]; + } + else + { + /** + the actual loading of the SVG file + */ + + +#if LOAD_SYNCHRONOUSLY + document = [SVGKImage imageNamed:[name stringByAppendingPathExtension:@"svg"]]; + [self internalLoadedResource:name withOptions:loadingOptions createImageViewFromDocument:document]; +#else + SVGKParser* parser = [SVGKImage imageWithSource:svgSource + onCompletion:^(SVGKImage *loadedImage, SVGKParseResult* parseResult) + { + [self.tickerLoadingApplesNSTimerSucks invalidate]; + dispatch_async(dispatch_get_main_queue(), ^{ + // must be on main queue since this affects the UIKit GUI! + [self internalLoadedResource:svgSource withOptions:loadingOptions parserOutput:parseResult createImageViewFromDocument:loadedImage]; + }); + }]; + self.tickerLoadingApplesNSTimerSucks = [NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(tickLoadingSVG:) userInfo:parser repeats:TRUE]; +#endif + } + } + else + { + [[[UIAlertView alloc] initWithTitle:@"SVG load failed" message:[NSString stringWithFormat:@"Unknown kind of source. Should be a recognized SVGKSource subclass. Was actually : %@", [svgSource class]] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; + + [self internalLoadedResource:nil withOptions:loadingOptions parserOutput:nil createImageViewFromDocument:nil]; + } +} + +/** Updates the on-screen loading bar */ +-(void) tickLoadingSVG:(NSTimer*) timer +{ + SVGKParser* parser = (SVGKParser*) timer.userInfo; + + dispatch_async(dispatch_get_main_queue(), + ^{ + // must be on main queue since this affects the UIKit GUI! + self.progressLoading.progress = parser.currentParseRun.parseProgressFractionApproximate; + }); +} + +/** + Creates an appropriate SVGKImageView to display the loaded SVGKImage, and triggers the post-processing + of on-screen displays + */ +-(void) internalLoadedResource:(SVGKSource*) source withOptions:(ImageLoadingOptions*) loadingOptions parserOutput:(SVGKParseResult*) parseResult createImageViewFromDocument:(SVGKImage*) document +{ + self.endParseTime = [NSDate date]; + + SVGKImageView* newContentView = nil; + if( loadingOptions.overrideImageRenderScale != 1.0 ) + document.scale = loadingOptions.overrideImageRenderScale; + + if( document == nil ) + { + if( parseResult == nil ) + { + [[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:@"Total failure. See console log" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; + } + else + { + [[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:[NSString stringWithFormat:@"Summary: %@",parseResult] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; + } + newContentView = nil; // signals to the rest of this method: the load failed + } + else + { + if( document.parseErrorsAndWarnings.rootOfSVGTree != nil ) + { + //NSLog(@"[%@] Freshly loaded document (name = %@) has size = %@", [self class], name, NSStringFromCGSize(document.size) ); + + /** NB: the SVG Spec says that the "correct" way to upscale or downscale an SVG is by changing the + SVG Viewport. SVGKit automagically does this for you if you ever set a value to image.scale */ + if( ! CGSizeEqualToSize( CGSizeZero, loadingOptions.overrideImageSize ) ) + document.size = loadingOptions.overrideImageSize; // preferred way to scale an SVG! (standards compliant!) + + if( self.requiresLayeredImageView ) + { + newContentView = [[SVGKLayeredImageView alloc] initWithSVGKImage:document]; + } + else + { + newContentView = [[SVGKFastImageView alloc] initWithSVGKImage:document]; + + NSLog(@"[%@] WARNING: workaround for Apple bugs: UIScrollView spams tiny changes to the transform to the content view; currently, we have NO WAY of efficiently measuring whether or not to re-draw the SVGKImageView. As a temporary solution, we are DISABLING the SVGKImageView's auto-redraw-at-higher-resolution code - in general, you do NOT want to do this", [self class]); + + ((SVGKFastImageView*)newContentView).disableAutoRedrawAtHighestResolution = TRUE; + } + } + + if( parseResult.errorsFatal.count > 0 ) + { + [[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:[NSString stringWithFormat:@"%@",parseResult] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; +// [[[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:[NSString stringWithFormat:@"%i fatal errors, %i warnings. First fatal = %@",[document.parseErrorsAndWarnings.errorsFatal count],[document.parseErrorsAndWarnings.errorsRecoverable count]+[document.parseErrorsAndWarnings.warnings count], ((NSError*)[document.parseErrorsAndWarnings.errorsFatal objectAtIndex:0]).localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease] show]; + newContentView = nil; // signals to the rest of this method: the load failed + + } + } + + self.sourceOfCurrentDocument = source; + + [self didLoadNewResourceCreatingImageView:newContentView]; +} + +/** + Reconfigures the view to display the newly-loaded image, and display meta info + about how long it took to parse, etc + */ +-(void) didLoadNewResourceCreatingImageView:(SVGKImageView*) newContentView +{ + if( newContentView != nil ) + { + /** + * NB: at this point we're guaranteed to have a "new" replacemtent ready for self.contentView + */ + + /******* swap the new contentview in ************/ + self.contentView = newContentView; + + if( self.labelParseTime == nil ) + { + self.labelParseTime = [[UILabel alloc] init]; + self.labelParseTime.autoresizingMask = UIViewAutoresizingFlexibleWidth; + self.labelParseTime.backgroundColor = [UIColor colorWithWhite:1 alpha:0.5]; + self.labelParseTime.textColor = [UIColor blackColor]; + self.labelParseTime.text = @"(parsing)"; + } + self.labelParseTime.frame = CGRectMake(0, 0, self.view.bounds.size.width, 20); + + [self.contentView addSubview:self.labelParseTime]; + + /** set the border for new item */ + self.contentView.showBorder = FALSE; + + /** Move the gesture recognizer onto the new one */ + if( self.tapGestureRecognizer == nil ) + { + self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; + } + [self.contentView addGestureRecognizer:self.tapGestureRecognizer]; + + [self.scrollViewForSVG addSubview:self.contentView]; + [self.scrollViewForSVG setContentSize: self.contentView.frame.size]; + + float screenToDocumentSizeRatio = self.scrollViewForSVG.frame.size.width / self.contentView.frame.size.width; + + self.scrollViewForSVG.minimumZoomScale = MIN( 1, screenToDocumentSizeRatio ); + self.scrollViewForSVG.maximumZoomScale = MAX( 1, screenToDocumentSizeRatio ); + + self.labelParseTime.text = [NSString stringWithFormat:@"(parsed: %.2f secs, rendered: %.2f secs)", [self.endParseTime timeIntervalSinceDate:self.startParseTime], self.contentView.timeIntervalForLastReRenderOfSVGFromMemory ]; + + /** + EXAMPLE: + + How to find particular nodes in the tree, after parsing. + + In this case, we search for all SVG tags, which usually mean grouped-objects in Inkscape etc: + NodeList* elementsUsingTagG = [document.DOMDocument getElementsByTagName:@"g"]; + NSLog( @"[%@] checking for SVG standard set of elements with XML tag/node of : %@", [self class], elementsUsingTagG.internalArray ); + */ + } + + [self.viewActivityIndicator stopAnimating]; + self.subViewLoadingPopup.hidden = TRUE; +} + +-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +{ + + if( [keyPath isEqualToString:kTimeIntervalForLastReRenderOfSVGFromMemory ] ) + { + self.labelParseTime.text = [NSString stringWithFormat:@"(parsed: %.2f secs, rendered: %.2f secs)", [self.endParseTime timeIntervalSinceDate:self.startParseTime], self.contentView.timeIntervalForLastReRenderOfSVGFromMemory ]; + } +} + +- (IBAction)toggleRender:(id)sender { + if (self.requiresLayeredImageView) { + self.requiresLayeredImageView = NO; + } else { + self.requiresLayeredImageView = YES; + } + [self setupNavigationBar]; + [self reload]; +} + +- (IBAction)animate:(id)sender { + if ([self.sourceOfCurrentDocument.keyForAppleDictionaries rangeOfString:@"/Monkey.svg"].location != NSNotFound) { + [self shakeHead]; + } else if ([self.sourceOfCurrentDocument.keyForAppleDictionaries rangeOfString:@"/parent-clip.svg"].location != NSNotFound) { + [self moveGreenSquare]; + } +} + + +- (void)shakeHead { + CALayer *layer = [self.contentView.image layerWithIdentifier:@"head"]; + + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; + animation.duration = 0.25f; + animation.autoreverses = YES; + animation.repeatCount = 100000; + animation.fromValue = [NSNumber numberWithFloat:0.1f]; + animation.toValue = [NSNumber numberWithFloat:-0.1f]; + + [layer addAnimation:animation forKey:@"shakingHead"]; +} + +- (void)moveGreenSquare { + CALayer *layer = [self.contentView.image layerWithIdentifier:@"greensquare"]; + + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; + animation.duration = 1; + animation.autoreverses = YES; + animation.repeatCount = 100000; + animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 50)]; + animation.toValue = [NSValue valueWithCGPoint:CGPointMake(-50, -50)]; + + [layer addAnimation:animation forKey:@"moveGreenSquare"]; +} + +- (IBAction) showHideBorder:(id)sender +{ + self.contentView.showBorder = ! self.contentView.showBorder; + + /** + NB: normally, the following would NOT be needed - the SVGKImageView would automatically + detect it needs to be re-drawn. + + But ... because we're doing zooming in this class, and Apple's zooming causes huge performance problems, + we disabled the auto-redraw in the loadResource: method above. + + So, now, we have to manually tell the SVGKImageView to redraw + */ + [self.contentView setNeedsDisplay]; +} + +#pragma mark - Split view + +- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)argumentPopoverController +{ + barButtonItem.title = NSLocalizedString(@"Master", @"Master"); + [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; + self.popoverController = argumentPopoverController; +} + +- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem +{ + // Called when the view is shown again in the split view, invalidating the button and popover controller. + [self.navigationItem setLeftBarButtonItem:nil animated:YES]; + self.popoverController = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return YES; +} + +- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView +{ + return self.contentView; +} + + +@end diff --git a/SVGKitLibrary/Demo-iOS/LaunchScreen.storyboard b/SVGKitLibrary/Demo-iOS/LaunchScreen.storyboard new file mode 100644 index 000000000..fdf3f97d1 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/XCodeProjectData/Demo-iOS/MasterViewController.h b/SVGKitLibrary/Demo-iOS/MasterViewController.h similarity index 65% rename from XCodeProjectData/Demo-iOS/MasterViewController.h rename to SVGKitLibrary/Demo-iOS/MasterViewController.h index 6314152ff..be8b728ef 100644 --- a/XCodeProjectData/Demo-iOS/MasterViewController.h +++ b/SVGKitLibrary/Demo-iOS/MasterViewController.h @@ -9,8 +9,8 @@ @interface MasterViewController : UITableViewController -@property(nonatomic,retain) NSMutableArray *sampleNames; +@property(nonatomic,strong) NSMutableArray *sampleNames; -@property (nonatomic, retain) IBOutlet DetailViewController *detailViewController; +@property (nonatomic, strong) IBOutlet DetailViewController *detailViewController; @end diff --git a/XCodeProjectData/Demo-iOS/MasterViewController.m b/SVGKitLibrary/Demo-iOS/MasterViewController.m similarity index 55% rename from XCodeProjectData/Demo-iOS/MasterViewController.m rename to SVGKitLibrary/Demo-iOS/MasterViewController.m index b699c6179..2eb41f1f8 100644 --- a/XCodeProjectData/Demo-iOS/MasterViewController.m +++ b/SVGKitLibrary/Demo-iOS/MasterViewController.m @@ -10,7 +10,7 @@ #import "DetailViewController.h" @interface MasterViewController() -@property(nonatomic,retain) NSString* nameOfBrokenSVGToLoad; +@property(nonatomic,strong) NSString* nameOfBrokenSVGToLoad; @end @implementation MasterViewController @@ -19,44 +19,37 @@ @implementation MasterViewController @synthesize detailViewController = _detailViewController; @synthesize nameOfBrokenSVGToLoad = _nameOfBrokenSVGToLoad; -- (id)init +- (void)setupSampleNames { - if (self) { - self.sampleNames = [NSMutableArray arrayWithObjects: @"g-element-applies-rotation", @"groups-and-layers-test", @"http://upload.wikimedia.org/wikipedia/commons/f/f9/BlankMap-Africa.svg", @"shapes", @"strokes", @"transformations", @"rounded-rects", @"gradients",@"radialGradientTest", @"PreserveAspectRatio", @"australia_states_blank", @"Reinel_compass_rose", @"Monkey", @"Blank_Map-Africa", @"opacity01", @"Note", @"Note@2x", @"imageWithASinglePointPath", @"Lion", @"lingrad01", @"Map", @"CurvedDiamond", @"Text", @"text01", @"tspan01", @"Location_European_nation_states", @"uk-only", @"Europe_states_reduced", @"Compass_rose_pale", @"MathCurve", @"rotated-and-skewed-text", @"RainbowWing", @"StyleAttribute", @"voies", @"nil-demo-layered-imageview", @"svg-with-explicit-width", @"svg-with-explicit-width-large", @"svg-with-explicit-width-large@160x240", @"BlankMap-World6-Equirectangular", nil]; - } - - /** Apple really sucks. They keep randomly changing which init methods they call, BREAKING ALL EXISTING CODE */ - return nil; + self.sampleNames = [NSMutableArray arrayWithObjects: @"map-alaska-onlysimple", @"g-element-applies-rotation", @"groups-and-layers-test", @"http://upload.wikimedia.org/wikipedia/commons/f/f9/BlankMap-Africa.svg", @"shapes", @"strokes", @"transformations", @"rounded-rects", @"gradients",@"radialGradientTest", @"PreserveAspectRatio", @"australia_states_blank", @"Reinel_compass_rose", @"Monkey", @"Blank_Map-Africa", @"opacity01", @"Note", @"Note@2x", @"heart", @"M-to-S-to-T", @"imageWithASinglePointPath", @"Lion", @"lingrad01", @"Map", @"CurvedDiamond", @"Text", @"text01", @"tspan01", @"Location_European_nation_states", @"uk-only", @"Europe_states_reduced", @"Compass_rose_pale", @"quad01", @"cubic01", @"rotated-and-skewed-text", @"RainbowWing", @"sakamura-default-fill-opacity-test", @"StyleAttribute", @"voies", @"nil-demo-layered-imageview", @"svg-with-explicit-width", @"svg-with-explicit-width-large", @"svg-with-explicit-width-large@160x240", @"BlankMap-World6-Equirectangular", @"Coins", @"parent-clip", @"CSS", @"imagetag-layered", @"ImageAspectRatio", @"test-stroke-dash-array", @"radial-gradient-opacity", @"radgrad01", @"pattern01", @"Mozilla_Firefox_logo_2013", + + // This file is still not fully supported, arc to is missing, but it has the evenodd in it + @"fillrule-evenodd", + nil]; } - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { - [self init]; + [self setupSampleNames]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { self = [super initWithCoder:aDecoder]; if (self) { - [self init]; + [self setupSampleNames]; } return self; } -- (void)dealloc { - [_detailViewController release]; - [_sampleNames release]; - - [super dealloc]; -} - (void)viewDidLoad { [super viewDidLoad]; self.clearsSelectionOnViewWillAppear = NO; - self.contentSizeForViewInPopover = CGSizeMake(320.0f, 600.0f); + self.preferredContentSize = CGSizeMake(320.0f, 600.0f); } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -73,8 +66,8 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault - reuseIdentifier:CellIdentifier] autorelease]; + cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault + reuseIdentifier:CellIdentifier]; } cell.textLabel.text = [_sampleNames objectAtIndex:indexPath.row]; @@ -88,7 +81,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath { NSLog(@"*****************\n* WARNING\n*\n* The sample 'Reinel_compass_rose' is currently unsupported;\n* it is included in this build so that people working on it can test it and see if it works yet\n*\n*\n*****************"); - [[[[UIAlertView alloc] initWithTitle:@"WARNING" message:@"Reinel_compass_rose breaks SVGKit, it uses unsupported SVG commands; until we have added support for those commands, it's here as a test - but it WILL CRASH if you try to view it" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK, crash",nil] autorelease] show]; + [[[UIAlertView alloc] initWithTitle:@"WARNING" message:@"Reinel_compass_rose breaks SVGKit, it uses unsupported SVG commands; until we have added support for those commands, it's here as a test - but it WILL CRASH if you try to view it" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"OK, crash",nil] show]; self.nameOfBrokenSVGToLoad = [_sampleNames objectAtIndex:indexPath.row]; @@ -97,7 +90,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { if (!self.detailViewController) { - self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"iPhoneDetailViewController" bundle:nil] autorelease]; + self.detailViewController = [[DetailViewController alloc] initWithNibName:@"iPhoneDetailViewController" bundle:nil]; } [self.navigationController pushViewController:self.detailViewController animated:YES]; self.detailViewController.detailItem = [_sampleNames objectAtIndex:indexPath.row]; @@ -110,15 +103,14 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { - if( buttonIndex == 0 ) + if( buttonIndex == [alertView cancelButtonIndex] ) { - NSLog(@"[%@] Apple hates all developers. Why did they have a 'cancel clicked' if they also send 'cancel' as 'not cancelled'?", [self class]); return; } if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { if (!self.detailViewController) { - self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"iPhoneDetailViewController" bundle:nil] autorelease]; + self.detailViewController = [[DetailViewController alloc] initWithNibName:@"iPhoneDetailViewController" bundle:nil]; } [self.navigationController pushViewController:self.detailViewController animated:YES]; self.detailViewController.detailItem = self.nameOfBrokenSVGToLoad; diff --git a/SVGKitLibrary/Demo-iOS/SB~iphone.storyboard b/SVGKitLibrary/Demo-iOS/SB~iphone.storyboard new file mode 100644 index 000000000..4a60c3deb --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/SB~iphone.storyboard @@ -0,0 +1,515 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SVGKitLibrary/Demo-iOS/SampleFileInfo.h b/SVGKitLibrary/Demo-iOS/SampleFileInfo.h new file mode 100644 index 000000000..28327d9a3 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/SampleFileInfo.h @@ -0,0 +1,20 @@ +#import + +#import "SVGKSource.h" + +@interface SampleFileInfo : NSObject + +@property(nonatomic,strong) NSString* author, * licenseType, * name; +@property(nonatomic, assign) BOOL requiresLayeredImageView; +@property(weak, nonatomic,readonly) SVGKSource* source; + +-(SVGKSource*) sourceFromWeb; +-(SVGKSource*) sourceFromLocalFile; + +-(NSString*) savedBitmapFilename; + ++(SampleFileInfo*) sampleFileInfoWithFilename:(NSString*) f; ++(SampleFileInfo*) sampleFileInfoWithURL:(NSURL*) s; ++(SampleFileInfo*) sampleFileInfoWithFilename:(NSString*) f URL:(NSURL*) s; + +@end diff --git a/SVGKitLibrary/Demo-iOS/SampleFileInfo.m b/SVGKitLibrary/Demo-iOS/SampleFileInfo.m new file mode 100644 index 000000000..1c080ebd2 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/SampleFileInfo.m @@ -0,0 +1,77 @@ +#import "SampleFileInfo.h" + +#import "SVGKSourceLocalFile.h" +#import "SVGKSourceURL.h" + +@interface SampleFileInfo () +@property(nonatomic,strong) NSString* originalFilename; +@property(nonatomic,strong) NSURL* originalURL; +@end + +@implementation SampleFileInfo + ++(SampleFileInfo*) sampleFileInfoWithFilename:(NSString*) f +{ + return [self sampleFileInfoWithFilename:f URL:nil name:f]; +} + ++(SampleFileInfo*) sampleFileInfoWithURL:(NSURL*) s +{ + return [self sampleFileInfoWithFilename:nil URL:s name:[s relativeString]]; +} + ++(SampleFileInfo*) sampleFileInfoWithFilename:(NSString*) f URL:(NSURL*) s +{ + return [self sampleFileInfoWithFilename:f URL:s name:(f!=nil) ? f : [s relativeString]]; +} + ++(SampleFileInfo*) sampleFileInfoWithFilename:(NSString*) f URL:(NSURL*) s name:(NSString*) n +{ + SampleFileInfo* value = [SampleFileInfo new]; + + value.originalFilename = f; + value.originalURL = s; + + value.name = n; + + return value; +} + +-(SVGKSource *)source +{ + if( self.originalFilename != nil ) + return [self sourceFromLocalFile]; + else if( self.originalURL != nil ) + return [self sourceFromWeb]; + else + { +// D(false, @"Cannot return an SVGKSource; no valid filename nor url"); + return nil; + } +} + +-(SVGKSource *)sourceFromLocalFile +{ + return [SVGKSourceLocalFile internalSourceAnywhereInBundleUsingName:self.originalFilename]; +} + +-(SVGKSource *)sourceFromWeb +{ + return [SVGKSourceURL sourceFromURL:self.originalURL]; +} + +-(NSString *)savedBitmapFilename +{ + if( self.originalFilename != nil ) + { + return [self.originalFilename stringByDeletingPathExtension]; + } + else if( self.originalURL != nil ) + { + return [[self.originalURL relativeString] stringByDeletingPathExtension]; + } + else + return nil; +} + +@end diff --git a/SVGKitLibrary/Demo-iOS/VCAllSpecImages.h b/SVGKitLibrary/Demo-iOS/VCAllSpecImages.h new file mode 100644 index 000000000..751e5c3d0 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCAllSpecImages.h @@ -0,0 +1,17 @@ +// +// VCAllSpecImages.h +// Demo-iOS +// +// Created by adam on 11/04/2015. +// Copyright (c) 2015 na. All rights reserved. +// + +#import + +@interface VCAllSpecImages : UIViewController + +@property(nonatomic,strong) IBOutlet UICollectionView* collectionView; + +@property(nonatomic,strong) NSString* pathInBundleToSVGSpecTestSuiteFolder; + +@end diff --git a/SVGKitLibrary/Demo-iOS/VCAllSpecImages.m b/SVGKitLibrary/Demo-iOS/VCAllSpecImages.m new file mode 100644 index 000000000..7a9aa215f --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCAllSpecImages.m @@ -0,0 +1,103 @@ +#import "VCAllSpecImages.h" +#import "DetailViewController.h" +#import "SVGKSourceLocalFile.h" + +@interface VCAllSpecImages () +@property(nonatomic,strong) NSString* xcodeVirtualFolderPath; +@property(nonatomic,strong) NSMutableArray* svgFileNames; +@end + +@implementation VCAllSpecImages + +-(void)viewDidLoad +{ + [super viewDidLoad]; + + if( self.svgFileNames == nil ) + { + NSError *error = nil; + + self.xcodeVirtualFolderPath = [[[NSBundle mainBundle] resourcePath] + stringByAppendingPathComponent:self.pathInBundleToSVGSpecTestSuiteFolder]; + + NSArray *xcodeVirtualFolderSVGContents = [[NSFileManager defaultManager] + contentsOfDirectoryAtPath:[self.xcodeVirtualFolderPath stringByAppendingPathComponent:@"svg"] error:&error]; + NSMutableArray *svgFileNames = [xcodeVirtualFolderSVGContents mutableCopy]; + // Sort by name because by default it's not sorted + [svgFileNames sortUsingSelector:@selector(caseInsensitiveCompare:)]; + + self.svgFileNames = svgFileNames; + } +} + +-(NSArray*) sectionAtIndex:(NSInteger) index +{ + return self.svgFileNames; +} + +-(NSString*) filenameAtIndexPath:(NSIndexPath*) indexPath +{ + NSArray* section = [self sectionAtIndex:indexPath.section]; + NSString* item = [section objectAtIndex:indexPath.row]; + return item; +} + +#pragma mark - UICollectionView + +-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; + + NSString* filename = [self filenameAtIndexPath:indexPath]; + + UILabel* l = (UILabel*) [cell viewWithTag:1]; + l.text = filename; + + UIImageView* iv = (UIImageView*) [cell viewWithTag:2]; + /** Xcode 3, 4, 5 and even version 6 -- all SUCK. "Groups", "Folders", and "Folder References" are all STILL broken by default + + Spec adds hundreds of files, and Xcode deletes the folders. So must use folder-references. But Apple folder-references STILL break Apple's UIImage, so we have to specify manual path. + */ + NSString* fullPathImageFileName = [[self.xcodeVirtualFolderPath stringByAppendingPathComponent:@"png"] stringByAppendingPathComponent:filename]; + + UIImage* savedImage = [UIImage imageNamed: [fullPathImageFileName stringByDeletingPathExtension]]; + if( savedImage != nil ) + { + iv.image = savedImage; + } + else + iv.image = nil; + + return cell; +} + +-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView +{ + return 1; +} + +-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return [self sectionAtIndex:section].count; +} + +-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath +{ + //SampleFileInfo* item = [self itemAtIndexPath:indexPath]; + + [self performSegueWithIdentifier:@"ViewSVG" sender:nil]; +} + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ + if( [segue.destinationViewController isKindOfClass:[DetailViewController class]]) + { + DetailViewController* nextVC = (DetailViewController*) segue.destinationViewController; + + NSString* filename = [self filenameAtIndexPath:[self.collectionView indexPathsForSelectedItems][0]]; + nextVC.detailItem = [SVGKSourceLocalFile sourceFromFilename:[[self.xcodeVirtualFolderPath stringByAppendingPathComponent:@"svg"] stringByAppendingPathComponent:filename]]; + } +} + +@end + diff --git a/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.h b/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.h new file mode 100644 index 000000000..257d4c5b1 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.h @@ -0,0 +1,10 @@ +#import + +@interface VCGridOfImagesViewController : UIViewController + +@property(nonatomic,strong) IBOutlet UICollectionView* collectionView; + +-(void) displayAllSectionsFromDictionary:(NSDictionary*) inputDictionary; +-(void) displayOneSectionNamed:(NSString*) sectionName fromDictionary:(NSDictionary*) licensesInSection; + +@end diff --git a/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.m b/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.m new file mode 100644 index 000000000..fad5f30f8 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCGridOfImagesViewController.m @@ -0,0 +1,157 @@ +#import "VCGridOfImagesViewController.h" +#import "SampleFileInfo.h" +#import "DetailViewController.h" +@interface VCGridOfImagesViewController () +@property(nonatomic,strong) NSMutableArray* sectionNames; +@property(nonatomic,strong) NSMutableDictionary* itemArraysBySectionName; +@end + +@implementation VCGridOfImagesViewController + +-(SampleFileInfo*) sampleFileInfoFromDictionary:(NSDictionary*) license +{ + NSString* sourceURL = [license objectForKey:@"Source URL"]; + NSString* sourceFilename = [license objectForKey:@"Source Local File"]; + + SampleFileInfo* info = [SampleFileInfo sampleFileInfoWithFilename:sourceFilename URL:(sourceURL != nil) ? [NSURL URLWithString:sourceURL] : nil]; + + return info; +} + +-(void) displayAllSectionsFromDictionary:(NSDictionary*) inputDictionary +{ + self.itemArraysBySectionName = [NSMutableDictionary dictionary]; + self.sectionNames = [NSMutableArray array]; + for( NSString* key in inputDictionary ) + { + [self.sectionNames addObject:key]; + + NSDictionary* licensesInSection = [inputDictionary objectForKey:key]; + if( licensesInSection != nil ) + { + NSMutableArray* temp = [NSMutableArray array]; + for( NSString* subkey in licensesInSection ) + { + NSDictionary* license = [licensesInSection objectForKey:subkey]; + [temp addObject:[self sampleFileInfoFromDictionary:license]]; + } + + temp = [NSMutableArray arrayWithArray: [temp sortedArrayWithOptions:0 usingComparator:^NSComparisonResult(id obj1, id obj2) { + return [((SampleFileInfo*)obj1).name compare:((SampleFileInfo*)obj2).name]; + }]]; + + [self.itemArraysBySectionName setObject:temp forKey:key]; + } + } +} + +-(void) displayOneSectionNamed:(NSString*) sectionName fromDictionary:(NSDictionary*) licensesInSection +{ + self.itemArraysBySectionName = [NSMutableDictionary dictionary]; + self.sectionNames = [NSMutableArray arrayWithArray:@[sectionName]]; + + NSMutableArray* temp = [NSMutableArray array]; + for( NSString* subkey in licensesInSection ) + { + NSDictionary* license = [licensesInSection objectForKey:subkey]; + + [temp addObject:[self sampleFileInfoFromDictionary:license]]; + } + + temp = [NSMutableArray arrayWithArray: [temp sortedArrayWithOptions:0 usingComparator:^NSComparisonResult(id obj1, id obj2) { + return [((SampleFileInfo*)obj1).name compare:((SampleFileInfo*)obj2).name]; + }]]; + + [self.itemArraysBySectionName setObject:temp forKey:sectionName]; + self.title = sectionName; +} + +-(void)viewDidLoad +{ + [super viewDidLoad]; + + if( self.sectionNames == nil + || self.itemArraysBySectionName == nil ) + { + NSLog(@"Probable mistake; you should call displayOneSectionNamed:fromDictionary: or displayAllSectionsFromDictionary: before displaying this class"); + + NSString* path = [[NSBundle mainBundle] pathForResource:@"Licenses" ofType:@"plist"]; + + NSDictionary* allLicenses = [NSDictionary dictionaryWithContentsOfFile:path]; + [self displayAllSectionsFromDictionary:allLicenses]; + } +} + +- (void)viewDidDisappear:(BOOL)animated +{ + [super viewDidDisappear:animated]; + + [self.collectionView selectItemAtIndexPath:nil animated:NO scrollPosition:UICollectionViewScrollPositionNone]; +} + +-(NSArray*) sectionAtIndex:(NSInteger) index +{ + NSString* sectionName = [self.sectionNames objectAtIndex:index]; + NSArray* section = [self.itemArraysBySectionName objectForKey:sectionName]; + return section; +} + +-(SampleFileInfo*) itemAtIndexPath:(NSIndexPath*) indexPath +{ + NSArray* section = [self sectionAtIndex:indexPath.section]; + SampleFileInfo* item = [section objectAtIndex:indexPath.row]; + return item; +} + +#pragma mark - UICollectionView + +-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath +{ + UICollectionViewCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath]; + + SampleFileInfo* item = [self itemAtIndexPath:indexPath]; + + UILabel* l = (UILabel*) [cell viewWithTag:1]; + l.text = item.name; + + UIImageView* iv = (UIImageView*) [cell viewWithTag:2]; + UIImage* savedImage = [UIImage imageNamed: item.savedBitmapFilename]; + if( savedImage != nil ) + { + iv.image = savedImage; + } + else + iv.image = nil; + + return cell; +} + +-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView +{ + return [self.sectionNames count]; +} + +-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return [self sectionAtIndex:section].count; +} + +-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath +{ + //SampleFileInfo* item = [self itemAtIndexPath:indexPath]; + + [self performSegueWithIdentifier:@"ViewSVG" sender:nil]; +} + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ + if( [segue.destinationViewController isKindOfClass:[DetailViewController class]]) + { + DetailViewController* nextVC = (DetailViewController*) segue.destinationViewController; + + SampleFileInfo* item = [self itemAtIndexPath:[self.collectionView indexPathsForSelectedItems][0]]; + nextVC.detailItem = item.source; + } +} + +@end diff --git a/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.h b/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.h new file mode 100644 index 000000000..99f9abc06 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.h @@ -0,0 +1,7 @@ +#import + +@interface VCMainMenuViewController : UIViewController + +@property(nonatomic,strong) IBOutlet UITextField* textWebURL; + +@end diff --git a/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.m b/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.m new file mode 100644 index 000000000..739c8e816 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/VCMainMenuViewController.m @@ -0,0 +1,96 @@ +#import "VCMainMenuViewController.h" + +#import "VCGridOfImagesViewController.h" +#import "DetailViewController.h" // for web loading directly +#import "SVGKSourceURL.h" // for web loading directly + +#import "VCAllSpecImages.h" // spec images have special settings in their VC, to wokraround XCode Groups/Folder References/Virtual folder build bugs (UNFIXED BY APPLE FOR 8+ years!) + +@interface VCMainMenuViewController () + +@end + +@implementation VCMainMenuViewController + +-(BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender +{ + if( [identifier isEqualToString:@"ViewURL"]) + { + NSString* s = self.textWebURL.text; + + if( s != nil && [[s lowercaseString] hasPrefix:@"http"]) + { + return TRUE; + } + else + { + [[[UIAlertView alloc] initWithTitle:@"Enter a URL" message:@"Enter a URL starting 'http://'" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil] show + ]; + return FALSE; + } + } + + return TRUE; +} + +-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender +{ + if( [segue.identifier isEqualToString:@"ViewURL"]) + { + NSString* s = self.textWebURL.text; + + if( s != nil && [[s lowercaseString] hasPrefix:@"http"]) + { + DetailViewController* nextVC = (DetailViewController*)segue.destinationViewController; + + nextVC.detailItem = [SVGKSourceURL sourceFromURL:[NSURL URLWithString:s]]; + } + } + else if( [segue.identifier hasPrefix:@"W3CTestSuite"] ) + { + VCAllSpecImages* nextVC = (VCAllSpecImages*) segue.destinationViewController; + nextVC.pathInBundleToSVGSpecTestSuiteFolder = @"W3C_SVG_11_TestSuite"; + } + else if( [segue.identifier hasPrefix:@"View"] ) + { + NSString* sectionName = nil; + + if( [segue.identifier isEqualToString:@"ViewSVGSpec"]) + { + sectionName = @"SVG Spec"; + } + else if( [segue.identifier isEqualToString:@"ViewContributed"]) + { + sectionName = @"Contributed"; + } + else if( [segue.identifier isEqualToString:@"ViewWeb"]) + { + sectionName = @"Online / from Web"; + } + else if( [segue.identifier isEqualToString:@"ViewSpecialTests"]) + { + sectionName = @"Special"; + } + + NSString* path = [[NSBundle mainBundle] pathForResource:@"Licenses" ofType:@"plist"]; + + NSDictionary* allLicenses = [NSDictionary dictionaryWithContentsOfFile:path]; + + if( sectionName == nil ) + [((VCGridOfImagesViewController*)segue.destinationViewController) displayAllSectionsFromDictionary:allLicenses]; + else + { + [((VCGridOfImagesViewController*)segue.destinationViewController) displayOneSectionNamed:sectionName fromDictionary:[allLicenses objectForKey:sectionName]]; + } + } +} + +-(BOOL)textFieldShouldReturn:(UITextField *)textField +{ + [textField resignFirstResponder]; + [self performSegueWithIdentifier:@"ViewURL" sender:self]; + + return TRUE; +} + +@end diff --git a/SVGKitLibrary/Demo-iOS/en.lproj/InfoPlist.strings b/SVGKitLibrary/Demo-iOS/en.lproj/InfoPlist.strings new file mode 100644 index 000000000..477b28ff8 --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/XCodeProjectData/Demo-iOS/en.lproj/MasterViewController_iPad.xib b/SVGKitLibrary/Demo-iOS/en.lproj/MasterViewController_iPad.xib similarity index 100% rename from XCodeProjectData/Demo-iOS/en.lproj/MasterViewController_iPad.xib rename to SVGKitLibrary/Demo-iOS/en.lproj/MasterViewController_iPad.xib diff --git a/XCodeProjectData/Demo-iOS/en.lproj/MasterViewController_iPhone.xib b/SVGKitLibrary/Demo-iOS/en.lproj/MasterViewController_iPhone.xib similarity index 100% rename from XCodeProjectData/Demo-iOS/en.lproj/MasterViewController_iPhone.xib rename to SVGKitLibrary/Demo-iOS/en.lproj/MasterViewController_iPhone.xib diff --git a/XCodeProjectData/Demo-iOS/en.lproj/iPadDetailViewController.xib b/SVGKitLibrary/Demo-iOS/en.lproj/iPadDetailViewController.xib similarity index 100% rename from XCodeProjectData/Demo-iOS/en.lproj/iPadDetailViewController.xib rename to SVGKitLibrary/Demo-iOS/en.lproj/iPadDetailViewController.xib diff --git a/SVGKitLibrary/Demo-iOS/en.lproj/iPhoneDetailViewController.xib b/SVGKitLibrary/Demo-iOS/en.lproj/iPhoneDetailViewController.xib new file mode 100644 index 000000000..08571af0e --- /dev/null +++ b/SVGKitLibrary/Demo-iOS/en.lproj/iPhoneDetailViewController.xib @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/XCodeProjectData/Demo-iOS/main.m b/SVGKitLibrary/Demo-iOS/main.m similarity index 100% rename from XCodeProjectData/Demo-iOS/main.m rename to SVGKitLibrary/Demo-iOS/main.m diff --git a/SVGKitLibrary/SVGKit-iOS Tests/Info.plist b/SVGKitLibrary/SVGKit-iOS Tests/Info.plist new file mode 100644 index 000000000..ba72822e8 --- /dev/null +++ b/SVGKitLibrary/SVGKit-iOS Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS-RetainTests.m b/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS-RetainTests.m new file mode 100644 index 000000000..31d2805a8 --- /dev/null +++ b/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS-RetainTests.m @@ -0,0 +1,86 @@ +// +// SVGKit_iOS_Tests.m +// SVGKit-iOS Tests +// +// Created by C.W. Betts on 10/13/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import +#import +#import "SVGKit.h" + +#if __has_feature(objc_arc) +#error This test file must not be compiled with ARC. +#endif + +@interface SVGKit_iOS_RetainTests : XCTestCase +@property (retain) NSBundle *pathsToSVGs; +@end + +@implementation SVGKit_iOS_RetainTests + +- (void)setUp { + [super setUp]; + + self.pathsToSVGs = [NSBundle bundleForClass:[self class]]; +} + +- (void)tearDown { + self.pathsToSVGs = nil; + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testReleasing { + @try { + @autoreleasepool { + SVGKImage *image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Note" ofType:@"svg"]]; + + // Release the image + XCTAssertNoThrow([image release]); + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +- (void)testReplacing { + @try { + @autoreleasepool { + SVGKImage *image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"CurvedDiamond" ofType:@"svg"]]; + + // Release the image + XCTAssertNoThrow([image release]); + + XCTAssertNoThrow(image = [SVGKImage imageWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Lion" ofType:@"svg"]]); + + NSLog(@"image description: %@", image.description); + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +- (void)testSameFileTwice { + @try { + @autoreleasepool { + SVGKImage *image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Monkey" ofType:@"svg"]]; + SVGKImage *image2 = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Monkey" ofType:@"svg"]]; + + // Release the images + [image release]; + [image2 release]; + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +@end diff --git a/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS_Tests.m b/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS_Tests.m new file mode 100644 index 000000000..ebeb9805d --- /dev/null +++ b/SVGKitLibrary/SVGKit-iOS Tests/SVGKit_iOS_Tests.m @@ -0,0 +1,108 @@ +// +// SVGKit_iOS_Tests.m +// SVGKit-iOS Tests +// +// Created by C.W. Betts on 10/13/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import +#import +#import "SVGKit.h" + +#if !__has_feature(objc_arc) +#error This test file must be compiled with ARC. +#endif + +@interface SVGKit_iOS_ARCRetainTests : XCTestCase +@property (strong) NSBundle *pathsToSVGs; +@end + +@implementation SVGKit_iOS_ARCRetainTests + +- (void)setUp { + [super setUp]; + + self.pathsToSVGs = [NSBundle bundleForClass:[self class]]; +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testReleasing { + @try { + @autoreleasepool { + SVGKImage *image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Note" ofType:@"svg"]]; + // Yes, this is ARC, yes we do this to quiet a warning + NSLog(@"description: %@", [image description]); + [image class]; + XCTAssertNoThrow(image = nil); + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + + + +- (void)testReplacing { + @try { + @autoreleasepool { + SVGKImage *image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"CurvedDiamond" ofType:@"svg"]]; + + // Yes, this is ARC, yes we do this to quiet a warning + NSLog(@"description: %@", [image description]); + [image class]; + + XCTAssertNoThrow(image = [SVGKImage imageWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Lion" ofType:@"svg"]]); + NSLog(@"description: %@", [image description]); + [image class]; + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +- (void)testSameFileTwice { + @try { + @autoreleasepool { + SVGKImage *image = [SVGKImage imageWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Monkey" ofType:@"svg"]]; + SVGKImage *image2 = [SVGKImage imageWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Monkey" ofType:@"svg"]]; + + // Yes, this is ARC, yes we do this to quiet a warning + NSString *image1Desc = [image description]; + NSString *image2Desc = [image2 description]; + NSLog(@"image1: %@, image 2: %@", image1Desc, image2Desc); + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +- (void)testSettingImageMultipleTimes { + @try { + @autoreleasepool { + + SVGKFastImageView *imageView = [[SVGKFastImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; + imageView.image = nil; + imageView.image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Note" ofType:@"svg"]]; + imageView.image = [[SVGKImage alloc] initWithContentsOfFile:[self.pathsToSVGs pathForResource:@"Note" ofType:@"svg"]]; + // Yes, this is ARC, yes we do this to quiet a warning + XCTAssertNoThrow(imageView = nil); + } + XCTAssertTrue(YES); + } + @catch (NSException *exception) { + XCTFail(@"Exception Thrown: %@", exception); + } +} + +@end diff --git a/SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch b/SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch new file mode 100644 index 000000000..29b7f9ff5 --- /dev/null +++ b/SVGKitLibrary/SVGKit-iOS/SVGKit-Prefix.pch @@ -0,0 +1,24 @@ +// +// Prefix header for all source files of the 'SVGKit-iOS' target in the 'SVGKit-iOS' project +// + +#ifdef __OBJC__ +#import +#import "SVGKDefine.h" + +// These macro is only used inside framework project, does not expose to public header and effect user's define + +#define SVGKIT_LOG_CONTEXT 556 + +#define SVGKitLogError(frmt, ...) +#define SVGKitLogWarn(frmt, ...) +#define SVGKitLogInfo(frmt, ...) +#define SVGKitLogDebug(frmt, ...) +#define SVGKitLogVerbose(frmt, ...) + +#if SVGKIT_MAC +#define NSStringFromCGRect(rect) NSStringFromRect(rect) +#define NSStringFromCGSize(size) NSStringFromSize(size) +#define NSStringFromCGPoint(point) NSStringFromPoint(point) +#endif +#endif diff --git a/SVGKitLibrary/SVGKit-iOS/SVGKit.modulemap b/SVGKitLibrary/SVGKit-iOS/SVGKit.modulemap new file mode 100644 index 000000000..bb1f48334 --- /dev/null +++ b/SVGKitLibrary/SVGKit-iOS/SVGKit.modulemap @@ -0,0 +1,6 @@ +framework module SVGKit { + umbrella header "SVGKit.h" + + export * + module * { export * } +} diff --git a/Samples/Rsimplified.svg b/Samples/Rsimplified.svg deleted file mode 100644 index 85a42fceb..000000000 --- a/Samples/Rsimplified.svg +++ /dev/null @@ -1,127 +0,0 @@ - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Source/AppKit additions/SVGKImageRep.h b/Source/AppKit additions/SVGKImageRep.h new file mode 100644 index 000000000..d68c9de2d --- /dev/null +++ b/Source/AppKit additions/SVGKImageRep.h @@ -0,0 +1,38 @@ +// +// SVGKitImageRep.h +// SVGKit +// +// Created by C.W. Betts on 12/5/12. +// +// + +#import +@class SVGKImage; +@class SVGKSource; + +@interface SVGKImageRep : NSImageRep +@property (nonatomic, strong, readonly) SVGKImage *image; + +//Function used by NSImageRep to init. ++ (instancetype)imageRepWithData:(NSData *)d; ++ (instancetype)imageRepWithContentsOfFile:(NSString *)filename; ++ (instancetype)imageRepWithContentsOfURL:(NSURL *)url; ++ (instancetype)imageRepWithSVGImage:(SVGKImage*)theImage; ++ (instancetype)imageRepWithSVGSource:(SVGKSource*)theSource; + +- (instancetype)initWithData:(NSData *)theData; +- (instancetype)initWithContentsOfURL:(NSURL *)theURL; +- (instancetype)initWithContentsOfFile:(NSString *)thePath; +- (instancetype)initWithSVGString:(NSString *)theString; +- (instancetype)initWithSVGImage:(SVGKImage*)theImage; +- (instancetype)initWithSVGSource:(SVGKSource*)theSource; + +- (NSData *)TIFFRepresentation; +- (NSData *)TIFFRepresentationWithSize:(NSSize)theSize; +- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)comp factor:(float)factor; +- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)comp factor:(float)factor size:(NSSize)asize; + ++ (void)loadSVGKImageRep; ++ (void)unloadSVGKImageRep; + +@end diff --git a/Source/AppKit additions/SVGKImageRep.m b/Source/AppKit additions/SVGKImageRep.m new file mode 100644 index 000000000..4baf533c5 --- /dev/null +++ b/Source/AppKit additions/SVGKImageRep.m @@ -0,0 +1,290 @@ +// +// SVGKitImageRep.m +// SVGKit +// +// Created by C.W. Betts on 12/5/12. +// +// + +#import "SVGKit.h" +#import "SVGKSourceNSData.h" +#import "SVGKSourceLocalFile.h" +#import "SVGKSourceURL.h" +#import "SVGKSourceString.h" +#import "SVGKFastImageView.h" +#import "SVGKImageRep.h" +#import "SVGKImage+CGContext.h" +#include + +@interface SVGKImageRep () +@property (nonatomic, strong, readwrite, setter = setTheSVG:) SVGKImage *image; +@property (nonatomic, assign) BOOL antiAlias; +@property (nonatomic, assign) CGFloat curveFlatness; +@property (nonatomic, assign) CGInterpolationQuality interpolationQuality; +@end + +@implementation SVGKImageRep + +- (NSData *)TIFFRepresentationWithSize:(NSSize)theSize +{ + self.image.size = theSize; + NSImageRep *imageRep = self.image.NSImage.representations.firstObject; + if (![imageRep isKindOfClass:[NSBitmapImageRep class]]) { + return nil; + } + return [(NSBitmapImageRep *)imageRep TIFFRepresentation]; +} + +- (NSData *)TIFFRepresentation +{ + return [self TIFFRepresentationWithSize:self.size]; +} + +- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)comp factor:(float)factor +{ + return [self TIFFRepresentationUsingCompression:comp factor:factor size:self.size]; +} + +- (NSData *)TIFFRepresentationUsingCompression:(NSTIFFCompression)comp factor:(float)factor size:(NSSize)asize +{ + self.image.size = asize; + NSImageRep *imageRep = self.image.NSImage.representations.firstObject; + if (![imageRep isKindOfClass:[NSBitmapImageRep class]]) { + return nil; + } + return [(NSBitmapImageRep *)imageRep TIFFRepresentation]; +} + ++ (NSArray *)imageUnfilteredTypes { + static NSArray *UTItypes; + if (UTItypes == nil) { + UTItypes = @[@"public.svg-image"]; + } + return UTItypes; +} + ++ (BOOL)canInitWithData:(NSData *)d +{ + SVGKParseResult *parseResult; + @autoreleasepool { + parseResult = [SVGKParser parseSourceUsingDefaultSVGKParser:[SVGKSourceNSData sourceFromData:d URLForRelativeLinks:nil]]; + } + if (parseResult == nil) { + return NO; + } + if (!parseResult.parsedDocument) { + return NO; + } + return YES; +} + ++ (instancetype)imageRepWithData:(NSData *)d +{ + return [[self alloc] initWithData:d]; +} + ++ (instancetype)imageRepWithContentsOfFile:(NSString *)filename +{ + return [[self alloc] initWithContentsOfFile:filename]; +} + ++ (instancetype)imageRepWithContentsOfURL:(NSURL *)url +{ + return [[self alloc] initWithContentsOfURL:url]; +} + ++ (instancetype)imageRepWithSVGSource:(SVGKSource*)theSource +{ + return [[self alloc] initWithSVGSource:theSource]; +} + ++ (instancetype)imageRepWithSVGImage:(SVGKImage*)theImage +{ + return [[self alloc] initWithSVGImage:theImage]; +} + ++ (void)load +{ + [self loadSVGKImageRep]; +} + +- (instancetype)initWithData:(NSData *)theData +{ + return [self initWithSVGImage:[[SVGKImage alloc] initWithData:theData] copy:NO]; +} + +- (instancetype)initWithContentsOfURL:(NSURL *)theURL +{ + return [self initWithSVGImage:[SVGKImage imageWithContentsOfURL:theURL] copy:NO]; +} + +- (instancetype)initWithContentsOfFile:(NSString *)thePath +{ + return [self initWithSVGImage:[[SVGKImage alloc] initWithContentsOfFile:thePath] copy:NO]; +} + +- (instancetype)initWithSVGString:(NSString *)theString +{ + return [self initWithSVGSource:[SVGKSourceString sourceFromContentsOfString:theString]]; +} + +- (instancetype)initWithSVGSource:(SVGKSource*)theSource +{ + return [self initWithSVGImage:[[SVGKImage alloc] initWithSource:theSource] copy:NO]; +} + +- (instancetype)initWithSVGImage:(SVGKImage*)theImage copy:(BOOL)copyImage +{ + if (self = [super init]) { + if (theImage == nil) { + return nil; + } + SVGKImage *tmpImage; + if (copyImage) { + tmpImage = [theImage copy]; + if (tmpImage) { + theImage = tmpImage; + } + } + + self.image = theImage; + + if (![self.image hasSize]) { + self.image.size = CGSizeMake(32, 32); + } + + self.colorSpaceName = NSCalibratedRGBColorSpace; + self.alpha = YES; + self.opaque = NO; + [self setSize:self.image.size sizeImage:NO]; + self.interpolationQuality = kCGInterpolationDefault; + self.antiAlias = YES; + self.curveFlatness = 1.0; + + // Setting these to zero will tell NSImage that this image is resolution-independant. + self.pixelsHigh = 0; + self.pixelsWide = 0; + self.bitsPerSample = 0; + } + return self; +} + +- (instancetype)init +{ + NSAssert(NO, @"init not supported, use initWithData:"); + + return nil; +} + +- (void)setSize:(NSSize)aSize +{ + [self setSize:aSize sizeImage:YES]; +} + +- (void)setSize:(NSSize)aSize sizeImage:(BOOL)theSize +{ + [super setSize:aSize]; + if (theSize) { + self.image.size = aSize; + } +} + ++ (void)loadSVGKImageRep +{ + [NSImageRep registerImageRepClass:[SVGKImageRep class]]; +} + ++ (void)unloadSVGKImageRep +{ + [NSImageRep unregisterImageRepClass:[SVGKImageRep class]]; +} + +- (instancetype)initWithSVGImage:(SVGKImage*)theImage +{ + //Copy over the image, just in case + return [self initWithSVGImage:theImage copy:YES]; +} + +- (BOOL)drawInRect:(NSRect)rect +{ + NSSize scaledSize = rect.size; + if (!CGSizeEqualToSize(self.image.size, scaledSize)) { + //For when we're at the full size. + if (CGSizeEqualToSize(self.size, scaledSize)) { + return [super drawInRect:rect]; + } else { + [self.image scaleToFitInside:scaledSize]; + } + } else if (CGSizeEqualToSize(self.size, scaledSize) && + CGSizeEqualToSize(self.image.size, self.size)) { + return [super drawInRect:rect]; + } + + CGContextRef imRepCtx = [[NSGraphicsContext currentContext] graphicsPort]; + CGLayerRef layerRef = CGLayerCreateWithContext(imRepCtx, rect.size, NULL); + if (!layerRef) { + return NO; + } + + CGContextRef layerCont = CGLayerGetContext(layerRef); + CGContextSaveGState(layerCont); + [self.image renderToContext:layerCont antiAliased:_antiAlias curveFlatnessFactor:_curveFlatness interpolationQuality:_interpolationQuality flipYaxis:YES]; + CGContextRestoreGState(layerCont); + + CGContextDrawLayerInRect(imRepCtx, rect, layerRef); + CGLayerRelease(layerRef); + + return YES; +} + +- (BOOL)draw +{ + //Just in case someone resized the image rep. + NSSize scaledSize = self.size; + if (!CGSizeEqualToSize(self.image.size, scaledSize)) { + self.image.size = scaledSize; + } + + CGContextRef imRepCtx = [[NSGraphicsContext currentContext] graphicsPort]; + CGLayerRef layerRef = CGLayerCreateWithContext(imRepCtx, scaledSize, NULL); + if (!layerRef) { + return NO; + } + + CGContextRef layerCont = CGLayerGetContext(layerRef); + CGContextSaveGState(layerCont); + [self.image renderToContext:layerCont antiAliased:_antiAlias curveFlatnessFactor:_curveFlatness interpolationQuality:_interpolationQuality flipYaxis:YES]; + CGContextRestoreGState(layerCont); + + CGContextDrawLayerAtPoint(imRepCtx, CGPointZero, layerRef); + CGLayerRelease(layerRef); + + return YES; +} + +#pragma mark - Inherited protocols + +#pragma mark NSCopying + +- (id)copyWithZone:(NSZone *)zone +{ + SVGKImageRep *toRet = [[SVGKImageRep alloc] initWithSVGImage:self.image]; + + return toRet; +} + +#pragma mark NSCoding +- (instancetype)initWithCoder:(NSCoder *)coder +{ + if (self = [super initWithCoder:coder]) { + + } + return self; +} + +- (void)encodeWithCoder:(NSCoder *)aCoder +{ + [super encodeWithCoder:aCoder]; +} + +@end diff --git a/Source/DOM classes/Core DOM/Attr.h b/Source/DOM classes/Core DOM/Attr.h index 4802d7926..f387aed01 100644 --- a/Source/DOM classes/Core DOM/Attr.h +++ b/Source/DOM classes/Core DOM/Attr.h @@ -18,17 +18,16 @@ /** objc won't allow this: @class Node;*/ #import "Node.h" @class Element; -#import "Element.h" @interface Attr : Node /*! NB: The official DOM spec FAILS TO SPECIFY what the value of "name" is */ -@property(nonatomic,retain,readonly) NSString* name; +@property(nonatomic,strong,readonly) NSString* name; @property(nonatomic,readonly) BOOL specified; -@property(nonatomic,retain,readonly) NSString* value; +@property(nonatomic,strong,readonly) NSString* value; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) Element* ownerElement; +@property(nonatomic,strong,readonly) Element* ownerElement; #pragma mark - ObjC methods diff --git a/Source/DOM classes/Core DOM/Attr.m b/Source/DOM classes/Core DOM/Attr.m index f281d9aa3..632b9b2d4 100644 --- a/Source/DOM classes/Core DOM/Attr.m +++ b/Source/DOM classes/Core DOM/Attr.m @@ -11,12 +11,12 @@ #import "Node+Mutable.h" @interface Attr() - @property(nonatomic,retain,readwrite) NSString* name; + @property(nonatomic,strong,readwrite) NSString* name; @property(nonatomic,readwrite) BOOL specified; - @property(nonatomic,retain,readwrite) NSString* value; + @property(nonatomic,strong,readwrite) NSString* value; // Introduced in DOM Level 2: - @property(nonatomic,retain,readwrite) Element* ownerElement; + @property(nonatomic,strong,readwrite) Element* ownerElement; @end @implementation Attr @@ -50,11 +50,5 @@ - (id)initWithNamespace:(NSString*) ns qualifiedName:(NSString*) qn value:(NSStr return self; } -- (void)dealloc { - self.name = nil; - self.value = nil; - self.ownerElement = nil; - [super dealloc]; -} @end diff --git a/Source/DOM classes/Core DOM/CSSPrimitiveValue.m b/Source/DOM classes/Core DOM/CSSPrimitiveValue.m index 59ad5c8d5..31ae25c03 100644 --- a/Source/DOM classes/Core DOM/CSSPrimitiveValue.m +++ b/Source/DOM classes/Core DOM/CSSPrimitiveValue.m @@ -5,11 +5,12 @@ #import "DOMGlobalSettings.h" #define INCHES_PER_CENTIMETRE ( 0.393700787f ) +#define INCHES_PER_MILLIMETER ( 0.0393701f ) @interface CSSPrimitiveValue() @property(nonatomic) float internalValue; -@property(nonatomic,retain) NSString* internalString; +@property(nonatomic,strong) NSString* internalString; @end @@ -22,10 +23,6 @@ @implementation CSSPrimitiveValue @synthesize primitiveType; -- (void)dealloc { - self.internalString = nil; - [super dealloc]; -} - (id)init { @@ -77,7 +74,7 @@ -(float) getFloatValue:(CSSPrimitiveType) unitType }break; case CSS_MM: { - valueAsInches = self.internalValue * INCHES_PER_CENTIMETRE * 10.0f; + valueAsInches = self.internalValue * INCHES_PER_MILLIMETER; }break; case CSS_PT: { @@ -87,9 +84,14 @@ -(float) getFloatValue:(CSSPrimitiveType) unitType { valueAsInches = self.internalValue * 12.0f / 72.0f; }break; - + case CSS_IN: + { + valueAsInches = self.internalValue; + }break; + default: { + valueAsInches = 0; NSAssert( FALSE, @"This line is impossible but Apple's compiler is crap" ); } } @@ -102,7 +104,7 @@ -(float) getFloatValue:(CSSPrimitiveType) unitType }break; case CSS_MM: { - return valueAsInches / INCHES_PER_CENTIMETRE * 10.0f; + return valueAsInches / INCHES_PER_MILLIMETER; }break; case CSS_PT: { @@ -219,9 +221,7 @@ -(NSString*) getStringValue -(void)setCssText:(NSString *)newCssText { - [_cssText release]; _cssText = newCssText; - [_cssText retain]; /** the css text value has been set, so we need to split the elements up and save them in the internal array */ if( _cssText == nil @@ -286,7 +286,7 @@ -(void)setCssText:(NSString *)newCssText { /* Option 2: it's a string - or corrupt, which we're not going to handle here */ #if DEBUG_DOM_PARSING - DDLogVerbose(@"[%@] WARNING: not bothering to work out 'what kind of CSS string' this string is. CSS is stupid. String = %@", [self class], _cssText ); + SVGKitLogVerbose(@"[%@] WARNING: not bothering to work out 'what kind of CSS string' this string is. CSS is stupid. String = %@", [self class], _cssText ); #endif [self setStringValue:CSS_STRING stringValue:_cssText]; // -------- NB: we allow any string-to-string conversion, so it's not a huge problem that we dont correctly detect "url" versus "other kind of string". I hate CSS Parsing... } diff --git a/Source/DOM classes/Core DOM/CSSRule.h b/Source/DOM classes/Core DOM/CSSRule.h index fbf448722..dddcee8c0 100644 --- a/Source/DOM classes/Core DOM/CSSRule.h +++ b/Source/DOM classes/Core DOM/CSSRule.h @@ -37,9 +37,9 @@ typedef enum CSSRuleType @interface CSSRule : NSObject @property(nonatomic) unsigned short type; -@property(nonatomic,retain) NSString* cssText; +@property(nonatomic,strong) NSString* cssText; -@property(nonatomic,retain) CSSStyleSheet* parentStyleSheet; -@property(nonatomic,retain) CSSRule* parentRule; +@property(nonatomic,strong) CSSStyleSheet* parentStyleSheet; +@property(nonatomic,strong) CSSRule* parentRule; @end diff --git a/Source/DOM classes/Core DOM/CSSRule.m b/Source/DOM classes/Core DOM/CSSRule.m index 6e92dc9ef..52a32624e 100644 --- a/Source/DOM classes/Core DOM/CSSRule.m +++ b/Source/DOM classes/Core DOM/CSSRule.m @@ -8,11 +8,5 @@ @implementation CSSRule @synthesize parentStyleSheet; @synthesize parentRule; -- (void)dealloc { - self.cssText = nil; - self.parentRule = nil; - self.parentStyleSheet = nil; - [super dealloc]; -} @end diff --git a/Source/DOM classes/Core DOM/CSSRuleList+Mutable.h b/Source/DOM classes/Core DOM/CSSRuleList+Mutable.h index 37f56b3cb..cb0628092 100644 --- a/Source/DOM classes/Core DOM/CSSRuleList+Mutable.h +++ b/Source/DOM classes/Core DOM/CSSRuleList+Mutable.h @@ -2,6 +2,6 @@ @interface CSSRuleList () -@property(nonatomic,retain) NSMutableArray* internalArray; +@property(nonatomic,strong) NSMutableArray* internalArray; @end diff --git a/Source/DOM classes/Core DOM/CSSRuleList.m b/Source/DOM classes/Core DOM/CSSRuleList.m index 0e5e5380a..f3c45adbf 100644 --- a/Source/DOM classes/Core DOM/CSSRuleList.m +++ b/Source/DOM classes/Core DOM/CSSRuleList.m @@ -5,10 +5,6 @@ @implementation CSSRuleList @synthesize internalArray; -- (void)dealloc { - self.internalArray = nil; - [super dealloc]; -} - (id)init { diff --git a/Source/DOM classes/Core DOM/CSSStyleDeclaration.h b/Source/DOM classes/Core DOM/CSSStyleDeclaration.h index 49d7edb35..3a5abbff6 100644 --- a/Source/DOM classes/Core DOM/CSSStyleDeclaration.h +++ b/Source/DOM classes/Core DOM/CSSStyleDeclaration.h @@ -31,7 +31,7 @@ "The parsable textual representation of the declaration block (excluding the surrounding curly braces). Setting this attribute will result in the parsing of the new value and resetting of all the properties in the declaration block including the removal or addition of properties." */ -@property(nonatomic,retain) NSString* cssText; +@property(nonatomic,strong) NSString* cssText; -(NSString*) getPropertyValue:(NSString*) propertyName; -(CSSValue*) getPropertyCSSValue:(NSString*) propertyName; @@ -44,6 +44,6 @@ -(NSString*) item:(long) index; -@property(nonatomic,retain) CSSRule* parentRule; +@property(nonatomic,strong) CSSRule* parentRule; @end diff --git a/Source/DOM classes/Core DOM/CSSStyleDeclaration.m b/Source/DOM classes/Core DOM/CSSStyleDeclaration.m index 78c1245ad..d2072f5ce 100644 --- a/Source/DOM classes/Core DOM/CSSStyleDeclaration.m +++ b/Source/DOM classes/Core DOM/CSSStyleDeclaration.m @@ -6,7 +6,7 @@ @interface CSSStyleDeclaration() -@property(nonatomic,retain) NSMutableDictionary* internalDictionaryOfStylesByCSSClass; +@property(nonatomic,strong) NSMutableDictionary* internalDictionaryOfStylesByCSSClass; @end @@ -18,12 +18,6 @@ @implementation CSSStyleDeclaration @synthesize length; @synthesize parentRule; -- (void)dealloc { - [_cssText release]; - self.parentRule = nil; - self.internalDictionaryOfStylesByCSSClass = nil; - [super dealloc]; -} - (id)init { @@ -43,9 +37,7 @@ - (id)init */ -(void)setCssText:(NSString *)newCSSText { - [_cssText release]; _cssText = newCSSText; - [newCSSText retain]; /** and now post-process it, *as required by* the CSS/DOM spec... */ NSMutableDictionary* processedStyles = [self NSDictionaryFromCSSAttributes:_cssText]; @@ -56,6 +48,7 @@ -(void)setCssText:(NSString *)newCSSText -(NSMutableDictionary *) NSDictionaryFromCSSAttributes: (NSString *)css { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; + NSCharacterSet* trimChars = [NSCharacterSet whitespaceAndNewlineCharacterSet]; const char *cstr = [css UTF8String]; size_t len = strlen(cstr); @@ -71,12 +64,8 @@ -(NSMutableDictionary *) NSDictionaryFromCSSAttributes: (NSString *)css { for (size_t n = 0; n <= len; n++) { char c = cstr[n]; - if (c == '\n' || c == '\t' || c == ' ') { - continue; - } - if (c == ':') { - strcpy(name, accum); + strncpy(name, accum, MAX_NAME); name[accumIdx] = '\0'; bzero(accum, MAX_ACCUM); @@ -89,28 +78,23 @@ -(NSMutableDictionary *) NSDictionaryFromCSSAttributes: (NSString *)css { { accum[accumIdx] = '\0'; - NSString *keyString = [[NSString alloc] initWithUTF8String:name]; //key is copied anyways, autoreleased object creates clutter - NSString *cssValueString = [NSString stringWithUTF8String:accum]; - - NSMutableCharacterSet* trimmingSetForKey = [[[NSMutableCharacterSet alloc] init] autorelease]; - /* add any extra characters to the trim-set if needed here; seems we're OK with the Apple provided whitespace set right now */ - [trimmingSetForKey formUnionWithCharacterSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; - - [keyString autorelease]; // needed because Apple provides no direct method for the next line, so we have to release the variable we're about to overwrite - keyString = [keyString stringByTrimmingCharactersInSet:trimmingSetForKey]; + NSString *keyString = [[NSString stringWithUTF8String:name] + stringByTrimmingCharactersInSet:trimChars]; + NSString *cssValueString = [[NSString stringWithUTF8String:accum] + stringByTrimmingCharactersInSet:trimChars]; CSSValue *cssValue; if( [cssValueString rangeOfString:@" "].length > 0 ) - cssValue = [[[CSSValueList alloc] init] autorelease]; + cssValue = [[CSSValueList alloc] init]; else - cssValue = [[[CSSPrimitiveValue alloc] init] autorelease]; + cssValue = [[CSSPrimitiveValue alloc] init]; cssValue.cssText = cssValueString; // has the side-effect of parsing, if required [dict setObject:cssValue forKey:keyString]; bzero(name, MAX_NAME); - + bzero(accum, MAX_ACCUM); accumIdx = 0; } @@ -119,9 +103,13 @@ -(NSMutableDictionary *) NSDictionaryFromCSSAttributes: (NSString *)css { } accum[accumIdx++] = c; + if (accumIdx >= MAX_ACCUM) { + SVGKitLogWarn(@"Buffer ovverun while parsing style sheet - skipping"); + return dict; + } } - return [dict autorelease]; + return dict; } -(NSString*) getPropertyValue:(NSString*) propertyName diff --git a/Source/DOM classes/Core DOM/CSSStyleRule.h b/Source/DOM classes/Core DOM/CSSStyleRule.h index 65833c623..0e3fffb1d 100644 --- a/Source/DOM classes/Core DOM/CSSStyleRule.h +++ b/Source/DOM classes/Core DOM/CSSStyleRule.h @@ -14,8 +14,8 @@ @interface CSSStyleRule : CSSRule -@property(nonatomic,retain) NSString* selectorText; -@property(nonatomic,retain) CSSStyleDeclaration* style; +@property(nonatomic,strong) NSString* selectorText; +@property(nonatomic,strong) CSSStyleDeclaration* style; #pragma mark - methods needed for ObjectiveC implementation diff --git a/Source/DOM classes/Core DOM/CSSStyleRule.m b/Source/DOM classes/Core DOM/CSSStyleRule.m index 738246ebe..494ea9153 100644 --- a/Source/DOM classes/Core DOM/CSSStyleRule.m +++ b/Source/DOM classes/Core DOM/CSSStyleRule.m @@ -6,11 +6,6 @@ @implementation CSSStyleRule @synthesize selectorText; @synthesize style; -- (void)dealloc { - self.style = nil; - self.selectorText = nil; - [super dealloc]; -} - (id)init { @@ -26,7 +21,7 @@ - (id)initWithSelectorText:(NSString*) selector styleText:(NSString*) styleText; if (self) { self.selectorText = selector; - CSSStyleDeclaration* styleDeclaration = [[[CSSStyleDeclaration alloc] init] autorelease]; + CSSStyleDeclaration* styleDeclaration = [[CSSStyleDeclaration alloc] init]; styleDeclaration.cssText = styleText; self.style = styleDeclaration; diff --git a/Source/DOM classes/Core DOM/CSSStyleSheet.h b/Source/DOM classes/Core DOM/CSSStyleSheet.h index c14e8123e..f2fa9c659 100644 --- a/Source/DOM classes/Core DOM/CSSStyleSheet.h +++ b/Source/DOM classes/Core DOM/CSSStyleSheet.h @@ -18,8 +18,8 @@ @interface CSSStyleSheet : NSObject -@property(nonatomic,retain) CSSRule* ownerRule; -@property(nonatomic,retain) CSSRuleList* cssRules; +@property(nonatomic,strong) CSSRule* ownerRule; +@property(nonatomic,strong) CSSRuleList* cssRules; -(long) insertRule:(NSString*) rule index:(unsigned long) index; -(void) deleteRule:(unsigned long) index; diff --git a/Source/DOM classes/Core DOM/CSSStyleSheet.m b/Source/DOM classes/Core DOM/CSSStyleSheet.m index 5392ebf56..31a49678a 100644 --- a/Source/DOM classes/Core DOM/CSSStyleSheet.m +++ b/Source/DOM classes/Core DOM/CSSStyleSheet.m @@ -9,11 +9,6 @@ @implementation CSSStyleSheet @synthesize ownerRule; @synthesize cssRules; -- (void)dealloc { - self.ownerRule = nil; - self.cssRules = nil; - [super dealloc]; -} /** Used to insert a new rule into the style sheet. The new rule now becomes part of the cascade. @@ -37,12 +32,12 @@ -(long)insertRule:(NSString *)rule index:(unsigned long)index NSCharacterSet *whitespaceSet = [NSCharacterSet whitespaceAndNewlineCharacterSet]; rule = [rule stringByTrimmingCharactersInSet:whitespaceSet]; - // DDLogVerbose(@"A substringie %@", idStyleString); + // SVGKitLogVerbose(@"A substringie %@", idStyleString); NSArray* stringSplitContainer = [rule componentsSeparatedByString:@"{"]; if( [stringSplitContainer count] >= 2 ) //not necessary unless using shitty svgs { - CSSStyleRule* newRule = [[[CSSStyleRule alloc] initWithSelectorText:[[stringSplitContainer objectAtIndex:0] substringFromIndex:1] styleText:[stringSplitContainer objectAtIndex:1]] autorelease]; + CSSStyleRule* newRule = [[CSSStyleRule alloc] initWithSelectorText:[stringSplitContainer objectAtIndex:0] styleText:[stringSplitContainer objectAtIndex:1]]; [self.cssRules.internalArray insertObject:newRule atIndex:index-1]; // CSS says you insert "BEFORE" the index, which is the opposite of most C-based programming languages @@ -67,7 +62,7 @@ - (id)initWithString:(NSString*) styleSheetBody self = [super init]; if (self) { - self.cssRules = [[[CSSRuleList alloc]init] autorelease]; + self.cssRules = [[CSSRuleList alloc]init]; @autoreleasepool { //creating lots of autoreleased strings, not helpful for older devices /** @@ -76,7 +71,7 @@ - (id)initWithString:(NSString*) styleSheetBody NB: you NEED the NSRegularExpressionDotMatchesLineSeparators argument - which Apple DOES NOT HONOUR in NSString - hence have to use NSRegularExpression */ NSError* error; - NSRegularExpression* regexp = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*\\*/" options: NSRegularExpressionDotMatchesLineSeparators error:&error]; + NSRegularExpression* regexp = [NSRegularExpression regularExpressionWithPattern:@"/\\*.*?\\*/" options: NSRegularExpressionDotMatchesLineSeparators error:&error]; styleSheetBody = [regexp stringByReplacingMatchesInString:styleSheetBody options:0 range:NSMakeRange(0,styleSheetBody.length) withTemplate:@""]; NSArray *classNameAndStyleStrings = [styleSheetBody componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"}"]]; diff --git a/Source/DOM classes/Core DOM/CSSValue.h b/Source/DOM classes/Core DOM/CSSValue.h index be475bfa5..fe2154870 100644 --- a/Source/DOM classes/Core DOM/CSSValue.h +++ b/Source/DOM classes/Core DOM/CSSValue.h @@ -29,7 +29,7 @@ typedef enum CSSUnitType NSString* _cssText; // for subclasses to manually set } -@property(nonatomic,retain) NSString* cssText; +@property(nonatomic,strong) NSString* cssText; @property(nonatomic) CSSUnitType cssValueType; @end diff --git a/Source/DOM classes/Core DOM/CSSValue.m b/Source/DOM classes/Core DOM/CSSValue.m index 93e776d0b..d9314f442 100644 --- a/Source/DOM classes/Core DOM/CSSValue.m +++ b/Source/DOM classes/Core DOM/CSSValue.m @@ -6,10 +6,6 @@ @implementation CSSValue @synthesize cssText = _cssText; @synthesize cssValueType; -- (void)dealloc { - [_cssText release]; - [super dealloc]; -} - (id)init { diff --git a/Source/DOM classes/Core DOM/CSSValueList.m b/Source/DOM classes/Core DOM/CSSValueList.m index 222068c38..665afcdc4 100644 --- a/Source/DOM classes/Core DOM/CSSValueList.m +++ b/Source/DOM classes/Core DOM/CSSValueList.m @@ -3,7 +3,7 @@ @interface CSSValueList() -@property(nonatomic,retain) NSArray* internalArray; +@property(nonatomic,strong) NSArray* internalArray; @end @@ -11,10 +11,6 @@ @implementation CSSValueList @synthesize internalArray; -- (void)dealloc { - self.internalArray = nil; - [super dealloc]; -} - (id)init { @@ -39,12 +35,10 @@ -(CSSValue*) item:(unsigned long) index -(void)setCssText:(NSString *)newCssText { - [_cssText release]; _cssText = newCssText; - [_cssText retain]; /** the css text value has been set, so we need to split the elements up and save them in the internal array */ - DDLogVerbose(@"[%@] received new CSS Text, need to split this and save as CSSValue instances: %@", [self class], _cssText); + SVGKitLogVerbose(@"[%@] received new CSS Text, need to split this and save as CSSValue instances: %@", [self class], _cssText); self.internalArray = [_cssText componentsSeparatedByString:@" "]; } diff --git a/Source/DOM classes/Core DOM/CharacterData.h b/Source/DOM classes/Core DOM/CharacterData.h index bc8c4a30e..e377db329 100644 --- a/Source/DOM classes/Core DOM/CharacterData.h +++ b/Source/DOM classes/Core DOM/CharacterData.h @@ -35,7 +35,7 @@ @interface CharacterData : Node -@property(nonatomic,retain,readonly) NSString* data; +@property(nonatomic,strong,readonly) NSString* data; @property(nonatomic,readonly) unsigned long length; diff --git a/Source/DOM classes/Core DOM/CharacterData.m b/Source/DOM classes/Core DOM/CharacterData.m index e3ac1a257..e46acb8e1 100644 --- a/Source/DOM classes/Core DOM/CharacterData.m +++ b/Source/DOM classes/Core DOM/CharacterData.m @@ -14,10 +14,6 @@ @implementation CharacterData @synthesize length; -- (void)dealloc { - [data release]; - [super dealloc]; -} -(NSString*) substringData:(unsigned long) offset count:(unsigned long) count { diff --git a/Source/DOM classes/Core DOM/Comment.h b/Source/DOM classes/Core DOM/Comment.h index 1c8e18a14..de99baca1 100644 --- a/Source/DOM classes/Core DOM/Comment.h +++ b/Source/DOM classes/Core DOM/Comment.h @@ -10,7 +10,10 @@ #import #import "CharacterData.h" - +#ifdef __CARBONCORE__ +// macOS's out-of-date Carbon API defined the `Comment` struct and cause naming conflict, so we need re-define it and use macro to avoid changing exist API +#define Comment SVGKComment +#endif @interface Comment : CharacterData - (id)initWithValue:(NSString*) v; diff --git a/Source/DOM classes/Core DOM/DOMGlobalSettings.h b/Source/DOM classes/Core DOM/DOMGlobalSettings.h index 1ddcd2954..661b12837 100644 --- a/Source/DOM classes/Core DOM/DOMGlobalSettings.h +++ b/Source/DOM classes/Core DOM/DOMGlobalSettings.h @@ -1 +1 @@ -#define DEBUG_DOM_PARSING 0 \ No newline at end of file +#define DEBUG_DOM_PARSING 0 diff --git a/Source/DOM classes/Core DOM/DOMHelperUtilities.h b/Source/DOM classes/Core DOM/DOMHelperUtilities.h index 1b3654f37..10d6587e5 100644 --- a/Source/DOM classes/Core DOM/DOMHelperUtilities.h +++ b/Source/DOM classes/Core DOM/DOMHelperUtilities.h @@ -13,6 +13,8 @@ @class Node, NodeList, Element; // avoiding #import here, to avoid C header loop problems. +#define DEBUG_DOM_MATCH_ELEMENTS_IDS_AND_NAMES 0 // For debugging SVGKit: causes debug output on getElementById etc + @interface DOMHelperUtilities : NSObject /*! This useful method provides both the DOM level 1 and the DOM level 2 implementations of searching the tree for a node - because THEY ARE DIFFERENT diff --git a/Source/DOM classes/Core DOM/DOMHelperUtilities.m b/Source/DOM classes/Core DOM/DOMHelperUtilities.m index 3f298ca21..6bb274272 100644 --- a/Source/DOM classes/Core DOM/DOMHelperUtilities.m +++ b/Source/DOM classes/Core DOM/DOMHelperUtilities.m @@ -1,3 +1,4 @@ + #import "DOMHelperUtilities.h" #import "Element.h" @@ -60,9 +61,16 @@ +(Element*) privateGetElementById:(NSString*) idValue childrenOfElement:(Node*) if( [parent isKindOfClass:[Element class]] ) { Element* parentAsElement = (Element*) parent; - + if( [[parentAsElement getAttribute:@"id"] isEqualToString:idValue]) return parentAsElement; +#if DEBUG_DOM_MATCH_ELEMENTS_IDS_AND_NAMES + else + { + SVGKitLogVerbose(@"parent <%@ id='%@'..> does not match id='%@'", parentAsElement.nodeName, [parentAsElement getAttribute:@"id"], idValue ); + SVGKitLogVerbose(@"parent <%@ id='%@'..> has %li child nodes = %@", parentAsElement.nodeName, [parentAsElement getAttribute:@"id"], parent.childNodes.length, parent.childNodes ); + } +#endif } for( Node* childNode in parent.childNodes ) diff --git a/Source/DOM classes/Core DOM/Document+Mutable.h b/Source/DOM classes/Core DOM/Document+Mutable.h index 72a04c6dd..46631fce4 100644 --- a/Source/DOM classes/Core DOM/Document+Mutable.h +++ b/Source/DOM classes/Core DOM/Document+Mutable.h @@ -2,6 +2,6 @@ @interface Document () -@property(nonatomic,retain,readwrite) Element* documentElement; +@property(nonatomic,strong,readwrite) Element* documentElement; @end diff --git a/Source/DOM classes/Core DOM/Document.h b/Source/DOM classes/Core DOM/Document.h index 2bb20458c..9f69a72ec 100644 --- a/Source/DOM classes/Core DOM/Document.h +++ b/Source/DOM classes/Core DOM/Document.h @@ -58,7 +58,7 @@ #import "Node.h" @class Element; #import "Element.h" -@class Comment; +//@class Comment; #import "Comment.h" @class CDATASection; #import "CDATASection.h" @@ -77,9 +77,9 @@ @interface Document : Node -@property(nonatomic,retain,readonly) DocumentType* doctype; -@property(nonatomic,retain,readonly) AppleSucksDOMImplementation* implementation; -@property(nonatomic,retain,readonly) Element* documentElement; +@property(nonatomic,strong,readonly) DocumentType* doctype; +@property(nonatomic,strong,readonly) AppleSucksDOMImplementation* implementation; +@property(nonatomic,strong,readonly) Element* documentElement; -(Element*) createElement:(NSString*) tagName __attribute__((ns_returns_retained)); diff --git a/Source/DOM classes/Core DOM/Document.m b/Source/DOM classes/Core DOM/Document.m index 1d5e54586..f9ce5facd 100644 --- a/Source/DOM classes/Core DOM/Document.m +++ b/Source/DOM classes/Core DOM/Document.m @@ -12,18 +12,12 @@ @implementation Document @synthesize documentElement; -- (void)dealloc { - [doctype release]; - [implementation release]; - [documentElement release]; - [super dealloc]; -} -(Element*) createElement:(NSString*) tagName { Element* newElement = [[Element alloc] initWithLocalName:tagName attributes:nil]; - DDLogVerbose( @"[%@] WARNING: SVG Spec, missing feature: if there are known attributes with default values, Attr nodes representing them SHOULD BE automatically created and attached to the element.", [self class] ); + SVGKitLogVerbose( @"[%@] WARNING: SVG Spec, missing feature: if there are known attributes with default values, Attr nodes representing them SHOULD BE automatically created and attached to the element.", [self class] ); return newElement; } @@ -66,7 +60,7 @@ -(EntityReference*) createEntityReference:(NSString*) data -(NodeList*) getElementsByTagName:(NSString*) data { - NodeList* accumulator = [[[NodeList alloc] init] autorelease]; + NodeList* accumulator = [[NodeList alloc] init]; [DOMHelperUtilities privateGetElementsByName:data inNamespace:nil childrenOfElement:self.documentElement addToList:accumulator]; return accumulator; @@ -84,7 +78,7 @@ -(Element*) createElementNS:(NSString*) namespaceURI qualifiedName:(NSString*) q { Element* newElement = [[Element alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:namespaceURI attributes:nil]; - DDLogVerbose( @"[%@] WARNING: SVG Spec, missing feature: if there are known attributes with default values, Attr nodes representing them SHOULD BE automatically created and attached to the element.", [self class] ); + SVGKitLogVerbose( @"[%@] WARNING: SVG Spec, missing feature: if there are known attributes with default values, Attr nodes representing them SHOULD BE automatically created and attached to the element.", [self class] ); return newElement; } @@ -93,14 +87,14 @@ -(Element*) createElementNS:(NSString*) namespaceURI qualifiedName:(NSString*) q -(Attr*) createAttributeNS:(NSString*) namespaceURI qualifiedName:(NSString*) qualifiedName { NSAssert( FALSE, @"This should be re-implemented to share code with createElementNS: method above" ); - Attr* newAttr = [[[Attr alloc] initWithNamespace:namespaceURI qualifiedName:qualifiedName value:@""] autorelease]; + Attr* newAttr = [[Attr alloc] initWithNamespace:namespaceURI qualifiedName:qualifiedName value:@""]; return newAttr; } // Introduced in DOM Level 2: -(NodeList*) getElementsByTagNameNS:(NSString*) namespaceURI localName:(NSString*) localName { - NodeList* accumulator = [[[NodeList alloc] init] autorelease]; + NodeList* accumulator = [[NodeList alloc] init]; [DOMHelperUtilities privateGetElementsByName:localName inNamespace:namespaceURI childrenOfElement:self.documentElement addToList:accumulator]; return accumulator; diff --git a/Source/DOM classes/Core DOM/DocumentType.h b/Source/DOM classes/Core DOM/DocumentType.h index 0ebd9c633..36b388af7 100644 --- a/Source/DOM classes/Core DOM/DocumentType.h +++ b/Source/DOM classes/Core DOM/DocumentType.h @@ -22,18 +22,18 @@ @interface DocumentType : Node -@property(nonatomic,retain,readonly) NSString* name; -@property(nonatomic,retain,readonly) NamedNodeMap* entities; -@property(nonatomic,retain,readonly) NamedNodeMap* notations; +@property(nonatomic,strong,readonly) NSString* name; +@property(nonatomic,strong,readonly) NamedNodeMap* entities; +@property(nonatomic,strong,readonly) NamedNodeMap* notations; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* publicId; +@property(nonatomic,strong,readonly) NSString* publicId; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* systemId; +@property(nonatomic,strong,readonly) NSString* systemId; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* internalSubset; +@property(nonatomic,strong,readonly) NSString* internalSubset; @end diff --git a/Source/DOM classes/Core DOM/DocumentType.m b/Source/DOM classes/Core DOM/DocumentType.m index c9bc90ccf..3878a2a91 100644 --- a/Source/DOM classes/Core DOM/DocumentType.m +++ b/Source/DOM classes/Core DOM/DocumentType.m @@ -40,14 +40,5 @@ @implementation DocumentType // Introduced in DOM Level 2: @synthesize internalSubset; -- (void)dealloc { - [name release]; - [entities release]; - [notations release]; - [publicId release]; - [systemId release]; - [internalSubset release]; - [super dealloc]; -} @end diff --git a/Source/DOM classes/Core DOM/Element.h b/Source/DOM classes/Core DOM/Element.h index 1345a9a55..e4182645d 100644 --- a/Source/DOM classes/Core DOM/Element.h +++ b/Source/DOM classes/Core DOM/Element.h @@ -57,7 +57,7 @@ @interface Element : Node -@property(nonatomic,retain,readonly) NSString* tagName; +@property(nonatomic,strong,readonly) NSString* tagName; -(NSString*) getAttribute:(NSString*) name; -(void) setAttribute:(NSString*) name value:(NSString*) value; diff --git a/Source/DOM classes/Core DOM/Element.m b/Source/DOM classes/Core DOM/Element.m index e01d7d5b1..b57c6cee8 100644 --- a/Source/DOM classes/Core DOM/Element.m +++ b/Source/DOM classes/Core DOM/Element.m @@ -4,17 +4,13 @@ #import "DOMHelperUtilities.h" @interface Element() -@property(nonatomic,retain,readwrite) NSString* tagName; +@property(nonatomic,strong,readwrite) NSString* tagName; @end @implementation Element @synthesize tagName; -- (void)dealloc { - self.tagName = nil; - [super dealloc]; -} - (id)initWithLocalName:(NSString*) n attributes:(NSMutableDictionary*) attributes { self = [super initType:DOMNodeType_ELEMENT_NODE name:n]; @@ -64,7 +60,7 @@ -(NSString*) getAttribute:(NSString*) name -(void) setAttribute:(NSString*) name value:(NSString*) value { - Attr* att = [[[Attr alloc] initWithName:name value:value] autorelease]; + Attr* att = [[Attr alloc] initWithName:name value:value]; [self.attributes setNamedItem:att]; } @@ -101,7 +97,7 @@ -(Attr*) removeAttributeNode:(Attr*) oldAttr -(NodeList*) getElementsByTagName:(NSString*) name { - NodeList* accumulator = [[[NodeList alloc] init] autorelease]; + NodeList* accumulator = [[NodeList alloc] init]; [DOMHelperUtilities privateGetElementsByName:name inNamespace:nil childrenOfElement:self addToList:accumulator]; return accumulator; @@ -121,7 +117,7 @@ -(NSString*) getAttributeNS:(NSString*) namespaceURI localName:(NSString*) local // Introduced in DOM Level 2: -(void) setAttributeNS:(NSString*) namespaceURI qualifiedName:(NSString*) qualifiedName value:(NSString*) value { - Attr* att = [[[Attr alloc] initWithNamespace:namespaceURI qualifiedName:qualifiedName value:value] autorelease]; + Attr* att = [[Attr alloc] initWithNamespace:namespaceURI qualifiedName:qualifiedName value:value]; [self.attributes setNamedItemNS:att]; } @@ -150,7 +146,7 @@ -(Attr*) setAttributeNodeNS:(Attr*) newAttr // Introduced in DOM Level 2: -(NodeList*) getElementsByTagNameNS:(NSString*) namespaceURI localName:(NSString*) localName { - NodeList* accumulator = [[[NodeList alloc] init] autorelease]; + NodeList* accumulator = [[NodeList alloc] init]; [DOMHelperUtilities privateGetElementsByName:localName inNamespace:namespaceURI childrenOfElement:self addToList:accumulator]; return accumulator; diff --git a/Source/DOM classes/Core DOM/MediaList.h b/Source/DOM classes/Core DOM/MediaList.h index 47975011d..0be89fa47 100644 --- a/Source/DOM classes/Core DOM/MediaList.h +++ b/Source/DOM classes/Core DOM/MediaList.h @@ -17,7 +17,7 @@ @interface MediaList : NSObject -@property(nonatomic,retain) NSString* mediaText; +@property(nonatomic,strong) NSString* mediaText; @property(nonatomic) unsigned long length; -(NSString*) item:(unsigned long) index; diff --git a/Source/DOM classes/Core DOM/MediaList.m b/Source/DOM classes/Core DOM/MediaList.m index 216f775af..031d0f718 100644 --- a/Source/DOM classes/Core DOM/MediaList.m +++ b/Source/DOM classes/Core DOM/MediaList.m @@ -5,10 +5,6 @@ @implementation MediaList @synthesize mediaText; @synthesize length; -- (void)dealloc { - [mediaText release]; - [super dealloc]; -} -(NSString*) item:(unsigned long) index { diff --git a/Source/DOM classes/Core DOM/NamedNodeMap.h b/Source/DOM classes/Core DOM/NamedNodeMap.h index 2465dda2d..7b737cbe1 100644 --- a/Source/DOM classes/Core DOM/NamedNodeMap.h +++ b/Source/DOM classes/Core DOM/NamedNodeMap.h @@ -30,7 +30,7 @@ @class Node; #import "Node.h" -@interface NamedNodeMap : NSObject +@interface NamedNodeMap : NSObject -(Node*) getNamedItem:(NSString*) name; -(Node*) setNamedItem:(Node*) arg; diff --git a/Source/DOM classes/Core DOM/NamedNodeMap.m b/Source/DOM classes/Core DOM/NamedNodeMap.m index acc8745e5..14507a752 100644 --- a/Source/DOM classes/Core DOM/NamedNodeMap.m +++ b/Source/DOM classes/Core DOM/NamedNodeMap.m @@ -7,10 +7,11 @@ // #import "NamedNodeMap.h" +#import "NamedNodeMap_Iterable.h" @interface NamedNodeMap() -@property(nonatomic,retain) NSMutableDictionary* internalDictionary; -@property(nonatomic,retain) NSMutableDictionary* internalDictionaryOfNamespaces; +@property(nonatomic,strong) NSMutableDictionary* internalDictionary; +@property(nonatomic,strong) NSMutableDictionary* internalDictionaryOfNamespaces; @end @implementation NamedNodeMap @@ -27,12 +28,6 @@ - (id)init { return self; } -- (void)dealloc { - self.internalDictionary = nil; - self.internalDictionaryOfNamespaces = nil; - - [super dealloc]; -} -(Node*) getNamedItem:(NSString*) name { @@ -51,7 +46,7 @@ -(Node*) getNamedItem:(NSString*) name solution IMHO - the spec authors should have defined the outcome! */ - for( NSString* key in [self.internalDictionaryOfNamespaces allKeys] ) + for( NSString* key in self.internalDictionaryOfNamespaces ) { simpleResult = [self getNamedItemNS:key localName:name]; if( simpleResult != nil ) @@ -86,9 +81,9 @@ -(Node*) removeNamedItem:(NSString*) name -(unsigned long)length { - int count = [self.internalDictionary count]; + NSUInteger count = [self.internalDictionary count]; - for( NSDictionary* namespaceDict in self.internalDictionaryOfNamespaces ) + for( NSDictionary* namespaceDict in [self.internalDictionaryOfNamespaces allValues] ) { count += [namespaceDict count]; } @@ -98,13 +93,15 @@ -(unsigned long)length -(Node*) item:(unsigned long) index { + NSAssert(FALSE, @"This method is broken; Apple does not consistently return ordered values in dictionary.allValues. Apple DOES NOT SUPPORT ordered Maps/Hashes/Tables/Hashtables - we have to re-implement this wheel from scratch"); + if( index < [self.internalDictionary count] ) return [self.internalDictionary.allValues objectAtIndex:index]; else { index -= self.internalDictionary.count; - for( NSDictionary* namespaceDict in self.internalDictionaryOfNamespaces ) + for( NSDictionary* namespaceDict in [self.internalDictionaryOfNamespaces allValues] ) { if( index < [namespaceDict count] ) return [namespaceDict.allValues objectAtIndex:index]; @@ -176,5 +173,31 @@ -(NSString *)description return [NSString stringWithFormat:@"NamedNodeMap: %@%@%@", dom1, dom1 != nil && dom2 != nil ? @"\n" : @"", dom2 ]; } +#pragma mark - Implementation of category: NamedNodeMap_Iterable + +-(NSArray*) allNodesUnsortedDOM1 +{ + /** Using DOM1 - no namespace support */ + + return self.internalDictionary.allValues; +} + +-(NSDictionary*) allNodesUnsortedDOM2 +{ + /** Using DOM2 - every item has a namespace*/ + + return self.internalDictionaryOfNamespaces; +} + +#pragma mark - Needed to implement XML DOM effectively: ability to shallow-Clone an instance + +-(id)copyWithZone:(NSZone *)zone +{ + NamedNodeMap* clone = [[NamedNodeMap allocWithZone:zone] init]; + clone.internalDictionary = [self.internalDictionary copyWithZone:zone]; + clone.internalDictionaryOfNamespaces = [self.internalDictionaryOfNamespaces copyWithZone:zone]; + + return clone; +} @end diff --git a/Source/DOM classes/Core DOM/NamedNodeMap_Iterable.h b/Source/DOM classes/Core DOM/NamedNodeMap_Iterable.h new file mode 100644 index 000000000..dc1fff7be --- /dev/null +++ b/Source/DOM classes/Core DOM/NamedNodeMap_Iterable.h @@ -0,0 +1,17 @@ +@interface NamedNodeMap () + +/** + DOM1 is very basic and ignores namespaces - dangerous! It's recommended to avoid DOM1 calls throughout your apps and code! + + @return an Array of "nodes from the nodemap (Node)" + */ +-(NSArray*) allNodesUnsortedDOM1; + +/** + DOM2 requires everything to have a namespace - much better than DOM1 + + @return a Dictionary of "namespace (string)" mapped to "node from nodemap (Node)" + */ + -(NSDictionary*) allNodesUnsortedDOM2; + +@end diff --git a/Source/DOM classes/Core DOM/Node+Mutable.h b/Source/DOM classes/Core DOM/Node+Mutable.h index 9219b68a3..2767e1fd7 100644 --- a/Source/DOM classes/Core DOM/Node+Mutable.h +++ b/Source/DOM classes/Core DOM/Node+Mutable.h @@ -4,27 +4,23 @@ #import "Node.h" @interface Node() -@property(nonatomic,retain,readwrite) NSString* nodeName; -@property(nonatomic,retain,readwrite) NSString* nodeValue; +@property(nonatomic,strong,readwrite) NSString* nodeName; +@property(nonatomic,strong,readwrite) NSString* nodeValue; @property(nonatomic,readwrite) DOMNodeType nodeType; -@property(nonatomic,assign,readwrite) Node* parentNode; -@property(nonatomic,retain,readwrite) NodeList* childNodes; -@property(nonatomic,assign,readwrite) Node* firstChild; -@property(nonatomic,assign,readwrite) Node* lastChild; -@property(nonatomic,assign,readwrite) Node* previousSibling; -@property(nonatomic,assign,readwrite) Node* nextSibling; -@property(nonatomic,retain,readwrite) NamedNodeMap* attributes; +@property(nonatomic,weak,readwrite) Node* parentNode; +@property(nonatomic,strong,readwrite) NodeList* childNodes; +@property(nonatomic,strong,readwrite) NamedNodeMap* attributes; -@property(nonatomic,assign,readwrite) Document* ownerDocument; +@property(nonatomic,weak,readwrite) Document* ownerDocument; // Introduced in DOM Level 2: -@property(nonatomic,retain,readwrite) NSString* namespaceURI; +@property(nonatomic,strong,readwrite) NSString* namespaceURI; // Introduced in DOM Level 2: -@property(nonatomic,retain,readwrite) NSString* prefix; +@property(nonatomic,strong,readwrite) NSString* prefix; // Introduced in DOM Level 2: -@property(nonatomic,retain,readwrite) NSString* localName; +@property(nonatomic,strong,readwrite) NSString* localName; @end diff --git a/Source/DOM classes/Core DOM/Node.h b/Source/DOM classes/Core DOM/Node.h index adc5b6b0a..0e65dab30 100644 --- a/Source/DOM classes/Core DOM/Node.h +++ b/Source/DOM classes/Core DOM/Node.h @@ -101,20 +101,20 @@ typedef enum DOMNodeType @interface Node : NSObject -@property(nonatomic,retain,readonly) NSString* nodeName; -@property(nonatomic,retain,readonly) NSString* nodeValue; +@property(nonatomic,strong,readonly) NSString* nodeName; +@property(nonatomic,strong,readonly) NSString* nodeValue; @property(nonatomic,readonly) DOMNodeType nodeType; -@property(nonatomic,assign,readonly) Node* parentNode; -@property(nonatomic,retain,readonly) NodeList* childNodes; -@property(nonatomic,assign,readonly) Node* firstChild; -@property(nonatomic,assign,readonly) Node* lastChild; -@property(nonatomic,assign,readonly) Node* previousSibling; -@property(nonatomic,assign,readonly) Node* nextSibling; -@property(nonatomic,retain,readonly) NamedNodeMap* attributes; /*< NB: according to DOM Spec, this is null if the Node is NOT subclassed as an Element */ +@property(nonatomic,weak,readonly) Node* parentNode; +@property(nonatomic,strong,readonly) NodeList* childNodes; +@property(nonatomic,weak,readonly) Node* firstChild; +@property(nonatomic,weak,readonly) Node* lastChild; +@property(nonatomic,weak,readonly) Node* previousSibling; +@property(nonatomic,weak,readonly) Node* nextSibling; +@property(nonatomic,strong,readonly) NamedNodeMap* attributes; /**< NB: according to DOM Spec, this is null if the Node is NOT subclassed as an Element */ // Modified in DOM Level 2: -@property(nonatomic,assign,readonly) Document* ownerDocument; +@property(nonatomic,weak,readonly) Document* ownerDocument; -(Node*) insertBefore:(Node*) newChild refChild:(Node*) refChild; @@ -133,13 +133,13 @@ typedef enum DOMNodeType -(BOOL) isSupportedFeature:(NSString*) feature version:(NSString*) version; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* namespaceURI; +@property(nonatomic,strong,readonly) NSString* namespaceURI; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* prefix; +@property(nonatomic,strong,readonly) NSString* prefix; // Introduced in DOM Level 2: -@property(nonatomic,retain,readonly) NSString* localName; +@property(nonatomic,strong,readonly) NSString* localName; // Introduced in DOM Level 2: @property(nonatomic) BOOL hasAttributes; @@ -147,7 +147,7 @@ typedef enum DOMNodeType // DOM Level 3 that we *need*, partly because SVG Spec makes one brief reference to it: http://www.w3.org/TR/SVG/text.html#InterfaceSVGTextContentElement // Introduced in DOM Level 3: http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#Node3-textContent -@property(nonatomic,readonly) NSString* textContent; +@property(weak, nonatomic,readonly) NSString* textContent; #pragma mark - Objective-C init methods (not in SVG Spec - you're supposed to use SVGDocument's createXXX methods instead) /** Designated initializers - 2 pairs (one for DOM 1, no namespace, the other for DOM 2, with namespace) of 2 methods (one for nodes that REQUIRE a value, the other for nodes that MUST NOT have a value) */ @@ -156,4 +156,19 @@ typedef enum DOMNodeType - (id)initType:(DOMNodeType) nt name:(NSString*) n inNamespace:(NSString*) nsURI; - (id)initType:(DOMNodeType) nt name:(NSString*) n value:(NSString*) v inNamespace:(NSString*) nsURI; +#pragma mark - Objective-C serialization method to serialize a DOM tree back to XML (used heavily in SVGKit's output/conversion features) + +/** EXPERIMENTAL: not fully implemented or tested - this correctly outputs most SVG files, but is missing esoteric + features such as EntityReferences, currently they are simply ignored + + This method should be used hand-in-hand with the proprietary SVGDocument method "allNamespaces" and the SVGSVGElement method " + + @param outputString an empty MUTABLE string we can accumulate with output (NB: this method uses a lot of memory, needs to accumulate data) + + @param prefixesByKNOWNNamespace (required): a dictionary mapping "XML namespace URI" to "prefix to use inside the xml-tags", e.g. "http://w3.org/2000/svg" usually is mapped to "svg" (or to "", signifying it's the default namespace). This MUST include ALL NAMESPACES FOUND IN THE DOCUMENT (it's recommended you use SVGDocument's "allPrefixesByNamespace" method, and some post-processing, to get an accurate input here) + + @param prefixesByACTIVENamespace (required): a mutable dictionary listing which elements of the other dictionary are active in-scope - i.e. which namespaces have been output by this node or a higher node in the tree. You pass-in an empty dictionary to the root SVG node and it fills it in as required. + */ +-(void) appendXMLToString:(NSMutableString*) outputString availableNamespaces:(NSDictionary*) prefixesByKNOWNNamespace activeNamespaces:(NSMutableDictionary*) prefixesByACTIVENamespace; + @end diff --git a/Source/DOM classes/Core DOM/Node.m b/Source/DOM classes/Core DOM/Node.m index 192e7bf13..af3b6749e 100644 --- a/Source/DOM classes/Core DOM/Node.m +++ b/Source/DOM classes/Core DOM/Node.m @@ -12,6 +12,8 @@ #import "NodeList+Mutable.h" #import "NamedNodeMap.h" +#import "NamedNodeMap_Iterable.h" // Needed for the optional (non-SVG spec) "recursive toXML" method + @implementation Node @synthesize nodeName; @@ -20,10 +22,6 @@ @implementation Node @synthesize nodeType; @synthesize parentNode; @synthesize childNodes; -@synthesize firstChild; -@synthesize lastChild; -@synthesize previousSibling; -@synthesize nextSibling; @synthesize attributes; // Modified in DOM Level 2: @@ -33,16 +31,6 @@ @implementation Node @synthesize localName; -- (void)dealloc { - [nodeName release]; - [nodeValue release]; - [childNodes release]; - [attributes release]; - [prefix release]; - [namespaceURI release]; - [localName release]; - [super dealloc]; -} - (id)init { @@ -91,7 +79,7 @@ - (id)initType:(DOMNodeType) nt name:(NSString*) n value:(NSString*) v }break; } - self.childNodes = [[[NodeList alloc] init] autorelease]; + self.childNodes = [[NodeList alloc] init]; } return self; } @@ -131,11 +119,11 @@ - (id)initType:(DOMNodeType) nt name:(NSString*) n self.nodeName = n; - self.attributes = [[[NamedNodeMap alloc] init] autorelease]; + self.attributes = [[NamedNodeMap alloc] init]; }break; } - self.childNodes = [[[NodeList alloc] init] autorelease]; + self.childNodes = [[NodeList alloc] init]; } return self; } @@ -185,6 +173,52 @@ - (id)initType:(DOMNodeType) nt name:(NSString*) n value:(NSString*) v inNamespa #pragma mark - Official DOM method implementations +-(Node *)firstChild +{ + if( [self.childNodes length] < 1 ) + return nil; + else + return [self.childNodes item:0]; +} + +-(Node *)lastChild +{ + if( [self.childNodes length] < 1 ) + return nil; + else + return [self.childNodes item: [self.childNodes length] - 1]; +} + +-(Node *)previousSibling +{ + if( self.parentNode == nil ) + return nil; + else + { + NSUInteger indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; + + if( indexInParent < 1 ) + return nil; + else + return [self.parentNode.childNodes item:indexInParent-1]; + } +} + +-(Node *)nextSibling +{ + if( self.parentNode == nil ) + return nil; + else + { + NSUInteger indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; + + if( indexInParent >= [self.parentNode.childNodes length] ) + return nil; + else + return [self.parentNode.childNodes item:indexInParent + 1]; + } +} + -(Node*) insertBefore:(Node*) newChild refChild:(Node*) refChild { if( refChild == nil ) @@ -209,7 +243,7 @@ -(Node*) replaceChild:(Node*) newChild oldChild:(Node*) oldChild "If newChild is a DocumentFragment object, oldChild is replaced by all of the DocumentFragment children, which are inserted in the same order. If the newChild is already in the tree, it is first removed." */ - int oldIndex = [self.childNodes.internalArray indexOfObject:oldChild]; + NSUInteger oldIndex = [self.childNodes.internalArray indexOfObject:oldChild]; NSAssert( FALSE, @"We should be recursing down the tree to find 'newChild' at any location, and removing it - required by spec - but we have no convenience method for that search, yet" ); @@ -312,7 +346,7 @@ -(NSString *)textContent /** DOM 3 Spec: "concatenation of the textContent attribute value of every child node, excluding COMMENT_NODE and PROCESSING_INSTRUCTION_NODE nodes. This is the empty string if the node has no children." */ - NSMutableString* stringAccumulator = [[[NSMutableString alloc] init] autorelease]; + NSMutableString* stringAccumulator = [[NSMutableString alloc] init]; for( Node* subNode in self.childNodes.internalArray ) { NSString* subText = subNode.textContent; // don't call this method twice; it's expensive to calculate! @@ -387,7 +421,222 @@ -(NSString *)description default: nodeTypeName = @"N/A (DATA IS MISSING FROM NODE INSTANCE)"; } - return [NSString stringWithFormat:@"Node: %@ (%@) value:[%@] @@%ld attributes + %ld x children", self.nodeName, nodeTypeName, [self.nodeValue length]<11 ? self.nodeValue : [NSString stringWithFormat:@"%@...",[self.nodeValue substringToIndex:10]], self.attributes.length, self.childNodes.length]; + return [NSString stringWithFormat:@"Node: %@ (%@) value:[%@] @@%ld attributes + %ld x children", self.nodeName, nodeTypeName, [self.nodeValue length]<11 ? self.nodeValue : [NSString stringWithFormat:@"%@...",[self.nodeValue substringToIndex:10]], self.attributes.length, (unsigned long)self.childNodes.length]; +} + +#pragma mark - Objective-C serialization method to serialize a DOM tree back to XML (used heavily in SVGKit's output/conversion features) + +/** EXPERIMENTAL: not fully implemented or tested - this correctly outputs most SVG files, but is missing esoteric + features such as EntityReferences, currently they are simply ignored + + This method should be used hand-in-hand with the proprietary SVGDocument method "allNamespaces" and the SVGSVGElement method " + + @param outputString an empty MUTABLE string we can accumulate with output (NB: this method uses a lot of memory, needs to accumulate data) + + @param prefixesByKNOWNNamespace (required): a dictionary mapping "XML namespace URI" to "prefix to use inside the xml-tags", e.g. "http://w3.org/2000/svg" usually is mapped to "svg" (or to "", signifying it's the default namespace). This MUST include ALL NAMESPACES FOUND IN THE DOCUMENT (it's recommended you use SVGDocument's "allPrefixesByNamespace" method, and some post-processing, to get an accurate input here) + + @param prefixesByACTIVENamespace (required): a mutable dictionary listing which elements of the other dictionary are active in-scope - i.e. which namespaces have been output by this node or a higher node in the tree. You pass-in an empty dictionary to the root SVG node and it fills it in as required. + */ +-(void) appendXMLToString:(NSMutableString*) outputString availableNamespaces:(NSDictionary*) prefixesByKNOWNNamespace activeNamespaces:(NSMutableDictionary*) prefixesByACTIVENamespace +{ +// NSAssert(namespaceShortnames != nil, @"Must supply an empty dictionary for me to fill with encountered namespaces, and the shortnames I invented for them!"); + + /** Opening */ + switch( self.nodeType ) + { + case DOMNodeType_ATTRIBUTE_NODE: + { + // ? + }break; + + case DOMNodeType_CDATA_SECTION_NODE: + { + [outputString appendFormat:@""]; + }break; + + case DOMNodeType_COMMENT_NODE: + { + [outputString appendFormat:@"]]>"]; + }break; + + case DOMNodeType_DOCUMENT_FRAGMENT_NODE: + case DOMNodeType_DOCUMENT_NODE: + case DOMNodeType_ELEMENT_NODE: + { + [outputString appendFormat:@"", self.nodeName]; + }break; + + case DOMNodeType_DOCUMENT_TYPE_NODE: + case DOMNodeType_ENTITY_NODE: + case DOMNodeType_ENTITY_REFERENCE_NODE: + case DOMNodeType_NOTATION_NODE: + case DOMNodeType_PROCESSING_INSTRUCTION_NODE: + case DOMNodeType_TEXT_NODE: + { + // nothing + }break; + } } @end diff --git a/Source/DOM classes/Core DOM/NodeList+Mutable.h b/Source/DOM classes/Core DOM/NodeList+Mutable.h index fba819742..72fe1d113 100644 --- a/Source/DOM classes/Core DOM/NodeList+Mutable.h +++ b/Source/DOM classes/Core DOM/NodeList+Mutable.h @@ -6,6 +6,6 @@ @interface NodeList() -@property(nonatomic,retain) NSMutableArray* internalArray; +@property(nonatomic,strong) NSMutableArray* internalArray; @end diff --git a/Source/DOM classes/Core DOM/NodeList.h b/Source/DOM classes/Core DOM/NodeList.h index 501de1ca5..b145fa4da 100644 --- a/Source/DOM classes/Core DOM/NodeList.h +++ b/Source/DOM classes/Core DOM/NodeList.h @@ -21,8 +21,8 @@ @interface NodeList : NSObject -@property(readonly) long length; +@property(readonly) NSUInteger length; --(Node*) item:(int) index; +-(Node*) item:(NSUInteger) index; @end diff --git a/Source/DOM classes/Core DOM/NodeList.m b/Source/DOM classes/Core DOM/NodeList.m index a83e54e7c..3e715ff57 100644 --- a/Source/DOM classes/Core DOM/NodeList.m +++ b/Source/DOM classes/Core DOM/NodeList.m @@ -14,24 +14,20 @@ - (id)init { return self; } -- (void)dealloc { - self.internalArray = nil; - [super dealloc]; -} --(Node*) item:(int) index +-(Node*) item:(NSUInteger) index { return [self.internalArray objectAtIndex:index]; } --(long)length +-(NSUInteger)length { return [self.internalArray count]; } #pragma mark - ADDITIONAL to SVG Spec: Objective-C support for fast-iteration ("for * in ..." syntax) --(NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id [])buffer count:(NSUInteger)len +-(NSUInteger)countByEnumeratingWithState:(NSFastEnumerationState *)state objects:(id __unsafe_unretained [])buffer count:(NSUInteger)len { return [self.internalArray countByEnumeratingWithState:state objects:buffer count:len]; } diff --git a/Source/DOM classes/Core DOM/ProcessingInstruction.h b/Source/DOM classes/Core DOM/ProcessingInstruction.h index 74fbea8d5..be98f00da 100644 --- a/Source/DOM classes/Core DOM/ProcessingInstruction.h +++ b/Source/DOM classes/Core DOM/ProcessingInstruction.h @@ -17,8 +17,8 @@ #import "Node.h" @interface ProcessingInstruction : Node -@property(nonatomic,retain,readonly) NSString* target; -@property(nonatomic,retain,readonly) NSString* data; +@property(nonatomic,strong,readonly) NSString* target; +@property(nonatomic,strong,readonly) NSString* data; -(id) initProcessingInstruction:(NSString*) target value:(NSString*) data; diff --git a/Source/DOM classes/Core DOM/ProcessingInstruction.m b/Source/DOM classes/Core DOM/ProcessingInstruction.m index 7ccf28b33..9672dc3e4 100644 --- a/Source/DOM classes/Core DOM/ProcessingInstruction.m +++ b/Source/DOM classes/Core DOM/ProcessingInstruction.m @@ -9,8 +9,8 @@ #import "ProcessingInstruction.h" @interface ProcessingInstruction() -@property(nonatomic,retain,readwrite) NSString* target; -@property(nonatomic,retain,readwrite) NSString* data; +@property(nonatomic,strong,readwrite) NSString* target; +@property(nonatomic,strong,readwrite) NSString* data; @end @implementation ProcessingInstruction diff --git a/Source/DOM classes/Core DOM/StyleSheet.h b/Source/DOM classes/Core DOM/StyleSheet.h index 116f6136a..5c9ee35a3 100644 --- a/Source/DOM classes/Core DOM/StyleSheet.h +++ b/Source/DOM classes/Core DOM/StyleSheet.h @@ -18,12 +18,12 @@ @interface StyleSheet : NSObject -@property(nonatomic,retain) NSString* type; +@property(nonatomic,strong) NSString* type; @property(nonatomic) BOOL disabled; -@property(nonatomic,retain) Node* ownerNode; -@property(nonatomic,retain) StyleSheet* parentStyleSheet; -@property(nonatomic,retain) NSString* href; -@property(nonatomic,retain) NSString* title; -@property(nonatomic,retain) MediaList* media; +@property(nonatomic,strong) Node* ownerNode; +@property(nonatomic,strong) StyleSheet* parentStyleSheet; +@property(nonatomic,strong) NSString* href; +@property(nonatomic,strong) NSString* title; +@property(nonatomic,strong) MediaList* media; @end diff --git a/Source/DOM classes/Core DOM/StyleSheet.m b/Source/DOM classes/Core DOM/StyleSheet.m index c04ea7923..ef8acc247 100644 --- a/Source/DOM classes/Core DOM/StyleSheet.m +++ b/Source/DOM classes/Core DOM/StyleSheet.m @@ -2,22 +2,4 @@ @implementation StyleSheet -@synthesize type; -@synthesize disabled; -@synthesize ownerNode; -@synthesize parentStyleSheet; -@synthesize href; -@synthesize title; -@synthesize media; - -- (void)dealloc { - [type release]; - [ownerNode release]; - [parentStyleSheet release]; - [href release]; - [title release]; - [media release]; - [super dealloc]; -} - @end diff --git a/Source/DOM classes/Core DOM/StyleSheetList+Mutable.h b/Source/DOM classes/Core DOM/StyleSheetList+Mutable.h index be2197543..1597973ea 100644 --- a/Source/DOM classes/Core DOM/StyleSheetList+Mutable.h +++ b/Source/DOM classes/Core DOM/StyleSheetList+Mutable.h @@ -1,5 +1,5 @@ #import "StyleSheetList.h" @interface StyleSheetList() -@property(nonatomic,retain) NSMutableArray* internalArray; +@property(nonatomic,strong) NSMutableArray* internalArray; @end diff --git a/Source/DOM classes/Core DOM/StyleSheetList.m b/Source/DOM classes/Core DOM/StyleSheetList.m index f087c9ad4..9c9532353 100644 --- a/Source/DOM classes/Core DOM/StyleSheetList.m +++ b/Source/DOM classes/Core DOM/StyleSheetList.m @@ -14,10 +14,6 @@ - (id)init return self; } -- (void)dealloc { - self.internalArray = nil; - [super dealloc]; -} -(unsigned long)length { diff --git a/Source/DOM classes/SVG-DOM/SVGAngle.h b/Source/DOM classes/SVG-DOM/SVGAngle.h index d0b8da714..5a6dd8ea1 100644 --- a/Source/DOM classes/SVG-DOM/SVGAngle.h +++ b/Source/DOM classes/SVG-DOM/SVGAngle.h @@ -35,7 +35,7 @@ typedef enum SVGKAngleType @property(nonatomic, readonly) SVGKAngleType unitType; @property(nonatomic) float value; @property(nonatomic) float valueInSpecifiedUnits; -@property(nonatomic,retain) NSString* valueAsString; +@property(nonatomic,strong) NSString* valueAsString; -(void) newValueSpecifiedUnits:(SVGKAngleType) unitType valueInSpecifiedUnits:(float) valueInSpecifiedUnits; -(void) convertToSpecifiedUnits:(SVGKAngleType) unitType; diff --git a/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.h b/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.h new file mode 100644 index 000000000..9de75f1f0 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.h @@ -0,0 +1,15 @@ +/** + http://www.w3.org/TR/SVG/coords.html#InterfaceSVGAnimatedPreserveAspectRatio + + readonly attribute SVGPreserveAspectRatio baseVal; + readonly attribute SVGPreserveAspectRatio animVal; + */ +#import +#import "SVGPreserveAspectRatio.h" + +@interface SVGAnimatedPreserveAspectRatio : NSObject + +@property(nonatomic,strong) SVGPreserveAspectRatio* baseVal; +@property(nonatomic,strong, readonly) SVGPreserveAspectRatio* animVal; + +@end diff --git a/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.m b/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.m new file mode 100644 index 000000000..11e244fe4 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGAnimatedPreserveAspectRatio.m @@ -0,0 +1,28 @@ +#import "SVGAnimatedPreserveAspectRatio.h" + +@implementation SVGAnimatedPreserveAspectRatio + + +- (id)init +{ + self = [super init]; + if (self) { + self.baseVal = [SVGPreserveAspectRatio new]; + } + return self; +} + +/** TODO: Current implementation (animation not supported anywhere in SVGKit yet) simply returns + a copy of self.baseVal --- NOTE: spec REQUIRES you return a copy! It is explicit on this! + */ +-(SVGPreserveAspectRatio *)animVal +{ + SVGPreserveAspectRatio* cloneOfBase = [SVGPreserveAspectRatio new]; + + cloneOfBase.align = self.baseVal.align; + cloneOfBase.meetOrSlice = self.baseVal.meetOrSlice; + + return cloneOfBase; +} + +@end diff --git a/Source/DOM classes/SVG-DOM/SVGClipPathElement.h b/Source/DOM classes/SVG-DOM/SVGClipPathElement.h new file mode 100644 index 000000000..eea2cdb94 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGClipPathElement.h @@ -0,0 +1,29 @@ +/** +http://www.w3.org/TR/SVG/masking.html#InterfaceSVGClipPathElement + + interface SVGClipPathElement : SVGElement, + SVGTests, + SVGLangSpace, + SVGExternalResourcesRequired, + SVGStylable, + SVGTransformable, + SVGUnitTypes { + */ + +#import "SVGElement.h" +#import "SVGElement_ForParser.h" + +#import "ConverterSVGToCALayer.h" +#import "SVGTransformable.h" +#import "SVGUnitTypes.h" + + +// Does NOT implement ConverterSVGToCALayer because elements are never rendered directly; they're only referenced via clip-path attributes in other elements +@interface SVGClipPathElement : SVGElement + +@property(nonatomic, readonly) SVG_UNIT_TYPE clipPathUnits; + +- (CALayer *) newLayer; +- (void)layoutLayer:(CALayer *)layer toMaskLayer:(CALayer *)maskThis; + +@end diff --git a/Source/DOM classes/SVG-DOM/SVGClipPathElement.m b/Source/DOM classes/SVG-DOM/SVGClipPathElement.m new file mode 100644 index 000000000..96b25e5e9 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGClipPathElement.m @@ -0,0 +1,81 @@ +#import "SVGClipPathElement.h" + +#import "CALayerWithChildHitTest.h" + +#import "SVGHelperUtilities.h" + +@implementation SVGClipPathElement + +@synthesize clipPathUnits; +@synthesize transform; // each SVGElement subclass that conforms to protocol "SVGTransformable" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols + +- (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { + [super postProcessAttributesAddingErrorsTo:parseResult]; + + NSError *error = [NSError errorWithDomain:@"SVGKit" code:1 userInfo:[NSDictionary dictionaryWithObjectsAndKeys: + @" found in SVG. May render incorrectly with SVGKFastImageView due to Apple bug in CALayer .mask rendering.", NSLocalizedDescriptionKey, + nil]]; + [parseResult addParseErrorRecoverable:error]; + + clipPathUnits = SVG_UNIT_TYPE_USERSPACEONUSE; + + NSString *units = [self getAttribute:@"clipPathUnits"]; + if( units != nil && units.length > 0 ) { + if( [units isEqualToString:@"userSpaceOnUse"] ) + clipPathUnits = SVG_UNIT_TYPE_USERSPACEONUSE; + else if( [units isEqualToString:@"objectBoundingBox"] ) + clipPathUnits = SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; + else { + SVGKitLogWarn(@"Unknown clipPathUnits value %@", units); + NSError *error = [NSError errorWithDomain:@"SVGKit" code:1 userInfo:[NSDictionary dictionaryWithObjectsAndKeys: + [NSString stringWithFormat:@"Unknown clipPathUnits value %@", units], NSLocalizedDescriptionKey, + nil]]; + [parseResult addParseErrorRecoverable:error]; + } + } +} + +- (CALayer *) newLayer +{ + + CALayer* _layer = [CALayerWithChildHitTest layer]; + + [SVGHelperUtilities configureCALayer:_layer usingElement:self]; + + return _layer; +} + +- (void)layoutLayer:(CALayer *)layer toMaskLayer:(CALayer *)maskThis +{ + // null rect union any other rect will return the other rect + CGRect mainRect = CGRectNull; + + /** make mainrect the UNION of all sublayer's frames (i.e. their individual "bounds" inside THIS layer's space) */ + for ( CALayer *currentLayer in [layer sublayers] ) + { + mainRect = CGRectUnion(mainRect, currentLayer.frame); + } + + /** Changing THIS layer's frame now means all DIRECT sublayers are offset by too much (because when we change the offset + of the parent frame (this.frame), Apple *does not* shift the sublayers around to keep them in same place. + + NB: there are bugs in some Apple code in Interface Builder where it attempts to do exactly that (incorrectly, as the API + is specifically designed NOT to do this), and ... Fails. But in code, thankfully, Apple *almost* never does this (there are a few method + calls where it appears someone at Apple forgot how their API works, and tried to do the offsetting automatically. "Paved + with good intentions...". + */ + if (CGRectIsNull(mainRect)) + { + // TODO what to do when mainRect is null rect? i.e. no sublayer or all sublayers have null rect frame + } else { + for (CALayer *currentLayer in [layer sublayers]) + currentLayer.frame = CGRectOffset(currentLayer.frame, -mainRect.origin.x, -mainRect.origin.y); + } + + // unless we're working in bounding box coords, subtract the owning layer's origin + if( self.clipPathUnits == SVG_UNIT_TYPE_USERSPACEONUSE ) + mainRect = CGRectOffset(mainRect, -maskThis.frame.origin.x, -maskThis.frame.origin.y); + layer.frame = mainRect; +} + +@end diff --git a/Source/DOM classes/SVG-DOM/SVGDocument.h b/Source/DOM classes/SVG-DOM/SVGDocument.h index cc4ad1eaf..8139a7c31 100644 --- a/Source/DOM classes/SVG-DOM/SVGDocument.h +++ b/Source/DOM classes/SVG-DOM/SVGDocument.h @@ -20,14 +20,44 @@ @interface SVGDocument : Document -@property (nonatomic, retain, readonly) NSString* title; -@property (nonatomic, retain, readonly) NSString* referrer; -@property (nonatomic, retain, readonly) NSString* domain; -@property (nonatomic, retain, readonly) NSString* URL; -@property (nonatomic, retain, readonly) SVGSVGElement* rootElement; +@property (nonatomic, strong, readonly) NSString* title; +@property (nonatomic, strong, readonly) NSString* referrer; +@property (nonatomic, strong, readonly) NSString* domain; +@property (nonatomic, strong, readonly) NSString* URL; +@property (nonatomic, strong, readonly) SVGSVGElement* rootElement; #pragma mark - Objective-C init methods (not part of DOM spec, but necessary!) - (id)init; +#pragma mark - Serialization methods that we think ought to be part of the SVG spec, as they are needed for a good implementation, but we can't find in the main Spec + +/** + Recursively goes through the document finding all declared namespaces in-use by any tag or attribute. + + @return a dictionary mapping "namespace" to "ARRAY of prefix-strings" + */ +-(NSMutableDictionary*) allPrefixesByNamespace; + +/** + As per allPrefixesByNamespace, but takes the output and guarantees that: + + 1. There is AT MOST ONE namespace with no prefix + 2. The "prefixless" namespace is the SVG namespace (if possible. This should always be possible for an SVG doc!) + 3. All other namespaces have EXACTLY ONE prefix (if there are multiple, it discards excess ones) + 4. All prefixes are UNIQUE (not used by more than one Namespace) + + This is critically important when writing-out an SVG file to disk - As far as I can tell, it's a major ommission from + the XML Spec (which SVG sits on top of). Without this info, you can't construct the appropriate/correct "xmlns" directives + at the start of a file. + + USAGE INSTRUCTIONS: + + 1. Call this method to get the complete list of namespaces, including any prefixes used + 2. Invoke Node's "appendXMLToString:..." method, passing-in this output, so it can correctly output prefixes for all nodes and subnodes + + @return a dictionary mapping "namespace" to "prefix-string or empty-string for the default namespace" + */ +-(NSMutableDictionary*) allPrefixesByNamespaceNormalized; + @end diff --git a/Source/DOM classes/SVG-DOM/SVGDocument.m b/Source/DOM classes/SVG-DOM/SVGDocument.m index 0a85ec03f..28de3d59c 100644 --- a/Source/DOM classes/SVG-DOM/SVGDocument.m +++ b/Source/DOM classes/SVG-DOM/SVGDocument.m @@ -11,6 +11,8 @@ #import "SVGDocument.h" #import "SVGDocument_Mutable.h" +#import "NamedNodeMap_Iterable.h" // needed for the allPrefixesByNamespace implementation + @implementation SVGDocument @@ -21,14 +23,6 @@ @implementation SVGDocument @synthesize rootElement=_rootElement; -- (void)dealloc { - [title release]; - [referrer release]; - [domain release]; - [URL release]; - [_rootElement release]; - [super dealloc]; -} - (id)init { @@ -41,9 +35,7 @@ - (id)init -(void)setRootElement:(SVGSVGElement *)rootElement { - [_rootElement release]; _rootElement = rootElement; - [_rootElement retain]; /*! SVG spec has two variables with same name, because DOM was written to support weak programming languages that don't provide full OOP polymorphism. @@ -67,4 +59,119 @@ -(void)setDocumentElement:(Element *)newDocumentElement self.rootElement = (SVGSVGElement*) self.documentElement; } +#pragma mark - Serialization methods that we think ought to be part of the SVG spec, as they are needed for a good implementation, but we can't find in the main Spec + +/** + Recursively goes through the document finding all declared namespaces in-use by any tag or attribute. + + @return a dictionary mapping "namespace" to "ARRAY of prefix-strings" + */ +-(NSMutableDictionary*) allPrefixesByNamespace +{ + NSMutableDictionary* result = [NSMutableDictionary dictionary]; + + [SVGDocument accumulateNamespacesForNode:self.rootElement intoDictionary:result]; + + return result; +} + +/** implementation of allPrefixesByNamespace - stores "namespace string" : "ARRAY of prefix strings" + */ ++(void) accumulateNamespacesForNode:(Node*) node intoDictionary:(NSMutableDictionary*) output +{ + /** + First, find all the attributes that declare a new Namespace at this point */ + NSDictionary* nodeMapsByNamespace = [node.attributes allNodesUnsortedDOM2]; + + NSString* xmlnsNamespace = @"http://www.w3.org/2000/xmlns/"; + NSDictionary* xmlnsNodemap = [nodeMapsByNamespace objectForKey:xmlnsNamespace]; + + for( NSString* xmlnsNodeName in xmlnsNodemap ) + { + Node* namespaceDeclaration = [xmlnsNodemap objectForKey:xmlnsNodeName]; + + NSMutableArray* prefixesForNamespace = [output objectForKey:namespaceDeclaration.nodeValue]; + if( prefixesForNamespace == nil ) + { + prefixesForNamespace = [NSMutableArray array]; + [output setObject:prefixesForNamespace forKey:namespaceDeclaration.nodeValue]; + } + + if( ! [prefixesForNamespace containsObject:namespaceDeclaration.nodeName]) + [prefixesForNamespace addObject:namespaceDeclaration.localName]; + } + + for( Node* childNode in node.childNodes ) + { + [self accumulateNamespacesForNode:childNode intoDictionary:output]; + } +} + +/** + As per allPrefixesByNamespace, but takes the output and guarantees that: + + 1. There is AT MOST ONE namespace with no prefix + 2. The "prefixless" namespace is the SVG namespace (if possible. This should always be possible for an SVG doc!) + 3. All other namespaces have EXACTLY ONE prefix (if there are multiple, it discards excess ones) + 4. All prefixes are UNIQUE (not used by more than one Namespace) + + This is critically important when writing-out an SVG file to disk - As far as I can tell, it's a major ommission from + the XML Spec (which SVG sits on top of). Without this info, you can't construct the appropriate/correct "xmlns" directives + at the start of a file. + + USAGE INSTRUCTIONS: + + 1. Call this method to get the complete list of namespaces, including any prefixes used + 2. Invoke Node's "appendXMLToString:..." method, passing-in this output, so it can correctly output prefixes for all nodes and subnodes + + @return a dictionary mapping "namespace" to "prefix-string or empty-string for the default namespace" + */ +-(NSMutableDictionary*) allPrefixesByNamespaceNormalized +{ + NSMutableDictionary* prefixArraysByNamespace = [self allPrefixesByNamespace]; + NSMutableDictionary* normalizedPrefixesByNamespace = [NSMutableDictionary dictionary]; + + for( NSString* namespace in prefixArraysByNamespace ) + { + NSArray* prefixes = [prefixArraysByNamespace objectForKey:namespace]; + + BOOL exportedAUniquePrefix = FALSE; + for( NSString* nextPrefix in prefixes ) + { + if( ! [normalizedPrefixesByNamespace.allValues containsObject:nextPrefix]) + { + [normalizedPrefixesByNamespace setObject:nextPrefix forKey:namespace]; + exportedAUniquePrefix = TRUE; + break; + } + } + + /** If that failed to find a unique prefix, we need to either generate one, or use the default prefix */ + if( ! exportedAUniquePrefix ) + { + if( [namespace isEqualToString:@"http://w3.org/2000/svg"]) + { + [normalizedPrefixesByNamespace setObject:@"" forKey:namespace]; + } + else + { + /** Generate a new shortname that will OVERRIDE AND REPLACE whatever prefixes this attribute has */ + int suffix = 1; + NSString* newPrefix = [namespace lastPathComponent]; + while( [normalizedPrefixesByNamespace.allValues containsObject:newPrefix]) + { + suffix++; + + newPrefix = [NSString stringWithFormat:@"%@-%i", [namespace lastPathComponent], suffix]; + } + + [normalizedPrefixesByNamespace setObject:newPrefix forKey:namespace]; + } + } + } + + SVGKitLogVerbose(@"Normalized prefixes:\n%@", normalizedPrefixesByNamespace ); + return normalizedPrefixesByNamespace; +} + @end diff --git a/Source/DOM classes/SVG-DOM/SVGDocument_Mutable.h b/Source/DOM classes/SVG-DOM/SVGDocument_Mutable.h index 7b62f9a4b..55596ab23 100644 --- a/Source/DOM classes/SVG-DOM/SVGDocument_Mutable.h +++ b/Source/DOM classes/SVG-DOM/SVGDocument_Mutable.h @@ -5,9 +5,9 @@ #import "SVGDocument.h" @interface SVGDocument () -@property (nonatomic, retain, readwrite) NSString* title; -@property (nonatomic, retain, readwrite) NSString* referrer; -@property (nonatomic, retain, readwrite) NSString* domain; -@property (nonatomic, retain, readwrite) NSString* URL; -@property (nonatomic, retain, readwrite) SVGSVGElement* rootElement; +@property (nonatomic, strong, readwrite) NSString* title; +@property (nonatomic, strong, readwrite) NSString* referrer; +@property (nonatomic, strong, readwrite) NSString* domain; +@property (nonatomic, strong, readwrite) NSString* URL; +@property (nonatomic, strong, readwrite) SVGSVGElement* rootElement; @end diff --git a/Source/DOM classes/SVG-DOM/SVGElementInstance.h b/Source/DOM classes/SVG-DOM/SVGElementInstance.h index 854cf853c..021f29cfc 100644 --- a/Source/DOM classes/SVG-DOM/SVGElementInstance.h +++ b/Source/DOM classes/SVG-DOM/SVGElementInstance.h @@ -18,35 +18,44 @@ @class SVGUseElement; #import "SVGUseElement.h" +/** + ADDITIONAL IMPLEMENTATION NOTES: + + We make the two back-links into the SVG DOM Tree ("correspondingElement" and "correspondingUseElement") weak references to prevent + a retain-cycle. + + If you delete parts of the original tree, but don't do anything to update your USE tags / elements, then ... the back-links will + become nil. This seems the most rational, "what you would expect", behaviour. + */ @interface SVGElementInstance : NSObject /*The corresponding element to which this object is an instance. For example, if a ‘use’ element references a ‘rect’ element, then an SVGElementInstance is created, with its correspondingElement being the SVGRectElement object for the ‘rect’ element. */ -@property(nonatomic,retain, readonly) SVGElement* correspondingElement; +@property(nonatomic, weak, readonly) SVGElement* correspondingElement; /* The corresponding ‘use’ element to which this SVGElementInstance object belongs. When ‘use’ elements are nested (e.g., a ‘use’ references another ‘use’ which references a graphics element such as a ‘rect’), then the correspondingUseElement is the outermost ‘use’ (i.e., the one which indirectly references the ‘rect’, not the one with the direct reference). */ -@property(nonatomic,retain, readonly) SVGUseElement* correspondingUseElement; +@property(nonatomic, weak, readonly) SVGUseElement* correspondingUseElement; /* The parent of this SVGElementInstance within the instance tree. All SVGElementInstance objects have a parent except the SVGElementInstance which corresponds to the element which was directly referenced by the ‘use’ element, in which case parentNode is null. */ -@property(nonatomic,retain, readonly) SVGElementInstance* parentNode; +@property(nonatomic,strong, readonly) SVGElementInstance* parentNode; /* An SVGElementInstanceList that contains all children of this SVGElementInstance within the instance tree. If there are no children, this is an SVGElementInstanceList containing no entries (i.e., an empty list). firstChild (readonly SVGElementInstance) */ -@property(nonatomic,retain, readonly) SVGElementInstanceList* childNodes; +@property(nonatomic,strong, readonly) SVGElementInstanceList* childNodes; /* The first child of this SVGElementInstance within the instance tree. If there is no such SVGElementInstance, this returns null. */ -@property(nonatomic,retain, readonly) SVGElementInstance* firstChild; +@property(nonatomic,strong, readonly) SVGElementInstance* firstChild; /* The last child of this SVGElementInstance within the instance tree. If there is no such SVGElementInstance, this returns null. */ -@property(nonatomic,retain, readonly) SVGElementInstance* lastChild; +@property(nonatomic,strong, readonly) SVGElementInstance* lastChild; /* The SVGElementInstance immediately preceding this SVGElementInstance. If there is no such SVGElementInstance, this returns null. */ -@property(nonatomic,retain, readonly) SVGElementInstance* previousSibling; +@property(nonatomic,strong, readonly) SVGElementInstance* previousSibling; /* The SVGElementInstance immediately following this SVGElementInstance. If there is no such SVGElementInstance, this returns null. */ -@property(nonatomic,retain, readonly) SVGElementInstance* nextSibling; +@property(nonatomic,strong, readonly) SVGElementInstance* nextSibling; @end diff --git a/Source/DOM classes/SVG-DOM/SVGElementInstance.m b/Source/DOM classes/SVG-DOM/SVGElementInstance.m index ca2dce96f..e6a7645bc 100644 --- a/Source/DOM classes/SVG-DOM/SVGElementInstance.m +++ b/Source/DOM classes/SVG-DOM/SVGElementInstance.m @@ -5,17 +5,13 @@ @implementation SVGElementInstance -@synthesize correspondingElement; -@synthesize correspondingUseElement; @synthesize parentNode; @synthesize childNodes; - (void)dealloc { self.parentNode = nil; - self.childNodes = nil; self.correspondingElement = nil; self.correspondingUseElement = nil; - [super dealloc]; } -(void)setParentNode:(SVGElementInstance *)newParentNode @@ -27,14 +23,12 @@ -(void)setParentNode:(SVGElementInstance *)newParentNode /* additionally remove self from parent's childNodes */ [self.parentNode.childNodes.internalArray removeObject:self]; - [parentNode release]; parentNode = newParentNode; } else { /* additionally ADD self to parent's childNodes */ parentNode = newParentNode; - [parentNode retain]; NSAssert( NSNotFound != [self.parentNode.childNodes.internalArray indexOfObject:self], @"Found that I was already a child of the node that I was being added to - should be impossible!" ); @@ -65,7 +59,7 @@ -(SVGElementInstance *)previousSibling return nil; else { - int indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; + NSUInteger indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; if( indexInParent < 1 ) return nil; @@ -80,7 +74,7 @@ -(SVGElementInstance *)nextSibling return nil; else { - int indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; + NSUInteger indexInParent = [self.parentNode.childNodes.internalArray indexOfObject:self]; if( indexInParent >= [self.parentNode.childNodes length] ) return nil; diff --git a/Source/DOM classes/SVG-DOM/SVGElementInstanceList.m b/Source/DOM classes/SVG-DOM/SVGElementInstanceList.m index 7f62ab5be..c988bd6d3 100644 --- a/Source/DOM classes/SVG-DOM/SVGElementInstanceList.m +++ b/Source/DOM classes/SVG-DOM/SVGElementInstanceList.m @@ -4,10 +4,6 @@ @implementation SVGElementInstanceList @synthesize internalArray; -- (void)dealloc { - self.internalArray = nil; - [super dealloc]; -} - (id)init { diff --git a/Source/DOM classes/SVG-DOM/SVGElementInstanceList_Internal.h b/Source/DOM classes/SVG-DOM/SVGElementInstanceList_Internal.h index ee88221e9..31a93c9ef 100644 --- a/Source/DOM classes/SVG-DOM/SVGElementInstanceList_Internal.h +++ b/Source/DOM classes/SVG-DOM/SVGElementInstanceList_Internal.h @@ -10,6 +10,6 @@ @interface SVGElementInstanceList () -@property(nonatomic,retain) NSMutableArray* internalArray; +@property(nonatomic,strong) NSMutableArray* internalArray; @end diff --git a/Source/DOM classes/SVG-DOM/SVGElementInstance_Mutable.h b/Source/DOM classes/SVG-DOM/SVGElementInstance_Mutable.h index 05ef3ea59..913941601 100644 --- a/Source/DOM classes/SVG-DOM/SVGElementInstance_Mutable.h +++ b/Source/DOM classes/SVG-DOM/SVGElementInstance_Mutable.h @@ -1,8 +1,8 @@ #import "SVGElementInstance.h" @interface SVGElementInstance () -@property(nonatomic,retain, readwrite) SVGElement* correspondingElement; -@property(nonatomic,retain, readwrite) SVGUseElement* correspondingUseElement; -@property(nonatomic,retain, readwrite) SVGElementInstance* parentNode; -@property(nonatomic,retain, readwrite) SVGElementInstanceList* childNodes; +@property(nonatomic,weak, readwrite) SVGElement* correspondingElement; +@property(nonatomic,weak, readwrite) SVGUseElement* correspondingUseElement; +@property(nonatomic,strong, readwrite) SVGElementInstance* parentNode; +@property(nonatomic,strong, readwrite) SVGElementInstanceList* childNodes; @end diff --git a/Source/DOM classes/SVG-DOM/SVGFitToViewBox.h b/Source/DOM classes/SVG-DOM/SVGFitToViewBox.h index b7c9c3db3..70e20a3d7 100644 --- a/Source/DOM classes/SVG-DOM/SVGFitToViewBox.h +++ b/Source/DOM classes/SVG-DOM/SVGFitToViewBox.h @@ -11,9 +11,12 @@ #import #import "SVGRect.h" +#import "SVGAnimatedPreserveAspectRatio.h" @protocol SVGFitToViewBox @property (nonatomic) /* SVGAnimatedRect */ SVGRect viewBox; +@property(nonatomic,retain) SVGAnimatedPreserveAspectRatio* preserveAspectRatio; + @end diff --git a/Source/DOM classes/SVG-DOM/SVGGElement.h b/Source/DOM classes/SVG-DOM/SVGGElement.h index 953b4d3a7..50b181abe 100644 --- a/Source/DOM classes/SVG-DOM/SVGGElement.h +++ b/Source/DOM classes/SVG-DOM/SVGGElement.h @@ -9,8 +9,6 @@ SVGTransformable { */ -#import - #import "SVGElement.h" #import "SVGElement_ForParser.h" diff --git a/Source/DOM classes/SVG-DOM/SVGGElement.m b/Source/DOM classes/SVG-DOM/SVGGElement.m index 5c8c2c124..a4c2068d9 100644 --- a/Source/DOM classes/SVG-DOM/SVGGElement.m +++ b/Source/DOM classes/SVG-DOM/SVGGElement.m @@ -11,7 +11,7 @@ @implementation SVGGElement - (CALayer *) newLayer { - CALayer* _layer = [[CALayerWithChildHitTest layer] retain]; + CALayer* _layer = [CALayerWithChildHitTest layer]; [SVGHelperUtilities configureCALayer:_layer usingElement:self]; @@ -20,11 +20,8 @@ - (CALayer *) newLayer - (void)layoutLayer:(CALayer *)layer { - CGRect mainRect = CGRectZero; - - /** we don't want the rect to be union'd with 0,0, so we need to initialize it to one of the subrects */ - if( layer.sublayers.count > 0 ) - mainRect = ((CALayer*)[layer.sublayers objectAtIndex:0]).frame; + // null rect union any other rect will return the other rect + CGRect mainRect = CGRectNull; /** make mainrect the UNION of all sublayer's frames (i.e. their individual "bounds" inside THIS layer's space) */ for ( CALayer *currentLayer in [layer sublayers] ) @@ -33,12 +30,25 @@ - (void)layoutLayer:(CALayer *)layer { mainRect = CGRectUnion(mainRect, subLayerFrame); } + NSAssert(!CGRectIsNull(mainRect), @"A G element has been generated with non-existent size and no contents. Apple cannot cope with this. As a workaround, we are resetting your layer to empty, but this may have unwanted side-effects (hard to test)" ); + if (CGRectIsNull(mainRect)) + { + return; + } + else + { /** use mainrect (union of all sub-layer bounds) this layer's FRAME i.e. top-left-corner of this layer will be "the top left corner of the convex-hull rect of all sublayers" AND: bottom-right-corner of this layer will be "the bottom-right corner of the convex-hull rect of all sublayers" */ layer.frame = mainRect; + + /** + If this group layer has a mask then since we've adjusted this layer's frame we need to offset the mask's frame by the opposite amount. + */ + if (layer.mask) + layer.mask.frame = CGRectOffset(layer.mask.frame, -mainRect.origin.x, -mainRect.origin.y); /** Changing THIS layer's frame now means all DIRECT sublayers are offset by too much (because when we change the offset of the parent frame (this.frame), Apple *does not* shift the sublayers around to keep them in same place. @@ -48,12 +58,14 @@ of the parent frame (this.frame), Apple *does not* shift the sublayers around to calls where it appears someone at Apple forgot how their API works, and tried to do the offsetting automatically. "Paved with good intentions...". */ - for (CALayer *currentLayer in [layer sublayers]) { - CGRect frame = currentLayer.frame; - frame.origin.x -= mainRect.origin.x; - frame.origin.y -= mainRect.origin.y; - currentLayer.frame = frame; - } + + for (CALayer *currentLayer in [layer sublayers]) { + CGRect frame = currentLayer.frame; + frame.origin.x -= mainRect.origin.x; + frame.origin.y -= mainRect.origin.y; + currentLayer.frame = frame; + } + } } @end diff --git a/Source/DOM classes/SVG-DOM/SVGHelperUtilities.h b/Source/DOM classes/SVG-DOM/SVGHelperUtilities.h index c6b231b13..d06908c3e 100644 --- a/Source/DOM classes/SVG-DOM/SVGHelperUtilities.h +++ b/Source/DOM classes/SVG-DOM/SVGHelperUtilities.h @@ -11,10 +11,11 @@ #import #import "SVGElement.h" #import "SVGTransformable.h" +#import "SVGFitToViewBox.h" #define FORCE_RASTERIZE_LAYERS 0 // If True, all CALayers will be told to rasterize themselves. This MIGHT increase performance (or might not), but leads to blurriness whenever a layer is scaled / zoomed in #define IMPROVE_PERFORMANCE_BY_WORKING_AROUND_APPLE_FRAME_ALIGNMENT_BUG 1 // NB: Apple's code for rendering ANY CALayer is extremely slow if the layer has non-integer co-ordinates for its "frame" or "bounds" property. This flag technically makes your SVG's render incorrect at sub-pixel level, but often increases performance of Apple's rendering by a factor of 2 or more! - +@class SVGGradientLayer; @interface SVGHelperUtilities : NSObject /** @@ -48,5 +49,13 @@ This method ONLY looks at current node to establish the above two things, to do +(void) configureCALayer:(CALayer*) layer usingElement:(SVGElement*) nonStylableElement; +(CALayer *) newCALayerForPathBasedSVGElement:(SVGElement*) svgElement withPath:(CGPathRef) path; ++ (SVGGradientLayer*)getGradientLayerWithId:(NSString*)gradId + forElement:(SVGElement*)svgElement + withRect:(CGRect)r + transform:(CGAffineTransform)transform; + ++(CGColorRef) parseFillForElement:(SVGElement *)svgElement; ++(CGColorRef) parseStrokeForElement:(SVGElement *)svgElement; ++(void) parsePreserveAspectRatioFor:(Element*) element; @end diff --git a/Source/DOM classes/SVG-DOM/SVGHelperUtilities.m b/Source/DOM classes/SVG-DOM/SVGHelperUtilities.m index dd32e287f..6e7f33895 100644 --- a/Source/DOM classes/SVG-DOM/SVGHelperUtilities.m +++ b/Source/DOM classes/SVG-DOM/SVGHelperUtilities.m @@ -91,6 +91,128 @@ +(CGAffineTransform) transformRelativeIncludingViewportForTransformableOrViewpor { CGAffineTransform translateToViewBox = CGAffineTransformMakeTranslation( -frameViewBox.x, -frameViewBox.y ); CGAffineTransform scaleToViewBox = CGAffineTransformMakeScale( viewportForViewBoxToRelateTo.width / frameViewBox.width, viewportForViewBoxToRelateTo.height / frameViewBox.height); + + /** This is hard to find in the spec, but: if you have NO implementation of PreserveAspectRatio, you still need to + read the spec on PreserveAspectRatio - because it defines a default behaviour for files that DO NOT specify it, + which is different from the mathemetic default of co-ordinate systems. + + In short, you MUST implement "", even if you're not supporting that attribute. + */ + if( svgSVGElement.preserveAspectRatio.baseVal.meetOrSlice == SVG_MEETORSLICE_MEET ) // ALWAYS TRUE in current implementation + { + if( ABS( svgSVGElement.aspectRatioFromWidthPerHeight - svgSVGElement.aspectRatioFromViewBox) > 0.00001 ) + { + /** The aspect ratios for viewport and viewbox differ; Spec requires us to + insert an extra transform that causes aspect ratio for internal data to be + + ... MEET: == KEPT CONSTANT + + and to "aspect-scale to fit" (i.e. leaving letterboxes at topbottom / leftright as required) + + c.f.: http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute (read carefully) + */ + + double ratioOfRatios = svgSVGElement.aspectRatioFromWidthPerHeight / svgSVGElement.aspectRatioFromViewBox; + + SVGKitLogWarn(@"ratioOfRatios = %.2f", ratioOfRatios ); + SVGKitLogWarn(@"Experimental: auto-scaling viewbox transform to fulfil SVG spec's default MEET settings, because your SVG file has different aspect-ratios for viewBox and for svg.width,svg.height"); + + /** + For MEET, we have to SHRINK the viewbox's contents if they aren't as wide:high as the viewport: + */ + CGAffineTransform catRestoreAspectRatio; + if( ratioOfRatios > 1 ) { + catRestoreAspectRatio = CGAffineTransformMakeScale( 1.0 / ratioOfRatios, 1.0 ); + } else if (ratioOfRatios != 0) { + catRestoreAspectRatio = CGAffineTransformMakeScale( 1.0, 1.0 * ratioOfRatios ); + } else { + catRestoreAspectRatio = CGAffineTransformIdentity; + } + + double xTranslationRequired; + double yTranslationRequired; + if( ratioOfRatios > 1.0 ) // if we're going to have space to either side + { + switch( svgSVGElement.preserveAspectRatio.baseVal.align ) + { + case SVG_PRESERVEASPECTRATIO_XMINYMIN: + case SVG_PRESERVEASPECTRATIO_XMINYMID: + case SVG_PRESERVEASPECTRATIO_XMINYMAX: + { + xTranslationRequired = 0.0; + }break; + + case SVG_PRESERVEASPECTRATIO_XMIDYMIN: + case SVG_PRESERVEASPECTRATIO_XMIDYMID: + case SVG_PRESERVEASPECTRATIO_XMIDYMAX: + { + xTranslationRequired = ((ratioOfRatios-1.0)/2.0) * frameViewBox.width; + }break; + + case SVG_PRESERVEASPECTRATIO_XMAXYMIN: + case SVG_PRESERVEASPECTRATIO_XMAXYMID: + case SVG_PRESERVEASPECTRATIO_XMAXYMAX: + { + xTranslationRequired = ((ratioOfRatios-1.0) * frameViewBox.width); + }break; + + case SVG_PRESERVEASPECTRATIO_NONE: + case SVG_PRESERVEASPECTRATIO_UNKNOWN: + { + xTranslationRequired = 0; + }break; + } + } + else + xTranslationRequired = 0; + + if( ratioOfRatios < 1.0 ) // if we're going to have space above and below + { + switch( svgSVGElement.preserveAspectRatio.baseVal.align ) + { + case SVG_PRESERVEASPECTRATIO_XMINYMIN: + case SVG_PRESERVEASPECTRATIO_XMIDYMIN: + case SVG_PRESERVEASPECTRATIO_XMAXYMIN: + { + yTranslationRequired = 0.0; + }break; + + case SVG_PRESERVEASPECTRATIO_XMINYMID: + case SVG_PRESERVEASPECTRATIO_XMIDYMID: + case SVG_PRESERVEASPECTRATIO_XMAXYMID: + { + yTranslationRequired = ((1.0-ratioOfRatios)/2.0 * [svgSVGElement.height pixelsValue]); + }break; + + case SVG_PRESERVEASPECTRATIO_XMINYMAX: + case SVG_PRESERVEASPECTRATIO_XMIDYMAX: + case SVG_PRESERVEASPECTRATIO_XMAXYMAX: + { + yTranslationRequired = ((1.0-ratioOfRatios) * [svgSVGElement.height pixelsValue]); + }break; + + case SVG_PRESERVEASPECTRATIO_NONE: + case SVG_PRESERVEASPECTRATIO_UNKNOWN: + { + yTranslationRequired = 0.0; + }break; + } + } + else + yTranslationRequired = 0.0; + /** + For xMidYMid, we have to RE-CENTER the viewbox's contents if they aren't as wide:high as the viewport: + */ + CGAffineTransform catRecenterNewAspectRatio = CGAffineTransformMakeTranslation( xTranslationRequired, yTranslationRequired ); + + CGAffineTransform transformsThatHonourAspectRatioRequirements = CGAffineTransformConcat(catRecenterNewAspectRatio, catRestoreAspectRatio); + + scaleToViewBox = CGAffineTransformConcat( transformsThatHonourAspectRatioRequirements, scaleToViewBox ); + } + } + else + SVGKitLogWarn( @"Unsupported: preserveAspectRatio set to SLICE. Code to handle this doesn't exist yet."); + transformSVGViewportToSVGViewBox = CGAffineTransformConcat( translateToViewBox, scaleToViewBox ); } else @@ -156,7 +278,7 @@ TOTAL absolute based on the parent transform with relative (and possible viewpor */ CGAffineTransform result = CGAffineTransformConcat( [self transformRelativeIncludingViewportForTransformableOrViewportEstablishingElement:transformableOrSVGSVGElement], parentAbsoluteTransform ); - //DEBUG: DDLogCWarn( @"[%@] self.transformAbsolute: returning: affine( (%2.2f %2.2f %2.2f %2.2f), (%2.2f %2.2f)", [self class], result.a, result.b, result.c, result.d, result.tx, result.ty); + //DEBUG: SVGKitLogWarn( @"[%@] self.transformAbsolute: returning: affine( (%2.2f %2.2f %2.2f %2.2f), (%2.2f %2.2f)", [self class], result.a, result.b, result.c, result.d, result.tx, result.ty); return result; } @@ -181,31 +303,55 @@ +(void) configureCALayer:(CALayer*) layer usingElement:(SVGElement*) nonStylable { SVGElement* stylableElement = (SVGElement*) nonStylableElement; - NSString* actualOpacity = [stylableElement cascadedValueForStylableProperty:@"opacity"]; + NSString* actualOpacity = [stylableElement cascadedValueForStylableProperty:@"opacity" inherit:NO]; layer.opacity = actualOpacity.length > 0 ? [actualOpacity floatValue] : 1.0f; // svg's "opacity" defaults to 1! + + // Apply fill-rule on layer (only CAShapeLayer) + NSString *fillRule = [stylableElement cascadedValueForStylableProperty:@"fill-rule"]; + if([fillRule isEqualToString:@"evenodd"] && [layer isKindOfClass:[CAShapeLayer class]]){ + CAShapeLayer *shapeLayer = (CAShapeLayer *)layer; + shapeLayer.fillRule = @"even-odd"; + } } } +(CALayer *) newCALayerForPathBasedSVGElement:(SVGElement*) svgElement withPath:(CGPathRef) pathRelative { - CAShapeLayer* _shapeLayer = [[CAShapeLayerWithHitTest layer] retain]; + CAShapeLayer* _shapeLayer = [CAShapeLayerWithHitTest layer]; [self configureCALayer:_shapeLayer usingElement:svgElement]; + NSString* actualStroke = [svgElement cascadedValueForStylableProperty:@"stroke"]; + if (!actualStroke) + actualStroke = @"none"; + NSString* actualStrokeWidth = [svgElement cascadedValueForStylableProperty:@"stroke-width"]; + + CGFloat strokeWidth = 1.0; + + if (actualStrokeWidth) + { + SVGRect r = ((SVGSVGElement*) svgElement.viewportElement).viewport; + + strokeWidth = [[SVGLength svgLengthFromNSString:actualStrokeWidth] + pixelsValueWithDimension: hypot(r.width, r.height)]; + } + /** transform our LOCAL path into ABSOLUTE space */ CGAffineTransform transformAbsolute = [self transformAbsoluteIncludingViewportForTransformableOrViewportEstablishingElement:svgElement]; - CGMutablePathRef pathToPlaceInLayer = CGPathCreateMutable(); - CGPathAddPath( pathToPlaceInLayer, &transformAbsolute, pathRelative); + + // calculate the rendered dimensions of the path + CGRect r = CGRectInset(CGPathGetBoundingBox(pathRelative), -strokeWidth/2., -strokeWidth/2.); + CGRect transformedPathBB = CGRectApplyAffineTransform(r, transformAbsolute); + + CGPathRef pathToPlaceInLayer = CGPathCreateCopyByTransformingPath(pathRelative, &transformAbsolute); /** find out the ABSOLUTE BOUNDING BOX of our transformed path */ - //BIZARRE: Apple sometimes gives a different value for this even when transformAbsolute == identity! : CGRect localPathBB = CGPathGetPathBoundingBox( _pathRelative ); //DEBUG ONLY: CGRect unTransformedPathBB = CGPathGetBoundingBox( _pathRelative ); - CGRect transformedPathBB = CGPathGetBoundingBox( pathToPlaceInLayer ); #if IMPROVE_PERFORMANCE_BY_WORKING_AROUND_APPLE_FRAME_ALIGNMENT_BUG transformedPathBB = CGRectIntegral( transformedPathBB ); // ridiculous but improves performance of apple's code by up to 50% ! #endif - + /** NB: when we set the _shapeLayer.frame, it has a *side effect* of moving the path itself - so, in order to prevent that, because Apple didn't provide a BOOL to disable that "feature", we have to pre-shift the path forwards by the amount it will be shifted backwards */ @@ -215,7 +361,6 @@ +(CALayer *) newCALayerForPathBasedSVGElement:(SVGElement*) sv _shapeLayer.path = finalPath; CGPathRelease(finalPath); - //CGPathRelease(pathToPlaceInLayer); /** NB: this line, by changing the FRAME of the layer, has the side effect of also changing the CGPATH's position in absolute @@ -223,29 +368,51 @@ +(CALayer *) newCALayerForPathBasedSVGElement:(SVGElement*) sv */ _shapeLayer.frame = transformedPathBB; - + CGRect localRect = CGRectMake(0, 0, CGRectGetWidth(transformedPathBB), CGRectGetHeight(transformedPathBB)); + //DEBUG ONLY: CGRect shapeLayerFrame = _shapeLayer.frame; + CAShapeLayer* strokeLayer = _shapeLayer; + CAShapeLayer* fillLayer = _shapeLayer; - NSString* actualStroke = [svgElement cascadedValueForStylableProperty:@"stroke"]; - NSString* actualStrokeWidth = [svgElement cascadedValueForStylableProperty:@"stroke-width"]; - if( actualStroke.length > 0 + if( strokeWidth > 0 && (! [@"none" isEqualToString:actualStroke]) ) { - CGFloat strokeWidth = actualStrokeWidth.length > 0 ? [actualStrokeWidth floatValue] : 1.0f; - /* We have to apply any scale-factor part of the affine transform to the stroke itself (this is bizarre and horrible, yes, but that's the spec for you!) */ - CGSize fakeSize = CGSizeMake( strokeWidth, 0 ); + CGSize fakeSize = CGSizeMake( strokeWidth, strokeWidth ); fakeSize = CGSizeApplyAffineTransform( fakeSize, transformAbsolute ); - _shapeLayer.lineWidth = fakeSize.width; + strokeLayer.lineWidth = hypot(fakeSize.width, fakeSize.height)/M_SQRT2; - SVGColor strokeColorAsSVGColor = SVGColorFromString([actualStroke UTF8String]); // have to use the intermediate of an SVGColor so that we can over-ride the ALPHA component in next line - NSString* actualStrokeOpacity = [svgElement cascadedValueForStylableProperty:@"stroke-opacity"]; - if( actualStrokeOpacity.length > 0 ) - strokeColorAsSVGColor.a = (uint8_t) ([actualStrokeOpacity floatValue] * 0xFF); + NSString* actualStrokeOpacity = [svgElement cascadedValueForStylableProperty:@"stroke-opacity"]; + strokeLayer.strokeColor = [self parseStrokeForElement:svgElement fromStroke:actualStroke andOpacity:actualStrokeOpacity]; - _shapeLayer.strokeColor = CGColorWithSVGColor( strokeColorAsSVGColor ); + /** + Stroke dash array + */ + NSString *dashArrayString = [svgElement cascadedValueForStylableProperty:@"stroke-dasharray"]; + if(dashArrayString != nil && ![dashArrayString isEqualToString:@""]) { + NSArray *dashArrayStringComponents = [dashArrayString componentsSeparatedByString:@" "]; + if( [dashArrayStringComponents count] < 2 ) + { // min 2 elements required, perhaps it's comma-separated: + dashArrayStringComponents = [dashArrayString componentsSeparatedByString:@","]; + } + if( [dashArrayStringComponents count] > 1 ) + { + BOOL valid = NO; + NSMutableArray *dashArray = [NSMutableArray array]; + for( NSString *n in dashArrayStringComponents ){ + [dashArray addObject:[NSNumber numberWithFloat:[n floatValue]]]; + if( !valid && [n floatValue] != 0 ){ + // avoid 'CGContextSetLineDash: invalid dash array: at least one element must be non-zero.' + valid = YES; + } + } + if( valid ){ + strokeLayer.lineDashPattern = dashArray; + } + } + } /** Line joins + caps: butt / square / miter @@ -256,88 +423,277 @@ +(CALayer *) newCALayerForPathBasedSVGElement:(SVGElement*) sv if( actualLineCap.length > 0 ) { if( [actualLineCap isEqualToString:@"butt"] ) - _shapeLayer.lineCap = kCALineCapButt; + strokeLayer.lineCap = kCALineCapButt; else if( [actualLineCap isEqualToString:@"round"] ) - _shapeLayer.lineCap = kCALineCapRound; + strokeLayer.lineCap = kCALineCapRound; else if( [actualLineCap isEqualToString:@"square"] ) - _shapeLayer.lineCap = kCALineCapSquare; + strokeLayer.lineCap = kCALineCapSquare; } if( actualLineJoin.length > 0 ) { if( [actualLineJoin isEqualToString:@"miter"] ) - _shapeLayer.lineJoin = kCALineJoinMiter; + strokeLayer.lineJoin = kCALineJoinMiter; else if( [actualLineJoin isEqualToString:@"round"] ) - _shapeLayer.lineJoin = kCALineJoinRound; + strokeLayer.lineJoin = kCALineJoinRound; else if( [actualLineJoin isEqualToString:@"bevel"] ) - _shapeLayer.lineJoin = kCALineJoinBevel; + strokeLayer.lineJoin = kCALineJoinBevel; } if( actualMiterLimit.length > 0 ) { - _shapeLayer.miterLimit = [actualMiterLimit floatValue]; + strokeLayer.miterLimit = [actualMiterLimit floatValue]; } + if ( [actualStroke hasPrefix:@"url"] ) + { + // need a new fill layer because the stroke layer is becoming a mask + fillLayer = [CAShapeLayerWithHitTest layer]; + fillLayer.frame = strokeLayer.frame; + fillLayer.opacity = strokeLayer.opacity; + fillLayer.path = strokeLayer.path; + + NSArray *strokeArgs = [actualStroke componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; + NSString *strokeIdArg = strokeArgs.firstObject; + NSRange idKeyRange = NSMakeRange(5, strokeIdArg.length - 6); + NSString* strokeId = [strokeIdArg substringWithRange:idKeyRange]; + + // SVG spec: Vertical and horizontal lines don't have a boundingbox, since they are one-dimensional, even though the stroke-width makes it look like they should have a boundingbox with non-zero width and height. + CGRect boundingBox = strokeLayer.frame; + CGRect pathBoundingBox = CGPathGetPathBoundingBox(pathRelative); + if (!CGRectIsEmpty(pathBoundingBox)) { + // apply gradient + SVGGradientLayer *gradientLayer = [self getGradientLayerWithId:strokeId forElement:svgElement withRect:boundingBox transform:transformAbsolute]; + + if (gradientLayer) { + strokeLayer.frame = localRect; + + strokeLayer.fillColor = nil; + strokeLayer.strokeColor = [UIColor blackColor].CGColor; + + gradientLayer.mask = strokeLayer; + strokeLayer = (CAShapeLayer*) gradientLayer; + } else { + // no gradient, fallback + } + } else { + // no boundingBox, fallback + } + } + } else { if( [@"none" isEqualToString:actualStroke] ) { - _shapeLayer.strokeColor = nil; // This is how you tell Apple that the stroke is disabled; a strokewidth of 0 will NOT achieve this - _shapeLayer.lineWidth = 0.0f; // MUST set this explicitly, or Apple assumes 1.0 + strokeLayer.strokeColor = nil; // This is how you tell Apple that the stroke is disabled; a strokewidth of 0 will NOT achieve this + strokeLayer.lineWidth = 0.0f; // MUST set this explicitly, or Apple assumes 1.0 } else { - _shapeLayer.lineWidth = 1.0f; // default value from SVG spec + strokeLayer.lineWidth = 1.0f; // default value from SVG spec } } - NSString* actualFill = [svgElement cascadedValueForStylableProperty:@"fill"]; - if ( [actualFill hasPrefix:@"none"]) - { - _shapeLayer.fillColor = nil; - } - else if ( [actualFill hasPrefix:@"url"] ) + NSString* actualFillOpacity = [svgElement cascadedValueForStylableProperty:@"fill-opacity"]; + + if ( [actualFill hasPrefix:@"url"] ) { - NSRange idKeyRange = NSMakeRange(5, actualFill.length - 6); - NSString* _fillId = [actualFill substringWithRange:idKeyRange]; + NSArray *fillArgs = [actualFill componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; + NSString *fillIdArg = fillArgs.firstObject; + NSRange idKeyRange = NSMakeRange(5, fillIdArg.length - 6); + NSString* fillId = [fillIdArg substringWithRange:idKeyRange]; /** Replace the return layer with a special layer using the URL fill */ /** fetch the fill layer by URL using the DOM */ - NSAssert( svgElement.rootOfCurrentDocumentFragment != nil, @"This SVG shape has a URL fill type; it needs to search for that URL (%@) inside its nearest-ancestor node, but the rootOfCurrentDocumentFragment reference was nil (suggests the parser failed, or the SVG file is corrupt)", _fillId ); - - SVGGradientElement* svgGradient = (SVGGradientElement*) [svgElement.rootOfCurrentDocumentFragment getElementById:_fillId]; - NSAssert( svgGradient != nil, @"This SVG shape has a URL fill (%@), but could not find an XML Node with that ID inside the DOM tree (suggests the parser failed, or the SVG file is corrupt)", _fillId ); - - //if( _shapeLayer != nil && svgGradient != nil ) //this nil check here is distrubing but blocking - { - SVGGradientLayer *gradientLayer = [svgGradient newGradientLayerForObjectRect:_shapeLayer.frame viewportRect:svgElement.rootOfCurrentDocumentFragment.viewBox]; - - DDLogCWarn(@"DOESNT WORK, APPLE's API APPEARS BROKEN???? - About to mask layer frame (%@) with a mask of frame (%@)", NSStringFromCGRect(gradientLayer.frame), NSStringFromCGRect(_shapeLayer.frame)); - gradientLayer.mask =_shapeLayer; - gradientLayer.maskPath = pathToPlaceInLayer; - CGPathRelease(pathToPlaceInLayer); - [_shapeLayer release]; // because it was created with a +1 retain count - - return gradientLayer; - } + SVGGradientLayer *gradientLayer = [self getGradientLayerWithId:fillId forElement:svgElement withRect:fillLayer.frame + transform:transformAbsolute]; + if (gradientLayer) { + CAShapeLayer* maskLayer = [CAShapeLayer layer]; + maskLayer.frame = localRect; + maskLayer.path = fillLayer.path; + maskLayer.fillColor = [UIColor blackColor].CGColor; + maskLayer.strokeColor = nil; + gradientLayer.mask = maskLayer; + gradientLayer.frame = fillLayer.frame; + fillLayer = (CAShapeLayer* )gradientLayer; + } else { + // no gradient, fallback + } } - else if( actualFill.length > 0 ) + else if( actualFill.length > 0 || actualFillOpacity.length > 0 ) { - SVGColor fillColorAsSVGColor = SVGColorFromString([actualFill UTF8String]); // have to use the intermediate of an SVGColor so that we can over-ride the ALPHA component in next line - NSString* actualFillOpacity = [svgElement cascadedValueForStylableProperty:@"fill-opacity"]; - if( actualFillOpacity.length > 0 ) - fillColorAsSVGColor.a = (uint8_t) ([actualFillOpacity floatValue] * 0xFF); - - _shapeLayer.fillColor = CGColorWithSVGColor(fillColorAsSVGColor); + fillLayer.fillColor = [self parseFillForElement:svgElement fromFill:actualFill andOpacity:actualFillOpacity]; } - else + CGPathRelease(pathToPlaceInLayer); + + NSString* actualOpacity = [svgElement cascadedValueForStylableProperty:@"opacity" inherit:NO]; + fillLayer.opacity = actualOpacity.length > 0 ? [actualOpacity floatValue] : 1; // unusually, the "opacity" attribute defaults to 1, not 0 + + if (strokeLayer == fillLayer) { - + return strokeLayer; } + CALayer* combined = [CALayer layer]; + + combined.frame = strokeLayer.frame; + strokeLayer.frame = localRect; + if ([strokeLayer isKindOfClass:[CAShapeLayer class]]) + strokeLayer.fillColor = nil; + fillLayer.frame = localRect; + [combined addSublayer:fillLayer]; + [combined addSublayer:strokeLayer]; + return combined; +} + ++ (SVGGradientLayer*)getGradientLayerWithId:(NSString*)gradId + forElement:(SVGElement*)svgElement + withRect:(CGRect)r + transform:(CGAffineTransform)transform +{ + /** Replace the return layer with a special layer using the URL fill */ + /** fetch the fill layer by URL using the DOM */ + NSAssert( svgElement.rootOfCurrentDocumentFragment != nil, @"This SVG shape has a URL fill type; it needs to search for that URL (%@) inside its nearest-ancestor node, but the rootOfCurrentDocumentFragment reference was nil (suggests the parser failed, or the SVG file is corrupt)", gradId ); + + SVGGradientElement* svgGradient = (SVGGradientElement*) [svgElement.rootOfCurrentDocumentFragment getElementById:gradId]; + if (svgGradient == nil) { + // SVG spec allows referenced gradient not exist and will use fallback color + SVGKitLogWarn(@"This SVG shape has a URL fill (%@), but could not find an XML Node with that ID inside the DOM tree (suggests the parser failed, or the SVG file is corrupt)", gradId ); + } + + [svgGradient synthesizeProperties]; + + SVGGradientLayer *gradientLayer = [svgGradient newGradientLayerForObjectRect:r + viewportRect:svgElement.rootOfCurrentDocumentFragment.viewBox + transform:transform]; + + return gradientLayer; +} + ++(CGColorRef) parseFillForElement:(SVGElement *)svgElement +{ + NSString* actualFill = [svgElement cascadedValueForStylableProperty:@"fill"]; + NSString* actualFillOpacity = [svgElement cascadedValueForStylableProperty:@"fill-opacity"]; + return [self parseFillForElement:svgElement fromFill:actualFill andOpacity:actualFillOpacity]; +} + ++(CGColorRef) parseFillForElement:(SVGElement *)svgElement fromFill:(NSString *)actualFill andOpacity:(NSString *)actualFillOpacity +{ + return [self parsePaintColorForElement:svgElement paintColor:actualFill paintOpacity:actualFillOpacity defaultColor:@"black"]; +} + ++(CGColorRef) parseStrokeForElement:(SVGElement *)svgElement +{ + NSString* actualStroke = [svgElement cascadedValueForStylableProperty:@"stroke"]; + NSString* actualStrokeOpacity = [svgElement cascadedValueForStylableProperty:@"stroke-opacity"]; + return [self parseStrokeForElement:svgElement fromStroke:actualStroke andOpacity:actualStrokeOpacity]; +} + ++(CGColorRef) parseStrokeForElement:(SVGElement *)svgElement fromStroke:(NSString *)actualStroke andOpacity:(NSString *)actualStrokeOpacity +{ + return [self parsePaintColorForElement:svgElement paintColor:actualStroke paintOpacity:actualStrokeOpacity defaultColor:@"none"]; +} + +/** + Spec: https://www.w3.org/TR/SVG11/painting.html#SpecifyingPaint + `fill` or `stroke` allows paint color. This should actually be a interface. + `fill` default color is `black`, while `stroke` default color is `none` + */ ++(CGColorRef)parsePaintColorForElement:(SVGElement *)svgElement paintColor:(NSString *)paintColor paintOpacity:(NSString *)paintOpacity defaultColor:(NSString *)defaultColor { + CGColorRef colorRef = NULL; + if (!paintColor) { + paintColor = @"none"; + } + if ([paintColor isEqualToString:@"none"]) + { + return NULL; + } + // there may be a url before the actual color like `url(#grad) #0f0`, parse it + NSString *actualPaintColor; + NSString *actualPaintOpacity = paintOpacity; + NSArray *paintArgs = [paintColor componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; + if ([paintColor hasPrefix:@"url"]) { + if (paintArgs.count > 1) { + actualPaintColor = paintArgs[1]; + } + } else { + actualPaintColor = paintColor; + } + if( actualPaintColor.length > 0 || actualPaintOpacity.length > 0 ) { + SVGColor paintColorSVGColor; + if (actualPaintColor.length > 0) { + if (![actualPaintColor isEqualToString:@"none"]) { + paintColorSVGColor = SVGColorFromString([actualPaintColor UTF8String]); // have to use the intermediate of an SVGColor so that we can over-ride the ALPHA component in next line + } else { + return NULL; + } + } else { + if (![defaultColor isEqualToString:@"none"]) { + paintColorSVGColor = SVGColorFromString([actualPaintColor UTF8String]); + } else { + return NULL; + } + } + + if( actualPaintOpacity.length > 0 ) + paintColorSVGColor.a = (uint8_t) ([actualPaintOpacity floatValue] * 0xFF); + + colorRef = CGColorWithSVGColor(paintColorSVGColor); + } + else + { + if (![defaultColor isEqualToString:@"none"]) { + colorRef = CGColorWithSVGColor(SVGColorFromString([defaultColor UTF8String])); + } else { + return NULL; + } + } - NSString* actualOpacity = [svgElement cascadedValueForStylableProperty:@"opacity"]; - _shapeLayer.opacity = actualOpacity.length > 0 ? [actualOpacity floatValue] : 1; // unusually, the "opacity" attribute defaults to 1, not 0 - CGPathRelease(pathToPlaceInLayer); - return _shapeLayer; + return colorRef; +} + ++(void) parsePreserveAspectRatioFor:(Element*) element +{ + element.preserveAspectRatio = [SVGAnimatedPreserveAspectRatio new]; // automatically sets defaults + + NSString* stringPreserveAspectRatio = [element getAttribute:@"preserveAspectRatio"]; + + if( stringPreserveAspectRatio.length > 0 ) + { + NSArray* aspectRatioCommands = [stringPreserveAspectRatio componentsSeparatedByString:@" "]; + + for( NSString* aspectRatioCommand in aspectRatioCommands ) + { + if( [aspectRatioCommand isEqualToString:@"meet"]) /** NB this is default anyway. Dont technically need to set it */ + element.preserveAspectRatio.baseVal.meetOrSlice = SVG_MEETORSLICE_MEET; + else if( [aspectRatioCommand isEqualToString:@"slice"]) + element.preserveAspectRatio.baseVal.meetOrSlice = SVG_MEETORSLICE_SLICE; + + else if( [aspectRatioCommand isEqualToString:@"xMinYMin"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMINYMIN; + else if( [aspectRatioCommand isEqualToString:@"xMinYMid"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMINYMID; + else if( [aspectRatioCommand isEqualToString:@"xMinYMax"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMINYMAX; + + else if( [aspectRatioCommand isEqualToString:@"xMidYMin"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMIDYMIN; + else if( [aspectRatioCommand isEqualToString:@"xMidYMid"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMIDYMID; + else if( [aspectRatioCommand isEqualToString:@"xMidYMax"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMIDYMAX; + + else if( [aspectRatioCommand isEqualToString:@"xMaxYMin"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMAXYMIN; + else if( [aspectRatioCommand isEqualToString:@"xMaxYMid"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMAXYMID; + else if( [aspectRatioCommand isEqualToString:@"xMaxYMax"]) + element.preserveAspectRatio.baseVal.align = SVG_PRESERVEASPECTRATIO_XMAXYMAX; + + else + { + SVGKitLogWarn(@"Found unexpected preserve-aspect-ratio command inside element's 'preserveAspectRatio' attribute. Command = '%@'", aspectRatioCommand ); + } + } + } } @end diff --git a/Source/DOM classes/SVG-DOM/SVGLength.h b/Source/DOM classes/SVG-DOM/SVGLength.h index 91fb65585..d8fab8fa7 100644 --- a/Source/DOM classes/SVG-DOM/SVGLength.h +++ b/Source/DOM classes/SVG-DOM/SVGLength.h @@ -48,7 +48,7 @@ typedef enum SVG_LENGTH_TYPE @property(nonatomic,readonly) SVG_LENGTH_TYPE unitType; @property(nonatomic) float value; @property(nonatomic) float valueInSpecifiedUnits; -@property(nonatomic,retain) NSString* valueAsString; +@property(nonatomic,strong) NSString* valueAsString; -(void) newValueSpecifiedUnits:(SVG_LENGTH_TYPE) unitType valueInSpecifiedUnits:(float) valueInSpecifiedUnits; -(void) convertToSpecifiedUnits:(SVG_LENGTH_TYPE) unitType; @@ -61,6 +61,16 @@ typedef enum SVG_LENGTH_TYPE /** returns this SVGLength as if it had been converted to pixels, using [self convertToSpecifiedUnits:SVG_LENGTHTYPE_PX] */ -(float) pixelsValue; + +/** to calculate relative values pass in the appropriate viewport dimension (width, height, or diagonal measure) +*/ +-(float) pixelsValueWithDimension:(float)dimension; + +/** to calculate relative gradient values pass in the appropriate viewport dimension (width, height) + * the different between this and `pixelsValueWithDimension` is that this one will treat number value which (0 <= value <= 1.0) as percent value and calculate the result. (used by gradient) + */ +-(float) pixelsValueWithGradientDimension:(float)dimension; + /** returns this SVGLength as if it had been converted to a raw number (USE pixelsValue instead, UNLESS you are dealing with something that you expect to be a percentage or similar non-pixel value), using [self convertToSpecifiedUnits:SVG_LENGTHTYPE_NUMBER] */ diff --git a/Source/DOM classes/SVG-DOM/SVGLength.m b/Source/DOM classes/SVG-DOM/SVGLength.m index ff1dc6c51..cc336995a 100644 --- a/Source/DOM classes/SVG-DOM/SVGLength.m +++ b/Source/DOM classes/SVG-DOM/SVGLength.m @@ -9,7 +9,7 @@ #include @interface SVGLength() -@property(nonatomic,retain) CSSPrimitiveValue* internalCSSPrimitiveValue; +@property(nonatomic,strong) CSSPrimitiveValue* internalCSSPrimitiveValue; @end @implementation SVGLength @@ -20,11 +20,6 @@ @implementation SVGLength @synthesize valueAsString; @synthesize internalCSSPrimitiveValue; -- (void)dealloc { - self.valueAsString = nil; - self.internalCSSPrimitiveValue = nil; - [super dealloc]; -} - (id)init { @@ -94,7 +89,7 @@ +(void)initialize +(SVGLength*) svgLengthZero { - SVGLength* result = [[[SVGLength alloc] initWithCSSPrimitiveValue:nil] autorelease]; + SVGLength* result = [[SVGLength alloc] initWithCSSPrimitiveValue:nil]; return result; } @@ -102,12 +97,12 @@ +(SVGLength*) svgLengthZero static float cachedDevicePixelsPerInch; +(SVGLength*) svgLengthFromNSString:(NSString*) s { - CSSPrimitiveValue* pv = [[[CSSPrimitiveValue alloc] init] autorelease]; + CSSPrimitiveValue* pv = [[CSSPrimitiveValue alloc] init]; pv.pixelsPerInch = cachedDevicePixelsPerInch; pv.cssText = s; - SVGLength* result = [[[SVGLength alloc] initWithCSSPrimitiveValue:pv] autorelease]; + SVGLength* result = [[SVGLength alloc] initWithCSSPrimitiveValue:pv]; return result; } @@ -117,6 +112,27 @@ -(float) pixelsValue return [self.internalCSSPrimitiveValue getFloatValue:CSS_PX]; } +-(float) pixelsValueWithDimension:(float)dimension +{ + if (self.internalCSSPrimitiveValue.primitiveType == CSS_PERCENTAGE) + return dimension * self.value / 100.0; + + return [self pixelsValue]; +} + +-(float) pixelsValueWithGradientDimension:(float)dimension +{ + if (self.internalCSSPrimitiveValue.primitiveType == CSS_PERCENTAGE) { + return dimension * self.value / 100.0; + } else if (self.internalCSSPrimitiveValue.primitiveType == CSS_NUMBER) { + if (self.value >= 0 && self.value <= 1) { + return dimension * self.value; + } + } + + return [self pixelsValue]; +} + -(float) numberValue { return [self.internalCSSPrimitiveValue getFloatValue:CSS_NUMBER]; @@ -126,8 +142,8 @@ -(float) numberValue +(float) pixelsPerInchForCurrentDevice { - /** Using this as reference: http://en.wikipedia.org/wiki/List_of_displays_by_pixel_density#Apple - */ + /** Using this as reference: http://en.wikipedia.org/wiki/Retina_Display and https://www.theiphonewiki.com/wiki/Models + */ size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); @@ -141,14 +157,28 @@ +(float) pixelsPerInchForCurrentDevice || [platform hasPrefix:@"iPhone3"]) return 163.0f; - if( [platform hasPrefix:@"iPhone4"] - || [platform hasPrefix:@"iPhone5"]) - return 326.0f; + if( [platform hasPrefix:@"iPhone4"] + || [platform hasPrefix:@"iPhone5"] + || [platform hasPrefix:@"iPhone6"] + || [platform hasPrefix:@"iPhone7,2"] + || [platform hasPrefix:@"iPhone8,1"] + || [platform hasPrefix:@"iPhone8,4"] + || [platform hasPrefix:@"iPhone9,1"] + || [platform hasPrefix:@"iPhone9,3"]) { + return 326.0f; + } + + if ( [platform hasPrefix:@"iPhone7,1"] + || [platform hasPrefix:@"iPhone8,2"] + || [platform hasPrefix:@"iPhone9,2"] + || [platform hasPrefix:@"iPhone9,4"]) { + return 401.0f; + } if( [platform hasPrefix:@"iPhone"]) // catch-all for higher-end devices not yet existing { - NSAssert(FALSE, @"Not supported yet: you are using an iPhone that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); - return 326.0f; + NSAssert(FALSE, @"Update your source code or disable assertions: you are using an iPhone that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); + return 401.0f; } if( [platform hasPrefix:@"iPod1"] @@ -157,30 +187,50 @@ +(float) pixelsPerInchForCurrentDevice return 163.0f; if( [platform hasPrefix:@"iPod4"] - || [platform hasPrefix:@"iPod5"]) + || [platform hasPrefix:@"iPod5"] + || [platform hasPrefix:@"iPod7"]) return 326.0f; if( [platform hasPrefix:@"iPod"]) // catch-all for higher-end devices not yet existing { - NSAssert(FALSE, @"Not supported yet: you are using an iPod that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); + NSAssert(FALSE, @"Update your source code or disable assertions: you are using an iPod that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); return 326.0f; } + if( [platform hasPrefix:@"iPad5,1"] + || [platform hasPrefix:@"iPad5,2"]) + return 326.0f; + if( [platform hasPrefix:@"iPad1"] || [platform hasPrefix:@"iPad2"]) return 132.0f; if( [platform hasPrefix:@"iPad3"] - || [platform hasPrefix:@"iPad4"]) + || [platform hasPrefix:@"iPad4"] + || [platform hasPrefix:@"iPad5,3"] + || [platform hasPrefix:@"iPad5,4"] + || [platform hasPrefix:@"iPad6"] + || [platform hasPrefix:@"iPad7"] + || [platform hasPrefix:@"iPad8"]) return 264.0f; + if( [platform hasPrefix:@"iPad"]) // catch-all for higher-end devices not yet existing { - NSAssert(FALSE, @"Not supported yet: you are using an iPad that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); + NSAssert(FALSE, @"Update your source code or disable assertions: you are using an iPad that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); return 264.0f; } + + if( [platform hasPrefix:@"iWatch1"]) + return 326.0f; + + if( [platform hasPrefix:@"iWatch"]) // catch-all for higher-end devices not yet existing + { + NSAssert(FALSE, @"Update your source code or disable assertions: you are using an iWatch that didn't exist when this code was written, we have no idea what the pixel count per inch is!"); + return 326.0f; + } if( [platform hasPrefix:@"x86_64"]) { - DDLogCWarn(@"[%@] WARNING: you are running on the simulator; it's impossible for us to calculate centimeter/millimeter/inches units correctly", [self class]); + SVGKitLogWarn(@"[%@] WARNING: you are running on the simulator; it's impossible for us to calculate centimeter/millimeter/inches units correctly", [self class]); return 132.0f; // Simulator, running on desktop machine } diff --git a/Source/DOM classes/SVG-DOM/SVGNumber.h b/Source/DOM classes/SVG-DOM/SVGNumber.h index dde75b96a..6993a08a0 100644 --- a/Source/DOM classes/SVG-DOM/SVGNumber.h +++ b/Source/DOM classes/SVG-DOM/SVGNumber.h @@ -9,4 +9,4 @@ typedef struct { float value; -} SVGNumber; \ No newline at end of file +} SVGNumber; diff --git a/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.h b/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.h new file mode 100644 index 000000000..c0331c7f9 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.h @@ -0,0 +1,59 @@ +/** + http://www.w3.org/TR/SVG/coords.html#InterfaceSVGPreserveAspectRatio + + interface SVGPreserveAspectRatio { + + // Alignment Types + SVG_PRESERVEASPECTRATIO_UNKNOWN = 0; + SVG_PRESERVEASPECTRATIO_NONE = 1; + SVG_PRESERVEASPECTRATIO_XMINYMIN = 2; + SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3; + SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4; + SVG_PRESERVEASPECTRATIO_XMINYMID = 5; + SVG_PRESERVEASPECTRATIO_XMIDYMID = 6; + SVG_PRESERVEASPECTRATIO_XMAXYMID = 7; + SVG_PRESERVEASPECTRATIO_XMINYMAX = 8; + SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9; + SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10; + + // Meet-or-slice Types + SVG_MEETORSLICE_UNKNOWN = 0; + SVG_MEETORSLICE_MEET = 1; + SVG_MEETORSLICE_SLICE = 2; + + attribute unsigned short align setraises(DOMException); + attribute unsigned short meetOrSlice setraises(DOMException); + }; + */ +#import + +@interface SVGPreserveAspectRatio : NSObject + +typedef enum SVG_PRESERVEASPECTRATIO +{ + // Alignment Types + SVG_PRESERVEASPECTRATIO_UNKNOWN = 0, + SVG_PRESERVEASPECTRATIO_NONE = 1, + SVG_PRESERVEASPECTRATIO_XMINYMIN = 2, + SVG_PRESERVEASPECTRATIO_XMIDYMIN = 3, + SVG_PRESERVEASPECTRATIO_XMAXYMIN = 4, + SVG_PRESERVEASPECTRATIO_XMINYMID = 5, + SVG_PRESERVEASPECTRATIO_XMIDYMID = 6, + SVG_PRESERVEASPECTRATIO_XMAXYMID = 7, + SVG_PRESERVEASPECTRATIO_XMINYMAX = 8, + SVG_PRESERVEASPECTRATIO_XMIDYMAX = 9, + SVG_PRESERVEASPECTRATIO_XMAXYMAX = 10 +} SVG_PRESERVEASPECTRATIO; + +typedef enum SVG_MEETORSLICE +{ + // Meet-or-slice Types + SVG_MEETORSLICE_UNKNOWN = 0, + SVG_MEETORSLICE_MEET = 1, + SVG_MEETORSLICE_SLICE = 2 +} SVG_MEETORSLICE; + +@property(nonatomic) SVG_PRESERVEASPECTRATIO align; +@property(nonatomic) SVG_MEETORSLICE meetOrSlice; + +@end diff --git a/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.m b/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.m new file mode 100644 index 000000000..a650463a6 --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGPreserveAspectRatio.m @@ -0,0 +1,15 @@ +#import "SVGPreserveAspectRatio.h" + +@implementation SVGPreserveAspectRatio + +/** Sets default values mandated by SVG Spec */ +- (id)init +{ + self = [super init]; + if (self) { + self.align = SVG_PRESERVEASPECTRATIO_XMIDYMID; + self.meetOrSlice = SVG_MEETORSLICE_MEET; + } + return self; +} +@end diff --git a/Source/DOM classes/SVG-DOM/SVGRect.h b/Source/DOM classes/SVG-DOM/SVGRect.h index 0cb1cc14e..2936e93dc 100644 --- a/Source/DOM classes/SVG-DOM/SVGRect.h +++ b/Source/DOM classes/SVG-DOM/SVGRect.h @@ -27,7 +27,8 @@ typedef struct Unfortunately, the SVG Spec authors defined "uninitialized" and "values of zero" to mean differnet things, so we MUST preserve that difference! */ -SVGRect SVGRectUninitialized(); +SVGRect SVGRectUninitialized(void); + /** c.f. note about SVGRectUninitialized() -- this method checks if a Rect is identical to the output of that method */ BOOL SVGRectIsInitialized( SVGRect rect ); @@ -37,4 +38,6 @@ SVGRect SVGRectMake( float x, float y, float width, float height ); CGRect CGRectFromSVGRect( SVGRect rect ); /** Convenience method to convert to ObjectiveC's kind of size - ONLY the width and height of this rect */ -CGSize CGSizeFromSVGRect( SVGRect rect ); \ No newline at end of file +CGSize CGSizeFromSVGRect( SVGRect rect ); + +NSString * _Nonnull NSStringFromSVGRect( SVGRect rect ); diff --git a/Source/DOM classes/SVG-DOM/SVGRect.m b/Source/DOM classes/SVG-DOM/SVGRect.m index c1442ab7c..9525d1e4f 100644 --- a/Source/DOM classes/SVG-DOM/SVGRect.m +++ b/Source/DOM classes/SVG-DOM/SVGRect.m @@ -5,7 +5,7 @@ BOOL SVGRectIsInitialized( SVGRect rect ) return rect.x != -1 || rect.y != -1 || rect.width != -1 || rect.height != -1; } -SVGRect SVGRectUninitialized() +SVGRect SVGRectUninitialized( void ) { return SVGRectMake( -1, -1, -1, -1 ); } @@ -28,4 +28,13 @@ CGSize CGSizeFromSVGRect( SVGRect rect ) CGSize result = CGSizeMake( rect.width, rect.height ); return result; -} \ No newline at end of file +} + +NSString * NSStringFromSVGRect( SVGRect rect ) { + CGRect cgRect = CGRectFromSVGRect(rect); +#if SVGKIT_MAC + return NSStringFromRect(cgRect); +#else + return NSStringFromCGRect(cgRect); +#endif +} diff --git a/Source/DOM classes/SVG-DOM/SVGSVGElement_Mutable.h b/Source/DOM classes/SVG-DOM/SVGSVGElement_Mutable.h index 17b1e9ac5..3587d1310 100644 --- a/Source/DOM classes/SVG-DOM/SVGSVGElement_Mutable.h +++ b/Source/DOM classes/SVG-DOM/SVGSVGElement_Mutable.h @@ -2,20 +2,20 @@ @interface SVGSVGElement () -@property (nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; -@property (nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; -@property (nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; -@property (nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; -@property (nonatomic, retain, readwrite) NSString* contentScriptType; -@property (nonatomic, retain, readwrite) NSString* contentStyleType; +@property (nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; +@property (nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; +@property (nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; +@property (nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; +@property (nonatomic, strong, readwrite) NSString* contentScriptType; +@property (nonatomic, strong, readwrite) NSString* contentStyleType; @property (nonatomic, readwrite) SVGRect viewport; @property (nonatomic, readwrite) float pixelUnitToMillimeterX; @property (nonatomic, readwrite) float pixelUnitToMillimeterY; @property (nonatomic, readwrite) float screenPixelToMillimeterX; @property (nonatomic, readwrite) float screenPixelToMillimeterY; @property (nonatomic, readwrite) BOOL useCurrentView; -@property (nonatomic, retain, readwrite) SVGViewSpec* currentView; +@property (nonatomic, strong, readwrite) SVGViewSpec* currentView; @property (nonatomic, readwrite) float currentScale; -@property (nonatomic, retain, readwrite) SVGPoint* currentTranslate; +@property (nonatomic, strong, readwrite) SVGPoint* currentTranslate; @end diff --git a/Source/DOM classes/SVG-DOM/SVGTextContentElement.h b/Source/DOM classes/SVG-DOM/SVGTextContentElement.h index 21dbd9975..6db41275f 100644 --- a/Source/DOM classes/SVG-DOM/SVGTextContentElement.h +++ b/Source/DOM classes/SVG-DOM/SVGTextContentElement.h @@ -39,7 +39,7 @@ typedef enum SVGLengthAdjust @interface SVGTextContentElement : SVGElement -@property(nonatomic,readonly) SVGLength* /* FIXMED: should be SVGAnimatedLength*/ textLength; +@property(weak, nonatomic,readonly) SVGLength* /* FIXMED: should be SVGAnimatedLength*/ textLength; /**FIXME: missing: readonly attribute SVGAnimatedEnumeration lengthAdjust;*/ /**FIXME: missing: diff --git a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.h b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.h index 9f7a33429..c7bf74c79 100644 --- a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.h +++ b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.h @@ -8,17 +8,16 @@ readonly attribute SVGAnimatedLengthList dy; readonly attribute SVGAnimatedNumberList rotate; */ -#import #import "SVGTextContentElement.h" #import "SVGLength.h" @interface SVGTextPositioningElement : SVGTextContentElement -@property(nonatomic,retain,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ x; -@property(nonatomic,retain,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ y; -@property(nonatomic,retain,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dx; -@property(nonatomic,retain,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dy; -@property(nonatomic,retain,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ rotate; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ x; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ y; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dx; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dy; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ rotate; @end diff --git a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.m b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.m index 52a75c42b..92fc32dbb 100644 --- a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.m +++ b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement.m @@ -7,14 +7,6 @@ @implementation SVGTextPositioningElement @synthesize x,y,dx,dy,rotate; -- (void)dealloc { - self.x = nil; - self.y = nil; - self.dx = nil; - self.dy = nil; - self.rotate = nil; - [super dealloc]; -} - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { diff --git a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement_Mutable.h b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement_Mutable.h index 236f1a6a7..c50a15e98 100644 --- a/Source/DOM classes/SVG-DOM/SVGTextPositioningElement_Mutable.h +++ b/Source/DOM classes/SVG-DOM/SVGTextPositioningElement_Mutable.h @@ -1,9 +1,9 @@ #import "SVGTextPositioningElement.h" @interface SVGTextPositioningElement () -@property(nonatomic,retain,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ x; -@property(nonatomic,retain,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ y; -@property(nonatomic,retain,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dx; -@property(nonatomic,retain,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dy; -@property(nonatomic,retain,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ rotate; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ x; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ y; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dx; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ dy; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ rotate; @end diff --git a/Source/DOM classes/SVG-DOM/SVGTransform.h b/Source/DOM classes/SVG-DOM/SVGTransform.h index 0a2d54e44..d279a7f27 100644 --- a/Source/DOM classes/SVG-DOM/SVGTransform.h +++ b/Source/DOM classes/SVG-DOM/SVGTransform.h @@ -41,7 +41,7 @@ typedef enum SVGKTransformType } SVGKTransformType; @property(nonatomic) SVGKTransformType type; -@property(nonatomic,retain) SVGMatrix* matrix; +@property(nonatomic,strong) SVGMatrix* matrix; @property(nonatomic,readonly) float angle; -(void) setMatrix:(SVGMatrix*) matrix; diff --git a/Source/DOM classes/SVG-DOM/SVGTransform.m b/Source/DOM classes/SVG-DOM/SVGTransform.m index 44583897f..fb361aee9 100644 --- a/Source/DOM classes/SVG-DOM/SVGTransform.m +++ b/Source/DOM classes/SVG-DOM/SVGTransform.m @@ -6,10 +6,6 @@ @implementation SVGTransform @synthesize matrix; @synthesize angle; -- (void)dealloc { - [matrix release]; - [super dealloc]; -} -(void) setMatrix:(SVGMatrix*) matrix { NSAssert( FALSE, @"Not implemented yet" ); } -(void) setTranslate:(float) tx ty:(float) ty { NSAssert( FALSE, @"Not implemented yet" ); } diff --git a/Source/DOM classes/SVG-DOM/SVGUnitTypes.h b/Source/DOM classes/SVG-DOM/SVGUnitTypes.h new file mode 100644 index 000000000..d5bb2d2ca --- /dev/null +++ b/Source/DOM classes/SVG-DOM/SVGUnitTypes.h @@ -0,0 +1,20 @@ +// +// SVGUnitTypes.h +// SVGKit-iOS +// +// Created by David Gileadi on 8/14/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#ifndef SVGKit_iOS_SVGUnitTypes_h +#define SVGKit_iOS_SVGUnitTypes_h + +typedef enum SVG_UNIT_TYPE +{ + // Unit Types + SVG_UNIT_TYPE_UNKNOWN = 0, + SVG_UNIT_TYPE_USERSPACEONUSE = 1, + SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2 +} SVG_UNIT_TYPE; + +#endif diff --git a/Source/DOM classes/SVG-DOM/SVGUseElement.h b/Source/DOM classes/SVG-DOM/SVGUseElement.h index 65e415599..fa6f352f9 100644 --- a/Source/DOM classes/SVG-DOM/SVGUseElement.h +++ b/Source/DOM classes/SVG-DOM/SVGUseElement.h @@ -28,11 +28,11 @@ @interface SVGUseElement : SVGElement < SVGTransformable /*FIXME: delete this rubbish:*/, ConverterSVGToCALayer> -@property(nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; -@property(nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; -@property(nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; -@property(nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; -@property(nonatomic, retain, readonly) SVGElementInstance* instanceRoot; -@property(nonatomic, retain, readonly) SVGElementInstance* animatedInstanceRoot; +@property(nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; +@property(nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; +@property(nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; +@property(nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; +@property(nonatomic, strong, readonly) SVGElementInstance* instanceRoot; +@property(nonatomic, strong, readonly) SVGElementInstance* animatedInstanceRoot; @end diff --git a/Source/DOM classes/SVG-DOM/SVGUseElement.m b/Source/DOM classes/SVG-DOM/SVGUseElement.m index 862cb2152..3e3fc9537 100644 --- a/Source/DOM classes/SVG-DOM/SVGUseElement.m +++ b/Source/DOM classes/SVG-DOM/SVGUseElement.m @@ -12,34 +12,10 @@ @implementation SVGUseElement @synthesize transform; // each SVGElement subclass that conforms to protocol "SVGTransformable" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols -- (void)dealloc { - [x release]; - [y release]; - [width release]; - [height release]; - [instanceRoot release]; - [animatedInstanceRoot release]; - [super dealloc]; -} -(CALayer *)newLayer { - if( [instanceRoot.correspondingElement respondsToSelector:@selector(newLayer)]) - { - CALayer* initialLayer = [((SVGElement*)instanceRoot.correspondingElement) newLayer]; - - if( CGRectIsEmpty( initialLayer.frame ) ) // Avoid Apple's UIKit getting upset by infinitely large/small areas due to floating point inaccuracy - return initialLayer; - - //For Xcode's broken debugger: CGAffineTransform i = initialLayer.affineTransform; - //For Xcode's broken debugger: CGAffineTransform mine = self.transform; - - initialLayer.affineTransform = CGAffineTransformConcat( self.transform, initialLayer.affineTransform ); - - return initialLayer; - } - else - return nil; + return [CALayer layer]; } -(void)layoutLayer:(CALayer *)layer diff --git a/Source/DOM classes/SVG-DOM/SVGUseElement_Mutable.h b/Source/DOM classes/SVG-DOM/SVGUseElement_Mutable.h index bd9ea8cb2..9b178d7b2 100644 --- a/Source/DOM classes/SVG-DOM/SVGUseElement_Mutable.h +++ b/Source/DOM classes/SVG-DOM/SVGUseElement_Mutable.h @@ -1,11 +1,11 @@ #import "SVGUseElement.h" @interface SVGUseElement () -@property(nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; -@property(nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; -@property(nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; -@property(nonatomic, retain, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; -@property(nonatomic, retain, readwrite) SVGElementInstance* instanceRoot; -@property(nonatomic, retain, readwrite) SVGElementInstance* animatedInstanceRoot; +@property(nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; +@property(nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; +@property(nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; +@property(nonatomic, strong, readwrite) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; +@property(nonatomic, strong, readwrite) SVGElementInstance* instanceRoot; +@property(nonatomic, strong, readwrite) SVGElementInstance* animatedInstanceRoot; @end diff --git a/Source/DOM classes/Unported or Partial DOM/BaseClassForAllSVGBasicShapes.m b/Source/DOM classes/Unported or Partial DOM/BaseClassForAllSVGBasicShapes.m index 23b825352..8fb8c3e4f 100644 --- a/Source/DOM classes/Unported or Partial DOM/BaseClassForAllSVGBasicShapes.m +++ b/Source/DOM classes/Unported or Partial DOM/BaseClassForAllSVGBasicShapes.m @@ -25,15 +25,10 @@ - (id)init return self; } -- (void)finalize { - CGPathRelease(_pathForShapeInRelativeCoords); - [super finalize]; -} - (void)dealloc { CGPathRelease(_pathForShapeInRelativeCoords); - [super dealloc]; } -(void)setPathForShapeInRelativeCoords:(CGPathRef)pathForShapeInRelativeCoords diff --git a/Source/DOM classes/Unported or Partial DOM/ConverterSVGToCALayer.h b/Source/DOM classes/Unported or Partial DOM/ConverterSVGToCALayer.h index a5e30d565..910eb0d3c 100644 --- a/Source/DOM classes/Unported or Partial DOM/ConverterSVGToCALayer.h +++ b/Source/DOM classes/Unported or Partial DOM/ConverterSVGToCALayer.h @@ -1,5 +1,5 @@ #import -#import +#import @protocol ConverterSVGToCALayer < NSObject > diff --git a/Source/DOM classes/Unported or Partial DOM/SVGCircleElement.m b/Source/DOM classes/Unported or Partial DOM/SVGCircleElement.m index e34108e32..855c5613e 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGCircleElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGCircleElement.m @@ -13,7 +13,7 @@ @implementation SVGCircleElement - (CGFloat)r { if (self.rx != self.ry) { - DDLogVerbose(@"Undefined radius of circle"); + SVGKitLogVerbose(@"Undefined radius of circle"); return 0.0f; } diff --git a/Source/DOM classes/Unported or Partial DOM/SVGElement.h b/Source/DOM classes/Unported or Partial DOM/SVGElement.h index ef826630c..be92fe776 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGElement.h @@ -19,8 +19,8 @@ @interface SVGElement : Element -@property (nonatomic, readwrite, retain) NSString *identifier; // 'id' is reserved in Obj-C, so we have to break SVG Spec here, slightly -@property (nonatomic, retain) NSString* xmlbase; +@property (nonatomic, readwrite, strong) NSString *identifier; // 'id' is reserved in Obj-C, so we have to break SVG Spec here, slightly +@property (nonatomic, strong) NSString* xmlbase; /*! http://www.w3.org/TR/SVG/intro.html#TermSVGDocumentFragment @@ -28,14 +28,14 @@ SVG document fragment The XML document sub-tree which starts with an ‘svg’ element. An SVG document fragment can consist of a stand-alone SVG document, or a fragment of a parent XML document enclosed by an ‘svg’ element. When an ‘svg’ element is a descendant of another ‘svg’ element, there are two SVG document fragments, one for each ‘svg’ element. (One SVG document fragment is contained within another SVG document fragment.) */ -@property (nonatomic, assign) SVGSVGElement* rootOfCurrentDocumentFragment; +@property (nonatomic, weak) SVGSVGElement* rootOfCurrentDocumentFragment; /*! The viewport is set / re-set whenever an SVG node specifies a "width" (and optionally: a "height") attribute, assuming that SVG node is one of: svg, symbol, image, foreignobject The spec isn't clear what happens if this element redefines the viewport itself, but IMHO it implies that the viewportElement becomes a reference to "self" */ -@property (nonatomic, assign) SVGElement* viewportElement; +@property (nonatomic, weak) SVGElement* viewportElement; #pragma mark - NON-STANDARD features of class (these are things that are NOT in the SVG spec, and should NOT be in SVGKit's implementation - they should be moved to a different class, although WE DO STILL NEED THESE in order to implement the spec, and to provide SVGKit features!) @@ -59,5 +59,6 @@ #pragma mark - CSS cascading special attributes. c.f. full list here: http://www.w3.org/TR/SVG/propidx.html -(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty; +-(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty inherit:(BOOL)inherit; -@end \ No newline at end of file +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGElement.m b/Source/DOM classes/Unported or Partial DOM/SVGElement.m index a72182f92..2b22c54cb 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGElement.m @@ -40,8 +40,8 @@ @implementation SVGElement @synthesize identifier = _identifier; @synthesize xmlbase; -@synthesize rootOfCurrentDocumentFragment; -@synthesize viewportElement; +@synthesize rootOfCurrentDocumentFragment = _rootOfCurrentDocumentFragment; +@synthesize viewportElement = _viewportElement; @synthesize stringValue = _stringValue; @synthesize className; /**< CSS class, from SVGStylable interface */ @@ -72,7 +72,7 @@ -(void) reCalculateAndSetViewportElementReferenceUsingFirstSVGAncestor:(SVGEleme if( isTagAllowedToBeAViewport && isTagDefiningAViewport ) { - DDLogVerbose(@"[%@] WARNING: setting self (tag = %@) to be a viewport", [self class], self.tagName ); + SVGKitLogVerbose(@"[%@] WARNING: setting self (tag = %@) to be a viewport", [self class], self.tagName ); self.viewportElement = self; } else @@ -137,32 +137,57 @@ But if there are custom nodes in there (any other DOM node, for instance), it ge currentAncestor = currentAncestor.parentNode; } - NSAssert( firstAncestorThatIsAnyKindOfSVGElement != nil, @"This node has no valid SVG tags as ancestor, but it's not an tag, so this is an impossible SVG file" ); - - - if( [firstAncestorThatIsAnyKindOfSVGElement isKindOfClass:[SVGSVGElement class]] ) - self.rootOfCurrentDocumentFragment = (SVGSVGElement*) firstAncestorThatIsAnyKindOfSVGElement; + if( newParent == nil ) + { + /** We've set the parent to nil, thereby "orphaning" this Node and the tree underneath it. + + This usually happens when you remove a Node from its parent. + + I'm not sure what the spec expects at that point - you have a valid DOM tree, but *not* a valid SVG fragment; + or maybe it is valid, for some special-case kind of SVG fragment definition? + + TODO: this may also relate to SVG nodes and instancing: if you're fixing that code, check this comment to see if you can improve it. + + For now: we simply "do nothing but set everything to nil" + */ + SVGKitLogWarn( @"SVGElement has had its parent set to nil; this makes the element and tree beneath it no-longer-valid SVG data; this may require fix-up if you try to re-add that SVGElement or any of its children back to an existing/new SVG tree"); + self.rootOfCurrentDocumentFragment = nil; + } else - self.rootOfCurrentDocumentFragment = firstAncestorThatIsAnyKindOfSVGElement.rootOfCurrentDocumentFragment; - - [self reCalculateAndSetViewportElementReferenceUsingFirstSVGAncestor:firstAncestorThatIsAnyKindOfSVGElement]; - + { + NSAssert( firstAncestorThatIsAnyKindOfSVGElement != nil, @"This node has no valid SVG tags as ancestor, but it's not an tag, so this is an impossible SVG file" ); + + + if( [firstAncestorThatIsAnyKindOfSVGElement isKindOfClass:[SVGSVGElement class]] ) + self.rootOfCurrentDocumentFragment = (SVGSVGElement*) firstAncestorThatIsAnyKindOfSVGElement; + else + self.rootOfCurrentDocumentFragment = firstAncestorThatIsAnyKindOfSVGElement.rootOfCurrentDocumentFragment; + + [self reCalculateAndSetViewportElementReferenceUsingFirstSVGAncestor:firstAncestorThatIsAnyKindOfSVGElement]; + #if DEBUG_SVG_ELEMENT_PARSING - DDLogVerbose(@"viewport Element = %@ ... for node/element = %@", self.viewportElement, self.tagName); + SVGKitLogVerbose(@"viewport Element = %@ ... for node/element = %@", self.viewportElement, self.tagName); #endif + } } } } -- (void)dealloc { - [_stringValue release]; - [_identifier release]; - [xmlbase release]; - self.className = nil; - self.style = nil; - [super dealloc]; +- (void)setRootOfCurrentDocumentFragment:(SVGSVGElement *)root { + _rootOfCurrentDocumentFragment = root; + for (Node *child in self.childNodes) + if ([child isKindOfClass:SVGElement.class]) + ((SVGElement *) child).rootOfCurrentDocumentFragment = root; +} + +- (void)setViewportElement:(SVGElement *)viewport { + _viewportElement = viewport; + for (Node *child in self.childNodes) + if ([child isKindOfClass:SVGElement.class]) + ((SVGElement *) child).viewportElement = viewport; } + - (void)loadDefaults { // to be overriden by subclasses } @@ -185,7 +210,7 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { /** CSS styles and classes */ if ( [self getAttributeNode:@"style"] ) { - self.style = [[[CSSStyleDeclaration alloc] init] autorelease]; + self.style = [[CSSStyleDeclaration alloc] init]; self.style.cssText = [self getAttribute:@"style"]; // causes all the LOCALLY EMBEDDED style info to be parsed } if( [self getAttributeNode:@"class"]) @@ -229,9 +254,6 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { value = [self getAttribute:@"gradientTransform"]; } -#if !(TARGET_OS_IPHONE) && ( !defined( __MAC_10_7 ) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6_7 ) - DDLogVerbose(@"[%@] WARNING: the transform attribute requires OS X 10.7 or above (we need Regular Expressions! Apple was slow to add them :( ). Ignoring TRANSFORMs in SVG!", [self class] ); -#else NSError* error = nil; NSRegularExpression* regexpTransformListItem = [NSRegularExpression regularExpressionWithPattern:@"[^\\(\\),]*\\([^\\)]*" options:0 error:&error]; // anything except space and brackets ... followed by anything except open bracket ... plus anything until you hit a close bracket @@ -240,21 +262,22 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { { NSString* transformString = [value substringWithRange:[result range]]; - //EXTREME DEBUG: DDLogVerbose(@"[%@] DEBUG: found a transform element (should be command + open bracket + args + close bracket) = %@", [self class], transformString); + //EXTREME DEBUG: SVGKitLogVerbose(@"[%@] DEBUG: found a transform element (should be command + open bracket + args + close bracket) = %@", [self class], transformString); NSRange loc = [transformString rangeOfString:@"("]; if( loc.length == 0 ) { - DDLogError(@"[%@] ERROR: input file is illegal, has an item in the SVG transform attribute which has no open-bracket. Item = %@, transform attribute value = %@", [self class], transformString, value ); + SVGKitLogError(@"[%@] ERROR: input file is illegal, has an item in the SVG transform attribute which has no open-bracket. Item = %@, transform attribute value = %@", [self class], transformString, value ); return; } NSString* command = [transformString substringToIndex:loc.location]; - NSArray* parameterStrings = [[transformString substringFromIndex:loc.location+1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@", "]]; + NSString* rawParametersString = [transformString substringFromIndex:loc.location+1]; + NSArray* parameterStrings = [rawParametersString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@", "]]; /** if you get ", " (comma AND space), Apple sends you an extra 0-length match - "" - between your args. We strip that here */ parameterStrings = [parameterStrings filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"length > 0"]]; - //EXTREME DEBUG: DDLogVerbose(@"[%@] DEBUG: found parameters = %@", [self class], parameterStrings); + //EXTREME DEBUG: SVGKitLogVerbose(@"[%@] DEBUG: found parameters = %@", [self class], parameterStrings); command = [command stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@" "]]; @@ -300,9 +323,10 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { { CGFloat degrees = [[parameterStrings objectAtIndex:0] floatValue]; CGFloat radians = degrees * M_PI / 180.0; - - CGAffineTransform nt = CGAffineTransformMakeRotation(radians); - selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); // Apple's method appears to be backwards, and not doing what Apple's docs state + + selfTransformable.transform = CGAffineTransformRotate(selfTransformable.transform, radians); +// CGAffineTransform nt = CGAffineTransformMakeRotation(radians); +// selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); // Apple's method appears to be backwards, and not doing what Apple's docs state } else if( [parameterStrings count] == 3) { @@ -310,33 +334,36 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { CGFloat radians = degrees * M_PI / 180.0; CGFloat centerX = [[parameterStrings objectAtIndex:1] floatValue]; CGFloat centerY = [[parameterStrings objectAtIndex:2] floatValue]; - CGAffineTransform nt = CGAffineTransformIdentity; - nt = CGAffineTransformConcat( nt, CGAffineTransformMakeTranslation(centerX, centerY) ); - nt = CGAffineTransformConcat( nt, CGAffineTransformMakeRotation(radians) ); - nt = CGAffineTransformConcat( nt, CGAffineTransformMakeTranslation(-1.0 * centerX, -1.0 * centerY) ); - selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); // Apple's method appears to be backwards, and not doing what Apple's docs state + + selfTransformable.transform = CGAffineTransformTranslate(selfTransformable.transform, centerX, centerY); + selfTransformable.transform = CGAffineTransformRotate(selfTransformable.transform, radians); + selfTransformable.transform = CGAffineTransformTranslate(selfTransformable.transform, -1.0 * centerX, -1.0 * centerY); +// CGAffineTransform nt = CGAffineTransformIdentity; +// nt = CGAffineTransformConcat( nt, CGAffineTransformMakeTranslation(centerX, centerY) ); +// nt = CGAffineTransformConcat( nt, CGAffineTransformMakeRotation(radians) ); +// nt = CGAffineTransformConcat( nt, CGAffineTransformMakeTranslation(-1.0 * centerX, -1.0 * centerY) ); +// selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); // Apple's method appears to be backwards, and not doing what Apple's docs state } else { - DDLogError(@"[%@] ERROR: input file is illegal, has an SVG matrix transform attribute without the required 1 or 3 parameters. Item = %@, transform attribute value = %@", [self class], transformString, value ); + SVGKitLogError(@"[%@] ERROR: input file is illegal, has an SVG matrix transform attribute without the required 1 or 3 parameters. Item = %@, transform attribute value = %@", [self class], transformString, value ); return; } } else if( [command isEqualToString:@"skewX"] ) { - DDLogWarn(@"[%@] ERROR: skew is unsupported: %@", [self class], command ); - - [parseResult addParseErrorRecoverable: [NSError errorWithDomain:@"SVGKit" code:15184 userInfo:[NSDictionary dictionaryWithObjectsAndKeys: - @"transform=skewX is unsupported", NSLocalizedDescriptionKey, - nil] - ]]; + CGFloat degrees = [[parameterStrings objectAtIndex:0] floatValue]; + CGFloat radians = degrees * M_PI / 180.0; + + CGAffineTransform nt = CGAffineTransformMake(1, 0, tan(radians), 1, 0, 0); + selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); } else if( [command isEqualToString:@"skewY"] ) { - DDLogWarn(@"[%@] ERROR: skew is unsupported: %@", [self class], command ); - [parseResult addParseErrorRecoverable: [NSError errorWithDomain:@"SVGKit" code:15184 userInfo:[NSDictionary dictionaryWithObjectsAndKeys: - @"transform=skewY is unsupported", NSLocalizedDescriptionKey, - nil] - ]]; + CGFloat degrees = [[parameterStrings objectAtIndex:0] floatValue]; + CGFloat radians = degrees * M_PI / 180.0; + + CGAffineTransform nt = CGAffineTransformMake(1, tan(radians), 0, 1, 0, 0); + selfTransformable.transform = CGAffineTransformConcat( nt, selfTransformable.transform ); } else { @@ -344,8 +371,7 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { } }]; - //DEBUG: DDLogVerbose(@"[%@] Set local / relative transform = (%2.2f, %2.2f // %2.2f, %2.2f) + (%2.2f, %2.2f translate)", [self class], selfTransformable.transform.a, selfTransformable.transform.b, selfTransformable.transform.c, selfTransformable.transform.d, selfTransformable.transform.tx, selfTransformable.transform.ty ); -#endif + //DEBUG: SVGKitLogVerbose(@"[%@] Set local / relative transform = (%2.2f, %2.2f // %2.2f, %2.2f) + (%2.2f, %2.2f translate)", [self class], selfTransformable.transform.a, selfTransformable.transform.b, selfTransformable.transform.c, selfTransformable.transform.d, selfTransformable.transform.tx, selfTransformable.transform.ty ); } } @@ -353,7 +379,7 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { - (NSString *)description { return [NSString stringWithFormat:@"<%@ %p | id=%@ | prefix:localName=%@:%@ | tagName=%@ | stringValue=%@ | children=%ld>", - [self class], self, _identifier, self.prefix, self.localName, self.tagName, _stringValue, self.childNodes.length]; + [self class], self, _identifier, self.prefix, self.localName, self.tagName, _stringValue, (unsigned long)self.childNodes.length]; } #pragma mark - Objective-C init methods (not in SVG Spec - the official spec has no explicit way to create nodes, which is clearly a bug in the Spec. Until they fix the spec, we have to do something or else SVG would be unusable) @@ -389,8 +415,153 @@ - (id)initWithQualifiedName:(NSString*) n inNameSpaceURI:(NSString*) nsURI attri return self; } +- (NSRange) nextSelectorGroupFromText:(NSString *) selectorText startFrom:(NSRange) previous +{ + previous.location = previous.location + previous.length; + if( previous.location < selectorText.length ) + { + if( [selectorText characterAtIndex:previous.location] == ',' ) + previous.location = previous.location + 1; + + NSCharacterSet *whitespace = [NSCharacterSet whitespaceAndNewlineCharacterSet]; + while( previous.location < selectorText.length && [whitespace characterIsMember:[selectorText characterAtIndex:previous.location]] ) + previous.location = previous.location + 1; + + if( previous.location < selectorText.length ) { + previous.length = selectorText.length - previous.location; + NSRange nextGroup = [selectorText rangeOfString:@"," options:0 range:previous]; + if( nextGroup.location == NSNotFound ) + return previous; + else + return NSMakeRange(previous.location, nextGroup.location - previous.location); + } + } + return NSMakeRange(NSNotFound, -1); +} + +- (NSRange) nextSelectorRangeFromText:(NSString *) selectorText startFrom:(NSRange) previous +{ + NSMutableCharacterSet *identifier = [NSMutableCharacterSet alphanumericCharacterSet]; + [identifier addCharactersInString:@"-_"]; + NSCharacterSet *selectorStart = [NSCharacterSet characterSetWithCharactersInString:@"#."]; + + NSInteger start = -1; + NSUInteger end = 0; + for( NSUInteger i = previous.location + previous.length; i < selectorText.length; i++ ) + { + unichar c = [selectorText characterAtIndex:i]; + if( [selectorStart characterIsMember:c] ) + { + if( start == -1 ) + start = i; + else + break; + } + else if( [identifier characterIsMember:c] ) + { + if( start == -1 ) + start = i; + end = i; + } + else if( start != -1 ) + { + break; + } + } + + if( start != -1 ) + return NSMakeRange(start, end + 1 - start); + else + return NSMakeRange(NSNotFound, -1); +} + +- (BOOL) selector:(NSString *)selector appliesTo:(SVGElement *) element specificity:(NSInteger*) specificity +{ + if( [selector characterAtIndex:0] == '.' ) + { + if( element.className != nil ) + { + NSScanner *classNameScanner = [NSScanner scannerWithString:element.className]; + NSMutableCharacterSet *whitespaceAndCommaSet = [NSMutableCharacterSet whitespaceCharacterSet]; + NSString *substring; + + [whitespaceAndCommaSet addCharactersInString:@","]; + selector = [selector substringFromIndex:1]; + __block BOOL matched = NO; + + while ([classNameScanner scanUpToCharactersFromSet:whitespaceAndCommaSet intoString:&substring]) + { + if( [substring isEqualToString:selector] ) + { + matched = YES; + break; + } + + if (!classNameScanner.isAtEnd) + classNameScanner.scanLocation = classNameScanner.scanLocation+1L; + } + if( matched ) + { + *specificity += 100; + return YES; + } + } + } + else if( [selector characterAtIndex:0] == '#' ) + { + if( element.identifier != nil && [element.identifier isEqualToString:[selector substringFromIndex:1]] ) + { + *specificity += 10000; + return YES; + } + } + else if( element.nodeName != nil && [element.nodeName isEqualToString:selector] ) + { + *specificity += 1; + return YES; + } + else if( [selector isEqualToString:@"*"] ) + { + return YES; + } + return NO; +} + +- (BOOL) styleRule:(CSSStyleRule *) styleRule appliesTo:(SVGElement *) element specificity:(NSInteger*) specificity +{ + NSRange nextGroup = [self nextSelectorGroupFromText:styleRule.selectorText startFrom:NSMakeRange(0, 0)]; + while( nextGroup.location != NSNotFound ) + { + NSRange nextRule = [self nextSelectorRangeFromText:styleRule.selectorText startFrom:NSMakeRange(nextGroup.location, 0)]; + + BOOL match = nextRule.location != NSNotFound; + while( nextRule.location != NSNotFound ) + { + if( ![self selector:[styleRule.selectorText substringWithRange:nextRule] appliesTo:element specificity:specificity] ) + { + match = NO; + break; + } + nextRule = [self nextSelectorRangeFromText:styleRule.selectorText startFrom:nextRule]; + if( nextRule.location > (nextGroup.location + nextGroup.length) ) + break; + } + + if( match ) + return YES; + + nextGroup = [self nextSelectorGroupFromText:styleRule.selectorText startFrom:nextGroup]; + } + return NO; +} + #pragma mark - CSS cascading special attributes -(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty +{ + return [self cascadedValueForStylableProperty:stylableProperty inherit:YES]; +} + +-(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty inherit:(BOOL)inherit { /** This is the core implementation of Cascading Style Sheets, inside SVG. @@ -401,72 +572,84 @@ -(NSString*) cascadedValueForStylableProperty:(NSString*) stylableProperty http://www.w3.org/TR/SVG/propidx.html - For each of those, the implementaiton is the same. + For each of those, the implementation is the same. - ********* WAWRNING: THE CURRENT IMPLEMENTATION BELOW IS VEYR MUCH INCOMPLETE, BUT IT WORKS FOR VERY SIMPLE SVG'S ************ + ********* WAWRNING: THE CURRENT IMPLEMENTATION BELOW IS VERY MUCH INCOMPLETE, BUT IT WORKS FOR VERY SIMPLE SVG'S ************ */ - if( [self hasAttribute:stylableProperty]) - return [self getAttribute:stylableProperty]; - else - { - NSString* localStyleValue = [self.style getPropertyValue:stylableProperty]; - - if( localStyleValue != nil ) - return localStyleValue; - else - { - if( self.className != nil ) - { - /** we have a locally declared CSS class; let's go hunt for it in the document's stylesheets */ - - @autoreleasepool /** DOM / CSS is insanely verbose, so this is likely to generate a lot of crud objects */ - { - for( StyleSheet* genericSheet in self.rootOfCurrentDocumentFragment.styleSheets.internalArray ) // because it's far too much effort to use CSS's low-quality iteration here... - { - if( [genericSheet isKindOfClass:[CSSStyleSheet class]]) - { - CSSStyleSheet* cssSheet = (CSSStyleSheet*) genericSheet; - - for( CSSRule* genericRule in cssSheet.cssRules.internalArray) - { - if( [genericRule isKindOfClass:[CSSStyleRule class]]) - { - CSSStyleRule* styleRule = (CSSStyleRule*) genericRule; - - if( [styleRule.selectorText isEqualToString:self.className] ) - { - return [styleRule.style getPropertyValue:stylableProperty]; - } - } - } - } - } - } - } - - /** either there's no class *OR* it found no match for the class in the stylesheets */ - - /** Finally: move up the tree until you find a node, and ask it to provide the value - OR: if you find an tag before you find a tag, give up - */ - - Node* parentElement = self.parentNode; - while( parentElement != nil - && ! [parentElement isKindOfClass:[SVGGElement class]] - && ! [parentElement isKindOfClass:[SVGSVGElement class]]) - { - parentElement = parentElement.parentNode; - } - - if( parentElement == nil - || [parentElement isKindOfClass:[SVGSVGElement class]] ) - return nil; // give up! - else - { - return [((SVGElement*)parentElement) cascadedValueForStylableProperty:stylableProperty]; - } - } - } + NSString* localStyleValue = [self.style getPropertyValue:stylableProperty]; + + if( localStyleValue != nil ) + return localStyleValue; + + /** we have a locally declared CSS class; let's go hunt for it in the document's stylesheets */ + + @autoreleasepool /** DOM / CSS is insanely verbose, so this is likely to generate a lot of crud objects */ + { + CSSStyleRule *mostSpecificRule = nil; + NSInteger mostSpecificity = -1; + + for( StyleSheet* genericSheet in self.rootOfCurrentDocumentFragment.styleSheets.internalArray.reverseObjectEnumerator ) // because it's far too much effort to use CSS's low-quality iteration here... + { + if( [genericSheet isKindOfClass:[CSSStyleSheet class]]) + { + CSSStyleSheet* cssSheet = (CSSStyleSheet*) genericSheet; + + for( CSSRule* genericRule in cssSheet.cssRules.internalArray.reverseObjectEnumerator) + { + if( [genericRule isKindOfClass:[CSSStyleRule class]]) + { + CSSStyleRule* styleRule = (CSSStyleRule*) genericRule; + + if( [styleRule.style getPropertyCSSValue:stylableProperty] != nil ) + { + NSInteger ruleSpecificity = 0; + if( [self styleRule:styleRule appliesTo:self specificity:&ruleSpecificity] ) + { + if( ruleSpecificity > mostSpecificity ) { + mostSpecificity = ruleSpecificity; + mostSpecificRule = styleRule; + } + } + } + } + } + } + } + + if( mostSpecificRule != nil ) + return [mostSpecificRule.style getPropertyValue:stylableProperty]; + } + + /** if there's a local property, use that */ + if( [self hasAttribute:stylableProperty]) + return [self getAttribute:stylableProperty]; + + if( inherit ) + { + /** Finally: move up the tree until you find a or node, and ask it to provide the value + */ + + Node* parentElement = self.parentNode; + while( parentElement != nil + && ! [parentElement isKindOfClass:[SVGGElement class]] + && ! [parentElement isKindOfClass:[SVGSVGElement class]]) + { + parentElement = parentElement.parentNode; + } + + if( parentElement == nil ) + { + return nil; // give up! + } + else + { + return [((SVGElement*)parentElement) cascadedValueForStylableProperty:stylableProperty]; + } + } + else + { + return nil; + } } @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.h b/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.h index 5f1a8d8df..1e3f33acb 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.h @@ -6,6 +6,7 @@ // #import "BaseClassForAllSVGBasicShapes.h" +#import "BaseClassForAllSVGBasicShapes_ForSubclasses.h" @interface SVGEllipseElement : BaseClassForAllSVGBasicShapes { } diff --git a/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.m b/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.m index 9636aa05e..e326cb94d 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGEllipseElement.m @@ -28,31 +28,38 @@ @implementation SVGEllipseElement - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { [super postProcessAttributesAddingErrorsTo:parseResult]; - if( [[self getAttribute:@"cx"] length] > 0 ) - self.cx = [[self getAttribute:@"cx"] floatValue]; + SVGRect r = parseResult.rootOfSVGTree.viewport; + if( [[self getAttribute:@"cx"] length] > 0 ) + { + self.cx = [[SVGLength svgLengthFromNSString:[self getAttribute:@"cx"] ] + pixelsValueWithDimension:r.width]; + } if( [[self getAttribute:@"cy"] length] > 0 ) - self.cy = [[self getAttribute:@"cy"] floatValue]; - + { + self.cy = [[SVGLength svgLengthFromNSString:[self getAttribute:@"cy"] ] + pixelsValueWithDimension:r.height]; + } if( [[self getAttribute:@"rx"] length] > 0 ) - self.rx = [[self getAttribute:@"rx"] floatValue]; - + { + self.rx = [[SVGLength svgLengthFromNSString:[self getAttribute:@"rx"] ] + pixelsValueWithDimension:r.width]; + } if( [[self getAttribute:@"ry"] length] > 0 ) - self.ry = [[self getAttribute:@"ry"] floatValue]; - + { + self.ry = [[SVGLength svgLengthFromNSString:[self getAttribute:@"ry"] ] + pixelsValueWithDimension:r.height]; + } if( [[self getAttribute:@"r"] length] > 0 ) { // circle - self.ry = self.rx = [[self getAttribute:@"r"] floatValue]; + + self.ry = self.rx = [[SVGLength svgLengthFromNSString:[self getAttribute:@"r"] ] + pixelsValueWithDimension:hypot(r.width, r.height)/M_SQRT2]; } -} - --(CALayer *)newLayer -{ - CGMutablePathRef path = CGPathCreateMutable(); - CGPathAddEllipseInRect(path, NULL, CGRectMake(_cx - _rx, _cy - _ry, _rx * 2, _ry * 2)); - - CALayer* result = [SVGHelperUtilities newCALayerForPathBasedSVGElement:self withPath:path]; - CGPathRelease(path); - return result; + + CGMutablePathRef path = CGPathCreateMutable(); + CGPathAddEllipseInRect(path, NULL, CGRectMake(self.cx - self.rx, self.cy - self.ry, self.rx * 2, self.ry * 2)); + self.pathForShapeInRelativeCoords = path; + CGPathRelease(path); } @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.h b/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.h index 5cfd12108..818173565 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.h @@ -22,29 +22,36 @@ */ #import "SVGElement.h" - #import "SVGRect.h" #import "SVGGradientStop.h" #import "SVGTransformable.h" -#import "SVGGradientLayer.h" +#import "SVGPreserveAspectRatio.h" +#import "SVGUnitTypes.h" + +typedef NS_ENUM(NSUInteger, SVGSpreadMethod) { + SVGSpreadMethodUnkown = 0, + SVGSpreadMethodPad = 1, + SVGSpreadMethodReflect = 2, + SVGSpreadMethodRepeat = 3 +}; +@class SVGGradientLayer; @interface SVGGradientElement : SVGElement /* NB: does NOT implemente "SVGLayeredElement" because spec says that these specifically NEVER appear in the output */ -{ - @public - BOOL radial; /* FIXME: not in SVG Spec */ - - @protected - NSMutableArray *_stops; /* FIXME: not in SVG Spec */ - - @private - NSArray *colors, *locations; /* FIXME: not in SVG Spec */ -} - -@property (readonly, retain)NSArray *stops; /* FIXME: not in SVG Spec */ --(void)addStop:(SVGGradientStop *)gradientStop; /* FIXME: not in SVG Spec */ +@property (readonly, strong) NSArray *stops; /* FIXME: not in SVG Spec */ +@property (readonly, strong) NSArray *locations; /* FIXME: not in SVG Spec */ +@property (readonly, strong) NSArray *colors; /* FIXME: not in SVG Spec */ +@property (readonly, assign) SVG_UNIT_TYPE gradientUnits; +@property (readonly, assign) SVGSpreadMethod spreadMethod; /* FIXME: currently only support `pad`. other methods are not supported */ + + +-(void)addStop:(SVGGradientStop *)gradientStop; /* FIXME: not in SVG Spec */ --(SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect) objectRect viewportRect:(SVGRect) viewportRect; +-(NSString*) getAttributeInheritedIfNil:(NSString*)attrName; +-(SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect)objectRect + viewportRect:(SVGRect)viewportRect + transform:(CGAffineTransform)transform; +- (void)synthesizeProperties; // resolve any xlink:hrefs to other gradients @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.m b/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.m index 9050935cb..481ee4f36 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGGradientElement.m @@ -2,20 +2,108 @@ #import "SVGGradientElement.h" #import "SVGGradientStop.h" -#import "SVGElement_ForParser.h" - #import "SVGGElement.h" +#import "SVGLinearGradientElement.h" +#import "SVGRadialGradientElement.h" @implementation SVGGradientElement @synthesize stops = _stops; @synthesize transform; +@synthesize locations = _locations; +@synthesize colors = _colors; +@synthesize gradientUnits = _gradientUnits; +@synthesize spreadMethod = _spreadMethod; -(void)addStop:(SVGGradientStop *)gradientStop { if( _stops == nil ) - _stops = [[NSMutableArray alloc] initWithCapacity:1]; - [_stops addObject:gradientStop]; + { + _stops = [NSArray arrayWithObject:gradientStop]; + } + else + { + _stops = [_stops arrayByAddingObjectsFromArray:[NSArray arrayWithObject:gradientStop]]; + } +} + +- (NSArray *)colors { + if(_colors == nil ) //these can't be determined until parsing is complete, need to update SVGGradientParser and do this on end element + { + NSUInteger numStops = [self.stops count]; + if (numStops == 0) { + return nil; + } + NSMutableArray *colorBuilder = [[NSMutableArray alloc] initWithCapacity:numStops]; + for (SVGGradientStop *theStop in self.stops) + { + [colorBuilder addObject:(__bridge id)CGColorWithSVGColor([theStop stopColor])]; + } + + _colors = [[NSArray alloc] initWithArray:colorBuilder]; + } + return _colors; +} + +- (NSArray *)locations { + if(_locations == nil ) //these can't be determined until parsing is complete, need to update SVGGradientParser and do this on end element + { + NSUInteger numStops = [self.stops count]; + if (numStops == 0) { + return nil; + } + NSMutableArray *locationBuilder = [[NSMutableArray alloc] initWithCapacity:numStops]; + CGFloat previousOffset = 0; + for (int i = 0; i < self.stops.count; i++) { + SVGGradientStop *theStop = self.stops[i]; + // SVG spec: Gradient offset values less than 0 (or less than 0%) are rounded up to 0%. Gradient offset values greater than 1 (or greater than 100%) are rounded down to 100%. + CGFloat offset = MIN(MAX(0.0, theStop.offset), 1.0); + // SVG spec: Each gradient offset value is required to be equal to or greater than the previous gradient stop's offset value. If a given gradient stop's offset value is not equal to or greater than all previous offset values, then the offset value is adjusted to be equal to the largest of all previous offset values. + if (offset < previousOffset) { + offset = previousOffset; + } + // SVG spec: If two gradient stops have the same offset value, then the latter gradient stop controls the color value at the overlap point. + if (offset == previousOffset) { + if (offset != 0) { + CGFloat adjustedOffset = previousOffset - 0.0000000001; + [locationBuilder replaceObjectAtIndex:(i - 1) withObject:@(adjustedOffset)]; + } + } + previousOffset = offset; + [locationBuilder addObject:[NSNumber numberWithFloat:offset]]; + } + + _locations = [[NSArray alloc] initWithArray:locationBuilder]; + } + return _locations; +} + +- (SVG_UNIT_TYPE)gradientUnits { + NSString* gradientUnits = [self getAttributeInheritedIfNil:@"gradientUnits"]; + if( ![gradientUnits length] + || [gradientUnits isEqualToString:@"objectBoundingBox"]) { + return SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; + } else if ([gradientUnits isEqualToString:@"userSpaceOnUse"]) { + return SVG_UNIT_TYPE_USERSPACEONUSE; + } else { + SVGKitLogWarn(@"Unsupported gradientUnits: %@", gradientUnits); + return SVG_UNIT_TYPE_UNKNOWN; + } +} + +- (SVGSpreadMethod)spreadMethod { + NSString* spreadMethod = [self getAttributeInheritedIfNil:@"spreadMethod"]; + if( ![spreadMethod length] + || [spreadMethod isEqualToString:@"pad"]) { + return SVGSpreadMethodPad; + } else if ([spreadMethod isEqualToString:@"reflect"]) { + return SVGSpreadMethodReflect; + } else if ([spreadMethod isEqualToString:@"repeat"]) { + return SVGSpreadMethodRepeat; + } else { + SVGKitLogWarn(@"Unsupported spreadMethod: %@", spreadMethod); + return SVGSpreadMethodUnkown; + } } -(void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult @@ -31,164 +119,13 @@ -(NSString*) getAttributeInheritedIfNil:(NSString*) attrName return [self getAttribute:attrName]; // will return blank if there was no value AND no parent value } --(CGPoint) normalizeGradientCoordinate:(SVGLength*) x y:(SVGLength*) y rectToFill:(CGRect) rectToFill -{ - CGFloat xNormalized, yNormalized; - - if( x.value == 0 ) - xNormalized = 0; - else - switch( x.unitType ) // SVG needs gradients measured in percent... - { - case SVG_LENGTHTYPE_PERCENTAGE: - { - xNormalized = [x numberValue]; // will convert the percent into [0,1] - }break; - - case SVG_LENGTHTYPE_NUMBER: - case SVG_LENGTHTYPE_PX: - { - xNormalized = (([x pixelsValue] - rectToFill.origin.x) / rectToFill.size.width); - } break; - - default: - { - NSAssert( FALSE, @"Unsupported input units in the SVGLength variable passed in for 'x': %i", x.unitType ); - xNormalized = 0; - } - } - - if( y.value == 0 ) - yNormalized = 0; - else - switch( y.unitType ) // SVG needs gradients measured in percent... - { - case SVG_LENGTHTYPE_PERCENTAGE: - { - yNormalized = [y numberValue]; // will convert the percent into [0,1] - }break; - - case SVG_LENGTHTYPE_NUMBER: - case SVG_LENGTHTYPE_PX: - { - yNormalized = (([y pixelsValue] - rectToFill.origin.y) / rectToFill.size.height); - }break; - - default: - { - NSAssert( FALSE, @"Unsupported input units in the SVGLength variable passed in for 'y': %i", y.unitType ); - yNormalized = 0; - } - } - - return CGPointMake( xNormalized, yNormalized ); +- (SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect)objectRect viewportRect:(SVGRect)viewportRect transform:(CGAffineTransform)transform { + return nil; } --(SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect) objectRect viewportRect:(SVGRect)viewportRect +- (void)synthesizeProperties { - SVGGradientLayer *gradientLayer = [[SVGGradientLayer alloc] init]; - - CGRect rectForRelativeUnits; - NSString* gradientUnits = [self getAttributeInheritedIfNil:@"gradientUnits"]; - if( gradientUnits == nil - || [gradientUnits isEqualToString:@"objectBoundingBox"]) - rectForRelativeUnits = objectRect; - else - rectForRelativeUnits = CGRectFromSVGRect( viewportRect ); - - gradientLayer.frame = rectForRelativeUnits; - - if ([self.tagName isEqualToString:@"radialGradient"]) { - SVGLength* svgX1 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"cx"]]; - SVGLength* svgY1 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"cy"]]; - CGPoint startPoint = CGPointMake(svgX1.value, svgY1.value); - startPoint = CGPointApplyAffineTransform(startPoint, self.transform); - gradientLayer.transform = CGAffineTransformMake(self.transform.a, self.transform.b, self.transform.c, self.transform.d, 0, 0); - - SVGLength* svgX2 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"r"]]; - SVGLength* svgY2 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"r"]]; - - CGPoint endPoint = [self normalizeGradientCoordinate:svgX2 y:svgY2 rectToFill:rectForRelativeUnits]; - -#ifdef SVG_DEBUG_GRADIENTS - DDLogVerbose(@"Gradient start point %@ end point %@", NSStringFromCGPoint(startPoint), NSStringFromCGPoint(endPoint)); - - DDLogVerbose(@"SVGGradientElement gradientUnits == %@", gradientUnits); -#endif - - // return gradientLayer; - gradientLayer.startPoint = startPoint; - gradientLayer.endPoint = endPoint; - gradientLayer.type = kExt_CAGradientLayerRadial; - } else { - SVGLength* svgX1 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"x1"]]; - SVGLength* svgY1 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"y1"]]; - CGPoint startPoint = CGPointMake(svgX1.value, svgY1.value); - startPoint = CGPointApplyAffineTransform(startPoint, self.transform); - startPoint = [self normalizeGradientCoordinate:[SVGLength svgLengthFromNSString:[NSString stringWithFormat:@"%f",startPoint.x]] y:[SVGLength svgLengthFromNSString:[NSString stringWithFormat:@"%f",startPoint.y]] rectToFill:rectForRelativeUnits]; - - SVGLength* svgX2 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"x2"]]; - SVGLength* svgY2 = [SVGLength svgLengthFromNSString:[self getAttributeInheritedIfNil:@"y2"]]; - - CGPoint endPoint = CGPointMake(svgX2.value, svgY2.value); - endPoint = CGPointApplyAffineTransform(endPoint, self.transform); - endPoint = [self normalizeGradientCoordinate:[SVGLength svgLengthFromNSString:[NSString stringWithFormat:@"%f",endPoint.x]] y:[SVGLength svgLengthFromNSString:[NSString stringWithFormat:@"%f",endPoint.y]] rectToFill:rectForRelativeUnits]; - -#ifdef SVG_DEBUG_GRADIENTS - NSLog(@"Gradient start point %@ end point %@", NSStringFromCGPoint(startPoint), NSStringFromCGPoint(endPoint)); - - NSLog(@"SVGGradientElement gradientUnits == %@", gradientUnits); -#endif - - // return gradientLayer; - gradientLayer.startPoint = startPoint; - gradientLayer.endPoint = endPoint; - gradientLayer.type = kCAGradientLayerAxial; - } - if( colors == nil ) //these can't be determined until parsing is complete, need to update SVGGradientParser and do this on end element - { -// CGColorRef theColor = NULL;//, alphaColor = NULL; - NSUInteger numStops = [_stops count]; - NSMutableArray *colorBuilder = [[NSMutableArray alloc] initWithCapacity:numStops]; - NSMutableArray *locationBuilder = [[NSMutableArray alloc] initWithCapacity:numStops]; - for (SVGGradientStop *theStop in _stops) - { - [locationBuilder addObject:[NSNumber numberWithFloat:theStop.offset]]; -// theColor = CGColorWithSVGColor([theStop stopColor]); - // alphaColor = CGColorCreateCopyWithAlpha(theColor, [theStop stopOpacity]); - [colorBuilder addObject:(id)CGColorWithSVGColor([theStop stopColor])]; - // CGColorRelease(alphaColor); - } - - colors = [[NSArray alloc] initWithArray:colorBuilder]; - [colorBuilder release]; - - locations = [[NSArray alloc] initWithArray:locationBuilder]; - [locationBuilder release]; - - [_stops release]; - _stops = nil; - } - -// DDLogVerbose(@"Setting gradient shiz"); - [gradientLayer setColors:colors]; - [gradientLayer setLocations:locations]; - - DDLogVerbose(@"[%@] set gradient layer start = %@", [self class], NSStringFromCGPoint(gradientLayer.startPoint)); - DDLogVerbose(@"[%@] set gradient layer end = %@", [self class], NSStringFromCGPoint(gradientLayer.endPoint)); - DDLogVerbose(@"[%@] set gradient layer colors = %@", [self class], colors); - DDLogVerbose(@"[%@] set gradient layer locations = %@", [self class], locations); -// gradientLayer.colors = colors; -// gradientLayer.locations = locations; - -// for( id colorRef in colors ) -// CGColorRelease((CGColorRef)colorRef); - - -// gradientLayer.type = kCAGradientLayerAxial; - - return gradientLayer; } -(void)layoutLayer:(CALayer *)layer @@ -196,15 +133,5 @@ -(void)layoutLayer:(CALayer *)layer } --(void)dealloc -{ - [_stops release]; - _stops = nil; - - [colors release]; - [locations release]; - - [super dealloc]; -} @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGGradientStop.m b/Source/DOM classes/Unported or Partial DOM/SVGGradientStop.m index 034fb3ceb..4bde7ce68 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGGradientStop.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGGradientStop.m @@ -35,27 +35,14 @@ -(void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult if( [self getAttribute:@"offset"].length > 0 ) _offset = [[SVGLength svgLengthFromNSString:[self getAttribute:@"offset"]] numberValue]; - /** First, process the style - if it has one! */ - if( [self getAttribute:@"style"].length > 0 ) - { - NSDictionary *styleDict = [SVGKParser NSDictionaryFromCSSAttributes:[self getAttributeNode:@"style"]]; - - Attr* testObject = [styleDict objectForKey:@"stop-color"]; - if( testObject != nil ) - _stopColor = SVGColorFromString([testObject.value UTF8String]); - - testObject = [styleDict objectForKey:@"stop-opacity"]; - if( testObject != nil ) - _stopOpacity = [testObject.value floatValue]; - _stopColor.a = (_stopOpacity * 255); - } - /** Second, over-ride the style with any locally-specified values */ - if( [self getAttribute:@"stop-color"].length > 0 ) - _stopColor = SVGColorFromString( [[self getAttribute:@"stop-color"] UTF8String] ); + NSString *stopColor = [self cascadedValueForStylableProperty:@"stop-color" inherit:NO]; + if( stopColor.length > 0 ) + _stopColor = SVGColorFromString( [stopColor UTF8String] ); - if( [self getAttribute:@"stop-opacity"].length > 0 ) - _stopOpacity = [[self getAttribute:@"stop-opacity"] floatValue]; + NSString *stopOpacity = [self cascadedValueForStylableProperty:@"stop-opacity" inherit:NO]; + if( stopOpacity.length > 0 ) + _stopOpacity = [stopOpacity floatValue]; _stopColor.a = (_stopOpacity * 255); } diff --git a/Source/DOM classes/Unported or Partial DOM/SVGGroupElement.m b/Source/DOM classes/Unported or Partial DOM/SVGGroupElement.m index ff4e36a32..739a38a5b 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGGroupElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGGroupElement.m @@ -19,10 +19,6 @@ @implementation SVGGroupElement @synthesize opacity = _opacity; -- (void)dealloc { - - [super dealloc]; -} - (void)loadDefaults { _opacity = 1.0f; @@ -38,7 +34,7 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { - (CALayer *) newLayer { - CALayer* _layer = [[CALayerWithChildHitTest layer] retain]; + CALayer* _layer = [CALayerWithChildHitTest layer]; _layer.name = self.identifier; [_layer setValue:self.identifier forKey:kSVGElementIdentifier]; diff --git a/Source/DOM classes/Unported or Partial DOM/SVGImageElement.h b/Source/DOM classes/Unported or Partial DOM/SVGImageElement.h index f55ea4ca0..f670a6dfa 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGImageElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGImageElement.h @@ -13,6 +13,6 @@ @property (nonatomic, readonly) CGFloat width; @property (nonatomic, readonly) CGFloat height; -@property (nonatomic, retain, readonly) NSString *href; +@property (nonatomic, strong, readonly) NSString *href; @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGImageElement.m b/Source/DOM classes/Unported or Partial DOM/SVGImageElement.m index f7146857c..e929967ab 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGImageElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGImageElement.m @@ -1,40 +1,33 @@ #import "SVGImageElement.h" +#import "CALayerWithClipRender.h" #import "SVGHelperUtilities.h" +#import "NSData+NSInputStream.h" -#if TARGET_OS_IPHONE +#import "SVGKImage.h" +#import "SVGKSourceURL.h" +#import "SVGKSourceNSData.h" +#import "SVGKInlineResource.h" -#import - -#else -#endif - -#if TARGET_OS_IPHONE -#define SVGImage UIImage -#else -#define SVGImage CIImage -#endif - -#define SVGImageRef SVGImage* - -CGImageRef SVGImageCGImage(SVGImageRef img) +CGImageRef SVGImageCGImage(UIImage *img) { -#if TARGET_OS_IPHONE +#if SVGKIT_UIKIT return img.CGImage; #else - NSBitmapImageRep* rep = [[[NSBitmapImageRep alloc] initWithCIImage:img] autorelease]; - return rep.CGImage; + CGImageRef cgImage = [img CGImageForProposedRect:NULL context:nil hints:nil]; + return cgImage; #endif } @interface SVGImageElement() -@property (nonatomic, retain, readwrite) NSString *href; +@property (nonatomic, strong, readwrite) NSString *href; @end @implementation SVGImageElement @synthesize transform; // each SVGElement subclass that conforms to protocol "SVGTransformable" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols @synthesize viewBox; // each SVGElement subclass that conforms to protocol "SVGFitToViewBox" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols +@synthesize preserveAspectRatio; // each SVGElement subclass that conforms to protocol "SVGFitToViewBox" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols @synthesize x = _x; @synthesize y = _y; @@ -43,11 +36,6 @@ @implementation SVGImageElement @synthesize href = _href; -- (void)dealloc { - [_href release], _href = nil; - - [super dealloc]; -} - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { [super postProcessAttributesAddingErrorsTo:parseResult]; @@ -65,25 +53,129 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { _height = [[self getAttribute:@"height"] floatValue]; if( [[self getAttribute:@"href"] length] > 0 ) - self.href = [self getAttribute:@"href"]; + self.href = [self getAttribute:@"href"]; + + [SVGHelperUtilities parsePreserveAspectRatioFor:self]; } - (CALayer *) newLayer { - CALayer* newLayer = [[CALayer alloc] init]; + CALayer* newLayer = [CALayerWithClipRender layer]; [SVGHelperUtilities configureCALayer:newLayer usingElement:self]; - /** transform our LOCAL path into ABSOLUTE space */ - CGRect frame = CGRectMake(_x, _y, _width, _height); - frame = CGRectApplyAffineTransform(frame, [SVGHelperUtilities transformAbsoluteIncludingViewportForTransformableOrViewportEstablishingElement:self]); - newLayer.frame = frame; + NSData *imageData; + NSURL* imageURL = [NSURL URLWithString:_href]; + SVGKSource* effectiveSource = nil; + if ([_href hasPrefix:@"http:"] || [_href hasPrefix:@"https:"] ) + imageData = [NSData dataWithContentsOfURL:imageURL]; + else + if( [_href hasPrefix:@"data:"]) + { + self.href = [_href stringByReplacingOccurrencesOfString:@"\\s+" + withString:@"" + options:NSRegularExpressionSearch + range:NSMakeRange(0, [_href length]) ]; + + imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:_href]]; + } + else + { + effectiveSource = [self.rootOfCurrentDocumentFragment.source sourceFromRelativePath:_href]; + NSInputStream *stream = effectiveSource.stream; + if (stream) { + [stream open]; // if we do this, we CANNOT parse from this source again in future + NSError *error = nil; + imageData = [NSData dataWithContentsOfStream:stream initialCapacity:NSUIntegerMax error:&error]; + if( error ) + SVGKitLogError(@"[%@] ERROR: unable to read stream from %@ into NSData: %@", [self class], _href, error); + } else { + SVGKitLogError(@"[%@] ERROR: unable to load the source from URL: %@", [self class], _href); + } + } - NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:_href]]; - SVGImageRef image = [SVGImage imageWithData:imageData]; + /** Now we have some raw bytes, try to load using Apple's image loaders + (will fail if the image is an SVG file) + */ + UIImage *image = [[UIImage alloc] initWithData:imageData]; - newLayer.contents = (id)SVGImageCGImage(image); + if( image == nil ) // NSData doesn't contain an imageformat Apple supports; might be an SVG instead + { + SVGKImage *svg = nil; + + if( effectiveSource == nil ) + effectiveSource = [SVGKSourceURL sourceFromURL:imageURL]; + + if( effectiveSource != nil ) + { + SVGKitLogInfo(@"Attempting to interpret the image at URL as an embedded SVG link (Apple failed to parse it): %@", _href ); + if( imageData != nil ) + { + /** NB: sources can only be used once; we've already opened the stream for the source + earlier, so we MUST pass-in the already-downloaded NSData + + (if not, we'd be downloading it twice anyway, which can be lethal with large + SVG files!) + */ + svg = [SVGKImage imageWithSource: [SVGKSourceNSData sourceFromData:imageData URLForRelativeLinks:imageURL]]; + } + else + { + svg = [SVGKImage imageWithSource: effectiveSource]; + } + + if( svg != nil ) + { + image = svg.UIImage; + } + } + + // If still fail, use the broken image placeholder + if (!image) { + image = SVGKGetBrokenImageRepresentation(); + } + } + + if( image != nil ) + { + CGRect frame = CGRectMake(_x, _y, _width, _height); + + if( imageData ) + self.viewBox = SVGRectMake(0, 0, image.size.width, image.size.height); + else + self.viewBox = SVGRectMake(0, 0, _width, _height); + + CGImageRef imageRef = SVGImageCGImage(image); + BOOL imageRefHasBeenRetained = false; // only one codepath CREATES a new image, because of Apple's API; the rest use an existing reference + // apply preserveAspectRatio + if( self.preserveAspectRatio.baseVal.align != SVG_PRESERVEASPECTRATIO_NONE + && ABS( self.aspectRatioFromWidthPerHeight - self.aspectRatioFromViewBox) > 0.00001 ) + { + double ratioOfRatios = self.aspectRatioFromWidthPerHeight / self.aspectRatioFromViewBox; + if( self.preserveAspectRatio.baseVal.meetOrSlice == SVG_MEETORSLICE_MEET ) + { + // shrink the image to fit in the frame, preserving the aspect ratio + frame = [self clipFrame:frame fromRatio:ratioOfRatios]; + } + else if( self.preserveAspectRatio.baseVal.meetOrSlice == SVG_MEETORSLICE_SLICE ) + { + // crop the image + CGRect cropRect = CGRectMake(0, 0, image.size.width, image.size.height); + cropRect = [self clipFrame:cropRect fromRatio:1.0 / ratioOfRatios]; + imageRef = CGImageCreateWithImageInRect(imageRef, cropRect); + imageRefHasBeenRetained = true; + } + } + + /** transform our LOCAL path into ABSOLUTE space */ + frame = CGRectApplyAffineTransform(frame, [SVGHelperUtilities transformAbsoluteIncludingViewportForTransformableOrViewportEstablishingElement:self]); + newLayer.frame = frame; + + newLayer.contents = (__bridge id)imageRef; + if( imageRefHasBeenRetained ) + CGImageRelease( imageRef ); + } #if OLD_CODE __block CALayer *layer = [[CALayer layer] retain]; @@ -114,8 +206,71 @@ - (CALayer *) newLayer return newLayer; } +- (CGRect)clipFrame:(CGRect)frame fromRatio:(double)ratioOfRatios +{ + if( ratioOfRatios > 1 ) // if we're going to have space to either side + { + CGFloat width = frame.size.width; + frame.size.width = frame.size.width / ratioOfRatios; + switch( self.preserveAspectRatio.baseVal.align ) + { + case SVG_PRESERVEASPECTRATIO_XMIDYMIN: + case SVG_PRESERVEASPECTRATIO_XMIDYMID: + case SVG_PRESERVEASPECTRATIO_XMIDYMAX: + { + frame.origin.x = frame.origin.x + ((width - frame.size.width) / 2); + }break; + + case SVG_PRESERVEASPECTRATIO_XMAXYMIN: + case SVG_PRESERVEASPECTRATIO_XMAXYMID: + case SVG_PRESERVEASPECTRATIO_XMAXYMAX: + { + frame.origin.x = frame.origin.x + width - frame.size.width; + }break; + + default: + break; + } + } + else // if we're going to have space above and below + { + CGFloat height = frame.size.height; + frame.size.height = frame.size.height * ratioOfRatios; + switch( self.preserveAspectRatio.baseVal.align ) + { + case SVG_PRESERVEASPECTRATIO_XMINYMID: + case SVG_PRESERVEASPECTRATIO_XMIDYMID: + case SVG_PRESERVEASPECTRATIO_XMAXYMID: + { + frame.origin.y = frame.origin.y + ((height - frame.size.height) / 2); + }break; + + case SVG_PRESERVEASPECTRATIO_XMINYMAX: + case SVG_PRESERVEASPECTRATIO_XMIDYMAX: + case SVG_PRESERVEASPECTRATIO_XMAXYMAX: + { + frame.origin.y = frame.origin.y + height - frame.size.height; + }break; + + default: + break; + } + } + return frame; +} + - (void)layoutLayer:(CALayer *)layer { } +-(double)aspectRatioFromWidthPerHeight +{ + return self.height == 0 ? 0 : self.width / self.height; +} + +-(double)aspectRatioFromViewBox +{ + return self.viewBox.height == 0 ? 0 : self.viewBox.width / self.viewBox.height; +} + @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGLineElement.m b/Source/DOM classes/Unported or Partial DOM/SVGLineElement.m index 2a10cb9ce..c6e72d70a 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGLineElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGLineElement.m @@ -21,17 +21,28 @@ @implementation SVGLineElement - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { [super postProcessAttributesAddingErrorsTo:parseResult]; + SVGRect r = parseResult.rootOfSVGTree.viewport; + if( [[self getAttribute:@"x1"] length] > 0 ) - _x1 = [[self getAttribute:@"x1"] floatValue]; - + { + _x1 = [[SVGLength svgLengthFromNSString:[self getAttribute:@"x1"] ] + pixelsValueWithDimension:r.width]; + } if( [[self getAttribute:@"y1"] length] > 0 ) - _y1 = [[self getAttribute:@"y1"] floatValue]; - + { + _y1 = [[SVGLength svgLengthFromNSString:[self getAttribute:@"y1"] ] + pixelsValueWithDimension:r.height]; + } if( [[self getAttribute:@"x2"] length] > 0 ) - _x2 = [[self getAttribute:@"x2"] floatValue]; - + { + _x2 = [[SVGLength svgLengthFromNSString:[self getAttribute:@"x2"] ] + pixelsValueWithDimension:r.width]; + } if( [[self getAttribute:@"y2"] length] > 0 ) - _y2 = [[self getAttribute:@"y2"] floatValue]; + { + _y2 = [[SVGLength svgLengthFromNSString:[self getAttribute:@"y2"] ] + pixelsValueWithDimension:r.height]; + } } -(CALayer *)newLayer @@ -41,6 +52,7 @@ -(CALayer *)newLayer CGPathAddLineToPoint(path, NULL, _x2, _y2); CALayer* result = [SVGHelperUtilities newCALayerForPathBasedSVGElement:self withPath:path]; + CGPathRelease(path); return result; } diff --git a/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.h b/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.h new file mode 100644 index 000000000..163308cf3 --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.h @@ -0,0 +1,22 @@ +/* +// https://www.w3.org/TR/SVG/pservers.html#InterfaceSVGLinearGradientElement + + interface SVGLinearGradientElement : SVGGradientElement { + [SameObject] readonly attribute SVGAnimatedLength x1; + [SameObject] readonly attribute SVGAnimatedLength y1; + [SameObject] readonly attribute SVGAnimatedLength x2; + [SameObject] readonly attribute SVGAnimatedLength y2; + }; + +*/ + +#import "SVGGradientElement.h" + +@interface SVGLinearGradientElement : SVGGradientElement + +@property (nonatomic, readonly) SVGLength *x1; +@property (nonatomic, readonly) SVGLength *y1; +@property (nonatomic, readonly) SVGLength *x2; +@property (nonatomic, readonly) SVGLength *y2; + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.m b/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.m new file mode 100644 index 000000000..8bc83e38e --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGLinearGradientElement.m @@ -0,0 +1,139 @@ +// +// SVGLinearGradientElement.m +// SVGKit-iOS +// +// Created by lizhuoli on 2018/10/15. +// Copyright © 2018年 na. All rights reserved. +// + +#import "SVGLinearGradientElement.h" +#import "SVGElement_ForParser.h" +#import "SVGGradientLayer.h" + +@interface SVGLinearGradientElement () + +@property (nonatomic) BOOL hasSynthesizedProperties; +@property (nonatomic) SVGLength *x1; +@property (nonatomic) SVGLength *y1; +@property (nonatomic) SVGLength *x2; +@property (nonatomic) SVGLength *y2; + +@end + +@implementation SVGLinearGradientElement + +- (SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect)objectRect viewportRect:(SVGRect)viewportRect transform:(CGAffineTransform)absoluteTransform { + SVGGradientLayer *gradientLayer = [[SVGGradientLayer alloc] init]; + BOOL inUserSpace = self.gradientUnits == SVG_UNIT_TYPE_USERSPACEONUSE; + CGRect rectForRelativeUnits = inUserSpace ? CGRectFromSVGRect( viewportRect ) : objectRect; + + gradientLayer.frame = objectRect; + + NSString *attrX1 = [self getAttributeInheritedIfNil:@"x1"]; + NSString *attrY1 = [self getAttributeInheritedIfNil:@"y1"]; + NSString* attrX2 = [self getAttributeInheritedIfNil:@"x2"]; + NSString* attrY2 = [self getAttributeInheritedIfNil:@"y2"]; + SVGLength* svgX1 = [SVGLength svgLengthFromNSString:attrX1.length > 0 ? attrX1 : @"0%"]; + SVGLength* svgY1 = [SVGLength svgLengthFromNSString:attrY1.length > 0 ? attrY1 : @"0%"]; + SVGLength* svgX2 = [SVGLength svgLengthFromNSString:attrX2.length > 0 ? attrX2 : @"100%"]; + SVGLength* svgY2 = [SVGLength svgLengthFromNSString:attrY2.length > 0 ? attrY2 : @"0%"]; + self.x1 = svgX1; + self.y1 = svgY1; + self.x2 = svgX2; + self.y2 = svgY2; + + // these should really be two separate code paths (objectBoundingBox and userSpaceOnUse), but we simplify the logic using `rectForRelativeUnits` + CGFloat x1 = [svgX1 pixelsValueWithGradientDimension:CGRectGetWidth(rectForRelativeUnits)]; + CGFloat y1 = [svgY1 pixelsValueWithGradientDimension:CGRectGetHeight(rectForRelativeUnits)]; + CGFloat x2 = [svgX2 pixelsValueWithGradientDimension:CGRectGetWidth(rectForRelativeUnits)]; + CGFloat y2 = [svgY2 pixelsValueWithGradientDimension:CGRectGetHeight(rectForRelativeUnits)]; + CGPoint startPoint = CGPointMake(x1, y1); + CGPoint endPoint = CGPointMake(x2, y2); + + startPoint = CGPointApplyAffineTransform(startPoint, self.transform); + endPoint = CGPointApplyAffineTransform(endPoint, self.transform); + if (inUserSpace) + { + startPoint = CGPointApplyAffineTransform(startPoint, absoluteTransform); + startPoint.x = startPoint.x - CGRectGetMinX(objectRect); + startPoint.y = startPoint.y - CGRectGetMinY(objectRect); + endPoint = CGPointApplyAffineTransform(endPoint, absoluteTransform); + endPoint.x = endPoint.x - CGRectGetMaxX(objectRect) + CGRectGetWidth(objectRect); + endPoint.y = endPoint.y - CGRectGetMaxY(objectRect) + CGRectGetHeight(objectRect); + } + + CGPoint gradientStartPoint = startPoint; + CGPoint gradientEndPoint = endPoint; + + // convert to percent + gradientStartPoint.x = startPoint.x / CGRectGetWidth(objectRect); + gradientStartPoint.y = startPoint.y / CGRectGetHeight(objectRect); + gradientEndPoint.x = endPoint.x / CGRectGetWidth(objectRect); + gradientEndPoint.y = endPoint.y / CGRectGetHeight(objectRect); + + // Suck on iOS. When using `SVGFastImageView`, the layer software-rendering `drawInContext:` will contains strange boundingRect, while it works fine on macOS. So we need to use custom soft-rendering as well. + gradientLayer.startPoint = gradientStartPoint; + gradientLayer.endPoint = gradientEndPoint; + gradientLayer.type = kCAGradientLayerAxial; + // custom value (match the SVG spec) + gradientLayer.gradientElement = self; + gradientLayer.objectRect = objectRect; + gradientLayer.viewportRect = viewportRect; + gradientLayer.absoluteTransform = absoluteTransform; + + if (self.colors.count == 1) { + // SVG Spec: It is necessary that at least two stops defined to have a gradient effect. If no stops are defined, then painting shall occur as if 'none' were specified as the paint style. If one stop is defined, then paint with the solid color fill using the color defined for that gradient stop. + // However, `CAGradientLayer` will show empty when `colors.count` <= 1 + SVGGradientStop *lastStop = self.stops.lastObject; + gradientLayer.backgroundColor = CGColorWithSVGColor(lastStop.stopColor); + gradientLayer.opacity = lastStop.stopOpacity; + } else { + [gradientLayer setColors:self.colors]; + [gradientLayer setLocations:self.locations]; + } + + SVGKitLogVerbose(@"[%@] set gradient layer start = %@", [self class], NSStringFromCGPoint(gradientLayer.startPoint)); + SVGKitLogVerbose(@"[%@] set gradient layer end = %@", [self class], NSStringFromCGPoint(gradientLayer.endPoint)); + SVGKitLogVerbose(@"[%@] set gradient layer colors = %@", [self class], self.colors); + SVGKitLogVerbose(@"[%@] set gradient layer locations = %@", [self class], self.locations); + + return gradientLayer; +} + +- (void)synthesizeProperties { + if (self.hasSynthesizedProperties) + return; + self.hasSynthesizedProperties = YES; + + NSString* gradientID = [self getAttributeNS:@"http://www.w3.org/1999/xlink" localName:@"href"]; + + if ([gradientID length]) + { + if ([gradientID hasPrefix:@"#"]) + gradientID = [gradientID substringFromIndex:1]; + + SVGLinearGradientElement* baseGradient = (SVGLinearGradientElement*) [self.rootOfCurrentDocumentFragment getElementById:gradientID]; + NSString* svgNamespace = @"http://www.w3.org/2000/svg"; + + if (baseGradient) + { + [baseGradient synthesizeProperties]; + + if (!self.stops && baseGradient.stops) + { + for (SVGGradientStop* stop in baseGradient.stops) + [self addStop:stop]; + } + NSArray *keys = [NSArray arrayWithObjects:@"x1", @"y1", @"x2", @"y2", @"gradientUnits", @"gradientTransform", @"spreadMethod", nil]; + + for (NSString* key in keys) + { + if (![self hasAttribute:key] && [baseGradient hasAttribute:key]) + [self setAttributeNS:svgNamespace qualifiedName:key value:[baseGradient getAttribute:key]]; + } + + } + } +} + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGPathElement.m b/Source/DOM classes/Unported or Partial DOM/SVGPathElement.m index ea12df8c2..823d17835 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGPathElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGPathElement.m @@ -31,8 +31,7 @@ - (void)parseData:(NSString *)data { CGMutablePathRef path = CGPathCreateMutable(); NSScanner* dataScanner = [NSScanner scannerWithString:data]; - CGPoint lastCoordinate = CGPointZero; - SVGCurve lastCurve = SVGCurveZero; + SVGCurve lastCurve = [SVGKPointsAndPathsParser startingCurve]; BOOL foundCmd; NSCharacterSet *knownCommands = [NSCharacterSet characterSetWithCharactersInString:@"MmLlCcVvHhAaSsQqTtZz"]; @@ -45,16 +44,16 @@ - (void)parseData:(NSString *)data if (command.length > 1) { // Take only one char (it can happen that multiple commands are consecutive, as "ZM" - so we only want to get the "Z") - const int tooManyChars = command.length-1; + const NSUInteger tooManyChars = command.length-1; command = [command substringToIndex:1]; [dataScanner setScanLocation:([dataScanner scanLocation] - tooManyChars)]; } if (foundCmd) { if ([@"z" isEqualToString:command] || [@"Z" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readCloseCommand:[NSScanner scannerWithString:command] - path:path - relativeTo:lastCoordinate]; + lastCurve = [SVGKPointsAndPathsParser readCloseCommand:[NSScanner scannerWithString:command] + path:path + relativeTo:lastCurve.p]; } else { NSString* cmdArgs = nil; BOOL foundParameters = [dataScanner scanUpToCharactersFromSet:knownCommands @@ -65,87 +64,95 @@ - (void)parseData:(NSString *)data NSScanner* commandScanner = [NSScanner scannerWithString:commandWithParameters]; if ([@"m" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner - path:path - relativeTo:lastCoordinate - isRelative:TRUE]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner + path:path + relativeTo:lastCurve.p + isRelative:TRUE]; } else if ([@"M" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner - path:path - relativeTo:CGPointZero - isRelative:FALSE]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner + path:path + relativeTo:CGPointZero + isRelative:FALSE]; } else if ([@"l" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readLinetoCommand:commandScanner - path:path - relativeTo:lastCoordinate - isRelative:TRUE]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readLinetoCommand:commandScanner + path:path + relativeTo:lastCurve.p + isRelative:TRUE]; } else if ([@"L" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readLinetoCommand:commandScanner - path:path - relativeTo:CGPointZero - isRelative:FALSE]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readLinetoCommand:commandScanner + path:path + relativeTo:CGPointZero + isRelative:FALSE]; } else if ([@"v" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readVerticalLinetoCommand:commandScanner - path:path - relativeTo:lastCoordinate]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readVerticalLinetoCommand:commandScanner + path:path + relativeTo:lastCurve.p]; } else if ([@"V" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readVerticalLinetoCommand:commandScanner - path:path - relativeTo:CGPointZero]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readVerticalLinetoCommand:commandScanner + path:path + relativeTo:CGPointZero]; } else if ([@"h" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readHorizontalLinetoCommand:commandScanner - path:path - relativeTo:lastCoordinate]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readHorizontalLinetoCommand:commandScanner + path:path + relativeTo:lastCurve.p]; } else if ([@"H" isEqualToString:command]) { - lastCoordinate = [SVGKPointsAndPathsParser readHorizontalLinetoCommand:commandScanner - path:path - relativeTo:CGPointZero]; - lastCurve = SVGCurveZero; + lastCurve = [SVGKPointsAndPathsParser readHorizontalLinetoCommand:commandScanner + path:path + relativeTo:CGPointZero]; } else if ([@"c" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readCurvetoCommand:commandScanner - path:path - relativeTo:lastCoordinate - isRelative:TRUE]; - lastCoordinate = lastCurve.p; + path:path + relativeTo:lastCurve.p + isRelative:TRUE]; } else if ([@"C" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readCurvetoCommand:commandScanner - path:path - relativeTo:CGPointZero - isRelative:FALSE]; - lastCoordinate = lastCurve.p; + path:path + relativeTo:CGPointZero + isRelative:FALSE]; } else if ([@"s" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readSmoothCurvetoCommand:commandScanner - path:path - relativeTo:lastCoordinate - withPrevCurve:lastCurve]; - lastCoordinate = lastCurve.p; + path:path + relativeTo:lastCurve.p + withPrevCurve:lastCurve + isRelative:TRUE]; } else if ([@"S" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readSmoothCurvetoCommand:commandScanner - path:path - relativeTo:CGPointZero - withPrevCurve:lastCurve]; - lastCoordinate = lastCurve.p; + path:path + relativeTo:CGPointZero + withPrevCurve:lastCurve + isRelative:FALSE]; } else if ([@"q" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readQuadraticCurvetoCommand:commandScanner - path:path - relativeTo:lastCoordinate - isRelative:TRUE]; - lastCoordinate = lastCurve.p; + path:path + relativeTo:lastCurve.p + isRelative:TRUE]; } else if ([@"Q" isEqualToString:command]) { lastCurve = [SVGKPointsAndPathsParser readQuadraticCurvetoCommand:commandScanner - path:path - relativeTo:CGPointZero - isRelative:FALSE]; - lastCoordinate = lastCurve.p; - } else { - DDLogWarn(@"unsupported command %@", command); + path:path + relativeTo:CGPointZero + isRelative:FALSE]; + } else if ([@"t" isEqualToString:command]) { + lastCurve = [SVGKPointsAndPathsParser readSmoothQuadraticCurvetoCommand:commandScanner + path:path + relativeTo:lastCurve.p + withPrevCurve:lastCurve]; + } else if ([@"T" isEqualToString:command]) { + lastCurve = [SVGKPointsAndPathsParser readSmoothQuadraticCurvetoCommand:commandScanner + path:path + relativeTo:CGPointZero + withPrevCurve:lastCurve]; + } else if ([@"a" isEqualToString:command]) { + lastCurve = [SVGKPointsAndPathsParser readEllipticalArcArguments:commandScanner + path:path + relativeTo:lastCurve.p + isRelative:TRUE]; + } else if ([@"A" isEqualToString:command]) { + lastCurve = [SVGKPointsAndPathsParser readEllipticalArcArguments:commandScanner + path:path + relativeTo:CGPointZero + isRelative:FALSE]; + } else { + SVGKitLogWarn(@"unsupported command %@", command); } } } diff --git a/Source/DOM classes/Unported or Partial DOM/SVGPolygonElement.m b/Source/DOM classes/Unported or Partial DOM/SVGPolygonElement.m index 66c7d4270..9483524c9 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGPolygonElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGPolygonElement.m @@ -35,7 +35,6 @@ - (void)parseData:(NSString *)data { CGMutablePathRef path = CGPathCreateMutable(); NSScanner* dataScanner = [NSScanner scannerWithString:data]; - CGPoint lastCoordinate = CGPointZero; NSCharacterSet* knownCommands = [NSCharacterSet characterSetWithCharactersInString:@""]; @@ -47,15 +46,14 @@ - (void)parseData:(NSString *)data NSScanner* commandScanner = [NSScanner scannerWithString:commandWithParameters]; - lastCoordinate = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner - path:path - relativeTo:CGPointZero - isRelative:FALSE]; - + SVGCurve lastCurve = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroups:commandScanner + path:path + relativeTo:CGPointZero + isRelative:FALSE]; - [SVGKPointsAndPathsParser readCloseCommand:[NSScanner scannerWithString:@"z"] - path:path - relativeTo:lastCoordinate]; + [SVGKPointsAndPathsParser readCloseCommand:[NSScanner scannerWithString:@"z"] + path:path + relativeTo:lastCurve.p]; self.pathForShapeInRelativeCoords = path; CGPathRelease(path); diff --git a/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.h b/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.h new file mode 100644 index 000000000..7e3030266 --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.h @@ -0,0 +1,25 @@ +/* + https://www.w3.org/TR/SVG/pservers.html#InterfaceSVGRadialGradientElement + + interface SVGRadialGradientElement : SVGGradientElement { + [SameObject] readonly attribute SVGAnimatedLength cx; + [SameObject] readonly attribute SVGAnimatedLength cy; + [SameObject] readonly attribute SVGAnimatedLength r; + [SameObject] readonly attribute SVGAnimatedLength fx; + [SameObject] readonly attribute SVGAnimatedLength fy; + [SameObject] readonly attribute SVGAnimatedLength fr; + }; + */ + +#import "SVGGradientElement.h" + +@interface SVGRadialGradientElement : SVGGradientElement + +@property (nonatomic, readonly) SVGLength *cx; +@property (nonatomic, readonly) SVGLength *cy; +@property (nonatomic, readonly) SVGLength *r; +@property (nonatomic, readonly) SVGLength *fx; +@property (nonatomic, readonly) SVGLength *fy; +@property (nonatomic, readonly) SVGLength *fr; + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.m b/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.m new file mode 100644 index 000000000..a0867512c --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGRadialGradientElement.m @@ -0,0 +1,192 @@ +// +// SVGRadialGradientElement.m +// SVGKit-iOS +// +// Created by lizhuoli on 2018/10/15. +// Copyright © 2018年 na. All rights reserved. +// + +#import "SVGRadialGradientElement.h" +#import "SVGElement_ForParser.h" +#import "SVGUtils.h" +#import "SVGGradientLayer.h" + +// `kCAGradientLayerRadial` this symbol is available since iOS 3.2/tvOS 9.0/macOS 10.6, but it's not externed to public header until Xcode 10 with iOS 12 SDK, so we define it for user who still use old SDK version. +#define kCAGradientLayerRadial @"radial" + +@interface SVGRadialGradientElement () + +@property (nonatomic) BOOL hasSynthesizedProperties; +@property (nonatomic) SVGLength *cx; +@property (nonatomic) SVGLength *cy; +@property (nonatomic) SVGLength *r; +@property (nonatomic) SVGLength *fx; +@property (nonatomic) SVGLength *fy; +@property (nonatomic) SVGLength *fr; + +@end + +@implementation SVGRadialGradientElement + +- (SVGGradientLayer *)newGradientLayerForObjectRect:(CGRect)objectRect viewportRect:(SVGRect)viewportRect transform:(CGAffineTransform)absoluteTransform { + SVGGradientLayer *gradientLayer = [[SVGGradientLayer alloc] init]; + BOOL inUserSpace = self.gradientUnits == SVG_UNIT_TYPE_USERSPACEONUSE; + CGRect rectForRelativeUnits = inUserSpace ? CGRectFromSVGRect( viewportRect ) : objectRect; + + gradientLayer.frame = objectRect; + + NSString *cxAttr = [self getAttributeInheritedIfNil:@"cx"]; + NSString *cyAttr = [self getAttributeInheritedIfNil:@"cy"]; + NSString *rAttr = [self getAttributeInheritedIfNil:@"r"]; + NSString *fxAttr = [self getAttributeInheritedIfNil:@"fx"]; + NSString *fyAttr = [self getAttributeInheritedIfNil:@"fy"]; + NSString *frAttr = [self getAttributeInheritedIfNil:@"fr"]; + SVGLength* svgCX = [SVGLength svgLengthFromNSString:cxAttr.length > 0 ? cxAttr : @"50%"]; + SVGLength* svgCY = [SVGLength svgLengthFromNSString:cyAttr.length > 0 ? cyAttr : @"50%"]; + SVGLength* svgR = [SVGLength svgLengthFromNSString:rAttr.length > 0 ? rAttr : @"50%"]; + // focal value + SVGLength* svgFX = fxAttr.length > 0 ? [SVGLength svgLengthFromNSString:fxAttr] : svgCX; + SVGLength* svgFY = fyAttr.length > 0 ? [SVGLength svgLengthFromNSString:fyAttr] : svgCY; + SVGLength* svgFR = [SVGLength svgLengthFromNSString:frAttr.length > 0 ? frAttr : @"0%"]; + // This is a tempory workaround. Apple's `CAGradientLayer` does not support focal point for radial gradient. We have to use the low-level API `CGContextDrawRadialGradient` and using custom software-render for focal point. So it does not works for `SVGLayredView` which is hardware-render by CA render server. + if (fxAttr.length > 0 || fyAttr.length > 0 || frAttr.length > 0) { + SVGKitLogWarn(@"The radialGradient element #%@ contains focal value: (fx:%@, fy: %@, fr:%@). The focul value is only supported on `SVGFastimageView` and it will be ignored when rendering in SVGLayredView.", [self getAttribute:@"id"], fxAttr, fyAttr, frAttr); + } + self.cx = svgCX; + self.cy = svgCY; + self.r = svgR; + self.fx = svgFX; + self.fy = svgFY; + self.fr = svgFR; + + // these should really be two separate code paths (objectBoundingBox and userSpaceOnUse), but we simplify the logic using `rectForRelativeUnits` + CGFloat width = CGRectGetWidth(rectForRelativeUnits); + CGFloat height = CGRectGetHeight(rectForRelativeUnits); + CGFloat cx = [svgCX pixelsValueWithGradientDimension:width]; + CGFloat cy = [svgCY pixelsValueWithGradientDimension:height]; + CGFloat val = MIN(width, height); + CGFloat radius = [svgR pixelsValueWithGradientDimension:val]; + + CGFloat fx = [svgFX pixelsValueWithGradientDimension:width]; + CGFloat fy = [svgFY pixelsValueWithGradientDimension:height]; + + CGPoint startPoint = CGPointMake(cx, cy); + CGPoint endPoint = CGPointMake(fx, fy); + CGAffineTransform selfTransform = self.transform; + + if (inUserSpace) + { + // work out the new radius + CGFloat rad = radius * 2.f; + CGRect rect = CGRectMake(startPoint.x, startPoint.y, rad, rad); + rect = CGRectApplyAffineTransform(rect, self.transform); + rect = CGRectApplyAffineTransform(rect, absoluteTransform); + radius = CGRectGetHeight(rect) / 2.f; + } + + if (!inUserSpace) + { + // SVG spec: transform if width or height is not equal + if(CGRectGetWidth(objectRect) != CGRectGetHeight(objectRect)) { + CGAffineTransform tr = CGAffineTransformMakeTranslation(startPoint.x, + startPoint.y); + if(CGRectGetWidth(objectRect) > CGRectGetHeight(objectRect)) { + tr = CGAffineTransformScale(tr, CGRectGetWidth(objectRect)/CGRectGetHeight(objectRect), 1); + } else { + tr = CGAffineTransformScale(tr, 1.f, CGRectGetHeight(objectRect)/CGRectGetWidth(objectRect)); + } + tr = CGAffineTransformTranslate(tr, -startPoint.x, -startPoint.y); + selfTransform = CGAffineTransformConcat(tr, selfTransform); + } + } + + CGSize size = CGSizeMake(radius, radius); + startPoint = CGPointApplyAffineTransform(startPoint, selfTransform); + endPoint = CGPointApplyAffineTransform(endPoint, selfTransform); + size = CGSizeApplyAffineTransform(size, selfTransform); + if (inUserSpace) + { + // apply the absolute position + startPoint = CGPointApplyAffineTransform(startPoint, absoluteTransform); + startPoint.x = startPoint.x - CGRectGetMinX(objectRect); + startPoint.y = startPoint.y - CGRectGetMinY(objectRect); + endPoint = CGPointApplyAffineTransform(endPoint, absoluteTransform); + endPoint.x = endPoint.x - CGRectGetMaxX(objectRect) + CGRectGetWidth(objectRect); + endPoint.y = endPoint.y - CGRectGetMaxY(objectRect) + CGRectGetHeight(objectRect); + size = CGSizeApplyAffineTransform(size, selfTransform); + } + + CGPoint gradientStartPoint = startPoint; + CGPoint gradientEndPoint = endPoint; + + // convert to percent + CGPoint centerPoint = gradientStartPoint; + gradientStartPoint = CGPointMake((centerPoint.x) / CGRectGetWidth(objectRect), centerPoint.y / CGRectGetHeight(objectRect)); + gradientEndPoint = CGPointMake((centerPoint.x + size.width) / CGRectGetWidth(objectRect), (centerPoint.y + size.height) / CGRectGetHeight(objectRect)); + + // Suck. When using `SVGLayredImageView`, the layer rendering is submitted to CA render server, and your custom `renderInContex:` code will not work. So we just set both built-in value (CAGradientLayer property) && custom value (SVGGradientLayer property) + // FIX-ME: built-in value (not match the SVG spec, all the focal value will be ignored) + gradientLayer.startPoint = gradientStartPoint; + gradientLayer.endPoint = gradientEndPoint; + gradientLayer.type = kCAGradientLayerRadial; + // custom value (match the SVG spec) + gradientLayer.gradientElement = self; + gradientLayer.objectRect = objectRect; + gradientLayer.viewportRect = viewportRect; + gradientLayer.absoluteTransform = absoluteTransform; + + if (svgR.value <= 0 || self.colors.count == 1) { + // SVG spec: A value of lower or equal to zero will cause the area to be painted as a single color using the color and opacity of the last gradient . + SVGGradientStop *lastStop = self.stops.lastObject; + gradientLayer.backgroundColor = CGColorWithSVGColor(lastStop.stopColor); + gradientLayer.opacity = lastStop.stopOpacity; + } else { + [gradientLayer setColors:self.colors]; + [gradientLayer setLocations:self.locations]; + } + + SVGKitLogVerbose(@"[%@] set gradient layer start = %@", [self class], NSStringFromCGPoint(gradientLayer.startPoint)); + SVGKitLogVerbose(@"[%@] set gradient layer end = %@", [self class], NSStringFromCGPoint(gradientLayer.endPoint)); + SVGKitLogVerbose(@"[%@] set gradient layer colors = %@", [self class], self.colors); + SVGKitLogVerbose(@"[%@] set gradient layer locations = %@", [self class], self.locations); + + return gradientLayer; +} + +- (void)synthesizeProperties { + if (self.hasSynthesizedProperties) + return; + self.hasSynthesizedProperties = YES; + + NSString* gradientID = [self getAttributeNS:@"http://www.w3.org/1999/xlink" localName:@"href"]; + + if ([gradientID length]) + { + if ([gradientID hasPrefix:@"#"]) + gradientID = [gradientID substringFromIndex:1]; + + SVGRadialGradientElement* baseGradient = (SVGRadialGradientElement*) [self.rootOfCurrentDocumentFragment getElementById:gradientID]; + NSString* svgNamespace = @"http://www.w3.org/2000/svg"; + + if (baseGradient) + { + [baseGradient synthesizeProperties]; + + if (!self.stops && baseGradient.stops) + { + for (SVGGradientStop* stop in baseGradient.stops) + [self addStop:stop]; + } + NSArray *keys = [NSArray arrayWithObjects:@"cx", @"cy", @"r", @"fx", @"fy", @"fr", @"gradientUnits", @"gradientTransform", @"spreadMethod", nil]; + + for (NSString* key in keys) + { + if (![self hasAttribute:key] && [baseGradient hasAttribute:key]) + [self setAttributeNS:svgNamespace qualifiedName:key value:[baseGradient getAttribute:key]]; + } + + } + } +} + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGRectElement.h b/Source/DOM classes/Unported or Partial DOM/SVGRectElement.h index 9ffaa1ca6..7a543d3d7 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGRectElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGRectElement.h @@ -22,13 +22,13 @@ @interface SVGRectElement : BaseClassForAllSVGBasicShapes { } -@property (nonatomic, retain, readonly) SVGLength* x; -@property (nonatomic, retain, readonly) SVGLength* y; -@property (nonatomic, retain, readonly) SVGLength* width; -@property (nonatomic, retain, readonly) SVGLength* height; +@property (nonatomic, strong, readonly) SVGLength* x; +@property (nonatomic, strong, readonly) SVGLength* y; +@property (nonatomic, strong, readonly) SVGLength* width; +@property (nonatomic, strong, readonly) SVGLength* height; -@property (nonatomic, retain, readonly) SVGLength* rx; -@property (nonatomic, retain, readonly) SVGLength* ry; +@property (nonatomic, strong, readonly) SVGLength* rx; +@property (nonatomic, strong, readonly) SVGLength* ry; #pragma mark - Properties not in spec but are needed by ObjectiveC implementation to maintain diff --git a/Source/DOM classes/Unported or Partial DOM/SVGRectElement.m b/Source/DOM classes/Unported or Partial DOM/SVGRectElement.m index ac84bb810..9b8e27fbc 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGRectElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGRectElement.m @@ -6,7 +6,7 @@ @interface SVGRectElement () -#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 +#if SVGKIT_UIKIT && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 void CGPathAddRoundedRect (CGMutablePathRef path, CGRect rect, CGFloat radiusX, CGFloat radiusY); #endif @@ -24,7 +24,7 @@ @implementation SVGRectElement @synthesize rx = _rx; @synthesize ry = _ry; -#if __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 +#if SVGKIT_UIKIT && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0 // adapted from http://www.cocoanetics.com/2010/02/drawing-rounded-rectangles/ void CGPathAddRoundedRect (CGMutablePathRef path, CGRect rect, CGFloat radiusX, CGFloat radiusY) { @@ -91,8 +91,12 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { Create a square OR rounded rectangle as a CGPath */ + + SVGRect r = parseResult.rootOfSVGTree.viewport; + CGMutablePathRef path = CGPathCreateMutable(); - CGRect rect = CGRectMake([_x pixelsValue], [_y pixelsValue], [_width pixelsValue], [_height pixelsValue]); + CGRect rect = CGRectMake([_x pixelsValueWithDimension:r.x], [_y pixelsValueWithDimension:r.y], + [_width pixelsValueWithDimension:r.width], [_height pixelsValueWithDimension:r.height]); CGFloat radiusXPixels = _rx != nil ? [_rx pixelsValue] : 0; CGFloat radiusYPixels = _ry != nil ? [_ry pixelsValue] : 0; @@ -107,12 +111,18 @@ - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { radiusYPixels = radiusXPixels; else if( radiusXPixels == 0 && radiusYPixels > 0 ) // if RX unspecified, make it equal to RY radiusXPixels = radiusYPixels; + + if( radiusXPixels > CGRectGetWidth(rect) / 2 ) // give RX max value of half rect width + radiusXPixels = CGRectGetWidth(rect) / 2; + + if( radiusYPixels > CGRectGetHeight(rect) / 2 ) // give RY max value of half rect height + radiusYPixels = CGRectGetHeight(rect) / 2; CGPathAddRoundedRect(path, -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_7_0 - nil, +#if !(SVGKIT_UIKIT && __IPHONE_OS_VERSION_MAX_ALLOWED < __IPHONE_7_0) + nil, #endif - rect, radiusXPixels, radiusYPixels); + rect, radiusXPixels, radiusYPixels); } self.pathForShapeInRelativeCoords = path; CGPathRelease(path); diff --git a/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.h b/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.h index 5cbc3fde2..439ccaac9 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.h @@ -65,17 +65,18 @@ #import "NodeList.h" #import "ConverterSVGToCALayer.h" +#import "SVGKSource.h" @interface SVGSVGElement : SVGElement < DocumentCSS, SVGFitToViewBox, /* FIXME: refactor and delete this, it's in violation of the spec: */ ConverterSVGToCALayer > -@property (nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; -@property (nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; -@property (nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; -@property (nonatomic, retain, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; -@property (nonatomic, retain, readonly) NSString* contentScriptType; -@property (nonatomic, retain, readonly) NSString* contentStyleType; +@property (nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* x; +@property (nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* y; +@property (nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* width; +@property (nonatomic, strong, readonly) /*FIXME: should be SVGAnimatedLength instead*/ SVGLength* height; +@property (nonatomic, strong, readonly) NSString* contentScriptType; +@property (nonatomic, strong, readonly) NSString* contentStyleType; /** "The position and size of the viewport (implicit or explicit) that corresponds to this ‘svg’ element. When the user agent is actually rendering the content, then the position and size values represent the actual values when rendering. The position and size values are unitless values in the coordinate system of the parent element. If no parent element exists (i.e., ‘svg’ element represents the root of the document tree), if this SVG document is embedded as part of another document (e.g., via the HTML ‘object’ element), then the position and size are unitless values in the coordinate system of the parent document. (If the parent uses CSS or XSL layout, then unitless values represent pixel units for the current CSS or XSL viewport, as described in the CSS2 specification.) If the parent element does not have a coordinate system, then the user agent should provide reasonable default values for this attribute." @@ -86,9 +87,10 @@ @property (nonatomic, readonly) float screenPixelToMillimeterX; @property (nonatomic, readonly) float screenPixelToMillimeterY; @property (nonatomic, readonly) BOOL useCurrentView; -@property (nonatomic, retain, readonly) SVGViewSpec* currentView; +@property (nonatomic, strong, readonly) SVGViewSpec* currentView; @property (nonatomic, readonly) float currentScale; -@property (nonatomic, retain, readonly) SVGPoint* currentTranslate; +@property (nonatomic, strong, readonly) SVGPoint* currentTranslate; +@property (nonatomic, strong, readwrite) SVGKSource *source; -(long) suspendRedraw:(long) maxWaitMilliseconds; -(void) unsuspendRedraw:(long) suspendHandleID; @@ -116,10 +118,15 @@ #pragma mark - below here VIOLATES THE STANDARD, but needs to be CAREFULLY merged with spec -- (SVGElement *)findFirstElementOfClass:(Class)class; /*< temporary convenience method until SVGDocument support is complete */ +- (SVGElement *)findFirstElementOfClass:(Class)classParameter; /**< temporary convenience method until SVGDocument support is complete */ #pragma mark - elements REQUIRED to implement the spec but not included in SVG Spec due to bugs in the spec writing! @property(nonatomic,readonly) SVGRect requestedViewport; +/** Required by the spec whenever someone specifies a width and height that disagree with the viewbox they also specified */ +@property(readonly) double aspectRatioFromWidthPerHeight; +/** Required by the spec whenever someone specifies a width and height that disagree with the viewbox they also specified */ +@property(readonly) double aspectRatioFromViewBox; + @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.m b/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.m index 4a4c6b465..00fa693d3 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGSVGElement.m @@ -7,10 +7,6 @@ #import "SVGElement_ForParser.h" // to resolve Xcode circular dependencies; in long term, parsing SHOULD NOT HAPPEN inside any class whose name starts "SVG" (because those are reserved classes for the SVG Spec) -#if TARGET_OS_IPHONE -#import -#endif - @interface SVGSVGElement() #pragma mark - elements REQUIRED to implement the spec but not included in SVG Spec due to bugs in the spec writing! @property(nonatomic,readwrite) SVGRect requestedViewport; @@ -33,31 +29,23 @@ @implementation SVGSVGElement @synthesize currentView; @synthesize currentScale; @synthesize currentTranslate; +@synthesize source; -@synthesize viewBox = _viewBox; +@synthesize viewBox = _viewBox; // each SVGElement subclass that conforms to protocol "SVGFitToViewBox" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols +@synthesize preserveAspectRatio; // each SVGElement subclass that conforms to protocol "SVGFitToViewBox" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols #pragma mark - NON SPEC, violating, properties -(void)dealloc { self.viewBox = SVGRectUninitialized(); - [x release]; - [y release]; - [width release]; - [height release]; - [contentScriptType release]; - [contentStyleType release]; - self.currentView = nil; - self.currentTranslate = nil; - self.styleSheets = nil; - [super dealloc]; } #pragma mark - CSS Spec methods (via the DocumentCSS protocol) -(void)loadDefaults { - self.styleSheets = [[[StyleSheetList alloc] init] autorelease]; + self.styleSheets = [[StyleSheetList alloc] init]; } @synthesize styleSheets; @@ -115,6 +103,43 @@ -(Element*) getElementById:(NSString*) elementId - (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult { [super postProcessAttributesAddingErrorsTo:parseResult]; + /** + Rather unusually, the official SVG Spec uses an explicit "width=100% height=100%" on every + root SVG tag on every TestSuite file - these ARE NOT PRESENT in any of the Spec examples! + + Only in the TestSuite! + + Net effect: we have a major problem with calculating the initial viewport. What does + "100%" mean when you're parsing? + + Literally, from the spec: NOTHING. It's undefined! It's a hint that requires you to have + a parsed SVG already. c.f. other doc notes below, this is complicated and very badly + documented in the SVG Spec. + + ------------- + + For now, we're going to: + + 1. if width or height are percentages, set the viewport to "uninitialized", since they are indeed. + + --- within the spec, "100%" doesn't mean anything. Other percentages are horribly vague in what + they might (or might not) mean. And different SVG renderers treat them differently. Because the + Spec is so poor, probably. + + 2. Assume that our post-parse renderer code (elsewhere in the library, in SVGKImage I believe) + will correctly modify the viewport afterwards. It will lose the percentage, of course, but frankly + this is enough of a brainfck already that any author who uses percentages in their SVG tag needs + to be coached in better authoring anyway! + + --- i.e. their SVG isn't going to render reliably anyway. Whatever they're trying to do, they + should probably do it a different way. + + --- and: it's so damn hard to get a working, non-crashing implmementation here htat handles all + edge-cases, that ... screw it. Life's too short. + + */ + + /** If the width + height are missing, we have to get an image width+height from the USER before we even START parsing. @@ -129,6 +154,19 @@ We would need to put extra (NON STANDARD) properties on SVGDocument, for the "vi NSString* stringWidth = [self getAttribute:@"width"]; NSString* stringHeight = [self getAttribute:@"height"]; + NSString* pos_x = [self getAttribute:@"x"]; + NSString* pos_y = [self getAttribute:@"y"]; + + if (pos_x == nil || pos_x.length < 1) + self.x = 0; // i.e. undefined + else + self.x = [SVGLength svgLengthFromNSString:pos_x]; + + if (pos_y == nil || pos_y.length < 1) + self.y = 0; // i.e. undefined + else + self.y = [SVGLength svgLengthFromNSString:pos_y]; + if( stringWidth == nil || stringWidth.length < 1 ) self.width = nil; // i.e. undefined else @@ -139,11 +177,24 @@ We would need to put extra (NON STANDARD) properties on SVGDocument, for the "vi else self.height = [SVGLength svgLengthFromNSString:[self getAttribute:@"height"]]; - /* set the frameRequestedViewport appropriately (NB: spec doesn't allow for this but it REQUIRES it to be done and saved!) */ - if( self.width != nil && self.height != nil ) - self.requestedViewport = SVGRectMake( 0, 0, [self.width pixelsValue], [self.height pixelsValue] ); - else - self.requestedViewport = SVGRectUninitialized(); + /** + WARNING: SVG TestSuite sets SVG element width and height to 100%, which are meaningless + and impossible to calculate at parsetime (they are defined as undefined until you "negotiate" + with the OS / Application / etc -- which won't be possible until you've finished the parse). + + So ... they end up being 0 here. To workaround that, we set them to nil if they are percentages + here. ONLY for the SVG tag though. + */ + if( self.width.unitType == SVG_LENGTHTYPE_PERCENTAGE ) + self.width = nil; + if( self.height.unitType == SVG_LENGTHTYPE_PERCENTAGE ) + self.height = nil; + + /* set the frameRequestedViewport appropriately (NB: spec doesn't allow for this but it REQUIRES it to be done and saved!) */ + if( self.width != nil && self.height != nil ) + self.requestedViewport = SVGRectMake( [self.x pixelsValue], [self.y pixelsValue], [self.width pixelsValue], [self.height pixelsValue] ); + else + self.requestedViewport = SVGRectUninitialized(); /** @@ -162,28 +213,31 @@ We would need to put extra (NON STANDARD) properties on SVGDocument, for the "vi if( [[self getAttribute:@"viewBox"] length] > 0 ) { NSArray* boxElements = [[self getAttribute:@"viewBox"] componentsSeparatedByString:@" "]; - + if ([boxElements count] < 2) { + /* count should be 4 -- maybe they're comma separated like (x,y,w,h) */ + boxElements = [[self getAttribute:@"viewBox"] componentsSeparatedByString:@","]; + } _viewBox = SVGRectMake([[boxElements objectAtIndex:0] floatValue], [[boxElements objectAtIndex:1] floatValue], [[boxElements objectAtIndex:2] floatValue], [[boxElements objectAtIndex:3] floatValue]); } else { self.viewBox = SVGRectUninitialized(); // VERY IMPORTANT: we MUST make it clear this was never initialized, instead of saying its 0,0,0,0 ! } - DDLogVerbose(@"[%@] WARNING: SVG spec says we should calculate the 'intrinsic aspect ratio'. Some badly-made SVG files work better if you do this and then post-multiply onto the specified viewBox attribute ... BUT they ALSO require that you 're-center' them inside the newly-created viewBox; and the SVG Spec DOES NOT SAY you should do that. All examples so far were authored in Inkscape, I think, so ... I think it's a serious bug in Inkscape that has tricked people into making incorrect SVG files. For example, c.f. http://en.wikipedia.org/wiki/File:BlankMap-World6-Equirectangular.svg", [self class]); - //osx logging -#if TARGET_OS_IPHONE - DDLogVerbose(@"[%@] DEBUG INFO: set document viewBox = %@", [self class], NSStringFromCGRect( CGRectFromSVGRect(self.viewBox))); -#else - //mac logging - DDLogVerbose(@"[%@] DEBUG INFO: set document viewBox = %@", [self class], NSStringFromRect(self.viewBox)); -#endif + [SVGHelperUtilities parsePreserveAspectRatioFor:self]; + + if( stringWidth == nil || stringWidth.length < 1 ) + self.width = nil; // i.e. undefined + else + self.width = [SVGLength svgLengthFromNSString:[self getAttribute:@"width"]]; + // logging + SVGKitLogVerbose(@"[%@] DEBUG INFO: set document viewBox = %@", [self class], NSStringFromSVGRect(self.viewBox)); } -- (SVGElement *)findFirstElementOfClass:(Class)class { +- (SVGElement *)findFirstElementOfClass:(Class)classParameter { for (SVGElement *element in self.childNodes) { - if ([element isKindOfClass:class]) + if ([element isKindOfClass:classParameter]) return element; } @@ -193,7 +247,7 @@ - (SVGElement *)findFirstElementOfClass:(Class)class { - (CALayer *) newLayer { - CALayer* _layer = [[CALayerWithChildHitTest layer] retain]; + CALayer* _layer = [CALayerWithChildHitTest layer]; [SVGHelperUtilities configureCALayer:_layer usingElement:self]; @@ -212,4 +266,17 @@ - (void)layoutLayer:(CALayer *)layer { */ } +#pragma mark - elements REQUIRED to implement the spec but not included in SVG Spec due to bugs in the spec writing! + +-(double)aspectRatioFromWidthPerHeight +{ + return [self.height pixelsValue] == 0 ? 0 : [self.width pixelsValue] / [self.height pixelsValue]; +} + +-(double)aspectRatioFromViewBox +{ + return self.viewBox.height == 0 ? 0 : self.viewBox.width / self.viewBox.height; +} + + @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGStyleCatcher.h b/Source/DOM classes/Unported or Partial DOM/SVGStyleCatcher.h index 930782c1c..a77a5685f 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGStyleCatcher.h +++ b/Source/DOM classes/Unported or Partial DOM/SVGStyleCatcher.h @@ -16,9 +16,7 @@ //-(void)styleCatchElement:(SVGElement *)styledLayer forClass:(NSString *)colorIndex; //-(void)styleCatchNewStyle:(NSString *)className; -(void)styleCatchLayer:(CALayer *)styledLayer forClass:(NSString *)colorIndex; -#if TARGET_OS_IPHONE -(UIColor *)styleCatchOverrideFill:(NSString *)fillClassName; -#endif @end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.h b/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.h new file mode 100644 index 000000000..d50185299 --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.h @@ -0,0 +1,11 @@ + + +#import "SVGElement.h" + +#import "ConverterSVGToCALayer.h" + +@interface SVGSwitchElement : SVGElement + +@property (nonatomic, readonly, strong) NodeList * visibleChildNodes; + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.m b/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.m new file mode 100644 index 000000000..47eb5e0a6 --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/SVGSwitchElement.m @@ -0,0 +1,61 @@ + +#import "SVGSwitchElement.h" +#import "CALayerWithChildHitTest.h" +#import "SVGHelperUtilities.h" +#import "NodeList+Mutable.h" + +@implementation SVGSwitchElement + +@synthesize visibleChildNodes = _visibleChildNodes; + + +- (CALayer *) newLayer +{ + CALayer* _layer = [CALayerWithChildHitTest layer]; + + [SVGHelperUtilities configureCALayer:_layer usingElement:self]; + + return _layer; +} + +- (NodeList *)visibleChildNodes +{ + if (_visibleChildNodes) + return _visibleChildNodes; + + _visibleChildNodes = [[NodeList alloc] init]; + + NSString* localLanguage = [[NSLocale preferredLanguages] firstObject]; + + for ( SVGElement *child in self.childNodes ) + { + if ([child conformsToProtocol:@protocol(ConverterSVGToCALayer)]) + { + // spec says if there is no attribute at all then pick it + if (![child hasAttribute:@"systemLanguage"]) + { + [_visibleChildNodes.internalArray addObject:child]; + break; + } + + NSString* languages = [child getAttribute:@"systemLanguage"]; + + NSArray* languageCodes = [languages componentsSeparatedByCharactersInSet: + [NSCharacterSet characterSetWithCharactersInString:@", \t\n\r"]]; + + if ([languageCodes containsObject:localLanguage]) + { + [_visibleChildNodes.internalArray addObject:child]; + break; + } + + } + } + return _visibleChildNodes; +} + +- (void)layoutLayer:(CALayer *)layer +{ + +} +@end diff --git a/Source/DOM classes/Unported or Partial DOM/SVGTextElement.m b/Source/DOM classes/Unported or Partial DOM/SVGTextElement.m index edc024f10..0ac9dd525 100644 --- a/Source/DOM classes/Unported or Partial DOM/SVGTextElement.m +++ b/Source/DOM classes/Unported or Partial DOM/SVGTextElement.m @@ -1,22 +1,16 @@ #import "SVGTextElement.h" #import - -#if TARGET_OS_IPHONE -#import -#endif - #import "SVGElement_ForParser.h" // to resolve Xcode circular dependencies; in long term, parsing SHOULD NOT HAPPEN inside any class whose name starts "SVG" (because those are reserved classes for the SVG Spec) - +#import "SVGGradientLayer.h" #import "SVGHelperUtilities.h" +#import "SVGUtils.h" +#import "SVGTextLayer.h" @implementation SVGTextElement @synthesize transform; // each SVGElement subclass that conforms to protocol "SVGTransformable" has to re-synthesize this to work around bugs in Apple's Objective-C 2.0 design that don't allow @properties to be extended by categories / protocols -- (void)dealloc { - [super dealloc]; -} - (CALayer *) newLayer { @@ -34,7 +28,8 @@ - (CALayer *) newLayer NB: the local bits (x/y offset) have to be pre-transformed by */ - CGAffineTransform textTransformAbsoluteWithLocalPositionOffset = CGAffineTransformConcat( CGAffineTransformMakeTranslation( [self.x pixelsValue], [self.y pixelsValue]), textTransformAbsolute); + CGRect viewport = CGRectFromSVGRect(self.rootOfCurrentDocumentFragment.viewBox); + CGAffineTransform textTransformAbsoluteWithLocalPositionOffset = CGAffineTransformConcat( CGAffineTransformMakeTranslation( [self.x pixelsValueWithDimension:viewport.size.width], [self.y pixelsValueWithDimension:viewport.size.height]), textTransformAbsolute); /** Apple's CATextLayer is poor - one of those classes Apple hasn't finished writing? @@ -49,27 +44,41 @@ - (CALayer *) newLayer But its the easiest way to get FULL control over size/position/rotation/etc in a CALayer */ - NSString* actualSize = [self cascadedValueForStylableProperty:@"font-size"]; - NSString* actualFamily = [self cascadedValueForStylableProperty:@"font-family"]; + + /** + Create font based on many information (font-family, font-weight, etc), fallback to system font when there are no available font matching the information. + */ + UIFont *font = [SVGTextElement matchedFontWithElement:self]; - CGFloat effectiveFontSize = (actualSize.length > 0) ? [actualSize floatValue] : 12; // I chose 12. I couldn't find an official "default" value in the SVG spec. /** Convert the size down using the SVG transform at this point, before we calc the frame size etc */ // effectiveFontSize = CGSizeApplyAffineTransform( CGSizeMake(0,effectiveFontSize), textTransformAbsolute ).height; // NB important that we apply a transform to a "CGSize" here, so that Apple's library handles worrying about whether to ignore skew transforms etc - - /** find a valid font reference, or Apple's APIs will break later */ - /** undocumented Apple bug: CTFontCreateWithName cannot accept nil input*/ - CTFontRef font = NULL; - if( actualFamily != nil) - font = CTFontCreateWithName( (CFStringRef)actualFamily, effectiveFontSize, NULL); - if( font == NULL ) - font = CTFontCreateWithName( (CFStringRef) @"Verdana", effectiveFontSize, NULL); // Spec says to use "whatever default font-family is normal for your system". On iOS, that's Verdana - + /** Convert all whitespace to spaces, and trim leading/trailing (SVG doesn't support leading/trailing whitespace, and doesnt support CR LF etc) */ NSString* effectiveText = self.textContent; // FIXME: this is a TEMPORARY HACK, UNTIL PROPER PARSING OF ELEMENTS IS ADDED effectiveText = [effectiveText stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; effectiveText = [effectiveText stringByReplacingOccurrencesOfString:@"\n" withString:@" "]; + + /** + Stroke color && stroke width + Apple's `CATextLayer` can not stroke gradient on the layer (we can only fill the layer) + */ + CGColorRef strokeColor = [SVGHelperUtilities parseStrokeForElement:self]; + CGFloat strokeWidth = 0; + NSString* actualStrokeWidth = [self cascadedValueForStylableProperty:@"stroke-width"]; + if (actualStrokeWidth) + { + SVGRect r = ((SVGSVGElement*)self.viewportElement).viewport; + strokeWidth = [[SVGLength svgLengthFromNSString:actualStrokeWidth] + pixelsValueWithDimension: hypot(r.width, r.height)]; + } + + /** + Fill color + Apple's `CATextLayer` can be filled using mask. + */ + CGColorRef fillColor = [SVGHelperUtilities parseFillForElement:self]; /** Calculate @@ -78,11 +87,31 @@ - (CALayer *) newLayer 3. Ask apple how big the final thing should be 4. Use that to provide a layer.frame */ - NSMutableAttributedString* tempString = [[[NSMutableAttributedString alloc] initWithString:effectiveText] autorelease]; - [tempString addAttribute:(NSString *)kCTFontAttributeName - value:(id)font - range:NSMakeRange(0, tempString.string.length)]; - CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString( (CFMutableAttributedStringRef) tempString ); + NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] initWithString:effectiveText]; + NSRange stringRange = NSMakeRange(0, attributedString.string.length); + [attributedString addAttribute:NSFontAttributeName + value:font + range:stringRange]; + if (fillColor) { + [attributedString addAttribute:NSForegroundColorAttributeName + value:(__bridge id)fillColor + range:stringRange]; + } + if (strokeWidth != 0 && strokeColor) { + [attributedString addAttribute:NSStrokeColorAttributeName + value:(__bridge id)strokeColor + range:stringRange]; + // If both fill && stroke, pass negative value; only fill, pass positive value + // A typical value for outlined text is 3.0. Actually this is not so accurate, but until we directly draw the text glyph using Core Text, we can not control the detailed stroke width follow SVG spec + CGFloat strokeValue = strokeWidth / 3.0; + if (fillColor) { + strokeValue = -strokeValue; + } + [attributedString addAttribute:NSStrokeWidthAttributeName + value:@(strokeValue) + range:stringRange]; + } + CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString( (CFMutableAttributedStringRef) attributedString ); CGSize suggestedUntransformedSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, 0), NULL, CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX), NULL); CFRelease(framesetter); @@ -91,12 +120,9 @@ - (CALayer *) newLayer suggestedUntransformedSize.width, suggestedUntransformedSize.height); // everything's been pre-scaled by [self transformAbsolute] - CATextLayer *label = [[CATextLayer alloc] init]; + CATextLayer *label = [SVGTextLayer layer]; [SVGHelperUtilities configureCALayer:label usingElement:self]; - label.font = font; /** WARNING: Apple docs say you "CANNOT" assign a UIFont instance here, for some reason they didn't bridge it with CGFont */ - CFRelease(font); - /** This is complicated for three reasons. Partly: Apple and SVG use different defitions for the "origin" of a piece of text Partly: Bugs in Apple's CoreText @@ -125,25 +151,218 @@ - (CALayer *) newLayer If/when Apple fixes their bugs - or if you know enough about their API's to workaround the bugs, feel free to fix this code. */ - CGFloat offsetToConvertSVGOriginToAppleOrigin = - suggestedUntransformedSize.height; + CTLineRef line = CTLineCreateWithAttributedString( (CFMutableAttributedStringRef) attributedString ); + CGFloat ascent = 0; + CTLineGetTypographicBounds(line, &ascent, NULL, NULL); + CFRelease(line); + CGFloat offsetToConvertSVGOriginToAppleOrigin = -ascent; CGSize fakeSizeToApplyNonTranslatingPartsOfTransform = CGSizeMake( 0, offsetToConvertSVGOriginToAppleOrigin); label.position = CGPointMake( 0, 0 + CGSizeApplyAffineTransform( fakeSizeToApplyNonTranslatingPartsOfTransform, textTransformAbsoluteWithLocalPositionOffset).height); - label.anchorPoint = CGPointZero; // WARNING: SVG applies transforms around the top-left as origin, whereas Apple defaults to center as origin, so we tell Apple to work "like SVG" here. + + NSString *textAnchor = [self cascadedValueForStylableProperty:@"text-anchor"]; + if( [@"middle" isEqualToString:textAnchor] ) + label.anchorPoint = CGPointMake(0.5, 0.0); + else if( [@"end" isEqualToString:textAnchor] ) + label.anchorPoint = CGPointMake(1.0, 0.0); + else + label.anchorPoint = CGPointZero; // WARNING: SVG applies transforms around the top-left as origin, whereas Apple defaults to center as origin, so we tell Apple to work "like SVG" here. + label.affineTransform = textTransformAbsoluteWithLocalPositionOffset; - label.fontSize = effectiveFontSize; - label.string = effectiveText; + label.string = [attributedString copy]; label.alignmentMode = kCAAlignmentLeft; - label.foregroundColor = [UIColor blackColor].CGColor; + +#if SVGKIT_MAC + label.contentsScale = [[NSScreen mainScreen] backingScaleFactor]; +#else + label.contentsScale = [[UIScreen mainScreen] scale]; +#endif + + return [self newCALayerForTextLayer:label transformAbsolute:textTransformAbsolute]; /** VERY USEFUL when trying to debug text issues: label.backgroundColor = [UIColor colorWithRed:0.5 green:0 blue:0 alpha:0.5].CGColor; label.borderColor = [UIColor redColor].CGColor; - //DEBUG: DDLogVerbose(@"font size %2.1f at %@ ... final frame of layer = %@", effectiveFontSize, NSStringFromCGPoint(transformedOrigin), NSStringFromCGRect(label.frame)); + //DEBUG: SVGKitLogVerbose(@"font size %2.1f at %@ ... final frame of layer = %@", effectiveFontSize, NSStringFromCGPoint(transformedOrigin), NSStringFromCGRect(label.frame)); */ - - return label; +} + +-(CALayer *) newCALayerForTextLayer:(CATextLayer *)label transformAbsolute:(CGAffineTransform)transformAbsolute +{ + CALayer *fillLayer = label; + NSString* actualFill = [self cascadedValueForStylableProperty:@"fill"]; + + if ( [actualFill hasPrefix:@"url"] ) + { + NSArray *fillArgs = [actualFill componentsSeparatedByCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; + NSString *fillIdArg = fillArgs.firstObject; + NSRange idKeyRange = NSMakeRange(5, fillIdArg.length - 6); + NSString* fillId = [fillIdArg substringWithRange:idKeyRange]; + + /** Replace the return layer with a special layer using the URL fill */ + /** fetch the fill layer by URL using the DOM */ + SVGGradientLayer *gradientLayer = [SVGHelperUtilities getGradientLayerWithId:fillId forElement:self withRect:label.frame transform:transformAbsolute]; + if (gradientLayer) { + gradientLayer.mask = label; + fillLayer = gradientLayer; + } else { + // no gradient, fallback + } + } + + NSString* actualOpacity = [self cascadedValueForStylableProperty:@"opacity" inherit:NO]; + fillLayer.opacity = actualOpacity.length > 0 ? [actualOpacity floatValue] : 1; // unusually, the "opacity" attribute defaults to 1, not 0 + + return fillLayer; +} + +/** + Return the best matched font with all posible CSS font property (like `font-family`, `font-size`, etc) + + @param svgElement svgElement + @return The matched font, or fallback to system font, non-nil + */ ++ (UIFont *)matchedFontWithElement:(SVGElement *)svgElement { + // Using top-level API to walkthough all availble font-family + NSString *actualSize = [svgElement cascadedValueForStylableProperty:@"font-size"]; + NSString *actualFamily = [svgElement cascadedValueForStylableProperty:@"font-family"]; + // TODO- Using font descriptor to match best font consider `font-style`, `font-weight` + NSString *actualFontStyle = [svgElement cascadedValueForStylableProperty:@"font-style"]; + NSString *actualFontWeight = [svgElement cascadedValueForStylableProperty:@"font-weight"]; + NSString *actualFontStretch = [svgElement cascadedValueForStylableProperty:@"font-stretch"]; + + CGFloat effectiveFontSize = (actualSize.length > 0) ? [actualSize floatValue] : 12; // I chose 12. I couldn't find an official "default" value in the SVG spec. + + NSArray *actualFontFamilies = [SVGTextElement fontFamiliesWithCSSValue:actualFamily]; + NSString *matchedFontFamily; + if (actualFontFamilies) { + // walkthrough all available font-families to find the best matched one + NSSet *availableFontFamilies; +#if SVGKIT_MAC + availableFontFamilies = [NSSet setWithArray:NSFontManager.sharedFontManager.availableFontFamilies]; +#else + availableFontFamilies = [NSSet setWithArray:UIFont.familyNames]; +#endif + for (NSString *fontFamily in actualFontFamilies) { + if ([availableFontFamilies containsObject:fontFamily]) { + matchedFontFamily = fontFamily; + break; + } + } + } + + // we provide enough hint information, let Core Text using their algorithm to detect which fontName should be used + // if `matchedFontFamily` is nil, use the system default font family instead (allows `font-weight` these information works) + NSDictionary *attributes = [self fontAttributesWithFontFamily:matchedFontFamily fontStyle:actualFontStyle fontWeight:actualFontWeight fontStretch:actualFontStretch]; + CTFontDescriptorRef descriptor = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attributes); + CTFontRef fontRef = CTFontCreateWithFontDescriptor(descriptor, effectiveFontSize, NULL); + UIFont *font = (__bridge_transfer UIFont *)fontRef; + + return font; +} + +/** + Convert CSS font detailed information into Core Text descriptor attributes (determine the best matched font). + + @param fontFamily fontFamily + @param fontStyle fontStyle + @param fontWeight fontWeight + @param fontStretch fontStretch + @return Core Text descriptor attributes + */ ++ (NSDictionary *)fontAttributesWithFontFamily:(NSString *)fontFamily fontStyle:(NSString *)fontStyle fontWeight:(NSString *)fontWeight fontStretch:(NSString *)fontStretch { + // Default value + if (!fontFamily.length) fontFamily = [self systemDefaultFontFamily]; + if (!fontStyle.length) fontStyle = @"normal"; + if (!fontWeight.length) fontWeight = @"normal"; + if (!fontStretch.length) fontStretch = @"normal"; + + NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; + attributes[(__bridge NSString *)kCTFontFamilyNameAttribute] = fontFamily; + // font-weight is in the sub-dictionary + NSMutableDictionary *traits = [NSMutableDictionary dictionary]; + // CSS font weight is from 0-1000 + CGFloat weight; + if ([fontWeight isEqualToString:@"normal"]) { + weight = 400; + } else if ([fontWeight isEqualToString:@"bold"]) { + weight = 700; + } else if ([fontWeight isEqualToString:@"bolder"]) { + weight = 900; + } else if ([fontWeight isEqualToString:@"lighter"]) { + weight = 100; + } else { + CGFloat value = [fontWeight doubleValue]; + weight = MIN(MAX(value, 1), 1000); + } + // map from CSS [1, 1000] to Core Text [-1.0, 1.0], 400 represent 0.0 + CGFloat coreTextFontWeight; + if (weight < 400) { + coreTextFontWeight = (weight - 400) / 1000 * (1 / 0.4); + } else { + coreTextFontWeight = (weight - 400) / 1000 * (1 / 0.6); + } + + // CSS font style + CTFontSymbolicTraits style = 0; + if ([fontStyle isEqualToString:@"normal"]) { + style |= 0; + } else if ([fontStyle isEqualToString:@"italic"] || [fontStyle rangeOfString:@"oblique"].location != NSNotFound) { + // Actually we can control the detailed slant degree via `kCTFontSlantTrait`, but it's rare usage so treat them the same, TODO in the future + style |= kCTFontItalicTrait; + } + + // CSS font stretch + if ([fontStretch rangeOfString:@"condensed"].location != NSNotFound) { + // Actually we can control the detailed percent via `kCTFontWidthTrait`, but it's rare usage so treat them the same, TODO in the future + style |= kCTFontTraitCondensed; + } else if ([fontStretch rangeOfString:@"expanded"].location != NSNotFound) { + style |= kCTFontTraitExpanded; + } + + traits[(__bridge NSString *)kCTFontSymbolicTrait] = @(style); + traits[(__bridge NSString *)kCTFontWeightTrait] = @(coreTextFontWeight); + attributes[(__bridge NSString *)kCTFontTraitsAttribute] = [traits copy]; + + return [attributes copy]; +} + +/** + Parse the `font-family` CSS value into array of font-family name + + @param value value + @return array of font-family name + */ ++ (NSArray *)fontFamiliesWithCSSValue:(NSString *)value { + if (value.length == 0) { + return nil; + } + NSArray *args = [value componentsSeparatedByString:@","]; + if (args.count == 0) { + return nil; + } + NSMutableArray *fontFamilies = [NSMutableArray arrayWithCapacity:args.count]; + for (NSString *arg in args) { + // parse: font-family: "Goudy Bookletter 1911", sans-serif; + // delete "" + NSString *fontFamily = [arg stringByReplacingOccurrencesOfString:@"\"" withString:@""]; + // trim white space + [fontFamily stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceCharacterSet]; + [fontFamilies addObject:fontFamily]; + } + + return [fontFamilies copy]; +} + ++ (NSString *)systemDefaultFontFamily { + static dispatch_once_t onceToken; + static NSString *fontFamily; + dispatch_once(&onceToken, ^{ + UIFont *font = [UIFont systemFontOfSize:12.f]; + fontFamily = font.familyName; + }); + return fontFamily; } - (void)layoutLayer:(CALayer *)layer diff --git a/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.h b/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.h new file mode 100644 index 000000000..a63ccff0a --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.h @@ -0,0 +1,16 @@ +// +// TinySVGTextAreaElement.h +// SVGKit-iOS +// +// Created by David Gileadi on 8/26/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import "SVGTextElement.h" + +@interface TinySVGTextAreaElement : SVGTextElement + +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ width; +@property(nonatomic,strong,readonly) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ height; + +@end diff --git a/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.m b/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.m new file mode 100644 index 000000000..6ff618765 --- /dev/null +++ b/Source/DOM classes/Unported or Partial DOM/TinySVGTextAreaElement.m @@ -0,0 +1,65 @@ +// +// TinySVGTextAreaElement.m +// SVGKit-iOS +// +// Created by David Gileadi on 8/26/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import "TinySVGTextAreaElement.h" +#import "SVGKParseResult.h" +#import "SVGElement_ForParser.h" + + +@interface TinySVGTextAreaElement() +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ width; +@property(nonatomic,strong,readwrite) SVGLength* /* FIXME: should be SVGAnimatedLengthList */ height; +@end + + +@implementation TinySVGTextAreaElement + +@synthesize width; +@synthesize height; + + +- (void)postProcessAttributesAddingErrorsTo:(SVGKParseResult *)parseResult +{ + [super postProcessAttributesAddingErrorsTo:parseResult]; + + self.width = [self getAttributeAsSVGLength:@"width"]; + self.height = [self getAttributeAsSVGLength:@"height"]; +} + +- (CALayer *) newLayer +{ + CATextLayer *label = (CATextLayer *) [super newLayer]; + + label.wrapped = YES; + + float w = [self.width pixelsValue]; + float h = [self.height pixelsValue]; + if( w > 0 && h > 0 ) { + if( w == 0.0f ) + w = label.bounds.size.width; + if( h == 0.0f ) + h = label.bounds.size.height; + label.bounds = CGRectMake(0, 0, w, h); + } + + NSString* textAlign = [self cascadedValueForStylableProperty:@"text-align"]; + if( [@"start" isEqualToString:textAlign] ) + label.alignmentMode = kCAAlignmentLeft; + else if( [@"center" isEqualToString:textAlign] ) + label.alignmentMode = kCAAlignmentCenter; + else if( [@"end" isEqualToString:textAlign] ) + label.alignmentMode = kCAAlignmentRight; + else if( [@"justify" isEqualToString:textAlign] ) + label.alignmentMode = kCAAlignmentJustified; + + label.position = CGPointZero; + + return label; +} + +@end diff --git a/Source/Exporters/CALayerExporter.h b/Source/Exporters/CALayerExporter.h deleted file mode 100644 index 8a7230bb9..000000000 --- a/Source/Exporters/CALayerExporter.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// CALayerExporter.h -// SVGPad -// -// Created by Steven Fusco on 11/28/11. -// Copyright (c) 2011 __MyCompanyName__. All rights reserved. -// - -#import -#import -#import - -@protocol CALayerExporterDelegate; - -@interface CALayerExporter : NSObject -{ - @private - NSMutableDictionary* propertyRegistry; -} - -@property (readwrite,nonatomic,retain) UIView* rootView; -@property (readwrite,nonatomic,assign) id delegate; - -- (CALayerExporter*) initWithView:(UIView*)v; -- (void) startExport; - -@end - - -@protocol CALayerExporterDelegate - -- (void) layerExporter:(CALayerExporter*)exporter didParseLayer:(CALayer*)layer withStatement:(NSString*)statement; - -@optional - -- (void) layerExporterDidFinish:(CALayerExporter*)exporter; - -@end diff --git a/Source/Exporters/CALayerExporter.m b/Source/Exporters/CALayerExporter.m deleted file mode 100644 index 5ba04b602..000000000 --- a/Source/Exporters/CALayerExporter.m +++ /dev/null @@ -1,283 +0,0 @@ -// -// CALayerExporter.m -// SVGPad -// -// Created by Steven Fusco on 11/28/11. -// Copyright (c) 2011 __MyCompanyName__. All rights reserved. -// - -#import "CALayerExporter.h" - -typedef struct ExportPathCommandsContext { - NSString* pathName; - NSMutableString* pathCommands; -} ExportPathCommandsContext; - -void exportPathCommands(void *exportPathCommandsConextPtr, const CGPathElement *element) -{ - ExportPathCommandsContext* ctx = (ExportPathCommandsContext*) exportPathCommandsConextPtr; - NSMutableString* pathCommands = ctx->pathCommands; - NSString* pathName = ctx-> pathName; - CGPoint* pathPoints = element->points; - switch (element->type) { - case kCGPathElementMoveToPoint: - [pathCommands appendFormat:@"\nCGPathMoveToPoint(%@, NULL, %f, %f);", pathName, pathPoints[0].x, pathPoints[0].y]; - break; - case kCGPathElementAddLineToPoint: - [pathCommands appendFormat:@"\nCGPathAddLineToPoint(%@, NULL, %f, %f);", pathName, pathPoints[0].x, pathPoints[0].y]; - break; - case kCGPathElementAddQuadCurveToPoint: - { - CGFloat cpx = pathPoints[0].x; - CGFloat cpy = pathPoints[0].y; - CGFloat x = pathPoints[1].x; - CGFloat y = pathPoints[1].y; - [pathCommands appendFormat:@"\nCGPathAddQuadCurveToPoint(%@, NULL, %f, %f, %f, %f);", pathName, cpx, cpy, x, y]; - } - break; - case kCGPathElementAddCurveToPoint: - { - CGFloat cp1x = pathPoints[0].x; - CGFloat cp1y = pathPoints[0].y; - CGFloat cp2x = pathPoints[1].x; - CGFloat cp2y = pathPoints[1].y; - CGFloat x = pathPoints[2].x; - CGFloat y = pathPoints[2].y; - [pathCommands appendFormat:@"\nCGPathAddCurveToPoint(%@, NULL, %f, %f, %f, %f, %f, %f);", pathName, cp1x, cp1y, cp2x, cp2y, x, y]; - } - break; - case kCGPathElementCloseSubpath: - [pathCommands appendFormat:@"\nCGPathCloseSubpath(%@);", pathName]; - break; - - default: - break; - } -} - -@interface CALayerExporter(Private) - -- (void)processLayer:(CALayer *)currentLayer index:(NSInteger)index parent:(NSString*)parentName; - -@end - - -@implementation CALayerExporter - -@synthesize delegate; -@synthesize rootView; - -- (id)initWithView:(UIView*)v -{ - self = [super init]; - if (self) { - self.rootView = v; - - propertyRegistry = [[NSMutableDictionary dictionary] retain]; - - NSArray* CALayerProperties = [NSArray arrayWithObjects:@"name", @"bounds", @"frame", nil]; - [propertyRegistry setObject:CALayerProperties - forKey:NSStringFromClass([CALayer class])]; - - NSArray* CAShapeLayerProperties = [NSArray arrayWithObjects:@"path", @"fillColor", @"fillRule", @"strokeColor", @"lineWidth", @"miterLimit", @"lineCap", @"lineJoin", @"lineDashPhase", @"lineDashPattern", nil]; - [propertyRegistry setObject:CAShapeLayerProperties - forKey:NSStringFromClass([CAShapeLayer class])]; - } - return self; -} - -- (void)dealloc { - [rootView release]; - [super dealloc]; -} - -- (void)startExport -{ - if (nil == rootView) { - return; - } - - [self processLayer:self.rootView.layer index:0 parent:@"root"]; - - if ([self.delegate respondsToSelector:@selector(layerExporterDidFinish:)]) { - [self.delegate layerExporterDidFinish:self]; - } -} - -- (void)processLayer:(CALayer *)currentLayer index:(NSInteger)index parent:(NSString*)parentName -{ - NSString* className = NSStringFromClass([currentLayer class]); - NSString* layerName = [NSString stringWithFormat:@"%@_layer%d", parentName, index]; - NSString* createStatement = [NSString stringWithFormat:@"%@* %@ = [[%@ alloc] init];", className, layerName, className]; - - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:createStatement]; - - for (NSString* registeredClassName in [propertyRegistry allKeys]) { - - Class registeredClass = NSClassFromString(registeredClassName); - if ([currentLayer isKindOfClass:registeredClass]) { - - for (NSString* propertyName in [propertyRegistry objectForKey:registeredClassName]) { - - SEL message = NSSelectorFromString(propertyName); - - NSMethodSignature* methodSig = [currentLayer methodSignatureForSelector:message]; - - NSString* propertyValue = nil; - const char * methodReturnType = [methodSig methodReturnType]; - - if (0 == strcmp("@", methodReturnType)) { - - id v = [currentLayer performSelector:message]; - - if (nil == v) { - propertyValue = @"nil"; - } else if ([v isKindOfClass:[NSString class]]) { - propertyValue = [NSString stringWithFormat:@"@\"%@\"", v]; - } else { - propertyValue = NSStringFromClass([v class]); - } - } else { - NSInvocation *inv = [NSInvocation invocationWithMethodSignature:methodSig]; - [inv setSelector:message]; - [inv setTarget:currentLayer]; - [inv invoke]; - - if (0 == strcmp("f", methodReturnType)) { - float r; - [inv getReturnValue:&r]; - propertyValue = [NSString stringWithFormat:@"%f", r]; - } else if (0 == strcmp("{CGRect={CGPoint=ff}{CGSize=ff}}", methodReturnType)) { - CGRect r; - [inv getReturnValue:&r]; - propertyValue = [NSString stringWithFormat:@"CGRectMake(%f, %f, %f, %f)", r.origin.x, r.origin.y, r.size.width, r.size.height]; - } else if (0 == strcmp("^{CGColor=}", methodReturnType)) { - - CGColorRef color; - [inv getReturnValue:&color]; - - if (0 == color) { - propertyValue = @"0"; - } else { - NSString* colorName = [NSString stringWithFormat:@"%@_%@_colorref", layerName, propertyName]; - NSString* spaceName = [colorName stringByAppendingString:@"_colorSpace"]; - NSString* componentsName = [colorName stringByAppendingString:@"_colorComponents"]; - - CGColorSpaceRef colorSpace = CGColorGetColorSpace(color); - - NSMutableString* colorSpaceCreateStatement = [NSMutableString stringWithFormat:@"CGColorSpaceRef %@ = ", spaceName]; - - CGColorSpaceModel colorSpaceModel = CGColorSpaceGetModel(colorSpace); - switch (colorSpaceModel) { - case kCGColorSpaceModelMonochrome: - [colorSpaceCreateStatement appendString:@"CGColorSpaceCreateDeviceGray();"]; - break; - case kCGColorSpaceModelRGB: - [colorSpaceCreateStatement appendString:@"CGColorSpaceCreateDeviceRGB();"]; - break; - case kCGColorSpaceModelCMYK: - [colorSpaceCreateStatement appendString:@"CGColorSpaceCreateDeviceCMYK();"]; - break; - case kCGColorSpaceModelLab: - // CGColorSpaceCreateLab(<#const CGFloat *whitePoint#>, <#const CGFloat *blackPoint#>, <#const CGFloat *range#>) - break; - case kCGColorSpaceModelDeviceN: - // CGColorSpaceCreateWithICCProfile(<#CFDataRef data#>) - break; - case kCGColorSpaceModelIndexed: - // CGColorSpaceCreateIndexed(<#CGColorSpaceRef baseSpace#>, <#size_t lastIndex#>, <#const unsigned char *colorTable#>) - break; - case kCGColorSpaceModelPattern: - // CGColorSpaceCreatePattern(<#CGColorSpaceRef baseSpace#>) - break; - default: - break; - } - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:colorSpaceCreateStatement]; - - const CGFloat* colorComponents = CGColorGetComponents(color); - size_t colorComponentsCount = CGColorGetNumberOfComponents(color); - NSMutableString* colorComponentsCreateStatement = [NSMutableString stringWithFormat:@"CGFloat %@[] = ", componentsName]; - [colorComponentsCreateStatement appendString:@"{"]; - for (int i=0; i != colorComponentsCount; ++i) { - [colorComponentsCreateStatement appendFormat:@"%@%f", ((i != 0) ? @"," : @""), colorComponents[i]]; - } - [colorComponentsCreateStatement appendString:@"};"]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:colorComponentsCreateStatement]; - - NSString* colorCreateStatement = [NSString stringWithFormat:@"CGColorRef %@ = CGColorCreate(%@, %@);", colorName, spaceName, componentsName]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:colorCreateStatement]; - - propertyValue = colorName; - } - - } else if (0 == strcmp("^{CGPath=}", methodReturnType)) { - CGPathRef path; - [inv getReturnValue:&path]; - - if (0 == path) { - propertyValue = @"0"; - } else { - - NSString* pathName = [NSString stringWithFormat:@"%@_%@_pathref", layerName, propertyName]; - NSString* pathCreateStatement = [NSString stringWithFormat:@"CGMutablePathRef %@ = CGPathCreateMutable();", pathName]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:pathCreateStatement]; - - NSMutableString* pathCommands = [NSMutableString string]; - ExportPathCommandsContext exportPathContext; - exportPathContext.pathName = pathName; - exportPathContext.pathCommands = pathCommands; - - CGPathApply(path, &exportPathContext, exportPathCommands); - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:pathCommands]; - - propertyValue = pathName; - } - } else { - propertyValue = [NSString stringWithCString:methodReturnType encoding:NSUTF8StringEncoding]; - } - } - - NSString* propertyAssignmentStatement = [NSString stringWithFormat:@"%@.%@ = %@;", layerName, propertyName, propertyValue]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:propertyAssignmentStatement]; - } - } - } - - - NSString* addSublayerStatement = [NSString stringWithFormat:@"[%@ addSublayer:%@];", parentName, layerName]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:addSublayerStatement]; - - NSString* releaseStatement = [NSString stringWithFormat:@"[%@ release];", layerName]; - [self.delegate layerExporter:self - didParseLayer:currentLayer - withStatement:releaseStatement]; - - int i = index; - for (CALayer* childLayer in currentLayer.sublayers) { - [self processLayer:childLayer index:++i parent:layerName]; - } -} - - - - - -@end - diff --git a/Source/Exporters/SVGKExporterNSData.h b/Source/Exporters/SVGKExporterNSData.h new file mode 100644 index 000000000..497bd7c00 --- /dev/null +++ b/Source/Exporters/SVGKExporterNSData.h @@ -0,0 +1,36 @@ +/** + General-purpose exporter from loaded-SVGKImage object into an NSData byte-array. + + Uses the default color format from [SVGKImage+CGContext newCGContextAutosizedToFit] (currently RGBA / CGColorSpaceCreateDeviceRGB) + */ +#import +#import "SVGKImage.h" + +@interface SVGKExporterNSData : NSObject + +/** + Highest-performance version of .UIImage property (this minimizes memory usage and can lead to large speed-ups e.g. when using SVG images as textures with OpenGLES) + + Delegates to [ exportAsNSData:... flipYaxis:TRUE] + */ ++(NSData*) exportAsNSData:(SVGKImage*) image; + +/** + Highest-performance version of .UIImage property (this minimizes memory usage and can lead to large speed-ups e.g. when using SVG images as textures with OpenGLES) + + Delegates to exportAsNSData:... antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault flipYaxis:...] +*/ ++(NSData*) exportAsNSData:(SVGKImage*) image flipYaxis:(BOOL) flipYaxis; + +/** + Highest-performance version of .UIImage property (this minimizes memory usage and can lead to large speed-ups e.g. when using SVG images as textures with OpenGLES) + + NB: we could probably achieve get even higher performance in OpenGL by sidestepping NSData entirely and using raw byte arrays (should result in zero-copy). + + @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost + @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate + @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality + */ ++(NSData*) exportAsNSData:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis; + +@end diff --git a/Source/Exporters/SVGKExporterNSData.m b/Source/Exporters/SVGKExporterNSData.m new file mode 100644 index 000000000..2afccbac9 --- /dev/null +++ b/Source/Exporters/SVGKExporterNSData.m @@ -0,0 +1,32 @@ +#import "SVGKExporterNSData.h" + +#import "SVGKImage+CGContext.h" // needed for Context calls + +@implementation SVGKExporterNSData + ++(NSData*) exportAsNSData:(SVGKImage*) image +{ + return [self exportAsNSData:image flipYaxis:FALSE]; +} + ++(NSData*) exportAsNSData:(SVGKImage*) image flipYaxis:(BOOL) flipYaxis +{ + return [self exportAsNSData:image antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault flipYaxis:flipYaxis]; +} + ++(NSData*) exportAsNSData:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis +{ + CGContextRef newContext = [image newCGContextAutosizedToFit]; + + [image renderToContext:newContext antiAliased:shouldAntialias curveFlatnessFactor:multiplyFlatness interpolationQuality:interpolationQuality flipYaxis: flipYaxis]; + + void* resultAsVoidStar = CGBitmapContextGetData(newContext); + + size_t dataSize = 4 * image.size.width * image.size.height; // RGBA = 4 8-bit components + NSData* result = [NSData dataWithBytes:resultAsVoidStar length:dataSize]; + + CGContextRelease(newContext); + + return result; +} +@end diff --git a/Source/Exporters/SVGKExporterNSImage.h b/Source/Exporters/SVGKExporterNSImage.h new file mode 100644 index 000000000..5e6eecb45 --- /dev/null +++ b/Source/Exporters/SVGKExporterNSImage.h @@ -0,0 +1,31 @@ +/** + General-purpose exporter from loaded-SVGKImage object into a new, rasterised NSImage. + + Uses the default color format from UIGraphicsBeginImageContextWithOptions(...) + */ +#import +#import "SVGKImage.h" + +@interface SVGKExporterNSImage : NSObject + +/** + Higher-performance version of .NSImage property (the property uses this method, but you can tweak the parameters for better performance / worse accuracy) + + NB: you can get BETTER performance using the exportNSDataAntiAliased: version of this method, becuase you bypass Apple's slow code for making NSImage objects + + Delegates to exportAsNSImage:... antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault] + */ ++(NSImage*) exportAsNSImage:(SVGKImage*) image; + +/** + Higher-performance version of .NSImage property (the property uses this method, but you can tweak the parameters for better performance / worse accuracy) + + NB: you can get BETTER performance using the exportNSDataAntiAliased: version of this method, becuase you bypass Apple's slow code for making NSImage objects + + @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost + @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate + @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality + */ ++(NSImage*) exportAsNSImage:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality; + +@end diff --git a/Source/Exporters/SVGKExporterNSImage.m b/Source/Exporters/SVGKExporterNSImage.m new file mode 100644 index 000000000..f8340a483 --- /dev/null +++ b/Source/Exporters/SVGKExporterNSImage.m @@ -0,0 +1,135 @@ +#import "SVGKExporterNSImage.h" +#import "SVGUtils.h" +#import "SVGKImage+CGContext.h" // needed for Context calls +#import + +@implementation SVGKExporterNSImage + ++(NSImage*) exportAsNSImage:(SVGKImage *)image +{ + return [self exportAsNSImage:image antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault]; +} + ++(NSImage*) exportAsNSImage:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality +{ + if( [image hasSize] ) + { + SVGKitLogVerbose(@"[%@] DEBUG: Generating a NSImage using the current root-object's viewport (may have been overridden by user code): {0,0,%2.3f,%2.3f}", [self class], image.size.width, image.size.height); + + SVGKGraphicsBeginImageContextWithOptions( image.size, FALSE, [NSScreen mainScreen].backingScaleFactor); + CGContextRef context = SVGKGraphicsGetCurrentContext(); + + [image renderToContext:context antiAliased:shouldAntialias curveFlatnessFactor:multiplyFlatness interpolationQuality:interpolationQuality flipYaxis:TRUE]; + + NSImage* result = SVGKGraphicsGetImageFromCurrentImageContext(); + SVGKGraphicsEndImageContext(); + + + return result; + } + else + { + NSAssert(FALSE, @"You asked to export an SVG to bitmap, but the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); + + return nil; + } +} + +static void *kNSGraphicsContextScaleFactorKey; + +static CGContextRef SVGKCreateBitmapContext(CGSize size, BOOL opaque, CGFloat scale) { + size_t width = ceil(size.width * scale); + size_t height = ceil(size.height * scale); + if (width < 1 || height < 1) return NULL; + + //pre-multiplied BGRA for non-opaque, BGRX for opaque, 8-bits per component, as Apple's doc + CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); + CGImageAlphaInfo alphaInfo = kCGBitmapByteOrder32Host | (opaque ? kCGImageAlphaNoneSkipFirst : kCGImageAlphaPremultipliedFirst); + CGContextRef context = CGBitmapContextCreate(NULL, width, height, 8, 0, space, kCGBitmapByteOrderDefault | alphaInfo); + CGColorSpaceRelease(space); + if (!context) { + return NULL; + } + if (scale == 0) { + // Match `UIGraphicsBeginImageContextWithOptions`, reset to the scale factor of the device’s main screen if scale is 0. + scale = [NSScreen mainScreen].backingScaleFactor; + } + CGContextScaleCTM(context, scale, scale); + + return context; +} + +static void SVGKGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) { + CGContextRef context = SVGKCreateBitmapContext(size, opaque, scale); + if (!context) { + return; + } + NSGraphicsContext *graphicsContext; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + if ([NSGraphicsContext respondsToSelector:@selector(graphicsContextWithGraphicsPort:flipped:)]) { + graphicsContext = [NSGraphicsContext graphicsContextWithCGContext:context flipped:NO]; + } else { + graphicsContext = [NSGraphicsContext graphicsContextWithGraphicsPort:context flipped:NO]; + } +#pragma clang diagnostic pop + objc_setAssociatedObject(graphicsContext, &kNSGraphicsContextScaleFactorKey, @(scale), OBJC_ASSOCIATION_RETAIN); + CGContextRelease(context); + [NSGraphicsContext saveGraphicsState]; + NSGraphicsContext.currentContext = graphicsContext; +} + +static CGContextRef SVGKGraphicsGetCurrentContext(void) { + NSGraphicsContext *context = NSGraphicsContext.currentContext; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + if ([context respondsToSelector:@selector(CGContext)]) { + return context.CGContext; + } else { + return context.graphicsPort; + } +#pragma clang diagnostic pop +} + +static void SVGKGraphicsEndImageContext(void) { + [NSGraphicsContext restoreGraphicsState]; +} + +static NSImage * SVGKGraphicsGetImageFromCurrentImageContext(void) { + NSGraphicsContext *context = NSGraphicsContext.currentContext; + CGContextRef contextRef; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunguarded-availability" + if ([context respondsToSelector:@selector(CGContext)]) { + contextRef = context.CGContext; + } else { + contextRef = context.graphicsPort; + } +#pragma clang diagnostic pop + if (!contextRef) { + return nil; + } + CGImageRef imageRef = CGBitmapContextCreateImage(contextRef); + if (!imageRef) { + return nil; + } + CGFloat scale = 0; + NSNumber *scaleFactor = objc_getAssociatedObject(context, &kNSGraphicsContextScaleFactorKey); + if ([scaleFactor isKindOfClass:[NSNumber class]]) { + scale = scaleFactor.doubleValue; + } + if (!scale) { + // reset to the scale factor of the device’s main screen if scale is 0. + scale = [NSScreen mainScreen].backingScaleFactor; + } + NSBitmapImageRep *imageRep = [[NSBitmapImageRep alloc] initWithCGImage:imageRef]; + CGFloat pixelWidth = imageRep.pixelsWide; + CGFloat pixelHeight = imageRep.pixelsHigh; + NSSize size = NSMakeSize(pixelWidth / scale, pixelHeight / scale); + NSImage *image = [[NSImage alloc] initWithSize:size]; + [image addRepresentation:imageRep]; + CGImageRelease(imageRef); + return image; +} + +@end diff --git a/Source/Exporters/SVGKExporterUIImage.h b/Source/Exporters/SVGKExporterUIImage.h new file mode 100644 index 000000000..ed8d9ca29 --- /dev/null +++ b/Source/Exporters/SVGKExporterUIImage.h @@ -0,0 +1,31 @@ +/** + General-purpose exporter from loaded-SVGKImage object into a new, rasterised UIImage. + + Uses the default color format from UIGraphicsBeginImageContextWithOptions(...) + */ +#import +#import "SVGKImage.h" + +@interface SVGKExporterUIImage : NSObject + +/** + Higher-performance version of .UIImage property (the property uses this method, but you can tweak the parameters for better performance / worse accuracy) + + NB: you can get BETTER performance using the exportNSDataAntiAliased: version of this method, becuase you bypass Apple's slow code for making UIImage objects + + Delegates to exportAsUIImage:... antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault] + */ ++(UIImage*) exportAsUIImage:(SVGKImage*) image; + +/** + Higher-performance version of .UIImage property (the property uses this method, but you can tweak the parameters for better performance / worse accuracy) + + NB: you can get BETTER performance using the exportNSDataAntiAliased: version of this method, becuase you bypass Apple's slow code for making UIImage objects + + @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost + @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate + @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality + */ ++(UIImage*) exportAsUIImage:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality; + +@end diff --git a/Source/Exporters/SVGKExporterUIImage.m b/Source/Exporters/SVGKExporterUIImage.m new file mode 100644 index 000000000..d218e0f0a --- /dev/null +++ b/Source/Exporters/SVGKExporterUIImage.m @@ -0,0 +1,37 @@ +#import "SVGKExporterUIImage.h" + +#import "SVGKImage+CGContext.h" // needed for Context calls + +@implementation SVGKExporterUIImage + ++(UIImage*) exportAsUIImage:(SVGKImage *)image +{ + return [self exportAsUIImage:image antiAliased:TRUE curveFlatnessFactor:1.0 interpolationQuality:kCGInterpolationDefault]; +} + ++(UIImage*) exportAsUIImage:(SVGKImage*) image antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality +{ + if( [image hasSize] ) + { + SVGKitLogVerbose(@"[%@] DEBUG: Generating a UIImage using the current root-object's viewport (may have been overridden by user code): {0,0,%2.3f,%2.3f}", [self class], image.size.width, image.size.height); + + UIGraphicsBeginImageContextWithOptions( image.size, FALSE, [UIScreen mainScreen].scale ); + CGContextRef context = UIGraphicsGetCurrentContext(); + + [image renderToContext:context antiAliased:shouldAntialias curveFlatnessFactor:multiplyFlatness interpolationQuality:interpolationQuality flipYaxis:FALSE]; + + UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + + return result; + } + else + { + NSAssert(FALSE, @"You asked to export an SVG to bitmap, but the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); + + return nil; + } +} + +@end diff --git a/Source/Exporters/SVGKImage+CGContext.h b/Source/Exporters/SVGKImage+CGContext.h new file mode 100644 index 000000000..28b2daf3a --- /dev/null +++ b/Source/Exporters/SVGKImage+CGContext.h @@ -0,0 +1,34 @@ +/** + Contains methods for low-level exporting of SVGKImage into CGContext's / OpenGL textures / etc + + Process: + 1. Create a CGContextRef; either use your own code (e.g. with OpenGL, you usually want to do this by hand and check PoT), + or use the [self newCGContextAutosizedToFit] method. + 2. Use the renderToContext:::: method (preferred) or the pure, low-level renderInContext: method (not preferred) to + draw into your context + 3. ...do whatever you want with the results (e.g. use one of the Exporters to export it to raw NSData bytes, or similar) + */ +#import "SVGKImage.h" + +@interface SVGKImage (CGContext) + +/** Creates a CGContext with correct pixel size using sizing info from the source SVG (or returns NULL if that's not possible) + */ +-(CGContextRef) newCGContextAutosizedToFit; + +/** + WARNING: due to bugs in Apple's code (c.f. CALayer.h header file for notes from Apple - they say "use caution"), + this method is NOT a perfect render of CA; it uses Apple's own "approximation", as used in [CALayer renderInContext:], + which ignores e.g. masking and some other CA core features + + Generally, for performance and safety, you should use renderToContext:antiAliased:curveFlatnessFactor:interpolationQuality:flipYaxis: + instead of this method (it performs checks and optional performance optimizations) + */ +- (void)renderInContext:(CGContextRef)ctx; + +/** + The standard basic method used by all the different "export..." methods in this class and others + */ +-(void) renderToContext:(CGContextRef) context antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis; + +@end diff --git a/Source/Exporters/SVGKImage+CGContext.m b/Source/Exporters/SVGKImage+CGContext.m new file mode 100644 index 000000000..7e402f4f0 --- /dev/null +++ b/Source/Exporters/SVGKImage+CGContext.m @@ -0,0 +1,98 @@ +// +// SVGKImage+CGContext.m +// SVGKit-iOS +// +// Created by adam on 22/12/2013. +// Copyright (c) 2013 na. All rights reserved. +// + +#import "SVGKImage+CGContext.h" + +#import "SVGRect.h" +#import "SVGSVGElement.h" + +@implementation SVGKImage (CGContext) + +-(CGContextRef) newCGContextAutosizedToFit +{ + NSAssert( [self hasSize], @"Cannot export this image because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); + if( ! [self hasSize] ) + return NULL; + + SVGKitLogVerbose(@"[%@] DEBUG: Generating a CGContextRef using the current root-object's viewport (may have been overridden by user code): {0,0,%2.3f,%2.3f}", [self class], self.size.width, self.size.height); + + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); + CGContextRef context = CGBitmapContextCreate( NULL/*malloc( self.size.width * self.size.height * 4 )*/, self.size.width, self.size.height, 8, 4 * self.size.width, colorSpace, (CGBitmapInfo)kCGImageAlphaNoneSkipLast ); + CGColorSpaceRelease( colorSpace ); + + return context; +} + +- (void)renderInContext:(CGContextRef)ctx +{ + [self.CALayerTree renderInContext:ctx]; +} + +/** + Shared between multiple different "export..." methods + */ +-(void) renderToContext:(CGContextRef) context antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis +{ + NSAssert( [self hasSize], @"Cannot scale this image because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); + + NSDate* startTime; + + startTime = [NSDate date]; + + if( SVGRectIsInitialized(self.DOMTree.viewport) ) + SVGKitLogInfo(@"[%@] DEBUG: rendering to CGContext using the current root-object's viewport (may have been overridden by user code): %@", [self class], NSStringFromSVGRect(self.DOMTree.viewport) ); + + /** Typically a 10% performance improvement right here */ + if( !shouldAntialias ) + CGContextSetShouldAntialias( context, FALSE ); + + /** Apple refuses to let you reset this, because they are selfish */ + CGContextSetFlatness( context, multiplyFlatness ); + + /** Apple's own performance hints system */ + CGContextSetInterpolationQuality( context, interpolationQuality ); + + /** Quartz, CoreGraphics, and CoreAnimation all use an "upside-down" co-ordinate system. + This means that images rendered are upside down. + + Apple's UIImage class automatically "un-flips" this - but if you are rendering raw NSData (which is 5x-10x faster than creating UIImages!) then the flipping is "lost" + by Apple's API's. + + The only way to fix it is to pre-transform by y = -y + + This is VERY useful if you want to render SVG's into OpenGL textures! + */ + if( flipYaxis ) + { + NSAssert( [self hasSize], @"Cannot flip this image in Y because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be treated as (by calling .size = something on this SVGKImage instance"); + + CGContextTranslateCTM(context, 0, self.size.height ); + CGContextScaleCTM(context, 1.0, -1.0); + } + + /** + The method that everyone hates, because Apple refuses to fix / implement it properly: renderInContext: + + It's slow. + + It's broken (according to the official API docs) + + But ... it's all that Apple gives us + */ + [self renderInContext:context]; + + NSMutableString* perfImprovements = [NSMutableString string]; + if( shouldAntialias ) + [perfImprovements appendString:@" NO-ANTI-ALIAS"]; + if( perfImprovements.length < 1 ) + [perfImprovements appendString:@"NONE"]; + + SVGKitLogVerbose(@"[%@] renderToContext: time taken to render CALayers to CGContext (perf improvements:%@): %2.3f seconds)", [self class], perfImprovements, -1.0f * [startTime timeIntervalSinceNow] ); +} + +@end diff --git a/Source/UIKit additions/NSCharacterSet+SVGKExtensions.h b/Source/Foundation additions/NSCharacterSet+SVGKExtensions.h similarity index 100% rename from Source/UIKit additions/NSCharacterSet+SVGKExtensions.h rename to Source/Foundation additions/NSCharacterSet+SVGKExtensions.h diff --git a/Source/UIKit additions/NSCharacterSet+SVGKExtensions.m b/Source/Foundation additions/NSCharacterSet+SVGKExtensions.m similarity index 76% rename from Source/UIKit additions/NSCharacterSet+SVGKExtensions.m rename to Source/Foundation additions/NSCharacterSet+SVGKExtensions.m index 31231b406..842880963 100644 --- a/Source/UIKit additions/NSCharacterSet+SVGKExtensions.m +++ b/Source/Foundation additions/NSCharacterSet+SVGKExtensions.m @@ -19,8 +19,9 @@ + (NSCharacterSet *)SVGWhitespaceCharacterSet; static NSCharacterSet *sWhitespaceCharacterSet = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ + SVGKitLogVerbose(@"Allocating static NSCharacterSet containing whitespace characters. Should be small, but Apple seems to take up 5+ megabytes each time?"); sWhitespaceCharacterSet = [NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat:@"%c%c%c%c", 0x20, 0x9, 0xD, 0xA]]; - [sWhitespaceCharacterSet retain]; // required, this is a non-ARC project. + // required, this is a non-ARC project. }); return sWhitespaceCharacterSet; diff --git a/Source/Foundation additions/NSData+NSInputStream.h b/Source/Foundation additions/NSData+NSInputStream.h new file mode 100644 index 000000000..0adffb770 --- /dev/null +++ b/Source/Foundation additions/NSData+NSInputStream.h @@ -0,0 +1,20 @@ +// +// NSData+NSInputStream.h +// Tidbits +// +// Created by Ewan Mellor on 6/16/13. +// Copyright (c) 2013 Tipbit, Inc. All rights reserved. +// + +#import + +@interface NSData (NSInputStream) + +/** + * @param capacity May be NSUIntegerMax, in which case just an ordinary [NSMutableData data] is used. Otherwise this is given to NSMutableData dataWithCapacity:]. + * @param error May be nil. + * @return The data or nil on failure in which case *error will be set. + */ ++(NSData*)dataWithContentsOfStream:(NSInputStream*)input initialCapacity:(NSUInteger)capacity error:(NSError **)error; + +@end diff --git a/Source/Foundation additions/NSData+NSInputStream.m b/Source/Foundation additions/NSData+NSInputStream.m new file mode 100644 index 000000000..967ec98e7 --- /dev/null +++ b/Source/Foundation additions/NSData+NSInputStream.m @@ -0,0 +1,66 @@ +// +// NSData+NSInputStream.m +// Tidbits +// +// Created by Ewan Mellor on 6/16/13. +// Copyright (c) 2013 Tipbit, Inc. All rights reserved. +// + +#import "NSData+NSInputStream.h" + + +#define BUFSIZE 65536U + + +@implementation NSData (NSInputStream) + + ++(NSData *)dataWithContentsOfStream:(NSInputStream *)input initialCapacity:(NSUInteger)capacity error:(NSError **)error { + if (!input) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:ENOENT userInfo:nil]; + } + return nil; + } + size_t bufsize = MIN(BUFSIZE, capacity); + uint8_t * buf = malloc(bufsize); + if (buf == NULL) { + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:ENOMEM userInfo:nil]; + } + return nil; + } + + NSMutableData* result = capacity == NSUIntegerMax ? [NSMutableData data] : [NSMutableData dataWithCapacity:capacity]; + @try { + while (true) { + NSInteger n = [input read:buf maxLength:bufsize]; + if (n < 0) { + result = nil; + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:nil]; + } + break; + } + else if (n == 0) { + break; + } + else { + [result appendBytes:buf length:n]; + } + } + } + @catch (NSException * exn) { + SVGKitLogWarn(@"[%@] WARNING: caught exception writing to file: %@", [self class], exn); + result = nil; + if (error) { + *error = [NSError errorWithDomain:NSPOSIXErrorDomain code:EIO userInfo:nil]; + } + } + + free(buf); + return result; +} + + +@end diff --git a/Source/Parsers/Parser Extensions/SVGKParserDOM.m b/Source/Parsers/Parser Extensions/SVGKParserDOM.m index 7fb203a59..19d825f8b 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserDOM.m +++ b/Source/Parsers/Parser Extensions/SVGKParserDOM.m @@ -29,7 +29,7 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource /** NB: must supply a NON-qualified name if we have no specific prefix here ! */ // FIXME: we always return an empty Element here; for DOM spec, should we be detecting things like "comment" nodes? I dont know how libxml handles those and sends them to us. I've never seen one in action... - Element *blankElement = [[[Element alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributeObjects] autorelease]; + Element *blankElement = [[Element alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributeObjects]; return blankElement; } diff --git a/Source/Parsers/Parser Extensions/SVGKParserDefsAndUse.m b/Source/Parsers/Parser Extensions/SVGKParserDefsAndUse.m index 737791ee1..62daa03eb 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserDefsAndUse.m +++ b/Source/Parsers/Parser Extensions/SVGKParserDefsAndUse.m @@ -29,7 +29,7 @@ -(NSArray*) supportedTags -(SVGElementInstance*) convertSVGElementToElementInstanceTree:(SVGElement*) original outermostUseElement:(SVGUseElement*) outermostUseElement { - SVGElementInstance* instance = [[[SVGElementInstance alloc] init] autorelease]; + SVGElementInstance* instance = [[SVGElementInstance alloc] init]; instance.correspondingElement = original; instance.correspondingUseElement = outermostUseElement; @@ -57,25 +57,25 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource if( [name isEqualToString:@"defs"]) { /** NB: must supply a NON-qualified name if we have no specific prefix here ! */ - SVGDefsElement *element = [[[SVGDefsElement alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes] autorelease]; + SVGDefsElement *element = [[SVGDefsElement alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes]; return element; } else if( [name isEqualToString:@"use"]) { /** NB: must supply a NON-qualified name if we have no specific prefix here ! */ - SVGUseElement *useElement = [[[SVGUseElement alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes] autorelease]; + SVGUseElement *useElement = [[SVGUseElement alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes]; [useElement postProcessAttributesAddingErrorsTo:parseResult]; // handles "transform" and "style" if( [attributes valueForKey:@"x"] != nil ) useElement.x = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"x"]) value]]; if( [attributes valueForKey:@"y"] != nil ) - useElement.x = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"y"]) value]]; + useElement.y = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"y"]) value]]; if( [attributes valueForKey:@"width"] != nil ) - useElement.x = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"width"]) value]]; + useElement.width = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"width"]) value]]; if( [attributes valueForKey:@"height"] != nil ) - useElement.x = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"height"]) value]]; + useElement.height = [SVGLength svgLengthFromNSString:[((Attr*)[attributes valueForKey:@"height"]) value]]; NSString* hrefAttribute = [useElement getAttributeNS:@"http://www.w3.org/1999/xlink" localName:@"href"]; @@ -83,15 +83,20 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource if( [hrefAttribute length] > 0 ) { NSString* linkHref = [((Attr*)[attributes valueForKey:@"xlink:href"]) value]; - - NSAssert( [linkHref hasPrefix:@"#"], @"Not supported: tags that declare an href to something that DOESN'T begin with #. Href supplied = %@", linkHref ); + /** support `url(#id) funcIRI as well to follow SVG spec` */ + if ([linkHref hasPrefix:@"url"]) { + NSRange range = NSMakeRange(4, linkHref.length - 5); + linkHref = [linkHref substringWithRange:range]; + } + + NSAssert( [linkHref hasPrefix:@"#"], @"Not supported: tags that declare an href to something that DOESN'T begin with #. Href supplied = %@", linkHref ); linkHref = [linkHref substringFromIndex:1]; /** have to find the node in the DOM tree with id = xlink:href's value */ SVGElement* linkedElement = (SVGElement*) [parseResult.parsedDocument getElementById:linkHref]; - NSAssert( linkedElement != nil, @"Found an SVG tag that points to a non-existent element. Missing element: id = ", linkHref ); + NSAssert( linkedElement != nil, @"Found an SVG tag that points to a non-existent element. Missing element: id = %@", linkHref ); useElement.instanceRoot = [self convertSVGElementToElementInstanceTree:linkedElement outermostUseElement:useElement]; diff --git a/Source/Parsers/Parser Extensions/SVGKParserGradient.m b/Source/Parsers/Parser Extensions/SVGKParserGradient.m index 3dc4c1804..f78ee5544 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserGradient.m +++ b/Source/Parsers/Parser Extensions/SVGKParserGradient.m @@ -13,42 +13,45 @@ #import "SVGGradientStop.h" #import "SVGGradientElement.h" +#import "SVGLinearGradientElement.h" +#import "SVGRadialGradientElement.h" + +@interface SVGKParserGradient () +@property (nonatomic) NSArray *supportedNamespaces; +@property (nonatomic) NSArray *supportedTags; +@end @implementation SVGKParserGradient -//-(NSSet*) supportedNamespaces -//{ -// if( self->_supportedNamespaces == nil ) -// self->_supportedNamespaces = [[NSSet alloc] initWithObjects: -// @"http://www.w3.org/2000/svg", -// nil]; -// return self->_supportedNamespaces; -//} +-(NSArray *)supportedNamespaces +{ + if( _supportedNamespaces == nil ) + _supportedNamespaces = @[@"http://www.w3.org/2000/svg"]; + return _supportedNamespaces; +} -static NSSet *_svgGradientParserSupportedTags = nil; --(NSSet *)supportedTags +-(NSArray *)supportedTags { -// static NSSet *supportedTags = nil; - if( _svgGradientParserSupportedTags == nil ) - _svgGradientParserSupportedTags = [[NSSet alloc] initWithObjects:@"linearGradient", @"radialGradient", @"stop", nil]; - return _svgGradientParserSupportedTags; + if( _supportedTags == nil ) + _supportedTags = @[@"linearGradient", @"radialGradient", @"stop"]; + return _supportedTags; } -(Node *)handleStartElement:(NSString *)name document:(SVGKSource *)document namePrefix:(NSString *)prefix namespaceURI:(NSString *)XMLNSURI attributes:(NSMutableDictionary *)attributes parseResult:(SVGKParseResult *)parseResult parentNode:(Node *)parentNode -{ -// SVGColor startColor = SVGColorFromString(<#const char *string#>) -// CGPoint startPos = CGPointMake([attributes objectFor, <#CGFloat y#>) - +{ Node *returnObject = nil; - NSRange range = [name rangeOfString:@"Gradient"]; - if( ( range.location != NSNotFound) ) + if( [name isEqualToString:@"linearGradient"] ) { - returnObject = currentElement = [[SVGGradientElement alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes]; + returnObject = currentElement = [[SVGLinearGradientElement alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes]; [currentElement postProcessAttributesAddingErrorsTo:parseResult]; /** No need to "store" anything; the node has been parsed, it'll be added to the DOM tree, and accessible later via DOM methods -- which is what the SVG spec expects us to do */ } + else if( [name isEqualToString:@"radialGradient"] ) { + returnObject = currentElement = [[SVGRadialGradientElement alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes]; + [currentElement postProcessAttributesAddingErrorsTo:parseResult]; + } else if( [name isEqualToString:@"stop"] ) { SVGGradientStop *gradientStop = [[SVGGradientStop alloc] initWithQualifiedName:name inNameSpaceURI:XMLNSURI attributes:attributes]; @@ -80,7 +83,7 @@ -(Node *)handleStartElement:(NSString *)name document:(SVGKSource *)document nam //                                                 linearGrad.y2 = xml_grad.@y2; //                                         else if(linearGrad.y2 == null) //                                                 linearGrad.y2 = "0%"; - return [returnObject autorelease]; + return returnObject; } -(void)handleEndElement:(Node *)newNode document:(SVGKSource *)document parseResult:(SVGKParseResult *)parseResult @@ -95,13 +98,6 @@ -(void)handleEndElement:(Node *)newNode document:(SVGKSource *)document parseRes //} -+(void)trim -{ - [_svgGradientParserSupportedTags release]; - _svgGradientParserSupportedTags = nil; -} - - @end @@ -244,4 +240,4 @@ +(void)trim                         //                                                 return grad; -*/ \ No newline at end of file +*/ diff --git a/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.h b/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.h index 7d424ad1d..2c0a8f649 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.h +++ b/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.h @@ -6,8 +6,6 @@ // Copyright (c) 2012 __MyCompanyName__. All rights reserved. // -#import - #import "SVGKParser.h" @interface SVGKParserPatternsAndGradients : NSObject diff --git a/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.m b/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.m index 8fc9ec4ab..7170855e5 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.m +++ b/Source/Parsers/Parser Extensions/SVGKParserPatternsAndGradients.m @@ -24,10 +24,6 @@ @implementation SVGKParserPatternsAndGradients -- (void)dealloc { - - [super dealloc]; -} -(NSArray*) supportedNamespaces { diff --git a/Source/Parsers/Parser Extensions/SVGKParserSVG.m b/Source/Parsers/Parser Extensions/SVGKParserSVG.m index 85b8d98d5..172653ffe 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserSVG.m +++ b/Source/Parsers/Parser Extensions/SVGKParserSVG.m @@ -2,6 +2,7 @@ #import "SVGSVGElement.h" #import "SVGCircleElement.h" +#import "SVGClipPathElement.h" #import "SVGDefsElement.h" #import "SVGDescriptionElement.h" //#import "SVGKSource.h" @@ -13,67 +14,66 @@ #import "SVGPolygonElement.h" #import "SVGPolylineElement.h" #import "SVGRectElement.h" +#import "SVGSwitchElement.h" #import "SVGTitleElement.h" #import "SVGTextElement.h" +#import "TinySVGTextAreaElement.h" #import "SVGDocument_Mutable.h" -@implementation SVGKParserSVG - -static NSDictionary *elementMap; +@interface SVGKParserSVG () +@property (nonatomic) NSArray *supportedNamespaces; +@property (nonatomic) NSDictionary *elementMap; +@end -- (id)init { - self = [super init]; - if (self) { - - if (!elementMap) { - elementMap = [[NSDictionary dictionaryWithObjectsAndKeys: - [SVGSVGElement class], @"svg", - [SVGCircleElement class], @"circle", - [SVGDescriptionElement class], @"description", - [SVGEllipseElement class], @"ellipse", - [SVGGElement class], @"g", - [SVGImageElement class], @"image", - [SVGLineElement class], @"line", - [SVGPathElement class], @"path", - [SVGPolygonElement class], @"polygon", - [SVGPolylineElement class], @"polyline", - [SVGRectElement class], @"rect", - [SVGTitleElement class], @"title", - [SVGTextElement class], @"text", - nil] retain]; - } - } - return self; -} +@implementation SVGKParserSVG -- (void)dealloc { - - [super dealloc]; +- (NSDictionary *)elementMap { + if (!_elementMap) { + _elementMap = [NSDictionary dictionaryWithObjectsAndKeys: + [SVGSVGElement class], @"svg", + [SVGCircleElement class], @"circle", + [SVGDescriptionElement class], @"description", + [SVGEllipseElement class], @"ellipse", + [SVGGElement class], @"g", + [SVGClipPathElement class], @"clipPath", + [SVGImageElement class], @"image", + [SVGLineElement class], @"line", + [SVGPathElement class], @"path", + [SVGPolygonElement class], @"polygon", + [SVGPolylineElement class], @"polyline", + [SVGRectElement class], @"rect", + [SVGSwitchElement class], @"switch", + [SVGTitleElement class], @"title", + [SVGTextElement class], @"text", + [TinySVGTextAreaElement class], @"textArea", + nil]; + } + return _elementMap; } --(NSArray*) supportedNamespaces +-(NSArray *)supportedNamespaces { - return [NSArray arrayWithObjects: - @"http://www.w3.org/2000/svg", - nil]; + if( _supportedNamespaces == nil ) + _supportedNamespaces = @[@"http://www.w3.org/2000/svg"]; + return _supportedNamespaces; } /** "tags supported" is exactly the set of all SVGElement subclasses that already exist */ -(NSArray*) supportedTags { - return [NSMutableArray arrayWithArray:[elementMap allKeys]]; + return [self.elementMap allKeys]; } - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource namePrefix:(NSString*)prefix namespaceURI:(NSString*) XMLNSURI attributes:(NSMutableDictionary *)attributes parseResult:(SVGKParseResult *)parseResult parentNode:(Node*) parentNode { if( [[self supportedNamespaces] containsObject:XMLNSURI] ) { - Class elementClass = [elementMap objectForKey:name]; + Class elementClass = [self.elementMap objectForKey:name]; if (!elementClass) { elementClass = [SVGElement class]; - DDLogWarn(@"Support for '%@' element has not been implemented", name); + SVGKitLogWarn(@"Support for '%@' element has not been implemented", name); } /** @@ -89,7 +89,7 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource NSString* qualifiedName = (prefix == nil) ? name : [NSString stringWithFormat:@"%@:%@", prefix, name]; /** NB: must supply a NON-qualified name if we have no specific prefix here ! */ - SVGElement *element = [[[elementClass alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes] autorelease]; + SVGElement *element = [[elementClass alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes]; /** NB: all the interesting handling of shared / generic attributes - e.g. the whole of CSS styling etc - takes place in this method: */ [element postProcessAttributesAddingErrorsTo:parseResult]; @@ -97,6 +97,8 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource /** special case: */ if( [@"svg" isEqualToString:name] ) { + ((SVGSVGElement *) element).source = SVGKSource; + NSString* svgVersion = nil; /** According to spec, if the first XML node is an SVG node, then it @@ -160,7 +162,7 @@ - (Node*) handleStartElement:(NSString *)name document:(SVGKSource*) SVGKSource { NSAssert( [element isKindOfClass:[SVGSVGElement class]], @"Trying to create a new internal SVGDocument from a Node that is NOT of type SVGSVGElement (tag: svg). Node was of type: %@", NSStringFromClass([element class])); - SVGDocument* newDocument = [[[SVGDocument alloc] init] autorelease]; + SVGDocument* newDocument = [[SVGDocument alloc] init]; newDocument.rootElement = (SVGSVGElement*) element; if( overwriteRootSVGDocument ) diff --git a/Source/Parsers/Parser Extensions/SVGKParserStyles.m b/Source/Parsers/Parser Extensions/SVGKParserStyles.m index 2fdd1e8d0..72528b920 100644 --- a/Source/Parsers/Parser Extensions/SVGKParserStyles.m +++ b/Source/Parsers/Parser Extensions/SVGKParserStyles.m @@ -11,25 +11,25 @@ #import "CSSStyleSheet.h" #import "StyleSheetList+Mutable.h" -@implementation SVGKParserStyles +@interface SVGKParserStyles () +@property (nonatomic) NSArray *supportedNamespaces; +@property (nonatomic) NSArray *supportedTags; +@end +@implementation SVGKParserStyles -static NSSet *_svgParserStylesSupportedNamespaces = nil; --(NSSet *) supportedNamespaces +-(NSArray *)supportedNamespaces { - if( _svgParserStylesSupportedNamespaces == nil ) - _svgParserStylesSupportedNamespaces = [[NSSet alloc] initWithObjects: - @"http://www.w3.org/2000/svg", - nil]; - return _svgParserStylesSupportedNamespaces; + if( _supportedNamespaces == nil ) + _supportedNamespaces = @[@"http://www.w3.org/2000/svg"]; + return _supportedNamespaces; } -static NSSet *_svgParserStylesSupportedTags = nil; --(NSSet *)supportedTags +-(NSArray *)supportedTags { - if( _svgParserStylesSupportedTags == nil ) - _svgParserStylesSupportedTags = [[NSSet alloc] initWithObjects:@"style", nil]; - return _svgParserStylesSupportedTags; + if( _supportedTags == nil ) + _supportedTags = @[@"style"]; + return _supportedTags; } -(Node *)handleStartElement:(NSString *)name document:(SVGKSource *)document namePrefix:(NSString *)prefix namespaceURI:(NSString *)XMLNSURI attributes:(NSMutableDictionary *)attributes parseResult:(SVGKParseResult *)parseResult parentNode:(Node *)parentNode @@ -49,7 +49,7 @@ -(Node *)handleStartElement:(NSString *)name document:(SVGKSource *)document nam /** NB: must supply a NON-qualified name if we have no specific prefix here ! */ // FIXME: we always return an empty Element here; for DOM spec, should we be detecting things like "comment" nodes? I dont know how libxml handles those and sends them to us. I've never seen one in action... - Element *blankElement = [[[Element alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes] autorelease]; + Element *blankElement = [[Element alloc] initWithQualifiedName:qualifiedName inNameSpaceURI:XMLNSURI attributes:attributes]; return blankElement; } @@ -64,28 +64,11 @@ -(void)handleEndElement:(Node *)newNode document:(SVGKSource *)document parseRes if( c.length > 0 ) { - CSSStyleSheet* parsedStylesheet = [[[CSSStyleSheet alloc] initWithString:c] autorelease]; + CSSStyleSheet* parsedStylesheet = [[CSSStyleSheet alloc] initWithString:c]; [parseResult.parsedDocument.rootElement.styleSheets.internalArray addObject:parsedStylesheet]; } } --(void) dealloc -{ -// [_tags release]; -// [_namespaces release]; - - [super dealloc]; -} - -+(void)trim -{ - [_svgParserStylesSupportedTags release]; - _svgParserStylesSupportedTags = nil; - - [_svgParserStylesSupportedNamespaces release]; - _svgParserStylesSupportedNamespaces = nil; -} - @end diff --git a/Source/Parsers/SVGKParseResult.h b/Source/Parsers/SVGKParseResult.h index 2d239623b..ade7b33e0 100644 --- a/Source/Parsers/SVGKParseResult.h +++ b/Source/Parsers/SVGKParseResult.h @@ -12,13 +12,15 @@ @interface SVGKParseResult : NSObject -@property(nonatomic, retain) NSMutableArray* warnings, * errorsRecoverable, * errorsFatal; +@property(nonatomic, strong) NSMutableArray* warnings, * errorsRecoverable, * errorsFatal; @property(nonatomic) BOOL libXMLFailed; +/** 0.0 = no parsing done yet, 0.x = partially parsed, 1.0 = parse complete (no fatal errors) */ +@property(nonatomic) double parseProgressFractionApproximate; -@property(nonatomic,retain) SVGSVGElement* rootOfSVGTree; /*< both are needed, see spec */ -@property(nonatomic,retain) SVGDocument* parsedDocument; /*< both are needed, see spec */ +@property(nonatomic,strong) SVGSVGElement* rootOfSVGTree; /**< both are needed, see spec */ +@property(nonatomic,strong) SVGDocument* parsedDocument; /**< both are needed, see spec */ -@property(nonatomic,retain) NSMutableDictionary* namespacesEncountered; /**< maps "prefix" to "uri" */ +@property(nonatomic,strong) NSMutableDictionary* namespacesEncountered; /**< maps "prefix" to "uri" */ -(void) addSourceError:(NSError*) fatalError; -(void) addParseWarning:(NSError*) warning; diff --git a/Source/Parsers/SVGKParseResult.m b/Source/Parsers/SVGKParseResult.m index 2aa553ead..7d85e73bc 100644 --- a/Source/Parsers/SVGKParseResult.m +++ b/Source/Parsers/SVGKParseResult.m @@ -10,16 +10,6 @@ @implementation SVGKParseResult @synthesize extensionsData; #endif --(void)dealloc { - self.warnings = nil; - self.errorsRecoverable = nil; - self.errorsFatal = nil; - self.namespacesEncountered = nil; - self.parsedDocument = nil; - self.rootOfSVGTree = nil; - - [super dealloc]; -} - (id)init { @@ -37,33 +27,39 @@ - (id)init } return self; } + +-(NSString *)description +{ + return [NSString stringWithFormat:@"[Parse result: %lu warnings, %lu errors(recoverable), %lu errors (fatal). %@%@", (unsigned long)self.warnings.count, (unsigned long)self.errorsRecoverable.count, (unsigned long)self.errorsFatal.count, (self.errorsFatal.count > 0)?@"First fatal error: ":@"Last recoverable error: ", self.errorsFatal.count > 0 ? [self.errorsFatal firstObject] : self.errorsRecoverable.count > 0 ? [self.errorsRecoverable lastObject] : @"(n/a)"]; +} + -(void) addSourceError:(NSError*) fatalError { - DDLogError(@"[%@] SVG ERROR: %@", [self class], fatalError); + SVGKitLogError(@"[%@] SVG ERROR: %@", [self class], fatalError); [self.errorsRecoverable addObject:fatalError]; } -(void) addParseWarning:(NSError*) warning { - DDLogWarn(@"[%@] SVG WARNING: %@", [self class], warning); + SVGKitLogWarn(@"[%@] SVG WARNING: %@", [self class], warning); [self.warnings addObject:warning]; } -(void) addParseErrorRecoverable:(NSError*) recoverableError { - DDLogWarn(@"[%@] SVG WARNING (recoverable): %@", [self class], recoverableError); + SVGKitLogWarn(@"[%@] SVG WARNING (recoverable): %@", [self class], recoverableError); [self.errorsRecoverable addObject:recoverableError]; } -(void) addParseErrorFatal:(NSError*) fatalError { - DDLogError(@"[%@] SVG ERROR: %@", [self class], fatalError); + SVGKitLogError(@"[%@] SVG ERROR: %@", [self class], fatalError); [self.errorsFatal addObject:fatalError]; } -(void) addSAXError:(NSError*) saxError { - DDLogWarn(@"[%@] SVG ERROR: %@", [self class], [saxError localizedDescription]); + SVGKitLogWarn(@"[%@] SVG ERROR: %@", [self class], [saxError localizedDescription]); [self.errorsFatal addObject:saxError]; } diff --git a/Source/Parsers/SVGKParser.h b/Source/Parsers/SVGKParser.h index c555240bc..ebca5a140 100644 --- a/Source/Parsers/SVGKParser.h +++ b/Source/Parsers/SVGKParser.h @@ -60,18 +60,48 @@ Node * _parentOfCurrentNode; } -@property(nonatomic,retain,readonly) SVGKSource* source; -@property(nonatomic,retain,readonly) SVGKParseResult* currentParseRun; +@property(nonatomic,strong,readonly) SVGKSource* source; +@property(nonatomic,strong,readonly) NSMutableArray* externalStylesheets; +@property(nonatomic,strong,readonly) SVGKParseResult* currentParseRun; - -@property(nonatomic,retain) NSMutableArray* parserExtensions; -@property(nonatomic,retain) NSMutableDictionary* parserKnownNamespaces; /**< maps "uri" to "array of parser-extensions" */ +@property(nonatomic,strong) NSMutableArray* parserExtensions; +@property(nonatomic,strong) NSMutableDictionary* parserKnownNamespaces; /**< maps "uri" to "array of parser-extensions" */ #pragma mark - NEW +/** + If you kept the SVGKParser instance when you started a parse, you can + hand that instance to another thread and the OTHER thread can trigger + a cancel. + + It is not instantaneous, but kicks in as soon as more data is read from + the raw bytes-stream, so it's pretty quick + */ ++(void) cancelParser:(SVGKParser*) parserToCancel; + +/** + Creates an SVGKParser, and adds the "standard" extensions for parsing + a standard SVG file; you can then add any of your own custom extensions + before triggering the parse with e.g. "parseSynchronously" + */ ++(SVGKParser *) newParserWithDefaultSVGKParserExtensions:(SVGKSource *)source; + +/** + Delegates to [self newParserWithDefaultSVGKParserExtensions:], and then auto-starts + the parse SYNCHRONOUSLY (may take anything from 0.001 seconds up to 30+ seconds + for a huge SVG file). + + Returns the fully-parsed result, including any errors + */ + (SVGKParseResult*) parseSourceUsingDefaultSVGKParser:(SVGKSource*) source; -- (SVGKParseResult*) parseSynchronously; +/** + This MIGHT now be safe to call multiple times on different threads + (NB: the only reason it wasn't safe before was major bugs in libxml + that break libxml in horrible ways, see the source code to this class + for more info) + */ +- (SVGKParseResult*) parseSynchronously; +(NSDictionary *) NSDictionaryFromCSSAttributes: (Attr*) styleAttribute; diff --git a/Source/Parsers/SVGKParser.m b/Source/Parsers/SVGKParser.m index 4c0802e0e..edf62daac 100644 --- a/Source/Parsers/SVGKParser.m +++ b/Source/Parsers/SVGKParser.m @@ -25,15 +25,24 @@ #import "Node.h" +#import "SVGKSourceString.h" +#import "SVGKSourceURL.h" +#import "CSSStyleSheet.h" +#import "StyleSheetList+Mutable.h" +#import "NSData+NSInputStream.h" + @interface SVGKParser() -@property(nonatomic,retain, readwrite) SVGKSource* source; -@property(nonatomic,retain, readwrite) SVGKParseResult* currentParseRun; -@property(nonatomic,retain) NSString* defaultXMLNamespaceForThisParseRun; +@property(nonatomic,strong, readwrite) SVGKSource* source; +@property(nonatomic,strong, readwrite) NSMutableArray* externalStylesheets; +@property(nonatomic,strong, readwrite) SVGKParseResult* currentParseRun; +@property(nonatomic,strong) NSString* defaultXMLNamespaceForThisParseRun; +@property(nonatomic) BOOL hasCancelBeenRequested; @end @implementation SVGKParser @synthesize source; +@synthesize externalStylesheets; @synthesize currentParseRun; @synthesize defaultXMLNamespaceForThisParseRun; @@ -51,13 +60,36 @@ @implementation SVGKParser static NSMutableDictionary *NSDictionaryFromLibxmlNamespaces (const xmlChar **namespaces, int namespaces_ct); static NSMutableDictionary *NSDictionaryFromLibxmlAttributes (const xmlChar **attrs, int attr_ct); -static SVGKParser *parserThatWasMostRecentlyStarted; +#define kThreadLocalCurrentlyActiveParser ( @"kThreadLocalCurrentlyActiveParser" ) -+ (SVGKParseResult*) parseSourceUsingDefaultSVGKParser:(SVGKSource*) source; +/** This is a workaround to the major, catastophic bugs in libxml that you cannot + attach a "context" object to libxml parser - and without that, you can't actually + parse, because you have no reference to the context of your original "parse" call. ARGH! + */ +SVGKParser* getCurrentlyParsingParser() { - SVGKParser *parser = [[[SVGKParser alloc] initWithSource:source] autorelease]; + /** Currently implemented NON THREAD SAFE using a static varailbe that only + allows one parse in memory at a time: + */ + return [[NSThread currentThread].threadDictionary objectForKey:kThreadLocalCurrentlyActiveParser]; +} + ++(void)cancelParser:(SVGKParser *)parserToCancel +{ + parserToCancel.hasCancelBeenRequested = TRUE; +} + ++(SVGKParser *) newParserWithDefaultSVGKParserExtensions:(SVGKSource *)source +{ + SVGKParser *parser = [[SVGKParser alloc] initWithSource:source]; [parser addDefaultSVGParserExtensions]; + return parser; +} + ++ (SVGKParseResult*) parseSourceUsingDefaultSVGKParser:(SVGKSource*) source; +{ + SVGKParser* parser = [self newParserWithDefaultSVGKParserExtensions:source]; SVGKParseResult* result = [parser parseSynchronously]; return result; @@ -72,6 +104,7 @@ - (id)initWithSource:(SVGKSource *) s { self.parserExtensions = [NSMutableArray array]; self.source = s; + self.externalStylesheets = nil; _storedChars = [NSMutableString new]; _stackOfParserExtensions = [NSMutableArray new]; @@ -79,26 +112,15 @@ - (id)initWithSource:(SVGKSource *) s { return self; } -- (void)dealloc { - self.currentParseRun = nil; - self.source = nil; - [_storedChars release]; - [_stackOfParserExtensions release]; - // [_parentOfCurrentNode release]; - self.parserExtensions = nil; - self.parserKnownNamespaces = nil; - self.defaultXMLNamespaceForThisParseRun = nil; - [super dealloc]; -} -(void) addDefaultSVGParserExtensions { - SVGKParserSVG *subParserSVG = [[[SVGKParserSVG alloc] init] autorelease]; - SVGKParserGradient* subParserGradients = [[[SVGKParserGradient alloc] init] autorelease]; - SVGKParserPatternsAndGradients *subParserPatternsAndGradients = [[[SVGKParserPatternsAndGradients alloc] init] autorelease]; - SVGKParserStyles* subParserStyles = [[[SVGKParserStyles alloc] init] autorelease]; - SVGKParserDefsAndUse *subParserDefsAndUse = [[[SVGKParserDefsAndUse alloc] init] autorelease]; - SVGKParserDOM *subParserXMLDOM = [[[SVGKParserDOM alloc] init] autorelease]; + SVGKParserSVG *subParserSVG = [[SVGKParserSVG alloc] init]; + SVGKParserGradient* subParserGradients = [[SVGKParserGradient alloc] init]; + SVGKParserPatternsAndGradients *subParserPatternsAndGradients = [[SVGKParserPatternsAndGradients alloc] init]; + SVGKParserStyles* subParserStyles = [[SVGKParserStyles alloc] init]; + SVGKParserDefsAndUse *subParserDefsAndUse = [[SVGKParserDefsAndUse alloc] init]; + SVGKParserDOM *subParserXMLDOM = [[SVGKParserDOM alloc] init]; [self addParserExtension:subParserSVG]; [self addParserExtension:subParserGradients]; @@ -119,7 +141,7 @@ - (void) addParserExtension:(NSObject*) extension if( [self.parserExtensions containsObject:extension]) { - DDLogVerbose(@"[%@] WARNING: attempted to add a ParserExtension that was already added = %@", [self class], extension); + SVGKitLogVerbose(@"[%@] WARNING: attempted to add a ParserExtension that was already added = %@", [self class], extension); return; } @@ -142,21 +164,26 @@ - (void) addParserExtension:(NSObject*) extension } } -static FILE *desc; -static int -readPacket(char *mem, int size) { - int res; - - res = fread(mem, 1, size, desc); - return(res); -} +//static FILE *desc; +//static size_t +//readPacket(char *mem, int size) { +// size_t res; +// +// res = fread(mem, 1, size, desc); +// return(res); +//} - (SVGKParseResult*) parseSynchronously { - self.currentParseRun = [[SVGKParseResult new] autorelease]; + if( self.currentParseRun != nil ) + { + SVGKitLogError(@"FATAL: attempting to run the parser twice in one thread; limxml is single-threaded only, so we are too (until someone wraps libxml to be multi-threaded)"); + } + + self.currentParseRun = [SVGKParseResult new]; _parentOfCurrentNode = nil; [_stackOfParserExtensions removeAllObjects]; - parserThatWasMostRecentlyStarted = self; + [[NSThread currentThread].threadDictionary setObject:self forKey:kThreadLocalCurrentlyActiveParser]; /* // 1. while (source has chunks of BYTES) @@ -166,11 +193,25 @@ - (SVGKParseResult*) parseSynchronously */ NSInputStream* stream = source.stream; + if( stream == nil ) + { + [currentParseRun addSourceError:[NSError errorWithDomain:@"SVGKit" code:2354 userInfo:@{NSLocalizedDescriptionKey : [NSString stringWithFormat:@"Source failed to create a valid NSInputStream; check your log files for why the SVGKSource failed (source = %@)",source]}]]; + + } + else + { + [stream open]; NSStreamStatus status = [stream streamStatus]; if (status != NSStreamStatusOpen) { if (status == NSStreamStatusError) + { [currentParseRun addSourceError:[stream streamError]]; + } + else + { + [currentParseRun addSourceError:[NSError errorWithDomain:@"SVGKit" code:2573 userInfo:@{NSLocalizedDescriptionKey: @"The stream wouldn't open; this can happen when Apple libraries incorrectly open slowly over the internet. Any other case is probably a threading bug inside SVGKit"}]]; + } [stream close]; return currentParseRun; } @@ -180,7 +221,7 @@ - (SVGKParseResult*) parseSynchronously ctx = xmlCreatePushParserCtxt(&SAXHandler, NULL, NULL, 0, NULL); // NEVER pass anything except NULL in second arg - libxml has a massive bug internally /* - DDLogVerbose(@"[%@] WARNING: Substituting entities directly into document, c.f. http://www.xmlsoft.org/entities.html for why!", [self class]); + SVGKitLogVerbose(@"[%@] WARNING: Substituting entities directly into document, c.f. http://www.xmlsoft.org/entities.html for why!", [self class]); xmlSubstituteEntitiesDefault(1); xmlCtxtUseOptions( ctx, XML_PARSE_DTDATTR // default DTD attributes @@ -192,26 +233,54 @@ - (SVGKParseResult*) parseSynchronously if( ctx ) // if libxml init succeeds... { // 1. while (source has chunks of BYTES) - // 2. read a chunk from source, send to libxml + // 2. Check asynch cancellation flag + // 3. read a chunk from source, send to libxml + uint64_t totalBytesRead = 0; NSInteger bytesRead = [stream read:(uint8_t*)&buff maxLength:READ_CHUNK_SZ]; while( bytesRead > 0 ) { - int libXmlParserParseError = xmlParseChunk(ctx, buff, bytesRead, 0); + totalBytesRead += bytesRead; + + if( self.hasCancelBeenRequested ) + { + SVGKitLogInfo( @"SVGKParser: 'cancel parse' discovered; bailing on this XML parse" ); + break; + } + else + { + if( source.approximateLengthInBytesOr0 > 0 ) + { + currentParseRun.parseProgressFractionApproximate = totalBytesRead / (double) source.approximateLengthInBytesOr0; + } + else + currentParseRun.parseProgressFractionApproximate = 0; + } + + NSInteger libXmlParserParseError; + @try + { + libXmlParserParseError = xmlParseChunk(ctx, buff, (int)bytesRead, 0); + } + @catch( NSException* e ) + { + SVGKitLogError( @"Exception while trying to parse SVG file, will store in parse results. Exception = %@", e); + [currentParseRun addParseErrorFatal:[NSError errorWithDomain:@"SVGK Parsing" code:32523432 userInfo:@{NSLocalizedDescriptionKey:[NSString stringWithFormat:@"Exception = %@", e]}]]; + } if( [currentParseRun.errorsFatal count] > 0 ) { // 3. if libxml failed chunk, break if( libXmlParserParseError > 0 ) { - DDLogVerbose(@"[%@] libXml reported internal parser error with magic libxml code = %i (look this up on http://xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors)", [self class], libXmlParserParseError ); + SVGKitLogVerbose(@"[%@] libXml reported internal parser error with magic libxml code = %li (look this up on http://xmlsoft.org/html/libxml-xmlerror.html#xmlParserErrors)", [self class], (long)libXmlParserParseError ); currentParseRun.libXMLFailed = YES; } else { - DDLogWarn(@"[%@] SVG parser generated one or more FATAL errors (not the XML parser), errors follow:", [self class] ); + SVGKitLogWarn(@"[%@] SVG parser generated one or more FATAL errors (not the XML parser), errors follow:", [self class] ); for( NSError* error in currentParseRun.errorsFatal ) { - DDLogWarn(@"[%@] ... FATAL ERRRO in SVG parse: %@", [self class], error ); + SVGKitLogWarn(@"[%@] ... FATAL ERRRO in SVG parse: %@", [self class], error ); } } @@ -224,10 +293,14 @@ - (SVGKParseResult*) parseSynchronously [stream close]; // close the handle NO MATTER WHAT - if (!currentParseRun.libXMLFailed) + if (!currentParseRun.libXMLFailed + && currentParseRun.errorsFatal.count < 1 ) xmlParseChunk(ctx, NULL, 0, 1); // EOF xmlFreeParserCtxt(ctx); + } + + [[NSThread currentThread].threadDictionary removeObjectForKey:kThreadLocalCurrentlyActiveParser]; // 4. return result return currentParseRun; @@ -245,6 +318,102 @@ - (void)connection:(NSURLConnection *)connection */ +- (SVGKSource *)loadCSSFrom:(NSString *)href +{ + SVGKSource *cssSource = nil; + if( [href hasPrefix:@"http"] ) + { + NSURL *url = [NSURL URLWithString:href]; + cssSource = [SVGKSourceURL sourceFromURL:url]; + } + else + { + cssSource = [self.source sourceFromRelativePath:href]; + } + + if( cssSource == nil ) + { + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + NSString *path = [documentsDirectory stringByAppendingPathComponent:href]; + NSString *cssText = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; + + if( cssText == nil ) + { + SVGKitLogWarn(@"[%@] Unable to find external CSS file '%@'", [self class], href ); + } + else + { + cssSource = [SVGKSourceString sourceFromContentsOfString:cssText]; + } + } + + return cssSource; +} + +- (NSString *)stringFromSource:(SVGKSource *) src +{ + [src.stream open]; // if we do this, we CANNOT parse from this source again in future + NSData *data = [NSData dataWithContentsOfStream:src.stream initialCapacity:4096 error:nil]; + return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; +} + +- (void)handleProcessingInstruction:(NSString *)target withData:(NSString *) data +{ + if( [@"xml-stylesheet" isEqualToString:target] && ( [data rangeOfString:@"type=\"text/css\""].location != NSNotFound || [data rangeOfString:@"type="].location == NSNotFound ) ) + { + NSRange startHref = [data rangeOfString:@"href=\""]; + if( startHref.location != NSNotFound ) + { + NSUInteger startIndex = startHref.location + startHref.length; + NSRange endHref = [data rangeOfString:@"\"" options:0 range:NSMakeRange(startIndex, data.length - startIndex)]; + if( startHref.location != NSNotFound ) + { + NSString *href = [data substringWithRange:NSMakeRange(startIndex, endHref.location - startIndex)]; + SVGKSource* cssSource = [self loadCSSFrom:href]; + + if( cssSource != nil ) + { + NSString *cssText = [self stringFromSource:cssSource]; + CSSStyleSheet* parsedStylesheet = [[CSSStyleSheet alloc] initWithString:cssText]; + + if( currentParseRun.parsedDocument.rootElement == nil ) + { + if( self.externalStylesheets == nil ) + self.externalStylesheets = [[NSMutableArray alloc] init]; + [self.externalStylesheets addObject:parsedStylesheet]; + } + else + { + [currentParseRun.parsedDocument.rootElement.styleSheets.internalArray addObject:parsedStylesheet]; + } + } + } + } + } +} + +- (void)addExternalStylesheetsToRootElement { + + if( self.externalStylesheets != nil ) + { + [currentParseRun.parsedDocument.rootElement.styleSheets.internalArray addObjectsFromArray:self.externalStylesheets]; + self.externalStylesheets = nil; + } +} + +static void processingInstructionSAX (void * ctx, + const xmlChar * target, + const xmlChar * data) +{ + SVGKParser* self = getCurrentlyParsingParser(); + + NSString *stringTarget = NSStringFromLibxmlString(target); + NSString *stringData = NSStringFromLibxmlString(data); + + [self handleProcessingInstruction:stringTarget withData:stringData]; +} + - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespaceURI:(NSString*) XMLNSURI attributeObjects:(NSMutableDictionary *) attributeObjects { BOOL parsingRootTag = FALSE; @@ -257,7 +426,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa /** Send any partially-parsed text data into the old node that is now the parent node, then change the "storing chars" flag to fit the new node */ - Text *tNode = [[[Text alloc] initWithValue:_storedChars] autorelease]; + Text *tNode = [[Text alloc] initWithValue:_storedChars]; [_parentOfCurrentNode appendChild:tNode]; @@ -309,7 +478,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa Node* subParserResult = [subParser handleStartElement:name document:source namePrefix:prefix namespaceURI:XMLNSURI attributes:attributeObjects parseResult:self.currentParseRun parentNode:_parentOfCurrentNode]; #if DEBUG_XML_PARSER - DDLogVerbose(@"[%@] tag: <%@:%@> id=%@ -- handled by subParser: %@", [self class], prefix, name, ([((Attr*)[attributeObjects objectForKey:@"id"]) value] != nil?[((Attr*)[attributeObjects objectForKey:@"id"]) value]:@"(none)"), subParser ); + SVGKitLogVerbose(@"[%@] tag: <%@:%@> id=%@ -- handled by subParser: %@", [self class], prefix, name, ([((Attr*)[attributeObjects objectForKey:@"id"]) value] != nil?[((Attr*)[attributeObjects objectForKey:@"id"]) value]:@"(none)"), subParser ); #endif /** Add the new (partially parsed) node to the parent node in tree @@ -323,6 +492,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa if( parsingRootTag ) { currentParseRun.parsedDocument.rootElement = (SVGSVGElement*) subParserResult; + [self addExternalStylesheetsToRootElement]; } return; @@ -337,7 +507,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa NSObject* eventualParser = defaultParserForThisNamespace != nil ? defaultParserForThisNamespace : defaultParserForEverything; NSAssert( eventualParser != nil, @"Found a tag (prefix:%@ name:%@) that was rejected by all the parsers available. Perhaps you forgot to include a default parser (usually: SVGKParserDOM, which will handle any / all XML tags)", prefix, name ); - DDLogVerbose(@"[%@] WARN: found a tag with no namespace parser: (), using default parser(%@)", [self class], name, eventualParser ); + SVGKitLogVerbose(@"[%@] WARN: found a tag with no namespace parser: (), using default parser(%@)", [self class], name, eventualParser ); [_stackOfParserExtensions addObject:eventualParser]; @@ -346,7 +516,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa Node* subParserResult = [eventualParser handleStartElement:name document:source namePrefix:prefix namespaceURI:XMLNSURI attributes:attributeObjects parseResult:self.currentParseRun parentNode:_parentOfCurrentNode]; #if DEBUG_XML_PARSER - DDLogVerbose(@"[%@] tag: <%@:%@> id=%@ -- handled by subParser: %@", [self class], prefix, name, ([((Attr*)[attributeObjects objectForKey:@"id"]) value] != nil?[((Attr*)[attributeObjects objectForKey:@"id"]) value]:@"(none)"), eventualParser ); + SVGKitLogVerbose(@"[%@] tag: <%@:%@> id=%@ -- handled by subParser: %@", [self class], prefix, name, ([((Attr*)[attributeObjects objectForKey:@"id"]) value] != nil?[((Attr*)[attributeObjects objectForKey:@"id"]) value]:@"(none)"), eventualParser ); #endif /** Add the new (partially parsed) node to the parent node in tree @@ -361,6 +531,7 @@ - (void)handleStartElement:(NSString *)name namePrefix:(NSString*)prefix namespa if( parsingRootTag ) { currentParseRun.parsedDocument.rootElement = (SVGSVGElement*) subParserResult; + [self addExternalStylesheetsToRootElement]; } return; @@ -371,11 +542,11 @@ static void startElementSAX (void *ctx, const xmlChar *localname, const xmlChar const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes) { - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKParser *self = getCurrentlyParsingParser(); NSString *stringLocalName = NSStringFromLibxmlString(localname); NSString *stringPrefix = NSStringFromLibxmlString(prefix); - NSMutableDictionary *namespacesByPrefix = NSDictionaryFromLibxmlNamespaces(namespaces, nb_namespaces); // TODO: need to do something with this; this is the ONLY point at which we discover the "xml:ns" definitions in the SVG doc! See below for a temp fix + NSMutableDictionary *namespacesByPrefix = NSDictionaryFromLibxmlNamespaces(namespaces, nb_namespaces); // TODO: need to do something with this; this is the ONLY point at which we discover the "xmlns:" definitions in the SVG doc! See below for a temp fix NSMutableDictionary *attributeObjects = NSDictionaryFromLibxmlAttributes(attributes, nb_attributes); NSString *stringURI = NSStringFromLibxmlString(URI); @@ -410,6 +581,37 @@ static void startElementSAX (void *ctx, const xmlChar *localname, const xmlChar newAttribute.namespaceURI = self.defaultXMLNamespaceForThisParseRun; } + /** + This appears to be a major bug in libxml: "xmlns:blah="blah"" is treated as a namespace declaration - but libxml + FAILS to report it as an attribute (according to the XML spec, it appears to be "both" of those things?) + + ...but I could be wrong. The XML definition of Namespaces is badly written and missing several key bits of info + (I have inferred the "both" status from the definition of XML's Node class, which raises an error on setting + Node.prefix "if the node is an attribute, and it's in the xmlns namespace ... and ... and" -- which implies to me + that attributes can be xmlns="blah" definitions) + + ... UPDATE: I have found confirming evidence in the "http://www.w3.org/2000/xmlns/" namespace itself. Visit that URL! It has docs... + + + NB: this bug / issue was irrelevant until we started trying to export SVG documents from memory back to XML strings, + at which point: we need this info! Or else we end up substantially changing the incoming SVG :(. + + So: + + Add any namespace declarations to the attributes dictionary: + */ + for( NSString* prefix in namespacesByPrefix ) + { + NSString* namespace = [namespacesByPrefix objectForKey:prefix]; + + /** NB this happens *AFTER* setting default namespaces for all attributes - the xmlns: attributes are required by the XML + spec to all live in a special magical namespace AND to all use the same prefix of "xmlns" - no other is allowed! + */ + Attr* newAttributeFromNamespaceDeclaration = [[Attr alloc] initWithNamespace:@"http://www.w3.org/2000/xmlns/" qualifiedName:[NSString stringWithFormat:@"xmlns:%@", prefix] value:namespace]; + + [attributeObjects setObject:newAttributeFromNamespaceDeclaration forKey:newAttributeFromNamespaceDeclaration.nodeName]; + } + /** TODO: temporary workaround to PRETEND that all namespaces are always defined; this is INCORRECT: namespaces should be UNdefined once you close the parent tag that defined them (I think?) @@ -418,15 +620,15 @@ static void startElementSAX (void *ctx, const xmlChar *localname, const xmlChar { NSString* uri = [namespacesByPrefix objectForKey:prefix]; - if( prefix != nil ) - [self.currentParseRun.namespacesEncountered setObject:uri forKey:prefix]; - else + if( [prefix isEqualToString:@""] ) // special string we put in earlier to indicate zero-length / "default" prefix [self.currentParseRun.namespacesEncountered setObject:uri forKey:[NSNull null]]; + else + [self.currentParseRun.namespacesEncountered setObject:uri forKey:prefix]; } #if DEBUG_XML_PARSER #if DEBUG_VERBOSE_LOG_EVERY_TAG - DDLogCWarn(@"[%@] DEBUG_VERBOSE: <%@%@> (namespace URL:%@), attributes: %i", [self class], [NSString stringWithFormat:@"%@:",stringPrefix], name, stringURI, nb_attributes ); + SVGKitLogWarn(@"[%@] DEBUG_VERBOSE: <%@%@> (namespace URL:%@), attributes: %i", [self class], [NSString stringWithFormat:@"%@:",stringPrefix], name, stringURI, nb_attributes ); #endif #endif @@ -447,25 +649,25 @@ but it keeps returning nil pointer (not always, but often). WTF? Not sure what w { for( int i=0; i", [self class], stringLocalName ); + SVGKitLogWarn(@"[%@] WARNING: Your input SVG contains tags that have no namespace, and your document doesn't define a default namespace. This is always incorrect - it means some of your SVG data will be ignored, and usually means you have a typo in there somewhere. Tag with no namespace: <%@>", [self class], stringLocalName ); } [self handleStartElement:stringLocalName namePrefix:stringPrefix namespaceURI:stringURI attributeObjects:attributeObjects]; } - (void)handleEndElement:(NSString *)name { - //DELETE DEBUG DDLogVerbose(@"ending element, name = %@", name); + //DELETE DEBUG SVGKitLogVerbose(@"ending element, name = %@", name); NSObject* lastobject = [_stackOfParserExtensions lastObject]; @@ -477,7 +679,7 @@ - (void)handleEndElement:(NSString *)name { #if DEBUG_XML_PARSER #if DEBUG_VERBOSE_LOG_EVERY_TAG - DDLogVerbose(@"[%@] DEBUG-PARSER: ended tag (), handled by parser (%@) with parent parsed by %@", [self class], name, parser, parentParser ); + SVGKitLogVerbose(@"[%@] DEBUG-PARSER: ended tag (), handled by parser (%@) with parent parsed by %@", [self class], name, parser, parentParser ); #endif #endif @@ -489,7 +691,7 @@ - (void)handleEndElement:(NSString *)name { { /** Send any parsed text data into the node-we're-closing */ - Text *tNode = [[[Text alloc] initWithValue:_storedChars] autorelease]; + Text *tNode = [[Text alloc] initWithValue:_storedChars]; [_parentOfCurrentNode appendChild:tNode]; @@ -504,48 +706,44 @@ - (void)handleEndElement:(NSString *)name { } static void endElementSAX (void *ctx, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI) { - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKParser* self = getCurrentlyParsingParser(); [self handleEndElement:NSStringFromLibxmlString(localname)]; } - (void)handleFoundCharacters:(const xmlChar *)chars length:(int)len { - char value[len + 1]; - strncpy(value, (const char *) chars, len); - value[len] = '\0'; - - [_storedChars appendString:[NSString stringWithUTF8String:value]]; + [_storedChars appendString:[[NSString alloc] initWithBytes:chars length:len encoding:NSUTF8StringEncoding]]; } static void cDataFoundSAX(void *ctx, const xmlChar *value, int len) { - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKParser* self = getCurrentlyParsingParser(); [self handleFoundCharacters:value length:len]; } static void charactersFoundSAX (void *ctx, const xmlChar *chars, int len) { - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKParser* self = getCurrentlyParsingParser(); [self handleFoundCharacters:chars length:len]; } static void errorEncounteredSAX (void *ctx, const char *msg, ...) { - DDLogCWarn(@"Error encountered during parse: %s", msg); - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKitLogWarn(@"Error encountered during parse: %s", msg); + SVGKParser* self = getCurrentlyParsingParser(); SVGKParseResult* parseResult = self.currentParseRun; [parseResult addSAXError:[NSError errorWithDomain:@"SVG-SAX" code:1 userInfo:[NSDictionary dictionaryWithObjectsAndKeys: - (NSString*) msg, NSLocalizedDescriptionKey, + [NSString stringWithCString:msg encoding:NSUTF8StringEncoding], NSLocalizedDescriptionKey, nil]]]; } -static void unparsedEntityDeclaration(void * ctx, - const xmlChar * name, - const xmlChar * publicId, - const xmlChar * systemId, +static void unparsedEntityDeclaration(void * ctx, + const xmlChar * name, + const xmlChar * publicId, + const xmlChar * systemId, const xmlChar * notationName) { - DDLogCWarn(@"ERror: unparsed entity Decl"); + SVGKitLogWarn(@"Error: unparsed entity Decl"); } static void structuredError (void * userData, @@ -573,7 +771,7 @@ static void structuredError (void * userData, NSError* objcError = [NSError errorWithDomain:[[NSNumber numberWithInt:error->domain] stringValue] code:error->code userInfo:details]; - SVGKParser *self = parserThatWasMostRecentlyStarted; + SVGKParser* self = getCurrentlyParsingParser(); SVGKParseResult* parseResult = self.currentParseRun; switch( errorLevel ) { @@ -608,7 +806,7 @@ static void structuredError (void * userData, NULL, /* notationDecl */ NULL, /* attributeDecl */ NULL, /* elementDecl */ - NULL, /* unparsedEntityDecl */ + unparsedEntityDeclaration, /* unparsedEntityDecl */ NULL, /* setDocumentLocator */ NULL, /* startDocument */ NULL, /* endDocument */ @@ -617,7 +815,7 @@ static void structuredError (void * userData, NULL, /* reference */ charactersFoundSAX, /* characters */ NULL, /* ignorableWhitespace */ - NULL, /* processingInstruction */ + processingInstructionSAX, /* processingInstruction */ NULL, /* comment */ NULL, /* warning */ errorEncounteredSAX, /* error */ @@ -658,7 +856,7 @@ static void structuredError (void * userData, forKey:prefix]; } - return [dict autorelease]; + return dict; } @@ -668,26 +866,23 @@ static void structuredError (void * userData, for (int i = 0; i < attr_ct * 5; i += 5) { const char *begin = (const char *) attrs[i + 3]; const char *end = (const char *) attrs[i + 4]; - int vlen = strlen(begin) - strlen(end); + size_t len = end - begin; - char val[vlen + 1]; - strncpy(val, begin, vlen); - val[vlen] = '\0'; + NSString* value = [[NSString alloc] initWithBytes:begin length:len encoding:NSUTF8StringEncoding]; NSString* localName = NSStringFromLibxmlString(attrs[i]); NSString* prefix = NSStringFromLibxmlString(attrs[i+1]); NSString* uri = NSStringFromLibxmlString(attrs[i+2]); - NSString* value = [NSString stringWithUTF8String:val]; NSString* qname = (prefix == nil) ? localName : [NSString stringWithFormat:@"%@:%@", prefix, localName]; - Attr* newAttribute = [[[Attr alloc] initWithNamespace:uri qualifiedName:qname value:value] autorelease]; + Attr* newAttribute = [[Attr alloc] initWithNamespace:uri qualifiedName:qname value:value]; [dict setObject:newAttribute forKey:qname]; } - return [dict autorelease]; + return dict; } #define MAX_ACCUM 256 @@ -697,7 +892,7 @@ +(NSDictionary *) NSDictionaryFromCSSAttributes: (Attr*) styleAttribute { if( styleAttribute == nil ) { - DDLogCWarn(@"[%@] WARNING: asked to convert an empty CSS string into a CSS dictionary; returning empty dictionary", [self class] ); + SVGKitLogWarn(@"[%@] WARNING: asked to convert an empty CSS string into a CSS dictionary; returning empty dictionary", [self class] ); return [NSDictionary dictionary]; } @@ -733,7 +928,7 @@ +(NSDictionary *) NSDictionaryFromCSSAttributes: (Attr*) styleAttribute { else if (c == ';' || c == '\0') { accum[accumIdx] = '\0'; - Attr* newAttribute = [[[Attr alloc] initWithNamespace:styleAttribute.namespaceURI qualifiedName:[NSString stringWithUTF8String:name] value:[NSString stringWithUTF8String:accum]] autorelease]; + Attr* newAttribute = [[Attr alloc] initWithNamespace:styleAttribute.namespaceURI qualifiedName:[NSString stringWithUTF8String:name] value:[NSString stringWithUTF8String:accum]]; [dict setObject:newAttribute forKey:newAttribute.localName]; @@ -749,7 +944,7 @@ +(NSDictionary *) NSDictionaryFromCSSAttributes: (Attr*) styleAttribute { accum[accumIdx++] = c; } - return [dict autorelease]; + return dict; } @end diff --git a/Source/Parsers/SVGKPointsAndPathsParser.h b/Source/Parsers/SVGKPointsAndPathsParser.h index 40de87640..2a15485bf 100644 --- a/Source/Parsers/SVGKPointsAndPathsParser.h +++ b/Source/Parsers/SVGKPointsAndPathsParser.h @@ -13,57 +13,69 @@ */ #import - -#if TARGET_OS_IPHONE -#import -#else #import -#endif + +/** + * Partially spammy; not as spammy as DEBUG_PATH_CREATION + */ +#define VERBOSE_PARSE_SVG_COMMAND_STRINGS 0 + +/*! Very useful for debugging the parser - this will output one line of logging + * for every CGPath command that's actually done; you can then compare these lines + * to the input source file, and manually check what's being sent to the renderer + * versus what was expected + * + * this is MORE SPAMMY than VERBOSE_PARSE_SVG_COMMAND_STRINGS + */ +#define DEBUG_PATH_CREATION 0 + +typedef NS_ENUM(NSUInteger, SVGCurveType) { + SVGCurveTypePoint, + SVGCurveTypeCubic, + SVGCurveTypeQuadratic, +}; typedef struct SVGCurve { + SVGCurveType type; CGPoint c1; CGPoint c2; CGPoint p; } SVGCurve; -SVGCurve SVGCurveMake(CGFloat cx1, CGFloat cy1, CGFloat cx2, CGFloat cy2, CGFloat px, CGFloat py); -BOOL SVGCurveEqualToCurve(SVGCurve curve1, SVGCurve curve2); - -#define SVGCurveZero SVGCurveMake(0.,0.,0.,0.,0.,0.) @interface SVGKPointsAndPathsParser : NSObject -+ (void) readWhitespace:(NSScanner*)scanner; -+ (void) readCommaAndWhitespace:(NSScanner*)scanner; ++ (SVGCurve) startingCurve; -+ (CGFloat) readCoordinate:(NSScanner*)scanner; -+ (CGPoint) readCoordinatePair:(NSScanner*)scanner; ++ (SVGCurve) readMovetoDrawtoCommandGroups:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; ++ (SVGCurve) readMovetoDrawto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; ++ (SVGCurve) readMoveto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; ++ (SVGCurve) readMovetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readMovetoDrawtoCommandGroups:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readMovetoDrawtoCommandGroup:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readMovetoDrawto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readMoveto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readMovetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; - -+ (CGPoint) readLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; -+ (CGPoint) readVerticalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; -+ (CGPoint) readVerticalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; -+ (CGPoint) readHorizontalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; -+ (CGPoint) readHorizontalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; ++ (SVGCurve) readLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; ++ (SVGCurve) readVerticalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readVerticalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readHorizontalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readHorizontalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; + (SVGCurve) readQuadraticCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; + (SVGCurve) readQuadraticCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; + (SVGCurve) readQuadraticCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readSmoothQuadraticCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; ++ (SVGCurve) readSmoothQuadraticCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; ++ (SVGCurve) readSmoothQuadraticCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; + (SVGCurve) readCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; + (SVGCurve) readCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; + (SVGCurve) readCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; -+ (SVGCurve) readSmoothCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; -+ (SVGCurve) readSmoothCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; ++ (SVGCurve) readSmoothCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve isRelative:(BOOL) isRelative; ++ (SVGCurve) readSmoothCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve isRelative:(BOOL) isRelative; + (SVGCurve) readSmoothCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve; -+ (CGPoint) readCloseCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; ++ (SVGCurve) readEllipticalArcArguments:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative; + ++ (SVGCurve) readCloseCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin; @end diff --git a/Source/Parsers/SVGKPointsAndPathsParser.m b/Source/Parsers/SVGKPointsAndPathsParser.m index cc753d1af..677609640 100644 --- a/Source/Parsers/SVGKPointsAndPathsParser.m +++ b/Source/Parsers/SVGKPointsAndPathsParser.m @@ -2,38 +2,32 @@ #import "NSCharacterSet+SVGKExtensions.h" -// TODO: support quadratic-bezier-curveto -// TODO: support smooth-quadratic-bezier-curveto -// TODO: support elliptical-arc - -/*! Very useful for debugging the parser - this will output one line of logging - * for every CGPath command that's actually done; you can then compare these lines - * to the input source file, and manually check what's being sent to the renderer - * versus what was expected - */ -#define DEBUG_PATH_CREATION 0 -inline SVGCurve SVGCurveMake(CGFloat cx1, CGFloat cy1, CGFloat cx2, CGFloat cy2, CGFloat px, CGFloat py) +static inline SVGCurve SVGCurveMakePoint(CGPoint p) { SVGCurve curve; - curve.c1 = CGPointMake(cx1, cy1); - curve.c2 = CGPointMake(cx2, cy2); - curve.p = CGPointMake(px, py); + curve.type = SVGCurveTypePoint; + + curve.c1 = p; + curve.c2 = p; + curve.p = p; + return curve; } -inline BOOL SVGCurveEqualToCurve(SVGCurve curve1, SVGCurve curve2) + +static inline CGPoint SVGCurveReflectedControlPoint(SVGCurve prevCurve) { - return ( - CGPointEqualToPoint(curve1.c1, curve2.c1) - && - CGPointEqualToPoint(curve1.c2, curve2.c2) - && - CGPointEqualToPoint(curve1.p, curve2.p) - ); + return CGPointMake(prevCurve.p.x+(prevCurve.p.x-prevCurve.c2.x), prevCurve.p.y+(prevCurve.p.y-prevCurve.c2.y)); } + @implementation SVGKPointsAndPathsParser ++ (SVGCurve) startingCurve +{ + return SVGCurveMakePoint(CGPointZero); +} + /* references http://www.w3.org/TR/2011/REC-SVG11-20110816/paths.html#PathDataBNF @@ -203,8 +197,19 @@ @implementation SVGKPointsAndPathsParser */ + (void) readWhitespace:(NSScanner*)scanner { - [scanner scanCharactersFromSet:[NSCharacterSet SVGWhitespaceCharacterSet] + /** This log message can be called literally hundreds of thousands of times in a single parse, which defeats + even Cocoa Lumberjack. + + Even in "verbose" debugging, that's too much! + + Hence: commented-out + SVGKitLogVerbose(@"Apple's implementation of scanCharactersFromSet seems to generate large amounts of temporary objects and can cause a crash here by taking literally megabytes of RAM in temporary internal variables. This is surprising, but I can't see anythign we're doing wrong. Adding this autoreleasepool drops memory usage (inside Apple's methods!) massively, so it seems to be the right thing to do"); + */ + @autoreleasepool + { + [scanner scanCharactersFromSet:[NSCharacterSet SVGWhitespaceCharacterSet] intoString:NULL]; + } } + (void) readCommaAndWhitespace:(NSScanner*)scanner @@ -220,78 +225,78 @@ + (void) readCommaAndWhitespace:(NSScanner*)scanner moveto-drawto-command-group | moveto-drawto-command-group wsp* moveto-drawto-command-groups */ -+ (CGPoint) readMovetoDrawtoCommandGroups:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative -{ - CGPoint lastCoord = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroup:scanner path:path relativeTo:origin isRelative:isRelative]; - return lastCoord; -} - -/** - moveto-drawto-command-group: - moveto wsp* drawto-commands? - */ -+ (CGPoint) readMovetoDrawtoCommandGroup:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readMovetoDrawtoCommandGroups:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { - CGPoint lastCoord = [SVGKPointsAndPathsParser readMovetoDrawto:scanner path:path relativeTo:origin isRelative:isRelative]; +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: move-to, draw-to command"); +#endif + SVGCurve lastCurve = [SVGKPointsAndPathsParser readMovetoDrawto:scanner path:path relativeTo:origin isRelative:isRelative]; [SVGKPointsAndPathsParser readWhitespace:scanner]; - if (![scanner isAtEnd]) { + while (![scanner isAtEnd]) + { [SVGKPointsAndPathsParser readWhitespace:scanner]; - lastCoord = [SVGKPointsAndPathsParser readMovetoDrawtoCommandGroup:scanner path:path relativeTo:origin isRelative:isRelative]; + /** FIXME: wasn't originally, but maybe should be: + + origin = isRelative ? lastCoord : origin; + */ + lastCurve = [SVGKPointsAndPathsParser readMovetoDrawto:scanner path:path relativeTo:origin isRelative:isRelative]; } - - return lastCoord; + + return lastCurve; } /** moveto-drawto-command-group: moveto wsp* drawto-commands? */ -+ (CGPoint) readMovetoDrawto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readMovetoDrawto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { - CGPoint lastMove = [SVGKPointsAndPathsParser readMoveto:scanner path:path relativeTo:origin isRelative:isRelative]; + SVGCurve lastCurve = [SVGKPointsAndPathsParser readMoveto:scanner path:path relativeTo:origin isRelative:isRelative]; [SVGKPointsAndPathsParser readWhitespace:scanner]; - return lastMove; + return lastCurve; } /** moveto: ( "M" | "m" ) wsp* moveto-argument-sequence */ -+ (CGPoint) readMoveto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readMoveto:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Mm"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - - NSAssert(ok, @"failed to scan move to command"); - if (!ok) return origin; + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert(FALSE, @"failed to scan move to command"); + return SVGCurveMakePoint(origin); + } [SVGKPointsAndPathsParser readWhitespace:scanner]; - CGPoint lastCoordinate = [SVGKPointsAndPathsParser readMovetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; - return lastCoordinate; + return [SVGKPointsAndPathsParser readMovetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; } /** moveto-argument-sequence: coordinate-pair | coordinate-pair comma-wsp? lineto-argument-sequence */ -+ (CGPoint) readMovetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readMovetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { - CGPoint p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord = CGPointMake(p.x+origin.x, p.y+origin.y); + CGPoint coord = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + coord.x += origin.x; + coord.y += origin.y; + CGPathMoveToPoint(path, NULL, coord.x, coord.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: MOVED to %2.2f, %2.2f", [SVGKPointsAndPathsParser class], coord.x, coord.y ); + SVGKitLogWarn(@"[%@] PATH: MOVED to %2.2f, %2.2f", [SVGKPointsAndPathsParser class], coord.x, coord.y ); #endif [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - if (![scanner isAtEnd]) { - coord = [SVGKPointsAndPathsParser readLinetoArgumentSequence:scanner path:path relativeTo:(isRelative)?coord:origin isRelative:isRelative]; + if ([scanner isAtEnd]) { + return SVGCurveMakePoint(coord); + } else { + return [SVGKPointsAndPathsParser readLinetoArgumentSequence:scanner path:path relativeTo:(isRelative)?coord:origin isRelative:isRelative]; } - - return coord; } /** @@ -301,40 +306,47 @@ + (CGPoint) readMovetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRe + (CGPoint) readCoordinatePair:(NSScanner*)scanner { - CGFloat x = [SVGKPointsAndPathsParser readCoordinate:scanner]; + CGPoint p; + [SVGKPointsAndPathsParser readCoordinate:scanner intoFloat:&p.x]; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGFloat y = [SVGKPointsAndPathsParser readCoordinate:scanner]; + [SVGKPointsAndPathsParser readCoordinate:scanner intoFloat:&p.y]; - CGPoint p = CGPointMake(x, y); return p; } -+ (CGFloat) readCoordinate:(NSScanner*)scanner ++ (void) readCoordinate:(NSScanner*)scanner intoFloat:(CGFloat*) floatPointer { - float f; - BOOL ok; - ok = [scanner scanFloat:&f]; - NSAssert(ok, @"invalid coord"); - return f; +#if CGFLOAT_IS_DOUBLE + if( ![scanner scanDouble:floatPointer]) + NSAssert(FALSE, @"invalid coord"); +#else + if( ![scanner scanFloat:floatPointer]) + NSAssert(FALSE, @"invalid coord"); +#endif } /** lineto: ( "L" | "l" ) wsp* lineto-argument-sequence */ -+ (CGPoint) readLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: line-to command"); +#endif + NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Ll"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - NSAssert(ok, @"failed to scan line to command"); - if (!ok) return origin; + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert( FALSE, @"failed to scan line to command"); + return SVGCurveMakePoint(origin); + } [SVGKPointsAndPathsParser readWhitespace:scanner]; - CGPoint lastCoordinate = [SVGKPointsAndPathsParser readLinetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; - return lastCoordinate; + return [SVGKPointsAndPathsParser readLinetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; } /** @@ -342,52 +354,68 @@ + (CGPoint) readLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path re coordinate-pair | coordinate-pair comma-wsp? lineto-argument-sequence */ -+ (CGPoint) readLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative ++ (SVGCurve) readLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { CGPoint p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; CGPoint coord = CGPointMake(p.x+origin.x, p.y+origin.y); CGPathAddLineToPoint(path, NULL, coord.x, coord.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: LINE to %2.2f, %2.2f", [SVGKPointsAndPathsParser class], coord.x, coord.y ); + SVGKitLogWarn(@"[%@] PATH: LINE to %2.2f, %2.2f", [SVGKPointsAndPathsParser class], coord.x, coord.y ); #endif - [SVGKPointsAndPathsParser readWhitespace:scanner]; - if (![scanner isAtEnd]) { - coord = [SVGKPointsAndPathsParser readLinetoArgumentSequence:scanner path:path relativeTo:(isRelative)?coord:origin isRelative:isRelative]; - } + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + + while( ![scanner isAtEnd]) + { + origin = (isRelative)?coord:origin; + p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + coord = CGPointMake(p.x+origin.x, p.y+origin.y); + CGPathAddLineToPoint(path, NULL, coord.x, coord.y); +#if DEBUG_PATH_CREATION + SVGKitLogWarn(@"[%@] PATH: LINE to %2.2f, %2.2f", [SVGKPointsAndPathsParser class], coord.x, coord.y ); +#endif + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + } - return coord; + return SVGCurveMakePoint(coord); } /** quadratic-bezier-curveto: ( "Q" | "q" ) wsp* quadratic-bezier-curveto-argument-sequence -*/ + */ + (SVGCurve) readQuadraticCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: quadratic-bezier-curve-to command"); +#endif + NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Qq"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - NSAssert(ok, @"failed to scan quadratic curve to command"); - if (!ok) return SVGCurveZero; + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert( FALSE, @"failed to scan quadratic curve to command"); + return SVGCurveMakePoint(origin); + } [SVGKPointsAndPathsParser readWhitespace:scanner]; - SVGCurve lastCurve = [SVGKPointsAndPathsParser readQuadraticCurvetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; - return lastCurve; + return [SVGKPointsAndPathsParser readQuadraticCurvetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; } /** quadratic-bezier-curveto-argument-sequence: quadratic-bezier-curveto-argument | quadratic-bezier-curveto-argument comma-wsp? quadratic-bezier-curveto-argument-sequence -*/ + */ + (SVGCurve) readQuadraticCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { SVGCurve curve = [SVGKPointsAndPathsParser readQuadraticCurvetoArgument:scanner path:path relativeTo:origin]; - if (![scanner isAtEnd]) { - curve = [SVGKPointsAndPathsParser readQuadraticCurvetoArgumentSequence:scanner path:path relativeTo:(isRelative ? curve.p : origin) isRelative:isRelative]; + while(![scanner isAtEnd]) + { + curve = [SVGKPointsAndPathsParser readQuadraticCurvetoArgument:scanner path:path relativeTo:(isRelative ? curve.p : origin)]; } return curve; @@ -399,39 +427,117 @@ + (SVGCurve) readQuadraticCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMu */ + (SVGCurve) readQuadraticCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { - CGPoint p1 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord1 = CGPointMake(p1.x+origin.x, p1.y+origin.y); + SVGCurve curveResult; + curveResult.type = SVGCurveTypeQuadratic; + + curveResult.c1 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + curveResult.c1.x += origin.x; + curveResult.c1.y += origin.y; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGPoint p2 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord2 = CGPointMake(p2.x+origin.x, p2.y+origin.y); + curveResult.c2 = curveResult.c1; + + curveResult.p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + curveResult.p.x += origin.x; + curveResult.p.y += origin.y; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGPathAddQuadCurveToPoint(path, NULL, coord1.x, coord1.y, coord2.x, coord2.y); + CGPathAddQuadCurveToPoint(path, NULL, curveResult.c1.x, curveResult.c1.y, curveResult.p.x, curveResult.p.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: QUADRATIC CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord1.x, coord1.y, coord2.x, coord2.y ); + SVGKitLogWarn(@"[%@] PATH: QUADRATIC CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], curveResult.c1.x, curveResult.c1.y, curveResult.p.x, curveResult.p.y); #endif - return SVGCurveMake(coord1.x, coord1.y, 0.0f, 0.0f, coord2.x, coord2.y); + return curveResult; } - + +/** + smooth-quadratic-bezier-curveto: + ( "T" | "t" ) wsp* smooth-quadratic-bezier-curveto-argument-sequence + */ ++ (SVGCurve) readSmoothQuadraticCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve +{ +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: smooth-quadratic-bezier-curve-to command"); +#endif + NSString* cmd = nil; + NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Tt"]; + + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert( FALSE, @"failed to scan smooth quadratic curve to command"); + return prevCurve; + } + + [SVGKPointsAndPathsParser readWhitespace:scanner]; + + return [SVGKPointsAndPathsParser readSmoothQuadraticCurvetoArgumentSequence:scanner path:path relativeTo:origin withPrevCurve:prevCurve]; +} + + +/** + smooth-quadratic-bezier-curveto-argument-sequence: + smooth-quadratic-bezier-curveto-argument + | smooth-quadratic-bezier-curveto-argument comma-wsp? smooth-quadratic-bezier-curveto-argument-sequence + */ ++ (SVGCurve) readSmoothQuadraticCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve +{ + SVGCurve curve = [SVGKPointsAndPathsParser readSmoothQuadraticCurvetoArgument:scanner path:path relativeTo:origin withPrevCurve:prevCurve]; + + if (![scanner isAtEnd]) { + curve = [SVGKPointsAndPathsParser readSmoothQuadraticCurvetoArgumentSequence:scanner path:path relativeTo:curve.p withPrevCurve:curve]; + } + + return curve; +} + +/** + smooth-quadratic-bezier-curveto-argument: + coordinate-pair comma-wsp? coordinate-pair + */ ++ (SVGCurve) readSmoothQuadraticCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve +{ + SVGCurve thisCurve; + thisCurve.type = SVGCurveTypeQuadratic; + + thisCurve.c2 = (prevCurve.type == thisCurve.type) ? SVGCurveReflectedControlPoint(prevCurve) : prevCurve.p; + + thisCurve.c1 = thisCurve.c2; // this coordinate is never used, but c2 is better/safer than CGPointZero + + thisCurve.p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + thisCurve.p.x += origin.x; + thisCurve.p.y += origin.y; + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + + CGPathAddQuadCurveToPoint(path, NULL, thisCurve.c2.x, thisCurve.c2.y, thisCurve.p.x, thisCurve.p.y ); +#if DEBUG_PATH_CREATION + SVGKitLogWarn(@"[%@] PATH: SMOOTH QUADRATIC CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], thisCurve.c1.x, thisCurve.c1.y, thisCurve.p.x, thisCurve.p.y ); +#endif + + return thisCurve; +} + /** curveto: ( "C" | "c" ) wsp* curveto-argument-sequence */ + (SVGCurve) readCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: curve-to command"); +#endif NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Cc"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - NSAssert(ok, @"failed to scan curve to command"); - if (!ok) return SVGCurveZero; + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]) + { + NSAssert( FALSE, @"failed to scan curve to command"); + return SVGCurveMakePoint(origin); + } [SVGKPointsAndPathsParser readWhitespace:scanner]; - SVGCurve lastCurve = [SVGKPointsAndPathsParser readCurvetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; - return lastCurve; + return [SVGKPointsAndPathsParser readCurvetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative]; } /** @@ -441,31 +547,16 @@ + (SVGCurve) readCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path */ + (SVGCurve) readCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative { - SVGCurve curve; + SVGCurve curve = [SVGKPointsAndPathsParser readCurvetoArgument:scanner path:path relativeTo:origin]; - [self readCurvetoArgumentSequence:scanner path:path relativeTo:origin isRelative:isRelative overwritingCurve:&curve]; - - return curve; -} - -/** - Recursive method that does the work of: - - readCurvetoArgumentSequence:path:relativeTo:isRelative: - - ...with constant memory (avoids allocating a new struct on the stack). - - Large SVG files recurse very deep, and the tiny struct was reaching multiple-megabytes in size, when multipled by 100's of recursions - */ -+ (void) readCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative overwritingCurve:(SVGCurve*) curvePointer -{ - *curvePointer = [SVGKPointsAndPathsParser readCurvetoArgument:scanner path:path relativeTo:origin]; - - if (![scanner isAtEnd]) + while( ![scanner isAtEnd]) { - CGPoint newOrigin = isRelative ? curvePointer->p : origin; /** FIXME: this could accidentally get corrupted, add an extra pre-allocation for it before the recursion starts */ - [SVGKPointsAndPathsParser readCurvetoArgumentSequence:scanner path:path relativeTo:newOrigin isRelative:isRelative overwritingCurve:curvePointer]; + CGPoint newOrigin = isRelative ? curve.p : origin; + + curve = [SVGKPointsAndPathsParser readCurvetoArgument:scanner path:path relativeTo:newOrigin]; } + + return curve; } /** @@ -474,43 +565,48 @@ + (void) readCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef) */ + (SVGCurve) readCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { - CGPoint p1 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord1 = CGPointMake(p1.x+origin.x, p1.y+origin.y); + SVGCurve curveResult; + curveResult.type = SVGCurveTypeCubic; + + curveResult.c1 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + curveResult.c1.x += origin.x; // avoid allocating a new struct, an allocation here could happen MILLIONS of times in a large parse! + curveResult.c1.y += origin.y; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGPoint p2 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord2 = CGPointMake(p2.x+origin.x, p2.y+origin.y); + curveResult.c2 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + curveResult.c2.x += origin.x; // avoid allocating a new struct, an allocation here could happen MILLIONS of times in a large parse! + curveResult.c2.y += origin.y; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGPoint p3 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord3 = CGPointMake(p3.x+origin.x, p3.y+origin.y); + curveResult.p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + curveResult.p.x += origin.x; // avoid allocating a new struct, an allocation here could happen MILLIONS of times in a large parse! + curveResult.p.y += origin.y; [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - CGPathAddCurveToPoint(path, NULL, coord1.x, coord1.y, coord2.x, coord2.y, coord3.x, coord3.y); + CGPathAddCurveToPoint(path, NULL, curveResult.c1.x, curveResult.c1.y, curveResult.c2.x, curveResult.c2.y, curveResult.p.x, curveResult.p.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord1.x, coord1.y, coord2.x, coord2.y, coord3.x, coord3.y ); + SVGKitLogWarn(@"[%@] PATH: CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], curveResult.c1.x, curveResult.c1.y, curveResult.c2.x, curveResult.c2.y, curveResult.p.x, curveResult.p.y); #endif - return SVGCurveMake(coord1.x, coord1.y, coord2.x, coord2.y, coord3.x, coord3.y); + return curveResult; } /** smooth-curveto: ( "S" | "s" ) wsp* smooth-curveto-argument-sequence */ -+ (SVGCurve) readSmoothCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve ++ (SVGCurve) readSmoothCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve isRelative:(BOOL) isRelative { NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Ss"]; BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; NSAssert(ok, @"failed to scan smooth curve to command"); - if (!ok) return SVGCurveZero; + if (!ok) return prevCurve; [SVGKPointsAndPathsParser readWhitespace:scanner]; - SVGCurve lastCurve = [SVGKPointsAndPathsParser readSmoothCurvetoArgumentSequence:scanner path:path relativeTo:origin withPrevCurve:prevCurve]; - return lastCurve; + return [SVGKPointsAndPathsParser readSmoothCurvetoArgumentSequence:scanner path:path relativeTo:origin withPrevCurve:prevCurve isRelative:isRelative]; } /** @@ -518,12 +614,13 @@ + (SVGCurve) readSmoothCurvetoCommand:(NSScanner*)scanner path:(CGMutablePathRef smooth-curveto-argument | smooth-curveto-argument comma-wsp? smooth-curveto-argument-sequence */ -+ (SVGCurve) readSmoothCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve ++ (SVGCurve) readSmoothCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve isRelative:(BOOL) isRelative { SVGCurve curve = [SVGKPointsAndPathsParser readSmoothCurvetoArgument:scanner path:path relativeTo:origin withPrevCurve:prevCurve]; if (![scanner isAtEnd]) { - curve = [SVGKPointsAndPathsParser readSmoothCurvetoArgumentSequence:scanner path:path relativeTo:origin withPrevCurve:prevCurve]; + CGPoint newOrigin = isRelative ? curve.p : origin; + curve = [SVGKPointsAndPathsParser readSmoothCurvetoArgumentSequence:scanner path:path relativeTo:newOrigin withPrevCurve:curve isRelative: isRelative]; } return curve; @@ -535,28 +632,24 @@ + (SVGCurve) readSmoothCurvetoArgumentSequence:(NSScanner*)scanner path:(CGMutab */ + (SVGCurve) readSmoothCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin withPrevCurve:(SVGCurve)prevCurve { - CGPoint p1 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord1 = CGPointMake(p1.x+origin.x, p1.y+origin.y); - [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + SVGCurve thisCurve; + thisCurve.type = SVGCurveTypeCubic; - CGPoint p2 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; - CGPoint coord2 = CGPointMake(p2.x+origin.x, p2.y+origin.y); + thisCurve.c1 = (prevCurve.type == thisCurve.type) ? SVGCurveReflectedControlPoint(prevCurve) : prevCurve.p; - SVGCurve thisCurve; - if (SVGCurveEqualToCurve(SVGCurveZero, prevCurve)) { - // assume control point is coincident with the current point - thisCurve = SVGCurveMake(coord1.x, coord1.y, coord2.x, coord2.y, coord1.x, coord1.y); - } else { - // calculate the mirror of the previous control point - CGPoint currentPoint = prevCurve.p; - CGPoint controlPoint = prevCurve.c2; - CGPoint mirrorCoord = CGPointMake(currentPoint.x+(currentPoint.x-controlPoint.x), currentPoint.y+(currentPoint.y-controlPoint.y)); - thisCurve = SVGCurveMake(mirrorCoord.x, mirrorCoord.y, coord1.x, coord1.y, coord2.x, coord2.y); - } + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + thisCurve.c2 = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + thisCurve.c2.x += origin.x; + thisCurve.c2.y += origin.y; + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + thisCurve.p = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + thisCurve.p.x += origin.x; + thisCurve.p.y += origin.y; CGPathAddCurveToPoint(path, NULL, thisCurve.c1.x, thisCurve.c1.y, thisCurve.c2.x, thisCurve.c2.y, thisCurve.p.x, thisCurve.p.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: SMOOTH CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], thisCurve.c1.x, thisCurve.c1.y, thisCurve.c2.x, thisCurve.c2.y, thisCurve.p.x, thisCurve.p.y ); + SVGKitLogWarn(@"[%@] PATH: SMOOTH CURVE to (%2.2f, %2.2f)..(%2.2f, %2.2f)..(%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], thisCurve.c1.x, thisCurve.c1.y, thisCurve.c2.x, thisCurve.c2.y, thisCurve.p.x, thisCurve.p.y ); #endif return thisCurve; @@ -567,36 +660,40 @@ + (SVGCurve) readSmoothCurvetoArgument:(NSScanner*)scanner path:(CGMutablePathRe coordinate | coordinate comma-wsp? vertical-lineto-argument-sequence */ -+ (CGPoint) readVerticalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin ++ (SVGCurve) readVerticalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { - CGFloat yValue = [SVGKPointsAndPathsParser readCoordinate:scanner]; + // FIXME: reduce the allocations here; make one CGPoint and update it, not multiple + CGFloat yValue; + [SVGKPointsAndPathsParser readCoordinate:scanner intoFloat:&yValue]; CGPoint vertCoord = CGPointMake(origin.x, origin.y+yValue); CGPoint currentPoint = CGPathGetCurrentPoint(path); CGPoint coord = CGPointMake(currentPoint.x, currentPoint.y+(vertCoord.y-currentPoint.y)); CGPathAddLineToPoint(path, NULL, coord.x, coord.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: VERTICAL LINE to (%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord.x, coord.y ); + SVGKitLogWarn(@"[%@] PATH: VERTICAL LINE to (%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord.x, coord.y ); #endif - return coord; + return SVGCurveMakePoint(coord); } /** vertical-lineto: ( "V" | "v" ) wsp* vertical-lineto-argument-sequence */ -+ (CGPoint) readVerticalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin ++ (SVGCurve) readVerticalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: vertical-line-to command"); +#endif NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Vv"]; BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; NSAssert(ok, @"failed to scan vertical line to command"); - if (!ok) return origin; + if (!ok) return SVGCurveMakePoint(origin); [SVGKPointsAndPathsParser readWhitespace:scanner]; - CGPoint lastCoordinate = [SVGKPointsAndPathsParser readVerticalLinetoArgumentSequence:scanner path:path relativeTo:origin]; - return lastCoordinate; + return [SVGKPointsAndPathsParser readVerticalLinetoArgumentSequence:scanner path:path relativeTo:origin]; } /** @@ -604,53 +701,207 @@ + (CGPoint) readVerticalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef coordinate | coordinate comma-wsp? horizontal-lineto-argument-sequence */ -+ (CGPoint) readHorizontalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin ++ (SVGCurve) readHorizontalLinetoArgumentSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { - CGFloat xValue = [SVGKPointsAndPathsParser readCoordinate:scanner]; + // FIXME: reduce the allocations here; make one CGPoint and update it, not multiple + + CGFloat xValue; + [SVGKPointsAndPathsParser readCoordinate:scanner intoFloat:&xValue]; CGPoint horizCoord = CGPointMake(origin.x+xValue, origin.y); CGPoint currentPoint = CGPathGetCurrentPoint(path); CGPoint coord = CGPointMake(currentPoint.x+(horizCoord.x-currentPoint.x), currentPoint.y); CGPathAddLineToPoint(path, NULL, coord.x, coord.y); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: HORIZONTAL LINE to (%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord.x, coord.y ); + SVGKitLogWarn(@"[%@] PATH: HORIZONTAL LINE to (%2.2f, %2.2f)", [SVGKPointsAndPathsParser class], coord.x, coord.y ); #endif - return coord; + return SVGCurveMakePoint(coord); } /** horizontal-lineto: ( "H" | "h" ) wsp* horizontal-lineto-argument-sequence */ -+ (CGPoint) readHorizontalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin ++ (SVGCurve) readHorizontalLinetoCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: horizontal-line-to command"); +#endif NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Hh"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - NSAssert(ok, @"failed to scan horizontal line to command"); - if (!ok) return origin; + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert( FALSE, @"failed to scan horizontal line to command"); + return SVGCurveMakePoint(origin); + } [SVGKPointsAndPathsParser readWhitespace:scanner]; - CGPoint lastCoordinate = [SVGKPointsAndPathsParser readHorizontalLinetoArgumentSequence:scanner path:path relativeTo:origin]; - return lastCoordinate; + return [SVGKPointsAndPathsParser readHorizontalLinetoArgumentSequence:scanner path:path relativeTo:origin]; } -+ (CGPoint) readCloseCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin ++ (SVGCurve) readCloseCommand:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin { +#if VERBOSE_PARSE_SVG_COMMAND_STRINGS + SVGKitLogVerbose(@"Parsing command string: close command"); +#endif NSString* cmd = nil; NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Zz"]; - BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:&cmd]; - - NSAssert(ok, @"failed to scan close command"); - if (!ok) return origin; + + if( ! [scanner scanCharactersFromSet:cmdFormat intoString:&cmd] ) + { + NSAssert( FALSE, @"failed to scan close command"); + return SVGCurveMakePoint(origin); + } CGPathCloseSubpath(path); #if DEBUG_PATH_CREATION - DDLogCWarn(@"[%@] PATH: finished path", [SVGKPointsAndPathsParser class] ); + SVGKitLogWarn(@"[%@] PATH: finished path", [SVGKPointsAndPathsParser class] ); #endif + + return SVGCurveMakePoint(CGPathGetCurrentPoint(path)); +} + ++ (SVGCurve) readEllipticalArcArguments:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin isRelative:(BOOL) isRelative +{ + NSCharacterSet* cmdFormat = [NSCharacterSet characterSetWithCharactersInString:@"Aa"]; + BOOL ok = [scanner scanCharactersFromSet:cmdFormat intoString:nil]; + + NSAssert(ok, @"failed to scan arc to command"); + if (!ok) return SVGCurveMakePoint(origin); + + CGPoint endPoint = [SVGKPointsAndPathsParser readEllipticalArcArgumentsSequence:scanner path:path relativeTo:origin]; + + while (![scanner isAtEnd]) { + CGPoint newOrigin = isRelative ? endPoint : origin; + endPoint = [SVGKPointsAndPathsParser readEllipticalArcArgumentsSequence:scanner path:path relativeTo:newOrigin]; + } + + return SVGCurveMakePoint(endPoint); +} + ++ (CGPoint)readEllipticalArcArgumentsSequence:(NSScanner*)scanner path:(CGMutablePathRef)path relativeTo:(CGPoint)origin +{ + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + // need to find the center point of the ellipse from the two points and an angle + // see http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes for these calculations + + CGPoint currentPt = CGPathGetCurrentPoint(path); + + CGFloat x1 = currentPt.x; + CGFloat y1 = currentPt.y; + + CGPoint radii = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + CGFloat rx = fabs(radii.x); + CGFloat ry = fabs(radii.y); + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + + CGFloat phi; + + [SVGKPointsAndPathsParser readCoordinate:scanner intoFloat:&phi]; + + phi *= M_PI/180.; + + phi = fmod(phi, 2 * M_PI); + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; + + CGPoint flags = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + + BOOL largeArcFlag = flags.x != 0.; + BOOL sweepFlag = flags.y != 0.; + + [SVGKPointsAndPathsParser readCommaAndWhitespace:scanner]; - return origin; + CGPoint endPoint = [SVGKPointsAndPathsParser readCoordinatePair:scanner]; + + // end parsing + + CGFloat x2 = origin.x + endPoint.x; + CGFloat y2 = origin.y + endPoint.y; + + if (rx == 0 || ry == 0) + { + CGPathAddLineToPoint(path, NULL, x2, y2); + return CGPointMake(x2, y2); + } + CGFloat cosPhi = cos(phi); + CGFloat sinPhi = sin(phi); + + CGFloat x1p = cosPhi * (x1-x2)/2. + sinPhi * (y1-y2)/2.; + CGFloat y1p = -sinPhi * (x1-x2)/2. + cosPhi * (y1-y2)/2.; + + CGFloat lhs; + { + CGFloat rx_2 = rx * rx; + CGFloat ry_2 = ry * ry; + CGFloat xp_2 = x1p * x1p; + CGFloat yp_2 = y1p * y1p; + + CGFloat delta = xp_2/rx_2 + yp_2/ry_2; + + if (delta > 1.0) + { + rx *= sqrt(delta); + ry *= sqrt(delta); + rx_2 = rx * rx; + ry_2 = ry * ry; + } + CGFloat sign = (largeArcFlag == sweepFlag) ? -1 : 1; + CGFloat numerator = rx_2 * ry_2 - rx_2 * yp_2 - ry_2 * xp_2; + CGFloat denom = rx_2 * yp_2 + ry_2 * xp_2; + + numerator = MAX(0, numerator); + + if (denom == 0) { + lhs = 0; + }else { + lhs = sign * sqrt(numerator/denom); + } + } + + CGFloat cxp = lhs * (rx*y1p)/ry; + CGFloat cyp = lhs * -((ry * x1p)/rx); + + CGFloat cx = cosPhi * cxp + -sinPhi * cyp + (x1+x2)/2.; + CGFloat cy = cxp * sinPhi + cyp * cosPhi + (y1+y2)/2.; + + // transform our ellipse into the unit circle + + CGAffineTransform tr = CGAffineTransformMakeScale(1./rx, 1./ry); + + tr = CGAffineTransformRotate(tr, -phi); + tr = CGAffineTransformTranslate(tr, -cx, -cy); + + CGPoint arcPt1 = CGPointApplyAffineTransform(CGPointMake(x1, y1), tr); + CGPoint arcPt2 = CGPointApplyAffineTransform(CGPointMake(x2, y2), tr); + + CGFloat startAngle = atan2(arcPt1.y, arcPt1.x); + CGFloat endAngle = atan2(arcPt2.y, arcPt2.x); + + CGFloat angleDelta = endAngle - startAngle;; + + if (sweepFlag) + { + if (angleDelta < 0) + angleDelta += 2. * M_PI; + } + else + { + if (angleDelta > 0) + angleDelta = angleDelta - 2 * M_PI; + } + // construct the inverse transform + CGAffineTransform trInv = CGAffineTransformMakeTranslation( cx, cy); + + trInv = CGAffineTransformRotate(trInv, phi); + trInv = CGAffineTransformScale(trInv, rx, ry); + + // add a inversely transformed circular arc to the current path + CGPathAddRelativeArc( path, &trInv, 0, 0, 1., startAngle, angleDelta); + + return CGPointMake(x2, y2); } @end diff --git a/Source/QuartzCore additions/CALayer+RecursiveClone.m b/Source/QuartzCore additions/CALayer+RecursiveClone.m index 7ad3c180f..5b29c16ce 100644 --- a/Source/QuartzCore additions/CALayer+RecursiveClone.m +++ b/Source/QuartzCore additions/CALayer+RecursiveClone.m @@ -51,7 +51,8 @@ -(CALayer*) cloneOptionallRecurse:(BOOL) shouldRecurse specificClone.minificationFilterBias = selfSpecific.minificationFilterBias; specificClone.opaque = selfSpecific.opaque; specificClone.needsDisplayOnBoundsChange = selfSpecific.needsDisplayOnBoundsChange; - specificClone.drawsAsynchronously = selfSpecific.drawsAsynchronously; + if( [specificClone respondsToSelector:@selector(drawsAsynchronously)]) // Apple Bug: iOS6+ only, but unmarked in source header + specificClone.drawsAsynchronously = selfSpecific.drawsAsynchronously; specificClone.edgeAntialiasingMask = selfSpecific.edgeAntialiasingMask; specificClone.backgroundColor = selfSpecific.backgroundColor; specificClone.cornerRadius = selfSpecific.cornerRadius; diff --git a/Source/QuartzCore additions/CALayerWithChildHitTest.h b/Source/QuartzCore additions/CALayerWithChildHitTest.h index b24124d13..e9e61dd46 100644 --- a/Source/QuartzCore additions/CALayerWithChildHitTest.h +++ b/Source/QuartzCore additions/CALayerWithChildHitTest.h @@ -1,7 +1,6 @@ #import - - #import +#import "CALayerWithClipRender.h" /*! * Overrides Apple's CALayer purely to change one method, so that hit-testing @@ -15,7 +14,7 @@ * problems in other code (not that I'm aware of any - this override appears to be a common * implementation, c.f. http://stackoverflow.com/questions/2944064/hit-testing-with-calayer-using-the-alpha-properties-of-the-calayer-contents */ -@interface CALayerWithChildHitTest : CALayer { +@interface CALayerWithChildHitTest : CALayerWithClipRender { } diff --git a/Source/QuartzCore additions/CALayerWithClipRender.h b/Source/QuartzCore additions/CALayerWithClipRender.h new file mode 100644 index 000000000..a3aaa38f6 --- /dev/null +++ b/Source/QuartzCore additions/CALayerWithClipRender.h @@ -0,0 +1,15 @@ +// +// CALayerWithClipRender.h +// SVGKit-iOS +// +// Created by David Gileadi on 8/14/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import + +@interface CALayerWithClipRender : CALayer + ++ (void)maskLayer:(CALayer *)layer inContext:(CGContextRef)ctx; + +@end diff --git a/Source/QuartzCore additions/CALayerWithClipRender.m b/Source/QuartzCore additions/CALayerWithClipRender.m new file mode 100644 index 000000000..8168dd83d --- /dev/null +++ b/Source/QuartzCore additions/CALayerWithClipRender.m @@ -0,0 +1,94 @@ +// +// CALayerWithClipRender.m +// SVGKit-iOS +// +// Created by David Gileadi on 8/14/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import "CALayerWithClipRender.h" + +@interface CALayer (ContentsTransform) + +@property CGAffineTransform contentsTransform; + +@end + +@implementation CALayerWithClipRender + +- (void)renderInContext:(CGContextRef)ctx { + CALayer *mask = nil; + if( self.mask != nil ) { + [CALayerWithClipRender maskLayer:self inContext:ctx]; + + mask = self.mask; + self.mask = nil; + } + + // We use the flipped coordinate system on macOS, to match the behavior of iOS. However, the `contents` (which is a CGImageRef) bitmap provided by image element is not been flipped as we want. The `renderInContext:` which used by `SVGKFastImageView` will not correct this coordinate system issue, only `SVGKLayeredImageView` do. So we use the `contentsTransform` to manually fix it. +#if SVGKIT_MAC + // If already flipped, which should be handled by Core Animation itself, ignore + if (self.contentsAreFlipped) { + [super renderInContext:ctx]; + } else { + self.contentsTransform = CGAffineTransformMake(1, 0, 0, -1, 0, self.bounds.size.height); + [super renderInContext:ctx]; + self.contentsTransform = CGAffineTransformIdentity; + } +#else + [super renderInContext:ctx]; +#endif + + if( mask != nil ) { + self.mask = mask; + } +} + ++ (void)maskLayer:(CALayer *)layer inContext:(CGContextRef)ctx { + // if all that's masking is a single path, just clip to it + if( layer.mask.sublayers.count == 1 && [[layer.mask.sublayers objectAtIndex:0] isKindOfClass:[CAShapeLayer class]] ) { + CGPathRef maskPath = ((CAShapeLayer *) [layer.mask.sublayers objectAtIndex:0]).path; + // we have to undo the offset from SVGClipPathLayer.layoutLayer + CGAffineTransform offset = CGAffineTransformMakeTranslation(layer.mask.frame.origin.x, layer.mask.frame.origin.y); + CGPathRef translatedPath = CGPathCreateCopyByTransformingPath(maskPath, &offset); + CGContextAddPath(ctx, translatedPath); + CGPathRelease(translatedPath); + CGContextClip(ctx); + } else { + // otherwise, create an offscreen bitmap at screen resolution, + CGFloat scale = MAX(layer.contentsScale, layer.mask.contentsScale); +#if SVGKIT_MAC + scale = MAX(scale, [[NSScreen mainScreen] backingScaleFactor]); +#else + scale = MAX(scale, [[UIScreen mainScreen] scale]); +#endif + CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); + CGContextRef offscreenContext = CGBitmapContextCreate(NULL, + layer.bounds.size.width * scale, + layer.bounds.size.height * scale, + 8, 0, + colorSpace, + (CGBitmapInfo)kCGImageAlphaOnly); + CGContextScaleCTM(offscreenContext, scale, scale); + + // render the mask to it, undoing the offset from SVGClipPathLayer.layoutLayer + CGPoint offset = layer.mask.frame.origin; + for (CALayer *child in layer.mask.sublayers) + child.frame = CGRectOffset(child.frame, offset.x, offset.y); + [layer.mask renderInContext:offscreenContext]; + for (CALayer *child in layer.mask.sublayers) + child.frame = CGRectOffset(child.frame, -offset.x, -offset.y); + + // get an image from it, + CGImageRef maskImage = CGBitmapContextCreateImage(offscreenContext); + CGContextRelease(offscreenContext); + CGColorSpaceRelease(colorSpace); + + // and mask with that + CGContextClipToMask(ctx, layer.bounds, maskImage); + + CFRelease(maskImage); + } +} + +@end diff --git a/Source/QuartzCore additions/CAShapeLayerWithClipRender.h b/Source/QuartzCore additions/CAShapeLayerWithClipRender.h new file mode 100644 index 000000000..0aebe8a94 --- /dev/null +++ b/Source/QuartzCore additions/CAShapeLayerWithClipRender.h @@ -0,0 +1,13 @@ +// +// CAShapeLayerWithClipRender.h +// SVGKit-iOS +// +// Created by David Gileadi on 8/14/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import + +@interface CAShapeLayerWithClipRender : CAShapeLayer + +@end diff --git a/Source/QuartzCore additions/CAShapeLayerWithClipRender.m b/Source/QuartzCore additions/CAShapeLayerWithClipRender.m new file mode 100644 index 000000000..44d75e9cd --- /dev/null +++ b/Source/QuartzCore additions/CAShapeLayerWithClipRender.m @@ -0,0 +1,32 @@ +// +// CAShapeLayerWithClipRender.m +// SVGKit-iOS +// +// Created by David Gileadi on 8/14/14. +// Copyright (c) 2014 na. All rights reserved. +// + +#import "CAShapeLayerWithClipRender.h" +#import "CALayerWithClipRender.h" + +@implementation CAShapeLayerWithClipRender + +- (void)renderInContext:(CGContextRef)ctx { + if (CGRectIsEmpty(self.bounds)) return; + + CALayer *mask = nil; + if( self.mask != nil ) { + [CALayerWithClipRender maskLayer:self inContext:ctx]; + + mask = self.mask; + self.mask = nil; + } + + [super renderInContext:ctx]; + + if( mask != nil ) { + self.mask = mask; + } +} + +@end diff --git a/Source/QuartzCore additions/CAShapeLayerWithHitTest.h b/Source/QuartzCore additions/CAShapeLayerWithHitTest.h index 98c3e2d45..6eae06521 100644 --- a/Source/QuartzCore additions/CAShapeLayerWithHitTest.h +++ b/Source/QuartzCore additions/CAShapeLayerWithHitTest.h @@ -1,6 +1,6 @@ #import - #import +#import "CAShapeLayerWithClipRender.h" /*! * Overrides Apple's CAShapeLayer purely to change one method, so that hit-testing @@ -17,7 +17,7 @@ * * TODO: should this layer be used in SVGEllipseElement, SVGPolygonElement, etc? */ -@interface CAShapeLayerWithHitTest : CAShapeLayer { +@interface CAShapeLayerWithHitTest : CAShapeLayerWithClipRender { } diff --git a/Source/QuartzCore additions/CAShapeLayerWithHitTest.m b/Source/QuartzCore additions/CAShapeLayerWithHitTest.m index 40d577a88..6c24acc11 100644 --- a/Source/QuartzCore additions/CAShapeLayerWithHitTest.m +++ b/Source/QuartzCore additions/CAShapeLayerWithHitTest.m @@ -19,7 +19,7 @@ - (BOOL) containsPoint:(CGPoint)p { for( CALayer* subLayer in self.sublayers ) { - DDLogVerbose(@"...contains point, Apple will now check sublayer: %@", subLayer); + SVGKitLogVerbose(@"...contains point, Apple will now check sublayer: %@", subLayer); } return TRUE; } diff --git a/Source/QuartzCore additions/CGPathAdditions.h b/Source/QuartzCore additions/CGPathAdditions.h index 3ef33bacf..a17189006 100644 --- a/Source/QuartzCore additions/CGPathAdditions.h +++ b/Source/QuartzCore additions/CGPathAdditions.h @@ -5,14 +5,10 @@ // Copyright Matt Rajca 2011. All rights reserved. // -#if TARGET_OS_IPHONE - -#import - -#endif +#import /*! From original SVGKit, but it seems to be "the opposite of translation" */ CGPathRef CGPathCreateByOffsettingPath (CGPathRef aPath, CGFloat x, CGFloat y); /*! New SVGKit: carefully named method that does what it claims to: it translates a path by the specified amount */ -CGPathRef CGPathCreateByTranslatingPath (CGPathRef aPath, CGFloat x, CGFloat y); \ No newline at end of file +CGPathRef CGPathCreateByTranslatingPath (CGPathRef aPath, CGFloat x, CGFloat y); diff --git a/Source/QuartzCore additions/CGPathAdditions.m b/Source/QuartzCore additions/CGPathAdditions.m index ebf608dae..968d2b211 100644 --- a/Source/QuartzCore additions/CGPathAdditions.m +++ b/Source/QuartzCore additions/CGPathAdditions.m @@ -15,14 +15,53 @@ CGFloat offY; } PathInfo; +CGFloat fixInfinity(CGFloat inputFloat){ + if(inputFloat>CGFLOAT_MAX) inputFloat=CGFLOAT_MAX; + if(inputFloat<(-1)*CGFLOAT_MAX) inputFloat=(-1)*CGFLOAT_MAX; + return inputFloat; +} + +CGPoint *fixPointsInfinity(const CGPathElement *element){ + int i,total; + + switch (element->type) { + case kCGPathElementMoveToPoint: + total=1; + break; + case kCGPathElementAddLineToPoint: + total=1; + break; + case kCGPathElementAddQuadCurveToPoint: + total=2; + break; + case kCGPathElementAddCurveToPoint: + total=3; + break; + default: + total=0; + break; + } + + if( total == 0 ) + return NULL; // Avoid malloc(0); keep C compilers happy + + CGPoint* returnArray = malloc(sizeof(CGPoint) * total); + for (i = 0; i < total; i++) + { + returnArray[i].x=fixInfinity(element->points[i].x); + returnArray[i].y=fixInfinity(element->points[i].y); + } + return returnArray; +} + void applier (void *info, const CGPathElement *element) { PathInfo *pathInfo = (PathInfo *) info; CGMutablePathRef path = pathInfo->path; - CGFloat x = pathInfo->offX; - CGFloat y = pathInfo->offY; - - const CGPoint *points = element->points; + CGFloat x = fixInfinity(pathInfo->offX); + CGFloat y = fixInfinity(pathInfo->offY); + + CGPoint *points = fixPointsInfinity(element); switch (element->type) { case kCGPathElementMoveToPoint: @@ -44,6 +83,8 @@ void applier (void *info, const CGPathElement *element) { CGPathCloseSubpath(path); break; } + + free(points); } CGPathRef CGPathCreateByOffsettingPath (CGPathRef aPath, CGFloat x, CGFloat y) { @@ -51,8 +92,8 @@ CGPathRef CGPathCreateByOffsettingPath (CGPathRef aPath, CGFloat x, CGFloat y) { PathInfo *info = (PathInfo *) malloc(sizeof(PathInfo)); info->path = path; - info->offX = x; - info->offY = y; + info->offX = fixInfinity(x); + info->offY = fixInfinity(y); CGPathApply(aPath, info, &applier); free(info); @@ -64,10 +105,10 @@ void applyPathTranslation (void *info, const CGPathElement *element) { PathInfo *pathInfo = (PathInfo *) info; CGMutablePathRef path = pathInfo->path; - CGFloat x = pathInfo->offX; - CGFloat y = pathInfo->offY; + CGFloat x = fixInfinity(pathInfo->offX); + CGFloat y = fixInfinity(pathInfo->offY); - const CGPoint *points = element->points; + CGPoint *points = fixPointsInfinity(element); switch (element->type) { case kCGPathElementMoveToPoint: @@ -89,6 +130,8 @@ void applyPathTranslation (void *info, const CGPathElement *element) { CGPathCloseSubpath(path); break; } + + free(points); } CGPathRef CGPathCreateByTranslatingPath (CGPathRef aPath, CGFloat x, CGFloat y) { @@ -96,8 +139,8 @@ CGPathRef CGPathCreateByTranslatingPath (CGPathRef aPath, CGFloat x, CGFloat y) PathInfo *info = (PathInfo *) malloc(sizeof(PathInfo)); info->path = path; - info->offX = x; - info->offY = y; + info->offX = fixInfinity(x); + info->offY = fixInfinity(y); CGPathApply(aPath, info, &applyPathTranslation); free(info); diff --git a/Source/QuartzCore additions/SVGGradientLayer.h b/Source/QuartzCore additions/SVGGradientLayer.h index bb2ba411b..787fe9922 100644 --- a/Source/QuartzCore additions/SVGGradientLayer.h +++ b/Source/QuartzCore additions/SVGGradientLayer.h @@ -7,16 +7,21 @@ // #import -#import -#import "SVGTransformable.h" +#import "SVGGradientElement.h" -static NSString * const kExt_CAGradientLayerRadial = @"radialGradient"; +/** + Apple's built-in CAGradientLayer does not support the radial gradient in SVG spec which allows user to provide `cx`, `cy`, `r`, `fx`, `fy`, `fr` 6 args. + The built-in `kCAGradientLayerRadial` type only supports a ellipse and take `cx`, `cy`, `r` 3 args. Sadlly we can not directly use it for radial gardient. + So we have to subclass and use the low-level API `CGContextDrawRadialGradient` using custom drawing to follow SVG spec. + + Also, though we can use `CAGradientLayer` for all linear gradient. Apples contains bug rending the gradient using `drawInContext:` method on iOS only (but works well on macOS), which will contains some strange bounding rects. This will break `SVGFastImageView` usage (but works well on SVGLayeredImageView). + So we have to use the low-level API `CGContextDrawLinearGradient` using custom drawing to as well. + */ +@interface SVGGradientLayer : CAGradientLayer -@interface SVGGradientLayer : CAGradientLayer - -@property (nonatomic, readwrite) CGPathRef maskPath; -@property (nonatomic, readwrite, retain) NSArray *stopIdentifiers; - -- (void)setStopColor:(UIColor *)color forIdentifier:(NSString *)identifier; +@property (nonatomic, strong) SVGGradientElement *gradientElement; +@property (nonatomic, assign) CGRect objectRect; +@property (nonatomic, assign) SVGRect viewportRect; +@property (nonatomic, assign) CGAffineTransform absoluteTransform; @end diff --git a/Source/QuartzCore additions/SVGGradientLayer.m b/Source/QuartzCore additions/SVGGradientLayer.m index 17b783513..6dbd4199d 100644 --- a/Source/QuartzCore additions/SVGGradientLayer.m +++ b/Source/QuartzCore additions/SVGGradientLayer.m @@ -7,105 +7,204 @@ // #import "SVGGradientLayer.h" +#import "SVGRadialGradientElement.h" +#import "SVGLinearGradientElement.h" +#import "CALayerWithClipRender.h" @implementation SVGGradientLayer -@synthesize maskPath; -@synthesize stopIdentifiers; -@synthesize transform; - -- (void)dealloc { - CGPathRelease(maskPath); - [stopIdentifiers release]; - [super dealloc]; +- (void)renderInContext:(CGContextRef)ctx { + if (!self.gradientElement) { + [super renderInContext:ctx]; + return; + } + if ([self.gradientElement isKindOfClass:[SVGRadialGradientElement class]]) { + [self renderRadialGradientInContext:ctx]; + } else if ([self.gradientElement isKindOfClass:[SVGLinearGradientElement class]]) { + [self renderLinearGradientInContext:ctx]; + } } -- (void)setMaskPath:(CGPathRef)maskP { - if (maskP != maskPath) { - CGPathRelease(maskPath); - maskPath = CGPathRetain(maskP); +- (CGGradientRef)createCGGradient { + SVGGradientElement *gradientElement = self.gradientElement; + if ([gradientElement isKindOfClass:[SVGRadialGradientElement class]]) { + SVGLength *svgR = ((SVGRadialGradientElement *)gradientElement).r; + if (svgR.value <= 0) { + return nil; + } + } + // CGGradient + NSArray *colors = gradientElement.colors; + NSArray *locations = gradientElement.locations; + if (colors.count == 0) { + SVGKitLogWarn(@"[%@] colors count is zero", [self class]); + return NULL; } + if (colors.count != locations.count) { + SVGKitLogWarn(@"[%@] colors count : %lu != locations count : %lu", [self class], (unsigned long)colors.count, (unsigned long)locations.count); + return NULL; + } + CGFloat locations_array[locations.count]; + CGColorSpaceRef colorSpace = NULL; + for (int i = 0; i < locations.count; i++) { + CGFloat location = [[locations objectAtIndex:i] doubleValue]; + CGColorRef colorRef = (__bridge CGColorRef)[colors objectAtIndex:i]; + locations_array[i] = location; + if (!colorSpace) { + colorSpace = CGColorGetColorSpace(colorRef); + } + } + + CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations_array); + CGColorSpaceRelease(colorSpace); + + return gradient; } -- (void)renderInContext:(CGContextRef)ctx { +- (void)renderLinearGradientInContext:(CGContextRef)ctx { + SVGLinearGradientElement *gradientElement = (SVGLinearGradientElement *)self.gradientElement; + BOOL inUserSpace = gradientElement.gradientUnits == SVG_UNIT_TYPE_USERSPACEONUSE; + CGRect objectRect = self.objectRect; + CGRect rectForRelativeUnits = inUserSpace ? CGRectFromSVGRect( self.viewportRect ) : objectRect; + + CGFloat width = CGRectGetWidth(rectForRelativeUnits); + CGFloat height = CGRectGetHeight(rectForRelativeUnits); + CGFloat x1 = [gradientElement.x1 pixelsValueWithGradientDimension:width]; + CGFloat y1 = [gradientElement.y1 pixelsValueWithGradientDimension:height]; + CGFloat x2 = [gradientElement.x2 pixelsValueWithGradientDimension:width]; + CGFloat y2 = [gradientElement.y2 pixelsValueWithGradientDimension:height]; + CGPoint gradientStartPoint = CGPointMake(x1, y1); + CGPoint gradientEndPoint = CGPointMake(x2, y2); + + // transforms + CGAffineTransform selfTransform = gradientElement.transform; + CGAffineTransform trans = CGAffineTransformMakeTranslation(-CGRectGetMinX(objectRect), + -CGRectGetMinY(objectRect)); + CGAffineTransform absoluteTransform = CGAffineTransformConcat(self.absoluteTransform,trans); + + // CGGradient + CGGradientRef gradient = [self createCGGradient]; + CGContextSaveGState(ctx); - CGContextAddPath(ctx, maskPath); - CGContextClip(ctx); - if ([self.type isEqualToString:kExt_CAGradientLayerRadial]) { - - size_t num_locations = self.locations.count; - - int numbOfComponents = 0; - CGColorSpaceRef colorSpace = NULL; - CGContextConcatCTM(ctx, CGAffineTransformMake(1, 0, 0, 1, self.startPoint.x, self.startPoint.y)); - CGContextConcatCTM(ctx, self.transform); - CGContextConcatCTM(ctx, CGAffineTransformMake(1, 0, 0, 1, -self.startPoint.x, -self.startPoint.y)); - - if (self.colors.count) { - CGColorRef colorRef = (CGColorRef)[self.colors objectAtIndex:0]; - numbOfComponents = CGColorGetNumberOfComponents(colorRef); - colorSpace = CGColorGetColorSpace(colorRef); + { + // clip the mask + if (self.mask) + { + [CALayerWithClipRender maskLayer:self inContext:ctx]; } - - float *locations = calloc(num_locations, sizeof(float)); - float *components = calloc(num_locations, numbOfComponents * sizeof(float)); - - for (int x = 0; x < num_locations; x++) { - locations[x] = [[self.locations objectAtIndex:x] floatValue]; - const CGFloat *comps = CGColorGetComponents((CGColorRef)[self.colors objectAtIndex:x]); - for (int y = 0; y < numbOfComponents; y++) { - int shift = numbOfComponents * x; - components[shift + y] = comps[y]; - } + if(inUserSpace == YES) { +#pragma mark User Space On Use + // transform absolute - due to user space + CGContextConcatCTM(ctx, absoluteTransform); + } else { +#pragma mark Object Bounding Box } - CGPoint position = self.startPoint; - CGFloat radius = floorf(self.endPoint.x * self.bounds.size.width); - CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, num_locations); + // set the opacity + CGContextSetAlpha(ctx, self.opacity); - CGContextDrawRadialGradient(ctx, gradient, position, 0, position, radius, kCGGradientDrawsAfterEndLocation); + // transform the context + CGContextConcatCTM(ctx, selfTransform); - free(locations); - free(components); + // draw the gradient + CGGradientDrawingOptions options = kCGGradientDrawsBeforeStartLocation| + kCGGradientDrawsAfterEndLocation; + + CGContextDrawLinearGradient(ctx, gradient, gradientStartPoint, + gradientEndPoint, options); CGGradientRelease(gradient); - } else { - [super renderInContext:ctx]; - } + }; CGContextRestoreGState(ctx); } -- (void)setStopColor:(UIColor *)color forIdentifier:(NSString *)identifier { - int i = 0; - for (NSString *key in stopIdentifiers) { - if ([key isEqualToString:identifier]) { - NSMutableArray *arr = [NSMutableArray arrayWithArray:self.colors]; - const CGFloat *colors = CGColorGetComponents((CGColorRef)[arr objectAtIndex:i]); - float a = colors[3]; - const CGFloat *colors2 = CGColorGetComponents(color.CGColor); - float r = colors2[0]; - float g = colors2[1]; - float b = colors2[2]; - [arr removeObjectAtIndex:i]; - [arr insertObject:(id)[UIColor colorWithRed:r green:g blue:b alpha:a].CGColor atIndex:i]; - [self setColors:[NSArray arrayWithArray:arr]]; - return; +-(void)renderRadialGradientInContext:(CGContextRef)ctx { + SVGRadialGradientElement *gradientElement = (SVGRadialGradientElement *)self.gradientElement; + BOOL inUserSpace = gradientElement.gradientUnits == SVG_UNIT_TYPE_USERSPACEONUSE; + CGRect objectRect = self.objectRect; + CGRect rectForRelativeUnits = inUserSpace ? CGRectFromSVGRect( self.viewportRect ) : objectRect; + + CGFloat width = CGRectGetWidth(rectForRelativeUnits); + CGFloat height = CGRectGetHeight(rectForRelativeUnits); + CGFloat cx = [gradientElement.cx pixelsValueWithGradientDimension:width]; + CGFloat cy = [gradientElement.cy pixelsValueWithGradientDimension:height]; + CGPoint startPoint = CGPointMake(cx, cy); + + CGFloat val = MIN(width, height); + CGFloat radius = [gradientElement.r pixelsValueWithGradientDimension:val]; + CGFloat focalRadius = [gradientElement.fr pixelsValueWithGradientDimension:val]; + + CGFloat fx = [gradientElement.fx pixelsValueWithGradientDimension:width]; + CGFloat fy = [gradientElement.fy pixelsValueWithGradientDimension:height]; + + CGPoint gradientEndPoint = CGPointMake(fx, fy); + CGPoint gradientStartPoint = startPoint; + + // transforms + CGAffineTransform selfTransform = gradientElement.transform; + CGAffineTransform trans = CGAffineTransformMakeTranslation(-CGRectGetMinX(objectRect), + -CGRectGetMinY(objectRect)); + CGAffineTransform absoluteTransform = CGAffineTransformConcat(self.absoluteTransform,trans); + + // CGGradient + CGGradientRef gradient = [self createCGGradient]; + + CGContextSaveGState(ctx); + { + // clip the mask + if (self.mask) + { + [CALayerWithClipRender maskLayer:self inContext:ctx]; } - i++; - } -} - -- (BOOL)containsPoint:(CGPoint)p { - BOOL boundsContains = CGRectContainsPoint(self.bounds, p); - if( boundsContains ) - { - BOOL pathContains = CGPathContainsPoint(self.maskPath, NULL, p, false); - - if( pathContains ) - { - return TRUE; - } - } - return FALSE; +#pragma mark User Space On Use + if(inUserSpace == YES) { + // work out the new radius + CGFloat rad = 2 * radius; + CGRect rect = CGRectMake(startPoint.x, startPoint.y, rad, rad); + rect = CGRectApplyAffineTransform(rect, selfTransform); + rect = CGRectApplyAffineTransform(rect, absoluteTransform); + radius = CGRectGetHeight(rect)/2.f; + + // transform absolute - due to user space + CGContextConcatCTM(ctx, absoluteTransform); + } else { +#pragma mark Object Bounding Box + // SVG spec: transform if width or height is not equal + if(CGRectGetWidth(objectRect) != CGRectGetHeight(objectRect)) { + CGAffineTransform tr = CGAffineTransformMakeTranslation(gradientStartPoint.x, + gradientStartPoint.y); + if(CGRectGetWidth(objectRect) > CGRectGetHeight(objectRect)) { + tr = CGAffineTransformScale(tr, CGRectGetWidth(objectRect)/CGRectGetHeight(objectRect), 1); + } else { + tr = CGAffineTransformScale(tr, 1.f, CGRectGetHeight(objectRect)/CGRectGetWidth(objectRect)); + } + tr = CGAffineTransformTranslate(tr, -gradientStartPoint.x, -gradientStartPoint.y); + selfTransform = CGAffineTransformConcat(tr, selfTransform); + } + } + + // set the opacity + CGContextSetAlpha(ctx, self.opacity); + +#pragma mark Default drawing + // transform the context + CGContextConcatCTM(ctx, selfTransform); + + if (gradient) { + // draw the gradient + CGGradientDrawingOptions options = kCGGradientDrawsBeforeStartLocation| + kCGGradientDrawsAfterEndLocation; + CGContextDrawRadialGradient(ctx, gradient, + gradientEndPoint, focalRadius, gradientStartPoint, + radius, options); + CGGradientRelease(gradient); + } else { + // draw the background + CGColorRef backgroundColor = self.backgroundColor; + CGContextSetFillColorWithColor(ctx, backgroundColor); + CGContextFillRect(ctx, CGRectMake(0, 0, CGRectGetWidth(objectRect), CGRectGetHeight(objectRect))); + } + }; + CGContextRestoreGState(ctx); } @end diff --git a/Source/QuartzCore additions/SVGKLayer.h b/Source/QuartzCore additions/SVGKLayer.h index 2895f127d..bd510260e 100644 --- a/Source/QuartzCore additions/SVGKLayer.h +++ b/Source/QuartzCore additions/SVGKLayer.h @@ -29,7 +29,9 @@ */ @interface SVGKLayer : CALayer -@property(nonatomic,retain) SVGKImage* SVGImage; -@property(nonatomic) BOOL showBorder; /*< mostly for debugging - adds a coloured 1-pixel border around the image */ +@property(nonatomic,strong) SVGKImage* SVGImage; +@property(nonatomic) BOOL showBorder; /**< mostly for debugging - adds a coloured 1-pixel border around the image */ + +@property (nonatomic, strong) NSDate* startRenderTime, * endRenderTime; /**< for debugging, lets you know how long it took to add/generate the CALayer (may have been cached! Only SVGKImage knows true times) */ @end diff --git a/Source/QuartzCore additions/SVGKLayer.m b/Source/QuartzCore additions/SVGKLayer.m index b5fc6e615..5997ad8b0 100644 --- a/Source/QuartzCore additions/SVGKLayer.m +++ b/Source/QuartzCore additions/SVGKLayer.m @@ -6,14 +6,12 @@ @implementation SVGKLayer } @synthesize SVGImage = _SVGImage; -@synthesize showBorder; - -//self.backgroundColor = [UIColor clearColor]; +@synthesize showBorder = _showBorder; /** Apple requires this to be implemented by CALayer subclasses */ -+(id)layer ++ (id)layer { - SVGKLayer* layer = [[[SVGKLayer alloc] init] autorelease]; + SVGKLayer* layer = [[SVGKLayer alloc] init]; return layer; } @@ -23,21 +21,20 @@ - (id)init if (self) { self.borderColor = [UIColor blackColor].CGColor; - - [self addObserver:self forKeyPath:@"showBorder" options:NSKeyValueObservingOptionNew context:NULL]; } return self; } --(void)setSVGImage:(SVGKImage *) newImage +- (void)setSVGImage:(SVGKImage *)newImage { if( newImage == _SVGImage ) return; + self.startRenderTime = self.endRenderTime = nil; // set to nil, so that watchers know it hasn't loaded yet + /** 1: remove old */ if( _SVGImage != nil ) { [_SVGImage.CALayerTree removeFromSuperlayer]; - [_SVGImage release]; } /** 2: update pointer */ @@ -46,36 +43,22 @@ -(void)setSVGImage:(SVGKImage *) newImage /** 3: add new */ if( _SVGImage != nil ) { - [_SVGImage retain]; + self.startRenderTime = [NSDate date]; [self addSublayer:_SVGImage.CALayerTree]; + self.endRenderTime = [NSDate date]; } } -- (void)dealloc +- (void)setShowBorder:(BOOL)shouldShow { - //FIXME: Apple crashes on this line, even though BY DEFINITION Apple should not be crashing: [self removeObserver:self forKeyPath:@"showBorder"]; - - self.SVGImage = nil; - - [super dealloc]; + _showBorder = shouldShow; + self.borderWidth = shouldShow ? 1.0f : 0.0f; + [self setNeedsDisplay]; } -/** Trigger a call to re-display (at higher or lower draw-resolution) (get Apple to call drawRect: again) */ --(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context +- (void)dealloc { - if( [keyPath isEqualToString:@"showBorder"] ) - { - if( self.showBorder ) - { - self.borderWidth = 1.0f; - } - else - { - self.borderWidth = 0.0f; - } - - [self setNeedsDisplay]; - } + self.SVGImage = nil; } @end diff --git a/Source/QuartzCore additions/SVGTextLayer.h b/Source/QuartzCore additions/SVGTextLayer.h new file mode 100644 index 000000000..4941787e7 --- /dev/null +++ b/Source/QuartzCore additions/SVGTextLayer.h @@ -0,0 +1,17 @@ +// +// SVGTextLayer.h +// SVGKit-iOS +// +// Created by lizhuoli on 2018/11/6. +// Copyright © 2018 na. All rights reserved. +// + +#import + +/** + On macOS, we use the flipped coordinate system. However, Apple's `CATextLayer` render the text using `contentsAreFlipped` property. Which is set to NO and this will cause the text element been drawn flipped unlike what it's drawn on iOS. We use this subclass to override that value on macOS. + Besides this fix, this class may also implement more features to match the SVG spec in the future, such as gradient stroke (which currently is not supported) + */ +@interface SVGTextLayer : CATextLayer + +@end diff --git a/Source/QuartzCore additions/SVGTextLayer.m b/Source/QuartzCore additions/SVGTextLayer.m new file mode 100644 index 000000000..c0d658a8c --- /dev/null +++ b/Source/QuartzCore additions/SVGTextLayer.m @@ -0,0 +1,22 @@ +// +// SVGTextLayer.m +// SVGKit-iOS +// +// Created by lizhuoli on 2018/11/6. +// Copyright © 2018 na. All rights reserved. +// + +#import "SVGTextLayer.h" +#import "SVGKDefine.h" + +@implementation SVGTextLayer + +- (BOOL)contentsAreFlipped { +#if SVGKIT_MAC + return YES; +#else + return [super contentsAreFlipped]; +#endif +} + +@end diff --git a/Source/SVGKDefine.h b/Source/SVGKDefine.h new file mode 100644 index 000000000..94f7d2bee --- /dev/null +++ b/Source/SVGKDefine.h @@ -0,0 +1,72 @@ +/** + SVGKDefine.h + + SVGKDefine define some common macro used for public header or private header. + Currently here are some platform define to allow us to simply write code cross Apple's platforms. + */ + +#ifndef SVGKDefine_h +#define SVGKDefine_h + +#include "TargetConditionals.h" + +// Apple's defines from TargetConditionals.h are a bit weird. +// Seems like TARGET_OS_MAC is always defined (on all platforms). +// To determine if we are running on OSX, we can only rely on TARGET_OS_IPHONE=0 and all the other platforms +#if !TARGET_OS_IPHONE && !TARGET_OS_IOS && !TARGET_OS_TV && !TARGET_OS_WATCH +#define SVGKIT_MAC 1 +#else +#define SVGKIT_MAC 0 +#endif + +// iOS and tvOS are very similar, UIKit exists on both platforms +// Note: watchOS also has UIKit, but it's very limited +#if TARGET_OS_IOS || TARGET_OS_TV +#define SVGKIT_UIKIT 1 +#else +#define SVGKIT_UIKIT 0 +#endif + +#if TARGET_OS_IOS +#define SVGKIT_IOS 1 +#else +#define SVGKIT_IOS 0 +#endif + +#if TARGET_OS_TV +#define SVGKIT_TV 1 +#else +#define SVGKIT_TV 0 +#endif + +#if TARGET_OS_WATCH +#define SVGKIT_WATCH 1 +#else +#define SVGKIT_WATCH 0 +#endif + +#if SVGKIT_MAC +#ifndef UIImage +#define UIImage NSImage +#endif +#ifndef UIImageView +#define UIImageView NSImageView +#endif +#ifndef UIView +#define UIView NSView +#endif +#ifndef UIColor +#define UIColor NSColor +#endif +#ifndef UIFont +#define UIFont NSFont +#endif +#endif + +#if SVGKIT_MAC +#import +#else +#import +#endif + +#endif /* SVGKDefine_h */ diff --git a/Source/SVGKImage.h b/Source/SVGKImage.h index 98aa0d496..da1b71f00 100644 --- a/Source/SVGKImage.h +++ b/Source/SVGKImage.h @@ -12,7 +12,7 @@ (each time you zoom in, we want to re-render the SVG as a higher-resolution set of pixels) We use the exact same method names as UIImage, and try to be literally as identical as possible. - + Creating an SVGKImage: - PREFERRED: use the "imageNamed:" method @@ -35,24 +35,24 @@ */ -#import - -#import "SVGLength.h" -#import "SVGDocument.h" -#import "SVGElement.h" -#import "SVGSVGElement.h" +#import "SVGKDefine.h" +#import "SVGKParser.h" // needed for asynchronous loading method-signature -#import "SVGKParser.h" -#import "SVGKSource.h" -#import "SVGKParseResult.h" +@class SVGDocument; +@class SVGSVGElement; +@class SVGKSource; +@class SVGKParseResult; #define ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED 1 // if ENABLED, then ALL instances created with imageNamed: are shared, and are NEVER RELEASED @class SVGDefsElement; +@class SVGKImage; // needed for typedef below +typedef void (^SVGKImageAsynchronousLoadingDelegate)(SVGKImage* loadedImage, SVGKParseResult* parseResult ); + @interface SVGKImage : NSObject // doesn't extend UIImage because Apple made UIImage immutable { -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED BOOL cameFromGlobalCache; #endif } @@ -61,25 +61,83 @@ NB you can get MUCH BETTER performance using the methods such as exportUIImageAntiAliased and exportNSDataAntiAliased */ -@property (nonatomic, readonly) UIImage* UIImage; +@property (weak, nonatomic, readonly) UIImage* UIImage; -@property (nonatomic, retain, readonly) SVGKSource* source; -@property (nonatomic, retain, readonly) SVGKParseResult* parseErrorsAndWarnings; +@property (nonatomic, strong, readonly) SVGKSource* source; +@property (nonatomic, strong, readonly) SVGKParseResult* parseErrorsAndWarnings; -@property (nonatomic, retain, readonly) SVGDocument* DOMDocument; -@property (nonatomic, retain, readonly) SVGSVGElement* DOMTree; // needs renaming + (possibly) replacing by DOMDocument -@property (nonatomic, retain, readonly) CALayer* CALayerTree; -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED -@property (nonatomic, retain, readonly) NSString* nameUsedToInstantiate; +@property (nonatomic, strong, readonly) SVGDocument* DOMDocument; +@property (nonatomic, strong, readonly) SVGSVGElement* DOMTree; // needs renaming + (possibly) replacing by DOMDocument +@property (nonatomic, strong, readonly) CALayer* CALayerTree; +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +@property (nonatomic, strong, readonly) NSString* nameUsedToInstantiate; #endif #pragma mark - methods to quick load an SVG as an image -+ (SVGKImage *)imageNamed:(NSString *)name; // load from main bundle +/** + This is the preferred method for loading SVG files. + + Like Apple's [UIImage imageNamed:] method, it has a global cache of loaded SVG files to greatly + increase performance. Unlike UIImage, SVGKImage's tend to be light in memory usage, but if needed, + you can disable this at compile-time by setting ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED to 0. + + As of SVGKit 1.2.0, this method: + + - Finds the SVG file (adding .svg extension if missing) in the App's sandboxed Documents folder + - If that's missing, it finds the same file in the App's Bundle (i.e. the files stored at compile-time by Xcode, and shipped as the app) + - Creates an SVGKSource so that you can later inspect exactly where it found the file + */ ++ (SVGKImage *)imageNamed:(NSString *)name; ++ (SVGKImage *)imageNamed:(NSString *)name withCacheKey:(NSString *)key; ++ (SVGKImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle; ++ (SVGKImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle withCacheKey:(NSString *)key; +/** + Almost identical to imageNamed: except that it performs the parse in a separate thread. + + Returns an SVGKParser object that you can cancel, or inspect for progress (using parser.currentParseRun) + + UNLESS the image was already loaded, and a cached version can be returned - in which case, + returns nil and immmediately calls the completion block + */ ++(SVGKParser *) imageAsynchronouslyNamed:(NSString *)name onCompletion:(SVGKImageAsynchronousLoadingDelegate) blockCompleted; + (SVGKImage *)imageWithContentsOfFile:(NSString *)path; -#if TARGET_OS_IPHONE // doesn't exist on OS X's Image class -+ (SVGKImage *)imageWithData:(NSData *)data; -#endif -+ (SVGKImage*) imageWithSource:(SVGKSource *)newSource; // if you have custom source's you want to use ++ (SVGKImage *)imageWithContentsOfURL:(NSURL *)url; ++ (SVGKParser*) imageParserWithContentsOfFileAsynchronously:(NSString *)aPath onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted; ++ (SVGKImage*) imageWithContentsOfFileAsynchronously:(NSString *)aPath onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted; + +/** + PREFERABLY: these are our only method, apart from the convenience "imageNamed" + + Creating an SVG from raw data; this is not recommended: SVG requires knowledge + of at least the URL where it came from (as it can contain relative file-links internally). + + If you need to create an SVG e.g. directly from raw bytes, then you MUST use + this method and ADDITIONALLY wrap your data into an SVGKSource. + + This is because SVG's cannot parse correctly without the metadata about where + the file came from: e.g. they cannot process relative links, cross-references, etc. + */ ++(SVGKImage*) imageWithData:(NSData *)newNSData; // if you have custom source's you want to use ++ (SVGKParser*) imageParserWithDataAsynchronously:(NSData *)newNSData onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted; ++ (SVGKImage*) imageWithDataAsynchronously:(NSData *)newNSData onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted; + +/** + PREFERABLY: these are our only method, apart from the convenience "imageNamed" + + The first one is synchronous, the second is asynchronous. + + If you need to create an SVG e.g. directly from raw bytes, then you MUST use + this method and ADDITIONALLY wrap your data into an SVGKSource. + + This is because SVG's cannot parse correctly without the metadata about where + the file came from: e.g. they cannot process relative links, cross-references, etc. + */ ++(SVGKImage*) imageWithSource:(SVGKSource *)newSource; // if you have custom source's you want to use + +/** + This is the asynchronous version of imageWithSource: + */ ++(SVGKParser *) imageWithSource:(SVGKSource *)source onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted; - (id)initWithContentsOfFile:(NSString *)path; - (id)initWithData:(NSData *)data; @@ -159,7 +217,7 @@ - (void)drawAsPatternInRect:(CGRect)rect; // draws the image as a CGPattern // animated images. When set as UIImageView.image, animation will play in an infinite loop until removed. Drawing will render the first image -#if TARGET_OS_IPHONE +#if SVGKIT_UIKIT + (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration ;//__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); read sequnce of files with suffix starting at 0 or 1 + (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets duration:(NSTimeInterval)duration ;//__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); // squence of files + (UIImage *)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration ;//__OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0); @@ -173,8 +231,6 @@ */ #pragma mark ---------end of unsupported items -+ (SVGKImage*)imageWithContentsOfURL:(NSURL *)url; - #pragma mark - core methods for interacting with an SVG image usefully (not from UIImage) /*! If you want to provide a custom SVGKSource */ @@ -187,7 +243,7 @@ NB: this is frequently used if you have to add custom SVGKParserExtensions to parse an SVG which contains custom tags */ -- (id)initWithParsedSVG:(SVGKParseResult *)parseResult; +- (id)initWithParsedSVG:(SVGKParseResult *)parseResult fromSource:(SVGKSource*) parseSource; /*! Creates a new instance each time you call it. This should ONLY be used if you specifically need to duplicate @@ -234,36 +290,28 @@ because it no longer needs one) Useful for extracting individual features from an SVG + + Note that this ONLY clones the layer, does NOT include its sublayers. If you want to get a copy that includes + the sublayers, use [self newCopyPositionedAbsoluteOfLayer:withSubLayers:TRUE] */ -(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer; -/*! returns all the individual CALayer's in the full layer tree, indexed by the SVG identifier of the SVG node that created that layer */ -- (NSDictionary*) dictionaryOfLayers; - -/** - Higher-performance version of .UIImage property (the property uses this method, but you can tweak the parameters for better performance / worse accuracy) - - NB: you can get BETTER performance using the exportNSDataAntiAliased: version of this method, becuase you bypass Apple's slow code for making UIImage objects - - @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost - @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate - @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality - */ --(UIImage *) exportUIImageAntiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality; /** - Highest-performance version of .UIImage property (this minimizes memory usage and can lead to large speed-ups e.g. when using SVG images as textures with OpenGLES) - - NB: we could probably achieve get even higher performance in OpenGL by sidestepping NSData entirely and using raw byte arrays (should result in zero-copy). + As for newCopyPositionedAbsoluteOfLayer:, but allows you to choose between 1 layer only (default) + or a recursive copy which includes all sublayers. - @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost - @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate - @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality + Only the root/parent layer will be positioned absolute - all the sublayers will still be relatively-positioned + within their parents. */ --(NSData*) exportNSDataAntiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis; +-(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer withSubLayers:(BOOL) recursive; + +/*! returns all the individual CALayer's in the full layer tree, indexed by the SVG identifier of the SVG node that created that layer */ +- (NSDictionary*) dictionaryOfLayers; #pragma mark - Useful bonus methods, will probably move to a different class at some point /** alters the SVG image's size directly (by changing the viewport) so that it will fit inside the specifed area without stretching or deforming */ -(void) scaleToFitInside:(CGSize) maxSize; ++(void) clearCache; -@end \ No newline at end of file +@end diff --git a/Source/SVGKImage.m b/Source/SVGKImage.m index 4266c562c..630314343 100644 --- a/Source/SVGKImage.m +++ b/Source/SVGKImage.m @@ -6,20 +6,29 @@ #import "SVGTitleElement.h" #import "SVGPathElement.h" #import "SVGUseElement.h" +#import "SVGClipPathElement.h" +#import "SVGSwitchElement.h" +#import "NodeList+Mutable.h" #import "SVGSVGElement_Mutable.h" // so that changing .size can change the SVG's .viewport #import "SVGKParserSVG.h" -#import "SVGKSourceLocalFile.h" -#import "SVGKSourceURL.h" +#import "SVGKSourceLocalFile.h" // for convenience constructors that load from filename +#import "SVGKSourceURL.h" // for convenience constructors that load from URL as string +#import "SVGKSourceNSData.h" // for convenience constructors that load from raw incoming NSData #import "CALayer+RecursiveClone.h" +#if SVGKIT_MAC +#import "SVGKExporterNSImage.h" // needed for .NSImage property +#else +#import "SVGKExporterUIImage.h" // needed for .UIImage property +#endif -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED @interface SVGKImageCacheLine : NSObject @property(nonatomic) int numberOfInstances; -@property(nonatomic,retain) SVGKImage* mainInstance; +@property(nonatomic,strong) SVGKImage* mainInstance; @end @implementation SVGKImageCacheLine @synthesize numberOfInstances; @@ -31,26 +40,17 @@ @interface SVGKImage () @property(nonatomic) CGSize internalSizeThatWasSetExplicitlyByUser; -@property (nonatomic, retain, readwrite) SVGKParseResult* parseErrorsAndWarnings; +@property (nonatomic, strong, readwrite) SVGKParseResult* parseErrorsAndWarnings; -@property (nonatomic, retain, readwrite) SVGKSource* source; +@property (nonatomic, strong, readwrite) SVGKSource* source; -@property (nonatomic, retain, readwrite) SVGDocument* DOMDocument; -@property (nonatomic, retain, readwrite) SVGSVGElement* DOMTree; // needs renaming + (possibly) replacing by DOMDocument -@property (nonatomic, retain, readwrite) CALayer* CALayerTree; -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED -@property (nonatomic, retain, readwrite) NSString* nameUsedToInstantiate; +@property (nonatomic, strong, readwrite) SVGDocument* DOMDocument; +@property (nonatomic, strong, readwrite) SVGSVGElement* DOMTree; // needs renaming + (possibly) replacing by DOMDocument +@property (nonatomic, strong, readwrite) CALayer* CALayerTree; +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +@property (nonatomic, strong, readwrite) NSString* nameUsedToInstantiate; #endif -/** - Lowest-level code used by all the "export" methods and by the ".UIImage" property - - @param shouldAntialias = Apple defaults to TRUE, but turn it off for small speed boost - @param multiplyFlatness = how many pixels a curve can be flattened by (Apple's internal setting) to make it faster to render but less accurate - @param interpolationQuality = Apple internal setting, c.f. Apple docs for CGInterpolationQuality - */ --(void) renderToContext:(CGContextRef) context antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis; - #pragma mark - UIImage methods cloned and re-implemented as SVG intelligent methods //NOT DEFINED: what is the scale for a SVGKImage? @property(nonatomic,readwrite) CGFloat scale __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); @@ -64,9 +64,9 @@ @implementation SVGKImage @synthesize scale = _scale; @synthesize source; @synthesize parseErrorsAndWarnings; -@synthesize nameUsedToInstantiate = _nameUsedToInstantiate; -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +@synthesize nameUsedToInstantiate = _nameUsedToInstantiate; static NSMutableDictionary* globalSVGKImageCache; #pragma mark - Respond to low-memory warnings by dumping the global static cache @@ -74,29 +74,53 @@ +(void) initialize { if( self == [SVGKImage class]) // Have to protect against subclasses ADDITIONALLY calling this, as a "[super initialize] line { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarningNotification:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#if SVGKIT_UIKIT + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarningOrBackgroundNotification:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveMemoryWarningOrBackgroundNotification:) name:UIApplicationDidEnterBackgroundNotification object:nil]; +#endif } } -+(void) didReceiveMemoryWarningNotification:(NSNotification*) notification -{ - DDLogCWarn(@"[%@] Low-mem; purging cache of %i SVGKImage's...", self, [globalSVGKImageCache count] ); ++(void) clearCache { + if ([globalSVGKImageCache count] == 0) return; + + SVGKitLogWarn(@"[%@] Low-mem, background or api clear; purging cache of %lu SVGKImages...", self, (unsigned long)[globalSVGKImageCache count] ); [globalSVGKImageCache removeAllObjects]; // once they leave the cache, if they are no longer referred to, they should automatically dealloc } + ++(void) didReceiveMemoryWarningOrBackgroundNotification:(NSNotification*) notification +{ + [self clearCache]; +} #endif #pragma mark - Convenience initializers -+ (SVGKImage *)imageNamed:(NSString *)name { - NSParameterAssert(name != nil); - -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED ++ (SVGKImage *)imageNamed:(NSString *)name +{ + return [self imageNamed:name inBundle:[NSBundle mainBundle] withCacheKey:@""]; +} + ++ (SVGKImage *)imageNamed:(NSString *)name withCacheKey:(NSString *)key +{ + return [self imageNamed:name inBundle:[NSBundle mainBundle] withCacheKey:key]; +} + ++ (SVGKImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle +{ + return [self imageNamed:name inBundle:[NSBundle mainBundle] withCacheKey:@""]; +} + ++ (SVGKImage *)imageNamed:(NSString *)name inBundle:(NSBundle *)bundle withCacheKey:(NSString *)key +{ +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED + NSString* cacheName = [key length] > 0 ? key : name; if( globalSVGKImageCache == nil ) { globalSVGKImageCache = [NSMutableDictionary new]; } - SVGKImageCacheLine* cacheLine = [globalSVGKImageCache valueForKey:name]; + SVGKImageCacheLine* cacheLine = [globalSVGKImageCache valueForKey:cacheName]; if( cacheLine != nil ) { cacheLine.numberOfInstances ++; @@ -104,37 +128,23 @@ + (SVGKImage *)imageNamed:(NSString *)name { } #endif - NSBundle *bundle = [NSBundle mainBundle]; - - if (!bundle) - return nil; - - NSString *newName = [name stringByDeletingPathExtension]; - NSString *extension = [name pathExtension]; - if ([@"" isEqualToString:extension]) { - extension = @"svg"; - } + SVGKSource *source = [SVGKSourceLocalFile internalSourceAnywhereInBundle:bundle usingName:name]; - NSString *path = [bundle pathForResource:newName ofType:extension]; - - if (!path) - { - DDLogCWarn(@"[%@] MISSING FILE, COULD NOT CREATE DOCUMENT: filename = %@, extension = %@", [self class], newName, extension); - return nil; - } - - SVGKImage* result = [self imageWithContentsOfFile:path]; + /** + Key moment: init and parse the SVGKImage + */ + SVGKImage* result = [self imageWithSource:source]; -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED if( result != nil ) { result->cameFromGlobalCache = TRUE; - result.nameUsedToInstantiate = name; + result.nameUsedToInstantiate = cacheName; - SVGKImageCacheLine* newCacheLine = [[[SVGKImageCacheLine alloc] init] autorelease]; + SVGKImageCacheLine* newCacheLine = [[SVGKImageCacheLine alloc] init]; newCacheLine.mainInstance = result; - [globalSVGKImageCache setValue:newCacheLine forKey:name]; + [globalSVGKImageCache setValue:newCacheLine forKey:cacheName]; } else { @@ -145,38 +155,146 @@ + (SVGKImage *)imageNamed:(NSString *)name { return result; } ++(SVGKParser *) imageAsynchronouslyNamed:(NSString *)name onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted +{ + return [self imageWithSource:[SVGKSourceLocalFile internalSourceAnywhereInBundleUsingName:name] onCompletion:blockCompleted]; +} + ++(SVGKParser *) imageWithSource:(SVGKSource *)source onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted +{ +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED + if( globalSVGKImageCache == nil ) + { + globalSVGKImageCache = [NSMutableDictionary new]; + } + + SVGKImageCacheLine* cacheLine = [globalSVGKImageCache valueForKey:source.keyForAppleDictionaries]; + if( cacheLine != nil ) + { + cacheLine.numberOfInstances ++; + + blockCompleted( cacheLine.mainInstance, /** (TODO: add a way for parse-results to chain each other, and say "I'm the cached version of this OTHER parseresult") original parse result: */ cacheLine.mainInstance.parseErrorsAndWarnings ); + return nil; + } +#endif + + /** + Key moment: init and parse the SVGKImage + */ + + SVGKParser* parser = [SVGKParser newParserWithDefaultSVGKParserExtensions:source]; + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), + ^{ + SVGKParseResult* parsedSVG = [parser parseSynchronously]; + + SVGKImage* finalImage = [[SVGKImage alloc] initWithParsedSVG:parsedSVG fromSource:source]; + +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED + if( finalImage != nil ) + { + finalImage->cameFromGlobalCache = TRUE; + finalImage.nameUsedToInstantiate = source.keyForAppleDictionaries; + + SVGKImageCacheLine* newCacheLine = [[SVGKImageCacheLine alloc] init]; + newCacheLine.mainInstance = finalImage; + + [globalSVGKImageCache setValue:newCacheLine forKey:source.keyForAppleDictionaries]; + } + else + { + NSLog(@"[%@] WARNING: not caching the output for new SVG image with source = %@, because it failed to load correctly", [self class], source ); + } +#endif + + blockCompleted( finalImage, parsedSVG ); + }); + + return parser; +} + + (SVGKImage*) imageWithContentsOfURL:(NSURL *)url { NSParameterAssert(url != nil); @synchronized(self) { - return [[[[self class] alloc] initWithContentsOfURL:url] autorelease]; + return [[[self class] alloc] initWithContentsOfURL:url]; } } + (SVGKImage*) imageWithContentsOfFile:(NSString *)aPath { @synchronized(self) { - return [[[[self class] alloc] initWithContentsOfFile:aPath] autorelease]; + return [[[self class] alloc] initWithContentsOfFile:aPath]; } } ++ (SVGKParser*) imageParserWithContentsOfFileAsynchronously:(NSString *)aPath onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted { + return [self imageWithSource:[SVGKSourceLocalFile sourceFromFilename:aPath] onCompletion:blockCompleted]; +} + ++ (SVGKImage*) imageWithContentsOfFileAsynchronously:(NSString *)aPath onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted { + + __block SVGKImage *image; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + [self imageWithSource:[SVGKSourceLocalFile sourceFromFilename:aPath] onCompletion:^(SVGKImage *loadedImage, SVGKParseResult *parseResult) { + image = loadedImage; + dispatch_semaphore_signal(semaphore); + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + return image; +} + + (SVGKImage*) imageWithSource:(SVGKSource *)newSource { NSParameterAssert(newSource != nil); @synchronized(self) { - return [[[[self class] alloc] initWithSource:newSource] autorelease]; + return [[[self class] alloc] initWithSource:newSource]; } } ++ (SVGKImage*) imageWithData:(NSData *)newNSData +{ + NSParameterAssert(newNSData != nil); + @synchronized(self) { + return [[[self class] alloc] initWithData:newNSData]; + } +} + ++ (SVGKParser*) imageParserWithDataAsynchronously:(NSData *)newNSData onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted { + NSParameterAssert(newNSData != nil); + SVGKitLogWarn(@"Creating an SVG from raw data; this is not recommended: SVG requires knowledge of at least the URL where it came from (as it can contain relative file-links internally). You should use the method [SVGKImage initWithSource:] instead and specify an SVGKSource with more detail" ); + + return [self imageWithSource:[SVGKSourceNSData sourceFromData:newNSData URLForRelativeLinks:nil] onCompletion:blockCompleted]; +} + ++ (SVGKImage*) imageWithDataAsynchronously:(NSData *)newNSData onCompletion:(SVGKImageAsynchronousLoadingDelegate)blockCompleted +{ + NSParameterAssert(newNSData != nil); + SVGKitLogWarn(@"Creating an SVG from raw data; this is not recommended: SVG requires knowledge of at least the URL where it came from (as it can contain relative file-links internally). You should use the method [SVGKImage initWithSource:] instead and specify an SVGKSource with more detail" ); + + __block SVGKImage *image; + dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); + + [self imageWithSource:[SVGKSourceNSData sourceFromData:newNSData URLForRelativeLinks:nil] onCompletion:^(SVGKImage *loadedImage, SVGKParseResult *parseResult) { + image = loadedImage; + dispatch_semaphore_signal(semaphore); + }]; + + dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); + return image; +} + -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { /** Remove and release (if appropriate) all cached render-output */ - DDLogVerbose(@"[%@] source data changed; de-caching cached data", [self class] ); + SVGKitLogVerbose(@"[%@] source data changed; de-caching cached data", [self class] ); self.CALayerTree = nil; } /** Designated Initializer */ -- (id)initWithParsedSVG:(SVGKParseResult *)parseResult { +- (id)initWithParsedSVG:(SVGKParseResult *)parseResult fromSource:(SVGKSource*) parseSource +{ self = [super init]; if (self) { @@ -189,6 +307,7 @@ - (id)initWithParsedSVG:(SVGKParseResult *)parseResult { { self.DOMDocument = parseErrorsAndWarnings.parsedDocument; self.DOMTree = DOMDocument.rootElement; + self.source = parseSource; } else { @@ -198,7 +317,7 @@ - (id)initWithParsedSVG:(SVGKParseResult *)parseResult { if ( self.DOMDocument == nil ) { - DDLogError(@"[%@] ERROR: failed to init SVGKImage with source = %@, returning nil from init methods", [self class], source ); + SVGKitLogError(@"[%@] ERROR: failed to init SVGKImage with source = %@, returning nil from init methods. Parser warnings and errors = %@", [self class], parseSource, parseErrorsAndWarnings ); self = nil; } @@ -211,10 +330,8 @@ - (id)initWithParsedSVG:(SVGKParseResult *)parseResult { - (id)initWithSource:(SVGKSource *)newSource { NSAssert( newSource != nil, @"Attempted to init an SVGKImage using a nil SVGKSource"); - self = [self initWithParsedSVG:[SVGKParser parseSourceUsingDefaultSVGKParser:newSource]]; - if (self) { - self.source = newSource; - } + self = [self initWithParsedSVG:[SVGKParser parseSourceUsingDefaultSVGKParser:newSource] fromSource:newSource]; + return self; } @@ -230,9 +347,18 @@ - (id)initWithContentsOfURL:(NSURL *)url { return [self initWithSource:[SVGKSourceURL sourceFromURL:url]]; } +- (id)initWithData:(NSData *)data +{ + NSParameterAssert(data != nil); + + SVGKitLogWarn(@"Creating an SVG from raw data; this is not recommended: SVG requires knowledge of at least the URL where it came from (as it can contain relative file-links internally). You should use the method [SVGKImage initWithSource:] instead and specify an SVGKSource with more detail" ); + + return [self initWithSource:[SVGKSourceNSData sourceFromData:data URLForRelativeLinks:nil]]; +} + - (void)dealloc { -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED if( self->cameFromGlobalCache ) { SVGKImageCacheLine* cacheLine = [globalSVGKImageCache valueForKey:self.nameUsedToInstantiate]; @@ -246,36 +372,21 @@ - (void)dealloc #endif //SOMETIMES CRASHES IN APPLE CODE, CAN'T WORK OUT WHY: [self removeObserver:self forKeyPath:@"DOMTree.viewport"]; + @try { + [self removeObserver:self forKeyPath:@"DOMTree.viewport"]; + } + @catch (NSException *exception) { + SVGKitLogError(@"Exception removing DOMTree.viewport observer"); + } - self.source = nil; - self.parseErrorsAndWarnings = nil; - self.DOMDocument = nil; - self.DOMTree = nil; - self.CALayerTree = nil; -#ifdef ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED - self.nameUsedToInstantiate = nil; +#if ENABLE_GLOBAL_IMAGE_CACHE_FOR_SVGKIMAGE_IMAGE_NAMED #endif - [super dealloc]; } //TODO mac alternatives to UIKit functions -#if TARGET_OS_IPHONE -+ (UIImage *)imageWithData:(NSData *)data -{ - NSAssert( FALSE, @"Method unsupported / not yet implemented by SVGKit" ); - return nil; -} -#endif - -- (id)initWithData:(NSData *)data -{ - NSAssert( FALSE, @"Method unsupported / not yet implemented by SVGKit" ); - return nil; -} - #pragma mark - UIImage methods we reproduce to make it act like a UIImage -(BOOL) hasSize @@ -381,7 +492,11 @@ -(void)setScale:(CGFloat)newScale -(UIImage *)UIImage { - return [self exportUIImageAntiAliased:TRUE curveFlatnessFactor:1.0f interpolationQuality:kCGInterpolationDefault]; // Apple defaults +#if SVGKIT_MAC + return [SVGKExporterNSImage exportAsNSImage:self antiAliased:TRUE curveFlatnessFactor:1.0f interpolationQuality:kCGInterpolationDefault]; // Apple defaults +#else + return [SVGKExporterUIImage exportAsUIImage:self antiAliased:TRUE curveFlatnessFactor:1.0f interpolationQuality:kCGInterpolationDefault]; // Apple defaults +#endif } // the these draw the image 'right side up' in the usual coordinate system with 'point' being the top-left. @@ -411,7 +526,7 @@ - (void)drawAsPatternInRect:(CGRect)rect // draws the image as a CGPattern NSAssert( FALSE, @"Method unsupported / not yet implemented by SVGKit" ); } -#if TARGET_OS_IPHONE +#if SVGKIT_UIKIT + (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration // read sequnce of files with suffix starting at 0 or 1 { NSAssert( FALSE, @"Method unsupported / not yet implemented by SVGKit" ); @@ -460,7 +575,7 @@ -(CALayer*) newCopyPositionedAbsoluteLayerWithIdentifier:(NSString *)identifier if( originalLayer == nil ) { - DDLogError(@"[%@] ERROR: requested a clone of CALayer with id = %@, but there is no layer with that identifier in the parsed SVG layer stack", [self class], identifier ); + SVGKitLogError(@"[%@] ERROR: requested a clone of CALayer with id = %@, but there is no layer with that identifier in the parsed SVG layer stack", [self class], identifier ); return nil; } else @@ -468,6 +583,11 @@ -(CALayer*) newCopyPositionedAbsoluteLayerWithIdentifier:(NSString *)identifier } -(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer +{ + return [self newCopyPositionedAbsoluteOfLayer:originalLayer withSubLayers:FALSE]; +} + +-(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer withSubLayers:(BOOL) recursive { /*CALayer* clonedLayer = [[[originalLayer class] alloc] init]; @@ -482,12 +602,18 @@ -(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer ((CAShapeLayer*)clonedLayer).fillColor = ((CAShapeLayer*)originalLayer).fillColor; }*/ - CALayer* clonedLayer = [originalLayer cloneShallow]; + CALayer* clonedLayer = recursive ? [originalLayer cloneRecursively] : [originalLayer cloneShallow]; if( clonedLayer == nil ) return nil; else { + /** CALayer has the magic valueForKey method */ + NSString* layerID = [originalLayer valueForKey:kSVGElementIdentifier]; + if( layerID != nil ) + [clonedLayer setValue:layerID forKey:kSVGElementIdentifier]; + + CGRect lFrame = clonedLayer.frame; CGFloat xOffset = 0.0; CGFloat yOffset = 0.0; @@ -495,15 +621,15 @@ -(CALayer*) newCopyPositionedAbsoluteOfLayer:(CALayer *)originalLayer if( currentLayer.superlayer == nil ) { - DDLogWarn(@"AWOOGA: layer %@ has no superlayer!", originalLayer ); + SVGKitLogWarn(@"AWOOGA: layer %@ has no superlayer!", originalLayer ); } while( currentLayer.superlayer != nil ) { - //DEBUG: DDLogVerbose(@"shifting (%2.2f, %2.2f) to accomodate offset of layer = %@ inside superlayer = %@", currentLayer.superlayer.frame.origin.x, currentLayer.superlayer.frame.origin.y, currentLayer, currentLayer.superlayer ); + //DEBUG: SVGKitLogVerbose(@"shifting (%2.2f, %2.2f) to accomodate offset of layer = %@ inside superlayer = %@", currentLayer.superlayer.frame.origin.x, currentLayer.superlayer.frame.origin.y, currentLayer, currentLayer.superlayer ); currentLayer = currentLayer.superlayer; - //DEBUG: DDLogVerbose(@"...next superlayer in positioning absolute = %@, %@", currentLayer, NSStringFromCGRect(currentLayer.frame)); + //DEBUG: SVGKitLogVerbose(@"...next superlayer in positioning absolute = %@, %@", currentLayer, NSStringFromCGRect(currentLayer.frame)); xOffset += currentLayer.frame.origin.x; yOffset += currentLayer.frame.origin.y; } @@ -520,42 +646,108 @@ - (CALayer *)newLayerWithElement:(SVGElement *)element { CALayer *layer = [element newLayer]; - //DEBUG: DDLogVerbose(@"[%@] DEBUG: converted SVG element (class:%@) to CALayer (class:%@ frame:%@ pointer:%@) for id = %@", [self class], NSStringFromClass([element class]), NSStringFromClass([layer class]), NSStringFromCGRect( layer.frame ), layer, element.identifier); + layer.hidden = ![self isElementVisible:element]; - NodeList* childNodes = element.childNodes; + //DEBUG: SVGKitLogVerbose(@"[%@] DEBUG: converted SVG element (class:%@) to CALayer (class:%@ frame:%@ pointer:%@) for id = %@", [self class], NSStringFromClass([element class]), NSStringFromClass([layer class]), NSStringFromCGRect( layer.frame ), layer, element.identifier); + NodeList* childNodes = element.childNodes; + Node* saveParentNode = nil; /** Special handling for tags - they have to masquerade invisibly as the node they are referring to */ if( [element isKindOfClass:[SVGUseElement class]] ) { SVGUseElement* useElement = (SVGUseElement*) element; - childNodes = useElement.instanceRoot.correspondingElement.childNodes; - } - - if ( childNodes.length < 1 ) { - return layer; - } + element = (SVGElement *)useElement.instanceRoot.correspondingElement; + + saveParentNode = element.parentNode; + element.parentNode = useElement; + + NodeList* nodeList = [[NodeList alloc] init]; + [nodeList.internalArray addObject:element]; + childNodes = nodeList; + } + else + if ( [element isKindOfClass:[SVGSwitchElement class]] ) + { + childNodes = [(SVGSwitchElement*) element visibleChildNodes]; + } + /** + Special handling for clip-path; need to create their children + */ + NSString* clipPath = [element cascadedValueForStylableProperty:@"clip-path" inherit:NO]; + if ( [clipPath hasPrefix:@"url"] ) + { + NSRange idKeyRange = NSMakeRange(5, clipPath.length - 6); + NSString* _pathId = [clipPath substringWithRange:idKeyRange]; + + /** Replace the return layer with a special layer using the URL fill */ + /** fetch the fill layer by URL using the DOM */ + NSAssert( element.rootOfCurrentDocumentFragment != nil, @"This SVG shape has a URL clip-path type; it needs to search for that URL (%@) inside its nearest-ancestor node, but the rootOfCurrentDocumentFragment reference was nil (suggests the parser failed, or the SVG file is corrupt)", _pathId ); + + SVGClipPathElement* clipPathElement = (SVGClipPathElement*) [element.rootOfCurrentDocumentFragment getElementById:_pathId]; + NSAssert( clipPathElement != nil, @"This SVG shape has a URL clip-path (%@), but could not find an XML Node with that ID inside the DOM tree (suggests the parser failed, or the SVG file is corrupt)", _pathId ); + + CALayer *clipLayer = [clipPathElement newLayer]; + for (SVGElement *child in clipPathElement.childNodes ) + { + if ([child conformsToProtocol:@protocol(ConverterSVGToCALayer)]) { + + CALayer *sublayer = [self newLayerWithElement:(SVGElement *)child]; + + if (!sublayer) { + continue; + } + + [clipLayer addSublayer:sublayer]; + } + } + + [clipPathElement layoutLayer:clipLayer toMaskLayer:layer]; + + SVGKitLogWarn(@"DOESNT WORK, APPLE's API APPEARS BROKEN???? - About to mask layer frame (%@) with a mask of frame (%@)", NSStringFromCGRect(layer.frame), NSStringFromCGRect(clipLayer.frame)); + layer.mask = clipLayer; + // because it was created with a +1 retain count + } /** Generate child nodes and then re-layout (parent may have to change its size to fit children) */ + NSUInteger sublayerCount = 0; for (SVGElement *child in childNodes ) { if ([child conformsToProtocol:@protocol(ConverterSVGToCALayer)]) { - CALayer *sublayer = [[self newLayerWithElement:(SVGElement *)child] autorelease]; - + CALayer *sublayer = [self newLayerWithElement:(SVGElement *)child]; + if (saveParentNode) { // Use element (offsets) adjust sublayers. TODO: Size adjustment. + CGRect lFrame = sublayer.frame; // https://github.com/SVGKit/SVGKit/issues/384#issuecomment-159151069 + lFrame.origin = CGPointMake( lFrame.origin.x + layer.frame.origin.x, lFrame.origin.y + layer.frame.origin.y ); + sublayer.frame = lFrame; + //DEBUG SVGKitLogVerbose(@"\t[%@] DEBUG: childern (class:%@) to CALayer (class:%@ frame:%@ pointer:%@) for id = %@", [self class], NSStringFromClass([child class]), NSStringFromClass([sublayer class]), NSStringFromCGRect( sublayer.frame ), sublayer, child.identifier); + } + if (!sublayer) { continue; - } + } + sublayerCount++; [layer addSublayer:sublayer]; } } + if (saveParentNode) + element.parentNode = saveParentNode; + /** + If none of the child nodes return a CALayer, we're safe to early-out here (and in fact we need to because + calling setNeedsDisplay on an image layer hides the image). We can't just check childNodes.count because + there may be some nodes like whitespace nodes for which we don't create layers. + */ + if ( sublayerCount < 1 ) { + return layer; + } + /** ...relayout */ /** NOTE: @@ -615,9 +807,15 @@ -(CALayer *)CALayerTree { if( CALayerTree == nil ) { - DDLogInfo(@"[%@] WARNING: no CALayer tree found, creating a new one (will cache it once generated)", [self class] ); - self.CALayerTree = [[self newCALayerTree] autorelease]; + SVGKitLogInfo(@"[%@] WARNING: no CALayer tree found, creating a new one (will cache it once generated)", [self class] ); + + NSDate* startTime = [NSDate date]; + self.CALayerTree = [self newCALayerTree]; + + SVGKitLogInfo(@"[%@] ...time taken to convert from DOM to fresh CALayers: %2.3f seconds)", [self class], -1.0f * [startTime timeIntervalSinceNow] ); } + else + SVGKitLogVerbose(@"[%@] fetching CALayerTree: re-using cached CALayers (FREE))", [self class] ); return CALayerTree; } @@ -639,7 +837,7 @@ - (void) addSVGLayerTree:(CALayer*) layer withIdentifier:(NSString*) layerID toD if( subLayerID != nil ) { - DDLogVerbose(@"[%@] element id: %@ => layer: %@", [self class], subLayerID, subLayer); + SVGKitLogVerbose(@"[%@] element id: %@ => layer: %@", [self class], subLayerID, subLayer); [self addSVGLayerTree:subLayer withIdentifier:subLayerID toDictionary:layersByID]; @@ -656,130 +854,11 @@ - (NSDictionary*) dictionaryOfLayers [self addSVGLayerTree:rootLayer withIdentifier:self.DOMTree.identifier toDictionary:layersByElementId]; - DDLogVerbose(@"[%@] ROOT element id: %@ => layer: %@", [self class], self.DOMTree.identifier, rootLayer); + SVGKitLogVerbose(@"[%@] ROOT element id: %@ => layer: %@", [self class], self.DOMTree.identifier, rootLayer); return layersByElementId; } -/** - Shared between multiple different "export..." methods - */ --(void) renderToContext:(CGContextRef) context antiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis -{ - NSAssert( [self hasSize], @"Cannot scale this image because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); - - NSDate* startTime; - - if( CALayerTree == nil ) - { - startTime = [NSDate date]; - [self CALayerTree]; // creates and caches a calayertree if needed - DDLogInfo(@"[%@] rendering to CGContext: time taken to convert from DOM to fresh CALayers: %2.3f seconds)", [self class], -1.0f * [startTime timeIntervalSinceNow] ); - } - else - DDLogInfo(@"[%@] rendering to CGContext: re-using cached CALayers (FREE))", [self class] ); - - startTime = [NSDate date]; - - if( SVGRectIsInitialized(self.DOMTree.viewport) ) - DDLogInfo(@"[%@] DEBUG: rendering to CGContext using the current root-object's viewport (may have been overridden by user code): %@", [self class], NSStringFromCGRect(CGRectFromSVGRect(self.DOMTree.viewport)) ); - - /** Typically a 10% performance improvement right here */ - if( !shouldAntialias ) - CGContextSetShouldAntialias( context, FALSE ); - - /** Apple refuses to let you reset this, because they are selfish */ - CGContextSetFlatness( context, multiplyFlatness ); - - /** Apple's own performance hints system */ - CGContextSetInterpolationQuality( context, interpolationQuality ); - - /** Quartz, CoreGraphics, and CoreAnimation all use an "upside-down" co-ordinate system. - This means that images rendered are upside down. - - Apple's UIImage class automatically "un-flips" this - but if you are rendering raw NSData (which is 5x-10x faster than creating UIImages!) then the flipping is "lost" - by Apple's API's. - - The only way to fix it is to pre-transform by y = -y - - This is VERY useful if you want to render SVG's into OpenGL textures! - */ - if( flipYaxis ) - { - NSAssert( [self hasSize], @"Cannot flip this image in Y because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be treated as (by calling .size = something on this SVGKImage instance"); - - CGContextTranslateCTM(context, 0, self.size.height ); - CGContextScaleCTM(context, 1.0, -1.0); - } - - /** - The method that everyone hates, because Apple refuses to fix / implement it properly: renderInContext: - - It's slow. - - It's broken (according to the official API docs) - - But ... it's all that Apple gives us - */ - [self.CALayerTree renderInContext:context]; - - NSMutableString* perfImprovements = [NSMutableString string]; - if( shouldAntialias ) - [perfImprovements appendString:@" NO-ANTI-ALIAS"]; - if( perfImprovements.length < 1 ) - [perfImprovements appendString:@"NONE"]; - - DDLogVerbose(@"[%@] renderToContext: time taken to render CALayers to CGContext (perf improvements:%@): %2.3f seconds)", [self class], perfImprovements, -1.0f * [startTime timeIntervalSinceNow] ); -} - --(NSData*) exportNSDataAntiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality flipYaxis:(BOOL) flipYaxis -{ - NSAssert( [self hasSize], @"Cannot export this image because the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); - - DDLogVerbose(@"[%@] DEBUG: Generating an NSData* raw bytes image using the current root-object's viewport (may have been overridden by user code): {0,0,%2.3f,%2.3f}", [self class], self.size.width, self.size.height); - - CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef context = CGBitmapContextCreate( NULL/*malloc( self.size.width * self.size.height * 4 )*/, self.size.width, self.size.height, 8, 4 * self.size.width, colorSpace, kCGImageAlphaNoneSkipLast ); - CGColorSpaceRelease( colorSpace ); - - [self renderToContext:context antiAliased:shouldAntialias curveFlatnessFactor:multiplyFlatness interpolationQuality:interpolationQuality flipYaxis: flipYaxis]; - - void* resultAsVoidStar = CGBitmapContextGetData(context); - - size_t dataSize = 4 * self.size.width * self.size.height; // RGBA = 4 8-bit components - NSData* result = [NSData dataWithBytes:resultAsVoidStar length:dataSize]; - - CGContextRelease(context); - - return result; -} - - --(UIImage *) exportUIImageAntiAliased:(BOOL) shouldAntialias curveFlatnessFactor:(CGFloat) multiplyFlatness interpolationQuality:(CGInterpolationQuality) interpolationQuality -{ - if( [self hasSize] ) - { - DDLogVerbose(@"[%@] DEBUG: Generating a UIImage using the current root-object's viewport (may have been overridden by user code): {0,0,%2.3f,%2.3f}", [self class], self.size.width, self.size.height); - - UIGraphicsBeginImageContextWithOptions( self.size, FALSE, [UIScreen mainScreen].scale ); - CGContextRef context = UIGraphicsGetCurrentContext(); - - [self renderToContext:context antiAliased:shouldAntialias curveFlatnessFactor:multiplyFlatness interpolationQuality:interpolationQuality flipYaxis:FALSE]; - - UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); - UIGraphicsEndImageContext(); - - - return result; - } - else - { - NSAssert(FALSE, @"You asked to export an SVG to bitmap, but the SVG file has infinite size. Either fix the SVG file, or set an explicit size you want it to be exported at (by calling .size = something on this SVGKImage instance"); - - return nil; - } -} - #pragma mark - Useful bonus methods, will probably move to a different class at some point -(void) scaleToFitInside:(CGSize) maxSize @@ -797,5 +876,16 @@ -(void) scaleToFitInside:(CGSize) maxSize self.size = CGSizeApplyAffineTransform( self.size, CGAffineTransformMakeScale( smallestScaleUp, smallestScaleUp)); } +-(BOOL) isElementVisible:(SVGElement *) element +{ + NSString *display = [element cascadedValueForStylableProperty:@"display" inherit:NO]; + if( [display isEqualToString:@"none"] ) + return NO; + NSString *visibility = [element cascadedValueForStylableProperty:@"visibility" inherit:NO]; + if( [visibility isEqualToString:@"hidden"] ) + return NO; + return YES; +} + @end diff --git a/Source/SVGKSource.h b/Source/SVGKSource.h index 6536d6084..4efcdc332 100644 --- a/Source/SVGKSource.h +++ b/Source/SVGKSource.h @@ -20,15 +20,29 @@ #import -@interface SVGKSource : NSObject +@interface SVGKSource : NSObject -@property (nonatomic, retain) NSString* svgLanguageVersion; /*< */ -@property (nonatomic, retain) NSInputStream* stream; +@property (nonatomic, strong) NSString* svgLanguageVersion; /**< */ +@property (nonatomic, strong) NSInputStream* stream; + +/** If known, the amount of data in bytes contained in this source (e.g. the filesize for a + file, or the Content-Length header for a URL). Otherwise "0" for "unknown" */ +@property (nonatomic) uint64_t approximateLengthInBytesOr0; + +/** Apple's NSDictionary has major design bugs, it does NOT support OOP programming; + it is implemented on top of a C/C++ basic Strings table, and if you want to put objects + in as keys, you have to generate a unique-but-stable string from each instead */ +@property(nonatomic,strong) NSString* keyForAppleDictionaries; + +/** This should ONLY be used by subclasses that are implementing NSCopying methods. All other + uses are discouraged / dangerous. If you use this, you MUST manually set self.stream correctly */ +- (id) initForCopying; /** Subclasses convert their proprietary data into something that implements NSInputStream, which allows the base class to handle everything else */ - (id)initWithInputSteam:(NSInputStream*)stream; +- (SVGKSource *)sourceFromRelativePath:(NSString *)path; @end diff --git a/Source/SVGKSource.m b/Source/SVGKSource.m index 7681315b5..475ba2d5b 100644 --- a/Source/SVGKSource.m +++ b/Source/SVGKSource.m @@ -15,18 +15,36 @@ - (id)initWithInputSteam:(NSInputStream*)s { return self; } -+ (SVGKSource*)sourceFromData:(NSData*)data { - NSInputStream* stream = [NSInputStream inputStreamWithData:data]; - [stream open]; +- (id) initForCopying +{ + self = [super init]; + if( !self ) + return nil; + + return self; +} + +- (SVGKSource *)sourceFromRelativePath:(NSString *)path { + return nil; +} + +-(id)copyWithZone:(NSZone *)zone +{ + id copy = [[[self class] allocWithZone:zone] initForCopying]; - SVGKSource* s = [[[SVGKSource alloc] initWithInputSteam:stream] autorelease]; - return s; + if( copy ) + { + [copy setApproximateLengthInBytesOr0:self.approximateLengthInBytesOr0]; + } + + return copy; } -- (void)dealloc { - self.svgLanguageVersion = nil; - self.stream = nil; - [super dealloc]; +-(NSString *)keyForAppleDictionaries +{ + NSAssert(false, @"Subclasses MUST implement this property/method in their own way and stick to Apple's rules for Keys in NSDictionary"); + return nil; } + @end diff --git a/Source/SVGKit.h b/Source/SVGKit.h index dcaf5d2f7..32c911127 100644 --- a/Source/SVGKit.h +++ b/Source/SVGKit.h @@ -15,16 +15,107 @@ */ -#include "TargetConditionals.h" +#import "SVGKDefine.h" + +// MARK: - Framework Header File Content + +@interface SVGKit : NSObject + ++ (void) enableLogging; + +@end + +//! Project version number for SVGKitFramework-iOS. +FOUNDATION_EXPORT double SVGKitFramework_VersionNumber; + +//! Project version string for SVGKitFramework-iOS. +FOUNDATION_EXPORT const unsigned char SVGKitFramework_VersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + +// Core DOM +#import "AppleSucksDOMImplementation.h" +#import "Attr.h" +#import "CDATASection.h" +#import "CharacterData.h" +#import "Comment.h" +#import "CSSStyleDeclaration.h" +#import "CSSRule.h" +#import "CSSStyleSheet.h" +#import "CSSStyleRule.h" +#import "CSSRuleList.h" +#import "CSSRuleList+Mutable.h" +#import "CSSPrimitiveValue.h" +#import "CSSPrimitiveValue_ConfigurablePixelsPerInch.h" +#import "CSSValueList.h" +#import "CSSValue_ForSubclasses.h" +#import "CSSValue.h" +#import "Document+Mutable.h" +#import "Document.h" +#import "DocumentCSS.h" +#import "DocumentStyle.h" +#import "StyleSheetList+Mutable.h" +#import "StyleSheetList.h" +#import "StyleSheet.h" +#import "MediaList.h" +#import "DocumentFragment.h" +#import "DocumentType.h" #import "DOMHelperUtilities.h" -#import "SVGCircleElement.h" +#import "Element.h" +#import "EntityReference.h" +#import "NamedNodeMap.h" +#import "NamedNodeMap_Iterable.h" +#import "Node+Mutable.h" +#import "Node.h" +#import "NodeList+Mutable.h" +#import "NodeList.h" +#import "ProcessingInstruction.h" +#import "Text.h" +#import "DOMGlobalSettings.h" + +// SVG DOM +#import "SVGAngle.h" +#import "SVGAnimatedPreserveAspectRatio.h" #import "SVGDefsElement.h" +#import "SVGDocument.h" +#import "SVGDocument_Mutable.h" +#import "SVGElementInstance.h" +#import "SVGElementInstance_Mutable.h" +#import "SVGElementInstanceList.h" +#import "SVGElementInstanceList_Internal.h" +#import "SVGGElement.h" +#import "SVGStylable.h" +#import "SVGLength.h" +#import "SVGMatrix.h" +#import "SVGNumber.h" +#import "SVGPoint.h" +#import "SVGPreserveAspectRatio.h" +#import "SVGRect.h" +#import "SVGSVGElement_Mutable.h" +#import "SVGTransform.h" +#import "SVGUseElement.h" +#import "SVGUseElement_Mutable.h" +#import "SVGViewSpec.h" +#import "SVGHelperUtilities.h" +#import "SVGTransformable.h" +#import "SVGFitToViewBox.h" +#import "SVGTextPositioningElement.h" +#import "SVGTextContentElement.h" +#import "SVGTextPositioningElement_Mutable.h" +#import "ConverterSVGToCALayer.h" +#import "SVGGradientElement.h" +#import "SVGGradientStop.h" +#import "SVGLinearGradientElement.h" +#import "SVGRadialGradientElement.h" +#import "SVGStyleCatcher.h" +#import "SVGStyleElement.h" +#import "SVGCircleElement.h" #import "SVGDescriptionElement.h" -#import "SVGKImage.h" #import "SVGElement.h" +#import "SVGElement_ForParser.h" #import "SVGEllipseElement.h" -#import "SVGGElement.h" +#import "SVGGroupElement.h" #import "SVGImageElement.h" #import "SVGLineElement.h" #import "SVGPathElement.h" @@ -32,17 +123,54 @@ #import "SVGPolylineElement.h" #import "SVGRectElement.h" #import "BaseClassForAllSVGBasicShapes.h" -#import "SVGKSource.h" +#import "BaseClassForAllSVGBasicShapes_ForSubclasses.h" +#import "SVGSVGElement.h" +#import "SVGTextElement.h" #import "SVGTitleElement.h" -#import "SVGUtils.h" -#import "SVGKPattern.h" -#import "SVGKImageView.h" -#import "SVGKFastImageView.h" -#import "SVGKLayeredImageView.h" -#import "SVGKLayer.h" - -@interface SVGKit : NSObject +#import "SVGSwitchElement.h" +#import "SVGClipPathElement.h" +#import "TinySVGTextAreaElement.h" -+ (void) enableLogging; +// Parser -@end +#import "SVGKImage+CGContext.h" +#import "SVGKExporterNSData.h" +#if SVGKIT_MAC +#import "SVGKExporterNSImage.h" +#else +#import "SVGKExporterUIImage.h" +#endif +#import "SVGKSourceLocalFile.h" +#import "SVGKSourceString.h" +#import "SVGKSourceURL.h" +#import "SVGKParserDefsAndUse.h" +#import "SVGKParserDOM.h" +#import "SVGKParserGradient.h" +#import "SVGKParserPatternsAndGradients.h" +#import "SVGKParserStyles.h" +#import "SVGKParserSVG.h" +#import "SVGKParser.h" +#import "SVGKParseResult.h" +#import "SVGKParserExtension.h" +#import "SVGKPointsAndPathsParser.h" +#import "CALayer+RecursiveClone.h" +#import "SVGGradientLayer.h" +#import "SVGTextLayer.h" +#import "CALayerWithChildHitTest.h" +#import "CAShapeLayerWithHitTest.h" +#import "CGPathAdditions.h" +#import "SVGKLayer.h" +#import "SVGKImage.h" +#import "SVGKSource.h" +#import "NSCharacterSet+SVGKExtensions.h" +#import "SVGKFastImageView.h" +#import "SVGKImageView.h" +#import "SVGKLayeredImageView.h" +#import "SVGKPattern.h" +#import "SVGUtils.h" +#if SVGKIT_MAC +#import "SVGKImageRep.h" +#endif +#import "NSData+NSInputStream.h" +#import "SVGKSourceNSData.h" +#import "SVGKInlineResource.h" diff --git a/Source/SVGKit.m b/Source/SVGKit.m index b2d6df8c8..067d96677 100644 --- a/Source/SVGKit.m +++ b/Source/SVGKit.m @@ -7,14 +7,14 @@ // #import "SVGKit.h" -#import "DDTTYLogger.h" -#import "DDASLLogger.h" +// #import "CocoaLumberjack/DDTTYLogger.h" +// #import "CocoaLumberjack/DDASLLogger.h" @implementation SVGKit : NSObject + (void) enableLogging { - [DDLog addLogger:[DDASLLogger sharedInstance]]; - [DDLog addLogger:[DDTTYLogger sharedInstance]]; + // [DDLog addLogger:[DDASLLogger sharedInstance]]; + // [DDLog addLogger:[DDTTYLogger sharedInstance]]; } -@end \ No newline at end of file +@end diff --git a/Source/Sources/SVGKSourceLocalFile.h b/Source/Sources/SVGKSourceLocalFile.h index e57272703..2bc75d327 100644 --- a/Source/Sources/SVGKSourceLocalFile.h +++ b/Source/Sources/SVGKSourceLocalFile.h @@ -5,8 +5,12 @@ @interface SVGKSourceLocalFile : SVGKSource -@property (nonatomic, retain) NSString* filePath; +@property (nonatomic, strong) NSString* filePath; +@property (nonatomic, readonly) BOOL wasRelative; -+ (SVGKSource*)sourceFromFilename:(NSString*)p; ++ (SVGKSourceLocalFile*)sourceFromFilename:(NSString*)p; + ++ (SVGKSourceLocalFile *)internalSourceAnywhereInBundleUsingName:(NSString *)name; ++ (SVGKSourceLocalFile *)internalSourceAnywhereInBundle:(NSBundle *)bundle usingName:(NSString *)name; @end diff --git a/Source/Sources/SVGKSourceLocalFile.m b/Source/Sources/SVGKSourceLocalFile.m index 9718b2809..03afd5d0b 100644 --- a/Source/Sources/SVGKSourceLocalFile.m +++ b/Source/Sources/SVGKSourceLocalFile.m @@ -1,20 +1,127 @@ #import "SVGKSourceLocalFile.h" +@interface SVGKSourceLocalFile() +@property (nonatomic, readwrite) BOOL wasRelative; +@end + @implementation SVGKSourceLocalFile -+ (SVGKSource*)sourceFromFilename:(NSString*)p { + +-(NSString *)keyForAppleDictionaries +{ + return self.filePath; +} + ++(uint64_t) sizeInBytesOfFilePath:(NSString*) filePath +{ + NSError* errorReadingFileAttributes; + NSFileManager* fileManager = [NSFileManager defaultManager]; + NSDictionary* atts = [fileManager attributesOfItemAtPath:filePath error:&errorReadingFileAttributes]; + + if( atts == nil ) + return -1; + else + return atts.fileSize; +} + ++ (SVGKSourceLocalFile*)sourceFromFilename:(NSString*)p { NSInputStream* stream = [NSInputStream inputStreamWithFileAtPath:p]; - [stream open]; + //DO NOT DO THIS: let the parser do it at last possible moment (Apple has threading problems otherwise!) [stream open]; - SVGKSourceLocalFile* s = [[[SVGKSourceLocalFile alloc] initWithInputSteam:stream] autorelease]; + SVGKSourceLocalFile* s = [[SVGKSourceLocalFile alloc] initWithInputSteam:stream]; s.filePath = p; + s.approximateLengthInBytesOr0 = [self sizeInBytesOfFilePath:p]; return s; } -- (void)dealloc { - self.filePath = nil; - [super dealloc]; ++ (SVGKSourceLocalFile *)internalSourceAnywhereInBundle:(NSBundle *)bundle usingName:(NSString *)name +{ + NSParameterAssert(name != nil); + + /** Apple's File APIs are very very bad and require you to strip the extension HALF the time. + + The other HALF the time, they fail unless you KEEP the extension. + + It's a mess! + */ + NSString *newName = [name stringByDeletingPathExtension]; + NSString *extension = [name pathExtension]; + if ([@"" isEqualToString:extension]) { + extension = @"svg"; + } + + /** First, try to find it in the project BUNDLE (this was HARD CODED at compile time; can never be changed!) */ + NSString *pathToFileInBundle = nil; + + if( bundle != nil ) + { + pathToFileInBundle = [bundle pathForResource:newName ofType:extension]; + } + + /** Second, try to find it in the Documents folder (this is where Apple expects you to store custom files at runtime) */ + NSString* pathToFileInDocumentsFolder = nil; + NSString* pathToDocumentsFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; + if( pathToDocumentsFolder != nil ) + { + pathToFileInDocumentsFolder = [[pathToDocumentsFolder stringByAppendingPathComponent:newName] stringByAppendingPathExtension:extension]; + if( [[NSFileManager defaultManager] fileExistsAtPath:pathToFileInDocumentsFolder]) + ; + else + pathToFileInDocumentsFolder = nil; // couldn't find a file there + } + + if( pathToFileInBundle == nil + && pathToFileInDocumentsFolder == nil ) + { + SVGKitLogWarn(@"[%@] MISSING FILE (not found in App-bundle, not found in Documents folder), COULD NOT CREATE DOCUMENT: filename = %@, extension = %@", [self class], newName, extension); + return nil; + } + + /** Prefer the Documents-folder version over the Bundle version (allows you to have a default, and override at runtime) */ + SVGKSourceLocalFile* source = [SVGKSourceLocalFile sourceFromFilename: pathToFileInDocumentsFolder == nil ? pathToFileInBundle : pathToFileInDocumentsFolder]; + + return source; +} + ++ (SVGKSourceLocalFile *)internalSourceAnywhereInBundleUsingName:(NSString *)name +{ + return [self internalSourceAnywhereInBundle:[NSBundle mainBundle] usingName:name]; } +-(id)copyWithZone:(NSZone *)zone +{ + id copy = [super copyWithZone:zone]; + + if( copy ) + { + /** clone bits */ + [copy setFilePath:[self.filePath copy]]; + [copy setWasRelative:self.wasRelative]; + + /** Finally, manually intialize the input stream, as required by super class */ + [copy setStream:[NSInputStream inputStreamWithFileAtPath:self.filePath]]; + } + + return copy; +} + +- (SVGKSource *)sourceFromRelativePath:(NSString *)relative { + NSString *absolute = ((NSURL*)[NSURL URLWithString:relative relativeToURL:[NSURL fileURLWithPath:self.filePath]]).path; + if ([[NSFileManager defaultManager] fileExistsAtPath:absolute]) + { + SVGKSourceLocalFile* result = [SVGKSourceLocalFile sourceFromFilename:absolute]; + result.wasRelative = true; + return result; + } + return nil; +} + +-(NSString *)description +{ + BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:self.filePath]; + return [NSString stringWithFormat:@"File: %@%@\"%@\" (%llu bytes)", self.wasRelative? @"(relative) " : @"", fileExists?@"":@"NOT FOUND! ", self.filePath, self.approximateLengthInBytesOr0 ]; +} + + @end diff --git a/Source/Sources/SVGKSourceNSData.h b/Source/Sources/SVGKSourceNSData.h new file mode 100644 index 000000000..cc8106130 --- /dev/null +++ b/Source/Sources/SVGKSourceNSData.h @@ -0,0 +1,13 @@ +/** + + */ +#import "SVGKSource.h" + +@interface SVGKSourceNSData : SVGKSource + +@property (nonatomic, strong) NSData* rawData; +@property (nonatomic, strong) NSURL* effectiveURL; + ++ (SVGKSource*)sourceFromData:(NSData*)data URLForRelativeLinks:(NSURL*) url; + +@end diff --git a/Source/Sources/SVGKSourceNSData.m b/Source/Sources/SVGKSourceNSData.m new file mode 100644 index 000000000..e407e7cec --- /dev/null +++ b/Source/Sources/SVGKSourceNSData.m @@ -0,0 +1,53 @@ +#import "SVGKSourceNSData.h" + +#import "SVGKSourceURL.h" // used for delegating when asked to construct relative links + +@implementation SVGKSourceNSData + +-(NSString *)keyForAppleDictionaries +{ + return [[NSString alloc] initWithData:self.rawData encoding:NSUTF8StringEncoding]; +} + ++ (SVGKSource*)sourceFromData:(NSData*)data URLForRelativeLinks:(NSURL*) url +{ + NSInputStream* stream = [NSInputStream inputStreamWithData:data]; + //DO NOT DO THIS: let the parser do it at last possible moment (Apple has threading problems otherwise!) [stream open]; + + SVGKSourceNSData* s = [[SVGKSourceNSData alloc] initWithInputSteam:stream]; + s.rawData = data; + s.effectiveURL = url; + return s; +} + +-(id)copyWithZone:(NSZone *)zone +{ + id copy = [super copyWithZone:zone]; + + if( copy ) + { + /** clone bits */ + [copy setRawData:[self.rawData copy]]; + + /** Finally, manually intialize the input stream, as required by super class */ + [copy setStream:[NSInputStream inputStreamWithData:((SVGKSourceNSData*)copy).rawData]]; + } + + return copy; +} + +-(SVGKSource *)sourceFromRelativePath:(NSString *)path +{ + if( self.effectiveURL != nil ) + { + NSURL *url = [NSURL URLWithString:path relativeToURL:self.effectiveURL]; + return [SVGKSourceURL sourceFromURL:url]; + } + else + { + SVGKitLogError(@"Cannot construct a relative link for this SVGKSource; it was created from anonymous NSData with no source URL provided. Source = %@", self); + return nil; + } +} + +@end diff --git a/Source/Sources/SVGKSourceString.h b/Source/Sources/SVGKSourceString.h index 93cd142fc..6f88cd8be 100644 --- a/Source/Sources/SVGKSourceString.h +++ b/Source/Sources/SVGKSourceString.h @@ -5,7 +5,7 @@ @interface SVGKSourceString : SVGKSource -@property (nonatomic, retain) NSString* rawString; +@property (nonatomic, strong) NSString* rawString; + (SVGKSource*)sourceFromContentsOfString:(NSString*)rawString; diff --git a/Source/Sources/SVGKSourceString.m b/Source/Sources/SVGKSourceString.m index 17718e455..936d0081d 100644 --- a/Source/Sources/SVGKSourceString.m +++ b/Source/Sources/SVGKSourceString.m @@ -2,17 +2,35 @@ @implementation SVGKSourceString +-(NSString *)keyForAppleDictionaries +{ + return self.rawString; +} + + (SVGKSource*)sourceFromContentsOfString:(NSString*)rawString { NSInputStream* stream = [NSInputStream inputStreamWithData:[rawString dataUsingEncoding:NSUTF8StringEncoding]]; - [stream open]; + //DO NOT DO THIS: let the parser do it at last possible moment (Apple has threading problems otherwise!) [stream open]; - SVGKSource* s = [[[SVGKSource alloc] initWithInputSteam:stream] autorelease]; + SVGKSource* s = [[SVGKSourceString alloc] initWithInputSteam:stream]; + s.approximateLengthInBytesOr0 = [rawString lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; return s; } -- (void)dealloc { - self.rawString = nil; - [super dealloc]; +-(id)copyWithZone:(NSZone *)zone +{ + id copy = [super copyWithZone:zone]; + + if( copy ) + { + /** clone bits */ + [copy setRawString:[self.rawString copy]]; + + /** Finally, manually intialize the input stream, as required by super class */ + [copy setStream:[NSInputStream inputStreamWithData:[((SVGKSourceString*)copy).rawString dataUsingEncoding:NSUTF8StringEncoding]]]; + } + + return copy; } + @end diff --git a/Source/Sources/SVGKSourceURL.h b/Source/Sources/SVGKSourceURL.h index a044d3022..862f3dc66 100644 --- a/Source/Sources/SVGKSourceURL.h +++ b/Source/Sources/SVGKSourceURL.h @@ -5,7 +5,7 @@ @interface SVGKSourceURL : SVGKSource -@property (nonatomic, retain) NSURL* URL; +@property (nonatomic, strong) NSURL* URL; + (SVGKSource*)sourceFromURL:(NSURL*)u; diff --git a/Source/Sources/SVGKSourceURL.m b/Source/Sources/SVGKSourceURL.m index 27eac65de..e8fef7c16 100644 --- a/Source/Sources/SVGKSourceURL.m +++ b/Source/Sources/SVGKSourceURL.m @@ -2,19 +2,76 @@ @implementation SVGKSourceURL +-(NSString *)keyForAppleDictionaries +{ + return [self.URL absoluteString]; +} + + (SVGKSource*)sourceFromURL:(NSURL*)u { - NSInputStream* stream = [NSInputStream inputStreamWithURL:u]; - [stream open]; + NSInputStream* stream = [self internalCreateInputStreamFromURL:u]; + if (!stream) { + return nil; + } - SVGKSourceURL* s = [[[SVGKSourceURL alloc] initWithInputSteam:stream] autorelease]; + SVGKSourceURL* s = [[SVGKSourceURL alloc] initWithInputSteam:stream]; s.URL = u; return s; } -- (void)dealloc { - self.URL = nil; - [super dealloc]; ++(nullable NSInputStream*) internalCreateInputStreamFromURL:(nullable NSURL*) u +{ + if (!u) { + return nil; + } + NSInputStream* stream = [NSInputStream inputStreamWithURL:u]; + + if( stream == nil ) + { + /* Thanks, Apple, for not implementing your own method. + c.f. http://stackoverflow.com/questions/20571069/i-cannot-initialize-a-nsinputstream + + NB: current Apple docs don't seem to mention this - certainly not in the inputStreamWithURL: method? */ + NSError* errorWithNSData; + NSData *tempData = [NSData dataWithContentsOfURL:u options:0 error:&errorWithNSData]; + + if( tempData == nil ) + { + SVGKitLogError(@"Error internally in Apple's NSData trying to read from URL '%@'. Error = %@", u, errorWithNSData); + } + else + stream = [[NSInputStream alloc] initWithData:tempData]; + } + //DO NOT DO THIS: let the parser do it at last possible moment (Apple has threading problems otherwise!) [stream open]; + + return stream; } +-(id)copyWithZone:(NSZone *)zone +{ + id copy = [super copyWithZone:zone]; + + if( copy ) + { + /** clone bits */ + [copy setURL:[self.URL copy]]; + + /** Finally, manually intialize the input stream, as required by super class */ + [copy setStream:[[self class] internalCreateInputStreamFromURL:((SVGKSourceURL*)copy).URL]]; + } + + return copy; +} + +- (SVGKSource *)sourceFromRelativePath:(NSString *)path { + NSURL *url = [NSURL URLWithString:path relativeToURL:self.URL]; + return [SVGKSourceURL sourceFromURL:url]; +} + +-(NSString *)description +{ + return [NSString stringWithFormat:@"[SVGKSource: URL = \"%@\"]", self.URL ]; +} + + @end diff --git a/Source/UIKit additions/CALayer+RecursiveClone.h b/Source/UIKit additions/CALayer+RecursiveClone.h deleted file mode 100644 index b76540873..000000000 --- a/Source/UIKit additions/CALayer+RecursiveClone.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// CALayer+RecursiveClone.h -// SVGKit-iOS -// -// Created by adam on 22/04/2013. -// Copyright (c) 2013 na. All rights reserved. -// - -#import - -@interface CALayer (RecursiveClone) - -/** Since Apple decided not to expose this common and essential method ... */ --(CALayer*) cloneRecursively; - -@end diff --git a/Source/UIKit additions/CALayer+RecursiveClone.m b/Source/UIKit additions/CALayer+RecursiveClone.m deleted file mode 100644 index d65964127..000000000 --- a/Source/UIKit additions/CALayer+RecursiveClone.m +++ /dev/null @@ -1,111 +0,0 @@ -// -// CALayer+RecursiveClone.m -// SVGKit-iOS -// -// Created by adam on 22/04/2013. -// Copyright (c) 2013 na. All rights reserved. -// - -#import "CALayer+RecursiveClone.h" - -@implementation CALayer (RecursiveClone) - --(CALayer*) cloneRecursively -{ - CALayer* clone = [[self class] layer]; // Apple official method for duplicating a layer correctly but leaving all properties empty - - if( [clone isKindOfClass:[CALayer class]]) - { - CALayer* specificClone = clone; - CALayer* selfSpecific = self; - - specificClone.bounds = selfSpecific.bounds; // don't use Frame! According to Apple's docs, it's officially unsupported for writes! - specificClone.position = selfSpecific.position; // don't use Frame! According to Apple's docs, it's officially unsupported for writes! - specificClone.zPosition = selfSpecific.zPosition; - specificClone.anchorPoint = selfSpecific.anchorPoint; - specificClone.anchorPointZ = selfSpecific.anchorPointZ; - specificClone.transform = selfSpecific.transform; - specificClone.hidden = selfSpecific.hidden; - specificClone.doubleSided = selfSpecific.doubleSided; - specificClone.geometryFlipped = selfSpecific.geometryFlipped; - specificClone.sublayerTransform = selfSpecific.sublayerTransform; - specificClone.mask = [selfSpecific.mask cloneRecursively]; - specificClone.masksToBounds = selfSpecific.masksToBounds; - specificClone.contents = selfSpecific.contents; - specificClone.contentsRect = selfSpecific.contentsRect; - specificClone.contentsGravity = selfSpecific.contentsGravity; - specificClone.contentsScale = selfSpecific.contentsScale; - specificClone.contentsCenter = selfSpecific.contentsCenter; - specificClone.minificationFilter = selfSpecific.minificationFilter; - specificClone.magnificationFilter = selfSpecific.magnificationFilter; - specificClone.minificationFilterBias = selfSpecific.minificationFilterBias; - specificClone.opaque = selfSpecific.opaque; - specificClone.needsDisplayOnBoundsChange = selfSpecific.needsDisplayOnBoundsChange; - specificClone.drawsAsynchronously = selfSpecific.drawsAsynchronously; - specificClone.edgeAntialiasingMask = selfSpecific.edgeAntialiasingMask; - specificClone.backgroundColor = selfSpecific.backgroundColor; - specificClone.cornerRadius = selfSpecific.cornerRadius; - specificClone.borderWidth = selfSpecific.borderWidth; - specificClone.borderColor = selfSpecific.borderColor; - specificClone.opacity = selfSpecific.opacity; - specificClone.compositingFilter = selfSpecific.compositingFilter; - specificClone.filters = [selfSpecific.filters copy]; - specificClone.backgroundFilters = [selfSpecific.backgroundFilters copy]; - specificClone.shouldRasterize = selfSpecific.shouldRasterize; - specificClone.rasterizationScale = selfSpecific.rasterizationScale; - specificClone.shadowColor = selfSpecific.shadowColor; - specificClone.shadowOpacity = selfSpecific.shadowOpacity; - specificClone.shadowOffset = selfSpecific.shadowOffset; - specificClone.shadowRadius = selfSpecific.shadowRadius; - specificClone.shadowPath = selfSpecific.shadowPath; - specificClone.name = selfSpecific.name; - specificClone.style = [selfSpecific.style copy]; - } - - if( [clone isKindOfClass:[CAGradientLayer class]]) - { - CAGradientLayer* specificClone = (CAGradientLayer*) clone; - CAGradientLayer* selfSpecific = (CAGradientLayer*) self; - - specificClone.startPoint = selfSpecific.startPoint; - specificClone.endPoint = selfSpecific.endPoint; - specificClone.type = selfSpecific.type; - specificClone.colors = [selfSpecific.colors copy]; - specificClone.locations = [selfSpecific.locations copy]; - } - - if( [clone isKindOfClass:[CAShapeLayer class]]) - { - CAShapeLayer* specificClone = (CAShapeLayer*) clone; - CAShapeLayer* selfSpecific = (CAShapeLayer*) self; - - specificClone.path = selfSpecific.path; - specificClone.fillColor = selfSpecific.fillColor; - specificClone.strokeColor = selfSpecific.strokeColor; - specificClone.lineWidth = selfSpecific.lineWidth; - specificClone.lineCap = selfSpecific.lineCap; - } - - if( [clone isKindOfClass:[CATextLayer class]]) - { - CATextLayer* specificClone = (CATextLayer*) clone; - CATextLayer* selfSpecific = (CATextLayer*) self; - - specificClone.string = selfSpecific.string; - specificClone.font = selfSpecific.font; - specificClone.fontSize = selfSpecific.fontSize; - specificClone.foregroundColor = selfSpecific.foregroundColor; - specificClone.wrapped = selfSpecific.wrapped; - specificClone.truncationMode = selfSpecific.truncationMode; - specificClone.alignmentMode = selfSpecific.alignmentMode; - } - - for( CALayer* subLayer in self.sublayers ) - { - [clone addSublayer:[subLayer cloneRecursively]]; - } - - return clone; -} - -@end diff --git a/Source/UIKit additions/SVGKFastImageView.h b/Source/UIKit additions/SVGKFastImageView.h index 7c1435418..e366e21fb 100644 --- a/Source/UIKit additions/SVGKFastImageView.h +++ b/Source/UIKit additions/SVGKFastImageView.h @@ -1,5 +1,3 @@ -#import - #import "SVGKImageView.h" #import "SVGKit.h" @@ -34,20 +32,4 @@ @property(nonatomic) CGSize tileRatio; @property(nonatomic) BOOL disableAutoRedrawAtHighestResolution; -/** Apple has a bug in CALayer where their renderInContext: method does not respect Apple's own mask layers. - - This is required to render SVGGradientElement's, and it is NOT a bug in SVGKit - it's in Apple's code. Until we - can invent a workaround (or Apple fixes their bug), it's best to warn developers that their SVG will NOT render - correctly - */ -+(BOOL) svgImageHasNoGradients:(SVGKImage*) image; - -/** Apple has a bug in CALayer where their renderInContext: method does not respect Apple's own mask layers. - - This is required to render SVGGradientElement's, and it is NOT a bug in SVGKit - it's in Apple's code. Until we - can invent a workaround (or Apple fixes their bug), it's best to warn developers that their SVG will NOT render - correctly - */ -+(BOOL) svgElementAndDescendentsHaveNoGradients:(SVGElement*) element; - @end diff --git a/Source/UIKit additions/SVGKFastImageView.m b/Source/UIKit additions/SVGKFastImageView.m index 5f9e62926..6cac8e592 100644 --- a/Source/UIKit additions/SVGKFastImageView.m +++ b/Source/UIKit additions/SVGKFastImageView.m @@ -1,10 +1,11 @@ #import "SVGKFastImageView.h" -#define TEMPORARY_WARNING_FOR_APPLES_BROKEN_RENDERINCONTEXT_METHOD 1 // ONLY needed as temporary workaround for Apple's renderInContext bug breaking various bits of rendering: Gradients, Scaling, etc +@interface SVGKFastImageView () +@property(nonatomic,readwrite) NSTimeInterval timeIntervalForLastReRenderOfSVGFromMemory; +@property (nonatomic, strong) NSDate* startRenderTime, * endRenderTime; /**< for debugging, lets you know how long it took to add/generate the CALayer (may have been cached! Only SVGKImage knows true times) */ +@property (nonatomic) BOOL didRegisterObservers, didRegisterInternalRedrawObservers; -#if TEMPORARY_WARNING_FOR_APPLES_BROKEN_RENDERINCONTEXT_METHOD -#import "SVGGradientElement.h" -#endif +@end @implementation SVGKFastImageView { @@ -14,35 +15,7 @@ @implementation SVGKFastImageView @synthesize image = _image; @synthesize tileRatio = _tileRatio; @synthesize disableAutoRedrawAtHighestResolution = _disableAutoRedrawAtHighestResolution; - -#if TEMPORARY_WARNING_FOR_APPLES_BROKEN_RENDERINCONTEXT_METHOD -+(BOOL) svgImageHasNoGradients:(SVGKImage*) image -{ - return [self svgElementAndDescendentsHaveNoGradients:image.DOMTree]; -} - -+(BOOL) svgElementAndDescendentsHaveNoGradients:(SVGElement*) element -{ - if( [element isKindOfClass:[SVGGradientElement class]]) - return FALSE; - else - { - for( Node* n in element.childNodes ) - { - if( [n isKindOfClass:[SVGElement class]]) - { - if( [self svgElementAndDescendentsHaveNoGradients:(SVGElement*)n]) - ; - else - return FALSE; - } - - } - } - - return TRUE; -} -#endif +@synthesize timeIntervalForLastReRenderOfSVGFromMemory = _timeIntervalForLastReRenderOfSVGFromMemory; - (id)init { @@ -53,7 +26,12 @@ - (id)init - (id)initWithCoder:(NSCoder *)aDecoder { - return [self initWithSVGKImage:nil]; + self = [super initWithCoder:aDecoder]; + if( self ) + { + [self populateFromImage:nil]; + } + return self; } -(id)initWithFrame:(CGRect)frame @@ -61,83 +39,85 @@ -(id)initWithFrame:(CGRect)frame self = [super initWithFrame:frame]; if( self ) { - self.backgroundColor = [UIColor clearColor]; + [self populateFromImage:nil]; } return self; } - (id)initWithSVGKImage:(SVGKImage*) im { - if( im == nil ) - { - DDLogWarn(@"[%@] WARNING: you have initialized an SVGKImageView with a blank image (nil). Possibly because you're using Storyboards or NIBs which Apple won't allow us to decorate. Make sure you assign an SVGKImage to the .image property!", [self class]); - } - self = [super init]; if (self) { - internalContextPointerBecauseApplesDemandsIt = @"Apple wrote the addObserver / KVO notification API wrong in the first place and now requires developers to pass around pointers to fake objects to make up for the API deficicineces. You have to have one of these pointers per object, and they have to be internal and private. They serve no real value."; - -#if TEMPORARY_WARNING_FOR_APPLES_BROKEN_RENDERINCONTEXT_METHOD - BOOL imageIsGradientFree = [SVGKFastImageView svgImageHasNoGradients:im]; - if( !imageIsGradientFree ) - DDLogWarn(@"[%@] WARNING: Apple's rendering DOES NOT ALLOW US to render this image correctly using SVGKFastImageView, because Apple's renderInContext method - according to Apple's docs - ignores Apple's own masking layers. Until Apple fixes this bug, you should use SVGKLayeredImageView for this particular SVG file (or avoid using gradients)", [self class]); -#endif - - self.image = im; - self.frame = CGRectMake( 0,0, im.size.width, im.size.height ); // NB: this uses the default SVG Viewport; an ImageView can theoretically calc a new viewport (but its hard to get right!) - self.tileRatio = CGSizeZero; - self.backgroundColor = [UIColor clearColor]; - - /** redraw-observers */ - if( self.disableAutoRedrawAtHighestResolution ) - ; - else - [self addInternalRedrawOnResizeObservers]; - - /** other obeservers */ - [self addObserver:self forKeyPath:@"image" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; - [self addObserver:self forKeyPath:@"tileRatio" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; - [self addObserver:self forKeyPath:@"showBorder" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; + [self populateFromImage:im]; } return self; } -- (void)setImage:(SVGKImage *)image { - -#if TEMPORARY_WARNING_FOR_APPLES_BROKEN_RENDERINCONTEXT_METHOD - BOOL imageIsGradientFree = [SVGKFastImageView svgImageHasNoGradients:image]; - if( !imageIsGradientFree ) - NSLog(@"[%@] WARNING: Apple's rendering DOES NOT ALLOW US to render this image correctly using SVGKFastImageView, because Apple's renderInContext method - according to Apple's docs - ignores Apple's own masking layers. Until Apple fixes this bug, you should use SVGKLayeredImageView for this particular SVG file (or avoid using gradients)", [self class]); - - if( image.scale != 0.0f ) - NSLog(@"[%@] WARNING: Apple's rendering DOES NOT ALLOW US to render this image correctly using SVGKFastImageView, because Apple's renderInContext method - according to Apple's docs - ignores Apple's own transforms. Until Apple fixes this bug, you should use SVGKLayeredImageView for this particular SVG file (or avoid using scale: you SHOULD INSTEAD be scaling by setting .size on the image, and ensuring that the incoming SVG has either a viewbox or an explicit svg width or svg height)", [self class]); +- (void)populateFromImage:(SVGKImage*) im +{ +#if SVGKIT_MAC && USE_SUBLAYERS_INSTEAD_OF_BLIT + // setup layer-backed view + self.wantsLayer = YES; #endif - - if (_image) { - [_image removeObserver:self forKeyPath:@"size" context:internalContextPointerBecauseApplesDemandsIt]; + if( im == nil ) + { + SVGKitLogWarn(@"[%@] WARNING: you have initialized an SVGKImageView with a blank image (nil). Possibly because you're using Storyboards or NIBs which Apple won't allow us to decorate. Make sure you assign an SVGKImage to the .image property!", [self class]); + } + + self.image = im; + self.frame = CGRectMake( 0,0, im.size.width, im.size.height ); // NB: this uses the default SVG Viewport; an ImageView can theoretically calc a new viewport (but its hard to get right!) + self.tileRatio = CGSizeZero; +#if SVGKIT_UIKIT + self.backgroundColor = [UIColor clearColor]; +#else + self.layer.backgroundColor = [NSColor clearColor].CGColor; +#endif +} + +- (void)setImage:(SVGKImage *)image { + + if( !internalContextPointerBecauseApplesDemandsIt ) { + internalContextPointerBecauseApplesDemandsIt = @"Apple wrote the addObserver / KVO notification API wrong in the first place and now requires developers to pass around pointers to fake objects to make up for the API deficicineces. You have to have one of these pointers per object, and they have to be internal and private. They serve no real value."; } - [_image release]; - _image = [image retain]; + + [_image removeObserver:self forKeyPath:@"size" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + _image = image; + /** redraw-observers */ if( self.disableAutoRedrawAtHighestResolution ) ; - else - [_image addObserver:self forKeyPath:@"size" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; + else { + [self addInternalRedrawOnResizeObservers]; + [_image addObserver:self forKeyPath:@"size" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + } + + /** other obeservers */ + if (!self.didRegisterObservers) { + self.didRegisterObservers = true; + [self addObserver:self forKeyPath:@"image" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + [self addObserver:self forKeyPath:@"tileRatio" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + [self addObserver:self forKeyPath:@"showBorder" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + } + } -(void) addInternalRedrawOnResizeObservers { - [self addObserver:self forKeyPath:@"layer" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; - [self.layer addObserver:self forKeyPath:@"transform" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; - //[self.image addObserver:self forKeyPath:@"size" options:NSKeyValueObservingOptionNew context:internalContextPointerBecauseApplesDemandsIt]; + if (self.didRegisterInternalRedrawObservers) return; + self.didRegisterInternalRedrawObservers = true; + [self addObserver:self forKeyPath:@"layer" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + [self.layer addObserver:self forKeyPath:@"transform" options:NSKeyValueObservingOptionNew context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; } -(void) removeInternalRedrawOnResizeObservers { - [self removeObserver:self forKeyPath:@"layer" context:internalContextPointerBecauseApplesDemandsIt]; - [self.layer removeObserver:self forKeyPath:@"transform" context:internalContextPointerBecauseApplesDemandsIt]; - //[self.image removeObserver:self forKeyPath:@"size" context:internalContextPointerBecauseApplesDemandsIt]; + if (!self.didRegisterInternalRedrawObservers) return; + [self removeObserver:self forKeyPath:@"layer" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; +#if !SVGKIT_MAC || USE_SUBLAYERS_INSTEAD_OF_BLIT + [self.layer removeObserver:self forKeyPath:@"transform" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; +#endif + self.didRegisterInternalRedrawObservers = false; } -(void)setDisableAutoRedrawAtHighestResolution:(BOOL)newValue @@ -164,13 +144,17 @@ - (void)dealloc else [self removeInternalRedrawOnResizeObservers]; - [self removeObserver:self forKeyPath:@"image" context:internalContextPointerBecauseApplesDemandsIt]; - [self removeObserver:self forKeyPath:@"tileRatio" context:internalContextPointerBecauseApplesDemandsIt]; - [self removeObserver:self forKeyPath:@"showBorder" context:internalContextPointerBecauseApplesDemandsIt]; - - self.image = nil; + if (self.didRegisterObservers) { + [self removeObserver:self forKeyPath:@"image" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + [self removeObserver:self forKeyPath:@"tileRatio" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + [self removeObserver:self forKeyPath:@"showBorder" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + } + + + + [_image removeObserver:self forKeyPath:@"size" context:(__bridge void * _Nullable)(internalContextPointerBecauseApplesDemandsIt)]; + _image = nil; - [super dealloc]; } /** Trigger a call to re-display (at higher or lower draw-resolution) (get Apple to call drawRect: again) */ @@ -178,10 +162,14 @@ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NS { if( [keyPath isEqualToString:@"transform"] && CGSizeEqualToSize( CGSizeZero, self.tileRatio ) ) { - /*DDLogVerbose(@"transform changed. Setting layer scale: %2.2f --> %2.2f", self.layer.contentsScale, self.transform.a); + /*SVGKitLogVerbose(@"transform changed. Setting layer scale: %2.2f --> %2.2f", self.layer.contentsScale, self.transform.a); self.layer.contentsScale = self.transform.a;*/ [self.image.CALayerTree removeFromSuperlayer]; // force apple to redraw? +#if SVGKIT_UIKIT [self setNeedsDisplay]; +#else + [self setNeedsDisplay:YES]; +#endif } else { @@ -190,7 +178,11 @@ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NS ; else { +#if SVGKIT_UIKIT [self setNeedsDisplay]; +#else + [self setNeedsDisplay:YES]; +#endif } } } @@ -202,6 +194,8 @@ -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NS */ -(void)drawRect:(CGRect)rect { + self.startRenderTime = self.endRenderTime = [NSDate date]; + /** view.bounds == width and height of the view imageBounds == natural width and height of the SVGKImage @@ -255,9 +249,13 @@ -(void)drawRect:(CGRect)rect tileSize = CGSizeMake( self.bounds.size.width / self.tileRatio.width, self.bounds.size.height / self.tileRatio.height ); } - //DEBUG: DDLogVerbose(@"cols, rows: %i, %i ... scaleConvert: %@ ... tilesize: %@", cols, rows, NSStringFromCGSize(scaleConvertImageToView), NSStringFromCGSize(tileSize) ); + //DEBUG: SVGKitLogVerbose(@"cols, rows: %i, %i ... scaleConvert: %@ ... tilesize: %@", cols, rows, NSStringFromCGSize(scaleConvertImageToView), NSStringFromCGSize(tileSize) ); /** To support tiling, and to allow internal shrinking, we use renderInContext */ - CGContextRef context = UIGraphicsGetCurrentContext(); +#if SVGKIT_UIKIT + CGContextRef context = UIGraphicsGetCurrentContext(); +#else + CGContextRef context = SVGKGraphicsGetCurrentContext(); +#endif for( int k=0; k -#import #import "SVGKImage.h" // cannot import "SVGKit.h" because that would cause ciruclar imports /** @@ -17,8 +16,10 @@ */ @interface SVGKImageView : UIView -@property(nonatomic,retain) SVGKImage* image; -@property(nonatomic) BOOL showBorder; /*< mostly for debugging - adds a coloured 1-pixel border around the image */ +@property(nonatomic,strong) SVGKImage* image; +@property(nonatomic) BOOL showBorder; /**< mostly for debugging - adds a coloured 1-pixel border around the image */ + +@property(nonatomic,readonly) NSTimeInterval timeIntervalForLastReRenderOfSVGFromMemory; - (id)initWithSVGKImage:(SVGKImage*) im; diff --git a/Source/UIKit additions/SVGKImageView.m b/Source/UIKit additions/SVGKImageView.m index 098a4560f..69d5b30ff 100755 --- a/Source/UIKit additions/SVGKImageView.m +++ b/Source/UIKit additions/SVGKImageView.m @@ -48,9 +48,26 @@ - (id)initWithSVGKImage:(SVGKImage*) im return nil; } -- (void)dealloc -{ - [super dealloc]; + +/** + The intrinsic sized of the image view. + + This is useful for playing nicely with autolayout. + + @return The size of the image if it has one, or CGSizeZero if not + */ +- (CGSize)intrinsicContentSize { + if ([self.image hasSize]) { + return self.image.size; + } + + return CGSizeZero; +} + +#if SVGKIT_MAC +- (BOOL)isFlipped { + return YES; } +#endif @end diff --git a/Source/UIKit additions/SVGKLayeredImageView.h b/Source/UIKit additions/SVGKLayeredImageView.h index 50fe1e55d..e927aebf9 100644 --- a/Source/UIKit additions/SVGKLayeredImageView.h +++ b/Source/UIKit additions/SVGKLayeredImageView.h @@ -1,5 +1,3 @@ -#import - #import "SVGKImageView.h" #import "SVGKit.h" @@ -20,6 +18,9 @@ - SVGKLayeredImageView *skv = [[SVGKLayeredImageView alloc] initWithSVGKImage: [SVGKImage imageNamed:@"image.svg"]]; - SVGKLayer* layer = (SVGKLayer*) skv.layer; + For Mac user: + `SVGKLayeredImageView` is a layer-hosting view. It uses the `SVGKLayer` layer class for rendering. + */ @interface SVGKLayeredImageView : SVGKImageView diff --git a/Source/UIKit additions/SVGKLayeredImageView.m b/Source/UIKit additions/SVGKLayeredImageView.m index 0b69c66f3..571bb3974 100644 --- a/Source/UIKit additions/SVGKLayeredImageView.m +++ b/Source/UIKit additions/SVGKLayeredImageView.m @@ -3,9 +3,10 @@ #import #import "SVGKSourceString.h" +#import "SVGKInlineResource.h" @interface SVGKLayeredImageView() -@property(nonatomic,retain) CAShapeLayer* internalBorderLayer; +@property(nonatomic,strong) CAShapeLayer* internalBorderLayer; @end @implementation SVGKLayeredImageView @@ -26,7 +27,19 @@ - (id)init - (id)initWithCoder:(NSCoder *)aDecoder { - return [self initWithSVGKImage:nil]; + if( aDecoder == nil ) + { + self = [super initWithFrame:CGRectMake(0,0,100,100)]; // coincides with the inline SVG in populateFromImage! + } + else + { + self = [super initWithCoder:aDecoder]; + } + if( self ) + { + [self populateFromImage:nil]; + } + return self; } -(id)initWithFrame:(CGRect)frame @@ -34,7 +47,7 @@ -(id)initWithFrame:(CGRect)frame self = [super initWithFrame:frame]; if( self ) { - self.backgroundColor = [UIColor clearColor]; + [self populateFromImage:nil]; } return self; } @@ -43,89 +56,58 @@ - (id)initWithSVGKImage:(SVGKImage*) im { if( im == nil ) { - DDLogWarn(@"[%@] WARNING: you have initialized an [%@] with a blank image (nil). Possibly because you're using Storyboards or NIBs which Apple won't allow us to decorate. Make sure you assign an SVGKImage to the .image property!", [self class], [self class]); - - self = [super initWithFrame:CGRectMake(0,0,100,100)]; // coincides with the inline SVG below! - if( self ) - { - self.backgroundColor = [UIColor clearColor]; - -/** - ************* NB: it is critical that the string we're about to create is NOT INDENTED - the tabs would break the parsing! - */ - NSString* svgStringDefaultContents = @"\n\ -\n\ - \ - \ - \ - \ - \ - \ -Missing \ -SVG \ - \ -"; - - NSLog(@"About to make a blank image using the inlined SVG = %@", svgStringDefaultContents); - - SVGKImage* defaultBlankImage = [SVGKImage imageWithSource:[SVGKSourceString sourceFromContentsOfString:svgStringDefaultContents]]; - - self.backgroundColor = [UIColor cyanColor]; - - ((SVGKLayer*) self.layer).SVGImage = defaultBlankImage; - } + self = [super initWithFrame:CGRectMake(0,0,100,100)]; // coincides with the inline SVG in populateFromImage! } else { self = [super initWithFrame:CGRectMake( 0,0, im.CALayerTree.frame.size.width, im.CALayerTree.frame.size.height )]; // default: 0,0 to width x height of original image]; - if (self) - { - self.backgroundColor = [UIColor clearColor]; - - ((SVGKLayer*) self.layer).SVGImage = im; - - } } - + + if (self) + { + [self populateFromImage:im]; + } return self; } +- (void)populateFromImage:(SVGKImage*) im +{ +#if SVGKIT_MAC + // setup layer-hosting view + self.layer = [[SVGKLayer alloc] init]; + self.wantsLayer = YES; +#endif + if( im == nil ) + { +#ifndef SVGK_DONT_USE_EMPTY_IMAGE_PLACEHOLDER + SVGKitLogWarn(@"[%@] WARNING: you have initialized an [%@] with a blank image (nil). Possibly because you're using Storyboards or NIBs which Apple won't allow us to decorate. Make sure you assign an SVGKImage to the .image property!", [self class], [self class]); +#if SVGKIT_UIKIT + self.backgroundColor = [UIColor clearColor]; +#else + self.layer.backgroundColor = [NSColor clearColor].CGColor; +#endif + + NSString* svgStringDefaultContents = SVGKGetDefaultContentString(); + + SVGKitLogInfo(@"About to make a blank image using the inlined SVG = %@", svgStringDefaultContents); + + SVGKImage* defaultBlankImage = [SVGKImage imageWithSource:[SVGKSourceString sourceFromContentsOfString:svgStringDefaultContents]]; + + ((SVGKLayer*) self.layer).SVGImage = defaultBlankImage; +#endif + } + else + { +#if SVGKIT_UIKIT + self.backgroundColor = [UIColor clearColor]; +#else + self.layer.backgroundColor = [NSColor clearColor].CGColor; +#endif + + ((SVGKLayer*) self.layer).SVGImage = im; + } +} + /** Delegate the call to the internal layer that's coded to handle this stuff automatically */ -(SVGKImage *)image { @@ -148,10 +130,9 @@ -(void)setShowBorder:(BOOL)showBorder ((SVGKLayer*)self.layer).showBorder = showBorder; } -- (void)dealloc +-(NSTimeInterval)timeIntervalForLastReRenderOfSVGFromMemory { - - [super dealloc]; + return[((SVGKLayer*)self.layer).endRenderTime timeIntervalSinceDate:((SVGKLayer*)self.layer).startRenderTime]; } @end diff --git a/Source/Utils/SVGKInlineResource.h b/Source/Utils/SVGKInlineResource.h new file mode 100644 index 000000000..6958d827d --- /dev/null +++ b/Source/Utils/SVGKInlineResource.h @@ -0,0 +1,22 @@ +// +// SVGKInlineResource.h +// SVGKit-iOS +// +// Created by lizhuoli on 2018/11/2. +// Copyright © 2018 na. All rights reserved. +// + +#import "SVGKDefine.h" + +/** Contains some inline resource define, such as default SVG, broekn image string, etc */ + +NS_ASSUME_NONNULL_BEGIN + +/** Return the brkoken image base64 string */ +FOUNDATION_EXPORT NSString * const SVGKGetBrokenImageString(void); +/** Return the shared broken image representation */ +FOUNDATION_EXPORT UIImage * const SVGKGetBrokenImageRepresentation(void); +/** Return the default empty SVG content string */ +FOUNDATION_EXPORT NSString * const SVGKGetDefaultContentString(void); + +NS_ASSUME_NONNULL_END diff --git a/Source/Utils/SVGKInlineResource.m b/Source/Utils/SVGKInlineResource.m new file mode 100644 index 000000000..0e012ee9f --- /dev/null +++ b/Source/Utils/SVGKInlineResource.m @@ -0,0 +1,37 @@ +// +// SVGKInlineResource.m +// SVGKit-iOS +// +// Created by lizhuoli on 2018/11/2. +// Copyright © 2018 na. All rights reserved. +// + +#import "SVGKInlineResource.h" + +static NSString * const kSVGBrokenImageString = @"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAMTGlDQ1BJQ0MgUHJvZmlsZQAASImVVwdUU8kanltSSWiBCEgJvYlSpEsJoQUQkCrYCEkgocSYEETsyqKCa0FFBNQVXRVRdC2A2LGXRbG7loe6qKysiwUbKm9SQNc9773z/nPmzpd//vn+krlzZwDQqeVJpXmoLgD5kgJZQkQIa3xaOov0CFCBMaAAfzCCx5dL2fHxMQDKYP93eXsTIMr+mouS65/j/1X0BEI5HwAkHuJMgZyfD/F+APASvlRWAADRB+qtpxdIlXgixAYyGCDEUiXOVuMSJc5U4yqVTVICB+KdAJBpPJ4sGwDtFqhnFfKzIY/2bYhdJQKxBAAdMsSBfBFPAHEkxCPy86cqMbQDDpnf8GT/jTNziJPHyx7C6lxUQg4Vy6V5vBn/Zzn+t+TnKQZ92MFGE8kiE5Q5w7rdzp0arcQ0iHskmbFxEOtD/F4sUNlDjFJFishktT1qypdzYM0AE2JXAS80GmJTiMMlebExGn1mljicCzFcIWiRuICbpJm7WCgPS9Rw1sqmJsQN4iwZh62Z28iTqfwq7U8pcpPZGv7bIiF3kP9NsSgpVR0zRi0Up8RCrA0xU56bGK22wWyKRZzYQRuZIkEZvw3EfkJJRIiaH5ucJQtP0NjL8uWD+WKLRWJurAZXF4iSIjU8O/k8VfxGELcIJezkQR6hfHzMYC4CYWiYOnfsilCSrMkX65QWhCRo5r6S5sVr7HGqMC9CqbeC2FRemKiZiwcWwAWp5sdjpQXxSeo48cwcXlS8Oh68CMQADggFLKCALRNMBTlA3N7T3AN/qUfCAQ/IQDYQAheNZnBGqmpEAp+JoBj8CZEQyIfmhahGhaAQ6j8PadVPF5ClGi1UzcgFTyDOB9EgD/5WqGZJhrylgN+hRvwP73wYax5syrF/6thQE6PRKAZ5WTqDlsQwYigxkhhOdMRN8EDcH4+Bz2DY3HEf3Hcw2q/2hCeEDsIjwg1CJ+HOFPEC2Xf5sMBY0Ak9hGtyzvw2Z9wOsnriIXgA5IfcOBM3AS74aOiJjQdB355Qy9FErsz+e+6/5fBN1TV2FFcKShlGCaY4fD9T20nbc4hFWdNvK6SONXOorpyhke/9c76ptAD20d9bYouxfdhZ7AR2HjuMNQMWdgxrwS5hR5R4aBX9rlpFg94SVPHkQh7xP/zxND6VlZS7Nrh2u35SjxUIi5T7I+BMlc6QibNFBSw23PmFLK6EP3IEy93VDe7ayu+Iept6zVR9HxDmha+6hYsACKgfGBg49FUX3QXAvr8AoN7/qrPPgduBCIBza/gKWaFahysfBPiF0oFvlDEwB9bAAebjDrzg9yoYhIEoEAeSQBqYDKssgutZBqaDWWA+KAXlYAVYA6rBRrAZbAe7wF7QDA6DE+AMuAiugBvgLlw9XeA56AVvQT+CICSEjjAQY8QCsUWcEXfEBwlEwpAYJAFJQzKQbESCKJBZyEKkHKlAqpFNSD3yC3IQOYGcRzqQO8hDpBt5hXxEMZSGGqBmqB06CvVB2Wg0moROQrPRaWgxWoIuQ6vQOnQn2oSeQC+iN9BO9DnahwFMC2NilpgL5oNxsDgsHcvCZNgcrAyrxOqwRqwV/s/XsE6sB/uAE3EGzsJd4AqOxJNxPj4Nn4Mvxavx7XgTfgq/hj/Ee/EvBDrBlOBM8CNwCeMJ2YTphFJCJWEr4QDhNHybughviUQik2hP9IZvYxoxhziTuJS4nribeJzYQXxM7CORSMYkZ1IAKY7EIxWQSknrSDtJx0hXSV2k92QtsgXZnRxOTidLyAvIleQd5KPkq+Sn5H6KLsWW4keJowgoMyjLKVsorZTLlC5KP1WPak8NoCZRc6jzqVXURupp6j3qay0tLSstX61xWmKteVpVWnu0zmk91PpA06c50Ti0iTQFbRltG+047Q7tNZ1Ot6MH09PpBfRl9Hr6SfoD+ntthvZIba62QHuudo12k/ZV7Rc6FB1bHbbOZJ1inUqdfTqXdXp0Kbp2uhxdnu4c3Rrdg7q3dPv0GHpuenF6+XpL9Xbondd7pk/St9MP0xfol+hv1j+p/5iBMawZHAafsZCxhXGa0WVANLA34BrkGJQb7DJoN+g11DccbZhiWGRYY3jEsJOJMe2YXGYeczlzL/Mm8+Mws2HsYcJhS4Y1Drs67J3RcKNgI6FRmdFuoxtGH41ZxmHGucYrjZuN75vgJk4m40ymm2wwOW3SM9xguP9w/vCy4XuH/2aKmjqZJpjONN1sesm0z8zcLMJMarbO7KRZjznTPNg8x3y1+VHzbguGRaCF2GK1xTGLP1iGLDYrj1XFOsXqtTS1jLRUWG6ybLfst7K3SrZaYLXb6r411drHOst6tXWbda+Nhc1Ym1k2DTa/2VJsfWxFtmttz9q+s7O3S7VbZNds98zeyJ5rX2zfYH/Pge4Q5DDNoc7huiPR0ccx13G94xUn1MnTSeRU43TZGXX2chY7r3fuGEEY4TtCMqJuxC0XmgvbpdClweXhSObImJELRjaPfDHKZlT6qJWjzo764urpmue6xfWum75blNsCt1a3V+5O7nz3GvfrHnSPcI+5Hi0eL0c7jxaO3jD6tifDc6znIs82z89e3l4yr0avbm8b7wzvWu9bPgY+8T5Lfc75EnxDfOf6Hvb94OflV+C31+8vfxf/XP8d/s/G2I8Rjtky5nGAVQAvYFNAZyArMCPwp8DOIMsgXlBd0KNg62BB8Nbgp2xHdg57J/tFiGuILORAyDuOH2c253goFhoRWhbaHqYflhxWHfYg3Co8O7whvDfCM2JmxPFIQmR05MrIW1wzLp9bz+2N8o6aHXUqmhadGF0d/SjGKUYW0zoWHRs1dtXYe7G2sZLY5jgQx41bFXc/3j5+WvyhccRx8eNqxj1JcEuYlXA2kZE4JXFH4tukkKTlSXeTHZIVyW0pOikTU+pT3qWGplakdo4fNX72+ItpJmnitJZ0UnpK+tb0vglhE9ZM6JroObF04s1J9pOKJp2fbDI5b/KRKTpTeFP2ZRAyUjN2ZHzixfHqeH2Z3MzazF4+h7+W/1wQLFgt6BYGCCuET7MCsiqynmUHZK/K7hYFiSpFPWKOuFr8MicyZ2POu9y43G25A3mpebvzyfkZ+Qcl+pJcyamp5lOLpnZInaWl0s5pftPWTOuVRcu2yhH5JHlLgQE8sF9SOCh+UDwsDCysKXw/PWX6viK9IknRpRlOM5bMeFocXvzzTHwmf2bbLMtZ82c9nM2evWkOMidzTttc67klc7vmRczbPp86P3f+rwtcF1QseLMwdWFriVnJvJLHP0T80FCqXSorvbXIf9HGxfhi8eL2JR5L1i35UiYou1DuWl5Z/mkpf+mFH91+rPpxYFnWsvblXss3rCCukKy4uTJo5fYKvYriiserxq5qWs1aXbb6zZopa85Xjq7cuJa6VrG2syqmqmWdzboV6z5Vi6pv1ITU7K41rV1S+269YP3VDcEbGjeabSzf+PEn8U+3N0Vsaqqzq6vcTNxcuPnJlpQtZ3/2+bl+q8nW8q2ft0m2dW5P2H6q3ru+fofpjuUNaIOioXvnxJ1XdoXuaml0ady0m7m7fA/Yo9jzxy8Zv9zcG723bZ/Pvsb9tvtrDzAOlDUhTTOaeptFzZ0taS0dB6MOtrX6tx44NPLQtsOWh2uOGB5ZfpR6tOTowLHiY33Hpcd7TmSfeNw2pe3uyfEnr58ad6r9dPTpc2fCz5w8yz577FzAucPn/c4fvOBzofmi18WmS56XDvzq+euBdq/2psvel1uu+F5p7RjTcfRq0NUT10KvnbnOvX7xRuyNjpvJN2/fmnir87bg9rM7eXde/lb4W//defcI98ru696vfGD6oO5fjv/a3enVeeRh6MNLjxIf3X3Mf/z8d/nvn7pKntCfVD61eFr/zP3Z4e7w7it/TPij67n0eX9P6Z96f9a+cHix/6/gvy71ju/teil7OfBq6Wvj19vejH7T1hff9+Bt/tv+d2Xvjd9v/+Dz4ezH1I9P+6d/In2q+uz4ufVL9Jd7A/kDA1KejKc6CmCwoVlZALzaBgA9DQDGFXh+mKC+56kEUd9NVQj8J6y+C6rEC4BG2CmP65zjAOyBzS4Ycs8DQHlUTwoGqIfHUNOIPMvDXc1FgzcewvuBgddmAJBaAfgsGxjoXz8w8HkLDPYOAMenqe+XSiHCu8FPwUp0w0gwD3wn/wZQR4CtlzeNcwAAAAlwSFlzAAAWJQAAFiUBSVIk8AAAAZtpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IlhNUCBDb3JlIDUuNC4wIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZXhpZj0iaHR0cDovL25zLmFkb2JlLmNvbS9leGlmLzEuMC8iPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MzI8L2V4aWY6UGl4ZWxYRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+MzI8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgPC9yZGY6UkRGPgo8L3g6eG1wbWV0YT4KCJJr3wAAABxpRE9UAAAAAgAAAAAAAAAQAAAAKAAAABAAAAAQAAADAMtRqFgAAALMSURBVFgJxJTbTxNREIfndNtSUNTEGwYwEB+8IDUqovXBqOCdIl5iomDQAAVSG332D/CFp0aU+0VEwBgRegGsUqIPCioYLdiaKNFgTCRGLqLUttt6ds7SkLQFXoBN2tk9M3PmO7+ZXdLU5fDBIl6k0brIAA1WOypw/sCmBdWhscuB9UhDpwhwcIEBrCJA/VMGkJnCAM5U9c2rEg9zduD+9zr9AB+wBZkpm9FxunJ+AZpzpwDsrAV3nzCArNQpgN4ZFfBSXJ/PBx7eh1YI5iQEfxJqZ7uac3diCFUeLamzDKACFw9twYVTFW9C7uGl1Z0uHuLWLoX4leGQEBUJ4043fBv7B88dPzFPJiVASGiQR3lJGEcPjpbUPmYA2YcZQEZ5cAChuJeePH9fHKgT1gRAjjk9UGQdhN7BEZDLOAoREIILLRoGcMciAtR09KMCl44kYEBG2eugmcLJs1SxkJUUjf7RSTeYBoZBuS4SlNHL/DmaJht8//UXpJzEvzb9piV/Fz7Sg6Ml1e0M4PJRBnCy9NX0eLwXeu72+KBdtwefjf3DUGT+CGFhHPB0FmJWRUBd9na/r7jzMyioL9jVWpCMyzUdIkBlmw0VyDm2FR3pJYEAgvzrVy+BG+qNGKO9b4PRCTdwHKGDCDDxxwX6C0pU4uvIJOTUvoUIhTRYfTAUMoCq9n70k3IzA8g7LgLc6glIFCaf573gcnvRJ5dLUGKhzcJcjP92geGaClaEy8Bo+wF6y6fQANrduEdFmwhQZnyPCmjSEtGhLu5GO5c/npJN0uE7mxwD2v3xmHLdYIc+OogyafAZMF5hbSw32TCelBgYQIGaAaTdfDmX2vgdEFqjS90AamUU5tT3DEH1sy+gUHAgCfEamHQqjC01igC3W9+hAoXpSnSc0L+YFUAoLJy+6FwibItdjvHFXYPwoHsIpZ/pg2S+uhfj6cHR/gcAAP//w/tvYAAAAm5JREFUY5y64cJ/BiDI8tcHUQxeE46CaXzEr9//GJx0xBiqPNXByjKXnGe48eQTAwc7MwMjIyM+rQzbCqzB8tM2XgTTjJPXQxyQEwBxgGf/EbwGgCR//PzDUOihxuBnIMVw8fEHhuwF5xh4uNmAlhPUyrC90AasaMoGqAMmrTsPDoHcQAOwhEfvYYKm/Pz1l6HIS51BT4afYcvlFwxrjj9iYGdjJqgPpGBHsS1YHdDjYJpxwlqIA/KDIA5w7zkElsBH/Pv3n+HX778Mf//+Z2BhYWJgY2UiGPQw83aW2IGZE9dBHdC/+hw4BApCDMESbt0HYWpx0iAH/Pz5l4GXh43h85efDGxsLAzMzESEP9DEXaX2YHMnrDkPphl7V0EcUBQKdUDnAbAELgLk2u/f/zBMTTJm0JcTZHj45itD1ORjDFxcrAzEOGFXuQPY6L7VUAd0rzwLDoGSMCOwhGvHATCNi/gPVA0K8m3QoASpC5lylOH9518MTESkwt0VDmCje1adA9OMXSvOgB1QGm4MFnBp3w+m8RHfvv9mmJ5iCg+BiIlHGbiBIUAM2FPpCFYG9DiYZuxcfhrsgLIIE7CAS9s+gub8BaaBHz/+MEiJcTM8e/WVgZ2dhYGFyDSwp8oJbD7Q4xAHtC+DOKAiEuIA51bCDoC58B8wPogJdph6EL23GuKAjuVQB7QtPQUOgcooU7A6p5a9yOqpzt5X4ww2E+hxMM3YtgTqgGiYA/ZQ3VJkA/fVuEAcsBTqgNYlJ8EhUBVthqyO5mxgyIPtYGxeDHFATQx9HdCyBOaARRAH0NzLOCxgbFp0AhwFOORpLgwAR+zr0hgsGFsAAAAASUVORK5CYII="; + +static NSString * const kSVGDefaultContentString = @"\ + \ + \ + \ + \ +"; + + +NSString * const SVGKGetBrokenImageString(void) { + return kSVGBrokenImageString; +} + +UIImage * const SVGKGetBrokenImageRepresentation(void) { + static dispatch_once_t onceToken; + static UIImage *image; + dispatch_once(&onceToken, ^{ + NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:SVGKGetBrokenImageString()]]; + image = [[UIImage alloc] initWithData:imageData]; + }); + return image; +} + +NSString * const SVGKGetDefaultContentString(void) { + return kSVGDefaultContentString; +} diff --git a/Source/Unsorted/SVGKPattern.h b/Source/Utils/SVGKPattern.h similarity index 53% rename from Source/Unsorted/SVGKPattern.h rename to Source/Utils/SVGKPattern.h index a59ac7955..0a1e6422c 100644 --- a/Source/Unsorted/SVGKPattern.h +++ b/Source/Utils/SVGKPattern.h @@ -1,26 +1,13 @@ #import - -#if TARGET_OS_IPHONE - -#import - -#endif +#import "SVGKDefine.h" /** lightweight wrapper for UIColor so that we can draw with fill patterns */ @interface SVGKPattern : NSObject -{ -} -#if TARGET_OS_IPHONE - -+ (SVGKPattern*) patternWithUIColor:(UIColor*)color; ++ (SVGKPattern*) patternWithColor:(UIColor*)color; + (SVGKPattern*) patternWithImage:(UIImage*)image; -@property (readwrite,nonatomic,retain) UIColor* color; - -#else - -#endif +@property (readwrite,nonatomic,strong) UIColor* color; - (CGColorRef) CGColor; diff --git a/Source/Unsorted/SVGKPattern.m b/Source/Utils/SVGKPattern.m similarity index 54% rename from Source/Unsorted/SVGKPattern.m rename to Source/Utils/SVGKPattern.m index 93b79b267..cabb0f25d 100644 --- a/Source/Unsorted/SVGKPattern.m +++ b/Source/Utils/SVGKPattern.m @@ -2,13 +2,11 @@ @implementation SVGKPattern -#if TARGET_OS_IPHONE - @synthesize color; -+ (SVGKPattern *)patternWithUIColor:(UIColor *)color ++ (SVGKPattern *)patternWithColor:(UIColor *)color { - SVGKPattern* p = [[[SVGKPattern alloc] init] autorelease]; + SVGKPattern* p = [[SVGKPattern alloc] init]; p.color = color; return p; } @@ -16,18 +14,12 @@ + (SVGKPattern *)patternWithUIColor:(UIColor *)color + (SVGKPattern*)patternWithImage:(UIImage*)image { UIColor* patternImage = [UIColor colorWithPatternImage:image]; - return [self patternWithUIColor:patternImage]; + return [self patternWithColor:patternImage]; } -#endif - - (CGColorRef)CGColor { -#if TARGET_OS_IPHONE return [self.color CGColor]; -#else - return NULL; -#endif } @end diff --git a/Source/Unsorted/SVGUtils.h b/Source/Utils/SVGUtils.h similarity index 90% rename from Source/Unsorted/SVGUtils.h rename to Source/Utils/SVGUtils.h index b0c9919bf..092651f51 100644 --- a/Source/Unsorted/SVGUtils.h +++ b/Source/Utils/SVGUtils.h @@ -6,12 +6,7 @@ // #import - -#if TARGET_OS_IPHONE - -#import - -#endif +#import #define RGB_N(v) (v) / 255.0f diff --git a/Source/Unsorted/SVGUtils.m b/Source/Utils/SVGUtils.m similarity index 89% rename from Source/Unsorted/SVGUtils.m rename to Source/Utils/SVGUtils.m index 6035ae5f0..6166ab805 100644 --- a/Source/Unsorted/SVGUtils.m +++ b/Source/Utils/SVGUtils.m @@ -8,7 +8,7 @@ #import "SVGUtils.h" #define MAX_ACCUM 64 -#define NUM_COLORS 147 +#define NUM_COLORS 148 SVGColor ColorValueWithName (const char *name); @@ -160,7 +160,9 @@ "white", "whitesmoke", "yellow", - "yellowgreen" + "yellowgreen", + // CSS Color + "transparent" }; static const SVGColor gColorValues[NUM_COLORS] = { @@ -237,7 +239,9 @@ (SVGColor) { 64,224,208,255 }, (SVGColor) { 238,130,238,255 }, (SVGColor) { 245,222,179,255 }, (SVGColor) { 255,255,255,255 }, (SVGColor) { 245,245,245,255 }, (SVGColor) { 255,255,0,255 }, - (SVGColor) { 154,205,50,255 } + (SVGColor) { 154,205,50,255 }, + // CSS Color + (SVGColor) { 0, 0, 0, 0} }; SVGColor ColorValueWithName (const char *name) { @@ -264,7 +268,8 @@ SVGColor SVGColorMake (uint8_t r, uint8_t g, uint8_t b, uint8_t a) { typedef enum { PhaseNone = 0, - PhaseRGB + PhaseRGB, + PhaseRGBA } Phase; SVGColor SVGColorFromString (const char *string) { @@ -274,7 +279,7 @@ SVGColor SVGColorFromString (const char *string) { color.a = 0xFF; - if (!strncmp(string, "rgb(", 4)) { + if (!strncmp(string, "rgb(", 4) || !strncmp(string, "rgba(", 5)) { size_t len = strlen(string); char accum[MAX_ACCUM]; @@ -290,18 +295,18 @@ SVGColor SVGColorFromString (const char *string) { continue; } - if (!strcmp(accum, "rgb")) { + if (!strcmp(accum, "rgba(")) { + phase = PhaseRGBA; + bzero(accum, MAX_ACCUM); + accumIdx = 0; + } else if (!strcmp(accum, "rgb(")) { phase = PhaseRGB; + bzero(accum, MAX_ACCUM); + accumIdx = 0; } - if (phase == PhaseRGB) { - if (c == '(') { - bzero(accum, MAX_ACCUM); - accumIdx = 0; - - continue; - } - else if (c == ',') { + if (phase == PhaseRGB || phase == PhaseRGBA) { + if (c == ',') { if (currComponent == 0) { color.r = atoi(accum); currComponent++; @@ -310,16 +315,23 @@ SVGColor SVGColorFromString (const char *string) { color.g = atoi(accum); currComponent++; } - + else if (phase == PhaseRGBA && currComponent == 2) { + color.b = atoi(accum); + currComponent++; + } bzero(accum, MAX_ACCUM); accumIdx = 0; continue; } - else if (c == ')' && currComponent == 2) { - color.b = atoi(accum); - break; - } + else if (c == ')' && currComponent == 2) { + color.b = atoi(accum); + break; + } + else if (c == ')' && currComponent == 3) { + color.a = (uint8_t)lround(atof(accum) * 255.0f); + break; + } } accum[accumIdx++] = c; @@ -343,8 +355,8 @@ SVGColor SVGColorFromString (const char *string) { } else if( strlen(hexString) == 3 ) { - char r[3], g[3], b[3]; - r[2] = g[2] = b[2] = '\0'; + char r[2], g[2], b[2]; + r[1] = g[1] = b[1] = '\0'; strncpy(r, hexString, 1); strncpy(g, hexString + 1, 1); @@ -376,7 +388,7 @@ CGFloat SVGPercentageFromString (const char *string) { size_t len = strlen(string); if (string[len-1] != '%') { - DDLogCWarn(@"Invalid percentage: %s", string); + SVGKitLogWarn(@"Invalid percentage: %s", string); return -1; } @@ -437,14 +449,10 @@ CGMutablePathRef createPathFromPointsInString (const char *string, boolean_t clo CGColorRef CGColorWithSVGColor (SVGColor color) { CGColorRef outColor = NULL; -#if TARGET_OS_IPHONE outColor = [UIColor colorWithRed:RGB_N(color.r) green:RGB_N(color.g) blue:RGB_N(color.b) alpha:RGB_N(color.a)].CGColor; -#else - outColor = CGColorCreateGenericRGB(RGB_N(color.r), RGB_N(color.g), RGB_N(color.b), RGB_N(color.a)); -#endif return outColor; -} \ No newline at end of file +} diff --git a/Source/Vendor/Lumberjack/DDASLLogger.h b/Source/Vendor/Lumberjack/DDASLLogger.h deleted file mode 100755 index f560f3214..000000000 --- a/Source/Vendor/Lumberjack/DDASLLogger.h +++ /dev/null @@ -1,41 +0,0 @@ -#import -#import - -#import "DDLog.h" - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a logger for the Apple System Log facility. - * - * As described in the "Getting Started" page, - * the traditional DDLogWarn() function directs it's output to two places: - * - * - Apple System Log - * - StdErr (if stderr is a TTY) so log statements show up in Xcode console - * - * To duplicate DDLogWarn() functionality you can simply add this logger and a tty logger. - * However, if you instead choose to use file logging (for faster performance), - * you may choose to use a file logger and a tty logger. -**/ - -@interface DDASLLogger : DDAbstractLogger -{ - aslclient client; -} - -+ (DDASLLogger *)sharedInstance; - -// Inherited from DDAbstractLogger - -// - (id )logFormatter; -// - (void)setLogFormatter:(id )formatter; - -@end diff --git a/Source/Vendor/Lumberjack/DDASLLogger.m b/Source/Vendor/Lumberjack/DDASLLogger.m deleted file mode 100755 index 0c35f2fcf..000000000 --- a/Source/Vendor/Lumberjack/DDASLLogger.m +++ /dev/null @@ -1,99 +0,0 @@ -#import "DDASLLogger.h" - -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - - -@implementation DDASLLogger - -static DDASLLogger *sharedInstance; - -/** - * The runtime sends initialize to each class in a program exactly one time just before the class, - * or any class that inherits from it, is sent its first message from within the program. (Thus the - * method may never be invoked if the class is not used.) The runtime sends the initialize message to - * classes in a thread-safe manner. Superclasses receive this message before their subclasses. - * - * This method may also be called directly (assumably by accident), hence the safety mechanism. -**/ -+ (void)initialize -{ - static BOOL initialized = NO; - if (!initialized) - { - initialized = YES; - - sharedInstance = [[DDASLLogger alloc] init]; - } -} - -+ (DDASLLogger *)sharedInstance -{ - return sharedInstance; -} - -- (id)init -{ - if (sharedInstance != nil) - { - return nil; - } - - if ((self = [super init])) - { - // A default asl client is provided for the main thread, - // but background threads need to create their own client. - - client = asl_open(NULL, "com.apple.console", 0); - } - return self; -} - -- (void)logMessage:(DDLogMessage *)logMessage -{ - NSString *logMsg = logMessage->logMsg; - - if (formatter) - { - logMsg = [formatter formatLogMessage:logMessage]; - } - - if (logMsg) - { - const char *msg = [logMsg UTF8String]; - - int aslLogLevel; - switch (logMessage->logFlag) - { - // Note: By default ASL will filter anything above level 5 (Notice). - // So our mappings shouldn't go above that level. - - case LOG_FLAG_ERROR : aslLogLevel = ASL_LEVEL_CRIT; break; - case LOG_FLAG_WARN : aslLogLevel = ASL_LEVEL_ERR; break; - case LOG_FLAG_INFO : aslLogLevel = ASL_LEVEL_WARNING; break; - default : aslLogLevel = ASL_LEVEL_NOTICE; break; - } - - asl_log(client, NULL, aslLogLevel, "%s", msg); - } -} - -- (NSString *)loggerName -{ - return @"cocoa.lumberjack.aslLogger"; -} - -@end diff --git a/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.h b/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.h deleted file mode 100644 index 436234e25..000000000 --- a/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.h +++ /dev/null @@ -1,102 +0,0 @@ -#import - -#import "DDLog.h" - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides an abstract implementation of a database logger. - * - * That is, it provides the base implementation for a database logger to build atop of. - * All that is needed for a concrete database logger is to extend this class - * and override the methods in the implementation file that are prefixed with "db_". -**/ - -@interface DDAbstractDatabaseLogger : DDAbstractLogger { -@protected - NSUInteger saveThreshold; - NSTimeInterval saveInterval; - NSTimeInterval maxAge; - NSTimeInterval deleteInterval; - BOOL deleteOnEverySave; - - BOOL saveTimerSuspended; - NSUInteger unsavedCount; - dispatch_time_t unsavedTime; - dispatch_source_t saveTimer; - dispatch_time_t lastDeleteTime; - dispatch_source_t deleteTimer; -} - -/** - * Specifies how often to save the data to disk. - * Since saving is an expensive operation (disk io) it is not done after every log statement. - * These properties allow you to configure how/when the logger saves to disk. - * - * A save is done when either (whichever happens first): - * - * - The number of unsaved log entries reaches saveThreshold - * - The amount of time since the oldest unsaved log entry was created reaches saveInterval - * - * You can optionally disable the saveThreshold by setting it to zero. - * If you disable the saveThreshold you are entirely dependent on the saveInterval. - * - * You can optionally disable the saveInterval by setting it to zero (or a negative value). - * If you disable the saveInterval you are entirely dependent on the saveThreshold. - * - * It's not wise to disable both saveThreshold and saveInterval. - * - * The default saveThreshold is 500. - * The default saveInterval is 60 seconds. -**/ -@property (assign, readwrite) NSUInteger saveThreshold; -@property (assign, readwrite) NSTimeInterval saveInterval; - -/** - * It is likely you don't want the log entries to persist forever. - * Doing so would allow the database to grow infinitely large over time. - * - * The maxAge property provides a way to specify how old a log statement can get - * before it should get deleted from the database. - * - * The deleteInterval specifies how often to sweep for old log entries. - * Since deleting is an expensive operation (disk io) is is done on a fixed interval. - * - * An alternative to the deleteInterval is the deleteOnEverySave option. - * This specifies that old log entries should be deleted during every save operation. - * - * You can optionally disable the maxAge by setting it to zero (or a negative value). - * If you disable the maxAge then old log statements are not deleted. - * - * You can optionally disable the deleteInterval by setting it to zero (or a negative value). - * - * If you disable both deleteInterval and deleteOnEverySave then old log statements are not deleted. - * - * It's not wise to enable both deleteInterval and deleteOnEverySave. - * - * The default maxAge is 7 days. - * The default deleteInterval is 5 minutes. - * The default deleteOnEverySave is NO. -**/ -@property (assign, readwrite) NSTimeInterval maxAge; -@property (assign, readwrite) NSTimeInterval deleteInterval; -@property (assign, readwrite) BOOL deleteOnEverySave; - -/** - * Forces a save of any pending log entries (flushes log entries to disk). -**/ -- (void)savePendingLogEntries; - -/** - * Removes any log entries that are older than maxAge. -**/ -- (void)deleteOldLogEntries; - -@end diff --git a/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.m b/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.m deleted file mode 100644 index c7366a69c..000000000 --- a/Source/Vendor/Lumberjack/DDAbstractDatabaseLogger.m +++ /dev/null @@ -1,727 +0,0 @@ -#import "DDAbstractDatabaseLogger.h" -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - -@interface DDAbstractDatabaseLogger () -- (void)destroySaveTimer; -- (void)destroyDeleteTimer; -@end - -#pragma mark - - -@implementation DDAbstractDatabaseLogger - -- (id)init -{ - if ((self = [super init])) - { - saveThreshold = 500; - saveInterval = 60; // 60 seconds - maxAge = (60 * 60 * 24 * 7); // 7 days - deleteInterval = (60 * 5); // 5 minutes - } - return self; -} - -- (void)dealloc -{ - [self destroySaveTimer]; - [self destroyDeleteTimer]; - -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Override Me -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)db_log:(DDLogMessage *)logMessage -{ - // Override me and add your implementation. - // - // Return YES if an item was added to the buffer. - // Return NO if the logMessage was ignored. - - return NO; -} - -- (void)db_save -{ - // Override me and add your implementation. -} - -- (void)db_delete -{ - // Override me and add your implementation. -} - -- (void)db_saveAndDelete -{ - // Override me and add your implementation. -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Private API -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)performSaveAndSuspendSaveTimer -{ - if (unsavedCount > 0) - { - if (deleteOnEverySave) - [self db_saveAndDelete]; - else - [self db_save]; - } - - unsavedCount = 0; - unsavedTime = 0; - - if (saveTimer && !saveTimerSuspended) - { - dispatch_suspend(saveTimer); - saveTimerSuspended = YES; - } -} - -- (void)performDelete -{ - if (maxAge > 0.0) - { - [self db_delete]; - - lastDeleteTime = dispatch_time(DISPATCH_TIME_NOW, 0); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Timers -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)destroySaveTimer -{ - if (saveTimer) - { - dispatch_source_cancel(saveTimer); - if (saveTimerSuspended) - { - // Must resume a timer before releasing it (or it will crash) - dispatch_resume(saveTimer); - saveTimerSuspended = NO; - } - #if !OS_OBJECT_USE_OBJC - dispatch_release(saveTimer); - #endif - saveTimer = NULL; - } -} - -- (void)updateAndResumeSaveTimer -{ - if ((saveTimer != NULL) && (saveInterval > 0.0) && (unsavedTime > 0.0)) - { - uint64_t interval = (uint64_t)(saveInterval * NSEC_PER_SEC); - dispatch_time_t startTime = dispatch_time(unsavedTime, interval); - - dispatch_source_set_timer(saveTimer, startTime, interval, 1.0); - - if (saveTimerSuspended) - { - dispatch_resume(saveTimer); - saveTimerSuspended = NO; - } - } -} - -- (void)createSuspendedSaveTimer -{ - if ((saveTimer == NULL) && (saveInterval > 0.0)) - { - saveTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue); - - dispatch_source_set_event_handler(saveTimer, ^{ @autoreleasepool { - - [self performSaveAndSuspendSaveTimer]; - - }}); - - saveTimerSuspended = YES; - } -} - -- (void)destroyDeleteTimer -{ - if (deleteTimer) - { - dispatch_source_cancel(deleteTimer); - #if !OS_OBJECT_USE_OBJC - dispatch_release(deleteTimer); - #endif - deleteTimer = NULL; - } -} - -- (void)updateDeleteTimer -{ - if ((deleteTimer != NULL) && (deleteInterval > 0.0) && (maxAge > 0.0)) - { - uint64_t interval = (uint64_t)(deleteInterval * NSEC_PER_SEC); - dispatch_time_t startTime; - - if (lastDeleteTime > 0) - startTime = dispatch_time(lastDeleteTime, interval); - else - startTime = dispatch_time(DISPATCH_TIME_NOW, interval); - - dispatch_source_set_timer(deleteTimer, startTime, interval, 1.0); - } -} - -- (void)createAndStartDeleteTimer -{ - if ((deleteTimer == NULL) && (deleteInterval > 0.0) && (maxAge > 0.0)) - { - deleteTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue); - - if (deleteTimer != NULL) { - dispatch_source_set_event_handler(deleteTimer, ^{ @autoreleasepool { - - [self performDelete]; - - }}); - - [self updateDeleteTimer]; - - dispatch_resume(deleteTimer); - } - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Configuration -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (NSUInteger)saveThreshold -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block NSUInteger result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = saveThreshold; - }); - }); - - return result; -} - -- (void)setSaveThreshold:(NSUInteger)threshold -{ - dispatch_block_t block = ^{ @autoreleasepool { - - if (saveThreshold != threshold) - { - saveThreshold = threshold; - - // Since the saveThreshold has changed, - // we check to see if the current unsavedCount has surpassed the new threshold. - // - // If it has, we immediately save the log. - - if ((unsavedCount >= saveThreshold) && (saveThreshold > 0)) - { - [self performSaveAndSuspendSaveTimer]; - } - } - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (NSTimeInterval)saveInterval -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block NSTimeInterval result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = saveInterval; - }); - }); - - return result; -} - -- (void)setSaveInterval:(NSTimeInterval)interval -{ - dispatch_block_t block = ^{ @autoreleasepool { - - // C99 recommended floating point comparison macro - // Read: isLessThanOrGreaterThan(floatA, floatB) - - if (/* saveInterval != interval */ islessgreater(saveInterval, interval)) - { - saveInterval = interval; - - // There are several cases we need to handle here. - // - // 1. If the saveInterval was previously enabled and it just got disabled, - // then we need to stop the saveTimer. (And we might as well release it.) - // - // 2. If the saveInterval was previously disabled and it just got enabled, - // then we need to setup the saveTimer. (Plus we might need to do an immediate save.) - // - // 3. If the saveInterval increased, then we need to reset the timer so that it fires at the later date. - // - // 4. If the saveInterval decreased, then we need to reset the timer so that it fires at an earlier date. - // (Plus we might need to do an immediate save.) - - if (saveInterval > 0.0) - { - if (saveTimer == NULL) - { - // Handles #2 - // - // Since the saveTimer uses the unsavedTime to calculate it's first fireDate, - // if a save is needed the timer will fire immediately. - - [self createSuspendedSaveTimer]; - [self updateAndResumeSaveTimer]; - } - else - { - // Handles #3 - // Handles #4 - // - // Since the saveTimer uses the unsavedTime to calculate it's first fireDate, - // if a save is needed the timer will fire immediately. - - [self updateAndResumeSaveTimer]; - } - } - else if (saveTimer) - { - // Handles #1 - - [self destroySaveTimer]; - } - } - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (NSTimeInterval)maxAge -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block NSTimeInterval result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = maxAge; - }); - }); - - return result; -} - -- (void)setMaxAge:(NSTimeInterval)interval -{ - dispatch_block_t block = ^{ @autoreleasepool { - - // C99 recommended floating point comparison macro - // Read: isLessThanOrGreaterThan(floatA, floatB) - - if (/* maxAge != interval */ islessgreater(maxAge, interval)) - { - NSTimeInterval oldMaxAge = maxAge; - NSTimeInterval newMaxAge = interval; - - maxAge = interval; - - // There are several cases we need to handle here. - // - // 1. If the maxAge was previously enabled and it just got disabled, - // then we need to stop the deleteTimer. (And we might as well release it.) - // - // 2. If the maxAge was previously disabled and it just got enabled, - // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.) - // - // 3. If the maxAge was increased, - // then we don't need to do anything. - // - // 4. If the maxAge was decreased, - // then we should do an immediate delete. - - BOOL shouldDeleteNow = NO; - - if (oldMaxAge > 0.0) - { - if (newMaxAge <= 0.0) - { - // Handles #1 - - [self destroyDeleteTimer]; - } - else if (oldMaxAge > newMaxAge) - { - // Handles #4 - shouldDeleteNow = YES; - } - } - else if (newMaxAge > 0.0) - { - // Handles #2 - shouldDeleteNow = YES; - } - - if (shouldDeleteNow) - { - [self performDelete]; - - if (deleteTimer) - [self updateDeleteTimer]; - else - [self createAndStartDeleteTimer]; - } - } - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (NSTimeInterval)deleteInterval -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block NSTimeInterval result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = deleteInterval; - }); - }); - - return result; -} - -- (void)setDeleteInterval:(NSTimeInterval)interval -{ - dispatch_block_t block = ^{ @autoreleasepool { - - // C99 recommended floating point comparison macro - // Read: isLessThanOrGreaterThan(floatA, floatB) - - if (/* deleteInterval != interval */ islessgreater(deleteInterval, interval)) - { - deleteInterval = interval; - - // There are several cases we need to handle here. - // - // 1. If the deleteInterval was previously enabled and it just got disabled, - // then we need to stop the deleteTimer. (And we might as well release it.) - // - // 2. If the deleteInterval was previously disabled and it just got enabled, - // then we need to setup the deleteTimer. (Plus we might need to do an immediate delete.) - // - // 3. If the deleteInterval increased, then we need to reset the timer so that it fires at the later date. - // - // 4. If the deleteInterval decreased, then we need to reset the timer so that it fires at an earlier date. - // (Plus we might need to do an immediate delete.) - - if (deleteInterval > 0.0) - { - if (deleteTimer == NULL) - { - // Handles #2 - // - // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate, - // if a delete is needed the timer will fire immediately. - - [self createAndStartDeleteTimer]; - } - else - { - // Handles #3 - // Handles #4 - // - // Since the deleteTimer uses the lastDeleteTime to calculate it's first fireDate, - // if a save is needed the timer will fire immediately. - - [self updateDeleteTimer]; - } - } - else if (deleteTimer) - { - // Handles #1 - - [self destroyDeleteTimer]; - } - } - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (BOOL)deleteOnEverySave -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block BOOL result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = deleteOnEverySave; - }); - }); - - return result; -} - -- (void)setDeleteOnEverySave:(BOOL)flag -{ - dispatch_block_t block = ^{ - - deleteOnEverySave = flag; - }; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Public API -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)savePendingLogEntries -{ - dispatch_block_t block = ^{ @autoreleasepool { - - [self performSaveAndSuspendSaveTimer]; - }}; - - if ([self isOnInternalLoggerQueue]) - block(); - else - dispatch_async(loggerQueue, block); -} - -- (void)deleteOldLogEntries -{ - dispatch_block_t block = ^{ @autoreleasepool { - - [self performDelete]; - }}; - - if ([self isOnInternalLoggerQueue]) - block(); - else - dispatch_async(loggerQueue, block); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark DDLogger -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)didAddLogger -{ - // If you override me be sure to invoke [super didAddLogger]; - - [self createSuspendedSaveTimer]; - - [self createAndStartDeleteTimer]; -} - -- (void)willRemoveLogger -{ - // If you override me be sure to invoke [super willRemoveLogger]; - - [self performSaveAndSuspendSaveTimer]; - - [self destroySaveTimer]; - [self destroyDeleteTimer]; -} - -- (void)logMessage:(DDLogMessage *)logMessage -{ - if ([self db_log:logMessage]) - { - BOOL firstUnsavedEntry = (++unsavedCount == 1); - - if ((unsavedCount >= saveThreshold) && (saveThreshold > 0)) - { - [self performSaveAndSuspendSaveTimer]; - } - else if (firstUnsavedEntry) - { - unsavedTime = dispatch_time(DISPATCH_TIME_NOW, 0); - [self updateAndResumeSaveTimer]; - } - } -} - -- (void)flush -{ - // This method is invoked by DDLog's flushLog method. - // - // It is called automatically when the application quits, - // or if the developer invokes DDLog's flushLog method prior to crashing or something. - - [self performSaveAndSuspendSaveTimer]; -} - -@end diff --git a/Source/Vendor/Lumberjack/DDFileLogger.h b/Source/Vendor/Lumberjack/DDFileLogger.h deleted file mode 100644 index 5af637649..000000000 --- a/Source/Vendor/Lumberjack/DDFileLogger.h +++ /dev/null @@ -1,334 +0,0 @@ -#import -#import "DDLog.h" - -@class DDLogFileInfo; - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a logger to write log statements to a file. -**/ - - -// Default configuration and safety/sanity values. -// -// maximumFileSize -> DEFAULT_LOG_MAX_FILE_SIZE -// rollingFrequency -> DEFAULT_LOG_ROLLING_FREQUENCY -// maximumNumberOfLogFiles -> DEFAULT_LOG_MAX_NUM_LOG_FILES -// -// You should carefully consider the proper configuration values for your application. - -#define DEFAULT_LOG_MAX_FILE_SIZE (1024 * 1024) // 1 MB -#define DEFAULT_LOG_ROLLING_FREQUENCY (60 * 60 * 24) // 24 Hours -#define DEFAULT_LOG_MAX_NUM_LOG_FILES (5) // 5 Files - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -// The LogFileManager protocol is designed to allow you to control all aspects of your log files. -// -// The primary purpose of this is to allow you to do something with the log files after they have been rolled. -// Perhaps you want to compress them to save disk space. -// Perhaps you want to upload them to an FTP server. -// Perhaps you want to run some analytics on the file. -// -// A default LogFileManager is, of course, provided. -// The default LogFileManager simply deletes old log files according to the maximumNumberOfLogFiles property. -// -// This protocol provides various methods to fetch the list of log files. -// -// There are two variants: sorted and unsorted. -// If sorting is not necessary, the unsorted variant is obviously faster. -// The sorted variant will return an array sorted by when the log files were created, -// with the most recently created log file at index 0, and the oldest log file at the end of the array. -// -// You can fetch only the log file paths (full path including name), log file names (name only), -// or an array of DDLogFileInfo objects. -// The DDLogFileInfo class is documented below, and provides a handy wrapper that -// gives you easy access to various file attributes such as the creation date or the file size. - -@protocol DDLogFileManager -@required - -// Public properties - -/** - * The maximum number of archived log files to keep on disk. - * For example, if this property is set to 3, - * then the LogFileManager will only keep 3 archived log files (plus the current active log file) on disk. - * Once the active log file is rolled/archived, then the oldest of the existing 3 rolled/archived log files is deleted. - * - * You may optionally disable deleting old/rolled/archived log files by setting this property to zero. -**/ -@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles; - -// Public methods - -- (NSString *)logsDirectory; - -- (NSArray *)unsortedLogFilePaths; -- (NSArray *)unsortedLogFileNames; -- (NSArray *)unsortedLogFileInfos; - -- (NSArray *)sortedLogFilePaths; -- (NSArray *)sortedLogFileNames; -- (NSArray *)sortedLogFileInfos; - -// Private methods (only to be used by DDFileLogger) - -- (NSString *)createNewLogFile; - -@optional - -// Notifications from DDFileLogger - -- (void)didArchiveLogFile:(NSString *)logFilePath; -- (void)didRollAndArchiveLogFile:(NSString *)logFilePath; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Default log file manager. - * - * All log files are placed inside the logsDirectory. - * If a specific logsDirectory isn't specified, the default directory is used. - * On Mac, this is in ~/Library/Logs/. - * On iPhone, this is in ~/Library/Caches/Logs. - * - * Log files are named "log-.txt", - * where uuid is a 6 character hexadecimal consisting of the set [0123456789ABCDEF]. - * - * Archived log files are automatically deleted according to the maximumNumberOfLogFiles property. -**/ -@interface DDLogFileManagerDefault : NSObject -{ - NSUInteger maximumNumberOfLogFiles; - NSString *_logsDirectory; -} - -- (id)init; -- (id)initWithLogsDirectory:(NSString *)logsDirectory; - -/* Inherited from DDLogFileManager protocol: - -@property (readwrite, assign) NSUInteger maximumNumberOfLogFiles; - -- (NSString *)logsDirectory; - -- (NSArray *)unsortedLogFilePaths; -- (NSArray *)unsortedLogFileNames; -- (NSArray *)unsortedLogFileInfos; - -- (NSArray *)sortedLogFilePaths; -- (NSArray *)sortedLogFileNames; -- (NSArray *)sortedLogFileInfos; - -*/ - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Most users will want file log messages to be prepended with the date and time. - * Rather than forcing the majority of users to write their own formatter, - * we will supply a logical default formatter. - * Users can easily replace this formatter with their own by invoking the setLogFormatter method. - * It can also be removed by calling setLogFormatter, and passing a nil parameter. - * - * In addition to the convenience of having a logical default formatter, - * it will also provide a template that makes it easy for developers to copy and change. -**/ -@interface DDLogFileFormatterDefault : NSObject -{ - NSDateFormatter *dateFormatter; -} - -- (id)init; -- (id)initWithDateFormatter:(NSDateFormatter *)dateFormatter; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@interface DDFileLogger : DDAbstractLogger -{ - __strong id logFileManager; - - DDLogFileInfo *currentLogFileInfo; - NSFileHandle *currentLogFileHandle; - - dispatch_source_t rollingTimer; - - unsigned long long maximumFileSize; - NSTimeInterval rollingFrequency; -} - -- (id)init; -- (id)initWithLogFileManager:(id )logFileManager; - -/** - * Log File Rolling: - * - * maximumFileSize: - * The approximate maximum size to allow log files to grow. - * If a log file is larger than this value after a log statement is appended, - * then the log file is rolled. - * - * rollingFrequency - * How often to roll the log file. - * The frequency is given as an NSTimeInterval, which is a double that specifies the interval in seconds. - * Once the log file gets to be this old, it is rolled. - * - * Both the maximumFileSize and the rollingFrequency are used to manage rolling. - * Whichever occurs first will cause the log file to be rolled. - * - * For example: - * The rollingFrequency is 24 hours, - * but the log file surpasses the maximumFileSize after only 20 hours. - * The log file will be rolled at that 20 hour mark. - * A new log file will be created, and the 24 hour timer will be restarted. - * - * You may optionally disable rolling due to filesize by setting maximumFileSize to zero. - * If you do so, rolling is based solely on rollingFrequency. - * - * You may optionally disable rolling due to time by setting rollingFrequency to zero (or any non-positive number). - * If you do so, rolling is based solely on maximumFileSize. - * - * If you disable both maximumFileSize and rollingFrequency, then the log file won't ever be rolled. - * This is strongly discouraged. -**/ -@property (readwrite, assign) unsigned long long maximumFileSize; -@property (readwrite, assign) NSTimeInterval rollingFrequency; - -/** - * The DDLogFileManager instance can be used to retrieve the list of log files, - * and configure the maximum number of archived log files to keep. - * - * @see DDLogFileManager.maximumNumberOfLogFiles -**/ -@property (strong, nonatomic, readonly) id logFileManager; - - -// You can optionally force the current log file to be rolled with this method. - -- (void)rollLogFile; - -// Inherited from DDAbstractLogger - -// - (id )logFormatter; -// - (void)setLogFormatter:(id )formatter; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * DDLogFileInfo is a simple class that provides access to various file attributes. - * It provides good performance as it only fetches the information if requested, - * and it caches the information to prevent duplicate fetches. - * - * It was designed to provide quick snapshots of the current state of log files, - * and to help sort log files in an array. - * - * This class does not monitor the files, or update it's cached attribute values if the file changes on disk. - * This is not what the class was designed for. - * - * If you absolutely must get updated values, - * you can invoke the reset method which will clear the cache. -**/ -@interface DDLogFileInfo : NSObject -{ - __strong NSString *filePath; - __strong NSString *fileName; - - __strong NSDictionary *fileAttributes; - - __strong NSDate *creationDate; - __strong NSDate *modificationDate; - - unsigned long long fileSize; -} - -@property (strong, nonatomic, readonly) NSString *filePath; -@property (strong, nonatomic, readonly) NSString *fileName; - -@property (strong, nonatomic, readonly) NSDictionary *fileAttributes; - -@property (strong, nonatomic, readonly) NSDate *creationDate; -@property (strong, nonatomic, readonly) NSDate *modificationDate; - -@property (nonatomic, readonly) unsigned long long fileSize; - -@property (nonatomic, readonly) NSTimeInterval age; - -@property (nonatomic, readwrite) BOOL isArchived; - -+ (id)logFileWithPath:(NSString *)filePath; - -- (id)initWithFilePath:(NSString *)filePath; - -- (void)reset; -- (void)renameFile:(NSString *)newFileName; - -#if TARGET_IPHONE_SIMULATOR - -// So here's the situation. -// Extended attributes are perfect for what we're trying to do here (marking files as archived). -// This is exactly what extended attributes were designed for. -// -// But Apple screws us over on the simulator. -// Everytime you build-and-go, they copy the application into a new folder on the hard drive, -// and as part of the process they strip extended attributes from our log files. -// Normally, a copy of a file preserves extended attributes. -// So obviously Apple has gone to great lengths to piss us off. -// -// Thus we use a slightly different tactic for marking log files as archived in the simulator. -// That way it "just works" and there's no confusion when testing. -// -// The difference in method names is indicative of the difference in functionality. -// On the simulator we add an attribute by appending a filename extension. -// -// For example: -// log-ABC123.txt -> log-ABC123.archived.txt - -- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName; - -- (void)addExtensionAttributeWithName:(NSString *)attrName; -- (void)removeExtensionAttributeWithName:(NSString *)attrName; - -#else - -// Normal use of extended attributes used everywhere else, -// such as on Macs and on iPhone devices. - -- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName; - -- (void)addExtendedAttributeWithName:(NSString *)attrName; -- (void)removeExtendedAttributeWithName:(NSString *)attrName; - -#endif - -- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another; -- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another; - -@end diff --git a/Source/Vendor/Lumberjack/DDFileLogger.m b/Source/Vendor/Lumberjack/DDFileLogger.m deleted file mode 100644 index 40057c704..000000000 --- a/Source/Vendor/Lumberjack/DDFileLogger.m +++ /dev/null @@ -1,1353 +0,0 @@ -#import "DDFileLogger.h" - -#import -#import -#import -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - -// We probably shouldn't be using DDLog() statements within the DDLog implementation. -// But we still want to leave our log statements for any future debugging, -// and to allow other developers to trace the implementation (which is a great learning tool). -// -// So we use primitive logging macros around DDLogWarn. -// We maintain the NS prefix on the macros to be explicit about the fact that we're using DDLogWarn. - -#define LOG_LEVEL 2 - -#define DDLogWarnError(frmt, ...) do{ if(LOG_LEVEL >= 1) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnWarn(frmt, ...) do{ if(LOG_LEVEL >= 2) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnInfo(frmt, ...) do{ if(LOG_LEVEL >= 3) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnVerbose(frmt, ...) do{ if(LOG_LEVEL >= 4) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) - -@interface DDLogFileManagerDefault (PrivateAPI) - -- (void)deleteOldLogFiles; -- (NSString *)defaultLogsDirectory; - -@end - -@interface DDFileLogger (PrivateAPI) - -- (void)rollLogFileNow; -- (void)maybeRollLogFileDueToAge; -- (void)maybeRollLogFileDueToSize; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDLogFileManagerDefault - -@synthesize maximumNumberOfLogFiles; - -- (id)init -{ - return [self initWithLogsDirectory:nil]; -} - -- (id)initWithLogsDirectory:(NSString *)aLogsDirectory -{ - if ((self = [super init])) - { - maximumNumberOfLogFiles = DEFAULT_LOG_MAX_NUM_LOG_FILES; - - if (aLogsDirectory) - _logsDirectory = [aLogsDirectory copy]; - else - _logsDirectory = [[self defaultLogsDirectory] copy]; - - NSKeyValueObservingOptions kvoOptions = NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew; - - [self addObserver:self forKeyPath:@"maximumNumberOfLogFiles" options:kvoOptions context:nil]; - - DDLogWarnVerbose(@"DDFileLogManagerDefault: logsDirectory:\n%@", [self logsDirectory]); - DDLogWarnVerbose(@"DDFileLogManagerDefault: sortedLogFileNames:\n%@", [self sortedLogFileNames]); - } - return self; -} - -- (void)dealloc -{ - [self removeObserver:self forKeyPath:@"maximumNumberOfLogFiles"]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Configuration -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)observeValueForKeyPath:(NSString *)keyPath - ofObject:(id)object - change:(NSDictionary *)change - context:(void *)context -{ - NSNumber *old = [change objectForKey:NSKeyValueChangeOldKey]; - NSNumber *new = [change objectForKey:NSKeyValueChangeNewKey]; - - if ([old isEqual:new]) - { - // No change in value - don't bother with any processing. - return; - } - - if ([keyPath isEqualToString:@"maximumNumberOfLogFiles"]) - { - DDLogWarnInfo(@"DDFileLogManagerDefault: Responding to configuration change: maximumNumberOfLogFiles"); - - dispatch_async([DDLog loggingQueue], ^{ @autoreleasepool { - - [self deleteOldLogFiles]; - }}); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark File Deleting -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Deletes archived log files that exceed the maximumNumberOfLogFiles configuration value. -**/ -- (void)deleteOldLogFiles -{ - DDLogWarnVerbose(@"DDLogFileManagerDefault: deleteOldLogFiles"); - - NSUInteger maxNumLogFiles = self.maximumNumberOfLogFiles; - if (maxNumLogFiles == 0) - { - // Unlimited - don't delete any log files - return; - } - - NSArray *sortedLogFileInfos = [self sortedLogFileInfos]; - - // Do we consider the first file? - // We are only supposed to be deleting archived files. - // In most cases, the first file is likely the log file that is currently being written to. - // So in most cases, we do not want to consider this file for deletion. - - NSUInteger count = [sortedLogFileInfos count]; - BOOL excludeFirstFile = NO; - - if (count > 0) - { - DDLogFileInfo *logFileInfo = [sortedLogFileInfos objectAtIndex:0]; - - if (!logFileInfo.isArchived) - { - excludeFirstFile = YES; - } - } - - NSArray *sortedArchivedLogFileInfos; - if (excludeFirstFile) - { - count--; - sortedArchivedLogFileInfos = [sortedLogFileInfos subarrayWithRange:NSMakeRange(1, count)]; - } - else - { - sortedArchivedLogFileInfos = sortedLogFileInfos; - } - - NSUInteger i; - for (i = maxNumLogFiles; i < count; i++) - { - DDLogFileInfo *logFileInfo = [sortedArchivedLogFileInfos objectAtIndex:i]; - - DDLogWarnInfo(@"DDLogFileManagerDefault: Deleting file: %@", logFileInfo.fileName); - - [[NSFileManager defaultManager] removeItemAtPath:logFileInfo.filePath error:nil]; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Log Files -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Returns the path to the default logs directory. - * If the logs directory doesn't exist, this method automatically creates it. -**/ -- (NSString *)defaultLogsDirectory -{ -#if TARGET_OS_IPHONE - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); - NSString *baseDir = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; - NSString *logsDirectory = [baseDir stringByAppendingPathComponent:@"Logs"]; - -#else - NSString *appName = [[NSProcessInfo processInfo] processName]; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); - NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory(); - NSString *logsDirectory = [[basePath stringByAppendingPathComponent:@"Logs"] stringByAppendingPathComponent:appName]; - -#endif - - return logsDirectory; -} - -- (NSString *)logsDirectory -{ - // We could do this check once, during initalization, and not bother again. - // But this way the code continues to work if the directory gets deleted while the code is running. - - if (![[NSFileManager defaultManager] fileExistsAtPath:_logsDirectory]) - { - NSError *err = nil; - if (![[NSFileManager defaultManager] createDirectoryAtPath:_logsDirectory - withIntermediateDirectories:YES attributes:nil error:&err]) - { - DDLogWarnError(@"DDFileLogManagerDefault: Error creating logsDirectory: %@", err); - } - } - - return _logsDirectory; -} - -- (BOOL)isLogFile:(NSString *)fileName -{ - // A log file has a name like "log-.txt", where is a HEX-string of 6 characters. - // - // For example: log-DFFE99.txt - - BOOL hasProperPrefix = [fileName hasPrefix:@"log-"]; - - BOOL hasProperLength = [fileName length] >= 10; - - - if (hasProperPrefix && hasProperLength) - { - NSCharacterSet *hexSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789ABCDEF"]; - - NSString *hex = [fileName substringWithRange:NSMakeRange(4, 6)]; - NSString *nohex = [hex stringByTrimmingCharactersInSet:hexSet]; - - if ([nohex length] == 0) - { - return YES; - } - } - - return NO; -} - -/** - * Returns an array of NSString objects, - * each of which is the filePath to an existing log file on disk. -**/ -- (NSArray *)unsortedLogFilePaths -{ - NSString *logsDirectory = [self logsDirectory]; - NSArray *fileNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:logsDirectory error:nil]; - - NSMutableArray *unsortedLogFilePaths = [NSMutableArray arrayWithCapacity:[fileNames count]]; - - for (NSString *fileName in fileNames) - { - // Filter out any files that aren't log files. (Just for extra safety) - - if ([self isLogFile:fileName]) - { - NSString *filePath = [logsDirectory stringByAppendingPathComponent:fileName]; - - [unsortedLogFilePaths addObject:filePath]; - } - } - - return unsortedLogFilePaths; -} - -/** - * Returns an array of NSString objects, - * each of which is the fileName of an existing log file on disk. -**/ -- (NSArray *)unsortedLogFileNames -{ - NSArray *unsortedLogFilePaths = [self unsortedLogFilePaths]; - - NSMutableArray *unsortedLogFileNames = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]]; - - for (NSString *filePath in unsortedLogFilePaths) - { - [unsortedLogFileNames addObject:[filePath lastPathComponent]]; - } - - return unsortedLogFileNames; -} - -/** - * Returns an array of DDLogFileInfo objects, - * each representing an existing log file on disk, - * and containing important information about the log file such as it's modification date and size. -**/ -- (NSArray *)unsortedLogFileInfos -{ - NSArray *unsortedLogFilePaths = [self unsortedLogFilePaths]; - - NSMutableArray *unsortedLogFileInfos = [NSMutableArray arrayWithCapacity:[unsortedLogFilePaths count]]; - - for (NSString *filePath in unsortedLogFilePaths) - { - DDLogFileInfo *logFileInfo = [[DDLogFileInfo alloc] initWithFilePath:filePath]; - - [unsortedLogFileInfos addObject:logFileInfo]; - } - - return unsortedLogFileInfos; -} - -/** - * Just like the unsortedLogFilePaths method, but sorts the array. - * The items in the array are sorted by modification date. - * The first item in the array will be the most recently modified log file. -**/ -- (NSArray *)sortedLogFilePaths -{ - NSArray *sortedLogFileInfos = [self sortedLogFileInfos]; - - NSMutableArray *sortedLogFilePaths = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]]; - - for (DDLogFileInfo *logFileInfo in sortedLogFileInfos) - { - [sortedLogFilePaths addObject:[logFileInfo filePath]]; - } - - return sortedLogFilePaths; -} - -/** - * Just like the unsortedLogFileNames method, but sorts the array. - * The items in the array are sorted by modification date. - * The first item in the array will be the most recently modified log file. -**/ -- (NSArray *)sortedLogFileNames -{ - NSArray *sortedLogFileInfos = [self sortedLogFileInfos]; - - NSMutableArray *sortedLogFileNames = [NSMutableArray arrayWithCapacity:[sortedLogFileInfos count]]; - - for (DDLogFileInfo *logFileInfo in sortedLogFileInfos) - { - [sortedLogFileNames addObject:[logFileInfo fileName]]; - } - - return sortedLogFileNames; -} - -/** - * Just like the unsortedLogFileInfos method, but sorts the array. - * The items in the array are sorted by modification date. - * The first item in the array will be the most recently modified log file. -**/ -- (NSArray *)sortedLogFileInfos -{ - return [[self unsortedLogFileInfos] sortedArrayUsingSelector:@selector(reverseCompareByCreationDate:)]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Creation -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Generates a short UUID suitable for use in the log file's name. - * The result will have six characters, all in the hexadecimal set [0123456789ABCDEF]. -**/ -- (NSString *)generateShortUUID -{ - CFUUIDRef uuid = CFUUIDCreate(NULL); - - CFStringRef fullStr = CFUUIDCreateString(NULL, uuid); - NSString *result = (__bridge_transfer NSString *)CFStringCreateWithSubstring(NULL, fullStr, CFRangeMake(0, 6)); - - CFRelease(fullStr); - CFRelease(uuid); - - return result; -} - -/** - * Generates a new unique log file path, and creates the corresponding log file. -**/ -- (NSString *)createNewLogFile -{ - // Generate a random log file name, and create the file (if there isn't a collision) - - NSString *logsDirectory = [self logsDirectory]; - do - { - NSString *fileName = [NSString stringWithFormat:@"log-%@.txt", [self generateShortUUID]]; - - NSString *filePath = [logsDirectory stringByAppendingPathComponent:fileName]; - - if (![[NSFileManager defaultManager] fileExistsAtPath:filePath]) - { - DDLogWarnVerbose(@"DDLogFileManagerDefault: Creating new log file: %@", fileName); - - [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil]; - - // Since we just created a new log file, we may need to delete some old log files - [self deleteOldLogFiles]; - - return filePath; - } - - } while(YES); -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDLogFileFormatterDefault - -- (id)init -{ - return [self initWithDateFormatter:nil]; -} - -- (id)initWithDateFormatter:(NSDateFormatter *)aDateFormatter -{ - if ((self = [super init])) - { - if (aDateFormatter) - { - dateFormatter = aDateFormatter; - } - else - { - dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; // 10.4+ style - [dateFormatter setDateFormat:@"yyyy/MM/dd HH:mm:ss:SSS"]; - } - } - return self; -} - -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage -{ - NSString *dateAndTime = [dateFormatter stringFromDate:(logMessage->timestamp)]; - - return [NSString stringWithFormat:@"%@ %@", dateAndTime, logMessage->logMsg]; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDFileLogger - -- (id)init -{ - DDLogFileManagerDefault *defaultLogFileManager = [[DDLogFileManagerDefault alloc] init]; - - return [self initWithLogFileManager:defaultLogFileManager]; -} - -- (id)initWithLogFileManager:(id )aLogFileManager -{ - if ((self = [super init])) - { - maximumFileSize = DEFAULT_LOG_MAX_FILE_SIZE; - rollingFrequency = DEFAULT_LOG_ROLLING_FREQUENCY; - - logFileManager = aLogFileManager; - - formatter = [[DDLogFileFormatterDefault alloc] init]; - } - return self; -} - -- (void)dealloc -{ - [currentLogFileHandle synchronizeFile]; - [currentLogFileHandle closeFile]; - - if (rollingTimer) - { - dispatch_source_cancel(rollingTimer); - rollingTimer = NULL; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Properties -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@synthesize logFileManager; - -- (unsigned long long)maximumFileSize -{ - __block unsigned long long result; - - dispatch_block_t block = ^{ - result = maximumFileSize; - }; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the maximumFileSize variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, block); - }); - - return result; -} - -- (void)setMaximumFileSize:(unsigned long long)newMaximumFileSize -{ - dispatch_block_t block = ^{ @autoreleasepool { - - maximumFileSize = newMaximumFileSize; - [self maybeRollLogFileDueToSize]; - - }}; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the maximumFileSize variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); -} - -- (NSTimeInterval)rollingFrequency -{ - __block NSTimeInterval result; - - dispatch_block_t block = ^{ - result = rollingFrequency; - }; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation should access the rollingFrequency variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, block); - }); - - return result; -} - -- (void)setRollingFrequency:(NSTimeInterval)newRollingFrequency -{ - dispatch_block_t block = ^{ @autoreleasepool { - - rollingFrequency = newRollingFrequency; - [self maybeRollLogFileDueToAge]; - }}; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation should access the rollingFrequency variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark File Rolling -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)scheduleTimerToRollLogFileDueToAge -{ - if (rollingTimer) - { - dispatch_source_cancel(rollingTimer); - rollingTimer = NULL; - } - - if (currentLogFileInfo == nil || rollingFrequency <= 0.0) - { - return; - } - - NSDate *logFileCreationDate = [currentLogFileInfo creationDate]; - - NSTimeInterval ti = [logFileCreationDate timeIntervalSinceReferenceDate]; - ti += rollingFrequency; - - NSDate *logFileRollingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:ti]; - - DDLogWarnVerbose(@"DDFileLogger: scheduleTimerToRollLogFileDueToAge"); - - DDLogWarnVerbose(@"DDFileLogger: logFileCreationDate: %@", logFileCreationDate); - DDLogWarnVerbose(@"DDFileLogger: logFileRollingDate : %@", logFileRollingDate); - - rollingTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, loggerQueue); - - dispatch_source_set_event_handler(rollingTimer, ^{ @autoreleasepool { - - [self maybeRollLogFileDueToAge]; - - }}); - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theRollingTimer = rollingTimer; - dispatch_source_set_cancel_handler(rollingTimer, ^{ - dispatch_release(theRollingTimer); - }); - #endif - - uint64_t delay = (uint64_t)([logFileRollingDate timeIntervalSinceNow] * NSEC_PER_SEC); - dispatch_time_t fireTime = dispatch_time(DISPATCH_TIME_NOW, delay); - - dispatch_source_set_timer(rollingTimer, fireTime, DISPATCH_TIME_FOREVER, 1.0); - dispatch_resume(rollingTimer); -} - -- (void)rollLogFile -{ - // This method is public. - // We need to execute the rolling on our logging thread/queue. - - dispatch_block_t block = ^{ @autoreleasepool { - - [self rollLogFileNow]; - }}; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)rollLogFileNow -{ - DDLogWarnVerbose(@"DDFileLogger: rollLogFileNow"); - - - if (currentLogFileHandle == nil) return; - - [currentLogFileHandle synchronizeFile]; - [currentLogFileHandle closeFile]; - currentLogFileHandle = nil; - - currentLogFileInfo.isArchived = YES; - - if ([logFileManager respondsToSelector:@selector(didRollAndArchiveLogFile:)]) - { - [logFileManager didRollAndArchiveLogFile:(currentLogFileInfo.filePath)]; - } - - currentLogFileInfo = nil; - - if (rollingTimer) - { - dispatch_source_cancel(rollingTimer); - rollingTimer = NULL; - } -} - -- (void)maybeRollLogFileDueToAge -{ - if (rollingFrequency > 0.0 && currentLogFileInfo.age >= rollingFrequency) - { - DDLogWarnVerbose(@"DDFileLogger: Rolling log file due to age..."); - - [self rollLogFileNow]; - } - else - { - [self scheduleTimerToRollLogFileDueToAge]; - } -} - -- (void)maybeRollLogFileDueToSize -{ - // This method is called from logMessage. - // Keep it FAST. - - // Note: Use direct access to maximumFileSize variable. - // We specifically wrote our own getter/setter method to allow us to do this (for performance reasons). - - if (maximumFileSize > 0) - { - unsigned long long fileSize = [currentLogFileHandle offsetInFile]; - - if (fileSize >= maximumFileSize) - { - DDLogWarnVerbose(@"DDFileLogger: Rolling log file due to size (%qu)...", fileSize); - - [self rollLogFileNow]; - } - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark File Logging -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Returns the log file that should be used. - * If there is an existing log file that is suitable, - * within the constraints of maximumFileSize and rollingFrequency, then it is returned. - * - * Otherwise a new file is created and returned. -**/ -- (DDLogFileInfo *)currentLogFileInfo -{ - if (currentLogFileInfo == nil) - { - NSArray *sortedLogFileInfos = [logFileManager sortedLogFileInfos]; - - if ([sortedLogFileInfos count] > 0) - { - DDLogFileInfo *mostRecentLogFileInfo = [sortedLogFileInfos objectAtIndex:0]; - - BOOL useExistingLogFile = YES; - BOOL shouldArchiveMostRecent = NO; - - if (mostRecentLogFileInfo.isArchived) - { - useExistingLogFile = NO; - shouldArchiveMostRecent = NO; - } - else if (maximumFileSize > 0 && mostRecentLogFileInfo.fileSize >= maximumFileSize) - { - useExistingLogFile = NO; - shouldArchiveMostRecent = YES; - } - else if (rollingFrequency > 0.0 && mostRecentLogFileInfo.age >= rollingFrequency) - { - useExistingLogFile = NO; - shouldArchiveMostRecent = YES; - } - - if (useExistingLogFile) - { - DDLogWarnVerbose(@"DDFileLogger: Resuming logging with file %@", mostRecentLogFileInfo.fileName); - - currentLogFileInfo = mostRecentLogFileInfo; - } - else - { - if (shouldArchiveMostRecent) - { - mostRecentLogFileInfo.isArchived = YES; - - if ([logFileManager respondsToSelector:@selector(didArchiveLogFile:)]) - { - [logFileManager didArchiveLogFile:(mostRecentLogFileInfo.filePath)]; - } - } - } - } - - if (currentLogFileInfo == nil) - { - NSString *currentLogFilePath = [logFileManager createNewLogFile]; - - currentLogFileInfo = [[DDLogFileInfo alloc] initWithFilePath:currentLogFilePath]; - } - } - - return currentLogFileInfo; -} - -- (NSFileHandle *)currentLogFileHandle -{ - if (currentLogFileHandle == nil) - { - NSString *logFilePath = [[self currentLogFileInfo] filePath]; - - currentLogFileHandle = [NSFileHandle fileHandleForWritingAtPath:logFilePath]; - [currentLogFileHandle seekToEndOfFile]; - - if (currentLogFileHandle) - { - [self scheduleTimerToRollLogFileDueToAge]; - } - } - - return currentLogFileHandle; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark DDLogger Protocol -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)logMessage:(DDLogMessage *)logMessage -{ - NSString *logMsg = logMessage->logMsg; - - if (formatter) - { - logMsg = [formatter formatLogMessage:logMessage]; - } - - if (logMsg) - { - if (![logMsg hasSuffix:@"\n"]) - { - logMsg = [logMsg stringByAppendingString:@"\n"]; - } - - NSData *logData = [logMsg dataUsingEncoding:NSUTF8StringEncoding]; - - [[self currentLogFileHandle] writeData:logData]; - - [self maybeRollLogFileDueToSize]; - } -} - -- (void)willRemoveLogger -{ - // If you override me be sure to invoke [super willRemoveLogger]; - - [self rollLogFileNow]; -} - -- (NSString *)loggerName -{ - return @"cocoa.lumberjack.fileLogger"; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if TARGET_IPHONE_SIMULATOR - #define XATTR_ARCHIVED_NAME @"archived" -#else - #define XATTR_ARCHIVED_NAME @"lumberjack.log.archived" -#endif - -@implementation DDLogFileInfo - -@synthesize filePath; - -@dynamic fileName; -@dynamic fileAttributes; -@dynamic creationDate; -@dynamic modificationDate; -@dynamic fileSize; -@dynamic age; - -@dynamic isArchived; - - -#pragma mark Lifecycle - -+ (id)logFileWithPath:(NSString *)aFilePath -{ - return [[DDLogFileInfo alloc] initWithFilePath:aFilePath]; -} - -- (id)initWithFilePath:(NSString *)aFilePath -{ - if ((self = [super init])) - { - filePath = [aFilePath copy]; - } - return self; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Standard Info -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (NSDictionary *)fileAttributes -{ - if (fileAttributes == nil) - { - fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil]; - } - return fileAttributes; -} - -- (NSString *)fileName -{ - if (fileName == nil) - { - fileName = [filePath lastPathComponent]; - } - return fileName; -} - -- (NSDate *)modificationDate -{ - if (modificationDate == nil) - { - modificationDate = [[self fileAttributes] objectForKey:NSFileModificationDate]; - } - - return modificationDate; -} - -- (NSDate *)creationDate -{ - if (creationDate == nil) - { - - #if TARGET_OS_IPHONE - - const char *path = [filePath UTF8String]; - - struct attrlist attrList; - memset(&attrList, 0, sizeof(attrList)); - attrList.bitmapcount = ATTR_BIT_MAP_COUNT; - attrList.commonattr = ATTR_CMN_CRTIME; - - struct { - u_int32_t attrBufferSizeInBytes; - struct timespec crtime; - } attrBuffer; - - int result = getattrlist(path, &attrList, &attrBuffer, sizeof(attrBuffer), 0); - if (result == 0) - { - double seconds = (double)(attrBuffer.crtime.tv_sec); - double nanos = (double)(attrBuffer.crtime.tv_nsec); - - NSTimeInterval ti = seconds + (nanos / 1000000000.0); - - creationDate = [NSDate dateWithTimeIntervalSince1970:ti]; - } - else - { - DDLogWarnError(@"DDLogFileInfo: creationDate(%@): getattrlist result = %i", self.fileName, result); - } - - #else - - creationDate = [[self fileAttributes] objectForKey:NSFileCreationDate]; - - #endif - - } - return creationDate; -} - -- (unsigned long long)fileSize -{ - if (fileSize == 0) - { - fileSize = [[[self fileAttributes] objectForKey:NSFileSize] unsignedLongLongValue]; - } - - return fileSize; -} - -- (NSTimeInterval)age -{ - return [[self creationDate] timeIntervalSinceNow] * -1.0; -} - -- (NSString *)description -{ - return [@{@"filePath": self.filePath, - @"fileName": self.fileName, - @"fileAttributes": self.fileAttributes, - @"creationDate": self.creationDate, - @"modificationDate": self.modificationDate, - @"fileSize": @(self.fileSize), - @"age": @(self.age), - @"isArchived": @(self.isArchived)} description]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Archiving -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)isArchived -{ - -#if TARGET_IPHONE_SIMULATOR - - // Extended attributes don't work properly on the simulator. - // So we have to use a less attractive alternative. - // See full explanation in the header file. - - return [self hasExtensionAttributeWithName:XATTR_ARCHIVED_NAME]; - -#else - - return [self hasExtendedAttributeWithName:XATTR_ARCHIVED_NAME]; - -#endif -} - -- (void)setIsArchived:(BOOL)flag -{ - -#if TARGET_IPHONE_SIMULATOR - - // Extended attributes don't work properly on the simulator. - // So we have to use a less attractive alternative. - // See full explanation in the header file. - - if (flag) - [self addExtensionAttributeWithName:XATTR_ARCHIVED_NAME]; - else - [self removeExtensionAttributeWithName:XATTR_ARCHIVED_NAME]; - -#else - - if (flag) - [self addExtendedAttributeWithName:XATTR_ARCHIVED_NAME]; - else - [self removeExtendedAttributeWithName:XATTR_ARCHIVED_NAME]; - -#endif -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Changes -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)reset -{ - fileName = nil; - fileAttributes = nil; - creationDate = nil; - modificationDate = nil; -} - -- (void)renameFile:(NSString *)newFileName -{ - // This method is only used on the iPhone simulator, where normal extended attributes are broken. - // See full explanation in the header file. - - if (![newFileName isEqualToString:[self fileName]]) - { - NSString *fileDir = [filePath stringByDeletingLastPathComponent]; - - NSString *newFilePath = [fileDir stringByAppendingPathComponent:newFileName]; - - DDLogWarnVerbose(@"DDLogFileInfo: Renaming file: '%@' -> '%@'", self.fileName, newFileName); - - NSError *error = nil; - if (![[NSFileManager defaultManager] moveItemAtPath:filePath toPath:newFilePath error:&error]) - { - DDLogWarnError(@"DDLogFileInfo: Error renaming file (%@): %@", self.fileName, error); - } - - filePath = newFilePath; - [self reset]; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Attribute Management -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if TARGET_IPHONE_SIMULATOR - -// Extended attributes don't work properly on the simulator. -// So we have to use a less attractive alternative. -// See full explanation in the header file. - -- (BOOL)hasExtensionAttributeWithName:(NSString *)attrName -{ - // This method is only used on the iPhone simulator, where normal extended attributes are broken. - // See full explanation in the header file. - - // Split the file name into components. - // - // log-ABC123.archived.uploaded.txt - // - // 0. log-ABC123 - // 1. archived - // 2. uploaded - // 3. txt - // - // So we want to search for the attrName in the components (ignoring the first and last array indexes). - - NSArray *components = [[self fileName] componentsSeparatedByString:@"."]; - - // Watch out for file names without an extension - - NSUInteger count = [components count]; - NSUInteger max = (count >= 2) ? count-1 : count; - - NSUInteger i; - for (i = 1; i < max; i++) - { - NSString *attr = [components objectAtIndex:i]; - - if ([attrName isEqualToString:attr]) - { - return YES; - } - } - - return NO; -} - -- (void)addExtensionAttributeWithName:(NSString *)attrName -{ - // This method is only used on the iPhone simulator, where normal extended attributes are broken. - // See full explanation in the header file. - - if ([attrName length] == 0) return; - - // Example: - // attrName = "archived" - // - // "log-ABC123.txt" -> "log-ABC123.archived.txt" - - NSArray *components = [[self fileName] componentsSeparatedByString:@"."]; - - NSUInteger count = [components count]; - - NSUInteger estimatedNewLength = [[self fileName] length] + [attrName length] + 1; - NSMutableString *newFileName = [NSMutableString stringWithCapacity:estimatedNewLength]; - - if (count > 0) - { - [newFileName appendString:[components objectAtIndex:0]]; - } - - NSString *lastExt = @""; - - NSUInteger i; - for (i = 1; i < count; i++) - { - NSString *attr = [components objectAtIndex:i]; - if ([attr length] == 0) - { - continue; - } - - if ([attrName isEqualToString:attr]) - { - // Extension attribute already exists in file name - return; - } - - if ([lastExt length] > 0) - { - [newFileName appendFormat:@".%@", lastExt]; - } - - lastExt = attr; - } - - [newFileName appendFormat:@".%@", attrName]; - - if ([lastExt length] > 0) - { - [newFileName appendFormat:@".%@", lastExt]; - } - - [self renameFile:newFileName]; -} - -- (void)removeExtensionAttributeWithName:(NSString *)attrName -{ - // This method is only used on the iPhone simulator, where normal extended attributes are broken. - // See full explanation in the header file. - - if ([attrName length] == 0) return; - - // Example: - // attrName = "archived" - // - // "log-ABC123.txt" -> "log-ABC123.archived.txt" - - NSArray *components = [[self fileName] componentsSeparatedByString:@"."]; - - NSUInteger count = [components count]; - - NSUInteger estimatedNewLength = [[self fileName] length]; - NSMutableString *newFileName = [NSMutableString stringWithCapacity:estimatedNewLength]; - - if (count > 0) - { - [newFileName appendString:[components objectAtIndex:0]]; - } - - BOOL found = NO; - - NSUInteger i; - for (i = 1; i < count; i++) - { - NSString *attr = [components objectAtIndex:i]; - - if ([attrName isEqualToString:attr]) - { - found = YES; - } - else - { - [newFileName appendFormat:@".%@", attr]; - } - } - - if (found) - { - [self renameFile:newFileName]; - } -} - -#else - -- (BOOL)hasExtendedAttributeWithName:(NSString *)attrName -{ - const char *path = [filePath UTF8String]; - const char *name = [attrName UTF8String]; - - ssize_t result = getxattr(path, name, NULL, 0, 0, 0); - - return (result >= 0); -} - -- (void)addExtendedAttributeWithName:(NSString *)attrName -{ - const char *path = [filePath UTF8String]; - const char *name = [attrName UTF8String]; - - int result = setxattr(path, name, NULL, 0, 0, 0); - - if (result < 0) - { - DDLogWarnError(@"DDLogFileInfo: setxattr(%@, %@): error = %i", attrName, self.fileName, result); - } -} - -- (void)removeExtendedAttributeWithName:(NSString *)attrName -{ - const char *path = [filePath UTF8String]; - const char *name = [attrName UTF8String]; - - int result = removexattr(path, name, 0); - - if (result < 0 && errno != ENOATTR) - { - DDLogWarnError(@"DDLogFileInfo: removexattr(%@, %@): error = %i", attrName, self.fileName, result); - } -} - -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Comparisons -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)isEqual:(id)object -{ - if ([object isKindOfClass:[self class]]) - { - DDLogFileInfo *another = (DDLogFileInfo *)object; - - return [filePath isEqualToString:[another filePath]]; - } - - return NO; -} - -- (NSComparisonResult)reverseCompareByCreationDate:(DDLogFileInfo *)another -{ - NSDate *us = [self creationDate]; - NSDate *them = [another creationDate]; - - NSComparisonResult result = [us compare:them]; - - if (result == NSOrderedAscending) - return NSOrderedDescending; - - if (result == NSOrderedDescending) - return NSOrderedAscending; - - return NSOrderedSame; -} - -- (NSComparisonResult)reverseCompareByModificationDate:(DDLogFileInfo *)another -{ - NSDate *us = [self modificationDate]; - NSDate *them = [another modificationDate]; - - NSComparisonResult result = [us compare:them]; - - if (result == NSOrderedAscending) - return NSOrderedDescending; - - if (result == NSOrderedDescending) - return NSOrderedAscending; - - return NSOrderedSame; -} - -@end diff --git a/Source/Vendor/Lumberjack/DDLog.h b/Source/Vendor/Lumberjack/DDLog.h deleted file mode 100755 index 44879877e..000000000 --- a/Source/Vendor/Lumberjack/DDLog.h +++ /dev/null @@ -1,601 +0,0 @@ -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * Otherwise, here is a quick refresher. - * There are three steps to using the macros: - * - * Step 1: - * Import the header in your implementation file: - * - * #import "DDLog.h" - * - * Step 2: - * Define your logging level in your implementation file: - * - * // Log levels: off, error, warn, info, verbose - * static const int ddLogLevel = LOG_LEVEL_VERBOSE; - * - * Step 3: - * Replace your DDLogWarn statements with DDLog statements according to the severity of the message. - * - * DDLogWarn(@"Fatal error, no dohickey found!"); -> DDLogError(@"Fatal error, no dohickey found!"); - * - * DDLog works exactly the same as DDLogWarn. - * This means you can pass it multiple variables just like DDLogWarn. -**/ - - -@class DDLogMessage; - -@protocol DDLogger; -@protocol DDLogFormatter; - -/** - * This is the single macro that all other macros below compile into. - * This big multiline macro makes all the other macros easier to read. -**/ - -#define LOG_MACRO(isAsynchronous, lvl, flg, ctx, atag, fnct, frmt, ...) \ - [DDLog log:isAsynchronous \ - level:lvl \ - flag:flg \ - context:ctx \ - file:__FILE__ \ - function:fnct \ - line:__LINE__ \ - tag:atag \ - format:(frmt), ##__VA_ARGS__] - -/** - * Define the Objective-C and C versions of the macro. - * These automatically inject the proper function name for either an objective-c method or c function. - * - * We also define shorthand versions for asynchronous and synchronous logging. -**/ - -#define LOG_OBJC_MACRO(async, lvl, flg, ctx, frmt, ...) \ - LOG_MACRO(async, lvl, flg, ctx, nil, sel_getName(_cmd), frmt, ##__VA_ARGS__) - -#define LOG_C_MACRO(async, lvl, flg, ctx, frmt, ...) \ - LOG_MACRO(async, lvl, flg, ctx, nil, __FUNCTION__, frmt, ##__VA_ARGS__) - -#define SYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \ - LOG_OBJC_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define ASYNC_LOG_OBJC_MACRO(lvl, flg, ctx, frmt, ...) \ - LOG_OBJC_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define SYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \ - LOG_C_MACRO( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define ASYNC_LOG_C_MACRO(lvl, flg, ctx, frmt, ...) \ - LOG_C_MACRO(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -/** - * Define version of the macro that only execute if the logLevel is above the threshold. - * The compiled versions essentially look like this: - * - * if (logFlagForThisLogMsg & ddLogLevel) { execute log message } - * - * As shown further below, Lumberjack actually uses a bitmask as opposed to primitive log levels. - * This allows for a great amount of flexibility and some pretty advanced fine grained logging techniques. - * - * Note that when compiler optimizations are enabled (as they are for your release builds), - * the log messages above your logging threshold will automatically be compiled out. - * - * (If the compiler sees ddLogLevel declared as a constant, the compiler simply checks to see if the 'if' statement - * would execute, and if not it strips it from the binary.) - * - * We also define shorthand versions for asynchronous and synchronous logging. -**/ - -#define LOG_MAYBE(async, lvl, flg, ctx, fnct, frmt, ...) \ - do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, nil, fnct, frmt, ##__VA_ARGS__); } while(0) - -#define LOG_OBJC_MAYBE(async, lvl, flg, ctx, frmt, ...) \ - LOG_MAYBE(async, lvl, flg, ctx, sel_getName(_cmd), frmt, ##__VA_ARGS__) - -#define LOG_C_MAYBE(async, lvl, flg, ctx, frmt, ...) \ - LOG_MAYBE(async, lvl, flg, ctx, __FUNCTION__, frmt, ##__VA_ARGS__) - -#define SYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \ - LOG_OBJC_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define ASYNC_LOG_OBJC_MAYBE(lvl, flg, ctx, frmt, ...) \ - LOG_OBJC_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define SYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \ - LOG_C_MAYBE( NO, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -#define ASYNC_LOG_C_MAYBE(lvl, flg, ctx, frmt, ...) \ - LOG_C_MAYBE(YES, lvl, flg, ctx, frmt, ##__VA_ARGS__) - -/** - * Define versions of the macros that also accept tags. - * - * The DDLogMessage object includes a 'tag' ivar that may be used for a variety of purposes. - * It may be used to pass custom information to loggers or formatters. - * Or it may be used by 3rd party extensions to the framework. - * - * Thes macros just make it a little easier to extend logging functionality. -**/ - -#define LOG_OBJC_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \ - LOG_MACRO(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__) - -#define LOG_C_TAG_MACRO(async, lvl, flg, ctx, tag, frmt, ...) \ - LOG_MACRO(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__) - -#define LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, fnct, frmt, ...) \ - do { if(lvl & flg) LOG_MACRO(async, lvl, flg, ctx, tag, fnct, frmt, ##__VA_ARGS__); } while(0) - -#define LOG_OBJC_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \ - LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, sel_getName(_cmd), frmt, ##__VA_ARGS__) - -#define LOG_C_TAG_MAYBE(async, lvl, flg, ctx, tag, frmt, ...) \ - LOG_TAG_MAYBE(async, lvl, flg, ctx, tag, __FUNCTION__, frmt, ##__VA_ARGS__) - -/** - * Define the standard options. - * - * We default to only 4 levels because it makes it easier for beginners - * to make the transition to a logging framework. - * - * More advanced users may choose to completely customize the levels (and level names) to suite their needs. - * For more information on this see the "Custom Log Levels" page: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels - * - * Advanced users may also notice that we're using a bitmask. - * This is to allow for custom fine grained logging: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/FineGrainedLogging - * - * -- Flags -- - * - * Typically you will use the LOG_LEVELS (see below), but the flags may be used directly in certain situations. - * For example, say you have a lot of warning log messages, and you wanted to disable them. - * However, you still needed to see your error and info log messages. - * You could accomplish that with the following: - * - * static const int ddLogLevel = LOG_FLAG_ERROR | LOG_FLAG_INFO; - * - * Flags may also be consulted when writing custom log formatters, - * as the DDLogMessage class captures the individual flag that caused the log message to fire. - * - * -- Levels -- - * - * Log levels are simply the proper bitmask of the flags. - * - * -- Booleans -- - * - * The booleans may be used when your logging code involves more than one line. - * For example: - * - * if (LOG_VERBOSE) { - * for (id sprocket in sprockets) - * DDLogVerbose(@"sprocket: %@", [sprocket description]) - * } - * - * -- Async -- - * - * Defines the default asynchronous options. - * The default philosophy for asynchronous logging is very simple: - * - * Log messages with errors should be executed synchronously. - * After all, an error just occurred. The application could be unstable. - * - * All other log messages, such as debug output, are executed asynchronously. - * After all, if it wasn't an error, then it was just informational output, - * or something the application was easily able to recover from. - * - * -- Changes -- - * - * You are strongly discouraged from modifying this file. - * If you do, you make it more difficult on yourself to merge future bug fixes and improvements from the project. - * Instead, create your own MyLogging.h or ApplicationNameLogging.h or CompanyLogging.h - * - * For an example of customizing your logging experience, see the "Custom Log Levels" page: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomLogLevels -**/ - -#define LOG_FLAG_ERROR (1 << 0) // 0...0001 -#define LOG_FLAG_WARN (1 << 1) // 0...0010 -#define LOG_FLAG_INFO (1 << 2) // 0...0100 -#define LOG_FLAG_VERBOSE (1 << 3) // 0...1000 - -#define LOG_LEVEL_OFF 0 -#define LOG_LEVEL_ERROR (LOG_FLAG_ERROR) // 0...0001 -#define LOG_LEVEL_WARN (LOG_FLAG_ERROR | LOG_FLAG_WARN) // 0...0011 -#define LOG_LEVEL_INFO (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO) // 0...0111 -#define LOG_LEVEL_VERBOSE (LOG_FLAG_ERROR | LOG_FLAG_WARN | LOG_FLAG_INFO | LOG_FLAG_VERBOSE) // 0...1111 - -#define LOG_ERROR (ddLogLevel & LOG_FLAG_ERROR) -#define LOG_WARN (ddLogLevel & LOG_FLAG_WARN) -#define LOG_INFO (ddLogLevel & LOG_FLAG_INFO) -#define LOG_VERBOSE (ddLogLevel & LOG_FLAG_VERBOSE) - -#define LOG_ASYNC_ENABLED YES - -#define LOG_ASYNC_ERROR ( NO && LOG_ASYNC_ENABLED) -#define LOG_ASYNC_WARN (YES && LOG_ASYNC_ENABLED) -#define LOG_ASYNC_INFO (YES && LOG_ASYNC_ENABLED) -#define LOG_ASYNC_VERBOSE (YES && LOG_ASYNC_ENABLED) - -#define DDLogError(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) -#define DDLogWarn(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) -#define DDLogInfo(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) -#define DDLogVerbose(frmt, ...) LOG_OBJC_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) - -#define DDLogCError(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_ERROR, ddLogLevel, LOG_FLAG_ERROR, 0, frmt, ##__VA_ARGS__) -#define DDLogCWarn(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_WARN, ddLogLevel, LOG_FLAG_WARN, 0, frmt, ##__VA_ARGS__) -#define DDLogCInfo(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_INFO, ddLogLevel, LOG_FLAG_INFO, 0, frmt, ##__VA_ARGS__) -#define DDLogCVerbose(frmt, ...) LOG_C_MAYBE(LOG_ASYNC_VERBOSE, ddLogLevel, LOG_FLAG_VERBOSE, 0, frmt, ##__VA_ARGS__) - -/** - * The THIS_FILE macro gives you an NSString of the file name. - * For simplicity and clarity, the file name does not include the full path or file extension. - * - * For example: DDLogWarn(@"%@: Unable to find thingy", THIS_FILE) -> @"MyViewController: Unable to find thingy" -**/ - -NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy); - -#define THIS_FILE (DDExtractFileNameWithoutExtension(__FILE__, NO)) - -/** - * The THIS_METHOD macro gives you the name of the current objective-c method. - * - * For example: DDLogWarn(@"%@ - Requires non-nil strings", THIS_METHOD) -> @"setMake:model: requires non-nil strings" - * - * Note: This does NOT work in straight C functions (non objective-c). - * Instead you should use the predefined __FUNCTION__ macro. -**/ - -#define THIS_METHOD NSStringFromSelector(_cmd) - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@interface DDLog : NSObject - -/** - * Provides access to the underlying logging queue. - * This may be helpful to Logger classes for things like thread synchronization. -**/ - -+ (dispatch_queue_t)loggingQueue; - -/** - * Logging Primitive. - * - * This method is used by the macros above. - * It is suggested you stick with the macros as they're easier to use. -**/ - -+ (void)log:(BOOL)synchronous - level:(int)level - flag:(int)flag - context:(int)context - file:(const char *)file - function:(const char *)function - line:(int)line - tag:(id)tag - format:(NSString *)format, ... __attribute__ ((format (__NSString__, 9, 10))); - -/** - * Logging Primitive. - * - * This method can be used if you have a prepared va_list. -**/ - -+ (void)log:(BOOL)asynchronous - level:(int)level - flag:(int)flag - context:(int)context - file:(const char *)file - function:(const char *)function - line:(int)line - tag:(id)tag - format:(NSString *)format - args:(va_list)argList; - - -/** - * Since logging can be asynchronous, there may be times when you want to flush the logs. - * The framework invokes this automatically when the application quits. -**/ - -+ (void)flushLog; - -/** - * Loggers - * - * If you want your log statements to go somewhere, - * you should create and add a logger. -**/ - -+ (void)addLogger:(id )logger; -+ (void)removeLogger:(id )logger; - -+ (void)removeAllLoggers; - -/** - * Registered Dynamic Logging - * - * These methods allow you to obtain a list of classes that are using registered dynamic logging, - * and also provides methods to get and set their log level during run time. -**/ - -+ (NSArray *)registeredClasses; -+ (NSArray *)registeredClassNames; - -+ (int)logLevelForClass:(Class)aClass; -+ (int)logLevelForClassWithName:(NSString *)aClassName; - -+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass; -+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@protocol DDLogger -@required - -- (void)logMessage:(DDLogMessage *)logMessage; - -/** - * Formatters may optionally be added to any logger. - * - * If no formatter is set, the logger simply logs the message as it is given in logMessage, - * or it may use its own built in formatting style. -**/ -- (id )logFormatter; -- (void)setLogFormatter:(id )formatter; - -@optional - -/** - * Since logging is asynchronous, adding and removing loggers is also asynchronous. - * In other words, the loggers are added and removed at appropriate times with regards to log messages. - * - * - Loggers will not receive log messages that were executed prior to when they were added. - * - Loggers will not receive log messages that were executed after they were removed. - * - * These methods are executed in the logging thread/queue. - * This is the same thread/queue that will execute every logMessage: invocation. - * Loggers may use these methods for thread synchronization or other setup/teardown tasks. -**/ -- (void)didAddLogger; -- (void)willRemoveLogger; - -/** - * Some loggers may buffer IO for optimization purposes. - * For example, a database logger may only save occasionaly as the disk IO is slow. - * In such loggers, this method should be implemented to flush any pending IO. - * - * This allows invocations of DDLog's flushLog method to be propogated to loggers that need it. - * - * Note that DDLog's flushLog method is invoked automatically when the application quits, - * and it may be also invoked manually by the developer prior to application crashes, or other such reasons. -**/ -- (void)flush; - -/** - * Each logger is executed concurrently with respect to the other loggers. - * Thus, a dedicated dispatch queue is used for each logger. - * Logger implementations may optionally choose to provide their own dispatch queue. -**/ -- (dispatch_queue_t)loggerQueue; - -/** - * If the logger implementation does not choose to provide its own queue, - * one will automatically be created for it. - * The created queue will receive its name from this method. - * This may be helpful for debugging or profiling reasons. -**/ -- (NSString *)loggerName; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@protocol DDLogFormatter -@required - -/** - * Formatters may optionally be added to any logger. - * This allows for increased flexibility in the logging environment. - * For example, log messages for log files may be formatted differently than log messages for the console. - * - * For more information about formatters, see the "Custom Formatters" page: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters - * - * The formatter may also optionally filter the log message by returning nil, - * in which case the logger will not log the message. -**/ -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage; - -@optional - -/** - * A single formatter instance can be added to multiple loggers. - * These methods provides hooks to notify the formatter of when it's added/removed. - * - * This is primarily for thread-safety. - * If a formatter is explicitly not thread-safe, it may wish to throw an exception if added to multiple loggers. - * Or if a formatter has potentially thread-unsafe code (e.g. NSDateFormatter), - * it could possibly use these hooks to switch to thread-safe versions of the code. -**/ -- (void)didAddToLogger:(id )logger; -- (void)willRemoveFromLogger:(id )logger; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@protocol DDRegisteredDynamicLogging - -/** - * Implement these methods to allow a file's log level to be managed from a central location. - * - * This is useful if you'd like to be able to change log levels for various parts - * of your code from within the running application. - * - * Imagine pulling up the settings for your application, - * and being able to configure the logging level on a per file basis. - * - * The implementation can be very straight-forward: - * - * + (int)ddLogLevel - * { - * return ddLogLevel; - * } - * - * + (void)ddSetLogLevel:(int)logLevel - * { - * ddLogLevel = logLevel; - * } -**/ - -+ (int)ddLogLevel; -+ (void)ddSetLogLevel:(int)logLevel; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The DDLogMessage class encapsulates information about the log message. - * If you write custom loggers or formatters, you will be dealing with objects of this class. -**/ - -enum { - DDLogMessageCopyFile = 1 << 0, - DDLogMessageCopyFunction = 1 << 1 -}; -typedef int DDLogMessageOptions; - -@interface DDLogMessage : NSObject -{ - -// The public variables below can be accessed directly (for speed). -// For example: logMessage->logLevel - -@public - int logLevel; - int logFlag; - int logContext; - NSString *logMsg; - NSDate *timestamp; - char *file; - char *function; - int lineNumber; - mach_port_t machThreadID; - char *queueLabel; - NSString *threadName; - - // For 3rd party extensions to the framework, where flags and contexts aren't enough. - id tag; - - // For 3rd party extensions that manually create DDLogMessage instances. - DDLogMessageOptions options; -} - -/** - * Standard init method for a log message object. - * Used by the logging primitives. (And the macros use the logging primitives.) - * - * If you find need to manually create logMessage objects, there is one thing you should be aware of: - * - * If no flags are passed, the method expects the file and function parameters to be string literals. - * That is, it expects the given strings to exist for the duration of the object's lifetime, - * and it expects the given strings to be immutable. - * In other words, it does not copy these strings, it simply points to them. - * This is due to the fact that __FILE__ and __FUNCTION__ are usually used to specify these parameters, - * so it makes sense to optimize and skip the unnecessary allocations. - * However, if you need them to be copied you may use the options parameter to specify this. - * Options is a bitmask which supports DDLogMessageCopyFile and DDLogMessageCopyFunction. -**/ -- (id)initWithLogMsg:(NSString *)logMsg - level:(int)logLevel - flag:(int)logFlag - context:(int)logContext - file:(const char *)file - function:(const char *)function - line:(int)line - tag:(id)tag - options:(DDLogMessageOptions)optionsMask; - -/** - * Returns the threadID as it appears in DDLogWarn. - * That is, it is a hexadecimal value which is calculated from the machThreadID. -**/ -- (NSString *)threadID; - -/** - * Convenience property to get just the file name, as the file variable is generally the full file path. - * This method does not include the file extension, which is generally unwanted for logging purposes. -**/ -- (NSString *)fileName; - -/** - * Returns the function variable in NSString form. -**/ -- (NSString *)methodName; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The DDLogger protocol specifies that an optional formatter can be added to a logger. - * Most (but not all) loggers will want to support formatters. - * - * However, writting getters and setters in a thread safe manner, - * while still maintaining maximum speed for the logging process, is a difficult task. - * - * To do it right, the implementation of the getter/setter has strict requiremenets: - * - Must NOT require the logMessage method to acquire a lock. - * - Must NOT require the logMessage method to access an atomic property (also a lock of sorts). - * - * To simplify things, an abstract logger is provided that implements the getter and setter. - * - * Logger implementations may simply extend this class, - * and they can ACCESS THE FORMATTER VARIABLE DIRECTLY from within their logMessage method! -**/ - -@interface DDAbstractLogger : NSObject -{ - id formatter; - - dispatch_queue_t loggerQueue; -} - -- (id )logFormatter; -- (void)setLogFormatter:(id )formatter; - -// For thread-safety assertions -- (BOOL)isOnGlobalLoggingQueue; -- (BOOL)isOnInternalLoggerQueue; - -@end diff --git a/Source/Vendor/Lumberjack/DDLog.m b/Source/Vendor/Lumberjack/DDLog.m deleted file mode 100755 index a9c93b3f6..000000000 --- a/Source/Vendor/Lumberjack/DDLog.m +++ /dev/null @@ -1,1085 +0,0 @@ -#import "DDLog.h" - -#import -#import -#import -#import -#import - - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - -// We probably shouldn't be using DDLog() statements within the DDLog implementation. -// But we still want to leave our log statements for any future debugging, -// and to allow other developers to trace the implementation (which is a great learning tool). -// -// So we use a primitive logging macro around DDLogWarn. -// We maintain the NS prefix on the macros to be explicit about the fact that we're using DDLogWarn. - -#define DD_DEBUG NO - -#define DDLogWarnDebug(frmt, ...) do{ if(DD_DEBUG) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) - -// Specifies the maximum queue size of the logging thread. -// -// Since most logging is asynchronous, its possible for rogue threads to flood the logging queue. -// That is, to issue an abundance of log statements faster than the logging thread can keepup. -// Typically such a scenario occurs when log statements are added haphazardly within large loops, -// but may also be possible if relatively slow loggers are being used. -// -// This property caps the queue size at a given number of outstanding log statements. -// If a thread attempts to issue a log statement when the queue is already maxed out, -// the issuing thread will block until the queue size drops below the max again. - -#define LOG_MAX_QUEUE_SIZE 1000 // Should not exceed INT32_MAX - -// The "global logging queue" refers to [DDLog loggingQueue]. -// It is the queue that all log statements go through. -// -// The logging queue sets a flag via dispatch_queue_set_specific using this key. -// We can check for this key via dispatch_get_specific() to see if we're on the "global logging queue". - -static void *const GlobalLoggingQueueIdentityKey = (void *)&GlobalLoggingQueueIdentityKey; - - -@interface DDLoggerNode : NSObject { -@public - id logger; - dispatch_queue_t loggerQueue; -} - -+ (DDLoggerNode *)nodeWithLogger:(id )logger loggerQueue:(dispatch_queue_t)loggerQueue; - -@end - - -@interface DDLog (PrivateAPI) - -+ (void)lt_addLogger:(id )logger; -+ (void)lt_removeLogger:(id )logger; -+ (void)lt_removeAllLoggers; -+ (void)lt_log:(DDLogMessage *)logMessage; -+ (void)lt_flush; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDLog - -// An array used to manage all the individual loggers. -// The array is only modified on the loggingQueue/loggingThread. -static NSMutableArray *loggers; - -// All logging statements are added to the same queue to ensure FIFO operation. -static dispatch_queue_t loggingQueue; - -// Individual loggers are executed concurrently per log statement. -// Each logger has it's own associated queue, and a dispatch group is used for synchrnoization. -static dispatch_group_t loggingGroup; - -// In order to prevent to queue from growing infinitely large, -// a maximum size is enforced (LOG_MAX_QUEUE_SIZE). -static dispatch_semaphore_t queueSemaphore; - -// Minor optimization for uniprocessor machines -static unsigned int numProcessors; - -/** - * The runtime sends initialize to each class in a program exactly one time just before the class, - * or any class that inherits from it, is sent its first message from within the program. (Thus the - * method may never be invoked if the class is not used.) The runtime sends the initialize message to - * classes in a thread-safe manner. Superclasses receive this message before their subclasses. - * - * This method may also be called directly (assumably by accident), hence the safety mechanism. -**/ -+ (void)initialize -{ - static BOOL initialized = NO; - if (!initialized) - { - initialized = YES; - - loggers = [[NSMutableArray alloc] initWithCapacity:4]; - - DDLogWarnDebug(@"DDLog: Using grand central dispatch"); - - loggingQueue = dispatch_queue_create("cocoa.lumberjack", NULL); - loggingGroup = dispatch_group_create(); - - void *nonNullValue = GlobalLoggingQueueIdentityKey; // Whatever, just not null - dispatch_queue_set_specific(loggingQueue, GlobalLoggingQueueIdentityKey, nonNullValue, NULL); - - queueSemaphore = dispatch_semaphore_create(LOG_MAX_QUEUE_SIZE); - - // Figure out how many processors are available. - // This may be used later for an optimization on uniprocessor machines. - - host_basic_info_data_t hostInfo; - mach_msg_type_number_t infoCount; - - infoCount = HOST_BASIC_INFO_COUNT; - host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); - - unsigned int result = (unsigned int)(hostInfo.max_cpus); - unsigned int one = (unsigned int)(1); - - numProcessors = MAX(result, one); - - DDLogWarnDebug(@"DDLog: numProcessors = %u", numProcessors); - - - #if TARGET_OS_IPHONE - NSString *notificationName = @"UIApplicationWillTerminateNotification"; - #else - NSString *notificationName = @"NSApplicationWillTerminateNotification"; - #endif - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(applicationWillTerminate:) - name:notificationName - object:nil]; - } -} - -/** - * Provides access to the logging queue. -**/ -+ (dispatch_queue_t)loggingQueue -{ - return loggingQueue; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Notifications -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (void)applicationWillTerminate:(NSNotification *)notification -{ - [self flushLog]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Logger Management -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (void)addLogger:(id )logger -{ - if (logger == nil) return; - - dispatch_async(loggingQueue, ^{ @autoreleasepool { - - [self lt_addLogger:logger]; - }}); -} - -+ (void)removeLogger:(id )logger -{ - if (logger == nil) return; - - dispatch_async(loggingQueue, ^{ @autoreleasepool { - - [self lt_removeLogger:logger]; - }}); -} - -+ (void)removeAllLoggers -{ - dispatch_async(loggingQueue, ^{ @autoreleasepool { - - [self lt_removeAllLoggers]; - }}); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Master Logging -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (void)queueLogMessage:(DDLogMessage *)logMessage asynchronously:(BOOL)asyncFlag -{ - // We have a tricky situation here... - // - // In the common case, when the queueSize is below the maximumQueueSize, - // we want to simply enqueue the logMessage. And we want to do this as fast as possible, - // which means we don't want to block and we don't want to use any locks. - // - // However, if the queueSize gets too big, we want to block. - // But we have very strict requirements as to when we block, and how long we block. - // - // The following example should help illustrate our requirements: - // - // Imagine that the maximum queue size is configured to be 5, - // and that there are already 5 log messages queued. - // Let us call these 5 queued log messages A, B, C, D, and E. (A is next to be executed) - // - // Now if our thread issues a log statement (let us call the log message F), - // it should block before the message is added to the queue. - // Furthermore, it should be unblocked immediately after A has been unqueued. - // - // The requirements are strict in this manner so that we block only as long as necessary, - // and so that blocked threads are unblocked in the order in which they were blocked. - // - // Returning to our previous example, let us assume that log messages A through E are still queued. - // Our aforementioned thread is blocked attempting to queue log message F. - // Now assume we have another separate thread that attempts to issue log message G. - // It should block until log messages A and B have been unqueued. - - - // We are using a counting semaphore provided by GCD. - // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value. - // Everytime we want to queue a log message we decrement this value. - // If the resulting value is less than zero, - // the semaphore function waits in FIFO order for a signal to occur before returning. - // - // A dispatch semaphore is an efficient implementation of a traditional counting semaphore. - // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked. - // If the calling semaphore does not need to block, no kernel call is made. - - dispatch_semaphore_wait(queueSemaphore, DISPATCH_TIME_FOREVER); - - // We've now sure we won't overflow the queue. - // It is time to queue our log message. - - dispatch_block_t logBlock = ^{ @autoreleasepool { - - [self lt_log:logMessage]; - }}; - - if (asyncFlag) - dispatch_async(loggingQueue, logBlock); - else - dispatch_sync(loggingQueue, logBlock); -} - -+ (void)log:(BOOL)asynchronous - level:(int)level - flag:(int)flag - context:(int)context - file:(const char *)file - function:(const char *)function - line:(int)line - tag:(id)tag - format:(NSString *)format, ... -{ - va_list args; - if (format) - { - va_start(args, format); - - NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args]; - DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg - level:level - flag:flag - context:context - file:file - function:function - line:line - tag:tag - options:0]; - - [self queueLogMessage:logMessage asynchronously:asynchronous]; - - va_end(args); - } -} - -+ (void)log:(BOOL)asynchronous - level:(int)level - flag:(int)flag - context:(int)context - file:(const char *)file - function:(const char *)function - line:(int)line - tag:(id)tag - format:(NSString *)format - args:(va_list)args -{ - if (format) - { - NSString *logMsg = [[NSString alloc] initWithFormat:format arguments:args]; - DDLogMessage *logMessage = [[DDLogMessage alloc] initWithLogMsg:logMsg - level:level - flag:flag - context:context - file:file - function:function - line:line - tag:tag - options:0]; - - [self queueLogMessage:logMessage asynchronously:asynchronous]; - } -} - -+ (void)flushLog -{ - dispatch_sync(loggingQueue, ^{ @autoreleasepool { - - [self lt_flush]; - }}); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Registered Dynamic Logging -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (BOOL)isRegisteredClass:(Class)class -{ - SEL getterSel = @selector(ddLogLevel); - SEL setterSel = @selector(ddSetLogLevel:); - -#if TARGET_OS_IPHONE && !TARGET_IPHONE_SIMULATOR - - // Issue #6 (GoogleCode) - Crashes on iOS 4.2.1 and iPhone 4 - // - // Crash caused by class_getClassMethod(2). - // - // "It's a bug with UIAccessibilitySafeCategory__NSObject so it didn't pop up until - // users had VoiceOver enabled [...]. I was able to work around it by searching the - // result of class_copyMethodList() instead of calling class_getClassMethod()" - - BOOL result = NO; - - unsigned int methodCount, i; - Method *methodList = class_copyMethodList(object_getClass(class), &methodCount); - - if (methodList != NULL) - { - BOOL getterFound = NO; - BOOL setterFound = NO; - - for (i = 0; i < methodCount; ++i) - { - SEL currentSel = method_getName(methodList[i]); - - if (currentSel == getterSel) - { - getterFound = YES; - } - else if (currentSel == setterSel) - { - setterFound = YES; - } - - if (getterFound && setterFound) - { - result = YES; - break; - } - } - - free(methodList); - } - - return result; - -#else - - // Issue #24 (GitHub) - Crashing in in ARC+Simulator - // - // The method +[DDLog isRegisteredClass] will crash a project when using it with ARC + Simulator. - // For running in the Simulator, it needs to execute the non-iOS code. - - Method getter = class_getClassMethod(class, getterSel); - Method setter = class_getClassMethod(class, setterSel); - - if ((getter != NULL) && (setter != NULL)) - { - return YES; - } - - return NO; - -#endif -} - -+ (NSArray *)registeredClasses -{ - int numClasses, i; - - // We're going to get the list of all registered classes. - // The Objective-C runtime library automatically registers all the classes defined in your source code. - // - // To do this we use the following method (documented in the Objective-C Runtime Reference): - // - // int objc_getClassList(Class *buffer, int bufferLen) - // - // We can pass (NULL, 0) to obtain the total number of - // registered class definitions without actually retrieving any class definitions. - // This allows us to allocate the minimum amount of memory needed for the application. - - numClasses = objc_getClassList(NULL, 0); - - // The numClasses method now tells us how many classes we have. - // So we can allocate our buffer, and get pointers to all the class definitions. - - Class *classes = (Class *)malloc(sizeof(Class) * numClasses); - if (classes == NULL) return nil; - - numClasses = objc_getClassList(classes, numClasses); - - // We can now loop through the classes, and test each one to see if it is a DDLogging class. - - NSMutableArray *result = [NSMutableArray arrayWithCapacity:numClasses]; - - for (i = 0; i < numClasses; i++) - { - Class class = classes[i]; - - if ([self isRegisteredClass:class]) - { - [result addObject:class]; - } - } - - free(classes); - - return result; -} - -+ (NSArray *)registeredClassNames -{ - NSArray *registeredClasses = [self registeredClasses]; - NSMutableArray *result = [NSMutableArray arrayWithCapacity:[registeredClasses count]]; - - for (Class class in registeredClasses) - { - [result addObject:NSStringFromClass(class)]; - } - - return result; -} - -+ (int)logLevelForClass:(Class)aClass -{ - if ([self isRegisteredClass:aClass]) - { - return [aClass ddLogLevel]; - } - - return -1; -} - -+ (int)logLevelForClassWithName:(NSString *)aClassName -{ - Class aClass = NSClassFromString(aClassName); - - return [self logLevelForClass:aClass]; -} - -+ (void)setLogLevel:(int)logLevel forClass:(Class)aClass -{ - if ([self isRegisteredClass:aClass]) - { - [aClass ddSetLogLevel:logLevel]; - } -} - -+ (void)setLogLevel:(int)logLevel forClassWithName:(NSString *)aClassName -{ - Class aClass = NSClassFromString(aClassName); - - [self setLogLevel:logLevel forClass:aClass]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Logging Thread -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * This method should only be run on the logging thread/queue. -**/ -+ (void)lt_addLogger:(id )logger -{ - // Add to loggers array. - // Need to create loggerQueue if loggerNode doesn't provide one. - - dispatch_queue_t loggerQueue = NULL; - - if ([logger respondsToSelector:@selector(loggerQueue)]) - { - // Logger may be providing its own queue - - loggerQueue = [logger loggerQueue]; - } - - if (loggerQueue == nil) - { - // Automatically create queue for the logger. - // Use the logger name as the queue name if possible. - - const char *loggerQueueName = NULL; - if ([logger respondsToSelector:@selector(loggerName)]) - { - loggerQueueName = [[logger loggerName] UTF8String]; - } - - loggerQueue = dispatch_queue_create(loggerQueueName, NULL); - } - - DDLoggerNode *loggerNode = [DDLoggerNode nodeWithLogger:logger loggerQueue:loggerQueue]; - [loggers addObject:loggerNode]; - - if ([logger respondsToSelector:@selector(didAddLogger)]) - { - dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { - - [logger didAddLogger]; - }}); - } -} - -/** - * This method should only be run on the logging thread/queue. -**/ -+ (void)lt_removeLogger:(id )logger -{ - // Find associated loggerNode in list of added loggers - - DDLoggerNode *loggerNode = nil; - - for (DDLoggerNode *node in loggers) - { - if (node->logger == logger) - { - loggerNode = node; - break; - } - } - - if (loggerNode == nil) - { - DDLogWarnDebug(@"DDLog: Request to remove logger which wasn't added"); - return; - } - - // Notify logger - - if ([logger respondsToSelector:@selector(willRemoveLogger)]) - { - dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { - - [logger willRemoveLogger]; - }}); - } - - // Remove from loggers array - - [loggers removeObject:loggerNode]; -} - -/** - * This method should only be run on the logging thread/queue. -**/ -+ (void)lt_removeAllLoggers -{ - // Notify all loggers - - for (DDLoggerNode *loggerNode in loggers) - { - if ([loggerNode->logger respondsToSelector:@selector(willRemoveLogger)]) - { - dispatch_async(loggerNode->loggerQueue, ^{ @autoreleasepool { - - [loggerNode->logger willRemoveLogger]; - }}); - } - } - - // Remove all loggers from array - - [loggers removeAllObjects]; -} - -/** - * This method should only be run on the logging thread/queue. -**/ -+ (void)lt_log:(DDLogMessage *)logMessage -{ - // Execute the given log message on each of our loggers. - - if (numProcessors > 1) - { - // Execute each logger concurrently, each within its own queue. - // All blocks are added to same group. - // After each block has been queued, wait on group. - // - // The waiting ensures that a slow logger doesn't end up with a large queue of pending log messages. - // This would defeat the purpose of the efforts we made earlier to restrict the max queue size. - - for (DDLoggerNode *loggerNode in loggers) - { - dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool { - - [loggerNode->logger logMessage:logMessage]; - - }}); - } - - dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER); - } - else - { - // Execute each logger serialy, each within its own queue. - - for (DDLoggerNode *loggerNode in loggers) - { - dispatch_sync(loggerNode->loggerQueue, ^{ @autoreleasepool { - - [loggerNode->logger logMessage:logMessage]; - - }}); - } - } - - // If our queue got too big, there may be blocked threads waiting to add log messages to the queue. - // Since we've now dequeued an item from the log, we may need to unblock the next thread. - - // We are using a counting semaphore provided by GCD. - // The semaphore is initialized with our LOG_MAX_QUEUE_SIZE value. - // When a log message is queued this value is decremented. - // When a log message is dequeued this value is incremented. - // If the value ever drops below zero, - // the queueing thread blocks and waits in FIFO order for us to signal it. - // - // A dispatch semaphore is an efficient implementation of a traditional counting semaphore. - // Dispatch semaphores call down to the kernel only when the calling thread needs to be blocked. - // If the calling semaphore does not need to block, no kernel call is made. - - dispatch_semaphore_signal(queueSemaphore); -} - -/** - * This method should only be run on the background logging thread. -**/ -+ (void)lt_flush -{ - // All log statements issued before the flush method was invoked have now been executed. - // - // Now we need to propogate the flush request to any loggers that implement the flush method. - // This is designed for loggers that buffer IO. - - for (DDLoggerNode *loggerNode in loggers) - { - if ([loggerNode->logger respondsToSelector:@selector(flush)]) - { - dispatch_group_async(loggingGroup, loggerNode->loggerQueue, ^{ @autoreleasepool { - - [loggerNode->logger flush]; - - }}); - } - } - - dispatch_group_wait(loggingGroup, DISPATCH_TIME_FOREVER); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Utilities -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -NSString *DDExtractFileNameWithoutExtension(const char *filePath, BOOL copy) -{ - if (filePath == NULL) return nil; - - char *lastSlash = NULL; - char *lastDot = NULL; - - char *p = (char *)filePath; - - while (*p != '\0') - { - if (*p == '/') - lastSlash = p; - else if (*p == '.') - lastDot = p; - - p++; - } - - char *subStr; - NSUInteger subLen; - - if (lastSlash) - { - if (lastDot) - { - // lastSlash -> lastDot - subStr = lastSlash + 1; - subLen = lastDot - subStr; - } - else - { - // lastSlash -> endOfString - subStr = lastSlash + 1; - subLen = p - subStr; - } - } - else - { - if (lastDot) - { - // startOfString -> lastDot - subStr = (char *)filePath; - subLen = lastDot - subStr; - } - else - { - // startOfString -> endOfString - subStr = (char *)filePath; - subLen = p - subStr; - } - } - - if (copy) - { - return [[NSString alloc] initWithBytes:subStr - length:subLen - encoding:NSUTF8StringEncoding]; - } - else - { - // We can take advantage of the fact that __FILE__ is a string literal. - // Specifically, we don't need to waste time copying the string. - // We can just tell NSString to point to a range within the string literal. - - return [[NSString alloc] initWithBytesNoCopy:subStr - length:subLen - encoding:NSUTF8StringEncoding - freeWhenDone:NO]; - } -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDLoggerNode - -- (id)initWithLogger:(id )aLogger loggerQueue:(dispatch_queue_t)aLoggerQueue -{ - if ((self = [super init])) - { - logger = aLogger; - - if (aLoggerQueue) { - loggerQueue = aLoggerQueue; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(loggerQueue); - #endif - } - } - return self; -} - -+ (DDLoggerNode *)nodeWithLogger:(id )logger loggerQueue:(dispatch_queue_t)loggerQueue -{ - return [[DDLoggerNode alloc] initWithLogger:logger loggerQueue:loggerQueue]; -} - -- (void)dealloc -{ - #if !OS_OBJECT_USE_OBJC - if (loggerQueue) dispatch_release(loggerQueue); - #endif -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDLogMessage - -static char *dd_str_copy(const char *str) -{ - if (str == NULL) return NULL; - - size_t length = strlen(str); - char * result = malloc(length + 1); - if (result == NULL) return NULL; - strncpy(result, str, length); - result[length] = 0; - - return result; -} - -- (id)initWithLogMsg:(NSString *)msg - level:(int)level - flag:(int)flag - context:(int)context - file:(const char *)aFile - function:(const char *)aFunction - line:(int)line - tag:(id)aTag - options:(DDLogMessageOptions)optionsMask -{ - if ((self = [super init])) - { - logMsg = msg; - logLevel = level; - logFlag = flag; - logContext = context; - lineNumber = line; - tag = aTag; - options = optionsMask; - - if (options & DDLogMessageCopyFile) - file = dd_str_copy(aFile); - else - file = (char *)aFile; - - if (options & DDLogMessageCopyFunction) - function = dd_str_copy(aFunction); - else - function = (char *)aFunction; - - timestamp = [[NSDate alloc] init]; - - machThreadID = pthread_mach_thread_np(pthread_self()); - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - // The documentation for dispatch_get_current_queue() states: - // - // > [This method is] "recommended for debugging and logging purposes only"... - // - // Well that's exactly how we're using it here. Literally for logging purposes only. - // However, Apple has decided to deprecate this method anyway. - // However they have not given us an alternate version of dispatch_queue_get_label() that - // automatically uses the current queue, thus dispatch_get_current_queue() is still required. - // - // If dispatch_get_current_queue() disappears, without a dispatch_queue_get_label() alternative, - // Apple will have effectively taken away our ability to properly log the name of executing dispatch queue. - - dispatch_queue_t currentQueue = dispatch_get_current_queue(); - #pragma clang diagnostic pop - - queueLabel = dd_str_copy(dispatch_queue_get_label(currentQueue)); - - threadName = [[NSThread currentThread] name]; - } - return self; -} - -- (NSString *)threadID -{ - return [[NSString alloc] initWithFormat:@"%x", machThreadID]; -} - -- (NSString *)fileName -{ - return DDExtractFileNameWithoutExtension(file, NO); -} - -- (NSString *)methodName -{ - if (function == NULL) - return nil; - else - return [[NSString alloc] initWithUTF8String:function]; -} - -- (void)dealloc -{ - if (file && (options & DDLogMessageCopyFile)) - free(file); - - if (function && (options & DDLogMessageCopyFunction)) - free(function); - - if (queueLabel) - free(queueLabel); -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDAbstractLogger - -- (id)init -{ - if ((self = [super init])) - { - const char *loggerQueueName = NULL; - if ([self respondsToSelector:@selector(loggerName)]) - { - loggerQueueName = [[self loggerName] UTF8String]; - } - - loggerQueue = dispatch_queue_create(loggerQueueName, NULL); - - // We're going to use dispatch_queue_set_specific() to "mark" our loggerQueue. - // Later we can use dispatch_get_specific() to determine if we're executing on our loggerQueue. - // The documentation states: - // - // > Keys are only compared as pointers and are never dereferenced. - // > Thus, you can use a pointer to a static variable for a specific subsystem or - // > any other value that allows you to identify the value uniquely. - // > Specifying a pointer to a string constant is not recommended. - // - // So we're going to use the very convenient key of "self", - // which also works when multiple logger classes extend this class, as each will have a different "self" key. - // - // This is used primarily for thread-safety assertions (via the isOnInternalLoggerQueue method below). - - void *key = (__bridge void *)self; - void *nonNullValue = (__bridge void *)self; - - dispatch_queue_set_specific(loggerQueue, key, nonNullValue, NULL); - } - return self; -} - -- (void)dealloc -{ - #if !OS_OBJECT_USE_OBJC - if (loggerQueue) dispatch_release(loggerQueue); - #endif -} - -- (void)logMessage:(DDLogMessage *)logMessage -{ - // Override me -} - -- (id )logFormatter -{ - // This method must be thread safe and intuitive. - // Therefore if somebody executes the following code: - // - // [logger setLogFormatter:myFormatter]; - // formatter = [logger logFormatter]; - // - // They would expect formatter to equal myFormatter. - // This functionality must be ensured by the getter and setter method. - // - // The thread safety must not come at a cost to the performance of the logMessage method. - // This method is likely called sporadically, while the logMessage method is called repeatedly. - // This means, the implementation of this method: - // - Must NOT require the logMessage method to acquire a lock. - // - Must NOT require the logMessage method to access an atomic property (also a lock of sorts). - // - // Thread safety is ensured by executing access to the formatter variable on the loggerQueue. - // This is the same queue that the logMessage method operates on. - // - // Note: The last time I benchmarked the performance of direct access vs atomic property access, - // direct access was over twice as fast on the desktop and over 6 times as fast on the iPhone. - // - // Furthermore, consider the following code: - // - // DDLogVerbose(@"log msg 1"); - // DDLogVerbose(@"log msg 2"); - // [logger setFormatter:myFormatter]; - // DDLogVerbose(@"log msg 3"); - // - // Our intuitive requirement means that the new formatter will only apply to the 3rd log message. - // This must remain true even when using asynchronous logging. - // We must keep in mind the various queue's that are in play here: - // - // loggerQueue : Our own private internal queue that the logMessage method runs on. - // Operations are added to this queue from the global loggingQueue. - // - // globalLoggingQueue : The queue that all log messages go through before they arrive in our loggerQueue. - // - // All log statements go through the serial gloabalLoggingQueue before they arrive at our loggerQueue. - // Thus this method also goes through the serial globalLoggingQueue to ensure intuitive operation. - - // IMPORTANT NOTE: - // - // Methods within the DDLogger implementation MUST access the formatter ivar directly. - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block id result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = formatter; - }); - }); - - return result; -} - -- (void)setLogFormatter:(id )logFormatter -{ - // The design of this method is documented extensively in the logFormatter message (above in code). - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_block_t block = ^{ @autoreleasepool { - - if (formatter != logFormatter) - { - if ([formatter respondsToSelector:@selector(willRemoveFromLogger:)]) { - [formatter willRemoveFromLogger:self]; - } - - formatter = logFormatter; - - if ([formatter respondsToSelector:@selector(didAddToLogger:)]) { - [formatter didAddToLogger:self]; - } - } - }}; - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); -} - -- (dispatch_queue_t)loggerQueue -{ - return loggerQueue; -} - -- (NSString *)loggerName -{ - return NSStringFromClass([self class]); -} - -- (BOOL)isOnGlobalLoggingQueue -{ - return (dispatch_get_specific(GlobalLoggingQueueIdentityKey) != NULL); -} - -- (BOOL)isOnInternalLoggerQueue -{ - void *key = (__bridge void *)self; - return (dispatch_get_specific(key) != NULL); -} - -@end diff --git a/Source/Vendor/Lumberjack/DDTTYLogger.h b/Source/Vendor/Lumberjack/DDTTYLogger.h deleted file mode 100755 index 6df852c79..000000000 --- a/Source/Vendor/Lumberjack/DDTTYLogger.h +++ /dev/null @@ -1,167 +0,0 @@ -#import -#if TARGET_OS_IPHONE -#import -#else -#import -#endif - -#import "DDLog.h" - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a logger for Terminal output or Xcode console output, - * depending on where you are running your code. - * - * As described in the "Getting Started" page, - * the traditional DDLogWarn() function directs it's output to two places: - * - * - Apple System Log (so it shows up in Console.app) - * - StdErr (if stderr is a TTY, so log statements show up in Xcode console) - * - * To duplicate DDLogWarn() functionality you can simply add this logger and an asl logger. - * However, if you instead choose to use file logging (for faster performance), - * you may choose to use only a file logger and a tty logger. -**/ - -@interface DDTTYLogger : DDAbstractLogger -{ - NSCalendar *calendar; - NSUInteger calendarUnitFlags; - - NSString *appName; - char *app; - size_t appLen; - - NSString *processID; - char *pid; - size_t pidLen; - - BOOL colorsEnabled; - NSMutableArray *colorProfilesArray; - NSMutableDictionary *colorProfilesDict; -} - -+ (DDTTYLogger *)sharedInstance; - -/* Inherited from the DDLogger protocol: - * - * Formatters may optionally be added to any logger. - * - * If no formatter is set, the logger simply logs the message as it is given in logMessage, - * or it may use its own built in formatting style. - * - * More information about formatters can be found here: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters - * - * The actual implementation of these methods is inherited from DDAbstractLogger. - -- (id )logFormatter; -- (void)setLogFormatter:(id )formatter; - -*/ - -/** - * Want to use different colors for different log levels? - * Enable this property. - * - * If you run the application via the Terminal (not Xcode), - * the logger will map colors to xterm-256color or xterm-color (if available). - * - * Xcode does NOT natively support colors in the Xcode debugging console. - * You'll need to install the XcodeColors plugin to see colors in the Xcode console. - * https://github.com/robbiehanson/XcodeColors - * - * The default value if NO. -**/ -@property (readwrite, assign) BOOL colorsEnabled; - -/** - * The default color set (foregroundColor, backgroundColor) is: - * - * - LOG_FLAG_ERROR = (red, nil) - * - LOG_FLAG_WARN = (orange, nil) - * - * You can customize the colors however you see fit. - * Please note that you are passing a flag, NOT a level. - * - * GOOD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_FLAG_INFO]; // <- Good :) - * BAD : [ttyLogger setForegroundColor:pink backgroundColor:nil forFlag:LOG_LEVEL_INFO]; // <- BAD! :( - * - * LOG_FLAG_INFO = 0...00100 - * LOG_LEVEL_INFO = 0...00111 <- Would match LOG_FLAG_INFO and LOG_FLAG_WARN and LOG_FLAG_ERROR - * - * If you run the application within Xcode, then the XcodeColors plugin is required. - * - * If you run the application from a shell, then DDTTYLogger will automatically map the given color to - * the closest available color. (xterm-256color or xterm-color which have 256 and 16 supported colors respectively.) - * - * This method invokes setForegroundColor:backgroundColor:forFlag:context: and passes the default context (0). -**/ -#if TARGET_OS_IPHONE -- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask; -#else -- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask; -#endif - -/** - * Just like setForegroundColor:backgroundColor:flag, but allows you to specify a particular logging context. - * - * A logging context is often used to identify log messages coming from a 3rd party framework, - * although logging context's can be used for many different functions. - * - * Logging context's are explained in further detail here: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomContext -**/ -#if TARGET_OS_IPHONE -- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forFlag:(int)mask context:(int)ctxt; -#else -- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forFlag:(int)mask context:(int)ctxt; -#endif - -/** - * Similar to the methods above, but allows you to map DDLogMessage->tag to a particular color profile. - * For example, you could do something like this: - * - * static NSString *const PurpleTag = @"PurpleTag"; - * - * #define DDLogPurple(frmt, ...) LOG_OBJC_TAG_MACRO(NO, 0, 0, 0, PurpleTag, frmt, ##__VA_ARGS__) - * - * And then in your applicationDidFinishLaunching, or wherever you configure Lumberjack: - * - * #if TARGET_OS_IPHONE - * UIColor *purple = [UIColor colorWithRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0]; - * #else - * NSColor *purple = [NSColor colorWithCalibratedRed:(64/255.0) green:(0/255.0) blue:(128/255.0) alpha:1.0]; - * - * [[DDTTYLogger sharedInstance] setForegroundColor:purple backgroundColor:nil forTag:PurpleTag]; - * [DDLog addLogger:[DDTTYLogger sharedInstance]]; - * - * This would essentially give you a straight DDLogWarn replacement that prints in purple: - * - * DDLogPurple(@"I'm a purple log message!"); -**/ -#if TARGET_OS_IPHONE -- (void)setForegroundColor:(UIColor *)txtColor backgroundColor:(UIColor *)bgColor forTag:(id )tag; -#else -- (void)setForegroundColor:(NSColor *)txtColor backgroundColor:(NSColor *)bgColor forTag:(id )tag; -#endif - -/** - * Clearing color profiles. -**/ -- (void)clearColorsForFlag:(int)mask; -- (void)clearColorsForFlag:(int)mask context:(int)context; -- (void)clearColorsForTag:(id )tag; -- (void)clearColorsForAllFlags; -- (void)clearColorsForAllTags; -- (void)clearAllColors; - -@end diff --git a/Source/Vendor/Lumberjack/DDTTYLogger.m b/Source/Vendor/Lumberjack/DDTTYLogger.m deleted file mode 100755 index a2b4f3cb4..000000000 --- a/Source/Vendor/Lumberjack/DDTTYLogger.m +++ /dev/null @@ -1,1490 +0,0 @@ -#import "DDTTYLogger.h" - -#import -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - -// We probably shouldn't be using DDLog() statements within the DDLog implementation. -// But we still want to leave our log statements for any future debugging, -// and to allow other developers to trace the implementation (which is a great learning tool). -// -// So we use primitive logging macros around DDLogWarn. -// We maintain the NS prefix on the macros to be explicit about the fact that we're using DDLogWarn. - -#define LOG_LEVEL 2 - -#define DDLogWarnError(frmt, ...) do{ if(LOG_LEVEL >= 1) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnWarn(frmt, ...) do{ if(LOG_LEVEL >= 2) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnInfo(frmt, ...) do{ if(LOG_LEVEL >= 3) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) -#define DDLogWarnVerbose(frmt, ...) do{ if(LOG_LEVEL >= 4) DDLogWarn((frmt), ##__VA_ARGS__); } while(0) - -// Xcode does NOT natively support colors in the Xcode debugging console. -// You'll need to install the XcodeColors plugin to see colors in the Xcode console. -// https://github.com/robbiehanson/XcodeColors -// -// The following is documentation from the XcodeColors project: -// -// -// How to apply color formatting to your log statements: -// -// To set the foreground color: -// Insert the ESCAPE_SEQ into your string, followed by "fg124,12,255;" where r=124, g=12, b=255. -// -// To set the background color: -// Insert the ESCAPE_SEQ into your string, followed by "bg12,24,36;" where r=12, g=24, b=36. -// -// To reset the foreground color (to default value): -// Insert the ESCAPE_SEQ into your string, followed by "fg;" -// -// To reset the background color (to default value): -// Insert the ESCAPE_SEQ into your string, followed by "bg;" -// -// To reset the foreground and background color (to default values) in one operation: -// Insert the ESCAPE_SEQ into your string, followed by ";" - -#define XCODE_COLORS_ESCAPE_SEQ "\033[" - -#define XCODE_COLORS_RESET_FG XCODE_COLORS_ESCAPE_SEQ "fg;" // Clear any foreground color -#define XCODE_COLORS_RESET_BG XCODE_COLORS_ESCAPE_SEQ "bg;" // Clear any background color -#define XCODE_COLORS_RESET XCODE_COLORS_ESCAPE_SEQ ";" // Clear any foreground or background color - -// Some simple defines to make life easier on ourself - -#if TARGET_OS_IPHONE - #define MakeColor(r, g, b) [UIColor colorWithRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f] -#else - #define MakeColor(r, g, b) [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0f] -#endif - -#if TARGET_OS_IPHONE - #define OSColor UIColor -#else - #define OSColor NSColor -#endif - -// If running in a shell, not all RGB colors will be supported. -// In this case we automatically map to the closest available color. -// In order to provide this mapping, we have a hard-coded set of the standard RGB values available in the shell. -// However, not every shell is the same, and Apple likes to think different even when it comes to shell colors. -// -// Map to standard Terminal.app colors (1), or -// map to standard xterm colors (0). - -#define MAP_TO_TERMINAL_APP_COLORS 1 - - -@interface DDTTYLoggerColorProfile : NSObject { -@public - int mask; - int context; - - uint8_t fg_r; - uint8_t fg_g; - uint8_t fg_b; - - uint8_t bg_r; - uint8_t bg_g; - uint8_t bg_b; - - NSUInteger fgCodeIndex; - NSString *fgCodeRaw; - - NSUInteger bgCodeIndex; - NSString *bgCodeRaw; - - char fgCode[24]; - size_t fgCodeLen; - - char bgCode[24]; - size_t bgCodeLen; - - char resetCode[8]; - size_t resetCodeLen; -} - -- (id)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)mask context:(int)ctxt; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDTTYLogger - -static BOOL isaColorTTY; -static BOOL isaColor256TTY; -static BOOL isaXcodeColorTTY; - -static NSArray *codes_fg = nil; -static NSArray *codes_bg = nil; -static NSArray *colors = nil; - -static DDTTYLogger *sharedInstance; - -/** - * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 16 color mode. - * - * This method is used when the application is running from within a shell that only supports 16 color mode. - * This method is not invoked if the application is running within Xcode, or via normal UI app launch. -**/ -+ (void)initialize_colors_16 -{ - if (codes_fg || codes_bg || colors) return; - - NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:16]; - NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:16]; - NSMutableArray *m_colors = [NSMutableArray arrayWithCapacity:16]; - - // In a standard shell only 16 colors are supported. - // - // More information about ansi escape codes can be found online. - // http://en.wikipedia.org/wiki/ANSI_escape_code - - [m_codes_fg addObject:@"30m"]; // normal - black - [m_codes_fg addObject:@"31m"]; // normal - red - [m_codes_fg addObject:@"32m"]; // normal - green - [m_codes_fg addObject:@"33m"]; // normal - yellow - [m_codes_fg addObject:@"34m"]; // normal - blue - [m_codes_fg addObject:@"35m"]; // normal - magenta - [m_codes_fg addObject:@"36m"]; // normal - cyan - [m_codes_fg addObject:@"37m"]; // normal - gray - [m_codes_fg addObject:@"1;30m"]; // bright - darkgray - [m_codes_fg addObject:@"1;31m"]; // bright - red - [m_codes_fg addObject:@"1;32m"]; // bright - green - [m_codes_fg addObject:@"1;33m"]; // bright - yellow - [m_codes_fg addObject:@"1;34m"]; // bright - blue - [m_codes_fg addObject:@"1;35m"]; // bright - magenta - [m_codes_fg addObject:@"1;36m"]; // bright - cyan - [m_codes_fg addObject:@"1;37m"]; // bright - white - - [m_codes_bg addObject:@"40m"]; // normal - black - [m_codes_bg addObject:@"41m"]; // normal - red - [m_codes_bg addObject:@"42m"]; // normal - green - [m_codes_bg addObject:@"43m"]; // normal - yellow - [m_codes_bg addObject:@"44m"]; // normal - blue - [m_codes_bg addObject:@"45m"]; // normal - magenta - [m_codes_bg addObject:@"46m"]; // normal - cyan - [m_codes_bg addObject:@"47m"]; // normal - gray - [m_codes_bg addObject:@"1;40m"]; // bright - darkgray - [m_codes_bg addObject:@"1;41m"]; // bright - red - [m_codes_bg addObject:@"1;42m"]; // bright - green - [m_codes_bg addObject:@"1;43m"]; // bright - yellow - [m_codes_bg addObject:@"1;44m"]; // bright - blue - [m_codes_bg addObject:@"1;45m"]; // bright - magenta - [m_codes_bg addObject:@"1;46m"]; // bright - cyan - [m_codes_bg addObject:@"1;47m"]; // bright - white - -#if MAP_TO_TERMINAL_APP_COLORS - - // Standard Terminal.app colors: - // - // These are the default colors used by Apple's Terminal.app. - - [m_colors addObject:MakeColor( 0, 0, 0)]; // normal - black - [m_colors addObject:MakeColor(194, 54, 33)]; // normal - red - [m_colors addObject:MakeColor( 37, 188, 36)]; // normal - green - [m_colors addObject:MakeColor(173, 173, 39)]; // normal - yellow - [m_colors addObject:MakeColor( 73, 46, 225)]; // normal - blue - [m_colors addObject:MakeColor(211, 56, 211)]; // normal - magenta - [m_colors addObject:MakeColor( 51, 187, 200)]; // normal - cyan - [m_colors addObject:MakeColor(203, 204, 205)]; // normal - gray - [m_colors addObject:MakeColor(129, 131, 131)]; // bright - darkgray - [m_colors addObject:MakeColor(252, 57, 31)]; // bright - red - [m_colors addObject:MakeColor( 49, 231, 34)]; // bright - green - [m_colors addObject:MakeColor(234, 236, 35)]; // bright - yellow - [m_colors addObject:MakeColor( 88, 51, 255)]; // bright - blue - [m_colors addObject:MakeColor(249, 53, 248)]; // bright - magenta - [m_colors addObject:MakeColor( 20, 240, 240)]; // bright - cyan - [m_colors addObject:MakeColor(233, 235, 235)]; // bright - white - -#else - - // Standard xterm colors: - // - // These are the default colors used by most xterm shells. - - [m_colors addObject:MakeColor( 0, 0, 0)]; // normal - black - [m_colors addObject:MakeColor(205, 0, 0)]; // normal - red - [m_colors addObject:MakeColor( 0, 205, 0)]; // normal - green - [m_colors addObject:MakeColor(205, 205, 0)]; // normal - yellow - [m_colors addObject:MakeColor( 0, 0, 238)]; // normal - blue - [m_colors addObject:MakeColor(205, 0, 205)]; // normal - magenta - [m_colors addObject:MakeColor( 0, 205, 205)]; // normal - cyan - [m_colors addObject:MakeColor(229, 229, 229)]; // normal - gray - [m_colors addObject:MakeColor(127, 127, 127)]; // bright - darkgray - [m_colors addObject:MakeColor(255, 0, 0)]; // bright - red - [m_colors addObject:MakeColor( 0, 255, 0)]; // bright - green - [m_colors addObject:MakeColor(255, 255, 0)]; // bright - yellow - [m_colors addObject:MakeColor( 92, 92, 255)]; // bright - blue - [m_colors addObject:MakeColor(255, 0, 255)]; // bright - magenta - [m_colors addObject:MakeColor( 0, 255, 255)]; // bright - cyan - [m_colors addObject:MakeColor(255, 255, 255)]; // bright - white - -#endif - - codes_fg = [m_codes_fg copy]; - codes_bg = [m_codes_bg copy]; - colors = [m_colors copy]; - - NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)"); - NSAssert([codes_fg count] == [colors count], @"Invalid colors/codes array(s)"); -} - -/** - * Initializes the colors array, as well as the codes_fg and codes_bg arrays, for 256 color mode. - * - * This method is used when the application is running from within a shell that supports 256 color mode. - * This method is not invoked if the application is running within Xcode, or via normal UI app launch. -**/ -+ (void)initialize_colors_256 -{ - if (codes_fg || codes_bg || colors) return; - - NSMutableArray *m_codes_fg = [NSMutableArray arrayWithCapacity:(256-16)]; - NSMutableArray *m_codes_bg = [NSMutableArray arrayWithCapacity:(256-16)]; - NSMutableArray *m_colors = [NSMutableArray arrayWithCapacity:(256-16)]; - - #if MAP_TO_TERMINAL_APP_COLORS - - // Standard Terminal.app colors: - // - // These are the colors the Terminal.app uses in xterm-256color mode. - // In this mode, the terminal supports 256 different colors, specified by 256 color codes. - // - // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode. - // These are actually configurable, and thus we ignore them for the purposes of mapping, - // as we can't rely on them being constant. They are largely duplicated anyway. - // - // The next 216 color codes are designed to run the spectrum, with several shades of every color. - // While the color codes are standardized, the actual RGB values for each color code is not. - // Apple's Terminal.app uses different RGB values from that of a standard xterm. - // Apple's choices in colors are designed to be a little nicer on the eyes. - // - // The last 24 color codes represent a grayscale. - // - // Unfortunately, unlike the standard xterm color chart, - // Apple's RGB values cannot be calculated using a simple formula (at least not that I know of). - // Also, I don't know of any ways to programmatically query the shell for the RGB values. - // So this big giant color chart had to be made by hand. - // - // More information about ansi escape codes can be found online. - // http://en.wikipedia.org/wiki/ANSI_escape_code - - // Colors - - [m_colors addObject:MakeColor( 47, 49, 49)]; - [m_colors addObject:MakeColor( 60, 42, 144)]; - [m_colors addObject:MakeColor( 66, 44, 183)]; - [m_colors addObject:MakeColor( 73, 46, 222)]; - [m_colors addObject:MakeColor( 81, 50, 253)]; - [m_colors addObject:MakeColor( 88, 51, 255)]; - - [m_colors addObject:MakeColor( 42, 128, 37)]; - [m_colors addObject:MakeColor( 42, 127, 128)]; - [m_colors addObject:MakeColor( 44, 126, 169)]; - [m_colors addObject:MakeColor( 56, 125, 209)]; - [m_colors addObject:MakeColor( 59, 124, 245)]; - [m_colors addObject:MakeColor( 66, 123, 255)]; - - [m_colors addObject:MakeColor( 51, 163, 41)]; - [m_colors addObject:MakeColor( 39, 162, 121)]; - [m_colors addObject:MakeColor( 42, 161, 162)]; - [m_colors addObject:MakeColor( 53, 160, 202)]; - [m_colors addObject:MakeColor( 45, 159, 240)]; - [m_colors addObject:MakeColor( 58, 158, 255)]; - - [m_colors addObject:MakeColor( 31, 196, 37)]; - [m_colors addObject:MakeColor( 48, 196, 115)]; - [m_colors addObject:MakeColor( 39, 195, 155)]; - [m_colors addObject:MakeColor( 49, 195, 195)]; - [m_colors addObject:MakeColor( 32, 194, 235)]; - [m_colors addObject:MakeColor( 53, 193, 255)]; - - [m_colors addObject:MakeColor( 50, 229, 35)]; - [m_colors addObject:MakeColor( 40, 229, 109)]; - [m_colors addObject:MakeColor( 27, 229, 149)]; - [m_colors addObject:MakeColor( 49, 228, 189)]; - [m_colors addObject:MakeColor( 33, 228, 228)]; - [m_colors addObject:MakeColor( 53, 227, 255)]; - - [m_colors addObject:MakeColor( 27, 254, 30)]; - [m_colors addObject:MakeColor( 30, 254, 103)]; - [m_colors addObject:MakeColor( 45, 254, 143)]; - [m_colors addObject:MakeColor( 38, 253, 182)]; - [m_colors addObject:MakeColor( 38, 253, 222)]; - [m_colors addObject:MakeColor( 42, 253, 252)]; - - [m_colors addObject:MakeColor(140, 48, 40)]; - [m_colors addObject:MakeColor(136, 51, 136)]; - [m_colors addObject:MakeColor(135, 52, 177)]; - [m_colors addObject:MakeColor(134, 52, 217)]; - [m_colors addObject:MakeColor(135, 56, 248)]; - [m_colors addObject:MakeColor(134, 53, 255)]; - - [m_colors addObject:MakeColor(125, 125, 38)]; - [m_colors addObject:MakeColor(124, 125, 125)]; - [m_colors addObject:MakeColor(122, 124, 166)]; - [m_colors addObject:MakeColor(123, 124, 207)]; - [m_colors addObject:MakeColor(123, 122, 247)]; - [m_colors addObject:MakeColor(124, 121, 255)]; - - [m_colors addObject:MakeColor(119, 160, 35)]; - [m_colors addObject:MakeColor(117, 160, 120)]; - [m_colors addObject:MakeColor(117, 160, 160)]; - [m_colors addObject:MakeColor(115, 159, 201)]; - [m_colors addObject:MakeColor(116, 158, 240)]; - [m_colors addObject:MakeColor(117, 157, 255)]; - - [m_colors addObject:MakeColor(113, 195, 39)]; - [m_colors addObject:MakeColor(110, 194, 114)]; - [m_colors addObject:MakeColor(111, 194, 154)]; - [m_colors addObject:MakeColor(108, 194, 194)]; - [m_colors addObject:MakeColor(109, 193, 234)]; - [m_colors addObject:MakeColor(108, 192, 255)]; - - [m_colors addObject:MakeColor(105, 228, 30)]; - [m_colors addObject:MakeColor(103, 228, 109)]; - [m_colors addObject:MakeColor(105, 228, 148)]; - [m_colors addObject:MakeColor(100, 227, 188)]; - [m_colors addObject:MakeColor( 99, 227, 227)]; - [m_colors addObject:MakeColor( 99, 226, 253)]; - - [m_colors addObject:MakeColor( 92, 253, 34)]; - [m_colors addObject:MakeColor( 96, 253, 103)]; - [m_colors addObject:MakeColor( 97, 253, 142)]; - [m_colors addObject:MakeColor( 88, 253, 182)]; - [m_colors addObject:MakeColor( 93, 253, 221)]; - [m_colors addObject:MakeColor( 88, 254, 251)]; - - [m_colors addObject:MakeColor(177, 53, 34)]; - [m_colors addObject:MakeColor(174, 54, 131)]; - [m_colors addObject:MakeColor(172, 55, 172)]; - [m_colors addObject:MakeColor(171, 57, 213)]; - [m_colors addObject:MakeColor(170, 55, 249)]; - [m_colors addObject:MakeColor(170, 57, 255)]; - - [m_colors addObject:MakeColor(165, 123, 37)]; - [m_colors addObject:MakeColor(163, 123, 123)]; - [m_colors addObject:MakeColor(162, 123, 164)]; - [m_colors addObject:MakeColor(161, 122, 205)]; - [m_colors addObject:MakeColor(161, 121, 241)]; - [m_colors addObject:MakeColor(161, 121, 255)]; - - [m_colors addObject:MakeColor(158, 159, 33)]; - [m_colors addObject:MakeColor(157, 158, 118)]; - [m_colors addObject:MakeColor(157, 158, 159)]; - [m_colors addObject:MakeColor(155, 157, 199)]; - [m_colors addObject:MakeColor(155, 157, 239)]; - [m_colors addObject:MakeColor(154, 156, 255)]; - - [m_colors addObject:MakeColor(152, 193, 40)]; - [m_colors addObject:MakeColor(151, 193, 113)]; - [m_colors addObject:MakeColor(150, 193, 153)]; - [m_colors addObject:MakeColor(150, 192, 193)]; - [m_colors addObject:MakeColor(148, 192, 232)]; - [m_colors addObject:MakeColor(149, 191, 253)]; - - [m_colors addObject:MakeColor(146, 227, 28)]; - [m_colors addObject:MakeColor(144, 227, 108)]; - [m_colors addObject:MakeColor(144, 227, 147)]; - [m_colors addObject:MakeColor(144, 227, 187)]; - [m_colors addObject:MakeColor(142, 226, 227)]; - [m_colors addObject:MakeColor(142, 225, 252)]; - - [m_colors addObject:MakeColor(138, 253, 36)]; - [m_colors addObject:MakeColor(137, 253, 102)]; - [m_colors addObject:MakeColor(136, 253, 141)]; - [m_colors addObject:MakeColor(138, 254, 181)]; - [m_colors addObject:MakeColor(135, 255, 220)]; - [m_colors addObject:MakeColor(133, 255, 250)]; - - [m_colors addObject:MakeColor(214, 57, 30)]; - [m_colors addObject:MakeColor(211, 59, 126)]; - [m_colors addObject:MakeColor(209, 57, 168)]; - [m_colors addObject:MakeColor(208, 55, 208)]; - [m_colors addObject:MakeColor(207, 58, 247)]; - [m_colors addObject:MakeColor(206, 61, 255)]; - - [m_colors addObject:MakeColor(204, 121, 32)]; - [m_colors addObject:MakeColor(202, 121, 121)]; - [m_colors addObject:MakeColor(201, 121, 161)]; - [m_colors addObject:MakeColor(200, 120, 202)]; - [m_colors addObject:MakeColor(200, 120, 241)]; - [m_colors addObject:MakeColor(198, 119, 255)]; - - [m_colors addObject:MakeColor(198, 157, 37)]; - [m_colors addObject:MakeColor(196, 157, 116)]; - [m_colors addObject:MakeColor(195, 156, 157)]; - [m_colors addObject:MakeColor(195, 156, 197)]; - [m_colors addObject:MakeColor(194, 155, 236)]; - [m_colors addObject:MakeColor(193, 155, 255)]; - - [m_colors addObject:MakeColor(191, 192, 36)]; - [m_colors addObject:MakeColor(190, 191, 112)]; - [m_colors addObject:MakeColor(189, 191, 152)]; - [m_colors addObject:MakeColor(189, 191, 191)]; - [m_colors addObject:MakeColor(188, 190, 230)]; - [m_colors addObject:MakeColor(187, 190, 253)]; - - [m_colors addObject:MakeColor(185, 226, 28)]; - [m_colors addObject:MakeColor(184, 226, 106)]; - [m_colors addObject:MakeColor(183, 225, 146)]; - [m_colors addObject:MakeColor(183, 225, 186)]; - [m_colors addObject:MakeColor(182, 225, 225)]; - [m_colors addObject:MakeColor(181, 224, 252)]; - - [m_colors addObject:MakeColor(178, 255, 35)]; - [m_colors addObject:MakeColor(178, 255, 101)]; - [m_colors addObject:MakeColor(177, 254, 141)]; - [m_colors addObject:MakeColor(176, 254, 180)]; - [m_colors addObject:MakeColor(176, 254, 220)]; - [m_colors addObject:MakeColor(175, 253, 249)]; - - [m_colors addObject:MakeColor(247, 56, 30)]; - [m_colors addObject:MakeColor(245, 57, 122)]; - [m_colors addObject:MakeColor(243, 59, 163)]; - [m_colors addObject:MakeColor(244, 60, 204)]; - [m_colors addObject:MakeColor(242, 59, 241)]; - [m_colors addObject:MakeColor(240, 55, 255)]; - - [m_colors addObject:MakeColor(241, 119, 36)]; - [m_colors addObject:MakeColor(240, 120, 118)]; - [m_colors addObject:MakeColor(238, 119, 158)]; - [m_colors addObject:MakeColor(237, 119, 199)]; - [m_colors addObject:MakeColor(237, 118, 238)]; - [m_colors addObject:MakeColor(236, 118, 255)]; - - [m_colors addObject:MakeColor(235, 154, 36)]; - [m_colors addObject:MakeColor(235, 154, 114)]; - [m_colors addObject:MakeColor(234, 154, 154)]; - [m_colors addObject:MakeColor(232, 154, 194)]; - [m_colors addObject:MakeColor(232, 153, 234)]; - [m_colors addObject:MakeColor(232, 153, 255)]; - - [m_colors addObject:MakeColor(230, 190, 30)]; - [m_colors addObject:MakeColor(229, 189, 110)]; - [m_colors addObject:MakeColor(228, 189, 150)]; - [m_colors addObject:MakeColor(227, 189, 190)]; - [m_colors addObject:MakeColor(227, 189, 229)]; - [m_colors addObject:MakeColor(226, 188, 255)]; - - [m_colors addObject:MakeColor(224, 224, 35)]; - [m_colors addObject:MakeColor(223, 224, 105)]; - [m_colors addObject:MakeColor(222, 224, 144)]; - [m_colors addObject:MakeColor(222, 223, 184)]; - [m_colors addObject:MakeColor(222, 223, 224)]; - [m_colors addObject:MakeColor(220, 223, 253)]; - - [m_colors addObject:MakeColor(217, 253, 28)]; - [m_colors addObject:MakeColor(217, 253, 99)]; - [m_colors addObject:MakeColor(216, 252, 139)]; - [m_colors addObject:MakeColor(216, 252, 179)]; - [m_colors addObject:MakeColor(215, 252, 218)]; - [m_colors addObject:MakeColor(215, 251, 250)]; - - [m_colors addObject:MakeColor(255, 61, 30)]; - [m_colors addObject:MakeColor(255, 60, 118)]; - [m_colors addObject:MakeColor(255, 58, 159)]; - [m_colors addObject:MakeColor(255, 56, 199)]; - [m_colors addObject:MakeColor(255, 55, 238)]; - [m_colors addObject:MakeColor(255, 59, 255)]; - - [m_colors addObject:MakeColor(255, 117, 29)]; - [m_colors addObject:MakeColor(255, 117, 115)]; - [m_colors addObject:MakeColor(255, 117, 155)]; - [m_colors addObject:MakeColor(255, 117, 195)]; - [m_colors addObject:MakeColor(255, 116, 235)]; - [m_colors addObject:MakeColor(254, 116, 255)]; - - [m_colors addObject:MakeColor(255, 152, 27)]; - [m_colors addObject:MakeColor(255, 152, 111)]; - [m_colors addObject:MakeColor(254, 152, 152)]; - [m_colors addObject:MakeColor(255, 152, 192)]; - [m_colors addObject:MakeColor(254, 151, 231)]; - [m_colors addObject:MakeColor(253, 151, 253)]; - - [m_colors addObject:MakeColor(255, 187, 33)]; - [m_colors addObject:MakeColor(253, 187, 107)]; - [m_colors addObject:MakeColor(252, 187, 148)]; - [m_colors addObject:MakeColor(253, 187, 187)]; - [m_colors addObject:MakeColor(254, 187, 227)]; - [m_colors addObject:MakeColor(252, 186, 252)]; - - [m_colors addObject:MakeColor(252, 222, 34)]; - [m_colors addObject:MakeColor(251, 222, 103)]; - [m_colors addObject:MakeColor(251, 222, 143)]; - [m_colors addObject:MakeColor(250, 222, 182)]; - [m_colors addObject:MakeColor(251, 221, 222)]; - [m_colors addObject:MakeColor(252, 221, 252)]; - - [m_colors addObject:MakeColor(251, 252, 15)]; - [m_colors addObject:MakeColor(251, 252, 97)]; - [m_colors addObject:MakeColor(249, 252, 137)]; - [m_colors addObject:MakeColor(247, 252, 177)]; - [m_colors addObject:MakeColor(247, 253, 217)]; - [m_colors addObject:MakeColor(254, 255, 255)]; - - // Grayscale - - [m_colors addObject:MakeColor( 52, 53, 53)]; - [m_colors addObject:MakeColor( 57, 58, 59)]; - [m_colors addObject:MakeColor( 66, 67, 67)]; - [m_colors addObject:MakeColor( 75, 76, 76)]; - [m_colors addObject:MakeColor( 83, 85, 85)]; - [m_colors addObject:MakeColor( 92, 93, 94)]; - - [m_colors addObject:MakeColor(101, 102, 102)]; - [m_colors addObject:MakeColor(109, 111, 111)]; - [m_colors addObject:MakeColor(118, 119, 119)]; - [m_colors addObject:MakeColor(126, 127, 128)]; - [m_colors addObject:MakeColor(134, 136, 136)]; - [m_colors addObject:MakeColor(143, 144, 145)]; - - [m_colors addObject:MakeColor(151, 152, 153)]; - [m_colors addObject:MakeColor(159, 161, 161)]; - [m_colors addObject:MakeColor(167, 169, 169)]; - [m_colors addObject:MakeColor(176, 177, 177)]; - [m_colors addObject:MakeColor(184, 185, 186)]; - [m_colors addObject:MakeColor(192, 193, 194)]; - - [m_colors addObject:MakeColor(200, 201, 202)]; - [m_colors addObject:MakeColor(208, 209, 210)]; - [m_colors addObject:MakeColor(216, 218, 218)]; - [m_colors addObject:MakeColor(224, 226, 226)]; - [m_colors addObject:MakeColor(232, 234, 234)]; - [m_colors addObject:MakeColor(240, 242, 242)]; - - // Color codes - - int index = 16; - - while (index < 256) - { - [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; - [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; - - index++; - } - - #else - - // Standard xterm colors: - // - // These are the colors xterm shells use in xterm-256color mode. - // In this mode, the shell supports 256 different colors, specified by 256 color codes. - // - // The first 16 color codes map to the original 16 color codes supported by the earlier xterm-color mode. - // These are generally configurable, and thus we ignore them for the purposes of mapping, - // as we can't rely on them being constant. They are largely duplicated anyway. - // - // The next 216 color codes are designed to run the spectrum, with several shades of every color. - // The last 24 color codes represent a grayscale. - // - // While the color codes are standardized, the actual RGB values for each color code is not. - // However most standard xterms follow a well known color chart, - // which can easily be calculated using the simple formula below. - // - // More information about ansi escape codes can be found online. - // http://en.wikipedia.org/wiki/ANSI_escape_code - - int index = 16; - - int r; // red - int g; // green - int b; // blue - - int ri; // r increment - int gi; // g increment - int bi; // b increment - - // Calculate xterm colors (using standard algorithm) - - int r = 0; - int g = 0; - int b = 0; - - for (ri = 0; ri < 6; ri++) - { - r = (ri == 0) ? 0 : 95 + (40 * (ri - 1)); - - for (gi = 0; gi < 6; gi++) - { - g = (gi == 0) ? 0 : 95 + (40 * (gi - 1)); - - for (bi = 0; bi < 6; bi++) - { - b = (bi == 0) ? 0 : 95 + (40 * (bi - 1)); - - [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; - [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; - [m_colors addObject:MakeColor(r, g, b)]; - - index++; - } - } - } - - // Calculate xterm grayscale (using standard algorithm) - - r = 8; - g = 8; - b = 8; - - while (index < 256) - { - [m_codes_fg addObject:[NSString stringWithFormat:@"38;5;%dm", index]]; - [m_codes_bg addObject:[NSString stringWithFormat:@"48;5;%dm", index]]; - [m_colors addObject:MakeColor(r, g, b)]; - - r += 10; - g += 10; - b += 10; - - index++; - } - - #endif - - codes_fg = [m_codes_fg copy]; - codes_bg = [m_codes_bg copy]; - colors = [m_colors copy]; - - NSAssert([codes_fg count] == [codes_bg count], @"Invalid colors/codes array(s)"); - NSAssert([codes_fg count] == [colors count], @"Invalid colors/codes array(s)"); -} - -+ (void)getRed:(CGFloat *)rPtr green:(CGFloat *)gPtr blue:(CGFloat *)bPtr fromColor:(OSColor *)color -{ - #if TARGET_OS_IPHONE - - // iOS - - if ([color respondsToSelector:@selector(getRed:green:blue:alpha:)]) - { - [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL]; - } - else - { - // The method getRed:green:blue:alpha: was only available starting iOS 5. - // So in iOS 4 and earlier, we have to jump through hoops. - - CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); - - unsigned char pixel[4]; - CGContextRef context = CGBitmapContextCreate(&pixel, 1, 1, 8, 4, rgbColorSpace, kCGImageAlphaNoneSkipLast); - - CGContextSetFillColorWithColor(context, [color CGColor]); - CGContextFillRect(context, CGRectMake(0, 0, 1, 1)); - - if (rPtr) { *rPtr = pixel[0] / 255.0f; } - if (gPtr) { *gPtr = pixel[1] / 255.0f; } - if (bPtr) { *bPtr = pixel[2] / 255.0f; } - - CGContextRelease(context); - CGColorSpaceRelease(rgbColorSpace); - } - - #else - - // Mac OS X - - [color getRed:rPtr green:gPtr blue:bPtr alpha:NULL]; - - #endif -} - -/** - * Maps the given color to the closest available color supported by the shell. - * The shell may support 256 colors, or only 16. - * - * This method loops through the known supported color set, and calculates the closest color. - * The array index of that color, within the colors array, is then returned. - * This array index may also be used as the index within the codes_fg and codes_bg arrays. -**/ -+ (NSUInteger)codeIndexForColor:(OSColor *)inColor -{ - CGFloat inR, inG, inB; - [self getRed:&inR green:&inG blue:&inB fromColor:inColor]; - - NSUInteger bestIndex = 0; - CGFloat lowestDistance = 100.0f; - - NSUInteger i = 0; - for (OSColor *color in colors) - { - // Calculate Euclidean distance (lower value means closer to given color) - - CGFloat r, g, b; - [self getRed:&r green:&g blue:&b fromColor:color]; - - #if CGFLOAT_IS_DOUBLE - CGFloat distance = sqrt(pow(r-inR, 2.0) + pow(g-inG, 2.0) + pow(b-inB, 2.0)); - #else - CGFloat distance = sqrtf(powf(r-inR, 2.0f) + powf(g-inG, 2.0f) + powf(b-inB, 2.0f)); - #endif - - DDLogWarnVerbose(@"DDTTYLogger: %3lu : %.3f,%.3f,%.3f & %.3f,%.3f,%.3f = %.6f", - (unsigned long)i, inR, inG, inB, r, g, b, distance); - - if (distance < lowestDistance) - { - bestIndex = i; - lowestDistance = distance; - - DDLogWarnVerbose(@"DDTTYLogger: New best index = %lu", (unsigned long)bestIndex); - } - - i++; - } - - return bestIndex; -} - -/** - * The runtime sends initialize to each class in a program exactly one time just before the class, - * or any class that inherits from it, is sent its first message from within the program. (Thus the - * method may never be invoked if the class is not used.) The runtime sends the initialize message to - * classes in a thread-safe manner. Superclasses receive this message before their subclasses. - * - * This method may also be called directly (assumably by accident), hence the safety mechanism. -**/ -+ (void)initialize -{ - static BOOL initialized = NO; - if (!initialized) - { - initialized = YES; - - char *term = getenv("TERM"); - if (term) - { - if (strcasestr(term, "color") != NULL) - { - isaColorTTY = YES; - isaColor256TTY = (strcasestr(term, "256") != NULL); - - if (isaColor256TTY) - [self initialize_colors_256]; - else - [self initialize_colors_16]; - } - } - else - { - // Xcode does NOT natively support colors in the Xcode debugging console. - // You'll need to install the XcodeColors plugin to see colors in the Xcode console. - // - // PS - Please read the header file before diving into the source code. - - char *xcode_colors = getenv("XcodeColors"); - if (xcode_colors && (strcmp(xcode_colors, "YES") == 0)) - { - isaXcodeColorTTY = YES; - } - } - - DDLogWarnInfo(@"DDTTYLogger: isaColorTTY = %@", (isaColorTTY ? @"YES" : @"NO")); - DDLogWarnInfo(@"DDTTYLogger: isaColor256TTY: %@", (isaColor256TTY ? @"YES" : @"NO")); - DDLogWarnInfo(@"DDTTYLogger: isaXcodeColorTTY: %@", (isaXcodeColorTTY ? @"YES" : @"NO")); - - sharedInstance = [[DDTTYLogger alloc] init]; - } -} - -+ (DDTTYLogger *)sharedInstance -{ - return sharedInstance; -} - -- (id)init -{ - if (sharedInstance != nil) - { - return nil; - } - - if ((self = [super init])) - { - calendar = [NSCalendar autoupdatingCurrentCalendar]; - - calendarUnitFlags = 0; - calendarUnitFlags |= NSYearCalendarUnit; - calendarUnitFlags |= NSMonthCalendarUnit; - calendarUnitFlags |= NSDayCalendarUnit; - calendarUnitFlags |= NSHourCalendarUnit; - calendarUnitFlags |= NSMinuteCalendarUnit; - calendarUnitFlags |= NSSecondCalendarUnit; - - // Initialze 'app' variable (char *) - - appName = [[NSProcessInfo processInfo] processName]; - - appLen = [appName lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - app = (char *)malloc(appLen + 1); - if (app == NULL) return nil; - - [appName getCString:app maxLength:(appLen+1) encoding:NSUTF8StringEncoding]; - - // Initialize 'pid' variable (char *) - - processID = [NSString stringWithFormat:@"%i", (int)getpid()]; - - pidLen = [processID lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - pid = (char *)malloc(pidLen + 1); - if (pid == NULL) return nil; - - BOOL processedID = [processID getCString:pid maxLength:(pidLen+1) encoding:NSUTF8StringEncoding]; - if (NO == processedID) return nil; - - // Initialize color stuff - - colorsEnabled = NO; - colorProfilesArray = [[NSMutableArray alloc] initWithCapacity:8]; - colorProfilesDict = [[NSMutableDictionary alloc] initWithCapacity:8]; - } - return self; -} - -- (void)loadDefaultColorProfiles -{ - [self setForegroundColor:MakeColor(214, 57, 30) backgroundColor:nil forFlag:LOG_FLAG_ERROR]; - [self setForegroundColor:MakeColor(204, 121, 32) backgroundColor:nil forFlag:LOG_FLAG_WARN]; -} - -- (BOOL)colorsEnabled -{ - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - __block BOOL result; - - dispatch_sync(globalLoggingQueue, ^{ - dispatch_sync(loggerQueue, ^{ - result = colorsEnabled; - }); - }); - - return result; -} - -- (void)setColorsEnabled:(BOOL)newColorsEnabled -{ - dispatch_block_t block = ^{ @autoreleasepool { - - colorsEnabled = newColorsEnabled; - - if ([colorProfilesArray count] == 0) { - [self loadDefaultColorProfiles]; - } - }}; - - // The design of this method is taken from the DDAbstractLogger implementation. - // For extensive documentation please refer to the DDAbstractLogger implementation. - - // Note: The internal implementation MUST access the colorsEnabled variable directly, - // This method is designed explicitly for external access. - // - // Using "self." syntax to go through this method will cause immediate deadlock. - // This is the intended result. Fix it by accessing the ivar directly. - // Great strides have been take to ensure this is safe to do. Plus it's MUCH faster. - - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - NSAssert(![self isOnInternalLoggerQueue], @"MUST access ivar directly, NOT via self.* syntax."); - - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); -} - -- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask -{ - [self setForegroundColor:txtColor backgroundColor:bgColor forFlag:mask context:0]; -} - -- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forFlag:(int)mask context:(int)ctxt -{ - dispatch_block_t block = ^{ @autoreleasepool { - - DDTTYLoggerColorProfile *newColorProfile = - [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor - backgroundColor:bgColor - flag:mask - context:ctxt]; - - DDLogWarnInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile); - - NSUInteger i = 0; - for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray) - { - if ((colorProfile->mask == mask) && (colorProfile->context == ctxt)) - { - break; - } - - i++; - } - - if (i < [colorProfilesArray count]) - [colorProfilesArray replaceObjectAtIndex:i withObject:newColorProfile]; - else - [colorProfilesArray addObject:newColorProfile]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)setForegroundColor:(OSColor *)txtColor backgroundColor:(OSColor *)bgColor forTag:(id )tag -{ - NSAssert([(id )tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag"); - - dispatch_block_t block = ^{ @autoreleasepool { - - DDTTYLoggerColorProfile *newColorProfile = - [[DDTTYLoggerColorProfile alloc] initWithForegroundColor:txtColor - backgroundColor:bgColor - flag:0 - context:0]; - - DDLogWarnInfo(@"DDTTYLogger: newColorProfile: %@", newColorProfile); - - [colorProfilesDict setObject:newColorProfile forKey:tag]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)clearColorsForFlag:(int)mask -{ - [self clearColorsForFlag:mask context:0]; -} - -- (void)clearColorsForFlag:(int)mask context:(int)context -{ - dispatch_block_t block = ^{ @autoreleasepool { - - NSUInteger i = 0; - for (DDTTYLoggerColorProfile *colorProfile in colorProfilesArray) - { - if ((colorProfile->mask == mask) && (colorProfile->context == context)) - { - break; - } - - i++; - } - - if (i < [colorProfilesArray count]) - { - [colorProfilesArray removeObjectAtIndex:i]; - } - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)clearColorsForTag:(id )tag -{ - NSAssert([(id )tag conformsToProtocol:@protocol(NSCopying)], @"Invalid tag"); - - dispatch_block_t block = ^{ @autoreleasepool { - - [colorProfilesDict removeObjectForKey:tag]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)clearColorsForAllFlags -{ - dispatch_block_t block = ^{ @autoreleasepool { - - [colorProfilesArray removeAllObjects]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)clearColorsForAllTags -{ - dispatch_block_t block = ^{ @autoreleasepool { - - [colorProfilesDict removeAllObjects]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)clearAllColors -{ - dispatch_block_t block = ^{ @autoreleasepool { - - [colorProfilesArray removeAllObjects]; - [colorProfilesDict removeAllObjects]; - }}; - - // The design of the setter logic below is taken from the DDAbstractLogger implementation. - // For documentation please refer to the DDAbstractLogger implementation. - - if ([self isOnInternalLoggerQueue]) - { - block(); - } - else - { - dispatch_queue_t globalLoggingQueue = [DDLog loggingQueue]; - NSAssert(![self isOnGlobalLoggingQueue], @"Core architecture requirement failure"); - - dispatch_async(globalLoggingQueue, ^{ - dispatch_async(loggerQueue, block); - }); - } -} - -- (void)logMessage:(DDLogMessage *)logMessage -{ - NSString *logMsg = logMessage->logMsg; - BOOL isFormatted = NO; - - if (formatter) - { - logMsg = [formatter formatLogMessage:logMessage]; - isFormatted = logMsg != logMessage->logMsg; - } - - if (logMsg) - { - // Search for a color profile associated with the log message - - DDTTYLoggerColorProfile *colorProfile = nil; - - if (colorsEnabled) - { - if (logMessage->tag) - { - colorProfile = [colorProfilesDict objectForKey:logMessage->tag]; - } - if (colorProfile == nil) - { - for (DDTTYLoggerColorProfile *cp in colorProfilesArray) - { - if ((logMessage->logFlag & cp->mask) && (logMessage->logContext == cp->context)) - { - colorProfile = cp; - break; - } - } - } - } - - // Convert log message to C string. - // - // We use the stack instead of the heap for speed if possible. - // But we're extra cautious to avoid a stack overflow. - - NSUInteger msgLen = [logMsg lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - const BOOL useStack = msgLen < (1024 * 4); - - char msgStack[useStack ? (msgLen + 1) : 1]; // Analyzer doesn't like zero-size array, hence the 1 - char *msg = useStack ? msgStack : (char *)malloc(msgLen + 1); - if (msg == NULL) return; - - BOOL logMsgEnc = [logMsg getCString:msg maxLength:(msgLen + 1) encoding:NSUTF8StringEncoding]; - if (!logMsgEnc) - { - if (!useStack && msg != NULL) free(msg); - return; - } - - // Write the log message to STDERR - - if (isFormatted) - { - // The log message has already been formatted. - - struct iovec v[5]; - - if (colorProfile) - { - v[0].iov_base = colorProfile->fgCode; - v[0].iov_len = colorProfile->fgCodeLen; - - v[1].iov_base = colorProfile->bgCode; - v[1].iov_len = colorProfile->bgCodeLen; - - v[4].iov_base = colorProfile->resetCode; - v[4].iov_len = colorProfile->resetCodeLen; - } - else - { - v[0].iov_base = ""; - v[0].iov_len = 0; - - v[1].iov_base = ""; - v[1].iov_len = 0; - - v[4].iov_base = ""; - v[4].iov_len = 0; - } - - v[2].iov_base = (char *)msg; - v[2].iov_len = msgLen; - - v[3].iov_base = "\n"; - v[3].iov_len = (msg[msgLen] == '\n') ? 0 : 1; - - writev(STDERR_FILENO, v, 5); - } - else - { - // The log message is unformatted, so apply standard DDLogWarn style formatting. - - int len; - - // Calculate timestamp. - // The technique below is faster than using NSDateFormatter. - - NSDateComponents *components = [calendar components:calendarUnitFlags fromDate:logMessage->timestamp]; - - NSTimeInterval epoch = [logMessage->timestamp timeIntervalSinceReferenceDate]; - int milliseconds = (int)((epoch - floor(epoch)) * 1000); - - char ts[24]; - len = snprintf(ts, 24, "%04ld-%02ld-%02ld %02ld:%02ld:%02ld:%03d", // yyyy-MM-dd HH:mm:ss:SSS - (long)components.year, - (long)components.month, - (long)components.day, - (long)components.hour, - (long)components.minute, - (long)components.second, milliseconds); - - size_t tsLen = MIN(24-1, len); - - // Calculate thread ID - // - // How many characters do we need for the thread id? - // logMessage->machThreadID is of type mach_port_t, which is an unsigned int. - // - // 1 hex char = 4 bits - // 8 hex chars for 32 bit, plus ending '\0' = 9 - - char tid[9]; - len = snprintf(tid, 9, "%x", logMessage->machThreadID); - - size_t tidLen = MIN(9-1, len); - - // Here is our format: "%s %s[%i:%s] %s", timestamp, appName, processID, threadID, logMsg - - struct iovec v[13]; - - if (colorProfile) - { - v[0].iov_base = colorProfile->fgCode; - v[0].iov_len = colorProfile->fgCodeLen; - - v[1].iov_base = colorProfile->bgCode; - v[1].iov_len = colorProfile->bgCodeLen; - - v[12].iov_base = colorProfile->resetCode; - v[12].iov_len = colorProfile->resetCodeLen; - } - else - { - v[0].iov_base = ""; - v[0].iov_len = 0; - - v[1].iov_base = ""; - v[1].iov_len = 0; - - v[12].iov_base = ""; - v[12].iov_len = 0; - } - - v[2].iov_base = ts; - v[2].iov_len = tsLen; - - v[3].iov_base = " "; - v[3].iov_len = 1; - - v[4].iov_base = app; - v[4].iov_len = appLen; - - v[5].iov_base = "["; - v[5].iov_len = 1; - - v[6].iov_base = pid; - v[6].iov_len = pidLen; - - v[7].iov_base = ":"; - v[7].iov_len = 1; - - v[8].iov_base = tid; - v[8].iov_len = MIN((size_t)8, tidLen); // snprintf doesn't return what you might think - - v[9].iov_base = "] "; - v[9].iov_len = 2; - - v[10].iov_base = (char *)msg; - v[10].iov_len = msgLen; - - v[11].iov_base = "\n"; - v[11].iov_len = (msg[msgLen] == '\n') ? 0 : 1; - - writev(STDERR_FILENO, v, 13); - } - - if (!useStack) { - free(msg); - } - } -} - -- (NSString *)loggerName -{ - return @"cocoa.lumberjack.ttyLogger"; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation DDTTYLoggerColorProfile - -- (id)initWithForegroundColor:(OSColor *)fgColor backgroundColor:(OSColor *)bgColor flag:(int)aMask context:(int)ctxt -{ - if ((self = [super init])) - { - mask = aMask; - context = ctxt; - - CGFloat r, g, b; - - if (fgColor) - { - [DDTTYLogger getRed:&r green:&g blue:&b fromColor:fgColor]; - - fg_r = (uint8_t)(r * 255.0f); - fg_g = (uint8_t)(g * 255.0f); - fg_b = (uint8_t)(b * 255.0f); - } - if (bgColor) - { - [DDTTYLogger getRed:&r green:&g blue:&b fromColor:bgColor]; - - bg_r = (uint8_t)(r * 255.0f); - bg_g = (uint8_t)(g * 255.0f); - bg_b = (uint8_t)(b * 255.0f); - } - - if (fgColor && isaColorTTY) - { - // Map foreground color to closest available shell color - - fgCodeIndex = [DDTTYLogger codeIndexForColor:fgColor]; - fgCodeRaw = [codes_fg objectAtIndex:fgCodeIndex]; - - NSString *escapeSeq = @"\033["; - - NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - NSUInteger len2 = [fgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - - BOOL escapeSeqEnc = [escapeSeq getCString:(fgCode) maxLength:(len1+1) encoding:NSUTF8StringEncoding]; - BOOL fgCodeRawEsc = [fgCodeRaw getCString:(fgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding]; - if (!escapeSeqEnc || !fgCodeRawEsc) return nil; - - fgCodeLen = len1+len2; - } - else if (fgColor && isaXcodeColorTTY) - { - // Convert foreground color to color code sequence - - const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ; - - int result = snprintf(fgCode, 24, "%sfg%u,%u,%u;", escapeSeq, fg_r, fg_g, fg_b); - fgCodeLen = MIN(result, (24-1)); - } - else - { - // No foreground color or no color support - - fgCode[0] = '\0'; - fgCodeLen = 0; - } - - if (bgColor && isaColorTTY) - { - // Map background color to closest available shell color - - bgCodeIndex = [DDTTYLogger codeIndexForColor:bgColor]; - bgCodeRaw = [codes_bg objectAtIndex:bgCodeIndex]; - - NSString *escapeSeq = @"\033["; - - NSUInteger len1 = [escapeSeq lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - NSUInteger len2 = [bgCodeRaw lengthOfBytesUsingEncoding:NSUTF8StringEncoding]; - - BOOL escapeSeqEnc = [escapeSeq getCString:(bgCode) maxLength:(len1+1) encoding:NSUTF8StringEncoding]; - BOOL bgCodeRawEsc = [bgCodeRaw getCString:(bgCode+len1) maxLength:(len2+1) encoding:NSUTF8StringEncoding]; - if (!escapeSeqEnc || !bgCodeRawEsc) return nil; - - bgCodeLen = len1+len2; - } - else if (bgColor && isaXcodeColorTTY) - { - // Convert background color to color code sequence - - const char *escapeSeq = XCODE_COLORS_ESCAPE_SEQ; - - int result = snprintf(bgCode, 24, "%sbg%u,%u,%u;", escapeSeq, bg_r, bg_g, bg_b); - bgCodeLen = MIN(result, (24-1)); - } - else - { - // No background color or no color support - - bgCode[0] = '\0'; - bgCodeLen = 0; - } - - if (isaColorTTY) - { - resetCodeLen = snprintf(resetCode, 8, "\033[0m"); - } - else if (isaXcodeColorTTY) - { - resetCodeLen = snprintf(resetCode, 8, XCODE_COLORS_RESET); - } - else - { - resetCode[0] = '\0'; - resetCodeLen = 0; - } - } - return self; -} - -- (NSString *)description -{ - return [NSString stringWithFormat: - @"", - self, mask, context, fg_r, fg_g, fg_b, bg_r, bg_g, bg_b, fgCodeRaw, bgCodeRaw]; -} - -@end diff --git a/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.h b/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.h deleted file mode 100644 index dffc8657e..000000000 --- a/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.h +++ /dev/null @@ -1,65 +0,0 @@ -#import -#import "DDLog.h" - -@class ContextFilterLogFormatter; - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" page. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a log formatter that filters log statements from a logging context not on the whitelist. - * - * A log formatter can be added to any logger to format and/or filter its output. - * You can learn more about log formatters here: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters - * - * You can learn more about logging context's here: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomContext - * - * But here's a quick overview / refresher: - * - * Every log statement has a logging context. - * These come from the underlying logging macros defined in DDLog.h. - * The default logging context is zero. - * You can define multiple logging context's for use in your application. - * For example, logically separate parts of your app each have a different logging context. - * Also 3rd party frameworks that make use of Lumberjack generally use their own dedicated logging context. -**/ -@interface ContextWhitelistFilterLogFormatter : NSObject - -- (id)init; - -- (void)addToWhitelist:(int)loggingContext; -- (void)removeFromWhitelist:(int)loggingContext; - -- (NSArray *)whitelist; - -- (BOOL)isOnWhitelist:(int)loggingContext; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * This class provides a log formatter that filters log statements from a logging context on the blacklist. -**/ -@interface ContextBlacklistFilterLogFormatter : NSObject - -- (id)init; - -- (void)addToBlacklist:(int)loggingContext; -- (void)removeFromBlacklist:(int)loggingContext; - -- (NSArray *)blacklist; - -- (BOOL)isOnBlacklist:(int)loggingContext; - -@end diff --git a/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.m b/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.m deleted file mode 100644 index 9c024acc1..000000000 --- a/Source/Vendor/Lumberjack/Extensions/ContextFilterLogFormatter.m +++ /dev/null @@ -1,191 +0,0 @@ -#import "ContextFilterLogFormatter.h" -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - -@interface LoggingContextSet : NSObject - -- (void)addToSet:(int)loggingContext; -- (void)removeFromSet:(int)loggingContext; - -- (NSArray *)currentSet; - -- (BOOL)isInSet:(int)loggingContext; - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation ContextWhitelistFilterLogFormatter -{ - LoggingContextSet *contextSet; -} - -- (id)init -{ - if ((self = [super init])) - { - contextSet = [[LoggingContextSet alloc] init]; - } - return self; -} - - -- (void)addToWhitelist:(int)loggingContext -{ - [contextSet addToSet:loggingContext]; -} - -- (void)removeFromWhitelist:(int)loggingContext -{ - [contextSet removeFromSet:loggingContext]; -} - -- (NSArray *)whitelist -{ - return [contextSet currentSet]; -} - -- (BOOL)isOnWhitelist:(int)loggingContext -{ - return [contextSet isInSet:loggingContext]; -} - -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage -{ - if ([self isOnWhitelist:logMessage->logContext]) - return logMessage->logMsg; - else - return nil; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation ContextBlacklistFilterLogFormatter -{ - LoggingContextSet *contextSet; -} - -- (id)init -{ - if ((self = [super init])) - { - contextSet = [[LoggingContextSet alloc] init]; - } - return self; -} - - -- (void)addToBlacklist:(int)loggingContext -{ - [contextSet addToSet:loggingContext]; -} - -- (void)removeFromBlacklist:(int)loggingContext -{ - [contextSet removeFromSet:loggingContext]; -} - -- (NSArray *)blacklist -{ - return [contextSet currentSet]; -} - -- (BOOL)isOnBlacklist:(int)loggingContext -{ - return [contextSet isInSet:loggingContext]; -} - -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage -{ - if ([self isOnBlacklist:logMessage->logContext]) - return nil; - else - return logMessage->logMsg; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation LoggingContextSet -{ - OSSpinLock lock; - NSMutableSet *set; -} - -- (id)init -{ - if ((self = [super init])) - { - set = [[NSMutableSet alloc] init]; - } - return self; -} - - -- (void)addToSet:(int)loggingContext -{ - OSSpinLockLock(&lock); - { - [set addObject:@(loggingContext)]; - } - OSSpinLockUnlock(&lock); -} - -- (void)removeFromSet:(int)loggingContext -{ - OSSpinLockLock(&lock); - { - [set removeObject:@(loggingContext)]; - } - OSSpinLockUnlock(&lock); -} - -- (NSArray *)currentSet -{ - NSArray *result = nil; - - OSSpinLockLock(&lock); - { - result = [set allObjects]; - } - OSSpinLockUnlock(&lock); - - return result; -} - -- (BOOL)isInSet:(int)loggingContext -{ - BOOL result = NO; - - OSSpinLockLock(&lock); - { - result = [set containsObject:@(loggingContext)]; - } - OSSpinLockUnlock(&lock); - - return result; -} - -@end diff --git a/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.h b/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.h deleted file mode 100644 index 17aabf840..000000000 --- a/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.h +++ /dev/null @@ -1,116 +0,0 @@ -#import -#import -#import "DDLog.h" - - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" page. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted - * - * - * This class provides a log formatter that prints the dispatch_queue label instead of the mach_thread_id. - * - * A log formatter can be added to any logger to format and/or filter its output. - * You can learn more about log formatters here: - * https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters - * - * A typical DDLogWarn (or DDTTYLogger) prints detailed info as [:]. - * For example: - * - * 2011-10-17 20:21:45.435 AppName[19928:5207] Your log message here - * - * Where: - * - 19928 = process id - * - 5207 = thread id (mach_thread_id printed in hex) - * - * When using grand central dispatch (GCD), this information is less useful. - * This is because a single serial dispatch queue may be run on any thread from an internally managed thread pool. - * For example: - * - * 2011-10-17 20:32:31.111 AppName[19954:4d07] Message from my_serial_dispatch_queue - * 2011-10-17 20:32:31.112 AppName[19954:5207] Message from my_serial_dispatch_queue - * 2011-10-17 20:32:31.113 AppName[19954:2c55] Message from my_serial_dispatch_queue - * - * This formatter allows you to replace the standard [box:info] with the dispatch_queue name. - * For example: - * - * 2011-10-17 20:32:31.111 AppName[img-scaling] Message from my_serial_dispatch_queue - * 2011-10-17 20:32:31.112 AppName[img-scaling] Message from my_serial_dispatch_queue - * 2011-10-17 20:32:31.113 AppName[img-scaling] Message from my_serial_dispatch_queue - * - * If the dispatch_queue doesn't have a set name, then it falls back to the thread name. - * If the current thread doesn't have a set name, then it falls back to the mach_thread_id in hex (like normal). - * - * Note: If manually creating your own background threads (via NSThread/alloc/init or NSThread/detachNeThread), - * you can use [[NSThread currentThread] setName:(NSString *)]. -**/ -@interface DispatchQueueLogFormatter : NSObject { -@protected - - NSString *dateFormatString; -} - -/** - * Standard init method. - * Configure using properties as desired. -**/ -- (id)init; - -/** - * The minQueueLength restricts the minimum size of the [detail box]. - * If the minQueueLength is set to 0, there is no restriction. - * - * For example, say a dispatch_queue has a label of "diskIO": - * - * If the minQueueLength is 0: [diskIO] - * If the minQueueLength is 4: [diskIO] - * If the minQueueLength is 5: [diskIO] - * If the minQueueLength is 6: [diskIO] - * If the minQueueLength is 7: [diskIO ] - * If the minQueueLength is 8: [diskIO ] - * - * The default minQueueLength is 0 (no minimum, so [detail box] won't be padded). - * - * If you want every [detail box] to have the exact same width, - * set both minQueueLength and maxQueueLength to the same value. -**/ -@property (assign) NSUInteger minQueueLength; - -/** - * The maxQueueLength restricts the number of characters that will be inside the [detail box]. - * If the maxQueueLength is 0, there is no restriction. - * - * For example, say a dispatch_queue has a label of "diskIO": - * - * If the maxQueueLength is 0: [diskIO] - * If the maxQueueLength is 4: [disk] - * If the maxQueueLength is 5: [diskI] - * If the maxQueueLength is 6: [diskIO] - * If the maxQueueLength is 7: [diskIO] - * If the maxQueueLength is 8: [diskIO] - * - * The default maxQueueLength is 0 (no maximum, so [detail box] won't be truncated). - * - * If you want every [detail box] to have the exact same width, - * set both minQueueLength and maxQueueLength to the same value. -**/ -@property (assign) NSUInteger maxQueueLength; - -/** - * Sometimes queue labels have long names like "com.apple.main-queue", - * but you'd prefer something shorter like simply "main". - * - * This method allows you to set such preferred replacements. - * The above example is set by default. - * - * To remove/undo a previous replacement, invoke this method with nil for the 'shortLabel' parameter. -**/ -- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel; -- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel; - -@end diff --git a/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.m b/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.m deleted file mode 100644 index d348f3dc7..000000000 --- a/Source/Vendor/Lumberjack/Extensions/DispatchQueueLogFormatter.m +++ /dev/null @@ -1,251 +0,0 @@ -#import "DispatchQueueLogFormatter.h" -#import - -/** - * Welcome to Cocoa Lumberjack! - * - * The project page has a wealth of documentation if you have any questions. - * https://github.com/robbiehanson/CocoaLumberjack - * - * If you're new to the project you may wish to read the "Getting Started" wiki. - * https://github.com/robbiehanson/CocoaLumberjack/wiki/GettingStarted -**/ - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -#endif - - -@implementation DispatchQueueLogFormatter -{ - int32_t atomicLoggerCount; - NSDateFormatter *threadUnsafeDateFormatter; // Use [self stringFromDate] - - OSSpinLock lock; - - NSUInteger _minQueueLength; // _prefix == Only access via atomic property - NSUInteger _maxQueueLength; // _prefix == Only access via atomic property - NSMutableDictionary *_replacements; // _prefix == Only access from within spinlock -} - -- (id)init -{ - if ((self = [super init])) - { - dateFormatString = @"yyyy-MM-dd HH:mm:ss:SSS"; - - atomicLoggerCount = 0; - threadUnsafeDateFormatter = nil; - - _minQueueLength = 0; - _maxQueueLength = 0; - _replacements = [[NSMutableDictionary alloc] init]; - - // Set default replacements: - - [_replacements setObject:@"main" forKey:@"com.apple.main-thread"]; - } - return self; -} - - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Configuration -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@synthesize minQueueLength = _minQueueLength; -@synthesize maxQueueLength = _maxQueueLength; - -- (NSString *)replacementStringForQueueLabel:(NSString *)longLabel -{ - NSString *result = nil; - - OSSpinLockLock(&lock); - { - result = [_replacements objectForKey:longLabel]; - } - OSSpinLockUnlock(&lock); - - return result; -} - -- (void)setReplacementString:(NSString *)shortLabel forQueueLabel:(NSString *)longLabel -{ - OSSpinLockLock(&lock); - { - if (shortLabel) - [_replacements setObject:shortLabel forKey:longLabel]; - else - [_replacements removeObjectForKey:longLabel]; - } - OSSpinLockUnlock(&lock); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark DDLogFormatter -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (NSString *)stringFromDate:(NSDate *)date -{ - int32_t loggerCount = OSAtomicAdd32(0, &atomicLoggerCount); - - if (loggerCount <= 1) - { - // Single-threaded mode. - - if (threadUnsafeDateFormatter == nil) - { - threadUnsafeDateFormatter = [[NSDateFormatter alloc] init]; - [threadUnsafeDateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; - [threadUnsafeDateFormatter setDateFormat:dateFormatString]; - } - - return [threadUnsafeDateFormatter stringFromDate:date]; - } - else - { - // Multi-threaded mode. - // NSDateFormatter is NOT thread-safe. - - NSString *key = @"DispatchQueueLogFormatter_NSDateFormatter"; - - NSMutableDictionary *threadDictionary = [[NSThread currentThread] threadDictionary]; - NSDateFormatter *dateFormatter = [threadDictionary objectForKey:key]; - - if (dateFormatter == nil) - { - dateFormatter = [[NSDateFormatter alloc] init]; - [dateFormatter setFormatterBehavior:NSDateFormatterBehavior10_4]; - [dateFormatter setDateFormat:dateFormatString]; - - [threadDictionary setObject:dateFormatter forKey:key]; - } - - return [dateFormatter stringFromDate:date]; - } -} - -- (NSString *)queueThreadLabelForLogMessage:(DDLogMessage *)logMessage -{ - // As per the DDLogFormatter contract, this method is always invoked on the same thread/dispatch_queue - - NSUInteger minQueueLength = self.minQueueLength; - NSUInteger maxQueueLength = self.maxQueueLength; - - // Get the name of the queue, thread, or machID (whichever we are to use). - - NSString *queueThreadLabel = nil; - - BOOL useQueueLabel = YES; - BOOL useThreadName = NO; - - if (logMessage->queueLabel) - { - // If you manually create a thread, it's dispatch_queue will have one of the thread names below. - // Since all such threads have the same name, we'd prefer to use the threadName or the machThreadID. - - char *names[] = { "com.apple.root.low-priority", - "com.apple.root.default-priority", - "com.apple.root.high-priority", - "com.apple.root.low-overcommit-priority", - "com.apple.root.default-overcommit-priority", - "com.apple.root.high-overcommit-priority" }; - - int length = sizeof(names) / sizeof(char *); - - int i; - for (i = 0; i < length; i++) - { - if (strcmp(logMessage->queueLabel, names[i]) == 0) - { - useQueueLabel = NO; - useThreadName = [logMessage->threadName length] > 0; - break; - } - } - } - else - { - useQueueLabel = NO; - useThreadName = [logMessage->threadName length] > 0; - } - - if (useQueueLabel || useThreadName) - { - NSString *fullLabel; - NSString *abrvLabel; - - if (useQueueLabel) - fullLabel = @(logMessage->queueLabel); - else - fullLabel = logMessage->threadName; - - OSSpinLockLock(&lock); - { - abrvLabel = [_replacements objectForKey:fullLabel]; - } - OSSpinLockUnlock(&lock); - - if (abrvLabel) - queueThreadLabel = abrvLabel; - else - queueThreadLabel = fullLabel; - } - else - { - queueThreadLabel = [NSString stringWithFormat:@"%x", logMessage->machThreadID]; - } - - // Now use the thread label in the output - - NSUInteger labelLength = [queueThreadLabel length]; - - // labelLength > maxQueueLength : truncate - // labelLength < minQueueLength : padding - // : exact - - if ((maxQueueLength > 0) && (labelLength > maxQueueLength)) - { - // Truncate - - return [queueThreadLabel substringToIndex:maxQueueLength]; - } - else if (labelLength < minQueueLength) - { - // Padding - - NSUInteger numSpaces = minQueueLength - labelLength; - - char spaces[numSpaces + 1]; - memset(spaces, ' ', numSpaces); - spaces[numSpaces] = '\0'; - - return [NSString stringWithFormat:@"%@%s", queueThreadLabel, spaces]; - } - else - { - // Exact - - return queueThreadLabel; - } -} - -- (NSString *)formatLogMessage:(DDLogMessage *)logMessage -{ - NSString *timestamp = [self stringFromDate:(logMessage->timestamp)]; - NSString *queueThreadLabel = [self queueThreadLabelForLogMessage:logMessage]; - - return [NSString stringWithFormat:@"%@ [%@] %@", timestamp, queueThreadLabel, logMessage->logMsg]; -} - -- (void)didAddToLogger:(id )logger -{ - OSAtomicIncrement32(&atomicLoggerCount); -} - -- (void)willRemoveFromLogger:(id )logger -{ - OSAtomicDecrement32(&atomicLoggerCount); -} - -@end diff --git a/Source/Vendor/Lumberjack/Extensions/README.txt b/Source/Vendor/Lumberjack/Extensions/README.txt deleted file mode 100644 index eb20e5013..000000000 --- a/Source/Vendor/Lumberjack/Extensions/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -This folder contains some sample formatters that may be helpful. - -Feel free to change them, extend them, or use them as the basis for your own custom formatter(s). - -More information about creating your own custom formatters can be found on the wiki: -https://github.com/robbiehanson/CocoaLumberjack/wiki/CustomFormatters - diff --git a/XCodeProjectData/Demo-iOS/DetailViewController.m b/XCodeProjectData/Demo-iOS/DetailViewController.m deleted file mode 100644 index 84881701f..000000000 --- a/XCodeProjectData/Demo-iOS/DetailViewController.m +++ /dev/null @@ -1,587 +0,0 @@ -// -// DetailViewController.m -// iOSDemo -// -// Created by adam on 29/09/2012. -// Copyright (c) 2012 na. All rights reserved. -// -#import "DetailViewController.h" - -#import "MasterViewController.h" - -#import "NodeList+Mutable.h" - -#import "SVGKFastImageView.h" -#import "SVGKLayeredImageView.h" - -@interface DetailViewController () - -@property (nonatomic, retain) UIPopoverController *popoverController; - -- (void)loadResource:(NSString *)name; -- (void)shakeHead; - -@end - - -@implementation DetailViewController -@synthesize scrollViewForSVG; - -@synthesize toolbar, popoverController, contentView, detailItem; -@synthesize viewActivityIndicator; -@synthesize name = _name; -@synthesize exportText = _exportText; -@synthesize layerExporter = _layerExporter; -@synthesize tapGestureRecognizer = _tapGestureRecognizer; -@synthesize exportLog = _exportLog; - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - } - return self; -} - -- (void)dealloc { - self.popoverController = nil; - self.toolbar = nil; - self.detailItem = nil; - - self.name = nil; - self.exportText = nil; - self.exportLog = nil; - self.layerExporter = nil; - self.scrollViewForSVG = nil; - self.contentView = nil; - self.viewActivityIndicator = nil; - - [super dealloc]; -} - --(void)viewDidLoad -{ - self.navigationItem.rightBarButtonItems = [NSArray arrayWithObjects: - [[[UIBarButtonItem alloc] initWithTitle:@"Debug" style:UIBarButtonItemStyleBordered target:self action:@selector(showHideBorder:)] autorelease], - [[[UIBarButtonItem alloc] initWithTitle:@"Animate" style:UIBarButtonItemStyleBordered target:self action:@selector(animate:)] autorelease], - nil]; -} - -CALayer* lastTappedLayer; -CGFloat lastTappedLayerOriginalBorderWidth; -CGColorRef lastTappedLayerOriginalBorderColor; -CATextLayer *textLayerForLastTappedLayer; --(void) deselectTappedLayer -{ - if( lastTappedLayer != nil ) - { -#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING - if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) - { - [lastTappedLayer removeFromSuperlayer]; // nothing else needed - } - else -#endif - { - lastTappedLayer.borderWidth = lastTappedLayerOriginalBorderWidth; - lastTappedLayer.borderColor = lastTappedLayerOriginalBorderColor; - } - - [textLayerForLastTappedLayer removeFromSuperlayer]; - textLayerForLastTappedLayer = nil; - - lastTappedLayer = nil; - } -} - --(NSString*) layerInfo:(CALayer*) l -{ - return [NSString stringWithFormat:@"%@:%@", [l class], NSStringFromCGRect(l.frame)]; -} - -/** - Example of how to handle gaps on an SVG - */ --(void) handleTapGesture:(UITapGestureRecognizer*) recognizer -{ - CGPoint p = [recognizer locationInView:self.contentView]; - -#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! - SVGKImage* svgImage = nil; // ONLY used for the hacky code below that demonstrates how complex hit-testing is on an SVGKFastImageView - - /** - WARNING: - - Whenever you're using SVGKFastImageView, it "hides" the raw CALayers from you, and Apple - doesn't provide an easy way around this (we do it this way because there are missing methods - and bugs in Apple's UIScrollView, which SVGKFastImageView fixes). - - So, you cannot do a hittest on "SVGKFastImageView.layer" - that will always return the root, - empty, full-size layer. - - Instead, you have to hit-test the layer INSIDE the fast imageview. - - -------- - - HOWEVER: YOU SHOULD NOT BE DOING THIS! - - IF YOU NEED TO DO HIT-TESTING, USE SVGKLayeredImageView (as per the docs!) - - THE EXAMPLE CODE HERE SHOWS YOU HOW YOU COULD, IN THEORY, DO HIT-TESTING WITH EITHER, BUT IT - IS HIGHLY RECOMMENDED NEVER TO USE HIT-TESTING WITH SVGKFastImageView! - */ -#endif - CALayer* layerForHitTesting; - -#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! - if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) - { - layerForHitTesting = ((SVGKFastImageView*)self.contentView).image.CALayerTree; - svgImage = ((SVGKFastImageView*)self.contentView).image; - - /** - ALSO, because SVGKFastImageView DOES NOT ALTER the underlying layers when it zooms - (the zoom is handled "fast" and done internally at 100% accuracy), - any zoom will be ignored for the hit-test - we have to MANUALLY apply the zoom - */ - CGSize scaleConvertImageToViewForHitTest = CGSizeMake( self.contentView.bounds.size.width / svgImage.size.width, self.contentView.bounds.size.height / svgImage.size.height ); // this is a copy/paste of the internal "SCALING" logic used in SVGKFastImageView - - p = CGPointApplyAffineTransform( p, CGAffineTransformInvert( CGAffineTransformMakeScale( scaleConvertImageToViewForHitTest.width, scaleConvertImageToViewForHitTest.height)) ); // must do the OPPOSITE of the zoom (to convert the 'seeming' point to the 'actual' point - } - else -#endif - layerForHitTesting = self.contentView.layer; - - - CALayer* hitLayer = [layerForHitTesting hitTest:p]; - - if( hitLayer == lastTappedLayer ) - [self deselectTappedLayer]; // do this both ways, but have to do it AFTER the if-test because it nil's one of the if-phrases! - else - { - [self deselectTappedLayer]; // do this both ways, but have to do it AFTER the if-test because it nil's one of the if-phrases! - -#if ALLOW_SVGKFASTIMAGEVIEW_TO_DO_HIT_TESTING // look how much code this requires! It's insane! Use SVGKLayeredImageView instead if you need hit-testing! - self.title = @""; // reset it so that we can conditionally set it - but also ensuring this code is included in the #if - if( [self.contentView isKindOfClass:[SVGKFastImageView class]]) - { - /** NEVER DO THIS - this is a proof-of-concept, but instead you should ALWAYS - use SVGKLayeredImageView if you want to do hit-testing! - */ - self.title = @"WARNING: don't use SVGKFastImageView for hit-testing"; - - /** - Because SVGKFastImageView "hides" the layers, any visual changes we make - will NOT be reflected on-screen. - - Instead, we have to put a NEW layer over the top - */ - CALayer* absolutePositionedCloneLayer = [svgImage newCopyPositionedAbsoluteOfLayer:hitLayer]; - - lastTappedLayer = [[CALayer alloc] init]; - lastTappedLayer.frame = absolutePositionedCloneLayer.frame; - [absolutePositionedCloneLayer release]; - - /** - ALSO, because SVGKFastImageView DOES NOT ALTER the underlying layers when it zooms - (the zoom is handled "fast" and done internally at 100% accuracy), - any zoom will be ignored for the new layer - we have to MANUALLY apply the zoom - */ - CGSize scaleConvertImageToView = CGSizeMake( self.contentView.bounds.size.width / svgImage.size.width, self.contentView.bounds.size.height / svgImage.size.height ); // this is a copy/paste of the internal "SCALING" logic used in SVGKFastImageView - lastTappedLayer.frame = CGRectApplyAffineTransform( lastTappedLayer.frame, CGAffineTransformMakeScale(scaleConvertImageToView.width, scaleConvertImageToView.height)); - - [self.contentView.layer addSublayer:lastTappedLayer]; - } - else -#endif - lastTappedLayer = hitLayer; - - if( lastTappedLayer != nil ) - { - lastTappedLayerOriginalBorderColor = lastTappedLayer.borderColor; - lastTappedLayerOriginalBorderWidth = lastTappedLayer.borderWidth; - - lastTappedLayer.borderColor = [UIColor greenColor].CGColor; - lastTappedLayer.borderWidth = 3.0; - -#if SHOW_DEBUG_INFO_ON_EACH_TAPPED_LAYER - /** mtrubnikov's code for adding a text overlay showing exactly what you tapped - */ - NSString* textToDraw = [NSString stringWithFormat:@"%@ (%@): {%.1f, %.1f} {%.1f, %.1f}", hitLayer.name, [hitLayer class], lastTappedLayer.frame.origin.x, lastTappedLayer.frame.origin.y, lastTappedLayer.frame.size.width, lastTappedLayer.frame.size.height]; - - UIFont* fontToDraw = [UIFont fontWithName:@"Helvetica" - size:14.0f]; - CGSize sizeOfTextRect = [textToDraw sizeWithFont:fontToDraw]; - - textLayerForLastTappedLayer = [[[CATextLayer alloc] init] autorelease]; - [textLayerForLastTappedLayer setFont:@"Helvetica"]; - [textLayerForLastTappedLayer setFontSize:14.0f]; - [textLayerForLastTappedLayer setFrame:CGRectMake(0, 0, sizeOfTextRect.width, sizeOfTextRect.height)]; - [textLayerForLastTappedLayer setString:textToDraw]; - [textLayerForLastTappedLayer setAlignmentMode:kCAAlignmentLeft]; - [textLayerForLastTappedLayer setForegroundColor:[UIColor redColor].CGColor]; - [textLayerForLastTappedLayer setContentsScale:[[UIScreen mainScreen] scale]]; - [textLayerForLastTappedLayer setShouldRasterize:NO]; - [self.contentView.layer addSublayer:textLayerForLastTappedLayer]; - /* - * mtrubnikov's code for adding a text overlay showing exactly what you tapped*/ -#endif - } - } -} - -#pragma mark - CRITICAL: this method makes Apple render SVGs in sharp focus - --(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)finalScale -{ - /** NB: very important! The "finalScale" paramter to this method is SLIGHTLY DIFFERENT from the scale that Apple reports in the other delegate methods - - This is very confusing, clearly it's bit of a hack - the other methods get called - at slightly the wrong time, and so their data is slightly wrong (out-by-one animation step). - - ONLY the values passed as params to this method are correct! - */ - - /** - - Apple's implementation of zooming is EXTREMELY poorly designed; it's a hack onto a class - that was only designed to do panning (hence the name: uiSCROLLview) - - So ... "zooming" via a UIScrollView is NOT integrated with UIView - rendering - in a UIView subclass, you CANNOT KNOW whether you have been "zoomed" - (i.e.: had your view contents ruined horribly by Apple's class) - - The three lines that follow are - allegedly - Apple's preferred way of handling - the situation. Note that we DO NOT SET view.frame! According to official docs, - view.frame is UNDEFINED (this is very worrying, breaks a huge amount of UIKit-related code, - but that's how Apple has documented / implemented it!) - */ - view.transform = CGAffineTransformIdentity; // this alters view.frame! But *not* view.bounds - view.bounds = CGRectApplyAffineTransform( view.bounds, CGAffineTransformMakeScale(finalScale, finalScale)); - [view setNeedsDisplay]; - - /** - Workaround for another bug in Apple's hacks for UIScrollView: - - - when you reset the transform, as advised by Apple, you "break" Apple's memory of the scroll factor. - ... because they "forgot" to store it anywhere (they read your view.transform as if it were a private - variable inside UIScrollView! This causes MANY bugs in applications :( ) - */ - self.scrollViewForSVG.minimumZoomScale /= finalScale; - self.scrollViewForSVG.maximumZoomScale /= finalScale; -} - -#pragma mark - rest of class - -- (void)setDetailItem:(id)newDetailItem { - if (detailItem != newDetailItem) { - [self deselectTappedLayer]; // do this first because it DEPENDS UPON the type of self.contentView BEFORE the change in value - - [detailItem release]; - detailItem = [newDetailItem retain]; - - // FIXME: re-write this class so that this method does NOT require self.view to exist - [self view]; // Apple's design to trigger the creation of view. Original design of THIS class is that it breaks if view isn't already existing - [self loadResource:newDetailItem]; - } - - if (self.popoverController) { - [self.popoverController dismissPopoverAnimated:YES]; - } -} - -- (void)loadResource:(NSString *)name -{ - [self.viewActivityIndicator startAnimating]; - [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]]; // makes the animation appear - - SVGKImageView* newContentView = nil; - BOOL thisImageRequiresLayeredImageView = false; - CGSize customSizeForImage = CGSizeZero; - -#if ALLOW_2X_STYLE_SCALING_OF_SVGS_AS_AN_EXAMPLE - BOOL shouldScaleTimesTwo = false; - if( [name hasSuffix:@"@2x"]) - { - name = [name substringToIndex:name.length - @"@2x".length]; - shouldScaleTimesTwo = true; - thisImageRequiresLayeredImageView = true; - } -#endif - - if( [name hasSuffix:@"@160x240"]) - { - name = [name substringToIndex:name.length - @"@160x240".length]; - customSizeForImage = CGSizeMake( 160, 240 ); - } - - if( - [name isEqualToString:@"Monkey"] // Monkey uses layer-animations, so REQUIRES the layered version of SVGKImageView - || [name isEqualToString:@"RainbowWing"] // RainbodWing uses gradient-fills, so REQUIRES the layered version of SVGKImageView - ) - { - /** - - NB: special-case handling here -- this is included AS AN EXAMPLE so you can see the differences. - - MONKEY.SVG -- CAAnimation of layers - ----- - The problem: Apple's code doesn't allow us to support CoreAnimation *and* make image loading easy. - The solution: there are two versions of SVGKImageView - a "normal" one, and a "weaker one that supports CoreAnimation" - - In this demo, we setup the Monkey.SVG to allow layer-based animation... - - - RAINBOWWING.SVG -- Gradient-fills of shapes - ----- - The problem: Apple's renderInContext has a major bug where it ignores CALayer masks - The solution: there are two versions of SVGKImageView - a "normal" one, and a "weaker one that doesnt use renderInContext" - - */ - thisImageRequiresLayeredImageView = true; - } - - /** Detect the magic name(s) for the nil-demos */ - if( [name isEqualToString:@"nil-demo-layered-imageview"]) - { - /** This demonstrates / tests what happens if you create an SVGKLayeredImageView with a nil SVGKImage - - NB: this is what Apple's InterfaceBuilder / Xcode 4 FORCES YOU TO DO because of massive bugs in Xcode 4! - */ - newContentView = [[[SVGKLayeredImageView alloc] initWithCoder:nil] autorelease]; - } - else - { - /** - FINALLY: - - the actual loading of the SVG file and making a view to display it! - */ - - SVGKImage *document = nil; - - /** Detect URL vs file */ - if( [name hasPrefix:@"http://"]) - { - document = [SVGKImage imageWithContentsOfURL:[NSURL URLWithString:name]]; - } - else - document = [SVGKImage imageNamed:[name stringByAppendingPathExtension:@"svg"]]; - -#if ALLOW_2X_STYLE_SCALING_OF_SVGS_AS_AN_EXAMPLE - if( shouldScaleTimesTwo ) - document.scale = 2.0; -#endif - - if( document == nil ) - { - [[[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:@"Total failure. See console log" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease] show]; - newContentView = nil; // signals to the rest of this method: the load failed - } - else - { - if( document.parseErrorsAndWarnings.rootOfSVGTree != nil ) - { - //NSLog(@"[%@] Freshly loaded document (name = %@) has size = %@", [self class], name, NSStringFromCGSize(document.size) ); - - /** NB: the SVG Spec says that the "correct" way to upscale or downscale an SVG is by changing the - SVG Viewport. SVGKit automagically does this for you if you ever set a value to image.scale */ - if( ! CGSizeEqualToSize( CGSizeZero, customSizeForImage ) ) - document.size = customSizeForImage; // preferred way to scale an SVG! (standards compliant!) - - if( thisImageRequiresLayeredImageView ) - { - newContentView = [[[SVGKLayeredImageView alloc] initWithSVGKImage:document] autorelease]; - } - else - { - newContentView = [[[SVGKFastImageView alloc] initWithSVGKImage:document] autorelease]; - - NSLog(@"[%@] WARNING: workaround for Apple bugs: UIScrollView spams tiny changes to the transform to the content view; currently, we have NO WAY of efficiently measuring whether or not to re-draw the SVGKImageView. As a temporary solution, we are DISABLING the SVGKImageView's auto-redraw-at-higher-resolution code - in general, you do NOT want to do this", [self class]); - - ((SVGKFastImageView*)newContentView).disableAutoRedrawAtHighestResolution = TRUE; - } - } - else - { - [[[[UIAlertView alloc] initWithTitle:@"SVG parse failed" message:[NSString stringWithFormat:@"%i fatal errors, %i warnings. First fatal = %@",[document.parseErrorsAndWarnings.errorsFatal count],[document.parseErrorsAndWarnings.errorsRecoverable count]+[document.parseErrorsAndWarnings.warnings count], ((NSError*)[document.parseErrorsAndWarnings.errorsFatal objectAtIndex:0]).localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] autorelease] show]; - newContentView = nil; // signals to the rest of this method: the load failed - - } - } - } - - if( newContentView != nil ) - { - /** - * NB: at this point we're guaranteed to have a "new" replacemtent ready for self.contentView - */ - - /** Move the gesture recognizer off the old view */ - if( self.contentView != nil - && self.tapGestureRecognizer != nil ) - [self.contentView removeGestureRecognizer:self.tapGestureRecognizer]; - - [self.contentView removeFromSuperview]; - - /******* swap the new contentview in ************/ - self.contentView = newContentView; - - - /** set the border for new item */ - self.contentView.showBorder = FALSE; - - /** Move the gesture recognizer onto the new one */ - if( self.tapGestureRecognizer == nil ) - { - self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; - } - [self.contentView addGestureRecognizer:self.tapGestureRecognizer]; - - if (_name) { - [_name release]; - _name = nil; - } - - _name = [name copy]; - - [self.scrollViewForSVG addSubview:self.contentView]; - [self.scrollViewForSVG setContentSize: self.contentView.frame.size]; - - float screenToDocumentSizeRatio = self.scrollViewForSVG.frame.size.width / self.contentView.frame.size.width; - - self.scrollViewForSVG.minimumZoomScale = MIN( 1, screenToDocumentSizeRatio ); - self.scrollViewForSVG.maximumZoomScale = MAX( 1, screenToDocumentSizeRatio ); - - /** - EXAMPLE: - - How to find particular nodes in the tree, after parsing. - - In this case, we search for all SVG tags, which usually mean grouped-objects in Inkscape etc: - NodeList* elementsUsingTagG = [document.DOMDocument getElementsByTagName:@"g"]; - NSLog( @"[%@] checking for SVG standard set of elements with XML tag/node of : %@", [self class], elementsUsingTagG.internalArray ); - */ - } - - [self.viewActivityIndicator stopAnimating]; -} - -- (IBAction)animate:(id)sender { - if ([_name isEqualToString:@"Monkey"]) { - [self shakeHead]; - } -} - - -- (void)shakeHead { - CALayer *layer = [self.contentView.image layerWithIdentifier:@"head"]; - - CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; - animation.duration = 0.25f; - animation.autoreverses = YES; - animation.repeatCount = 100000; - animation.fromValue = [NSNumber numberWithFloat:0.1f]; - animation.toValue = [NSNumber numberWithFloat:-0.1f]; - - [layer addAnimation:animation forKey:@"shakingHead"]; -} - -- (IBAction) showHideBorder:(id)sender -{ - self.contentView.showBorder = ! self.contentView.showBorder; - - /** - NB: normally, the following would NOT be needed - the SVGKImageView would automatically - detect it needs to be re-drawn. - - But ... because we're doing zooming in this class, and Apple's zooming causes huge performance problems, - we disabled the auto-redraw in the loadResource: method above. - - So, now, we have to manually tell the SVGKImageView to redraw - */ - [self.contentView setNeedsDisplay]; -} - -#pragma mark - Split view - -- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)argumentPopoverController -{ - barButtonItem.title = NSLocalizedString(@"Master", @"Master"); - [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; - self.popoverController = argumentPopoverController; -} - -- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem -{ - // Called when the view is shown again in the split view, invalidating the button and popover controller. - [self.navigationItem setLeftBarButtonItem:nil animated:YES]; - self.popoverController = nil; -} - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return YES; -} - -- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView -{ - return self.contentView; -} - -#pragma mark Export - - -- (IBAction)exportLayers:(id)sender { - if (_layerExporter) { - return; - } - _layerExporter = [[CALayerExporter alloc] initWithView:contentView]; - _layerExporter.delegate = self; - - UITextView* textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, 400, 400)]; - UIViewController* textViewController = [[[UIViewController alloc] init] autorelease]; - [textViewController setView:textView]; - UIPopoverController* exportPopover = [[UIPopoverController alloc] initWithContentViewController:textViewController]; - [exportPopover setDelegate:self]; - [exportPopover presentPopoverFromBarButtonItem:sender - permittedArrowDirections:UIPopoverArrowDirectionAny - animated:YES]; - - _exportText = textView; - _exportText.text = @"exporting..."; - - _exportLog = [[NSMutableString alloc] init]; - [_layerExporter startExport]; -} - -- (void) layerExporter:(CALayerExporter*)exporter didParseLayer:(CALayer*)layer withStatement:(NSString*)statement -{ - //NSLog(@"%@", statement); - [_exportLog appendString:statement]; - [_exportLog appendString:@"\n"]; -} - -- (void)layerExporterDidFinish:(CALayerExporter *)exporter -{ - _exportText.text = _exportLog; -} - -- (void)popoverControllerDidDismissPopover:(UIPopoverController *)pc -{ - [_exportText release]; - _exportText = nil; - - [_layerExporter release]; - _layerExporter = nil; - - [pc release]; -} - - -- (void)viewDidUnload { - [super viewDidUnload]; -} - - - -@end diff --git a/XCodeProjectData/Demo-iOS/en.lproj/iPhoneDetailViewController.xib b/XCodeProjectData/Demo-iOS/en.lproj/iPhoneDetailViewController.xib deleted file mode 100644 index 8c546c33a..000000000 --- a/XCodeProjectData/Demo-iOS/en.lproj/iPhoneDetailViewController.xib +++ /dev/null @@ -1,276 +0,0 @@ - - - - 1536 - 12B19 - 2840 - 1187 - 624.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 1926 - - - IBProxyObject - IBUIActivityIndicatorView - IBUILabel - IBUIScrollView - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - - - 274 - - - - 274 - - - - 292 - {{71, 200}, {179, 21}} - - - _NS:9 - NO - YES - 7 - NO - IBCocoaTouchFramework - Loading, please wait - - 1 - MCAwIDAAA - darkTextColor - - - 0 - - 1 - 17 - - - Helvetica - 17 - 16 - - NO - - - {320, 504} - - - _NS:9 - - 3 - MC42NjY2NjY2NjY3AA - - IBCocoaTouchFramework - - - {320, 504} - - - _NS:9 - YES - YES - - IBUIScreenMetrics - - YES - - - - - - {320, 568} - {568, 320} - - - IBCocoaTouchFramework - Retina 4 Full Screen - 2 - - IBCocoaTouchFramework - NO - - - - 292 - {{141, 256}, {37, 37}} - - _NS:9 - NO - IBCocoaTouchFramework - YES - 0 - - 1 - MC4wMDYxMzA2NzIwMTYgMC4zMDE0NjA1OTc4IDAAA - - - - {{0, 64}, {320, 504}} - - - - 3 - MQA - - 2 - - - - - NO - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - contentView - - - - 43 - - - - scrollViewForSVG - - - - 44 - - - - viewActivityIndicator - - - - 48 - - - - delegate - - - - 65 - - - - - - 0 - - - - - - 1 - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 25 - - - - - - - - 26 - - - - - - - - 38 - - - - - - 45 - - - - - - - DetailViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - SVGKFastImageView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 68 - - - 0 - IBCocoaTouchFramework - YES - 3 - 1926 - - diff --git a/XCodeProjectData/SVGKit-iOS/SVGKit-iOS-Prefix.pch b/XCodeProjectData/SVGKit-iOS/SVGKit-iOS-Prefix.pch deleted file mode 100644 index 42d279f6d..000000000 --- a/XCodeProjectData/SVGKit-iOS/SVGKit-iOS-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'SVGKit-iOS' target in the 'SVGKit-iOS' project -// - -#ifdef __OBJC__ - #import - #import "DDLog.h" - - #if DEBUG - static const int ddLogLevel = LOG_LEVEL_VERBOSE; - #else - static const int ddLogLevel = LOG_LEVEL_WARN; - #endif -#endif \ No newline at end of file