From 68e35b9bdef516653ba4e28b6b9d3c2fd8b04019 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 21:55:25 +0100 Subject: [PATCH 001/136] [SL.Core] Initial commit --- .gitignore | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++++ LICENSE | 201 +++++++++++++++++++++++++++++++++++++ README.md | 2 + 3 files changed, 491 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..940794e60f --- /dev/null +++ b/.gitignore @@ -0,0 +1,288 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..8dada3edaf --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..6352287055 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Primitives +Point, Rectangle, Size Primitives for use across SixLabors libraries. From 979573d395aedd56fa34b26c073745027e989f47 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:13:20 +0100 Subject: [PATCH 002/136] [SL.Core] initial primitive --- .editorconfig | 3 + SixLabors.Primitives.ruleset | 6 + SixLabors.Primitives.sln | 71 + SixLabors.Primitives.sln.DotSettings | 5 + appveyor.yml | 31 + build.cmd | 38 + codecov.yml | 21 + gitversion.yml | 13 + src/Shared/AssemblyInfo.Common.cs | 38 + src/Shared/stylecop.json | 9 + src/SixLabors.Primitives/Constants.cs | 18 + src/SixLabors.Primitives/Ellipse.cs | 183 +++ src/SixLabors.Primitives/LongRational.cs | 355 +++++ src/SixLabors.Primitives/MathF.cs | 293 +++++ src/SixLabors.Primitives/Matrix.cs | 360 ++++++ src/SixLabors.Primitives/Point.cs | 257 ++++ src/SixLabors.Primitives/PointF.cs | 233 ++++ src/SixLabors.Primitives/Rational.cs | 189 +++ src/SixLabors.Primitives/Rectangle.cs | 467 +++++++ src/SixLabors.Primitives/RectangleF.cs | 400 ++++++ src/SixLabors.Primitives/SignedRational.cs | 189 +++ .../SixLabors.Primitives.csproj | 40 + src/SixLabors.Primitives/Size.cs | 225 ++++ src/SixLabors.Primitives/SizeF.cs | 190 +++ src/SixLabors.Primitives/stylecop.json | 9 + tests/CodeCoverage/CodeCoverage.cmd | 21 + .../OpenCover.4.6.519/License.rtf | 166 +++ .../MSBuild/OpenCover.MSBuild.dll | Bin 0 -> 10240 bytes .../MSBuild/OpenCover.targets | 10 + .../SampleSln/.nuget/packages.config | 6 + .../SampleSln/Bom/Bom.csproj | 53 + .../SampleSln/Bom/BomManager.cs | 17 + .../SampleSln/Bom/Properties/AssemblyInfo.cs | 36 + .../OpenCover.4.6.519/SampleSln/BomSample.sln | 31 + .../SampleSln/BomTest/BomManagerTests.cs | 39 + .../SampleSln/BomTest/BomTest.csproj | 65 + .../BomTest/Properties/AssemblyInfo.cs | 36 + .../SampleSln/BomTest/packages.config | 4 + .../OpenCover.4.6.519/SampleSln/coverage.bat | 5 + .../OpenCover.4.6.519/docs/ReleaseNotes.txt | 137 ++ .../OpenCover.4.6.519/docs/Usage.rtf | 1138 +++++++++++++++++ .../CodeCoverage/OpenCover.4.6.519/readme.txt | 21 + .../tools/Autofac.Configuration.dll | Bin 0 -> 40448 bytes .../OpenCover.4.6.519/tools/Autofac.dll | Bin 0 -> 203264 bytes .../tools/CrashReporter.NET.dll | Bin 0 -> 109056 bytes .../tools/Gendarme.Framework.dll | Bin 0 -> 84992 bytes .../tools/Gendarme.Rules.Maintainability.dll | Bin 0 -> 36352 bytes .../tools/Mono.Cecil.Mdb.dll | Bin 0 -> 45056 bytes .../tools/Mono.Cecil.Pdb.dll | Bin 0 -> 81920 bytes .../OpenCover.4.6.519/tools/Mono.Cecil.dll | Bin 0 -> 280576 bytes .../tools/OpenCover.Console.exe | Bin 0 -> 80384 bytes .../tools/OpenCover.Console.exe.config | 26 + .../tools/OpenCover.Extensions.dll | Bin 0 -> 11264 bytes .../tools/OpenCover.Framework.dll | Bin 0 -> 151040 bytes .../OpenCover.4.6.519/tools/log4net.config | 39 + .../OpenCover.4.6.519/tools/log4net.dll | Bin 0 -> 301056 bytes .../transform/simple_report.xslt | 332 +++++ .../OpenCover.4.6.519/transform/transform.ps1 | 17 + tests/CodeCoverage/packages.config | 4 + .../SixLabors.Primitives.Tests/PointFTests.cs | 192 +++ .../SixLabors.Primitives.Tests/PointTests.cs | 252 ++++ .../RationalTests.cs | 115 ++ .../RectangleFTests.cs | 267 ++++ .../RectangleTests.cs | 308 +++++ .../SignedRationalTests.cs | 122 ++ .../SixLabors.Primitives.Tests.csproj | 34 + .../SixLabors.Primitives.Tests/SizeFTests.cs | 163 +++ tests/SixLabors.Primitives.Tests/SizeTests.cs | 195 +++ 68 files changed, 7494 insertions(+) create mode 100644 .editorconfig create mode 100644 SixLabors.Primitives.ruleset create mode 100644 SixLabors.Primitives.sln create mode 100644 SixLabors.Primitives.sln.DotSettings create mode 100644 appveyor.yml create mode 100644 build.cmd create mode 100644 codecov.yml create mode 100644 gitversion.yml create mode 100644 src/Shared/AssemblyInfo.Common.cs create mode 100644 src/Shared/stylecop.json create mode 100644 src/SixLabors.Primitives/Constants.cs create mode 100644 src/SixLabors.Primitives/Ellipse.cs create mode 100644 src/SixLabors.Primitives/LongRational.cs create mode 100644 src/SixLabors.Primitives/MathF.cs create mode 100644 src/SixLabors.Primitives/Matrix.cs create mode 100644 src/SixLabors.Primitives/Point.cs create mode 100644 src/SixLabors.Primitives/PointF.cs create mode 100644 src/SixLabors.Primitives/Rational.cs create mode 100644 src/SixLabors.Primitives/Rectangle.cs create mode 100644 src/SixLabors.Primitives/RectangleF.cs create mode 100644 src/SixLabors.Primitives/SignedRational.cs create mode 100644 src/SixLabors.Primitives/SixLabors.Primitives.csproj create mode 100644 src/SixLabors.Primitives/Size.cs create mode 100644 src/SixLabors.Primitives/SizeF.cs create mode 100644 src/SixLabors.Primitives/stylecop.json create mode 100644 tests/CodeCoverage/CodeCoverage.cmd create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/License.rtf create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/readme.txt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt create mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 create mode 100644 tests/CodeCoverage/packages.config create mode 100644 tests/SixLabors.Primitives.Tests/PointFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/PointTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RationalTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RectangleFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/RectangleTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SignedRationalTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj create mode 100644 tests/SixLabors.Primitives.Tests/SizeFTests.cs create mode 100644 tests/SixLabors.Primitives.Tests/SizeTests.cs diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..f39b267256 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +[*.cs] +indent_style = space +indent_size = 4 diff --git a/SixLabors.Primitives.ruleset b/SixLabors.Primitives.ruleset new file mode 100644 index 0000000000..4106b892cf --- /dev/null +++ b/SixLabors.Primitives.ruleset @@ -0,0 +1,6 @@ + + + + + + diff --git a/SixLabors.Primitives.sln b/SixLabors.Primitives.sln new file mode 100644 index 0000000000..1d728f98c2 --- /dev/null +++ b/SixLabors.Primitives.sln @@ -0,0 +1,71 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26430.6 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + appveyor.yml = appveyor.yml + build.cmd = build.cmd + README.md = README.md + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A07-F879-4811-9C41-5CBDC6BAFDB7}" + ProjectSection(SolutionItems) = preProject + src\Shared\AssemblyInfo.Common.cs = src\Shared\AssemblyInfo.Common.cs + src\Shared\stylecop.json = src\Shared\stylecop.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.Build.0 = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.Build.0 = Debug|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.ActiveCfg = Release|Any CPU + {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.Build.0 = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.Build.0 = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {999EDFB3-9FE4-4E09-B669-CB02E597EC20} = {9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D} + {87E262FA-57FE-4AA7-853C-9DD91E769D4B} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {32D7A12E-B392-42CE-8EFB-1B685680F5B8} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} + EndGlobalSection + GlobalSection(Performance) = preSolution + HasPerformanceSessions = true + EndGlobalSection +EndGlobal diff --git a/SixLabors.Primitives.sln.DotSettings b/SixLabors.Primitives.sln.DotSettings new file mode 100644 index 0000000000..613ba38826 --- /dev/null +++ b/SixLabors.Primitives.sln.DotSettings @@ -0,0 +1,5 @@ + + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW + DO_NOT_SHOW \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..e534e5855f --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,31 @@ +version: 0.0.{build} +image: Visual Studio 2017 + +install: + - choco install gitversion.portable -pre -y + +before_build: + - cmd: dotnet --version + - ps: gitversion /l console /output buildserver + +build_script: + - cmd: build.cmd + - cmd: tests\CodeCoverage\CodeCoverage.cmd + +after_build: + - cmd: appveyor PushArtifact "artifacts\SixLabors.Primitives.%GitVersion_NuGetVersion%.nupkg" + +deploy: + - provider: NuGet + server: https://www.myget.org/F/sixlabors/api/v2/package + symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package + api_key: + secure: SyrSERGrjkK21TSCsHtqke5279SMxXCg2NXKjR2qaErP0khEplwxPwE8Ch5bxzyf + artifact: /.*\.nupkg/ + on: + branch: master + +# prevent the double build when a branch has an active PR +skip_branch_with_pr: true + +test: off diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000000..727bdf8807 --- /dev/null +++ b/build.cmd @@ -0,0 +1,38 @@ +@echo Off + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet restore /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet restore +) + +ECHO Building nuget packages +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet build -c Release +) +if not "%errorlevel%"=="0" goto failure + +dotnet test ./tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj + + +if not "%GitVersion_NuGetVersion%" == "" ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% +)ELSE ( + dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build +) + +if not "%errorlevel%"=="0" goto failure + +:success +ECHO successfully built project +REM exit 0 +goto end + +:failure +ECHO failed to build. +REM exit -1 +goto end + +:end \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000..cadf5c5da6 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,21 @@ +codecov: + notify: + require_ci_to_pass: true +comment: off +coverage: + precision: 2 + range: + - 70.0 + - 100.0 + round: down + status: + changes: false + patch: true + project: true +parsers: + gcov: + branch_detection: + conditional: true + loop: true + macro: false + method: false \ No newline at end of file diff --git a/gitversion.yml b/gitversion.yml new file mode 100644 index 0000000000..e07c90f0d9 --- /dev/null +++ b/gitversion.yml @@ -0,0 +1,13 @@ +# to create a new package you create a new release/tag +# in github appveyor will build it without the -cixxx tag +# it will then be deployable cleanly to nuget.org + +branches: + master: + tag: ci + mode: ContinuousDeployment + increment: Minor + prevent-increment-of-merged-branch-version: false + track-merge-target: true +ignore: + sha: [] \ No newline at end of file diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs new file mode 100644 index 0000000000..081b019941 --- /dev/null +++ b/src/Shared/AssemblyInfo.Common.cs @@ -0,0 +1,38 @@ +// +// Copyright (c) Scott Williams and contributors. +// Licensed under the Apache License, Version 2.0. +// + +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyDescription("A cross-platform library for processing of image files; written in C#")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Scott Williams")] +[assembly: AssemblyProduct("SixLabors.Shapes")] +[assembly: AssemblyCopyright("Copyright (c) Scott Williams and contributors.")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: NeutralResourcesLanguage("en")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyInformationalVersion("1.0.0.0")] + +// Ensure the internals can be tested. +[assembly: InternalsVisibleTo("SixLabors.Shapes.Tests")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Benchmarks")] diff --git a/src/Shared/stylecop.json b/src/Shared/stylecop.json new file mode 100644 index 0000000000..df3c8c9d8c --- /dev/null +++ b/src/Shared/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Scott Williams", + "copyrightText": "Copyright (c) Scott Williams and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Constants.cs b/src/SixLabors.Primitives/Constants.cs new file mode 100644 index 0000000000..44f68f8988 --- /dev/null +++ b/src/SixLabors.Primitives/Constants.cs @@ -0,0 +1,18 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + /// + /// Common constants used throughout the project + /// + internal static class Constants + { + /// + /// The epsilon for comparing floating point numbers. + /// + public static readonly float Epsilon = 0.001f; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs new file mode 100644 index 0000000000..d5611bb233 --- /dev/null +++ b/src/SixLabors.Primitives/Ellipse.cs @@ -0,0 +1,183 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + + /// + /// Represents an ellipse. + /// + public struct Ellipse : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Ellipse Empty = default(Ellipse); + + /// + /// The center point. + /// + private Point center; + + /// + /// Initializes a new instance of the struct. + /// + /// The center point. + /// The x-radius. + /// The y-radius. + public Ellipse(Point center, float radiusX, float radiusY) + { + this.center = center; + this.RadiusX = radiusX; + this.RadiusY = radiusY; + } + + /// + /// Gets the x-radius of this . + /// + public float RadiusX { get; } + + /// + /// Gets the y-radius of this . + /// + public float RadiusY { get; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + public static bool operator ==(Ellipse left, Ellipse right) + { + return left.Equals(right); + } + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + public static bool operator !=(Ellipse left, Ellipse right) + { + return !left.Equals(right); + } + + /// + /// Returns the center point of the given + /// + /// The ellipse + /// + public static Vector2 Center(Ellipse ellipse) + { + return new Vector2(ellipse.center.X, ellipse.center.Y); + } + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + public bool Contains(int x, int y) + { + if (this.RadiusX <= 0 || this.RadiusY <= 0) + { + return false; + } + + // TODO: SIMD? + // This is a more general form of the circle equation + // X^2/a^2 + Y^2/b^2 <= 1 + Point normalized = new Point(x - this.center.X, y - this.center.Y); + int nX = normalized.X; + int nY = normalized.Y; + + return ((double)(nX * nX) / (this.RadiusX * this.RadiusX)) + + ((double)(nY * nY) / (this.RadiusY * this.RadiusY)) + <= 1.0; + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Ellipse [ Empty ]"; + } + + return + $"Ellipse [ RadiusX={this.RadiusX}, RadiusY={this.RadiusX}, Centre={this.center.X},{this.center.Y} ]"; + } + + /// + public override bool Equals(object obj) + { + if (obj is Ellipse) + { + return this.Equals((Ellipse)obj); + } + + return false; + } + + /// + public bool Equals(Ellipse other) + { + return this.center.Equals(other.center) + && this.RadiusX.Equals(other.RadiusX) + && this.RadiusY.Equals(other.RadiusY); + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Ellipse ellipse) + { + unchecked + { + int hashCode = ellipse.center.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusX.GetHashCode(); + hashCode = (hashCode * 397) ^ ellipse.RadiusY.GetHashCode(); + return hashCode; + } + } + } +} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs new file mode 100644 index 0000000000..d334843382 --- /dev/null +++ b/src/SixLabors.Primitives/LongRational.cs @@ -0,0 +1,355 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + using System.Text; + + /// + /// Represents a number that can be expressed as a fraction + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + internal struct LongRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + public LongRational(long numerator, long denominator) + : this(numerator, denominator, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The number above the line in a vulgar fraction showing how many of the parts + /// indicated by the denominator are taken. + /// + /// + /// The number below the line in a vulgar fraction; a divisor. + /// + /// + /// Whether to attempt to simplify the fractional parts. + /// + public LongRational(long numerator, long denominator, bool simplify) + : this() + { + this.Numerator = numerator; + this.Denominator = denominator; + + if (simplify) + { + this.Simplify(); + } + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public LongRational(double value, bool bestPrecision) + : this() + { + if (double.IsNaN(value)) + { + this.Numerator = this.Denominator = 0; + return; + } + + if (double.IsPositiveInfinity(value)) + { + this.Numerator = 1; + this.Denominator = 0; + return; + } + + if (double.IsNegativeInfinity(value)) + { + this.Numerator = -1; + this.Denominator = 0; + return; + } + + this.Numerator = 1; + this.Denominator = 1; + + double val = Math.Abs(value); + double df = this.Numerator / (double)this.Denominator; + double epsilon = bestPrecision ? double.Epsilon : .000001; + + while (Math.Abs(df - val) > epsilon) + { + if (df < val) + { + this.Numerator++; + } + else + { + this.Denominator++; + this.Numerator = (int)(val * this.Denominator); + } + + df = this.Numerator / (double)this.Denominator; + } + + if (value < 0.0) + { + this.Numerator *= -1; + } + + this.Simplify(); + } + + /// + /// Gets the numerator of a number. + /// + public long Numerator + { + get; + private set; + } + + /// + /// Gets the denominator of a number. + /// + public long Denominator + { + get; + private set; + } + + /// + /// Gets a value indicating whether this instance is indeterminate. + /// + public bool IsIndeterminate + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + /// Gets a value indicating whether this instance is an integer (n, 1) + /// + public bool IsInteger => this.Denominator == 1; + + /// + /// Gets a value indicating whether this instance is equal to negative infinity (-1, 0) + /// + public bool IsNegativeInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == -1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to positive infinity (1, 0) + /// + public bool IsPositiveInfinity + { + get + { + if (this.Denominator != 0) + { + return false; + } + + return this.Numerator == 1; + } + } + + /// + /// Gets a value indicating whether this instance is equal to 0 (0, 1) + /// + public bool IsZero + { + get + { + if (this.Denominator != 1) + { + return false; + } + + return this.Numerator == 0; + } + } + + /// + public bool Equals(LongRational other) + { + if (this.Denominator == other.Denominator) + { + return this.Numerator == other.Numerator; + } + + if (this.Numerator == 0 && this.Denominator == 0) + { + return other.Numerator == 0 && other.Denominator == 0; + } + + if (other.Numerator == 0 && other.Denominator == 0) + { + return this.Numerator == 0 && this.Denominator == 0; + } + + return (this.Numerator * other.Denominator) == (this.Denominator * other.Numerator); + } + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + if (this.IsIndeterminate) + { + return "[ Indeterminate ]"; + } + + if (this.IsPositiveInfinity) + { + return "[ PositiveInfinity ]"; + } + + if (this.IsNegativeInfinity) + { + return "[ NegativeInfinity ]"; + } + + if (this.IsZero) + { + return "0"; + } + + if (this.IsInteger) + { + return this.Numerator.ToString(provider); + } + + StringBuilder sb = new StringBuilder(); + sb.Append(this.Numerator.ToString(provider)); + sb.Append("/"); + sb.Append(this.Denominator.ToString(provider)); + return sb.ToString(); + } + + /// + /// Finds the greatest common divisor of two values. + /// + /// The first value + /// The second value + /// The + private static long GreatestCommonDivisor(long left, long right) + { + return right == 0 ? left : GreatestCommonDivisor(right, left % right); + } + + /// + /// Simplifies the + /// + private void Simplify() + { + if (this.IsIndeterminate) + { + return; + } + + if (this.IsNegativeInfinity) + { + return; + } + + if (this.IsPositiveInfinity) + { + return; + } + + if (this.IsInteger) + { + return; + } + + if (this.IsZero) + { + return; + } + + if (this.Numerator == 0) + { + this.Denominator = 0; + return; + } + + if (this.Numerator == this.Denominator) + { + this.Numerator = 1; + this.Denominator = 1; + } + + long gcd = GreatestCommonDivisor(Math.Abs(this.Numerator), Math.Abs(this.Denominator)); + if (gcd > 1) + { + this.Numerator = this.Numerator / gcd; + this.Denominator = this.Denominator / gcd; + } + } + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(LongRational rational) + { + return ((rational.Numerator * 397) ^ rational.Denominator).GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Primitives/MathF.cs new file mode 100644 index 0000000000..a15b7fb20d --- /dev/null +++ b/src/SixLabors.Primitives/MathF.cs @@ -0,0 +1,293 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Runtime.CompilerServices; + + /// + /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. + /// + // ReSharper disable InconsistentNaming + internal static class MathF + { + /// + /// Represents the ratio of the circumference of a circle to its diameter, specified by the constant, π. + /// + public const float PI = (float)Math.PI; + + /// + /// Returns the absolute value of a single-precision floating-point number. + /// + /// + /// A number that is greater than or equal to , but less than or equal to . + /// + /// + /// A single-precision floating-point number, x, such that 0 ≤ x ≤. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Abs(float f) + { + return Math.Abs(f); + } + + /// + /// Returns the angle whose tangent is the quotient of two specified numbers. + /// + /// The y coordinate of a point. + /// The x coordinate of a point. + /// + /// An angle, θ, measured in radians, such that -π≤θ≤π, and tan(θ) = y / x, where + /// (x, y) is a point in the Cartesian plane. Observe the following: For (x, y) in + /// quadrant 1, 0 < θ < π/2.For (x, y) in quadrant 2, π/2 < θ≤π.For (x, y) in quadrant + /// 3, -π < θ < -π/2.For (x, y) in quadrant 4, -π/2 < θ < 0.For points on the boundaries + /// of the quadrants, the return value is the following:If y is 0 and x is not negative, + /// θ = 0.If y is 0 and x is negative, θ = π.If y is positive and x is 0, θ = π/2.If + /// y is negative and x is 0, θ = -π/2.If y is 0 and x is 0, θ = 0. If x or y is + /// , or if x and y are either or + /// , the method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Atan2(float y, float x) + { + return (float)Math.Atan2(y, x); + } + + /// + /// Returns the smallest integral value that is greater than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The smallest integral value that is greater than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Ceiling(float f) + { + return (float)Math.Ceiling(f); + } + + /// + /// Returns the cosine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The cosine of . If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Cos(float f) + { + return (float)Math.Cos(f); + } + + /// + /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + /// + /// The angle in degrees. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DegreeToRadian(float degree) + { + return degree * (PI / 180F); + } + + /// + /// Returns e raised to the specified power. + /// + /// A number specifying a power. + /// + /// The number e raised to the power . + /// If equals or , that value is returned. + /// If equals , 0 is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Exp(float f) + { + return (float)Math.Exp(f); + } + + /// + /// Returns the largest integer less than or equal to the specified single-precision floating-point number. + /// + /// A single-precision floating-point number. + /// + /// The largest integer less than or equal to . + /// If is equal to , , + /// or , that value is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Floor(float f) + { + return (float)Math.Floor(f); + } + + /// + /// Returns the larger of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is larger. + /// If , or , or both and are + /// equal to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Max(float val1, float val2) + { + return Math.Max(val1, val2); + } + + /// + /// Returns the smaller of two single-precision floating-point numbers. + /// + /// The first of two single-precision floating-point numbers to compare. + /// The second of two single-precision floating-point numbers to compare. + /// + /// Parameter or , whichever is smaller. + /// If , , or both and are equal + /// to , is returned. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Min(float val1, float val2) + { + return Math.Min(val1, val2); + } + + /// + /// Returns a specified number raised to the specified power. + /// + /// A single-precision floating-point number to be raised to a power. + /// A single-precision floating-point number that specifies a power. + /// The number raised to the power . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Pow(float x, float y) + { + return (float)Math.Pow(x, y); + } + + /// + /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + /// + /// The angle in radians. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float RadianToDegree(float radian) + { + return radian / (PI / 180F); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integral value. + /// + /// A single-precision floating-point number to be rounded. + /// + /// The integer nearest . + /// If the fractional component of is halfway between two integers, one of which is even and the other odd, then the even number is returned. + /// Note that this method returns a instead of an integral type. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f) + { + return (float)Math.Round(f); + } + + /// + /// Rounds a single-precision floating-point value to the nearest integer. + /// A parameter specifies how to round the value if it is midway between two numbers. + /// + /// A single-precision floating-point number to be rounded. + /// Specification for how to round if it is midway between two other numbers. + /// + /// The integer nearest . If is halfway between two integers, one of which is even + /// and the other odd, then determines which of the two is returned. + /// Note that this method returns a instead of an integral type. + /// + /// + /// is not a valid value of . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Round(float f, MidpointRounding mode) + { + return (float)Math.Round(f, mode); + } + + /// + /// Returns the sine of the specified angle. + /// + /// An angle, measured in radians. + /// + /// The sine of . + /// If is equal to , , + /// or , this method returns . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sin(float f) + { + return (float)Math.Sin(f); + } + + /// + /// Returns the result of a normalized sine cardinal function for the given value. + /// SinC(x) = sin(pi*x)/(pi*x). + /// + /// A single-precision floating-point number to calculate the result for. + /// + /// The sine cardinal of . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float SinC(float f) + { + if (Abs(f) > Constants.Epsilon) + { + f *= PI; + return Clean(Sin(f) / f); + } + + return 1F; + } + + /// + /// Returns the square root of a specified number. + /// + /// The number whose square root is to be found. + /// + /// One of the values in the following table. + /// parameter Return value Zero or positive The positive square root of . + /// Negative Equals + /// Equals + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float Sqrt(float f) + { + return (float)Math.Sqrt(f); + } + + /// + /// Ensures that any passed float is correctly rounded to zero + /// + /// The value to clean. + /// + /// The + /// . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static float Clean(float x) + { + if (Abs(x) < Constants.Epsilon) + { + return 0F; + } + + return x; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs new file mode 100644 index 0000000000..6da436cfba --- /dev/null +++ b/src/SixLabors.Primitives/Matrix.cs @@ -0,0 +1,360 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// A Matrix object for applying matrix transforms to primitives. + /// + public struct Matrix : IEquatable + { + private Matrix3x2 backingMatrix; + + private static readonly Matrix _identity = new Matrix + { + backingMatrix = Matrix3x2.Identity + }; + + /// + /// Returns the multiplicative identity matrix. + /// + public static Matrix Identity => _identity; + + /// + /// Returns whether the matrix is the identity matrix. + /// + public bool IsIdentity => this.backingMatrix.IsIdentity; + + /// + /// Gets or sets the translation component of this matrix. + /// + public Vector2 Translation => this.backingMatrix.Translation; + + /// + /// Constructs a Matrix3x2 from the given components. + /// + public Matrix(float m11, float m12, + float m21, float m22, + float m31, float m32) + { + this.backingMatrix = new Matrix3x2(m11, m12, m21, m22, m31, m32); + } + + /// + /// Creates a translation matrix from the given vector. + /// + /// The translation position. + /// A translation matrix. + public static Matrix CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); + + /// + /// Creates a translation matrix from the given X and Y components. + /// + /// The X position. + /// The Y position. + /// A translation matrix. + public static Matrix CreateTranslation(float xPosition, float yPosition) => Matrix3x2.CreateTranslation(xPosition, yPosition); + + /// + /// Creates a scale matrix from the given X and Y components. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale) => Matrix3x2.CreateScale(xScale, yScale); + + /// + /// Creates a scale matrix that is offset by a given center point. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// The center point. + /// A scaling matrix. + public static Matrix CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); + + /// + /// Creates a scale matrix from the given vector scale. + /// + /// The scale to use. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); + + /// + /// Creates a scale matrix from the given vector scale with an offset from the given center point. + /// + /// The scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); + + /// + /// Creates a scale matrix that scales uniformly with the given scale. + /// + /// The uniform scale to use. + /// A scaling matrix. + public static Matrix CreateScale(float scale) => Matrix3x2.CreateScale(scale); + + /// + /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. + /// + /// The uniform scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY) => Matrix3x2.CreateSkew(radiansX, radiansY); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY)); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// The center point. + /// A skew matrix. + public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY), centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in radians. + /// A rotation matrix. + public static Matrix CreateRotation(float radians) => System.Numerics.Matrix3x2.CreateRotation(radians); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in degrees. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees)); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in radians. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in degrees. + /// The center point. + /// A rotation matrix. + public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees), centerPoint); + + /// + /// Calculates the determinant for this matrix. + /// The determinant is calculated by expanding the matrix with a third column whose values are (0,0,1). + /// + /// The determinant. + public float GetDeterminant() => this.backingMatrix.GetDeterminant(); + + /// + /// Attempts to invert the given matrix. If the operation succeeds, the inverted matrix is stored in the result parameter. + /// + /// The source matrix. + /// The output matrix. + /// True if the operation succeeded, False otherwise. + public static bool Invert(Matrix matrix, out Matrix result) + { + Matrix3x2 m; + var b = System.Numerics.Matrix3x2.Invert(matrix.backingMatrix, out m); + result = m; + return b; + } + + /// + /// Linearly interpolates from matrix1 to matrix2, based on the third parameter. + /// + /// The first source matrix. + /// The second source matrix. + /// The relative weighting of matrix2. + /// The interpolated matrix. + public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) => Matrix3x2.Lerp(matrix1.backingMatrix, matrix2.backingMatrix, amount); + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix Negate(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix Add(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix Subtract(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix Multiply(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix Multiply(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Negates the given matrix by multiplying all values by -1. + /// + /// The source matrix. + /// The negated matrix. + public static Matrix operator -(Matrix value) => -value.backingMatrix; + + /// + /// Adds each matrix element in value1 with its corresponding element in value2. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the summed values. + public static Matrix operator +(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; + + /// + /// Subtracts each matrix element in value2 from its corresponding element in value1. + /// + /// The first source matrix. + /// The second source matrix. + /// The matrix containing the resulting values. + public static Matrix operator -(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; + + /// + /// Multiplies two matrices together and returns the resulting matrix. + /// + /// The first source matrix. + /// The second source matrix. + /// The product matrix. + public static Matrix operator *(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; + + /// + /// Scales all elements in a matrix by the given scalar factor. + /// + /// The source matrix. + /// The scaling value to use. + /// The resulting matrix. + public static Matrix operator *(Matrix value1, float value2) => value1.backingMatrix * value2; + + /// + /// Returns a boolean indicating whether the given matrices are equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are equal; False otherwise. + public static bool operator ==(Matrix value1, Matrix value2) => value1.backingMatrix == value2.backingMatrix; + + /// + /// Returns a boolean indicating whether the given matrices are not equal. + /// + /// The first source matrix. + /// The second source matrix. + /// True if the matrices are not equal; False if they are equal. + public static bool operator !=(Matrix value1, Matrix value2) + { + return value1.backingMatrix != value2.backingMatrix; + + } + + /// + /// Returns a boolean indicating whether the matrix is equal to the other given matrix. + /// + /// The other matrix to test equality against. + /// True if this matrix is equal to other; False otherwise. + public bool Equals(Matrix other) + { + return this.backingMatrix == other.backingMatrix; + } + + /// + /// Returns a boolean indicating whether the given Object is equal to this matrix instance. + /// + /// The Object to compare against. + /// True if the Object is equal to this matrix; False otherwise. + public override bool Equals(object obj) + { + if (obj is Matrix) + { + return Equals((Matrix)obj); + } + + return false; + } + + /// + /// Returns a String representing this matrix instance. + /// + /// The string representation. + public override string ToString() => this.backingMatrix.ToString(); + + /// + /// Returns the hash code for this instance. + /// + /// The hash code. + public override int GetHashCode() => this.backingMatrix.GetHashCode(); + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix3x2(Matrix matrix) => matrix.backingMatrix; + + /// + /// Creates a with the values of the specified . + /// + /// The matrix. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; + } +} diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs new file mode 100644 index 0000000000..243cb8eb34 --- /dev/null +++ b/src/SixLabors.Primitives/Point.cs @@ -0,0 +1,257 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of integer x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Point : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Point Empty = default(Point); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal and vertical position of the point. + public Point(int value) + : this() + { + this.X = LowInt16(value); + this.Y = HighInt16(value); + } + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public Point(int x, int y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public Point(Size size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Point point) => new PointF(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(Point point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(Point point) => new Size(point.X, point.Y); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator +(Point point, Size size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point operator -(Point point, Size size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Point left, Point right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Point left, Point right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Subtract(Point point, Size size) => new Point(unchecked(point.X - size.Width), unchecked(point.Y - size.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Ceiling(PointF point) => new Point(unchecked((int)MathF.Ceiling(point.X)), unchecked((int)MathF.Ceiling(point.Y))); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The vector + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Point [ Empty ]"; + } + + return $"Point [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is Point && this.Equals((Point)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Point other) => this.X == other.X && this.Y == other.Y; + + private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); + + private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); + + private int GetHashCode(Point point) => point.X ^ point.Y; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs new file mode 100644 index 0000000000..a49a1996b3 --- /dev/null +++ b/src/SixLabors.Primitives/PointF.cs @@ -0,0 +1,233 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in + /// a two-dimensional plane. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct PointF : IEquatable + { + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly PointF Empty = default(PointF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the point. + /// The vertical position of the point. + public PointF(float x, float y) + : this() + { + this.X = x; + this.Y = y; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The size + public PointF(SizeF size) + { + this.X = size.Width; + this.Y = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The vector. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator PointF(Vector2 vector) => new PointF(vector.X, vector.Y); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(PointF point) => new Vector2(point.X, point.Y); + + /// + /// Creates a with the coordinates of the specified by truncating each of the coordinates. + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(PointF point) => Point.Truncate(point); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator +(PointF point, SizeF size) => Add(point, size); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(PointF left, PointF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(PointF left, PointF right) => !left.Equals(right); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); + + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); + + /// + /// Rotates a point around the given rotation matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Rotate(PointF point, Matrix rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); + + /// + /// Skews a point using the given skew matrix. + /// + /// The point to rotate + /// Rotation matrix used + /// The rotated + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Skew(PointF point, Matrix skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + + /// + /// Translates this by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + /// Translates this by the specified amount. + /// + /// The used offset this . + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "PointF [ Empty ]"; + } + + return $"PointF [ X={this.X}, Y={this.Y} ]"; + } + + /// + public override bool Equals(object obj) => obj is PointF && this.Equals((PointF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(PointF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(PointF point) => point.X.GetHashCode() ^ point.Y.GetHashCode(); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rational.cs b/src/SixLabors.Primitives/Rational.cs new file mode 100644 index 0000000000..3d7003b4eb --- /dev/null +++ b/src/SixLabors.Primitives/Rational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct Rational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public Rational(uint value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public Rational(uint numerator, uint denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public Rational(uint numerator, uint denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public Rational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public Rational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(Math.Abs(value), bestPrecision); + + this.Numerator = (uint)rational.Numerator; + this.Denominator = (uint)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public uint Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public uint Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(Rational left, Rational right) + { + return Rational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(Rational left, Rational right) + { + return !Rational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static Rational FromDouble(double value) + { + return new Rational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static Rational FromDouble(double value, bool bestPrecision) + { + return new Rational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is Rational) + { + return this.Equals((Rational)obj); + } + + return false; + } + + /// + public bool Equals(Rational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs new file mode 100644 index 0000000000..9c9a0599e6 --- /dev/null +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -0,0 +1,467 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four integers that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Rectangle : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly Rectangle Empty = default(Rectangle); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public Rectangle(int x, int y, int width, int height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public Rectangle(Point point, Size size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public int X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public int Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Point Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Point(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Size Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Size(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public int Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public int Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.X + this.Width); + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public int Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return unchecked(this.Y + this.Height); + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public int Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator RectangleF(Rectangle rectangle) => new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector4(Rectangle rectangle) => new Vector4(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Rectangle left, Rectangle right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Rectangle left, Rectangle right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static Rectangle FromLTRB(int left, int top, int right, int bottom) => new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Center(Rectangle rectangle) => new Point(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Intersect(Rectangle a, Rectangle b) + { + int x1 = Math.Max(a.X, b.X); + int x2 = Math.Min(a.Right, b.Right); + int y1 = Math.Max(a.Y, b.Y); + int y2 = Math.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Inflate(Rectangle rectangle, int x, int y) + { + Rectangle r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Converts a to a by performing a ceiling operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Ceiling(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Ceiling(rectangle.X), + (int)MathF.Ceiling(rectangle.Y), + (int)MathF.Ceiling(rectangle.Width), + (int)MathF.Ceiling(rectangle.Height)); + } + } + + /// + /// Converts a to a by performing a truncate operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Truncate(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)rectangle.X, + (int)rectangle.Y, + (int)rectangle.Width, + (int)rectangle.Height); + } + } + + /// + /// Converts a to a by performing a round operation on all the coordinates. + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Round(RectangleF rectangle) + { + unchecked + { + return new Rectangle( + (int)MathF.Round(rectangle.X), + (int)MathF.Round(rectangle.Y), + (int)MathF.Round(rectangle.Width), + (int)MathF.Round(rectangle.Height)); + } + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Rectangle Union(Rectangle a, Rectangle b) + { + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.Right, b.Right); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Bottom, b.Bottom); + + return new Rectangle(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a Rectangle that represents the intersection between this Rectangle and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(Rectangle rectangle) + { + Rectangle result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(int width, int height) + { + unchecked + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(Size size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(int x, int y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Point point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(Rectangle rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(Rectangle rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(Point point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(int dx, int dy) + { + unchecked + { + this.X += dx; + this.Y += dy; + } + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Rectangle [ Empty ]"; + } + + return $"Rectangle [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Rectangle && this.Equals((Rectangle)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; + + private int GetHashCode(Rectangle rectangle) + { + unchecked + { + int hashCode = rectangle.X; + hashCode = (hashCode * 397) ^ rectangle.Y; + hashCode = (hashCode * 397) ^ rectangle.Width; + hashCode = (hashCode * 397) ^ rectangle.Height; + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs new file mode 100644 index 0000000000..c7d8b0ebbb --- /dev/null +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -0,0 +1,400 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores a set of four single precision floating points that represent the location and size of a rectangle. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct RectangleF : IEquatable + { + /// + /// Represents a that has X, Y, Width, and Height values set to zero. + /// + public static readonly RectangleF Empty = default(RectangleF); + + /// + /// Initializes a new instance of the struct. + /// + /// The horizontal position of the rectangle. + /// The vertical position of the rectangle. + /// The width of the rectangle. + /// The height of the rectangle. + public RectangleF(float x, float y, float width, float height) + { + this.X = x; + this.Y = y; + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// + /// The which specifies the rectangles point in a two-dimensional plane. + /// + /// + /// The which specifies the rectangles height and width. + /// + public RectangleF(PointF point, SizeF size) + { + this.X = point.X; + this.Y = point.Y; + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Gets or sets the x-coordinate of this . + /// + public float X { get; set; } + + /// + /// Gets or sets the y-coordinate of this . + /// + public float Y { get; set; } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets or sets the coordinates of the upper-left corner of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public PointF Location + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new PointF(this.X, this.Y); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.X = value.X; + this.Y = value.Y; + } + } + + /// + /// Gets or sets the size of this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public SizeF Size + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new SizeF(this.Width, this.Height); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + set + { + this.Width = value.Width; + this.Height = value.Height; + } + } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => (this.Width <= 0) || (this.Height <= 0); + + /// + /// Gets the y-coordinate of the top edge of this . + /// + public float Top + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y; + } + } + + /// + /// Gets the x-coordinate of the right edge of this . + /// + public float Right + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X + this.Width; + } + } + + /// + /// Gets the y-coordinate of the bottom edge of this . + /// + public float Bottom + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.Y + this.Height; + } + } + + /// + /// Gets the x-coordinate of the left edge of this . + /// + public float Left + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + return this.X; + } + } + + /// + /// Creates a with the coordinates of the specified by truncating each coordinate. + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Rectangle(RectangleF rectangle) => Rectangle.Truncate(rectangle); + + /// + /// Compares two objects for equality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(RectangleF left, RectangleF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The on the left side of the operand. + /// The on the right side of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(RectangleF left, RectangleF right) => !left.Equals(right); + + /// + /// Creates a new with the specified location and size. + /// The left coordinate of the rectangle + /// The top coordinate of the rectangle + /// The right coordinate of the rectangle + /// The bottom coordinate of the rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + + // ReSharper disable once InconsistentNaming + public static RectangleF FromLTRB(float left, float top, float right, float bottom) => new RectangleF(left, top, right - left, bottom - top); + + /// + /// Returns the center point of the given + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Center(RectangleF rectangle) => new PointF(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); + + /// + /// Creates a rectangle that represents the intersection between and + /// . If there is no intersection, an empty rectangle is returned. + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Intersect(RectangleF a, RectangleF b) + { + float x1 = MathF.Max(a.X, b.X); + float x2 = MathF.Min(a.Right, b.Right); + float y1 = MathF.Max(a.Y, b.Y); + float y2 = MathF.Min(a.Bottom, b.Bottom); + + if (x2 >= x1 && y2 >= y1) + { + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + return Empty; + } + + /// + /// Creates a that is inflated by the specified amount. + /// + /// The rectangle + /// The amount to inflate the width by + /// The amount to inflate the height by + /// A new + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Inflate(RectangleF rectangle, float x, float y) + { + RectangleF r = rectangle; + r.Inflate(x, y); + return r; + } + + /// + /// Creates a rectangle that represents the union between and . + /// + /// The first rectangle + /// The second rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static RectangleF Union(RectangleF a, RectangleF b) + { + float x1 = MathF.Min(a.X, b.X); + float x2 = MathF.Max(a.Right, b.Right); + float y1 = MathF.Min(a.Y, b.Y); + float y2 = MathF.Max(a.Bottom, b.Bottom); + + return new RectangleF(x1, y1, x2 - x1, y2 - y1); + } + + /// + /// Creates a RectangleF that represents the intersection between this RectangleF and the . + /// + /// The rectangle + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Intersect(RectangleF rectangle) + { + RectangleF result = Intersect(rectangle, this); + + this.X = result.X; + this.Y = result.Y; + this.Width = result.Width; + this.Height = result.Height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The width + /// The height + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(float width, float height) + { + this.X -= width; + this.Y -= height; + + this.Width += 2 * width; + this.Height += 2 * height; + } + + /// + /// Inflates this by the specified amount. + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Inflate(SizeF size) => this.Inflate(size.Width, size.Height); + + /// + /// Determines if the specfied point is contained within the rectangular region defined by + /// this . + /// + /// The x-coordinate of the given point. + /// The y-coordinate of the given point. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(float x, float y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; + + /// + /// Determines if the specified point is contained within the rectangular region defined by this . + /// + /// The point + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(PointF point) => this.Contains(point.X, point.Y); + + /// + /// Determines if the rectangular region represented by is entirely contained + /// within the rectangular region represented by this . + /// + /// The rectangle + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Contains(RectangleF rectangle) => + (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && + (this.Y <= rectangle.Y) && (rectangle.Bottom <= this.Bottom); + + /// + /// Determines if the specfied intersects the rectangular region defined by + /// this . + /// + /// The other Rectange + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool IntersectsWith(RectangleF rectangle) => + (rectangle.X < this.Right) && (this.X < rectangle.Right) && + (rectangle.Y < this.Bottom) && (this.Y < rectangle.Bottom); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(PointF point) => this.Offset(point.X, point.Y); + + /// + /// Adjusts the location of this rectangle by the specified amount. + /// + /// The amount to offset the x-coordinate. + /// The amount to offset the y-coordinate. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Offset(float dx, float dy) + { + this.X += dx; + this.Y += dy; + } + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "RectangleF [ Empty ]"; + } + + return $"RectangleF [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is RectangleF && this.Equals((RectangleF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(RectangleF rectangle) + { + unchecked + { + int hashCode = rectangle.X.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Y.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Width.GetHashCode(); + hashCode = (hashCode * 397) ^ rectangle.Height.GetHashCode(); + return hashCode; + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SignedRational.cs b/src/SixLabors.Primitives/SignedRational.cs new file mode 100644 index 0000000000..07fd105da4 --- /dev/null +++ b/src/SixLabors.Primitives/SignedRational.cs @@ -0,0 +1,189 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Globalization; + + /// + /// Represents a number that can be expressed as a fraction. + /// + /// + /// This is a very simplified implementation of a rational number designed for use with metadata only. + /// + public struct SignedRational : IEquatable + { + /// + /// Initializes a new instance of the struct. + /// + /// The to create the rational from. + public SignedRational(int value) + : this(value, 1) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + public SignedRational(int numerator, int denominator) + : this(numerator, denominator, true) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. + /// The number below the line in a vulgar fraction; a divisor. + /// Specified if the rational should be simplified. + public SignedRational(int numerator, int denominator, bool simplify) + { + LongRational rational = new LongRational(numerator, denominator, simplify); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + public SignedRational(double value) + : this(value, false) + { + } + + /// + /// Initializes a new instance of the struct. + /// + /// The to create the instance from. + /// Whether to use the best possible precision when parsing the value. + public SignedRational(double value, bool bestPrecision) + { + LongRational rational = new LongRational(value, bestPrecision); + + this.Numerator = (int)rational.Numerator; + this.Denominator = (int)rational.Denominator; + } + + /// + /// Gets the numerator of a number. + /// + public int Numerator { get; } + + /// + /// Gets the denominator of a number. + /// + public int Denominator { get; } + + /// + /// Determines whether the specified instances are considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator ==(SignedRational left, SignedRational right) + { + return SignedRational.Equals(left, right); + } + + /// + /// Determines whether the specified instances are not considered equal. + /// + /// The first to compare. + /// The second to compare. + /// The + public static bool operator !=(SignedRational left, SignedRational right) + { + return !SignedRational.Equals(left, right); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// + /// The . + /// + public static SignedRational FromDouble(double value) + { + return new SignedRational(value, false); + } + + /// + /// Converts the specified to an instance of this type. + /// + /// The to convert to an instance of this type. + /// Whether to use the best possible precision when parsing the value. + /// + /// The . + /// + public static SignedRational FromDouble(double value, bool bestPrecision) + { + return new SignedRational(value, bestPrecision); + } + + /// + public override bool Equals(object obj) + { + if (obj is SignedRational) + { + return this.Equals((SignedRational)obj); + } + + return false; + } + + /// + public bool Equals(SignedRational other) + { + LongRational left = new LongRational(this.Numerator, this.Denominator); + LongRational right = new LongRational(other.Numerator, other.Denominator); + + return left.Equals(right); + } + + /// + public override int GetHashCode() + { + LongRational self = new LongRational(this.Numerator, this.Denominator); + return self.GetHashCode(); + } + + /// + /// Converts a rational number to the nearest . + /// + /// + /// The . + /// + public double ToDouble() + { + return this.Numerator / (double)this.Denominator; + } + + /// + public override string ToString() + { + return this.ToString(CultureInfo.InvariantCulture); + } + + /// + /// Converts the numeric value of this instance to its equivalent string representation using + /// the specified culture-specific format information. + /// + /// + /// An object that supplies culture-specific formatting information. + /// + /// The + public string ToString(IFormatProvider provider) + { + LongRational rational = new LongRational(this.Numerator, this.Denominator); + return rational.ToString(provider); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SixLabors.Primitives.csproj b/src/SixLabors.Primitives/SixLabors.Primitives.csproj new file mode 100644 index 0000000000..3a1265cff9 --- /dev/null +++ b/src/SixLabors.Primitives/SixLabors.Primitives.csproj @@ -0,0 +1,40 @@ + + + + Low level primitives for use across Six Labors projects.. + SixLabors.Primitives + $(packageversion) + 0.1.0-alpha1 + Six Labors + netstandard1.1 + true + true + SixLabors.Primitives + SixLabors.Primitives + rectangle;point;size,primitives + https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://github.com/SixLabors/Primitives + http://www.apache.org/licenses/LICENSE-2.0 + git + https://github.com/SixLabors/Primitives + false + false + false + false + false + false + false + false + false + full + + + + + + + + + + + \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs new file mode 100644 index 0000000000..1605232b10 --- /dev/null +++ b/src/SixLabors.Primitives/Size.cs @@ -0,0 +1,225 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of integers, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct Size : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly Size Empty = default(Size); + + /// + /// Initializes a new instance of the struct. + /// + /// The width and height of the size + public Size(int value) + : this() + { + this.Width = value; + this.Height = value; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public Size(int width, int height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public Size(Size size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public Size(Point point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public int Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public int Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified . + /// + /// The point + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator SizeF(Size size) => new SizeF(size.Width, size.Height); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Point(Size size) => new Point(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator +(Size left, Size right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size operator -(Size left, Size right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(Size left, Size right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// + /// The on the left side of the operand. + /// + /// + /// The on the right side of the operand. + /// + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(Size left, Size right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Add(Size left, Size right) => new Size(unchecked(left.Width + right.Width), unchecked(left.Height + right.Height)); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); + + /// + /// Converts a to a by performing a ceiling operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Ceiling(SizeF size) => new Size(unchecked((int)MathF.Ceiling(size.Width)), unchecked((int)MathF.Ceiling(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); + + /// + /// Converts a to a by performing a round operation on all the dimensions. + /// + /// The size + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + public override int GetHashCode() => this.GetHashCode(this); + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "Size [ Empty ]"; + } + + return $"Size [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + + /// + /// Returns the hash code for this instance. + /// + /// + /// The instance of to return the hash code for. + /// + /// + /// A 32-bit signed integer that is the hash code for this instance. + /// + private int GetHashCode(Size size) => size.Width ^ size.Height; + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs new file mode 100644 index 0000000000..a11d2e4433 --- /dev/null +++ b/src/SixLabors.Primitives/SizeF.cs @@ -0,0 +1,190 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.ComponentModel; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// Stores an ordered pair of single precision floating points, which specify a height and width. + /// + /// + /// This struct is fully mutable. This is done (against the guidelines) for the sake of performance, + /// as it avoids the need to create new values for modification operations. + /// + public struct SizeF : IEquatable + { + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly SizeF Empty = default(SizeF); + + /// + /// Initializes a new instance of the struct. + /// + /// The width of the size. + /// The height of the size. + public SizeF(float width, float height) + { + this.Width = width; + this.Height = height; + } + + /// + /// Initializes a new instance of the struct. + /// + /// The size + public SizeF(SizeF size) + : this() + { + this.Width = size.Width; + this.Height = size.Height; + } + + /// + /// Initializes a new instance of the struct from the given . + /// + /// The point + public SizeF(PointF point) + { + this.Width = point.X; + this.Height = point.Y; + } + + /// + /// Gets or sets the width of this . + /// + public float Width { get; set; } + + /// + /// Gets or sets the height of this . + /// + public float Height { get; set; } + + /// + /// Gets a value indicating whether this is empty. + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public bool IsEmpty => this.Equals(Empty); + + /// + /// Creates a with the dimensions of the specified by truncating each of the dimensions. + /// + /// The size. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator Size(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + + /// + /// Converts the given into a . + /// + /// The size + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static explicit operator PointF(SizeF size) => new PointF(size.Width, size.Height); + + /// + /// Computes the sum of adding two sizes. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator +(SizeF left, SizeF right) => Add(left, right); + + /// + /// Computes the difference left by subtracting one size from another. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); + + /// + /// Compares two objects for equality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is equal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(SizeF left, SizeF right) => left.Equals(right); + + /// + /// Compares two objects for inequality. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// True if the current left is unequal to the parameter; otherwise, false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(SizeF left, SizeF right) => !left.Equals(right); + + /// + /// Performs vector addition of two objects. + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Add(SizeF left, SizeF right) => new SizeF(left.Width + right.Width, left.Height + right.Height); + + /// + /// Contracts a by another + /// + /// The size on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); + + /// + public override int GetHashCode() + { + return this.GetHashCode(this); + } + + /// + public override string ToString() + { + if (this.IsEmpty) + { + return "SizeF [ Empty ]"; + } + + return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; + } + + /// + public override bool Equals(object obj) => obj is SizeF && this.Equals((SizeF)obj); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + + private int GetHashCode(SizeF size) => size.Width.GetHashCode() ^ size.Height.GetHashCode(); + + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + } +} \ No newline at end of file diff --git a/src/SixLabors.Primitives/stylecop.json b/src/SixLabors.Primitives/stylecop.json new file mode 100644 index 0000000000..de88a8bfe6 --- /dev/null +++ b/src/SixLabors.Primitives/stylecop.json @@ -0,0 +1,9 @@ +{ + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": { + "documentationRules": { + "companyName": "Six Labors", + "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." + } + } +} \ No newline at end of file diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd new file mode 100644 index 0000000000..498e55b368 --- /dev/null +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -0,0 +1,21 @@ +@echo off + +cd tests\CodeCoverage + +nuget restore packages.config -PackagesDirectory . + +cd .. +cd .. + +dotnet restore SixLabors.Primitives.sln +dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true + +rem The -threshold options prevents this taking ages... +rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Shapes.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Shapes.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" + +if %errorlevel% neq 0 exit /b %errorlevel% + +SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% +pip install codecov +codecov -f "SixLabors.Primitives.Coverage.xml" \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf new file mode 100644 index 0000000000..0916f4d611 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf @@ -0,0 +1,166 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp +\f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive +\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}} +{\*\rsidtbl \rsid11275983\rsid14818796\rsid15367925\rsid16724145}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun} +{\creatim\yr2012\mo1\dy5\hr7\min52}{\revtim\yr2012\mo2\dy21\hr8\min10}{\version3}{\edmins2}{\nofpages1}{\nofwords157}{\nofchars900}{\*\company Microsoft}{\nofcharsws1055}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word +ml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale60\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot15367925\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14818796 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Copyright (c) 2011}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16724145 -2012}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Shaun Wilde +\par 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 fu +rnished to do so, subject to the following conditions: +\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. +\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11275983 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e00b +b50e14f0cc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll new file mode 100644 index 0000000000000000000000000000000000000000..4e5b94aaf085b8bf29f639361809f7216d39d51e GIT binary patch literal 10240 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 T?}OP1_r=xp|DOL3_Q3xDcd->A literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets new file mode 100644 index 0000000000..caf2b79ba3 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets @@ -0,0 +1,10 @@ + + + + + $(MSBuildExtensionsPath32)\OpenCover + $(OpenCoverMSBuildTasksPath)\OpenCover.MSBuild.dll + + + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config new file mode 100644 index 0000000000..cfe9c46fbe --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj new file mode 100644 index 0000000000..400bb251a4 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj @@ -0,0 +1,53 @@ + + + + + Debug + AnyCPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Library + Properties + Bom + Bom + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs new file mode 100644 index 0000000000..ad91490d39 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Bom +{ + public class BomManager + { + public int MethodToTest(IEnumerable collection) + { + return (collection ?? new int[0]).Sum(); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..cc769d0e45 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Bom")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Bom")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("2b4e3956-c04a-42f8-a367-87bc16ffa08d")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln new file mode 100644 index 0000000000..f5edc5b2d8 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bom", "Bom\Bom.csproj", "{0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BomTest", "BomTest\BomTest.csproj", "{E25E828A-5D71-4E95-AEBC-7AD21315DFEC}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3CD3B1D-4C14-4A8C-A57F-A265BC49FB29}" + ProjectSection(SolutionItems) = preProject + .nuget\packages.config = .nuget\packages.config + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.Build.0 = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs new file mode 100644 index 0000000000..486e2b3897 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Bom; +using NUnit.Framework; + +namespace BomTest +{ + [TestFixture] + public class BomManagerTests + { + [Test] + public void Sum_Is_Zero_When_No_Entries() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(new Collection())); + } + + [Test] + [TestCase(new[] { 0 }, 0)] + [TestCase(new[] { 1 }, 1)] + [TestCase(new[] { 1, 2, 3 }, 6)] + public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected) + { + var bomManager = new BomManager(); + Assert.AreEqual(expected, bomManager.MethodToTest(new Collection(data))); + } + + [Test] + public void Sum_Is_Zero_When_Null_Collection() + { + var bomManager = new BomManager(); + Assert.AreEqual(0, bomManager.MethodToTest(null)); + } + } +} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj new file mode 100644 index 0000000000..4942e9f288 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {E25E828A-5D71-4E95-AEBC-7AD21315DFEC} + Library + Properties + BomTest + BomTest + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\NUnit.2.6.4\lib\nunit.framework.dll + + + + + + + + + + + + + + + + + + + {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} + Bom + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..60d4b26d9a --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BomTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BomTest")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("688e9792-727d-4e39-a0ae-93461aa13b49")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config new file mode 100644 index 0000000000..c714ef3a23 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat new file mode 100644 index 0000000000..02415f7e30 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat @@ -0,0 +1,5 @@ +.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user "-filter:+[Bom]* -[*Test]*" "-target:.\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe" "-targetargs:/noshadow .\BomTest\bin\Debug\BomTest.dll" + +.\packages\ReportGenerator.2.1.8.0\tools\ReportGenerator.exe "-reports:results.xml" "-targetdir:.\coverage" + +pause \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt new file mode 100644 index 0000000000..cc71c4a16e --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt @@ -0,0 +1,137 @@ +Version 4.6.519 +#528 -safemode:on to address incomplete coverage due to thread based buffers (feature) +#521 add exclude paths (feature) +#376 protect buffer allocation in multithreaded environment (fix) +#335 allow short wait timeout to be configured (feature) +#310 improved reporting - hide branches due to iterators (feature) +#352 improved reporting - hide branches due to async (feature) +#363 calculate npath comlexity (feature) +#282 exclude by process (feature) +#246 auto crash reports (feature) +#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015) +#335 error on unrecognized arguments/prefixes (fix) +#328 exclude types when declaredtype is excluded (fix-feature) +#302 ignore branches in known autogenerated sequences (feature) + +Version 4.6.166 +#323 push releases and candidates to github via appveyor (prj-mgmt) +#315 update nuget package (fix for VS2015) +#320 update packages (fix for VS2015) +#304 add switch to control timeout wait (feature) +#307 add -version to args (feature) +#305 add corclr_profiler_path support (feature) +#303 support for test cases and theories during track by test (feature) +#295 exclude assembly by attribute (feature) +#288 report (to console) if can't ready body of method (diag) +#287 fix crash (fix) +#283 Add visited class/method to summary entity (feature) +#274 Use thread based buffers for performance improvement (fix) + +Version 4.5.3723 +#244 support ApplicationUnderTest.Launch to propagate required OPENCOVER environment variables (feature) +#256 support Microsoft Fakes (feature) - beta support until we bed feature in (feature) +#248 address issue with Mono.Cecil and latest PDB (.NET 4.6) version (fix) +#252 use AppVeyor for building code and pull requests (prj-mgmt) + +Version 4.5.3522 +#243 null reference exception when excluding branch point in using finally block (fix) + +Version 4.5.3427 +#234 improved IIS support (fix) +#237 handle multiple files for a method e.g. during code contract re-writes (fix) +#228 add MDB support (feature) +#226 remove branch points on methods without sequence points (fix) +#225 Enable filters to use regular expressions (feature) +#218 Auto tag release notes (prj-mgmt) +#116 output results to accumulate with previous coverage file activate by -mergeoutput (feature) + +Version 4.5.3207 +#209 The number of WaitHandles must be less than or equal to 64 (fix) +#208 Line Number for Branch Points (feature) +#207 "using" statement causes incorrect Branch Coverage (fix) +#201 NETWORK SERVICE support (feature) + +Version 4.5.2506 +#188 Bring back COR_PRF_DISABLE_ALL_NGEN_IMAGES +#190 Compiler generated "Empty" Branch Points feature high close on next release +#191 SequencePoint FileID [CodeContractClass/For] + +Version 4.5.2316 +#170 - Overflow fixed +#188 - re-introduced COR_PRF_DISABLE_ALL_NGEN_IMAGES +#174 / #176 - pass arguments as multiple variable + +Version 4.5.1923 +#168 - skip auto implemented properties +#164 - allow registryless loading +#163 - improved error messages + +Version 4.5.1604 +#156 - prepend targetdir when applying test strategies (silverlight) + +Version 4.5.1528 +#158 - fix app domain crash due to timeout of proxy + +Version 4.5.1403 +#154 - Add xUnit to the list of supported strategies for the Cover by Test feature +#150 - fix for Xslt issue +Build Environment now uses BDD tests to ensure the packages have all assemblies required to run + +Version 4.5.1314 +#148 - Fix issue with nuget and zip packages and missing Autofac assembly. + +Version 4.5.1313 +#118 - Fix communication issue between profiler and host when many processes are vying for the channel + - improved thread management + - only check if method needs tracing if coverbytest option is utilised + +Version 4.5.1310 +#128 - Add threshold limits (optional commandline) to reduce reporting of visits +#135 - Add performance counters (admin privileges required) around the memory processing queues + +Version 4.5.1302 +Update version number to reflect 4.5 support +Fix bug in summaries + +Version 4.0.1229 +Supports .NET 4.5 (not windows store apps) +#120 - Built in Summary Reports - useful for build systems + +Version 4.0.1128 +#125 - Hide compiler generated method when no source remains after skipping +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1118 +#137 - Fix instrumentation issue when dealing with typed clauses +#107 - fix 'sporadic' crash when dealing with Generic methods. + +Version 4.0.1107 +#133 - Remove skipped File/Module/Class/Methods from report +#130 - Support for 'returntargetcode' switch in msbuild task +#126, #127, #132 - ReportGenerator upgrades +#122 - filter from file instead of command line list option (#123 patch) + +Version 4.0.804 +#117 - fix filter crash with anonymous types +#110 - fix timeout issues due to performance woes in dealing with large number of types/methods + +Version 4.0.724 +#94 - remove thread that "may" have been the cause of the nunit-agent.exe closedown issue - switched to a shared memory buffer per child process/profiler object instantiated +#108 - merge pull request - ToolPath property for MSBuild command + +Version 4.0.519 +#102 - add msbuild parts to zip and nuget package +#99 - exclude anonymous functions if containing method is excluded +#97 - fix crash based on receiving corrupt data (sequence point with id==0) +#88 - only use COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST if oldStyle instrumentation + +Version 4.0.408 +#83 - build a zip package +#88 - provide a switch for "old school" instrumentation +#95 - fix for namespaces with spaces + +Version 4.0.301.10 +#78 - fix for endfault/endfinally +#71 - detect disabled service + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf new file mode 100644 index 0000000000..a078a647e0 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf @@ -0,0 +1,1138 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} +{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\f40\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} +{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f81\fbidi \fswiss\fcharset238\fprq2 Helvetica CE;}{\f82\fbidi \fswiss\fcharset204\fprq2 Helvetica Cyr;} +{\f84\fbidi \fswiss\fcharset161\fprq2 Helvetica Greek;}{\f85\fbidi \fswiss\fcharset162\fprq2 Helvetica Tur;}{\f86\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);}{\f87\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);} +{\f88\fbidi \fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f89\fbidi \fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} +{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} +{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f431\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f432\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} +{\f434\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f435\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f438\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f439\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);} +{\f441\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;} +{\f448\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f449\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} +{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; +\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; +\caccentone\ctint255\cshade191\red54\green95\blue145;\caccentone\ctint255\cshade255\red79\green129\blue189;\ctexttwo\ctint255\cshade191\red23\green54\blue93;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128; +\ctextone\ctint255\cshade255\red0\green0\blue0;\red51\green51\blue51;\red43\green145\blue175;\cbackgroundone\ctint255\cshade191\red191\green191\blue191;}{\*\defchp \f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs28\alang1025 \ltrch\fcs0 \b\fs28\cf17\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid13184707 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 \b\fs26\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 2;}{\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 +\ab\af0\afs22\alang1025 \ltrch\fcs0 \b\fs22\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink17 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 3;}{\*\cs10 \additive +\sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused +Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\cf17\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid13184707 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs26 \ltrch\fcs0 +\b\fs26\cf18\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid12068581 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf18\loch\f31502\hich\af31502\dbch\af31501 +\sbasedon10 \slink3 \slocked \spriority9 \styrsid12068581 Heading 3 Char;}{\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 \sbasedon1 \snext0 \ssemihidden \sunhideused \sqformat \spriority39 \styrsid7372180 TOC Heading;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 +\sbasedon10 \sunhideused \styrsid8939988 Hyperlink;}{\s20\ql \li0\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 1;}{\s21\ql \li220\ri0\sa100\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 +toc 2;}{\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 3;}{\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\contextualspace \rtlch\fcs1 +\af0\afs52\alang1025 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink24 \sqformat \spriority10 \styrsid7372180 Title;}{\*\cs24 \additive +\rtlch\fcs1 \af0\afs52 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\kerning28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink23 \slocked \spriority10 \styrsid7372180 Title Char;}{\s25\ql \li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +\sbasedon0 \snext25 \sqformat \spriority34 \styrsid6453762 List Paragraph;}{\s26\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \sbasedon0 \snext26 \ssemihidden \sunhideused \styrsid11687369 Normal (Web);}{\*\cs27 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid11687369 apple-converted-space;}{\* +\ts28\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af37\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon11 \snext28 \spriority59 \styrsid5114927 +Table Grid;}{\*\cs29 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \styrsid11032164 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid740077246\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid382339409}{\list\listtemplateid1903328102\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 +\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext +\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;} +\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 +\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 } +{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid401637325}{\list\listtemplateid508579338 +\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916433\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel +\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 +\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 +\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid405616751}{\list\listtemplateid1306685724\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0 +\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 +\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 +\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid484125747}{\list\listtemplateid1826631064{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers +\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 +\ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 } +{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid723678808} +{\list\listtemplateid-842228772\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1138174080\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6840\lin6840 }{\listname ;}\listid950892184}{\list\listtemplateid-1038568524\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;} +\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 } +{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel +\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0 +\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4 +\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 +\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1199853486} +{\list\listtemplateid-1235995406\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 +\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 +\fi-180\li6480\lin6480 }{\listname ;}\listid1997226378}{\list\listtemplateid-2031863006\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1313997542 +\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 +\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 +\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 +\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid2120176231}}{\*\listoverridetable{\listoverride\listid405616751\listoverridecount0\ls1}{\listoverride\listid2120176231\listoverridecount0\ls2} +{\listoverride\listid950892184\listoverridecount0\ls3}{\listoverride\listid484125747\listoverridecount0\ls4}{\listoverride\listid1997226378\listoverridecount0\ls5}{\listoverride\listid723678808\listoverridecount0\ls6}{\listoverride\listid1199853486 +\listoverridecount0\ls7}{\listoverride\listid382339409\listoverridecount0\ls8}{\listoverride\listid401637325\listoverridecount0\ls9}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} +{\*\rsidtbl \rsid97460\rsid221265\rsid284426\rsid537180\rsid664540\rsid735477\rsid735614\rsid738226\rsid879886\rsid935281\rsid1070110\rsid1510934\rsid1583585\rsid1586953\rsid1598011\rsid1775295\rsid1841268\rsid1903893\rsid1926955\rsid1967093\rsid2060806 +\rsid2177067\rsid2243939\rsid2312332\rsid2783484\rsid2827362\rsid2846494\rsid2890017\rsid2959880\rsid2981254\rsid3290111\rsid3490457\rsid3741585\rsid3829756\rsid4010500\rsid4327818\rsid4477453\rsid4484449\rsid4522593\rsid4545630\rsid5050788\rsid5114927 +\rsid5794820\rsid5921453\rsid6438937\rsid6453762\rsid6518571\rsid6886783\rsid7160127\rsid7237901\rsid7289096\rsid7292194\rsid7372180\rsid7816154\rsid8091909\rsid8145172\rsid8329235\rsid8339308\rsid8475156\rsid8479050\rsid8651410\rsid8728997\rsid8847473 +\rsid8852142\rsid8939988\rsid9049101\rsid9068514\rsid9132688\rsid9137041\rsid9332253\rsid9639182\rsid9639869\rsid10224112\rsid10314410\rsid10845574\rsid11032164\rsid11212548\rsid11687369\rsid11802269\rsid12024666\rsid12060006\rsid12068581\rsid12129336 +\rsid12348517\rsid12584760\rsid13184707\rsid13261933\rsid13513498\rsid13586263\rsid13596290\rsid13722641\rsid13847658\rsid14041828\rsid14097242\rsid14228117\rsid14243083\rsid14371182\rsid14497238\rsid14513928\rsid14565649\rsid14684873\rsid14885541 +\rsid15205038\rsid15221525\rsid15280621\rsid15795287\rsid15819295\rsid15938139\rsid16071677\rsid16142742\rsid16259852\rsid16349201\rsid16469695\rsid16712264}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 +\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun Wilde}{\creatim\yr2012\mo1\dy3\hr1\min4}{\revtim\yr2016\mo1\dy31\hr14\min3}{\printim\yr2016\mo1\dy31\hr14\min2}{\version61}{\edmins4613}{\nofpages11}{\nofwords3439}{\nofchars19608} +{\*\company Microsoft}{\nofcharsws23001}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 +\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot284426\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180\contextualspace \rtlch\fcs1 \af0\afs52\alang1025 \ltrch\fcs0 +\fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13184707 \hich\af31502\dbch\af31501\loch\f31502 OpenCover Usage Guide}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 {\*\bkmkstart _Toc442012125}\hich\af31502\dbch\af31501\loch\f31502 Intro{\*\bkmkend _Toc442012125} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 The following guide describes how to use }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 HYPERLINK "https://github.com/OpenCover/opencover"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f004f00700065006e0043006f007600650072002f006f00700065006e0063006f007600650072000000795881f4 +3b1d7f48af2c825dc485276300000000a5ab000000000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 OpenCover}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 HYPERLINK "http://nuget.org/packages/OpenCover/" }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6200000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f004f00700065006e0043006f007600650072002f000000795881f43b1d7f48 +af2c825dc485276300000000a5ab0000004500000000ff00ffe65b0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid221265\charrsid221265 NUGET}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 to gather coverage statistics of your application. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid879886\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 C}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 an handle 32 and 64 bit .NET processes running on the .NET 2 and .NET 4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 frameworks. }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 b)\tab}W}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 ill gather sequence and branch coverage informatio +n of your assemblies that match the filters and for which the PDB files can be found.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 c)\tab}Can gather coverage reports of Silverlight applications +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 d)\tab}Can gather coverage reports of Windows Service applications. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 e)\tab}Can record which tests where executing at a particular time when a coverage point was visited \endash + only MSTest and NUnit supported (requests accepted for others).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 Currently OpenCover has no }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid735477 full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 presentation of results other than the XML output file; }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 HYPERLINK "http://www.palmmedia.de/Net/ReportGenerator" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7000000068007400740070003a002f002f007700770077002e00700061006c006d006d0065006400690061002e00640065002f004e00650074002f005200650070006f0072007400470065006e006500720061007400 +6f0072000000795881f43b1d7f48af2c825dc485276300000000a5ab00006c0000000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 ReportGenerator}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 + HYPERLINK "http://nuget.org/packages/ReportGenerator/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f005200650070006f0072007400470065006e0065007200610074006f007200 +2f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000005600000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid879886\charrsid879886 NUGET}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 is currently the recommended tool for visualizing the results. +\par NOTE: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 When there is n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 o PDB for an assembly then no coverage data will be gathered; this is different to }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid879886 HYPERLINK "https://github.com/sawilde/partcover.net4" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0073006100770069006c00640065002f00700061007200740063006f007600650072002e006e00650074003400 +0000795881f43b1d7f48af2c825dc485276300000000a5ab0000da0000000000ff00ff1f000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 PartCover}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 which will default to IL coverage under this situation but it + was considered as not required as this is supposed to be a code-coverage tool which can relate such coverage to }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\i\insrsid1775295\charrsid4484449 your}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 code. +\par }\pard\plain \ltrpar\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 +\b\fs28\cf17\lang1033\langfe1041\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 \hich\af31502\dbch\af31501\loch\f31502 Table of Contents +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 TOC \\o "1-3" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012125"}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Intro}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012125 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 1}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012126"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Command Arguments}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012126 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012127"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Mandatory}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012127 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012128"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012128 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012129"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Handling Spaces}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012129 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 5}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012130"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Understanding Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012130 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012131"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012131 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012132"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Regular Expressions in Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012132 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012133"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012133 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012134"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against IIS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012134 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012135"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Running against an application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +\tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012135 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012136"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012136 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012137"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Silverlight application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012137 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012138"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012138 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012139"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Running against a Service application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012139 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012140"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF +_Toc442012140 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012141"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludeb\hich\af31506\dbch\af31501\loch\f31506 +yattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012141 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012142"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012142 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012143"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Shimming support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012143 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012144"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Microsoft Moles support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012144 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012145"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Microsoft Fakes support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012145 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012146"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 TypeMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012146 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012147"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 JustMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012147 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012148"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Build system integration}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 + PAGEREF _Toc442012148 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012149"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 all-users (32-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 +PAGEREF _Toc442012149 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012150"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 all-users (64-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012150 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012151"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 single-user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } +{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012151 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012152"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 R\hich\af31506\dbch\af31501\loch\f31506 eporting}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012152 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012153"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 FAQ}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst { +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012153 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012154"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 +\hich\af31506\dbch\af31501\loch\f31506 Why do I have no results?}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012154 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield +08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 +\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012155"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 All my tests are failing and I am getting MissingMethodException}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012155 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1024\langfe1024\noproof\webhidden\insrsid16712264 11}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 }}\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1 +\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +{\*\bkmkstart _Toc442012126}\hich\af31502\dbch\af31501\loch\f31502 Command Arguments{\*\bkmkend _Toc442012126} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988 OpenCover has a number of arguments that can be used to control the code coverage gathering. If an argument requires s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988\charrsid8939988 paces}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid8939988\charrsid8939988 then use "}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8939988 \rquote s to wrap the argument, where they are applicable they will be indicated with an optional syntax [].}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid4484449 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012127}\hich\af31502\dbch\af31501\loch\f31502 Mandatory{\*\bkmkend _Toc442012127} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 ["]-target:<}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 target application}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 >["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid16349201 +The name of the target application or service that will be started; this can also be a path to the target application. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 Alternatively use }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -?}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 to show command line help, or }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2060806\charrsid2060806 -version}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 + to print the current version and exit.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012128}\hich\af31502\dbch\af31501\loch\f31502 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8939988 {\*\bkmkend _Toc442012128} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16349201 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 ["]-targetdir:["] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 +The path to the target directory; if the target argument already contains a path then this argument can be used to provide an alternate path wh}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 ere PDB files may be found. }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid16349201 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8728997\charrsid5050788 -targetargs:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Arguments to be passed to the target process.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1841268 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 [\'93]-searchdirs:[;[\'93] + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 \tab Additional locations to check for PDB files.\page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -register[:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid9639182 |path32|path64}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Use this switch to register and d +e-register the code coverage profiler. Alternatively use the optional }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid9639182 user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 + argument to do per-user registration where the user account does not have administrative permissions. }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 +\par If access to registry is limited then try the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path64}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid9639182 , depending on your application (32- or 64-bit), to use an alternate method to load the profiler; unfortunately you cannot profile 32- and 64-bit processes at the same time using these switches.}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid9639182\charrsid9639182 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Alternatively use an administrative account to register the profi}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 lers using t +he regsvr32 utility; this is the recommended option when running on a build server especially if \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 \endash register:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 does not work. + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid13513498 -returntargetcode[:] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953\charrsid2783484 +Return the target process return code instead of the OpenCover console return code. Use the offset to return the OpenCover console at a value outside the range returned by the target process. }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid1586953\charrsid1586953 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid15205038 -safemode:on|off|yes|no +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Use this switch to disable safe mode (default is }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \b\insrsid15205038\charrsid15205038 on}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 /yes). When in safe mode the profiler will use a common buffer for all threads which may have performance impacts if you code or tests use threads he +avily. When safe mode is disabled, there may on occasions be some data loss if the runtime closes the application under profile before the profiler has been able to retrieve the visit count data. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid5050788\charrsid13513498 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12068581\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5050788 +The location and name of the output xml file. If no value is supplied then the current directory will be used and the outpu}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 t filename will be results.xml.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid2312332 -threshold: +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +Limits the number of visit counts recorded/reported for an instrumentation point. May have some performance gains as it can reduce the number of messages sent fr +om the profiler. Coverage results should not be affected but will have an obvious impact on the Visit Counts reported.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid664540\charrsid13513498 -filter:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 A list of filters to apply to selectively include or +exclude assemblies and classes from coverage results. Filters have their own form}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid9332253 at }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540 \'b1[module}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\b\insrsid664540\charrsid9332253 -filter]class-filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 . If no filter(s) are supplied then a default include all filter is applied +[*]*. As can be seen you can use an * as a wildcard. +\par +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540\charrsid13261933 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 : Also an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 exclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (-) +filter takes precedence over an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 inclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid13261933 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (+) filter.}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9639869 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid9639869\charrsid9639869 -regex +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 \tab +\par \tab Filters are supplied using regular expressions rather than wildcards. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14243083\charrsid13513498 -nodefaultfilters +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 A list of default exclusion filters are usually applied}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid10314410\charrsid2783484 , this option can be used to turn them off. The default filters are:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 +\par }\pard \ltrpar\ql \li1440\ri0\widctlpar\wrapdefault\faauto\rin0\lin1440\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -[mscorlib]* +\par -[mscorlib.*]* +\par -[System]* +\par -[System.*]* +\par -[Microsoft.VisualBasic]* +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid13513498 -mergebyhash +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 +Under some scenarios e.g. using MSTest, an assembly may be loaded many times from different locations. This option is used to merge the coverage results for an assembly regardless of where it was loaded as +suming the assembly has the same file-hash in each location. +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 -skipautoprops}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid2846494 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid2846494 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 Neither track nor record Auto-Implemented properties. +\par +\par i.e. skip getters and setters like these +\par +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 public}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 bool}{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 Service \{ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 get}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; }{ +\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 set}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; \}}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid2846494 +\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 -showunvisited +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 Show a list of unvisited methods and classes after the coverage run is finished}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid664540 and the results are presented.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15205038 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid9639182 [\'93]-}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid15205038 excludeddirs:[;[\'93 +] +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Any assembly found in an excluded folder (or its children) will be ignored, regardless of any inclusive +filter matches.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2846494 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14228117\charrsid2783484 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyattribute:[;][;]} +{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2783484\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +Exclude a class or method by filter(s) that match attributes that have been applied that have been applied.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid4327818 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyfile:[;][;] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid4327818 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 Exclude a class (or methods) by filter(s)}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid13513498 that match the filenames.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 -hideskipped:}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid3490457\charrsid15280621 File|Filter|Attribute|MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 +MissingPdb }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid664540 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 Excl +udedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 [}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457 {\*\bkmkstart OLE_LINK1}{\*\bkmkstart OLE_LINK2};}{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 File|}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid15280621 Filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |Attribute}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid15280621\charrsid15280621 |MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 MissingPdb }{ +\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15205038 {\*\bkmkend OLE_LINK1}{\*\bkmkend OLE_LINK2}|ExcludedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 ] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 Remove information from output file (}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid12060006\charrsid8475156 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ) that relates to classes/modules that have been skipped (filtered) due to the use of}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 + the following switches}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3741585 excludeb}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid12060006\charrsid8475156 yfile}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ,}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid3741585\charrsid3741585 \_}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid3741585 e}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 xcludebyattribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 e:}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid3741585 and}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 filter}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \i\insrsid8475156\charrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 or where the PDB is missing}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5794820 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5794820 -coverbytest}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid5794820\charrsid13513498 :[;][;] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1967093 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +Gather coverage by test by analysing the assemblies that match these filters for Test m}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 ethods. Currently only }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8339308 MSTest and }{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5794820 NUnit tests}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 are supported; other frameworks can be added on request \endash please raise support request on GitHub.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -log:[Off|Fatal|Error|Warn|Info|Debug|Verbose|All] + +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 Change the logging level, default is set to Info. }{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13513498\charrsid13513498 Logging is based on log4net logging levels and appenders}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 . +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -service +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15795287 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid15795287\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid15795287 : \'93Administrator\'94 privileges recommended. +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 +The value provided in the target parameter is the name of a service rather than a name of a process. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8145172\charrsid8145172 -servicestarttimeout:[1m|23s|1m23s] +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8145172 Overrides the default time to wait for the profiled service t +o start. The examples above correspond to a timeout of 1 minute, 23 seconds and 1 minutes and 23 seconds accordingly. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\i\insrsid14513928 oldstyle}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14513928 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 Use old style instru}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid3490457 mentation \endash the instrumentation}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 is not Silverlight friendly and is provided to support environments where mscorlib instrumentation is not working. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2312332\charrsid2312332 -enableperformancecounters +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid2312332\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332 : \'93Administrator\'94 privileges}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15795287 required}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 . +\par Allows the monitoring in \'93Performance Monitor\'94 of the following }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 values}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 : +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li1080\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1080\itap0\pararsid2312332\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid2312332\charrsid2312332 \'93messages remaining on the queue}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 \'94 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 2)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 \'93number of messages processed\'94 +}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7816154 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 These values are usually cleared at the end of a performance run.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154\charrsid7816154 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 {\*\bkmkstart _Toc442012129}\hich\af31502\dbch\af31501\loch\f31502 Handling Spaces}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid14513928 {\*\bkmkend _Toc442012129} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 If your argument needs to escape quotes i.e. to pass arguments with spaces to the target process then you can use \\". +\par e.g. +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid4484449\charrsid8847473 -targetargs:"\\"c:\\program files\\" arg2 arg3" + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 Or +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8847473\charrsid8847473 \'93-targetargs:\\"c:\\program files\\ +" arg2 arg3" +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid4484449 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 {\*\bkmkstart _Toc442012130}\hich\af31502\dbch\af31501\loch\f31502 Understanding Filters +{\*\bkmkend _Toc442012130} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2827362 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 Filters are core to understanding how OpenCover works and how it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 is determined}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 + which assemblies are to be instrumented to provide coverage results. +\par Filters can be inclusive and exclusive represented by + and }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 \endash prefix }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 respectively, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 where e}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid2827362 xclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (-) filters take precedence}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 over inclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (+)}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid2827362 filters. +\par The next }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 part of a filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 +is the module-filter and usually this happens to be the same name as the assembly but without the extension and this rule will normally apply 99.999% of the time. If this filter isn\rquote +t working look in the coverage XML and compare the found entries against the filter.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 The final part of the filter is the class-filter and this also }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 includes}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 the namespace part of the class as well. + +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 {\*\bkmkstart _Toc442012131}\hich\af31502\dbch\af31501\loch\f31502 Examples{\*\bkmkend _Toc442012131} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +[Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +*]* -[Open.Test]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 -[Open]Data.*\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid3290111\charrsid3290111 +\par +[Open]* -[Open]*Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes ending with Attribute. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012132}\hich\af31502\dbch\af31501\loch\f31502 Regular Expressions in Filters +{\*\bkmkend _Toc442012132} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 It is also possible to use regular expressions instead of wildcards but to do so require that you use the \endash regex swit +ch when specifying the filters. NOTE: When using this feature it is required that all filters use regular expressions rather than wildcards. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid9639869 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012133}\hich\af31502\dbch\af31501\loch\f31502 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid9639869 {\*\bkmkend _Toc442012133}\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid9639869 +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 \\.}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 \\}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 .Test}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 +\f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 ) -[(Open)](Data\\..*)\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 +\af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 +Include all classes in module Open but exclude all classes ending with Attribute.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639869 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid3290111 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 {\*\bkmkstart _Toc442012134}\hich\af31502\dbch\af31501\loch\f31502 Running against IIS +{\*\bkmkend _Toc442012134} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 Normally I\rquote d suggest running against }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 HYPERLINK "http://www.microsoft.com/en-us/download/details.aspx?id=1038" }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f0064006f0077006e006c006f00610064002f006400 +65007400610069006c0073002e0061007300700078003f00690064003d0031003000330038000000795881f43b1d7f48af2c825dc485276300000000a5ab0000000000000039000065960800}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid10224112\charrsid10224112 IISEXPPRESS}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 as I think it is easier to automate. However for those}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14565649 + who really want to run against a full blown IIS then the following instructions (supplied by a }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid14565649\charrsid14565649 user) will hopefully suffice.}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 +\par \'93}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 The trick is to start OpenCover to run the}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid14565649 w3wp.exe process in debug mode}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\insrsid11687369\charrsid14565649 e.g. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe -targetargs:-debug\~\line -targetdir:C:\\Inetpub\\wwwwoot\\MyWebApp +\\bin\\ -filter:+[*]* -register:user +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 There are some prerequisites tho}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 ugh:}{ +\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 \hich\af31506\dbch\af0\loch\f31506 1.\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid14565649\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ll applications running under the site must }{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 make use of the same app pool; y}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ou'll get error}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 s in the EventLog otherwise. +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 \hich\af31506\dbch\af0\loch\f31506 2.\tab}}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command: +\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 +{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net stop w3svc /y +\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +fter testing/code coverage completion you can close the w3wp.exe proce}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 s}{\rtlch\fcs1 \af4 \ltrch\fcs0 +\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 s and start the inetserver again: +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net start w3svc +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 {\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 +This procedure was tested on a Win2008 machine with IIS7.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 You can also run multiple OpenCover instances against separate IIS sites by using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\cf21\insrsid12584760 \endash }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\cf21\insrsid12584760\charrsid12584760 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 option when running IIS to choose the siteid e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760\charrsid12584760 +\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12584760 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetargs:"-debug -s 1" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetdir:%WebSite_Path% }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -filter:+[*]* }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -output:%CoverageResult_Path%}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12584760 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12584760 Then you can use ReportGenerator to merge the coverage results. }{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012135}\hich\af31502\dbch\af31501\loch\f31502 Running against an application +{\*\bkmkend _Toc442012135} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7237901 This most common usage }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 of any code coverage utility such as OpenCover }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7237901 is in a testing environment}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid12068581 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7237901 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13513498 {\*\bkmkstart _Toc442012136}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012136} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13513498 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid13513498\charrsid7237901 OpenCover.Console.exe -register:user -target:..\\..\\..\\tools\\NUnit-2.5.10.11092\\bin\\net-2.0\\nunit-console-x86.exe -targetargs:"OpenCover.Test +.dll /noshadow" -filter:"+[Open*]* -[OpenCover.T*]*" -output:opencovertests.xml +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012137}\hich\af31502\dbch\af31501\loch\f31502 Running against a Silverlight application +{\*\bkmkend _Toc442012137} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid16469695 To run against a Silverlight application it is necessary to ensure the site hosting the application is runni +ng beforehand. To profile a Silverlight application it is necessary to launch a browser against the site and as the PDB files are not packaged in the XAP files it is necessary to give the console a hint where to look for the PDB files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1510934 (using the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 \endash targetdir}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 option)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 . +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12068581 {\*\bkmkstart _Toc442012138}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012138} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "-target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid16469695\charrsid12068581 -targetar}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 gs:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 http://localhost:4128/SampleSilverlightTestPage.aspx}{ +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 -t}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid8728997 argetdir:..}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 \\SampleSilverlight\\SampleSilverlight\\Bin\\Debug"}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012139}\hich\af31502\dbch\af31501\loch\f31502 Running against a Service application +{\*\bkmkend _Toc442012139} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid7289096 It is preferable to run the service in a console mode if it has one rather than as a service however if you do decide to use it against a service then you will nee +d to make sure you use an account that can access the windows synchronisation objects in the Global namespace (rather than Local namespace). \'93Local System\'94 seems to work quite well and so do user accounts w}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid8479050 ith the appropriate permissions;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 \'93Local Service\'94 is}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 usually}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 + problematic and is not recommended. The console host will also need to be run from an account that can access the Global namespace as such an Administrator account or an Administrative prompt is recommended}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 +.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 {\*\bkmkstart _Toc442012140}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012140} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16349201 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 +OpenCover Sample Service" -service }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid8479050 \endash }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 register}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8479050 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid8479050 NOTE}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 +: Rather than use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 \endash register}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 switch, it is usually simpler to use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 regsvr32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 utility to pre-register the two profiler assemblies (32 and 64-bit) beforehand.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid12068581 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid738226 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkstart _Toc442012141}\hich\af31502\dbch\af31501\loch\f31502 Using +\hich\af31502\dbch\af31501\loch\f31502 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid4327818\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyattribute}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 \hich\af31502\dbch\af31501\loch\f31502 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkend _Toc442012141} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid4327818 Normally you would include/exclude modules and classes by using the inclusion/exclusion filters, however there may be situations where you can\rquote t get coverage via testing and you wish to ignore the uncovered method. + +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 First create a \'93public\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + attribute that you can apply to class/method/property which you use to mark up something to ignore. You can have more than one and you can add other data to provide a reason why you are excluding it. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 e.g. +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 [}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 +AttributeUsage}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 (}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 .Class|}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 .Method|}{\rtlch\fcs1 \af40\afs16 +\ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226 .Property)] +\par }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \b\f40\fs16\cf2\insrsid738226\charrsid1775295 public}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf2\insrsid738226\charrsid738226 class} +{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 ExcludeFromCoverageAttribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 +\f40\fs16\insrsid738226\charrsid738226 : }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 Attribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 \{\} +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\insrsid738226 +\par +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 Then you apply this attribute to the class/method/property that you wish to exclude. + +\par Then you add this attribute to the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid1510934 excludebyattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 + option using namespaces and wildcards where necessary. +\par e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 +-excludebyattribute:*.ExcludeFromCoverage* +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 NOTE: Use with care as you could exclude a method which you should be testing}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 ;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 {\*\bkmkstart _Toc442012142}\hich\af31502\dbch\af31501\loch\f31502 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 \hich\af31502\dbch\af31501\loch\f31502 option}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012142} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 This is a useful option to use to ignore a}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 uto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 generated files}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid738226 . This works on file and pathnames. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 + the following would ignore all code in files ending in }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9049101\charrsid9049101 generated.cs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 -excludebyfile}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 +\f2\fs16\insrsid738226\charrsid738226 :}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 *\\}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid2177067 *.generated.cs}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 + +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 +NOTE: Use with care as you could exclude a method which you should be testing; also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid5114927 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012143}\hich\af31502\dbch\af31501\loch\f31502 Shimming support}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927\charrsid5114927 {\*\bkmkend _Toc442012143} +\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\pard\plain \ltrpar\qj \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5114927\yts28 \rtlch\fcs1 \af0\afs22\alang1025 +\ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 In comput +er programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby + +causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can als +o be used for running programs on different software platforms than they were developed for. +\par - }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 HYPE +RLINK "http://en.wikipedia.org/wiki/Shim_%28computing%29" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7c00000068007400740070003a002f002f0065006e002e00770069006b006900700065006400690061002e006f00720067002f00770069006b0069002f005300680069006d005f0025003200380063006f006d007000 +7500740069006e0067002500320039000000795881f43b1d7f48af2c825dc485276300000000a5ab00000465a901000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid5114927\charrsid5114927 wikipedia}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 +\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 +\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5114927 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid5114927 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 Depending on the provider of the Shimming utility will determine on how the OpenCover will be used alongside it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid2243939\charrsid2243939 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012144}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Moles support +{\*\bkmkend _Toc442012144} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 To use Moles with OpenCover requires that you first inform Moles that you are using OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 Before you run moles you need to set an environment variable +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +set CLRMONITOR_EXTERNAL_PROFILERS=\{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8\} +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 Then use OpenCover to run the moles runner +\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012145}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Fakes support +{\*\bkmkend _Toc442012145} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 OpenCover has support for }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 HYPERLINK "https://msdn.microsoft.com/en-us/library/hh549175.aspx" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 +{\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b86000000680074007400700073003a002f002f006d00730064006e002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006c006900620072006100720079002f00 +680068003500340039003100370035002e0061007300700078000000795881f43b1d7f48af2c825dc485276300000000a5ab00003000000000eb08}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid2243939\charrsid2243939 Microsoft Fakes}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 just use OpenCover to execute vstest.cons +ole.exe and it will detect if the Microsoft Fakes profiler is going to be activated and it will do the rest. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid5921453 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 {\*\bkmkstart _Toc442012146}\hich\af31502\dbch\af31501\loch\f31502 TypeMock support +{\*\bkmkend _Toc442012146} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 developers}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 at TypeMock add}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 ed}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid5921453 OpenCover support several years ago; please review their documentation to get both TypeMock and OpenCover to work correctly with the versions you have installed. +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8091909 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\bkmkstart _Toc442012147}\hich\af31502\dbch\af31501\loch\f31502 JustMock support +{\*\bkmkend _Toc442012147} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 The developers at JustMock have also added support for OpenCover; please review their }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 + HYPERLINK "http://www.telerik.com/help/justmock/integration-opencover.html" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9800000068007400740070003a002f002f007700770077002e00740065006c006500720069006b002e0063006f006d002f00680065006c0070002f006a007500730074006d006f0063006b002f0069006e0074006500 +670072006100740069006f006e002d006f00700065006e0063006f007600650072002e00680074006d006c000000795881f43b1d7f48af2c825dc485276300000000a5ab0000002f00000700}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid8091909\charrsid8091909 documentation}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 to get both JustMock and OpenCover to work correctly with the versions you have installed.}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid8091909\charrsid2243939 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 {\*\bkmkstart _Toc442012148}\hich\af31502\dbch\af31501\loch\f31502 Build system integration}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012148} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 It is not unexpected that OpenCover will be used in a build environment and that the build will be running under a system account under these scenarios it is recommended that you pre-register the prof +iler DLLs using the regsvr32 utility where applicable for your environment. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid1926955\charrsid1903893 regsvr32 x86\\OpenCover.Profiler.dll\line regsvr32 x64\\OpenCover.Profiler.dll +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 To assist your build environment when you install OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 using the MSI}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 it will store in the registry a lo +cation of the installation folder. The location in the registry depends on whether it is a single-user or}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 an}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 all-user installation and}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid1903893 also}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 if you}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 are on a 32/64 bit environment. +\par See the following examples based on default settings:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012149}\hich\af31502\dbch\af31501\loch\f31502 all-users +\hich\af31502\dbch\af31501\loch\f31502 (32-bit){\*\bkmkend _Toc442012149} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012150}\hich\af31502\dbch\af31501\loch\f31502 all-users (64-bit) +{\*\bkmkend _Toc442012150} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\Wow6432Node\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{ +\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES(X86)%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012151}\hich\af31502\dbch\af31501\loch\f31502 single-user{\*\bkmkend _Toc442012151} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKCU\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 +\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %LOCALAPPDATA%\\Apps\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 {\*\bkmkstart _Toc442012152}\hich\af31502\dbch\af31501\loch\f31502 Reporting{\*\bkmkend _Toc442012152} + +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7160127 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 It is recommended that ReportGenerator (also available on Nuget) is used to view the coverage results however if you want to make your own reporting then a sample XSLT has been made available by }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 Pavan Tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 (}{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 HYPERLINK "}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 +https://github.com/pawan52tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 " }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0070006100770061006e00350032007400690077006100720069000000795881f43b1d7f48af2c825dc4852763 +00000000a5ab0000006f000000005b5a088700ff00}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid7160127\charrsid2981254 https://github.com/pawan52tiwari}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 ). It is simple to use with the supplied powershell script. +\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid7160127\charrsid7160127 powershell -noexit -file ..\\..\\transform\\transform.ps1 -xsl ..\\..\\transform\\simple_report.xslt -xml opencovertests.xml -output simple_output.html +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 Feel free to extend it to your own requirements. +\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 +\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012153}\hich\af31502\dbch\af31501\loch\f31502 FAQ{\*\bkmkend _Toc442012153} +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 {\*\bkmkstart _Toc442012154}\hich\af31502\dbch\af31501\loch\f31502 Why do I have no results?}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkend _Toc442012154} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 There are two common reasons why this may happen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid8847473 +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 1) Instrumentation skipped due to filters. +\par The usual reason for no results}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 because OpenCover cannot locate the PDBs for assemblies that match the filters to be profiled i.e. gather c +overage results from. When each assembly is loaded the location and reason the assembly wasn\rquote t profiled is provided in the coverage results file e.g. +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8852142 {\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 +\f2\fs14\insrsid8852142\charrsid8852142 \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 C:\\Personal\\opencover.git +\\working\\main\\bin\\Debug\\OpenCover.Test.dll\line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 OpenCover.Test\line \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid7372180 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 The two most common reasons}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8329235 provided}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 are }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter} +{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 is obviously connected to the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8852142\charrsid1510934 \endash filter:}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid8852142 argument and that the ModuleName was not matched}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid2827362\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 is usually because the PDB is not where the assembly is being loaded from}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 +. The most common reason is }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 due to }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 test tools such as NUnit or MSTest which copy the assembly under test to a new location}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8329235 ; t}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 his can be corrected by either using the /no}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 shadow or /noisolation option. An alternative is to use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 +\i\insrsid8329235\charrsid1510934 \endash targetdir:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 argument to provide an alternative location for OpenCover to use.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 The other reasons are only applicable to classes and are related to the use of \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyattribute}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \i\insrsid8329235\charrsid1510934 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyfile:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 options. +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 2) Failure to register the profiler assemblies. +\par The profiler assemblies are COM objects and need to be registered in the Registry before the target process is run. +\par This can }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 usually }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 be solved in }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 one of }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 two ways}{\rtlch\fcs1 +\af37 \ltrch\fcs0 \insrsid13596290 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid8847473\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid8847473 Use the }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8847473\charrsid1510934 \endash register[:user] }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 switch +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 b)\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 Pre-register the assemblies using the regsvr32 utility}{\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid5921453\charrsid5921453 +\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 +\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012155}\hich\af31502\dbch\af31501\loch\f31502 +All my tests are failing and I am getting MissingMethodException{\*\bkmkend _Toc442012155} +\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 This has been seen on a few systems}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6453762 where the following command has been executed to improve performance (or something similar)}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid14513928 +\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen install /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 +\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 The}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3490457 re}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 are two ways to fix or handle this issue +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid6453762\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 +\insrsid6453762 Undo the previous command - }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen uninstall /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 .}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 + +\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 2)\tab}Use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid6453762\charrsid1510934 \endash oldstyle}{\rtlch\fcs1 \af37 +\ltrch\fcs0 \insrsid6453762 switch, note however that this is not Silverlight friendly. }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762\charrsid6453762 +\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a +9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad +5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 +b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 +0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 +a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f +c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 +0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 +a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 +6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b +4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b +4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f +7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 +615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad +79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b +5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab +999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 +699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 +8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 +0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f +9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be +15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 +3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d +32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a +f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 +e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 +fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 +ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae +a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 +399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 +4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 +0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b +c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 +689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 +5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 +aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d +316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 +545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a +c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 +0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 +8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 +d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 +1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f +bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 +a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a +0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 +0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 +00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title; +\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; +\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; +\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; +\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; +\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; +\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; +\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; +\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; +\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; +\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; +\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; +\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; +\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; +\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; +\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; +\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; +\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; +\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d03b +4506d45bd1010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000d03b4506d45bd101 +d03b4506d45bd101000000000000000000000000dc00c600d3004b00c000350050003100c600d400d200d600d1004400c2005900cd00d3004700c300490041003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d03b4506d45b +d101d03b4506d45bd1010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 +2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 +0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38314341 +364346322d444246332d344339422d423643342d3338393842373331413332307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt new file mode 100644 index 0000000000..7e5988f730 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt @@ -0,0 +1,21 @@ +Welcome to OpenCover. + +OpenCover is an open source (MIT licence) code coverage utility for all .NET +Frameworks (2 and above, including Silverlight). It can handle all .NET +languages as long as the compiled assemblies use the .NET Runtime. + +It is most commonly used to gather coverage data of code that is being +exercised by unit testing i.e. nunit, mstest etc. + +We recommend that you view the documents that have also been installed +alongside the utility to get started or you can look at the documentation +provided on the wiki https://github.com/OpenCover/opencover/wiki/Usage. + +Currently OpenCover has no visualization of its results and we recommend that +your use ReportGenerator (2.1.8 and above) to view the results against your code. + +A sample project showing a possible way to use OpenCover with ReportGenerator +has also been provided for your convenience. + +If you have any issues or feature requests with OpenCover please raise them +with the project owners on https://github.com/opencover/opencover. diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll new file mode 100644 index 0000000000000000000000000000000000000000..230786aa2498e16803f418a8d2c8a8a3bf349312 GIT binary patch literal 40448 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll new file mode 100644 index 0000000000000000000000000000000000000000..f2d05ec7ac96b4ad498e8edd3214379a08bb61ec GIT binary patch literal 109056 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 OTJMg-`82$=T)n$Y}m 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 whUsj5>c4$9R81c8Q-3^1DHgqevF<7iN% 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 dcQ~f^cj_Ex&Hq%`#-4${vTJ~v8ez6 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll new file mode 100644 index 0000000000000000000000000000000000000000..bf3acf1795f96526cf4c86b1cb18d1cacfb9dd79 GIT binary patch literal 280576 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 N(3l^$;op`5{~x`C!AAf9 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe new file mode 100644 index 0000000000000000000000000000000000000000..b1c416d5314029b540c5720c85122dd8fec09f5a GIT binary patch literal 80384 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 cfJf}V$Db + + +

+ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll new file mode 100644 index 0000000000000000000000000000000000000000..cb691377e090bc944deb1dfcd219763c23985093 GIT binary patch literal 11264 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll new file mode 100644 index 0000000000000000000000000000000000000000..1accffc18dd5a1b62ef223bcffabc9cb156b3d64 GIT binary patch literal 151040 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config new file mode 100644 index 0000000000..d6c61f7078 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config @@ -0,0 +1,39 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..47cd9ad41bd21c765693ef396831e01a13f80f8f GIT binary patch literal 301056 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 literal 0 HcmV?d00001 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt new file mode 100644 index 0000000000..e8367515a7 --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt @@ -0,0 +1,332 @@ + + + + + + + + + +

Code Coverage Report

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Generated on: + + +
+ Parser: + + Pawan Tiwari's Parser +
+ Assemblies: + + +
+ Files: + + +
+ Coverage: + + % +
+ Covered lines: + + +
+ UnCovered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + Yet To be discovered + +
+

+ Assemblies +

+

+ Collapse all classes | Expand all classes +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Details +
+ + + + + + + + + + + + + + + + + + + + + +
+ Classes: + + +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Coverage: + + + + % + + + 0 + + +
+
+
+ + % + + + + + + + + +
+   + +   +
+
+

+ Class Name: +

+
+ % + + + + + + + +
+   + +   +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ Class: + + +
+ Assembly: + + +
+ File(s): + + + + + + + +
+ Coverage: + + + % +
+ Covered lines: + + +
+ Coverable lines: + + +
+ Total lines: + + 51 +
+
+ + + + + + + + + + + + + + + + + +
+ Method + + Cyclomatic Complexity + + Sequence Coverage + + Branch Coverage + + Static Method +
+ + + + + + + + + + +
+
+ + + diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 new file mode 100644 index 0000000000..72008aafae --- /dev/null +++ b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 @@ -0,0 +1,17 @@ +[CmdletBinding()] +Param( + [Parameter(Mandatory=$True,Position=1)] + [string]$xsl, + + [Parameter(Mandatory=$True)] + [string]$xml, + + [Parameter(Mandatory=$True)] + [string]$output +) + +$xslt = New-Object System.Xml.Xsl.XslCompiledTransform; +$xslt.Load($xsl); +$xslt.Transform($xml, $output); + +Write-Host "The file has been transformed." diff --git a/tests/CodeCoverage/packages.config b/tests/CodeCoverage/packages.config new file mode 100644 index 0000000000..973b7f81b4 --- /dev/null +++ b/tests/CodeCoverage/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs new file mode 100644 index 0000000000..b6dd64511e --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -0,0 +1,192 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests.Numerics +{ + using System; + using System.Globalization; + using System.Numerics; + using System.Reflection; + using Xunit; + + public class PointFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(PointF.Empty, new PointF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0.0, 0.0)] + public void NonDefaultConstructorTest(float x, float y) + { + var p1 = new PointF(x, y); + + Assert.Equal(x, p1.X); + Assert.Equal(y, p1.Y); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(PointF.Empty.IsEmpty); + Assert.True(new PointF().IsEmpty); + Assert.True(new PointF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float x, float y) + { + Assert.False(new PointF(x, y).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(float x, float y) + { + var p = new PointF(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + + p.X = 10; + Assert.Equal(10, p.X); + + p.Y = -10.123f; + Assert.Equal(-10.123, p.Y, 3); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, int.MaxValue, int.MinValue)] + [InlineData(float.MinValue, float.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void ArithmeticTestWithSize(float x, float y, int x1, int y1) + { + var p = new PointF(x, y); + var s = new Size(x1, y1); + + var addExpected = new PointF(x + x1, y + y1); + var subExpected = new PointF(x - x1, y - y1); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTestWithSizeF(float x, float y) + { + var p = new PointF(x, y); + var s = new SizeF(y, x); + + var addExpected = new PointF(x + y, y + x); + var subExpected = new PointF(x - y, y - x); + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, PointF.Add(p, s)); + Assert.Equal(subExpected, PointF.Subtract(p, s)); + } + + [Fact] + public void RotateTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, PointF.Empty); + + var pout = PointF.Rotate(p, matrix); + + Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); + } + + [Fact] + public void SkewTest() + { + var p = new PointF(13, 17); + Matrix matrix = Matrix.CreateSkewDegrees(45, 45, PointF.Empty); + + var pout = PointF.Skew(p, matrix); + Assert.Equal(new PointF(30, 30), pout); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float x, float y) + { + var pLeft = new PointF(x, y); + var pRight = new PointF(y, x); + + if (x == y) + { + Assert.True(pLeft == pRight); + Assert.False(pLeft != pRight); + Assert.True(pLeft.Equals(pRight)); + Assert.True(pLeft.Equals((object)pRight)); + Assert.Equal(pLeft.GetHashCode(), pRight.GetHashCode()); + return; + } + + Assert.True(pLeft != pRight); + Assert.False(pLeft == pRight); + Assert.False(pLeft.Equals(pRight)); + Assert.False(pLeft.Equals((object)pRight)); + } + + [Fact] + public static void EqualityTest_NotPointF() + { + var point = new PointF(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + + // If PointF implements IEquatable (e.g. in .NET Core), then structs that are implicitly + // convertible to var can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToPointF = typeof(IEquatable).IsAssignableFrom(point.GetType()); + Assert.Equal(expectsImplicitCastToPointF, point.Equals(new Point(0, 0))); + + Assert.False(point.Equals((object)new Point(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new PointF(10, 10); + Assert.Equal(point.GetHashCode(), new PointF(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new PointF(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var p = new PointF(5.1F, -5.123F); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new PointF(0, 0); + Assert.Equal("PointF [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs new file mode 100644 index 0000000000..150e21987e --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -0,0 +1,252 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using System.Numerics; + + using Xunit; + + public class PointTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Point.Empty, new Point()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(new Size(x, y)); + + Assert.Equal(p1, p2); + } + + [Theory] + [InlineData(int.MaxValue)] + [InlineData(int.MinValue)] + [InlineData(0)] + public void SingleIntConstructorTest(int x) + { + var p1 = new Point(x); + var p2 = new Point(unchecked((short)(x & 0xFFFF)), unchecked((short)((x >> 16) & 0xFFFF))); + + Assert.Equal(p1, p2); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Point.Empty.IsEmpty); + Assert.True(new Point().IsEmpty); + Assert.True(new Point(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int x, int y) + { + Assert.False(new Point(x, y).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void CoordinatesTest(int x, int y) + { + var p = new Point(x, y); + Assert.Equal(x, p.X); + Assert.Equal(y, p.Y); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int x, int y) + { + PointF p = new Point(x, y); + Assert.Equal(new PointF(x, y), p); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int x, int y) + { + var sz = (Size)new Point(x, y); + Assert.Equal(new Size(x, y), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int x, int y) + { + Point addExpected, subExpected, p = new Point(x, y); + var s = new Size(y, x); + + unchecked + { + addExpected = new Point(x + y, y + x); + subExpected = new Point(x - y, y - x); + } + + Assert.Equal(addExpected, p + s); + Assert.Equal(subExpected, p - s); + Assert.Equal(addExpected, Point.Add(p, s)); + Assert.Equal(subExpected, Point.Subtract(p, s)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float x, float y) + { + var pf = new PointF(x, y); + Point pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Point((int)MathF.Ceiling(x), (int)MathF.Ceiling(y)); + pTruncate = new Point((int)x, (int)y); + pRound = new Point((int)MathF.Round(x), (int)MathF.Round(y)); + } + + Assert.Equal(pCeiling, Point.Ceiling(pf)); + Assert.Equal(pRound, Point.Round(pf)); + Assert.Equal(pTruncate, (Point)pf); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void OffsetTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(y, x); + + p1.Offset(p2); + + Assert.Equal(unchecked(p2.X + p2.Y), p1.X); + Assert.Equal(p1.X, p1.Y); + + p2.Offset(x, y); + Assert.Equal(p1, p2); + } + + [Fact] + public void RotateTest() + { + var p = new Point(13, 17); + Matrix matrix = Matrix.CreateRotationDegrees(45, Point.Empty); + + var pout = Point.Rotate(p, matrix); + + Assert.Equal(new Point(-3, 21), pout); + } + + [Fact] + public void SkewTest() + { + var p = new Point(13, 17); + Matrix3x2 matrix = Matrix.CreateSkewDegrees(45, 45, Point.Empty); + + var pout = Point.Skew(p, matrix); + Assert.Equal(new Point(30, 30), pout); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int x, int y) + { + var p1 = new Point(x, y); + var p2 = new Point(x / 2 - 1, y / 2 - 1); + var p3 = new Point(x, y); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotPoint() + { + var point = new Point(0, 0); + Assert.False(point.Equals(null)); + Assert.False(point.Equals(0)); + Assert.False(point.Equals(new PointF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var point = new Point(10, 10); + Assert.Equal(point.GetHashCode(), new Point(10, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(20, 10).GetHashCode()); + Assert.NotEqual(point.GetHashCode(), new Point(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(1, -2, 3, -4)] + public void ConversionTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + RectangleF rectF = rect; + Assert.Equal(x, rectF.X); + Assert.Equal(y, rectF.Y); + Assert.Equal(width, rectF.Width); + Assert.Equal(height, rectF.Height); + } + + [Fact] + public void ToStringTest() + { + var p = new Point(5, -5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); + } + + [Fact] + public void ToStringEmptyTest() + { + var p = new Point(0, 0); + Assert.Equal("Point [ Empty ]", p.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RationalTests.cs b/tests/SixLabors.Primitives.Tests/RationalTests.cs new file mode 100644 index 0000000000..e59505cf5f --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RationalTests.cs @@ -0,0 +1,115 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class RationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + Rational r1 = new Rational(3, 2); + Rational r2 = new Rational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + Rational r3 = new Rational(7.55); + Rational r4 = new Rational(755, 100); + Rational r5 = new Rational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + Rational first = new Rational(0, 100); + Rational second = new Rational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + Rational rational = new Rational(7, 55); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(55U, rational.Denominator); + + rational = new Rational(755, 100); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(755, 100, false); + Assert.Equal(755U, rational.Numerator); + Assert.Equal(100U, rational.Denominator); + + rational = new Rational(-7.55); + Assert.Equal(151U, rational.Numerator); + Assert.Equal(20U, rational.Denominator); + + rational = new Rational(7); + Assert.Equal(7U, rational.Numerator); + Assert.Equal(1U, rational.Denominator); + } + + [Fact] + public void Fraction() + { + Rational first = new Rational(1.0 / 1600); + Rational second = new Rational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + Rational rational = new Rational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new Rational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + Rational rational = new Rational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new Rational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(double.NegativeInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new Rational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new Rational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new Rational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleFTests.cs b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs new file mode 100644 index 0000000000..4dc7d9d35a --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleFTests.cs @@ -0,0 +1,267 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(RectangleF.Empty, new RectangleF()); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void NonDefaultConstructorTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + var rect2 = new RectangleF(p, s); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void FromLTRBTest(float left, float top, float right, float bottom) + { + var expected = new RectangleF(left, top, right - left, bottom - top); + var actual = RectangleF.FromLTRB(left, top, right, bottom); + + Assert.Equal(expected, actual); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void DimensionsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var p = new PointF(x, y); + var s = new SizeF(width, height); + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(x + width, rect.Right); + Assert.Equal(y + height, rect.Bottom); + } + + [Fact] + public void IsEmptyTest() + { + Assert.True(RectangleF.Empty.IsEmpty); + Assert.True(new RectangleF().IsEmpty); + Assert.True(new RectangleF(1, -2, -10, 10).IsEmpty); + Assert.True(new RectangleF(1, -2, 10, -10).IsEmpty); + Assert.True(new RectangleF(1, -2, 0, 0).IsEmpty); + + Assert.False(new RectangleF(0, 0, 10, 10).IsEmpty); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void LocationSetTest(float x, float y) + { + var point = new PointF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(float.MaxValue, float.MinValue)] + public static void SizeSetTest(float x, float y) + { + var size = new SizeF(x, y); + var rect = new RectangleF(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void EqualityTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(width, height, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangleF() + { + var rectangle = new RectangleF(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + + // If RectangleF implements IEquatable (e.g. in .NET Core), then classes that are implicitly + // convertible to RectangleF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToRectangleF = typeof(IEquatable).IsAssignableFrom(rectangle.GetType()); + Assert.Equal(expectsImplicitCastToRectangleF, rectangle.Equals(new Rectangle(0, 0, 0, 0))); + + Assert.False(rectangle.Equals((object)new Rectangle(0, 0, 0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new RectangleF(10, 10, 10, 10); + var rect2 = new RectangleF(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new RectangleF(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void ContainsTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + float X = (x + width) / 2; + float Y = (y + height) / 2; + var p = new PointF(X, Y); + var r = new RectangleF(X, Y, width / 2, height / 2); + + Assert.False(rect.Contains(X, Y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue / 2, float.MinValue / 2, float.MinValue / 2, float.MaxValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void InflateTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + var inflatedRect = new RectangleF(x - width, y - height, width + 2 * width, height + 2 * height); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new SizeF(x, y); + inflatedRect = RectangleF.Inflate(rect, x, y); + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue / 2, float.MinValue / 2)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void IntersectTest(float x, float y, float width, float height) + { + var rect1 = new RectangleF(x, y, width, height); + var rect2 = new RectangleF(y, x, width, height); + var expectedRect = RectangleF.Intersect(rect1, rect2); + rect1.Intersect(rect2); + Assert.Equal(expectedRect, rect1); + Assert.False(rect1.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new RectangleF(0, 0, 5, 5); + var rect2 = new RectangleF(1, 1, 3, 3); + var expected = new RectangleF(1, 1, 3, 3); + + Assert.Equal(expected, RectangleF.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void UnionTest(float x, float y, float width, float height) + { + var a = new RectangleF(x, y, width, height); + var b = new RectangleF(width, height, x, y); + + float x1 = Math.Min(a.X, b.X); + float x2 = Math.Max(a.X + a.Width, b.X + b.Width); + float y1 = Math.Min(a.Y, b.Y); + float y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new RectangleF(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, RectangleF.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, 0, 0, float.MaxValue)] + [InlineData(0, float.MinValue, float.MaxValue, 0)] + public void OffsetTest(float x, float y, float width, float height) + { + var r1 = new RectangleF(x, y, width, height); + var expectedRect = new RectangleF(x + width, y + height, width, height); + var p = new PointF(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new RectangleF(5, 5.1F, 1.3F, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [InlineData(0, 0, 0, 0)] + [InlineData(5, -5, 0.2, -1.3)] + public void ToStringTestEmpty(float x, float y, float width, float height) + { + var r = new RectangleF(x, y, width, height); + Assert.Equal("RectangleF [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/RectangleTests.cs b/tests/SixLabors.Primitives.Tests/RectangleTests.cs new file mode 100644 index 0000000000..24ac4fae10 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/RectangleTests.cs @@ -0,0 +1,308 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + + using Xunit; + + /// + /// Tests the struct. + /// + public class RectangleTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Rectangle.Empty, new Rectangle()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonDefaultConstructorTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(new Point(x, y), new Size(width, height)); + + Assert.Equal(rect1, rect2); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void FromLTRBTest(int left, int top, int right, int bottom) + { + var rect1 = new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); + var rect2 = Rectangle.FromLTRB(left, top, right, bottom); + + Assert.Equal(rect1, rect2); + } + + [Fact] + public void EmptyTest() + { + Assert.True(Rectangle.Empty.IsEmpty); + Assert.True(new Rectangle(0, 0, 0, 0).IsEmpty); + Assert.True(new Rectangle().IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + public void NonEmptyTest(int x, int y, int width, int height) + { + Assert.False(new Rectangle(x, y, width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, 0, 0, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void DimensionsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + Assert.Equal(new Point(x, y), rect.Location); + Assert.Equal(new Size(width, height), rect.Size); + + Assert.Equal(x, rect.X); + Assert.Equal(y, rect.Y); + Assert.Equal(width, rect.Width); + Assert.Equal(height, rect.Height); + Assert.Equal(x, rect.Left); + Assert.Equal(y, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + + var p = new Point(width, height); + var s = new Size(x, y); + rect.Location = p; + rect.Size = s; + + Assert.Equal(p, rect.Location); + Assert.Equal(s, rect.Size); + + Assert.Equal(width, rect.X); + Assert.Equal(height, rect.Y); + Assert.Equal(x, rect.Width); + Assert.Equal(y, rect.Height); + Assert.Equal(width, rect.Left); + Assert.Equal(height, rect.Top); + Assert.Equal(unchecked(x + width), rect.Right); + Assert.Equal(unchecked(y + height), rect.Bottom); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void LocationSetTest(int x, int y) + { + var point = new Point(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Location = point }; + Assert.Equal(point, rect.Location); + Assert.Equal(point.X, rect.X); + Assert.Equal(point.Y, rect.Y); + } + + [Theory] + [InlineData(0, 0)] + [InlineData(int.MaxValue, int.MinValue)] + public static void SizeSetTest(int x, int y) + { + var size = new Size(x, y); + var rect = new Rectangle(10, 10, 10, 10) { Size = size }; + Assert.Equal(size, rect.Size); + Assert.Equal(size.Width, rect.Width); + Assert.Equal(size.Height, rect.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, 0, int.MinValue, 0)] + [InlineData(0, int.MinValue, 0, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + public void EqualityTest(int x, int y, int width, int height) + { + var rect1 = new Rectangle(x, y, width, height); + var rect2 = new Rectangle(width / 2, height / 2, x, y); + + Assert.True(rect1 != rect2); + Assert.False(rect1 == rect2); + Assert.False(rect1.Equals(rect2)); + Assert.False(rect1.Equals((object)rect2)); + } + + [Fact] + public static void EqualityTestNotRectangle() + { + var rectangle = new Rectangle(0, 0, 0, 0); + Assert.False(rectangle.Equals(null)); + Assert.False(rectangle.Equals(0)); + Assert.False(rectangle.Equals(new RectangleF(0, 0, 0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var rect1 = new Rectangle(10, 10, 10, 10); + var rect2 = new Rectangle(10, 10, 10, 10); + Assert.Equal(rect1.GetHashCode(), rect2.GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(20, 10, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 20, 10, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 20, 10).GetHashCode()); + Assert.NotEqual(rect1.GetHashCode(), new Rectangle(10, 10, 10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(0, 0, 0, 0)] + public void RectangleFConversionTest(float x, float y, float width, float height) + { + var rect = new RectangleF(x, y, width, height); + Rectangle rCeiling, rTruncate, rRound; + + unchecked + { + rCeiling = new Rectangle((int)Math.Ceiling(x), (int)Math.Ceiling(y), + (int)Math.Ceiling(width), (int)Math.Ceiling(height)); + rTruncate = new Rectangle((int)x, (int)y, (int)width, (int)height); + rRound = new Rectangle((int)Math.Round(x), (int)Math.Round(y), + (int)Math.Round(width), (int)Math.Round(height)); + } + + Assert.Equal(rCeiling, Rectangle.Ceiling(rect)); + Assert.Equal(rTruncate, Rectangle.Truncate(rect)); + Assert.Equal(rRound, Rectangle.Round(rect)); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void ContainsTest(int x, int y, int width, int height) + { + var rect = new Rectangle(unchecked(2 * x - width), unchecked(2 * y - height), width, height); + var p = new Point(x, y); + var r = new Rectangle(x, y, width / 2, height / 2); + + Assert.False(rect.Contains(x, y)); + Assert.False(rect.Contains(p)); + Assert.False(rect.Contains(r)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void InflateTest(int x, int y, int width, int height) + { + Rectangle inflatedRect, rect = new Rectangle(x, y, width, height); + unchecked + { + inflatedRect = new Rectangle(x - width, y - height, width + 2 * width, height + 2 * height); + } + + Assert.Equal(inflatedRect, Rectangle.Inflate(rect, width, height)); + + rect.Inflate(width, height); + Assert.Equal(inflatedRect, rect); + + var s = new Size(x, y); + unchecked + { + inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + 2 * x, rect.Height + 2 * y); + } + + rect.Inflate(s); + Assert.Equal(inflatedRect, rect); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void IntersectTest(int x, int y, int width, int height) + { + var rect = new Rectangle(x, y, width, height); + var expectedRect = Rectangle.Intersect(rect, rect); + rect.Intersect(rect); + Assert.Equal(expectedRect, rect); + Assert.False(rect.IntersectsWith(expectedRect)); + } + + [Fact] + public static void IntersectIntersectingRectsTest() + { + var rect1 = new Rectangle(0, 0, 5, 5); + var rect2 = new Rectangle(1, 1, 3, 3); + var expected = new Rectangle(1, 1, 3, 3); + + Assert.Equal(expected, Rectangle.Intersect(rect1, rect2)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void UnionTest(int x, int y, int width, int height) + { + var a = new Rectangle(x, y, width, height); + var b = new Rectangle(width, height, x, y); + + int x1 = Math.Min(a.X, b.X); + int x2 = Math.Max(a.X + a.Width, b.X + b.Width); + int y1 = Math.Min(a.Y, b.Y); + int y2 = Math.Max(a.Y + a.Height, b.Y + b.Height); + + var expectedRectangle = new Rectangle(x1, y1, x2 - x1, y2 - y1); + + Assert.Equal(expectedRectangle, Rectangle.Union(a, b)); + } + + [Theory] + [InlineData(0, 0, 0, 0)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, 0, 0, int.MaxValue)] + [InlineData(0, int.MinValue, int.MaxValue, 0)] + public void OffsetTest(int x, int y, int width, int height) + { + var r1 = new Rectangle(x, y, width, height); + var expectedRect = new Rectangle(x + width, y + height, width, height); + var p = new Point(width, height); + + r1.Offset(p); + Assert.Equal(expectedRect, r1); + + expectedRect.Offset(p); + r1.Offset(width, height); + Assert.Equal(expectedRect, r1); + } + + [Fact] + public void ToStringTest() + { + var r = new Rectangle(5, -5, 0, 1); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var r = new Rectangle(0, 0, 0, 0); + Assert.Equal("Rectangle [ Empty ]", r.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs new file mode 100644 index 0000000000..bc7a5b8106 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs @@ -0,0 +1,122 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using Xunit; + + /// + /// Tests the struct. + /// + public class SignedRationalTests + { + /// + /// Tests the equality operators for equality. + /// + [Fact] + public void AreEqual() + { + SignedRational r1 = new SignedRational(3, 2); + SignedRational r2 = new SignedRational(3, 2); + + Assert.Equal(r1, r2); + Assert.True(r1 == r2); + + SignedRational r3 = new SignedRational(7.55); + SignedRational r4 = new SignedRational(755, 100); + SignedRational r5 = new SignedRational(151, 20); + + Assert.Equal(r3, r4); + Assert.Equal(r4, r5); + } + + /// + /// Tests the equality operators for inequality. + /// + [Fact] + public void AreNotEqual() + { + SignedRational first = new SignedRational(0, 100); + SignedRational second = new SignedRational(100, 100); + + Assert.NotEqual(first, second); + Assert.True(first != second); + } + + /// + /// Tests whether the Rational constructor correctly assign properties. + /// + [Fact] + public void ConstructorAssignsProperties() + { + SignedRational rational = new SignedRational(7, -55); + Assert.Equal(7, rational.Numerator); + Assert.Equal(-55, rational.Denominator); + + rational = new SignedRational(-755, 100); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(-755, -100, false); + Assert.Equal(-755, rational.Numerator); + Assert.Equal(-100, rational.Denominator); + + rational = new SignedRational(-151, -20); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(-20, rational.Denominator); + + rational = new SignedRational(-7.55); + Assert.Equal(-151, rational.Numerator); + Assert.Equal(20, rational.Denominator); + + rational = new SignedRational(7); + Assert.Equal(7, rational.Numerator); + Assert.Equal(1, rational.Denominator); + } + + [Fact] + public void Fraction() + { + SignedRational first = new SignedRational(1.0 / 1600); + SignedRational second = new SignedRational(1.0 / 1600, true); + Assert.False(first.Equals(second)); + } + + [Fact] + public void ToDouble() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal(double.NaN, rational.ToDouble()); + + rational = new SignedRational(2, 0); + Assert.Equal(double.PositiveInfinity, rational.ToDouble()); + + rational = new SignedRational(-2, 0); + Assert.Equal(double.NegativeInfinity, rational.ToDouble()); + } + + [Fact] + public void ToStringRepresention() + { + SignedRational rational = new SignedRational(0, 0); + Assert.Equal("[ Indeterminate ]", rational.ToString()); + + rational = new SignedRational(double.PositiveInfinity); + Assert.Equal("[ PositiveInfinity ]", rational.ToString()); + + rational = new SignedRational(double.NegativeInfinity); + Assert.Equal("[ NegativeInfinity ]", rational.ToString()); + + rational = new SignedRational(0, 1); + Assert.Equal("0", rational.ToString()); + + rational = new SignedRational(2, 1); + Assert.Equal("2", rational.ToString()); + + rational = new SignedRational(1, 2); + Assert.Equal("1/2", rational.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj new file mode 100644 index 0000000000..a300a0b063 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj @@ -0,0 +1,34 @@ + + + + 0.0.0 + netcoreapp1.1 + SixLabors.Shapes.Tests + SixLabors.Shapes.Tests + true + false + false + false + false + false + false + full + + + + + + + + + + + + + + + + + + + diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Primitives.Tests/SizeFTests.cs new file mode 100644 index 0000000000..baa16c7e40 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeFTests.cs @@ -0,0 +1,163 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System; + using System.Globalization; + using System.Reflection; + using Xunit; + + public class SizeFTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(SizeF.Empty, new SizeF()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorAndDimensionsTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = new PointF(width, height); + var s2 = new SizeF(s1); + + Assert.Equal(s1, s2); + Assert.Equal(s1, new SizeF(p1)); + Assert.Equal(s2, new SizeF(p1)); + + Assert.Equal(width, s1.Width); + Assert.Equal(height, s1.Height); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10.123f; + Assert.Equal(-10.123, s1.Height, 3); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(SizeF.Empty.IsEmpty); + Assert.True(new SizeF().IsEmpty); + Assert.True(new SizeF(0, 0).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + public void IsEmptyRandomTest(float width, float height) + { + Assert.False(new SizeF(width, height).IsEmpty); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(float width, float height) + { + var s1 = new SizeF(width, height); + var s2 = new SizeF(height, width); + var addExpected = new SizeF(width + height, width + height); + var subExpected = new SizeF(width - height, height - width); + + Assert.Equal(addExpected, s1 + s2); + Assert.Equal(addExpected, SizeF.Add(s1, s2)); + + Assert.Equal(subExpected, s1 - s2); + Assert.Equal(subExpected, SizeF.Subtract(s1, s2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(float width, float height) + { + var sLeft = new SizeF(width, height); + var sRight = new SizeF(height, width); + + if (width == height) + { + Assert.True(sLeft == sRight); + Assert.False(sLeft != sRight); + Assert.True(sLeft.Equals(sRight)); + Assert.True(sLeft.Equals((object)sRight)); + Assert.Equal(sLeft.GetHashCode(), sRight.GetHashCode()); + return; + } + + Assert.True(sLeft != sRight); + Assert.False(sLeft == sRight); + Assert.False(sLeft.Equals(sRight)); + Assert.False(sLeft.Equals((object)sRight)); + } + + [Fact] + public static void EqualityTest_NotSizeF() + { + var size = new SizeF(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + + // If SizeF implements IEquatable (e.g in .NET Core), then classes that are implicitly + // convertible to SizeF can potentially be equal. + // See https://github.com/dotnet/corefx/issues/5255. + bool expectsImplicitCastToSizeF = typeof(IEquatable).IsAssignableFrom(size.GetType()); + Assert.Equal(expectsImplicitCastToSizeF, size.Equals(new Size(0, 0))); + + Assert.False(size.Equals((object)new Size(0, 0))); // No implicit cast + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new SizeF(10, 10); + Assert.Equal(size.GetHashCode(), new SizeF(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new SizeF(10, 20).GetHashCode()); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void ConversionTest(float width, float height) + { + var s1 = new SizeF(width, height); + var p1 = (PointF)s1; + var s2 = new Size(unchecked((int)width), unchecked((int)height)); + + Assert.Equal(new PointF(width, height), p1); + Assert.Equal(p1, (PointF)s1); + Assert.Equal(s2, (Size)s1); + } + + [Fact] + public void ToStringTest() + { + var sz = new SizeF(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "SizeF [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new SizeF(0, 0); + Assert.Equal("SizeF [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Primitives.Tests/SizeTests.cs new file mode 100644 index 0000000000..3eabf6221d --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/SizeTests.cs @@ -0,0 +1,195 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using Xunit; + + /// + /// Tests the struct. + /// + public class SizeTests + { + [Fact] + public void DefaultConstructorTest() + { + Assert.Equal(Size.Empty, new Size()); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void NonDefaultConstructorTest(int width, int height) + { + var s1 = new Size(width, height); + var s2 = new Size(new Point(width, height)); + + Assert.Equal(s1, s2); + + s1.Width = 10; + Assert.Equal(10, s1.Width); + + s1.Height = -10; + Assert.Equal(-10, s1.Height); + } + + [Fact] + public void IsEmptyDefaultsTest() + { + Assert.True(Size.Empty.IsEmpty); + Assert.True(new Size().IsEmpty); + Assert.True(new Size(0, 0).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + public void IsEmptyRandomTest(int width, int height) + { + Assert.False(new Size(width, height).IsEmpty); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DimensionsTest(int width, int height) + { + var p = new Size(width, height); + Assert.Equal(width, p.Width); + Assert.Equal(height, p.Height); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void PointFConversionTest(int width, int height) + { + SizeF sz = new Size(width, height); + Assert.Equal(new SizeF(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void SizeConversionTest(int width, int height) + { + var sz = (Point)new Size(width, height); + Assert.Equal(new Point(width, height), sz); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void ArithmeticTest(int width, int height) + { + var sz1 = new Size(width, height); + var sz2 = new Size(height, width); + Size addExpected, subExpected; + + unchecked + { + addExpected = new Size(width + height, height + width); + subExpected = new Size(width - height, height - width); + } + + Assert.Equal(addExpected, sz1 + sz2); + Assert.Equal(subExpected, sz1 - sz2); + Assert.Equal(addExpected, Size.Add(sz1, sz2)); + Assert.Equal(subExpected, Size.Subtract(sz1, sz2)); + } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void PointFMathematicalTest(float width, float height) + { + var szF = new SizeF(width, height); + Size pCeiling, pTruncate, pRound; + + unchecked + { + pCeiling = new Size((int)MathF.Ceiling(width), (int)MathF.Ceiling(height)); + pTruncate = new Size((int)width, (int)height); + pRound = new Size((int)MathF.Round(width), (int)MathF.Round(height)); + } + + Assert.Equal(pCeiling, Size.Ceiling(szF)); + Assert.Equal(pRound, Size.Round(szF)); + Assert.Equal(pTruncate, (Size)szF); + } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void EqualityTest(int width, int height) + { + var p1 = new Size(width, height); + var p2 = new Size(unchecked(width - 1), unchecked(height - 1)); + var p3 = new Size(width, height); + + Assert.True(p1 == p3); + Assert.True(p1 != p2); + Assert.True(p2 != p3); + + Assert.True(p1.Equals(p3)); + Assert.False(p1.Equals(p2)); + Assert.False(p2.Equals(p3)); + + Assert.True(p1.Equals((object)p3)); + Assert.False(p1.Equals((object)p2)); + Assert.False(p2.Equals((object)p3)); + + Assert.Equal(p1.GetHashCode(), p3.GetHashCode()); + } + + [Fact] + public static void EqualityTest_NotSize() + { + var size = new Size(0, 0); + Assert.False(size.Equals(null)); + Assert.False(size.Equals(0)); + Assert.False(size.Equals(new SizeF(0, 0))); + } + + [Fact] + public static void GetHashCodeTest() + { + var size = new Size(10, 10); + Assert.Equal(size.GetHashCode(), new Size(10, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(20, 10).GetHashCode()); + Assert.NotEqual(size.GetHashCode(), new Size(10, 20).GetHashCode()); + } + + [Fact] + public void ToStringTest() + { + var sz = new Size(10, 5); + Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Size [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); + } + + [Fact] + public void ToStringTestEmpty() + { + var sz = new Size(0, 0); + Assert.Equal("Size [ Empty ]", sz.ToString()); + } + } +} \ No newline at end of file From 82902009df5f82fd1b99443a37f30e69a4357752 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:21:15 +0100 Subject: [PATCH 003/136] [SL.Core] update api key --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index e534e5855f..0c1d45047c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,7 +20,7 @@ deploy: server: https://www.myget.org/F/sixlabors/api/v2/package symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package api_key: - secure: SyrSERGrjkK21TSCsHtqke5279SMxXCg2NXKjR2qaErP0khEplwxPwE8Ch5bxzyf + secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 artifact: /.*\.nupkg/ on: branch: master From 9c910db94c2c5e22788cdad2c825e7149508f4b1 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 2 Jun 2017 23:23:12 +0100 Subject: [PATCH 004/136] [SL.Core] update sln --- SixLabors.Primitives.sln | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/SixLabors.Primitives.sln b/SixLabors.Primitives.sln index 1d728f98c2..b1a03f64f5 100644 --- a/SixLabors.Primitives.sln +++ b/SixLabors.Primitives.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26430.6 +VisualStudioVersion = 15.0.26430.12 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject @@ -21,8 +21,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A src\Shared\stylecop.json = src\Shared\stylecop.json EndProjectSection EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" @@ -41,18 +39,6 @@ Global {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Debug|Any CPU.Build.0 = Debug|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.ActiveCfg = Release|Any CPU - {999EDFB3-9FE4-4E09-B669-CB02E597EC20}.Release|Any CPU.Build.0 = Release|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {87E262FA-57FE-4AA7-853C-9DD91E769D4B}.Release|Any CPU.Build.0 = Release|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32D7A12E-B392-42CE-8EFB-1B685680F5B8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -61,9 +47,6 @@ Global {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {999EDFB3-9FE4-4E09-B669-CB02E597EC20} = {9F33164A-9EA9-4CB4-A384-A8A0A6DCA35D} - {87E262FA-57FE-4AA7-853C-9DD91E769D4B} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {32D7A12E-B392-42CE-8EFB-1B685680F5B8} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true From f4626c1cebc534cd2eb28102e79abb63728c32aa Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 3 Jun 2017 10:15:40 +0100 Subject: [PATCH 005/136] [SL.Core] add matrix tests & fix GetHashCode --- src/Shared/AssemblyInfo.Common.cs | 9 +- .../ApproximateFloatComparer.cs | 210 ++++ src/SixLabors.Primitives/Ellipse.cs | 11 +- src/SixLabors.Primitives/HashHelpers.cs | 23 + src/SixLabors.Primitives/LongRational.cs | 5 +- src/SixLabors.Primitives/MathF.cs | 4 +- src/SixLabors.Primitives/Matrix.cs | 51 +- src/SixLabors.Primitives/Point.cs | 25 +- src/SixLabors.Primitives/PointF.cs | 65 +- src/SixLabors.Primitives/Rectangle.cs | 26 +- src/SixLabors.Primitives/RectangleF.cs | 26 +- src/SixLabors.Primitives/Size.cs | 21 +- src/SixLabors.Primitives/SizeF.cs | 20 +- tests/CodeCoverage/.gitignore | 1 + tests/CodeCoverage/CodeCoverage.cmd | 2 +- .../SixLabors.Primitives.Tests/MatrixTests.cs | 1015 +++++++++++++++++ .../SixLabors.Primitives.Tests/PointFTests.cs | 2 +- .../SixLabors.Primitives.Tests.csproj | 3 +- 18 files changed, 1470 insertions(+), 49 deletions(-) create mode 100644 src/SixLabors.Primitives/ApproximateFloatComparer.cs create mode 100644 src/SixLabors.Primitives/HashHelpers.cs create mode 100644 tests/CodeCoverage/.gitignore create mode 100644 tests/SixLabors.Primitives.Tests/MatrixTests.cs diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs index 081b019941..b140dd9176 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/Shared/AssemblyInfo.Common.cs @@ -10,11 +10,11 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyDescription("A cross-platform library for processing of image files; written in C#")] +[assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Scott Williams")] -[assembly: AssemblyProduct("SixLabors.Shapes")] -[assembly: AssemblyCopyright("Copyright (c) Scott Williams and contributors.")] +[assembly: AssemblyProduct("SixLabors.Primitives")] +[assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: NeutralResourcesLanguage("en")] @@ -34,5 +34,4 @@ [assembly: AssemblyInformationalVersion("1.0.0.0")] // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Shapes.Tests")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Benchmarks")] +[assembly: InternalsVisibleTo("SixLabors.Primitives.Tests")] diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs new file mode 100644 index 0000000000..0d854a1108 --- /dev/null +++ b/src/SixLabors.Primitives/ApproximateFloatComparer.cs @@ -0,0 +1,210 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace SixLabors.Primitives +{ + internal struct ApproximateFloatComparer + : IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer, + IEqualityComparer + + { + private readonly float tolerance; + const float defaultTolerance = 1e-5f; + + public ApproximateFloatComparer(float tolerance = defaultTolerance) + { + this.tolerance = tolerance; + } + + public static bool Equal(float x, float y, float tolerance) + { + float d = x - y; + + return d > -tolerance && d < tolerance; + } + + public static bool Equal(float x, float y) + { + return Equal(x, y, defaultTolerance); + } + + public bool Equals(float x, float y) + { + return Equal(x, y, this.tolerance); + } + + public int GetHashCode(float obj) + { + var diff = obj % this.tolerance;// how different from tollerance are we? + return (obj - diff).GetHashCode(); + } + + public bool Equals(Vector4 a, Vector4 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z) && this.Equals(a.W, b.W); + } + + public int GetHashCode(Vector4 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.W)); + return hash; + } + + public bool Equals(Vector2 a, Vector2 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y); + } + + public int GetHashCode(Vector2 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + return hash; + } + + public bool Equals(Vector3 a, Vector3 b) + { + return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z); + } + + public int GetHashCode(Vector3 obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); + return hash; + } + + public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) + { + return Equal(a.M11, b.M11, tolerance) && + Equal(a.M12, b.M12, tolerance) && + Equal(a.M21, b.M21, tolerance) && + Equal(a.M22, b.M22, tolerance) && + Equal(a.M31, b.M31, tolerance) && + Equal(a.M32, b.M32, tolerance); + } + + public static bool Equal(Matrix3x2 a, Matrix3x2 b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(Matrix3x2 a, Matrix3x2 b) + { + return Equal(a, b, this.tolerance); + } + + public int GetHashCode(Matrix3x2 obj) + { + int hash = GetHashCode(obj.M11); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); + return hash; + } + + + public static bool Equal(Matrix4x4 a, Matrix4x4 b, float tolerance) + { + return + Equal(a.M11, b.M11, tolerance) && + Equal(a.M12, b.M12, tolerance) && + Equal(a.M13, b.M13, tolerance) && + Equal(a.M14, b.M14, tolerance) && + + Equal(a.M21, b.M21, tolerance) && + Equal(a.M22, b.M22, tolerance) && + Equal(a.M23, b.M23, tolerance) && + Equal(a.M24, b.M24, tolerance) && + + Equal(a.M31, b.M31, tolerance) && + Equal(a.M32, b.M32, tolerance) && + Equal(a.M33, b.M33, tolerance) && + Equal(a.M34, b.M34, tolerance) && + + Equal(a.M41, b.M41, tolerance) && + Equal(a.M42, b.M42, tolerance) && + Equal(a.M43, b.M43, tolerance) && + Equal(a.M44, b.M44, tolerance); + } + + public static bool Equal(Matrix4x4 a, Matrix4x4 b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(Matrix4x4 a, Matrix4x4 b) + { + return Equal(a, b, this.tolerance); + } + + + public int GetHashCode(Matrix4x4 obj) + { + int hash = GetHashCode(obj.M11); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M13)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M14)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M23)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M24)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M33)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M34)); + + hash = HashHelpers.Combine(hash, GetHashCode(obj.M41)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M42)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M43)); + hash = HashHelpers.Combine(hash, GetHashCode(obj.M44)); + return hash; + } + + + public static bool Equal(PointF a, PointF b, float tolerance) + { + return + Equal(a.X, b.X, tolerance) && + Equal(a.Y, b.Y, tolerance); + } + + public static bool Equal(PointF a, PointF b) + { + return Equal(a, b, defaultTolerance); + } + + public bool Equals(PointF a, PointF b) + { + return Equal(a, b, this.tolerance); + } + + + public int GetHashCode(PointF obj) + { + int hash = GetHashCode(obj.X); + hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); + return hash; + } + } +} diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs index d5611bb233..e1890df275 100644 --- a/src/SixLabors.Primitives/Ellipse.cs +++ b/src/SixLabors.Primitives/Ellipse.cs @@ -171,13 +171,10 @@ public bool Equals(Ellipse other) /// private int GetHashCode(Ellipse ellipse) { - unchecked - { - int hashCode = ellipse.center.GetHashCode(); - hashCode = (hashCode * 397) ^ ellipse.RadiusX.GetHashCode(); - hashCode = (hashCode * 397) ^ ellipse.RadiusY.GetHashCode(); - return hashCode; - } + int hashCode = ellipse.center.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusX.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusY.GetHashCode()); + return hashCode; } } } diff --git a/src/SixLabors.Primitives/HashHelpers.cs b/src/SixLabors.Primitives/HashHelpers.cs new file mode 100644 index 0000000000..d622d308c5 --- /dev/null +++ b/src/SixLabors.Primitives/HashHelpers.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace SixLabors.Primitives +{ + // lifted from coreFX repo + internal static class HashHelpers + { + public static readonly int RandomSeed = Guid.NewGuid().GetHashCode(); + + public static int Combine(int h1, int h2) + { + unchecked + { + // RyuJIT optimizes this to use the ROL instruction + // Related GitHub pull request: dotnet/coreclr#1830 + uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27); + return ((int)rol5 + h1) ^ h2; + } + } + } +} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs index d334843382..4f01936eec 100644 --- a/src/SixLabors.Primitives/LongRational.cs +++ b/src/SixLabors.Primitives/LongRational.cs @@ -347,9 +347,6 @@ private void Simplify() /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(LongRational rational) - { - return ((rational.Numerator * 397) ^ rational.Denominator).GetHashCode(); - } + private int GetHashCode(LongRational rational) => HashHelpers.Combine(rational.Numerator.GetHashCode(), rational.Denominator.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Primitives/MathF.cs index a15b7fb20d..eeaca821b7 100644 --- a/src/SixLabors.Primitives/MathF.cs +++ b/src/SixLabors.Primitives/MathF.cs @@ -94,7 +94,7 @@ public static float Cos(float f) /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float DegreeToRadian(float degree) + public static float ToRadians(float degree) { return degree * (PI / 180F); } @@ -181,7 +181,7 @@ public static float Pow(float x, float y) /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float RadianToDegree(float radian) + public static float ToDegree(float radian) { return radian / (PI / 180F); } diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs index 6da436cfba..aa97c3ed73 100644 --- a/src/SixLabors.Primitives/Matrix.cs +++ b/src/SixLabors.Primitives/Matrix.cs @@ -32,9 +32,43 @@ public struct Matrix : IEquatable public bool IsIdentity => this.backingMatrix.IsIdentity; /// - /// Gets or sets the translation component of this matrix. + /// Gets or Sets the translation component of this matrix. /// - public Vector2 Translation => this.backingMatrix.Translation; + public PointF Translation + { + get => this.backingMatrix.Translation; + set => this.backingMatrix.Translation = value; + } + + /// + /// The first element of the first row + /// + public float M11 { get => this.backingMatrix.M11; set => this.backingMatrix.M11 = value; } + + /// + /// The second element of the first row + /// + public float M12 { get => this.backingMatrix.M12; set => this.backingMatrix.M12 = value; } + + /// + /// The first element of the second row + /// + public float M21 { get => this.backingMatrix.M21; set => this.backingMatrix.M21 = value; } + + /// + /// The second element of the second row + /// + public float M22 { get => this.backingMatrix.M22; set => this.backingMatrix.M22 = value; } + + /// + /// The first element of the third row + /// + public float M31 { get => this.backingMatrix.M31; set => this.backingMatrix.M31 = value; } + + /// + /// The second element of the third row + /// + public float M32 { get => this.backingMatrix.M32; set => this.backingMatrix.M32 = value; } /// /// Constructs a Matrix3x2 from the given components. @@ -122,7 +156,7 @@ public Matrix(float m11, float m12, /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY)); + public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -140,7 +174,7 @@ public Matrix(float m11, float m12, /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.DegreeToRadian(degreesX), MathF.DegreeToRadian(degreesY), centerPoint); + public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in radians. @@ -154,7 +188,7 @@ public Matrix(float m11, float m12, /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees)); + public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -170,7 +204,7 @@ public Matrix(float m11, float m12, /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.DegreeToRadian(degrees), centerPoint); + public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); /// /// Calculates the determinant for this matrix. @@ -356,5 +390,10 @@ public override bool Equals(object obj) /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; + + internal static Matrix CreateScale(Vector2 scale, object zero) + { + throw new NotImplementedException(); + } } } diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs index 243cb8eb34..206d0545a0 100644 --- a/src/SixLabors.Primitives/Point.cs +++ b/src/SixLabors.Primitives/Point.cs @@ -25,6 +25,11 @@ public struct Point : IEquatable /// public static readonly Point Empty = default(Point); + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly Point Zero = new Point(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -95,6 +100,13 @@ public Point(Size size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Size(Point point) => new Size(point.X, point.Y); + /// + /// Negates the given point by multiplying all values by -1. + /// + /// The source point. + /// The negated point. + public static Point operator -(Point value) => new Point(-value.X, -value.Y); + /// /// Translates a by a given . /// @@ -252,6 +264,17 @@ public override string ToString() private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - private int GetHashCode(Point point) => point.X ^ point.Y; + private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); + + /// + /// Transforms a point by the given matrix. + /// + /// The source point + /// The transformation matrix. + /// + public static PointF Transform(Point position, Matrix matrix) + { + return Vector2.Transform(position, matrix); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs index a49a1996b3..8df9ef7bff 100644 --- a/src/SixLabors.Primitives/PointF.cs +++ b/src/SixLabors.Primitives/PointF.cs @@ -25,6 +25,11 @@ public struct PointF : IEquatable /// public static readonly PointF Empty = default(PointF); + /// + /// Represents a that has X and Y values set to zero. + /// + public static readonly PointF Zero = new PointF(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -93,6 +98,13 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Point(PointF point) => Point.Truncate(point); + /// + /// Negates the given point by multiplying all values by -1. + /// + /// The source point. + /// The negated point. + public static PointF operator -(PointF value) => new PointF(-value.X, -value.Y); + /// /// Translates a by a given . /// @@ -104,6 +116,26 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, SizeF size) => Add(point, size); + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator -(PointF point, PointF size) => Subtract(point, size); + + /// + /// Translates a by a given . + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// + /// The + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF operator +(PointF point, PointF size) => Add(point, size); + /// /// Translates a by the negative of a given . /// @@ -144,7 +176,7 @@ public PointF(SizeF size) public static bool operator !=(PointF left, PointF right) => !left.Equals(right); /// - /// Translates a by the negative of a given . + /// Translates a by the given . /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. @@ -152,6 +184,15 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); + /// + /// Translates a by the given . + /// + /// The point on the left hand of the operand. + /// The point on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Add(PointF point, PointF pointb) => new PointF(point.X + pointb.X, point.Y + pointb.Y); + /// /// Translates a by the negative of a given . /// @@ -161,6 +202,15 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); + /// + /// Translates a by the negative of a given . + /// + /// The point on the left hand of the operand. + /// The point on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); + /// /// Rotates a point around the given rotation matrix. /// @@ -228,6 +278,17 @@ public override string ToString() /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(PointF point) => point.X.GetHashCode() ^ point.Y.GetHashCode(); + private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); + + /// + /// Transforms a point by the given matrix. + /// + /// The source point + /// The transformation matrix. + /// + public static PointF Transform(PointF position, Matrix matrix) + { + return Vector2.Transform(position, matrix); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs index 9c9a0599e6..173ee5d1b1 100644 --- a/src/SixLabors.Primitives/Rectangle.cs +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -454,14 +454,24 @@ public override string ToString() private int GetHashCode(Rectangle rectangle) { - unchecked - { - int hashCode = rectangle.X; - hashCode = (hashCode * 397) ^ rectangle.Y; - hashCode = (hashCode * 397) ^ rectangle.Width; - hashCode = (hashCode * 397) ^ rectangle.Height; - return hashCode; - } + int hashCode = rectangle.X.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); + return hashCode; + } + + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle + /// The transformation matrix. + /// + public static RectangleF Transform(Rectangle rectangle, Matrix matrix) + { + PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = Point.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs index c7d8b0ebbb..d74fb796f6 100644 --- a/src/SixLabors.Primitives/RectangleF.cs +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -387,14 +387,24 @@ public override string ToString() private int GetHashCode(RectangleF rectangle) { - unchecked - { - int hashCode = rectangle.X.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Y.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Width.GetHashCode(); - hashCode = (hashCode * 397) ^ rectangle.Height.GetHashCode(); - return hashCode; - } + int hashCode = rectangle.X.GetHashCode(); + hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); + hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); + return hashCode; + } + + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle + /// The transformation matrix. + /// + public static RectangleF Transform(RectangleF rectangle, Matrix matrix) + { + PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = PointF.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index 1605232b10..fb306f128e 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -7,6 +7,7 @@ namespace SixLabors.Primitives { using System; using System.ComponentModel; + using System.Numerics; using System.Runtime.CompilerServices; /// @@ -22,6 +23,11 @@ public struct Size : IEquatable /// Represents a that has Width and Height values set to zero. /// public static readonly Size Empty = default(Size); + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly Size Zero = new Size(0, 0); + /// /// Initializes a new instance of the struct. @@ -220,6 +226,19 @@ public override string ToString() /// /// A 32-bit signed integer that is the hash code for this instance. /// - private int GetHashCode(Size size) => size.Width ^ size.Height; + private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); + + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// + public static SizeF Transform(Size size, Matrix matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } } } \ No newline at end of file diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index a11d2e4433..b822740cd4 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -24,6 +24,11 @@ public struct SizeF : IEquatable /// public static readonly SizeF Empty = default(SizeF); + /// + /// Represents a that has Width and Height values set to zero. + /// + public static readonly SizeF Zero = new SizeF(0, 0); + /// /// Initializes a new instance of the struct. /// @@ -175,7 +180,7 @@ public override string ToString() [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - private int GetHashCode(SizeF size) => size.Width.GetHashCode() ^ size.Height.GetHashCode(); + private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); /// /// Creates a with the coordinates of the specified . @@ -186,5 +191,18 @@ public override string ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// + public static SizeF Transform(SizeF size, Matrix matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } } } \ No newline at end of file diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore new file mode 100644 index 0000000000..861c19344e --- /dev/null +++ b/tests/CodeCoverage/.gitignore @@ -0,0 +1 @@ +/OpenCover.4.6.519 diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 498e55b368..2547eace17 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -12,7 +12,7 @@ dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true rem The -threshold options prevents this taking ages... rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Shapes.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Shapes.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Primitives.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Primitives.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/tests/SixLabors.Primitives.Tests/MatrixTests.cs b/tests/SixLabors.Primitives.Tests/MatrixTests.cs new file mode 100644 index 0000000000..c228f74933 --- /dev/null +++ b/tests/SixLabors.Primitives.Tests/MatrixTests.cs @@ -0,0 +1,1015 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives.Tests +{ + using System.Globalization; + using System.Numerics; + using Xunit; + + /// + /// Tests the struct. + /// + public class MatrixTests + { + + [Fact] + public void ImplicitCastMatrixToMatrix3x2() + { + Matrix matrix = new Matrix(1, 2, 3, 4, 5, 6); + + Matrix3x2 convertedMatrix = matrix; + Assert.Equal(1, convertedMatrix.M11); + Assert.Equal(2, convertedMatrix.M12); + Assert.Equal(3, convertedMatrix.M21); + Assert.Equal(4, convertedMatrix.M22); + Assert.Equal(5, convertedMatrix.M31); + Assert.Equal(6, convertedMatrix.M32); + } + + [Fact] + public void ImplicitCastMatrix3x2ToMatrix() + { + Matrix3x2 matrix = new Matrix3x2(1, 2, 3, 4, 5, 6); + + Matrix convertedMatrix = matrix; + Assert.Equal(1, convertedMatrix.M11); + Assert.Equal(2, convertedMatrix.M12); + Assert.Equal(3, convertedMatrix.M21); + Assert.Equal(4, convertedMatrix.M22); + Assert.Equal(5, convertedMatrix.M31); + Assert.Equal(6, convertedMatrix.M32); + } + + /// matrix test mostly tken directly from CoreFX + /// + static Matrix GenerateMatrixNumberFrom1To6() + { + Matrix a = new Matrix(); + a.M11 = 1.0f; + a.M12 = 2.0f; + a.M21 = 3.0f; + a.M22 = 4.0f; + a.M31 = 5.0f; + a.M32 = 6.0f; + return a; + } + + static Matrix GenerateTestMatrix() + { + Matrix m = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + m.Translation = new Vector2(111.0f, 222.0f); + return m; + } + + // A test for Identity + [Fact] + public void MatrixIdentityTest() + { + Matrix val = new Matrix(); + val.M11 = val.M22 = 1.0f; + + Assert.True(ApproximateFloatComparer.Equal(val, Matrix.Identity), "Matrix.Indentity was not set correctly."); + } + + // A test for Determinant + [Fact] + public void MatrixDeterminantTest() + { + Matrix target = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + + float val = 1.0f; + float det = target.GetDeterminant(); + + Assert.True(ApproximateFloatComparer.Equal(val, det), "Matrix.Determinant was not set correctly."); + } + + // A test for Determinant + // Determinant test |A| = 1 / |A'| + [Fact] + public void MatrixDeterminantTest1() + { + Matrix a = new Matrix(); + a.M11 = 5.0f; + a.M12 = 2.0f; + a.M21 = 12.0f; + a.M22 = 6.8f; + a.M31 = 6.5f; + a.M32 = 1.0f; + Matrix i; + Assert.True(Matrix.Invert(a, out i)); + + float detA = a.GetDeterminant(); + float detI = i.GetDeterminant(); + float t = 1.0f / detI; + + // only accurate to 3 precision + Assert.True(System.Math.Abs(detA - t) < 1e-3, "Matrix.Determinant was not set correctly."); + + // sanity check against 4x4 version + Assert.Equal(new Matrix4x4(a).GetDeterminant(), detA); + Assert.Equal(new Matrix4x4(i).GetDeterminant(), detI); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertTest() + { + Matrix mtx = Matrix.CreateRotation(MathF.ToRadians(30.0f)); + + Matrix expected = new Matrix(); + expected.M11 = 0.8660254f; + expected.M12 = -0.5f; + + expected.M21 = 0.5f; + expected.M22 = 0.8660254f; + + expected.M31 = 0; + expected.M32 = 0; + + Matrix actual; + + Assert.True(Matrix.Invert(mtx, out actual)); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Invert did not return the expected value."); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity), "Matrix.Invert did not return the expected value."); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertIdentityTest() + { + Matrix mtx = Matrix.Identity; + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Assert.True(ApproximateFloatComparer.Equal(actual, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertTranslationTest() + { + Matrix mtx = Matrix.CreateTranslation(23, 42); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertRotationTest() + { + Matrix mtx = Matrix.CreateRotation(2); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertScaleTest() + { + Matrix mtx = Matrix.CreateScale(23, -42); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for Invert (Matrix) + [Fact] + public void MatrixInvertAffineTest() + { + Matrix mtx = Matrix.CreateRotation(2) * + Matrix.CreateScale(23, -42) * + Matrix.CreateTranslation(17, 53); + + Matrix actual; + Assert.True(Matrix.Invert(mtx, out actual)); + + Matrix i = mtx * actual; + Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); + } + + // A test for CreateRotation (float) + [Fact] + public void MatrixCreateRotationTest() + { + float radians = MathF.ToRadians(50.0f); + + Matrix expected = new Matrix(); + expected.M11 = 0.642787635f; + expected.M12 = 0.766044438f; + expected.M21 = -0.766044438f; + expected.M22 = 0.642787635f; + + Matrix actual; + actual = Matrix.CreateRotation(radians); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.CreateRotation did not return the expected value."); + } + + // A test for CreateRotation (float, Vector2f) + [Fact] + public void MatrixCreateRotationCenterTest() + { + float radians = MathF.ToRadians(30.0f); + Vector2 center = new Vector2(23, 42); + + Matrix rotateAroundZero = Matrix.CreateRotation(radians, Vector2.Zero); + Matrix rotateAroundZeroExpected = Matrix.CreateRotation(radians); + Assert.True(ApproximateFloatComparer.Equal(rotateAroundZero, rotateAroundZeroExpected)); + + Matrix rotateAroundCenter = Matrix.CreateRotation(radians, center); + Matrix rotateAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateRotation(radians) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(rotateAroundCenter, rotateAroundCenterExpected)); + } + + // A test for CreateRotation (float) + [Fact] + public void MatrixCreateRotationRightAngleTest() + { + // 90 degree rotations must be exact! + Matrix actual = Matrix.CreateRotation(0); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI / 2); + Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI); + Assert.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 3 / 2); + Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 2); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 5 / 2); + Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); + + actual = Matrix.CreateRotation(-MathF.PI / 2); + Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); + + // But merely close-to-90 rotations should not be excessively clamped. + float delta = MathF.ToRadians(0.01f); + + actual = Matrix.CreateRotation(MathF.PI + delta); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); + + actual = Matrix.CreateRotation(MathF.PI - delta); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); + } + + // A test for CreateRotation (float, Vector2f) + [Fact] + public void MatrixCreateRotationRightAngleCenterTest() + { + Vector2 center = new Vector2(3, 7); + + // 90 degree rotations must be exact! + Matrix actual = Matrix.CreateRotation(0, center); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI / 2, center); + Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); + + actual = Matrix.CreateRotation(MathF.PI, center); + Assert.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual); + + actual = Matrix.CreateRotation(MathF.PI * 3 / 2, center); + Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); + + actual = Matrix.CreateRotation(MathF.PI * 2, center); + Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); + + actual = Matrix.CreateRotation(MathF.PI * 5 / 2, center); + Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); + + actual = Matrix.CreateRotation(-MathF.PI / 2, center); + Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); + + // But merely close-to-90 rotations should not be excessively clamped. + float delta = MathF.ToRadians(0.01f); + + actual = Matrix.CreateRotation(MathF.PI + delta, center); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); + + actual = Matrix.CreateRotation(MathF.PI - delta, center); + Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); + } + + // A test for Invert (Matrix) + // Non invertible matrix - determinant is zero - singular matrix + [Fact] + public void MatrixInvertTest1() + { + Matrix a = new Matrix(); + a.M11 = 0.0f; + a.M12 = 2.0f; + a.M21 = 0.0f; + a.M22 = 4.0f; + a.M31 = 5.0f; + a.M32 = 6.0f; + + float detA = a.GetDeterminant(); + Assert.True(ApproximateFloatComparer.Equal(detA, 0.0f), "Matrix.Invert did not return the expected value."); + + Matrix actual; + Assert.False(Matrix.Invert(a, out actual)); + + // all the elements in Actual is NaN + Assert.True( + float.IsNaN(actual.M11) && float.IsNaN(actual.M12) && + float.IsNaN(actual.M21) && float.IsNaN(actual.M22) && + float.IsNaN(actual.M31) && float.IsNaN(actual.M32) + , "Matrix.Invert did not return the expected value."); + } + + // A test for Lerp (Matrix, Matrix, float) + [Fact] + public void MatrixLerpTest() + { + Matrix a = new Matrix(); + a.M11 = 11.0f; + a.M12 = 12.0f; + a.M21 = 21.0f; + a.M22 = 22.0f; + a.M31 = 31.0f; + a.M32 = 32.0f; + + Matrix b = GenerateMatrixNumberFrom1To6(); + + float t = 0.5f; + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + (b.M11 - a.M11) * t; + expected.M12 = a.M12 + (b.M12 - a.M12) * t; + + expected.M21 = a.M21 + (b.M21 - a.M21) * t; + expected.M22 = a.M22 + (b.M22 - a.M22) * t; + + expected.M31 = a.M31 + (b.M31 - a.M31) * t; + expected.M32 = a.M32 + (b.M32 - a.M32) * t; + + Matrix actual; + actual = Matrix.Lerp(a, b, t); + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Lerp did not return the expected value."); + } + + // A test for operator - (Matrix) + [Fact] + public void MatrixUnaryNegationTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = -1.0f; + expected.M12 = -2.0f; + expected.M21 = -3.0f; + expected.M22 = -4.0f; + expected.M31 = -5.0f; + expected.M32 = -6.0f; + + Matrix actual = -a; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); + } + + // A test for operator - (Matrix, Matrix) + [Fact] + public void MatrixSubtractionTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(); + + Matrix actual = a - b; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); + } + + // A test for operator * (Matrix, Matrix) + [Fact] + public void MatrixMultiplyTest1() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; + expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; + + expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; + expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; + + expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; + expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; + + Matrix actual = a * b; + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); + + // Sanity check by comparison with 4x4 multiply. + a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); + b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); + + actual = a * b; + + Matrix4x4 a44 = new Matrix4x4(a); + Matrix4x4 b44 = new Matrix4x4(b); + Matrix4x4 expected44 = a44 * b44; + Matrix4x4 actual44 = new Matrix4x4(actual); + + Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.operator * did not return the expected value."); + } + + // A test for operator * (Matrix, Matrix) + // Multiply with identity matrix + [Fact] + public void MatrixMultiplyTest4() + { + Matrix a = new Matrix(); + a.M11 = 1.0f; + a.M12 = 2.0f; + a.M21 = 5.0f; + a.M22 = -6.0f; + a.M31 = 9.0f; + a.M32 = 10.0f; + + Matrix b = new Matrix(); + b = Matrix.Identity; + + Matrix expected = a; + Matrix actual = a * b; + + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); + } + + // A test for operator + (Matrix, Matrix) + [Fact] + public void MatrixAdditionTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + b.M11; + expected.M12 = a.M12 + b.M12; + expected.M21 = a.M21 + b.M21; + expected.M22 = a.M22 + b.M22; + expected.M31 = a.M31 + b.M31; + expected.M32 = a.M32 + b.M32; + + Matrix actual; + + actual = a + b; + + Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator + did not return the expected value."); + } + + // A test for ToString () + [Fact] + public void MatrixToStringTest() + { + Matrix a = new Matrix(); + a.M11 = 11.0f; + a.M12 = -12.0f; + a.M21 = 21.0f; + a.M22 = 22.0f; + a.M31 = 31.0f; + a.M32 = 32.0f; + + string expected = "{ {M11:11 M12:-12} " + + "{M21:21 M22:22} " + + "{M31:31 M32:32} }"; + string actual; + + actual = a.ToString(); + Assert.Equal(expected, actual); + } + + // A test for Add (Matrix, Matrix) + [Fact] + public void MatrixAddTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 + b.M11; + expected.M12 = a.M12 + b.M12; + expected.M21 = a.M21 + b.M21; + expected.M22 = a.M22 + b.M22; + expected.M31 = a.M31 + b.M31; + expected.M32 = a.M32 + b.M32; + + Matrix actual; + + actual = Matrix.Add(a, b); + Assert.Equal(expected, actual); + } + + // A test for Equals (object) + [Fact] + public void MatrixEqualsTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + object obj = b; + + bool expected = true; + bool actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + obj = b; + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 3: compare between different types. + obj = new Vector4(); + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + + // case 3: compare against null. + obj = null; + expected = false; + actual = a.Equals(obj); + Assert.Equal(expected, actual); + } + + // A test for GetHashCode () + [Fact] + public void MatrixGetHashCodeTest() + { + Matrix target = GenerateMatrixNumberFrom1To6(); + int expected = unchecked(target.M11.GetHashCode() + target.M12.GetHashCode() + + target.M21.GetHashCode() + target.M22.GetHashCode() + + target.M31.GetHashCode() + target.M32.GetHashCode()); + int actual; + + actual = target.GetHashCode(); + Assert.Equal(expected, actual); + } + + // A test for Multiply (Matrix, Matrix) + [Fact] + public void MatrixMultiplyTest3() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; + expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; + + expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; + expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; + + expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; + expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; + Matrix actual; + actual = Matrix.Multiply(a, b); + + Assert.Equal(expected, actual); + + // Sanity check by comparison with 4x4 multiply. + a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); + b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); + + actual = Matrix.Multiply(a, b); + + Matrix4x4 a44 = new Matrix4x4(a); + Matrix4x4 b44 = new Matrix4x4(b); + Matrix4x4 expected44 = Matrix4x4.Multiply(a44, b44); + Matrix4x4 actual44 = new Matrix4x4(actual); + + Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.Multiply did not return the expected value."); + } + + // A test for Multiply (Matrix, float) + [Fact] + public void MatrixMultiplyTest5() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); + Matrix actual = Matrix.Multiply(a, 3); + + Assert.Equal(expected, actual); + } + + // A test for Multiply (Matrix, float) + [Fact] + public void MatrixMultiplyTest6() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); + Matrix actual = a * 3; + + Assert.Equal(expected, actual); + } + + // A test for Negate (Matrix) + [Fact] + public void MatrixNegateTest() + { + Matrix m = GenerateMatrixNumberFrom1To6(); + + Matrix expected = new Matrix(); + expected.M11 = -1.0f; + expected.M12 = -2.0f; + expected.M21 = -3.0f; + expected.M22 = -4.0f; + expected.M31 = -5.0f; + expected.M32 = -6.0f; + Matrix actual; + + actual = Matrix.Negate(m); + Assert.Equal(expected, actual); + } + + // A test for operator != (Matrix, Matrix) + [Fact] + public void MatrixInequalityTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = false; + bool actual = a != b; + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = true; + actual = a != b; + Assert.Equal(expected, actual); + } + + // A test for operator == (Matrix, Matrix) + [Fact] + public void MatrixEqualityTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = true; + bool actual = a == b; + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = false; + actual = a == b; + Assert.Equal(expected, actual); + } + + // A test for Subtract (Matrix, Matrix) + [Fact] + public void MatrixSubtractTest() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + Matrix expected = new Matrix(); + Matrix actual; + + actual = Matrix.Subtract(a, b); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (Vector2f) + [Fact] + public void MatrixCreateScaleTest1() + { + SizeF scales = new SizeF(2.0f, 3.0f); + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 3.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(scales); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (Vector2f, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest1() + { + SizeF scale = new SizeF(3, 4); + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateScale (float) + [Fact] + public void MatrixCreateScaleTest2() + { + float scale = 2.0f; + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 2.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(scale); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (float, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest2() + { + float scale = 5; + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateScale (float, float) + [Fact] + public void MatrixCreateScaleTest3() + { + float xScale = 2.0f; + float yScale = 3.0f; + Matrix expected = new Matrix( + 2.0f, 0.0f, + 0.0f, 3.0f, + 0.0f, 0.0f); + Matrix actual = Matrix.CreateScale(xScale, yScale); + Assert.Equal(expected, actual); + } + + // A test for CreateScale (float, float, Vector2f) + [Fact] + public void MatrixCreateScaleCenterTest3() + { + SizeF scale = new SizeF(3, 4); + PointF center = new PointF(23, 42); + + Matrix scaleAroundZero = Matrix.CreateScale(scale.Width, scale.Height, Vector2.Zero); + Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale.Width, scale.Height); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); + + Matrix scaleAroundCenter = Matrix.CreateScale(scale.Width, scale.Height, center); + Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale.Width, scale.Height) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); + } + + // A test for CreateTranslation (Vector2f) + [Fact] + public void MatrixCreateTranslationTest1() + { + PointF position = new PointF(2.0f, 3.0f); + Matrix expected = new Matrix( + 1.0f, 0.0f, + 0.0f, 1.0f, + 2.0f, 3.0f); + + Matrix actual = Matrix.CreateTranslation(position); + Assert.Equal(expected, actual); + } + + // A test for CreateTranslation (float, float) + [Fact] + public void MatrixCreateTranslationTest2() + { + float xPosition = 2.0f; + float yPosition = 3.0f; + + Matrix expected = new Matrix( + 1.0f, 0.0f, + 0.0f, 1.0f, + 2.0f, 3.0f); + + Matrix actual = Matrix.CreateTranslation(xPosition, yPosition); + Assert.Equal(expected, actual); + } + + // A test for Translation + [Fact] + public void MatrixTranslationTest() + { + Matrix a = GenerateTestMatrix(); + Matrix b = a; + + // Transformed vector that has same semantics of property must be same. + PointF val = new PointF(a.M31, a.M32); + Assert.Equal(val, a.Translation); + + // Set value and get value must be same. + val = new PointF(1.0f, 2.0f); + a.Translation = val; + Assert.Equal(val, a.Translation); + + // Make sure it only modifies expected value of matrix. + Assert.True( + a.M11 == b.M11 && a.M12 == b.M12 && + a.M21 == b.M21 && a.M22 == b.M22 && + a.M31 != b.M31 && a.M32 != b.M32, + "Matrix.Translation modified unexpected value of matrix."); + } + + // A test for Equals (Matrix) + [Fact] + public void MatrixEqualsTest1() + { + Matrix a = GenerateMatrixNumberFrom1To6(); + Matrix b = GenerateMatrixNumberFrom1To6(); + + // case 1: compare between same values + bool expected = true; + bool actual = a.Equals(b); + Assert.Equal(expected, actual); + + // case 2: compare between different values + b.M11 = 11.0f; + expected = false; + actual = a.Equals(b); + Assert.Equal(expected, actual); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewIdentityTest() + { + Matrix expected = Matrix.Identity; + Matrix actual = Matrix.CreateSkew(0, 0); + Assert.Equal(expected, actual); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewXTest() + { + Matrix expected = new Matrix(1, 0, -0.414213562373095f, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(-MathF.PI / 8, 0); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + expected = new Matrix(1, 0, 0.414213562373095f, 1, 0, 0); + actual = Matrix.CreateSkew(MathF.PI / 8, 0); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + PointF result = PointF.Transform(new PointF(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(0, 0), result)); + + result = PointF.Transform(new Vector2(0, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(0.414213568f, 1), result)); + result = PointF.Transform(new PointF(0, -1), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(-0.414213568f, -1), result)); + + result = PointF.Transform(new PointF(3, 10), actual); + Assert.True(ApproximateFloatComparer.Equal(new PointF(7.14213568f, 10), result)); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewYTest() + { + Matrix expected = new Matrix(1, -0.414213562373095f, 0, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(0, -MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + expected = new Matrix(1, 0.414213562373095f, 0, 1, 0, 0); + actual = Matrix.CreateSkew(0, MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); + + result = Vector2.Transform(new Vector2(1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 0.414213568f), result)); + + result = Vector2.Transform(new Vector2(-1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(-1, -0.414213568f), result)); + + result = Vector2.Transform(new Vector2(10, 3), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(10, 7.14213568f), result)); + } + + // A test for CreateSkew (float, float) + [Fact] + public void MatrixCreateSkewXYTest() + { + Matrix expected = new Matrix(1, -0.414213562373095f, 1, 1, 0, 0); + Matrix actual = Matrix.CreateSkew(MathF.PI / 4, -MathF.PI / 8); + Assert.True(ApproximateFloatComparer.Equal(expected, actual)); + + Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); + + result = Vector2.Transform(new Vector2(1, 0), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, -0.414213562373095f), result)); + + result = Vector2.Transform(new Vector2(0, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 1), result)); + + result = Vector2.Transform(new Vector2(1, 1), actual); + Assert.True(ApproximateFloatComparer.Equal(new Vector2(2, 0.585786437626905f), result)); + } + + // A test for CreateSkew (float, float, Vector2f) + [Fact] + public void MatrixCreateSkewCenterTest() + { + float skewX = 1, skewY = 2; + Vector2 center = new Vector2(23, 42); + + Matrix skewAroundZero = Matrix.CreateSkew(skewX, skewY, Vector2.Zero); + Matrix skewAroundZeroExpected = Matrix.CreateSkew(skewX, skewY); + Assert.True(ApproximateFloatComparer.Equal(skewAroundZero, skewAroundZeroExpected)); + + Matrix skewAroundCenter = Matrix.CreateSkew(skewX, skewY, center); + Matrix skewAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateSkew(skewX, skewY) * Matrix.CreateTranslation(center); + Assert.True(ApproximateFloatComparer.Equal(skewAroundCenter, skewAroundCenterExpected)); + } + + // A test for IsIdentity + [Fact] + public void MatrixIsIdentityTest() + { + Assert.True(Matrix.Identity.IsIdentity); + Assert.True(new Matrix(1, 0, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(0, 0, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 1, 0, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 1, 1, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 0, 0, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 1, 1, 0).IsIdentity); + Assert.False(new Matrix(1, 0, 0, 1, 0, 1).IsIdentity); + } + + // A test for Matrix comparison involving NaN values + [Fact] + public void MatrixEqualsNanTest() + { + Matrix a = new Matrix(float.NaN, 0, 0, 0, 0, 0); + Matrix b = new Matrix(0, float.NaN, 0, 0, 0, 0); + Matrix c = new Matrix(0, 0, float.NaN, 0, 0, 0); + Matrix d = new Matrix(0, 0, 0, float.NaN, 0, 0); + Matrix e = new Matrix(0, 0, 0, 0, float.NaN, 0); + Matrix f = new Matrix(0, 0, 0, 0, 0, float.NaN); + + Assert.False(a == new Matrix()); + Assert.False(b == new Matrix()); + Assert.False(c == new Matrix()); + Assert.False(d == new Matrix()); + Assert.False(e == new Matrix()); + Assert.False(f == new Matrix()); + + Assert.True(a != new Matrix()); + Assert.True(b != new Matrix()); + Assert.True(c != new Matrix()); + Assert.True(d != new Matrix()); + Assert.True(e != new Matrix()); + Assert.True(f != new Matrix()); + + Assert.False(a.Equals(new Matrix())); + Assert.False(b.Equals(new Matrix())); + Assert.False(c.Equals(new Matrix())); + Assert.False(d.Equals(new Matrix())); + Assert.False(e.Equals(new Matrix())); + Assert.False(f.Equals(new Matrix())); + + Assert.False(a.IsIdentity); + Assert.False(b.IsIdentity); + Assert.False(c.IsIdentity); + Assert.False(d.IsIdentity); + Assert.False(e.IsIdentity); + Assert.False(f.IsIdentity); + + // Counterintuitive result - IEEE rules for NaN comparison are weird! + Assert.False(a.Equals(a)); + Assert.False(b.Equals(b)); + Assert.False(c.Equals(c)); + Assert.False(d.Equals(d)); + Assert.False(e.Equals(e)); + Assert.False(f.Equals(f)); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index b6dd64511e..28429f0570 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives.Tests.Numerics +namespace SixLabors.Primitives.Tests { using System; using System.Globalization; diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj index a300a0b063..2dd674fdcb 100644 --- a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +++ b/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj @@ -3,7 +3,7 @@ 0.0.0 netcoreapp1.1 - SixLabors.Shapes.Tests + SixLabors.Primitives.Tests SixLabors.Shapes.Tests true false @@ -17,7 +17,6 @@ - From d5495aa4a64877d33a6b6f17b06175034346bf25 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 7 Jun 2017 19:49:16 +0100 Subject: [PATCH 006/136] [SL.Core] Remove matrix in favour of Matrix3x2 --- .../ApproximateFloatComparer.cs | 11 +- src/SixLabors.Primitives/Matrix.cs | 399 ------- .../Matrix3x2Extentions.cs | 105 ++ src/SixLabors.Primitives/Point.cs | 6 +- src/SixLabors.Primitives/PointF.cs | 6 +- src/SixLabors.Primitives/Rectangle.cs | 2 +- src/SixLabors.Primitives/RectangleF.cs | 2 +- src/SixLabors.Primitives/Size.cs | 2 +- src/SixLabors.Primitives/SizeF.cs | 2 +- .../SixLabors.Primitives.Tests/MatrixTests.cs | 1015 ----------------- .../SixLabors.Primitives.Tests/PointFTests.cs | 4 +- .../SixLabors.Primitives.Tests/PointTests.cs | 4 +- 12 files changed, 124 insertions(+), 1434 deletions(-) delete mode 100644 src/SixLabors.Primitives/Matrix.cs create mode 100644 src/SixLabors.Primitives/Matrix3x2Extentions.cs delete mode 100644 tests/SixLabors.Primitives.Tests/MatrixTests.cs diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs index 0d854a1108..9722508a46 100644 --- a/src/SixLabors.Primitives/ApproximateFloatComparer.cs +++ b/src/SixLabors.Primitives/ApproximateFloatComparer.cs @@ -14,10 +14,9 @@ internal struct ApproximateFloatComparer IEqualityComparer, IEqualityComparer, IEqualityComparer, - IEqualityComparer, + IEqualityComparer, IEqualityComparer, IEqualityComparer - { private readonly float tolerance; const float defaultTolerance = 1e-5f; @@ -89,7 +88,7 @@ public int GetHashCode(Vector3 obj) return hash; } - public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) + public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b, float tolerance) { return Equal(a.M11, b.M11, tolerance) && Equal(a.M12, b.M12, tolerance) && @@ -99,17 +98,17 @@ public static bool Equal(Matrix3x2 a, Matrix3x2 b, float tolerance) Equal(a.M32, b.M32, tolerance); } - public static bool Equal(Matrix3x2 a, Matrix3x2 b) + public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) { return Equal(a, b, defaultTolerance); } - public bool Equals(Matrix3x2 a, Matrix3x2 b) + public bool Equals(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) { return Equal(a, b, this.tolerance); } - public int GetHashCode(Matrix3x2 obj) + public int GetHashCode(System.Numerics.Matrix3x2 obj) { int hash = GetHashCode(obj.M11); hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); diff --git a/src/SixLabors.Primitives/Matrix.cs b/src/SixLabors.Primitives/Matrix.cs deleted file mode 100644 index aa97c3ed73..0000000000 --- a/src/SixLabors.Primitives/Matrix.cs +++ /dev/null @@ -1,399 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Numerics; - using System.Runtime.CompilerServices; - - /// - /// A Matrix object for applying matrix transforms to primitives. - /// - public struct Matrix : IEquatable - { - private Matrix3x2 backingMatrix; - - private static readonly Matrix _identity = new Matrix - { - backingMatrix = Matrix3x2.Identity - }; - - /// - /// Returns the multiplicative identity matrix. - /// - public static Matrix Identity => _identity; - - /// - /// Returns whether the matrix is the identity matrix. - /// - public bool IsIdentity => this.backingMatrix.IsIdentity; - - /// - /// Gets or Sets the translation component of this matrix. - /// - public PointF Translation - { - get => this.backingMatrix.Translation; - set => this.backingMatrix.Translation = value; - } - - /// - /// The first element of the first row - /// - public float M11 { get => this.backingMatrix.M11; set => this.backingMatrix.M11 = value; } - - /// - /// The second element of the first row - /// - public float M12 { get => this.backingMatrix.M12; set => this.backingMatrix.M12 = value; } - - /// - /// The first element of the second row - /// - public float M21 { get => this.backingMatrix.M21; set => this.backingMatrix.M21 = value; } - - /// - /// The second element of the second row - /// - public float M22 { get => this.backingMatrix.M22; set => this.backingMatrix.M22 = value; } - - /// - /// The first element of the third row - /// - public float M31 { get => this.backingMatrix.M31; set => this.backingMatrix.M31 = value; } - - /// - /// The second element of the third row - /// - public float M32 { get => this.backingMatrix.M32; set => this.backingMatrix.M32 = value; } - - /// - /// Constructs a Matrix3x2 from the given components. - /// - public Matrix(float m11, float m12, - float m21, float m22, - float m31, float m32) - { - this.backingMatrix = new Matrix3x2(m11, m12, m21, m22, m31, m32); - } - - /// - /// Creates a translation matrix from the given vector. - /// - /// The translation position. - /// A translation matrix. - public static Matrix CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); - - /// - /// Creates a translation matrix from the given X and Y components. - /// - /// The X position. - /// The Y position. - /// A translation matrix. - public static Matrix CreateTranslation(float xPosition, float yPosition) => Matrix3x2.CreateTranslation(xPosition, yPosition); - - /// - /// Creates a scale matrix from the given X and Y components. - /// - /// Value to scale by on the X-axis. - /// Value to scale by on the Y-axis. - /// A scaling matrix. - public static Matrix CreateScale(float xScale, float yScale) => Matrix3x2.CreateScale(xScale, yScale); - - /// - /// Creates a scale matrix that is offset by a given center point. - /// - /// Value to scale by on the X-axis. - /// Value to scale by on the Y-axis. - /// The center point. - /// A scaling matrix. - public static Matrix CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); - - /// - /// Creates a scale matrix from the given vector scale. - /// - /// The scale to use. - /// A scaling matrix. - public static Matrix CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); - - /// - /// Creates a scale matrix from the given vector scale with an offset from the given center point. - /// - /// The scale to use. - /// The center offset. - /// A scaling matrix. - public static Matrix CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); - - /// - /// Creates a scale matrix that scales uniformly with the given scale. - /// - /// The uniform scale to use. - /// A scaling matrix. - public static Matrix CreateScale(float scale) => Matrix3x2.CreateScale(scale); - - /// - /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. - /// - /// The uniform scale to use. - /// The center offset. - /// A scaling matrix. - public static Matrix CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); - - /// - /// Creates a skew matrix from the given angles in radians. - /// - /// The X angle, in radians. - /// The Y angle, in radians. - /// A skew matrix. - public static Matrix CreateSkew(float radiansX, float radiansY) => Matrix3x2.CreateSkew(radiansX, radiansY); - - /// - /// Creates a skew matrix from the given angles in radians. - /// - /// The X angle, in degrees. - /// The Y angle, in degrees. - /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); - - /// - /// Creates a skew matrix from the given angles in radians and a center point. - /// - /// The X angle, in radians. - /// The Y angle, in radians. - /// The center point. - /// A skew matrix. - public static Matrix CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); - - /// - /// Creates a skew matrix from the given angles in radians and a center point. - /// - /// The X angle, in degrees. - /// The Y angle, in degrees. - /// The center point. - /// A skew matrix. - public static Matrix CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); - - /// - /// Creates a rotation matrix using the given rotation in radians. - /// - /// The amount of rotation, in radians. - /// A rotation matrix. - public static Matrix CreateRotation(float radians) => System.Numerics.Matrix3x2.CreateRotation(radians); - - /// - /// Creates a rotation matrix using the given rotation in radians. - /// - /// The amount of rotation, in degrees. - /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); - - /// - /// Creates a rotation matrix using the given rotation in radians and a center point. - /// - /// The amount of rotation, in radians. - /// The center point. - /// A rotation matrix. - public static Matrix CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); - - /// - /// Creates a rotation matrix using the given rotation in radians and a center point. - /// - /// The amount of rotation, in degrees. - /// The center point. - /// A rotation matrix. - public static Matrix CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); - - /// - /// Calculates the determinant for this matrix. - /// The determinant is calculated by expanding the matrix with a third column whose values are (0,0,1). - /// - /// The determinant. - public float GetDeterminant() => this.backingMatrix.GetDeterminant(); - - /// - /// Attempts to invert the given matrix. If the operation succeeds, the inverted matrix is stored in the result parameter. - /// - /// The source matrix. - /// The output matrix. - /// True if the operation succeeded, False otherwise. - public static bool Invert(Matrix matrix, out Matrix result) - { - Matrix3x2 m; - var b = System.Numerics.Matrix3x2.Invert(matrix.backingMatrix, out m); - result = m; - return b; - } - - /// - /// Linearly interpolates from matrix1 to matrix2, based on the third parameter. - /// - /// The first source matrix. - /// The second source matrix. - /// The relative weighting of matrix2. - /// The interpolated matrix. - public static Matrix Lerp(Matrix matrix1, Matrix matrix2, float amount) => Matrix3x2.Lerp(matrix1.backingMatrix, matrix2.backingMatrix, amount); - - /// - /// Negates the given matrix by multiplying all values by -1. - /// - /// The source matrix. - /// The negated matrix. - public static Matrix Negate(Matrix value) => -value.backingMatrix; - - /// - /// Adds each matrix element in value1 with its corresponding element in value2. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the summed values. - public static Matrix Add(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; - - /// - /// Subtracts each matrix element in value2 from its corresponding element in value1. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the resulting values. - public static Matrix Subtract(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; - - /// - /// Multiplies two matrices together and returns the resulting matrix. - /// - /// The first source matrix. - /// The second source matrix. - /// The product matrix. - public static Matrix Multiply(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; - - /// - /// Scales all elements in a matrix by the given scalar factor. - /// - /// The source matrix. - /// The scaling value to use. - /// The resulting matrix. - public static Matrix Multiply(Matrix value1, float value2) => value1.backingMatrix * value2; - - /// - /// Negates the given matrix by multiplying all values by -1. - /// - /// The source matrix. - /// The negated matrix. - public static Matrix operator -(Matrix value) => -value.backingMatrix; - - /// - /// Adds each matrix element in value1 with its corresponding element in value2. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the summed values. - public static Matrix operator +(Matrix value1, Matrix value2) => value1.backingMatrix + value2.backingMatrix; - - /// - /// Subtracts each matrix element in value2 from its corresponding element in value1. - /// - /// The first source matrix. - /// The second source matrix. - /// The matrix containing the resulting values. - public static Matrix operator -(Matrix value1, Matrix value2) => value1.backingMatrix - value2.backingMatrix; - - /// - /// Multiplies two matrices together and returns the resulting matrix. - /// - /// The first source matrix. - /// The second source matrix. - /// The product matrix. - public static Matrix operator *(Matrix value1, Matrix value2) => value1.backingMatrix * value2.backingMatrix; - - /// - /// Scales all elements in a matrix by the given scalar factor. - /// - /// The source matrix. - /// The scaling value to use. - /// The resulting matrix. - public static Matrix operator *(Matrix value1, float value2) => value1.backingMatrix * value2; - - /// - /// Returns a boolean indicating whether the given matrices are equal. - /// - /// The first source matrix. - /// The second source matrix. - /// True if the matrices are equal; False otherwise. - public static bool operator ==(Matrix value1, Matrix value2) => value1.backingMatrix == value2.backingMatrix; - - /// - /// Returns a boolean indicating whether the given matrices are not equal. - /// - /// The first source matrix. - /// The second source matrix. - /// True if the matrices are not equal; False if they are equal. - public static bool operator !=(Matrix value1, Matrix value2) - { - return value1.backingMatrix != value2.backingMatrix; - - } - - /// - /// Returns a boolean indicating whether the matrix is equal to the other given matrix. - /// - /// The other matrix to test equality against. - /// True if this matrix is equal to other; False otherwise. - public bool Equals(Matrix other) - { - return this.backingMatrix == other.backingMatrix; - } - - /// - /// Returns a boolean indicating whether the given Object is equal to this matrix instance. - /// - /// The Object to compare against. - /// True if the Object is equal to this matrix; False otherwise. - public override bool Equals(object obj) - { - if (obj is Matrix) - { - return Equals((Matrix)obj); - } - - return false; - } - - /// - /// Returns a String representing this matrix instance. - /// - /// The string representation. - public override string ToString() => this.backingMatrix.ToString(); - - /// - /// Returns the hash code for this instance. - /// - /// The hash code. - public override int GetHashCode() => this.backingMatrix.GetHashCode(); - - /// - /// Creates a with the values of the specified . - /// - /// The matrix. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Matrix3x2(Matrix matrix) => matrix.backingMatrix; - - /// - /// Creates a with the values of the specified . - /// - /// The matrix. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Matrix(Matrix3x2 matrix) => new Matrix { backingMatrix = matrix }; - - internal static Matrix CreateScale(Vector2 scale, object zero) - { - throw new NotImplementedException(); - } - } -} diff --git a/src/SixLabors.Primitives/Matrix3x2Extentions.cs b/src/SixLabors.Primitives/Matrix3x2Extentions.cs new file mode 100644 index 0000000000..f20e19a1ba --- /dev/null +++ b/src/SixLabors.Primitives/Matrix3x2Extentions.cs @@ -0,0 +1,105 @@ +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// + +namespace SixLabors.Primitives +{ + using System; + using System.Numerics; + using System.Runtime.CompilerServices; + + /// + /// A Matrix object for applying matrix transforms to primitives. + /// + public static class Matrix3x2Extentions + { + /// + /// Creates a translation matrix from the given vector. + /// + /// The translation position. + /// A translation matrix. + public static Matrix3x2 CreateTranslation(PointF position) => System.Numerics.Matrix3x2.CreateTranslation(position); + + /// + /// Creates a scale matrix that is offset by a given center point. + /// + /// Value to scale by on the X-axis. + /// Value to scale by on the Y-axis. + /// The center point. + /// A scaling matrix. + public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(xScale, yScale, centerPoint); + + /// + /// Creates a scale matrix from the given vector scale. + /// + /// The scale to use. + /// A scaling matrix. + public static Matrix3x2 CreateScale(SizeF scales) => System.Numerics.Matrix3x2.CreateScale(scales); + + /// + /// Creates a scale matrix from the given vector scale with an offset from the given center point. + /// + /// The scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scales, centerPoint); + + /// + /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. + /// + /// The uniform scale to use. + /// The center offset. + /// A scaling matrix. + public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scale, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// A skew matrix. + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in radians. + /// The Y angle, in radians. + /// The center point. + /// A skew matrix. + public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + + /// + /// Creates a skew matrix from the given angles in radians and a center point. + /// + /// The X angle, in degrees. + /// The Y angle, in degrees. + /// The center point. + /// A skew matrix. + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians. + /// + /// The amount of rotation, in degrees. + /// A rotation matrix. + public static Matrix3x2 CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in radians. + /// The center point. + /// A rotation matrix. + public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + + /// + /// Creates a rotation matrix using the given rotation in radians and a center point. + /// + /// The amount of rotation, in degrees. + /// The center point. + /// A rotation matrix. + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + } +} diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Primitives/Point.cs index 206d0545a0..5d37d01a68 100644 --- a/src/SixLabors.Primitives/Point.cs +++ b/src/SixLabors.Primitives/Point.cs @@ -206,7 +206,7 @@ public Point(Size size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Rotate(Point point, System.Numerics.Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); /// /// Skews a point using the given skew matrix. @@ -215,7 +215,7 @@ public Point(Size size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Skew(Point point, System.Numerics.Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); /// /// Translates this by the specified amount. @@ -272,7 +272,7 @@ public override string ToString() /// The source point /// The transformation matrix. /// - public static PointF Transform(Point position, Matrix matrix) + public static PointF Transform(Point position, Matrix3x2 matrix) { return Vector2.Transform(position, matrix); } diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Primitives/PointF.cs index 8df9ef7bff..ca011483ea 100644 --- a/src/SixLabors.Primitives/PointF.cs +++ b/src/SixLabors.Primitives/PointF.cs @@ -218,7 +218,7 @@ public PointF(SizeF size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Rotate(PointF point, Matrix rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); + public static PointF Rotate(PointF point, Matrix3x2 rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); /// /// Skews a point using the given skew matrix. @@ -227,7 +227,7 @@ public PointF(SizeF size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Skew(PointF point, Matrix skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); /// /// Translates this by the specified amount. @@ -286,7 +286,7 @@ public override string ToString() /// The source point /// The transformation matrix. /// - public static PointF Transform(PointF position, Matrix matrix) + public static PointF Transform(PointF position, Matrix3x2 matrix) { return Vector2.Transform(position, matrix); } diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Primitives/Rectangle.cs index 173ee5d1b1..735920f0a2 100644 --- a/src/SixLabors.Primitives/Rectangle.cs +++ b/src/SixLabors.Primitives/Rectangle.cs @@ -467,7 +467,7 @@ private int GetHashCode(Rectangle rectangle) /// The source rectangle /// The transformation matrix. /// - public static RectangleF Transform(Rectangle rectangle, Matrix matrix) + public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) { PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); PointF topLeft = Point.Transform(rectangle.Location, matrix); diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Primitives/RectangleF.cs index d74fb796f6..36578a455b 100644 --- a/src/SixLabors.Primitives/RectangleF.cs +++ b/src/SixLabors.Primitives/RectangleF.cs @@ -400,7 +400,7 @@ private int GetHashCode(RectangleF rectangle) /// The source rectangle /// The transformation matrix. /// - public static RectangleF Transform(RectangleF rectangle, Matrix matrix) + public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) { PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); PointF topLeft = PointF.Transform(rectangle.Location, matrix); diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index fb306f128e..d0716d5ac3 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -234,7 +234,7 @@ public override string ToString() /// The source size /// The transformation matrix. /// - public static SizeF Transform(Size size, Matrix matrix) + public static SizeF Transform(Size size, Matrix3x2 matrix) { var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index b822740cd4..54db16b77f 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -198,7 +198,7 @@ public override string ToString() /// The source size /// The transformation matrix. /// - public static SizeF Transform(SizeF size, Matrix matrix) + public static SizeF Transform(SizeF size, Matrix3x2 matrix) { var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); diff --git a/tests/SixLabors.Primitives.Tests/MatrixTests.cs b/tests/SixLabors.Primitives.Tests/MatrixTests.cs deleted file mode 100644 index c228f74933..0000000000 --- a/tests/SixLabors.Primitives.Tests/MatrixTests.cs +++ /dev/null @@ -1,1015 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using System.Globalization; - using System.Numerics; - using Xunit; - - /// - /// Tests the struct. - /// - public class MatrixTests - { - - [Fact] - public void ImplicitCastMatrixToMatrix3x2() - { - Matrix matrix = new Matrix(1, 2, 3, 4, 5, 6); - - Matrix3x2 convertedMatrix = matrix; - Assert.Equal(1, convertedMatrix.M11); - Assert.Equal(2, convertedMatrix.M12); - Assert.Equal(3, convertedMatrix.M21); - Assert.Equal(4, convertedMatrix.M22); - Assert.Equal(5, convertedMatrix.M31); - Assert.Equal(6, convertedMatrix.M32); - } - - [Fact] - public void ImplicitCastMatrix3x2ToMatrix() - { - Matrix3x2 matrix = new Matrix3x2(1, 2, 3, 4, 5, 6); - - Matrix convertedMatrix = matrix; - Assert.Equal(1, convertedMatrix.M11); - Assert.Equal(2, convertedMatrix.M12); - Assert.Equal(3, convertedMatrix.M21); - Assert.Equal(4, convertedMatrix.M22); - Assert.Equal(5, convertedMatrix.M31); - Assert.Equal(6, convertedMatrix.M32); - } - - /// matrix test mostly tken directly from CoreFX - /// - static Matrix GenerateMatrixNumberFrom1To6() - { - Matrix a = new Matrix(); - a.M11 = 1.0f; - a.M12 = 2.0f; - a.M21 = 3.0f; - a.M22 = 4.0f; - a.M31 = 5.0f; - a.M32 = 6.0f; - return a; - } - - static Matrix GenerateTestMatrix() - { - Matrix m = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - m.Translation = new Vector2(111.0f, 222.0f); - return m; - } - - // A test for Identity - [Fact] - public void MatrixIdentityTest() - { - Matrix val = new Matrix(); - val.M11 = val.M22 = 1.0f; - - Assert.True(ApproximateFloatComparer.Equal(val, Matrix.Identity), "Matrix.Indentity was not set correctly."); - } - - // A test for Determinant - [Fact] - public void MatrixDeterminantTest() - { - Matrix target = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - - float val = 1.0f; - float det = target.GetDeterminant(); - - Assert.True(ApproximateFloatComparer.Equal(val, det), "Matrix.Determinant was not set correctly."); - } - - // A test for Determinant - // Determinant test |A| = 1 / |A'| - [Fact] - public void MatrixDeterminantTest1() - { - Matrix a = new Matrix(); - a.M11 = 5.0f; - a.M12 = 2.0f; - a.M21 = 12.0f; - a.M22 = 6.8f; - a.M31 = 6.5f; - a.M32 = 1.0f; - Matrix i; - Assert.True(Matrix.Invert(a, out i)); - - float detA = a.GetDeterminant(); - float detI = i.GetDeterminant(); - float t = 1.0f / detI; - - // only accurate to 3 precision - Assert.True(System.Math.Abs(detA - t) < 1e-3, "Matrix.Determinant was not set correctly."); - - // sanity check against 4x4 version - Assert.Equal(new Matrix4x4(a).GetDeterminant(), detA); - Assert.Equal(new Matrix4x4(i).GetDeterminant(), detI); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertTest() - { - Matrix mtx = Matrix.CreateRotation(MathF.ToRadians(30.0f)); - - Matrix expected = new Matrix(); - expected.M11 = 0.8660254f; - expected.M12 = -0.5f; - - expected.M21 = 0.5f; - expected.M22 = 0.8660254f; - - expected.M31 = 0; - expected.M32 = 0; - - Matrix actual; - - Assert.True(Matrix.Invert(mtx, out actual)); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Invert did not return the expected value."); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity), "Matrix.Invert did not return the expected value."); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertIdentityTest() - { - Matrix mtx = Matrix.Identity; - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Assert.True(ApproximateFloatComparer.Equal(actual, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertTranslationTest() - { - Matrix mtx = Matrix.CreateTranslation(23, 42); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertRotationTest() - { - Matrix mtx = Matrix.CreateRotation(2); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertScaleTest() - { - Matrix mtx = Matrix.CreateScale(23, -42); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for Invert (Matrix) - [Fact] - public void MatrixInvertAffineTest() - { - Matrix mtx = Matrix.CreateRotation(2) * - Matrix.CreateScale(23, -42) * - Matrix.CreateTranslation(17, 53); - - Matrix actual; - Assert.True(Matrix.Invert(mtx, out actual)); - - Matrix i = mtx * actual; - Assert.True(ApproximateFloatComparer.Equal(i, Matrix.Identity)); - } - - // A test for CreateRotation (float) - [Fact] - public void MatrixCreateRotationTest() - { - float radians = MathF.ToRadians(50.0f); - - Matrix expected = new Matrix(); - expected.M11 = 0.642787635f; - expected.M12 = 0.766044438f; - expected.M21 = -0.766044438f; - expected.M22 = 0.642787635f; - - Matrix actual; - actual = Matrix.CreateRotation(radians); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.CreateRotation did not return the expected value."); - } - - // A test for CreateRotation (float, Vector2f) - [Fact] - public void MatrixCreateRotationCenterTest() - { - float radians = MathF.ToRadians(30.0f); - Vector2 center = new Vector2(23, 42); - - Matrix rotateAroundZero = Matrix.CreateRotation(radians, Vector2.Zero); - Matrix rotateAroundZeroExpected = Matrix.CreateRotation(radians); - Assert.True(ApproximateFloatComparer.Equal(rotateAroundZero, rotateAroundZeroExpected)); - - Matrix rotateAroundCenter = Matrix.CreateRotation(radians, center); - Matrix rotateAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateRotation(radians) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(rotateAroundCenter, rotateAroundCenterExpected)); - } - - // A test for CreateRotation (float) - [Fact] - public void MatrixCreateRotationRightAngleTest() - { - // 90 degree rotations must be exact! - Matrix actual = Matrix.CreateRotation(0); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI / 2); - Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI); - Assert.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 3 / 2); - Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 2); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 5 / 2); - Assert.Equal(new Matrix(0, 1, -1, 0, 0, 0), actual); - - actual = Matrix.CreateRotation(-MathF.PI / 2); - Assert.Equal(new Matrix(0, -1, 1, 0, 0, 0), actual); - - // But merely close-to-90 rotations should not be excessively clamped. - float delta = MathF.ToRadians(0.01f); - - actual = Matrix.CreateRotation(MathF.PI + delta); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); - - actual = Matrix.CreateRotation(MathF.PI - delta); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 0, 0), actual)); - } - - // A test for CreateRotation (float, Vector2f) - [Fact] - public void MatrixCreateRotationRightAngleCenterTest() - { - Vector2 center = new Vector2(3, 7); - - // 90 degree rotations must be exact! - Matrix actual = Matrix.CreateRotation(0, center); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI / 2, center); - Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); - - actual = Matrix.CreateRotation(MathF.PI, center); - Assert.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual); - - actual = Matrix.CreateRotation(MathF.PI * 3 / 2, center); - Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); - - actual = Matrix.CreateRotation(MathF.PI * 2, center); - Assert.Equal(new Matrix(1, 0, 0, 1, 0, 0), actual); - - actual = Matrix.CreateRotation(MathF.PI * 5 / 2, center); - Assert.Equal(new Matrix(0, 1, -1, 0, 10, 4), actual); - - actual = Matrix.CreateRotation(-MathF.PI / 2, center); - Assert.Equal(new Matrix(0, -1, 1, 0, -4, 10), actual); - - // But merely close-to-90 rotations should not be excessively clamped. - float delta = MathF.ToRadians(0.01f); - - actual = Matrix.CreateRotation(MathF.PI + delta, center); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); - - actual = Matrix.CreateRotation(MathF.PI - delta, center); - Assert.False(ApproximateFloatComparer.Equal(new Matrix(-1, 0, 0, -1, 6, 14), actual)); - } - - // A test for Invert (Matrix) - // Non invertible matrix - determinant is zero - singular matrix - [Fact] - public void MatrixInvertTest1() - { - Matrix a = new Matrix(); - a.M11 = 0.0f; - a.M12 = 2.0f; - a.M21 = 0.0f; - a.M22 = 4.0f; - a.M31 = 5.0f; - a.M32 = 6.0f; - - float detA = a.GetDeterminant(); - Assert.True(ApproximateFloatComparer.Equal(detA, 0.0f), "Matrix.Invert did not return the expected value."); - - Matrix actual; - Assert.False(Matrix.Invert(a, out actual)); - - // all the elements in Actual is NaN - Assert.True( - float.IsNaN(actual.M11) && float.IsNaN(actual.M12) && - float.IsNaN(actual.M21) && float.IsNaN(actual.M22) && - float.IsNaN(actual.M31) && float.IsNaN(actual.M32) - , "Matrix.Invert did not return the expected value."); - } - - // A test for Lerp (Matrix, Matrix, float) - [Fact] - public void MatrixLerpTest() - { - Matrix a = new Matrix(); - a.M11 = 11.0f; - a.M12 = 12.0f; - a.M21 = 21.0f; - a.M22 = 22.0f; - a.M31 = 31.0f; - a.M32 = 32.0f; - - Matrix b = GenerateMatrixNumberFrom1To6(); - - float t = 0.5f; - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + (b.M11 - a.M11) * t; - expected.M12 = a.M12 + (b.M12 - a.M12) * t; - - expected.M21 = a.M21 + (b.M21 - a.M21) * t; - expected.M22 = a.M22 + (b.M22 - a.M22) * t; - - expected.M31 = a.M31 + (b.M31 - a.M31) * t; - expected.M32 = a.M32 + (b.M32 - a.M32) * t; - - Matrix actual; - actual = Matrix.Lerp(a, b, t); - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.Lerp did not return the expected value."); - } - - // A test for operator - (Matrix) - [Fact] - public void MatrixUnaryNegationTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = -1.0f; - expected.M12 = -2.0f; - expected.M21 = -3.0f; - expected.M22 = -4.0f; - expected.M31 = -5.0f; - expected.M32 = -6.0f; - - Matrix actual = -a; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); - } - - // A test for operator - (Matrix, Matrix) - [Fact] - public void MatrixSubtractionTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(); - - Matrix actual = a - b; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator - did not return the expected value."); - } - - // A test for operator * (Matrix, Matrix) - [Fact] - public void MatrixMultiplyTest1() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; - expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; - - expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; - expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; - - expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; - expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; - - Matrix actual = a * b; - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); - - // Sanity check by comparison with 4x4 multiply. - a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); - b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); - - actual = a * b; - - Matrix4x4 a44 = new Matrix4x4(a); - Matrix4x4 b44 = new Matrix4x4(b); - Matrix4x4 expected44 = a44 * b44; - Matrix4x4 actual44 = new Matrix4x4(actual); - - Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.operator * did not return the expected value."); - } - - // A test for operator * (Matrix, Matrix) - // Multiply with identity matrix - [Fact] - public void MatrixMultiplyTest4() - { - Matrix a = new Matrix(); - a.M11 = 1.0f; - a.M12 = 2.0f; - a.M21 = 5.0f; - a.M22 = -6.0f; - a.M31 = 9.0f; - a.M32 = 10.0f; - - Matrix b = new Matrix(); - b = Matrix.Identity; - - Matrix expected = a; - Matrix actual = a * b; - - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator * did not return the expected value."); - } - - // A test for operator + (Matrix, Matrix) - [Fact] - public void MatrixAdditionTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + b.M11; - expected.M12 = a.M12 + b.M12; - expected.M21 = a.M21 + b.M21; - expected.M22 = a.M22 + b.M22; - expected.M31 = a.M31 + b.M31; - expected.M32 = a.M32 + b.M32; - - Matrix actual; - - actual = a + b; - - Assert.True(ApproximateFloatComparer.Equal(expected, actual), "Matrix.operator + did not return the expected value."); - } - - // A test for ToString () - [Fact] - public void MatrixToStringTest() - { - Matrix a = new Matrix(); - a.M11 = 11.0f; - a.M12 = -12.0f; - a.M21 = 21.0f; - a.M22 = 22.0f; - a.M31 = 31.0f; - a.M32 = 32.0f; - - string expected = "{ {M11:11 M12:-12} " + - "{M21:21 M22:22} " + - "{M31:31 M32:32} }"; - string actual; - - actual = a.ToString(); - Assert.Equal(expected, actual); - } - - // A test for Add (Matrix, Matrix) - [Fact] - public void MatrixAddTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 + b.M11; - expected.M12 = a.M12 + b.M12; - expected.M21 = a.M21 + b.M21; - expected.M22 = a.M22 + b.M22; - expected.M31 = a.M31 + b.M31; - expected.M32 = a.M32 + b.M32; - - Matrix actual; - - actual = Matrix.Add(a, b); - Assert.Equal(expected, actual); - } - - // A test for Equals (object) - [Fact] - public void MatrixEqualsTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - object obj = b; - - bool expected = true; - bool actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - obj = b; - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 3: compare between different types. - obj = new Vector4(); - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - - // case 3: compare against null. - obj = null; - expected = false; - actual = a.Equals(obj); - Assert.Equal(expected, actual); - } - - // A test for GetHashCode () - [Fact] - public void MatrixGetHashCodeTest() - { - Matrix target = GenerateMatrixNumberFrom1To6(); - int expected = unchecked(target.M11.GetHashCode() + target.M12.GetHashCode() + - target.M21.GetHashCode() + target.M22.GetHashCode() + - target.M31.GetHashCode() + target.M32.GetHashCode()); - int actual; - - actual = target.GetHashCode(); - Assert.Equal(expected, actual); - } - - // A test for Multiply (Matrix, Matrix) - [Fact] - public void MatrixMultiplyTest3() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = a.M11 * b.M11 + a.M12 * b.M21; - expected.M12 = a.M11 * b.M12 + a.M12 * b.M22; - - expected.M21 = a.M21 * b.M11 + a.M22 * b.M21; - expected.M22 = a.M21 * b.M12 + a.M22 * b.M22; - - expected.M31 = a.M31 * b.M11 + a.M32 * b.M21 + b.M31; - expected.M32 = a.M31 * b.M12 + a.M32 * b.M22 + b.M32; - Matrix actual; - actual = Matrix.Multiply(a, b); - - Assert.Equal(expected, actual); - - // Sanity check by comparison with 4x4 multiply. - a = Matrix.CreateRotation(MathF.ToRadians(30)) * Matrix.CreateTranslation(23, 42); - b = Matrix.CreateScale(3, 7) * Matrix.CreateTranslation(666, -1); - - actual = Matrix.Multiply(a, b); - - Matrix4x4 a44 = new Matrix4x4(a); - Matrix4x4 b44 = new Matrix4x4(b); - Matrix4x4 expected44 = Matrix4x4.Multiply(a44, b44); - Matrix4x4 actual44 = new Matrix4x4(actual); - - Assert.True(ApproximateFloatComparer.Equal(expected44, actual44), "Matrix.Multiply did not return the expected value."); - } - - // A test for Multiply (Matrix, float) - [Fact] - public void MatrixMultiplyTest5() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); - Matrix actual = Matrix.Multiply(a, 3); - - Assert.Equal(expected, actual); - } - - // A test for Multiply (Matrix, float) - [Fact] - public void MatrixMultiplyTest6() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(3, 6, 9, 12, 15, 18); - Matrix actual = a * 3; - - Assert.Equal(expected, actual); - } - - // A test for Negate (Matrix) - [Fact] - public void MatrixNegateTest() - { - Matrix m = GenerateMatrixNumberFrom1To6(); - - Matrix expected = new Matrix(); - expected.M11 = -1.0f; - expected.M12 = -2.0f; - expected.M21 = -3.0f; - expected.M22 = -4.0f; - expected.M31 = -5.0f; - expected.M32 = -6.0f; - Matrix actual; - - actual = Matrix.Negate(m); - Assert.Equal(expected, actual); - } - - // A test for operator != (Matrix, Matrix) - [Fact] - public void MatrixInequalityTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = false; - bool actual = a != b; - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = true; - actual = a != b; - Assert.Equal(expected, actual); - } - - // A test for operator == (Matrix, Matrix) - [Fact] - public void MatrixEqualityTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = true; - bool actual = a == b; - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = false; - actual = a == b; - Assert.Equal(expected, actual); - } - - // A test for Subtract (Matrix, Matrix) - [Fact] - public void MatrixSubtractTest() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - Matrix expected = new Matrix(); - Matrix actual; - - actual = Matrix.Subtract(a, b); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (Vector2f) - [Fact] - public void MatrixCreateScaleTest1() - { - SizeF scales = new SizeF(2.0f, 3.0f); - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 3.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(scales); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (Vector2f, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest1() - { - SizeF scale = new SizeF(3, 4); - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateScale (float) - [Fact] - public void MatrixCreateScaleTest2() - { - float scale = 2.0f; - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 2.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(scale); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (float, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest2() - { - float scale = 5; - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale, PointF.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateScale (float, float) - [Fact] - public void MatrixCreateScaleTest3() - { - float xScale = 2.0f; - float yScale = 3.0f; - Matrix expected = new Matrix( - 2.0f, 0.0f, - 0.0f, 3.0f, - 0.0f, 0.0f); - Matrix actual = Matrix.CreateScale(xScale, yScale); - Assert.Equal(expected, actual); - } - - // A test for CreateScale (float, float, Vector2f) - [Fact] - public void MatrixCreateScaleCenterTest3() - { - SizeF scale = new SizeF(3, 4); - PointF center = new PointF(23, 42); - - Matrix scaleAroundZero = Matrix.CreateScale(scale.Width, scale.Height, Vector2.Zero); - Matrix scaleAroundZeroExpected = Matrix.CreateScale(scale.Width, scale.Height); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundZero, scaleAroundZeroExpected)); - - Matrix scaleAroundCenter = Matrix.CreateScale(scale.Width, scale.Height, center); - Matrix scaleAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateScale(scale.Width, scale.Height) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(scaleAroundCenter, scaleAroundCenterExpected)); - } - - // A test for CreateTranslation (Vector2f) - [Fact] - public void MatrixCreateTranslationTest1() - { - PointF position = new PointF(2.0f, 3.0f); - Matrix expected = new Matrix( - 1.0f, 0.0f, - 0.0f, 1.0f, - 2.0f, 3.0f); - - Matrix actual = Matrix.CreateTranslation(position); - Assert.Equal(expected, actual); - } - - // A test for CreateTranslation (float, float) - [Fact] - public void MatrixCreateTranslationTest2() - { - float xPosition = 2.0f; - float yPosition = 3.0f; - - Matrix expected = new Matrix( - 1.0f, 0.0f, - 0.0f, 1.0f, - 2.0f, 3.0f); - - Matrix actual = Matrix.CreateTranslation(xPosition, yPosition); - Assert.Equal(expected, actual); - } - - // A test for Translation - [Fact] - public void MatrixTranslationTest() - { - Matrix a = GenerateTestMatrix(); - Matrix b = a; - - // Transformed vector that has same semantics of property must be same. - PointF val = new PointF(a.M31, a.M32); - Assert.Equal(val, a.Translation); - - // Set value and get value must be same. - val = new PointF(1.0f, 2.0f); - a.Translation = val; - Assert.Equal(val, a.Translation); - - // Make sure it only modifies expected value of matrix. - Assert.True( - a.M11 == b.M11 && a.M12 == b.M12 && - a.M21 == b.M21 && a.M22 == b.M22 && - a.M31 != b.M31 && a.M32 != b.M32, - "Matrix.Translation modified unexpected value of matrix."); - } - - // A test for Equals (Matrix) - [Fact] - public void MatrixEqualsTest1() - { - Matrix a = GenerateMatrixNumberFrom1To6(); - Matrix b = GenerateMatrixNumberFrom1To6(); - - // case 1: compare between same values - bool expected = true; - bool actual = a.Equals(b); - Assert.Equal(expected, actual); - - // case 2: compare between different values - b.M11 = 11.0f; - expected = false; - actual = a.Equals(b); - Assert.Equal(expected, actual); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewIdentityTest() - { - Matrix expected = Matrix.Identity; - Matrix actual = Matrix.CreateSkew(0, 0); - Assert.Equal(expected, actual); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewXTest() - { - Matrix expected = new Matrix(1, 0, -0.414213562373095f, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(-MathF.PI / 8, 0); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - expected = new Matrix(1, 0, 0.414213562373095f, 1, 0, 0); - actual = Matrix.CreateSkew(MathF.PI / 8, 0); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - PointF result = PointF.Transform(new PointF(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(0, 0), result)); - - result = PointF.Transform(new Vector2(0, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(0.414213568f, 1), result)); - result = PointF.Transform(new PointF(0, -1), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(-0.414213568f, -1), result)); - - result = PointF.Transform(new PointF(3, 10), actual); - Assert.True(ApproximateFloatComparer.Equal(new PointF(7.14213568f, 10), result)); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewYTest() - { - Matrix expected = new Matrix(1, -0.414213562373095f, 0, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(0, -MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - expected = new Matrix(1, 0.414213562373095f, 0, 1, 0, 0); - actual = Matrix.CreateSkew(0, MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); - - result = Vector2.Transform(new Vector2(1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 0.414213568f), result)); - - result = Vector2.Transform(new Vector2(-1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(-1, -0.414213568f), result)); - - result = Vector2.Transform(new Vector2(10, 3), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(10, 7.14213568f), result)); - } - - // A test for CreateSkew (float, float) - [Fact] - public void MatrixCreateSkewXYTest() - { - Matrix expected = new Matrix(1, -0.414213562373095f, 1, 1, 0, 0); - Matrix actual = Matrix.CreateSkew(MathF.PI / 4, -MathF.PI / 8); - Assert.True(ApproximateFloatComparer.Equal(expected, actual)); - - Vector2 result = Vector2.Transform(new Vector2(0, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(0, 0), result)); - - result = Vector2.Transform(new Vector2(1, 0), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, -0.414213562373095f), result)); - - result = Vector2.Transform(new Vector2(0, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(1, 1), result)); - - result = Vector2.Transform(new Vector2(1, 1), actual); - Assert.True(ApproximateFloatComparer.Equal(new Vector2(2, 0.585786437626905f), result)); - } - - // A test for CreateSkew (float, float, Vector2f) - [Fact] - public void MatrixCreateSkewCenterTest() - { - float skewX = 1, skewY = 2; - Vector2 center = new Vector2(23, 42); - - Matrix skewAroundZero = Matrix.CreateSkew(skewX, skewY, Vector2.Zero); - Matrix skewAroundZeroExpected = Matrix.CreateSkew(skewX, skewY); - Assert.True(ApproximateFloatComparer.Equal(skewAroundZero, skewAroundZeroExpected)); - - Matrix skewAroundCenter = Matrix.CreateSkew(skewX, skewY, center); - Matrix skewAroundCenterExpected = Matrix.CreateTranslation(-center) * Matrix.CreateSkew(skewX, skewY) * Matrix.CreateTranslation(center); - Assert.True(ApproximateFloatComparer.Equal(skewAroundCenter, skewAroundCenterExpected)); - } - - // A test for IsIdentity - [Fact] - public void MatrixIsIdentityTest() - { - Assert.True(Matrix.Identity.IsIdentity); - Assert.True(new Matrix(1, 0, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(0, 0, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 1, 0, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 1, 1, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 0, 0, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 1, 1, 0).IsIdentity); - Assert.False(new Matrix(1, 0, 0, 1, 0, 1).IsIdentity); - } - - // A test for Matrix comparison involving NaN values - [Fact] - public void MatrixEqualsNanTest() - { - Matrix a = new Matrix(float.NaN, 0, 0, 0, 0, 0); - Matrix b = new Matrix(0, float.NaN, 0, 0, 0, 0); - Matrix c = new Matrix(0, 0, float.NaN, 0, 0, 0); - Matrix d = new Matrix(0, 0, 0, float.NaN, 0, 0); - Matrix e = new Matrix(0, 0, 0, 0, float.NaN, 0); - Matrix f = new Matrix(0, 0, 0, 0, 0, float.NaN); - - Assert.False(a == new Matrix()); - Assert.False(b == new Matrix()); - Assert.False(c == new Matrix()); - Assert.False(d == new Matrix()); - Assert.False(e == new Matrix()); - Assert.False(f == new Matrix()); - - Assert.True(a != new Matrix()); - Assert.True(b != new Matrix()); - Assert.True(c != new Matrix()); - Assert.True(d != new Matrix()); - Assert.True(e != new Matrix()); - Assert.True(f != new Matrix()); - - Assert.False(a.Equals(new Matrix())); - Assert.False(b.Equals(new Matrix())); - Assert.False(c.Equals(new Matrix())); - Assert.False(d.Equals(new Matrix())); - Assert.False(e.Equals(new Matrix())); - Assert.False(f.Equals(new Matrix())); - - Assert.False(a.IsIdentity); - Assert.False(b.IsIdentity); - Assert.False(c.IsIdentity); - Assert.False(d.IsIdentity); - Assert.False(e.IsIdentity); - Assert.False(f.IsIdentity); - - // Counterintuitive result - IEEE rules for NaN comparison are weird! - Assert.False(a.Equals(a)); - Assert.False(b.Equals(b)); - Assert.False(c.Equals(c)); - Assert.False(d.Equals(d)); - Assert.False(e.Equals(e)); - Assert.False(f.Equals(f)); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index 28429f0570..b415e302c7 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -106,7 +106,7 @@ public void ArithmeticTestWithSizeF(float x, float y) public void RotateTest() { var p = new PointF(13, 17); - Matrix matrix = Matrix.CreateRotationDegrees(45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, PointF.Empty); var pout = PointF.Rotate(p, matrix); @@ -117,7 +117,7 @@ public void RotateTest() public void SkewTest() { var p = new PointF(13, 17); - Matrix matrix = Matrix.CreateSkewDegrees(45, 45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, PointF.Empty); var pout = PointF.Skew(p, matrix); Assert.Equal(new PointF(30, 30), pout); diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs index 150e21987e..c20fed339f 100644 --- a/tests/SixLabors.Primitives.Tests/PointTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -161,7 +161,7 @@ public void OffsetTest(int x, int y) public void RotateTest() { var p = new Point(13, 17); - Matrix matrix = Matrix.CreateRotationDegrees(45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, Point.Empty); var pout = Point.Rotate(p, matrix); @@ -172,7 +172,7 @@ public void RotateTest() public void SkewTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix.CreateSkewDegrees(45, 45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, Point.Empty); var pout = Point.Skew(p, matrix); Assert.Equal(new Point(30, 30), pout); From 345ac1bf066023b5c664a89fbe4868a91c3ebf6b Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 8 Jun 2017 10:32:07 +1000 Subject: [PATCH 007/136] [SL.Core] Fix naming --- ...x2Extentions.cs => Matrix3x2Extensions.cs} | 30 +++++++++---------- .../SixLabors.Primitives.Tests/PointFTests.cs | 4 +-- .../SixLabors.Primitives.Tests/PointTests.cs | 4 +-- 3 files changed, 18 insertions(+), 20 deletions(-) rename src/SixLabors.Primitives/{Matrix3x2Extentions.cs => Matrix3x2Extensions.cs} (77%) diff --git a/src/SixLabors.Primitives/Matrix3x2Extentions.cs b/src/SixLabors.Primitives/Matrix3x2Extensions.cs similarity index 77% rename from src/SixLabors.Primitives/Matrix3x2Extentions.cs rename to src/SixLabors.Primitives/Matrix3x2Extensions.cs index f20e19a1ba..626be8ed74 100644 --- a/src/SixLabors.Primitives/Matrix3x2Extentions.cs +++ b/src/SixLabors.Primitives/Matrix3x2Extensions.cs @@ -1,25 +1,23 @@ -// +// // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // namespace SixLabors.Primitives { - using System; using System.Numerics; - using System.Runtime.CompilerServices; /// - /// A Matrix object for applying matrix transforms to primitives. + /// Extension methods for the struct. /// - public static class Matrix3x2Extentions + public static class Matrix3x2Extensions { /// /// Creates a translation matrix from the given vector. /// /// The translation position. /// A translation matrix. - public static Matrix3x2 CreateTranslation(PointF position) => System.Numerics.Matrix3x2.CreateTranslation(position); + public static Matrix3x2 CreateTranslation(PointF position) => Matrix3x2.CreateTranslation(position); /// /// Creates a scale matrix that is offset by a given center point. @@ -28,14 +26,14 @@ public static class Matrix3x2Extentions /// Value to scale by on the Y-axis. /// The center point. /// A scaling matrix. - public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(xScale, yScale, centerPoint); + public static Matrix3x2 CreateScale(float xScale, float yScale, PointF centerPoint) => Matrix3x2.CreateScale(xScale, yScale, centerPoint); /// /// Creates a scale matrix from the given vector scale. /// /// The scale to use. /// A scaling matrix. - public static Matrix3x2 CreateScale(SizeF scales) => System.Numerics.Matrix3x2.CreateScale(scales); + public static Matrix3x2 CreateScale(SizeF scales) => Matrix3x2.CreateScale(scales); /// /// Creates a scale matrix from the given vector scale with an offset from the given center point. @@ -43,7 +41,7 @@ public static class Matrix3x2Extentions /// The scale to use. /// The center offset. /// A scaling matrix. - public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scales, centerPoint); + public static Matrix3x2 CreateScale(SizeF scales, PointF centerPoint) => Matrix3x2.CreateScale(scales, centerPoint); /// /// Creates a scale matrix that scales uniformly with the given scale with an offset from the given center. @@ -51,7 +49,7 @@ public static class Matrix3x2Extentions /// The uniform scale to use. /// The center offset. /// A scaling matrix. - public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => System.Numerics.Matrix3x2.CreateScale(scale, centerPoint); + public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); /// /// Creates a skew matrix from the given angles in radians. @@ -59,7 +57,7 @@ public static class Matrix3x2Extentions /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -68,7 +66,7 @@ public static class Matrix3x2Extentions /// The Y angle, in radians. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); + public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -77,14 +75,14 @@ public static class Matrix3x2Extentions /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => System.Numerics.Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in radians. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -92,7 +90,7 @@ public static class Matrix3x2Extentions /// The amount of rotation, in radians. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(radians, centerPoint); + public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => Matrix3x2.CreateRotation(radians, centerPoint); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -100,6 +98,6 @@ public static class Matrix3x2Extentions /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => System.Numerics.Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); } } diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Primitives.Tests/PointFTests.cs index b415e302c7..7406b10cda 100644 --- a/tests/SixLabors.Primitives.Tests/PointFTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointFTests.cs @@ -106,7 +106,7 @@ public void ArithmeticTestWithSizeF(float x, float y) public void RotateTest() { var p = new PointF(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, PointF.Empty); var pout = PointF.Rotate(p, matrix); @@ -117,7 +117,7 @@ public void RotateTest() public void SkewTest() { var p = new PointF(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, PointF.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, PointF.Empty); var pout = PointF.Skew(p, matrix); Assert.Equal(new PointF(30, 30), pout); diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Primitives.Tests/PointTests.cs index c20fed339f..495a34ff6a 100644 --- a/tests/SixLabors.Primitives.Tests/PointTests.cs +++ b/tests/SixLabors.Primitives.Tests/PointTests.cs @@ -161,7 +161,7 @@ public void OffsetTest(int x, int y) public void RotateTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateRotationDegrees(45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, Point.Empty); var pout = Point.Rotate(p, matrix); @@ -172,7 +172,7 @@ public void RotateTest() public void SkewTest() { var p = new Point(13, 17); - Matrix3x2 matrix = Matrix3x2Extentions.CreateSkewDegrees(45, 45, Point.Empty); + Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, Point.Empty); var pout = Point.Skew(p, matrix); Assert.Equal(new Point(30, 30), pout); From 15d0258f98c3a2fe7482903574c3a60a6a6d9760 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 07:49:45 +0100 Subject: [PATCH 008/136] [SL.Core] Drop unneeded types plus added Size operators. --- .../ApproximateFloatComparer.cs | 209 ----------- src/SixLabors.Primitives/Ellipse.cs | 180 --------- src/SixLabors.Primitives/LongRational.cs | 352 ------------------ src/SixLabors.Primitives/Rational.cs | 189 ---------- src/SixLabors.Primitives/SignedRational.cs | 189 ---------- src/SixLabors.Primitives/Size.cs | 67 ++++ src/SixLabors.Primitives/SizeF.cs | 34 ++ .../RationalTests.cs | 115 ------ .../SignedRationalTests.cs | 122 ------ .../SixLabors.Primitives.Tests/SizeFTests.cs | 81 ++++ tests/SixLabors.Primitives.Tests/SizeTests.cs | 180 +++++++++ 11 files changed, 362 insertions(+), 1356 deletions(-) delete mode 100644 src/SixLabors.Primitives/ApproximateFloatComparer.cs delete mode 100644 src/SixLabors.Primitives/Ellipse.cs delete mode 100644 src/SixLabors.Primitives/LongRational.cs delete mode 100644 src/SixLabors.Primitives/Rational.cs delete mode 100644 src/SixLabors.Primitives/SignedRational.cs delete mode 100644 tests/SixLabors.Primitives.Tests/RationalTests.cs delete mode 100644 tests/SixLabors.Primitives.Tests/SignedRationalTests.cs diff --git a/src/SixLabors.Primitives/ApproximateFloatComparer.cs b/src/SixLabors.Primitives/ApproximateFloatComparer.cs deleted file mode 100644 index 9722508a46..0000000000 --- a/src/SixLabors.Primitives/ApproximateFloatComparer.cs +++ /dev/null @@ -1,209 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -using System; -using System.Collections.Generic; -using System.Numerics; - -namespace SixLabors.Primitives -{ - internal struct ApproximateFloatComparer - : IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer, - IEqualityComparer - { - private readonly float tolerance; - const float defaultTolerance = 1e-5f; - - public ApproximateFloatComparer(float tolerance = defaultTolerance) - { - this.tolerance = tolerance; - } - - public static bool Equal(float x, float y, float tolerance) - { - float d = x - y; - - return d > -tolerance && d < tolerance; - } - - public static bool Equal(float x, float y) - { - return Equal(x, y, defaultTolerance); - } - - public bool Equals(float x, float y) - { - return Equal(x, y, this.tolerance); - } - - public int GetHashCode(float obj) - { - var diff = obj % this.tolerance;// how different from tollerance are we? - return (obj - diff).GetHashCode(); - } - - public bool Equals(Vector4 a, Vector4 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z) && this.Equals(a.W, b.W); - } - - public int GetHashCode(Vector4 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.W)); - return hash; - } - - public bool Equals(Vector2 a, Vector2 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y); - } - - public int GetHashCode(Vector2 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - return hash; - } - - public bool Equals(Vector3 a, Vector3 b) - { - return this.Equals(a.X, b.X) && this.Equals(a.Y, b.Y) && this.Equals(a.Z, b.Z); - } - - public int GetHashCode(Vector3 obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Z)); - return hash; - } - - public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b, float tolerance) - { - return Equal(a.M11, b.M11, tolerance) && - Equal(a.M12, b.M12, tolerance) && - Equal(a.M21, b.M21, tolerance) && - Equal(a.M22, b.M22, tolerance) && - Equal(a.M31, b.M31, tolerance) && - Equal(a.M32, b.M32, tolerance); - } - - public static bool Equal(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(System.Numerics.Matrix3x2 a, System.Numerics.Matrix3x2 b) - { - return Equal(a, b, this.tolerance); - } - - public int GetHashCode(System.Numerics.Matrix3x2 obj) - { - int hash = GetHashCode(obj.M11); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M11)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); - return hash; - } - - - public static bool Equal(Matrix4x4 a, Matrix4x4 b, float tolerance) - { - return - Equal(a.M11, b.M11, tolerance) && - Equal(a.M12, b.M12, tolerance) && - Equal(a.M13, b.M13, tolerance) && - Equal(a.M14, b.M14, tolerance) && - - Equal(a.M21, b.M21, tolerance) && - Equal(a.M22, b.M22, tolerance) && - Equal(a.M23, b.M23, tolerance) && - Equal(a.M24, b.M24, tolerance) && - - Equal(a.M31, b.M31, tolerance) && - Equal(a.M32, b.M32, tolerance) && - Equal(a.M33, b.M33, tolerance) && - Equal(a.M34, b.M34, tolerance) && - - Equal(a.M41, b.M41, tolerance) && - Equal(a.M42, b.M42, tolerance) && - Equal(a.M43, b.M43, tolerance) && - Equal(a.M44, b.M44, tolerance); - } - - public static bool Equal(Matrix4x4 a, Matrix4x4 b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(Matrix4x4 a, Matrix4x4 b) - { - return Equal(a, b, this.tolerance); - } - - - public int GetHashCode(Matrix4x4 obj) - { - int hash = GetHashCode(obj.M11); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M12)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M13)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M14)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M21)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M22)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M23)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M24)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M31)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M32)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M33)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M34)); - - hash = HashHelpers.Combine(hash, GetHashCode(obj.M41)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M42)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M43)); - hash = HashHelpers.Combine(hash, GetHashCode(obj.M44)); - return hash; - } - - - public static bool Equal(PointF a, PointF b, float tolerance) - { - return - Equal(a.X, b.X, tolerance) && - Equal(a.Y, b.Y, tolerance); - } - - public static bool Equal(PointF a, PointF b) - { - return Equal(a, b, defaultTolerance); - } - - public bool Equals(PointF a, PointF b) - { - return Equal(a, b, this.tolerance); - } - - - public int GetHashCode(PointF obj) - { - int hash = GetHashCode(obj.X); - hash = HashHelpers.Combine(hash, GetHashCode(obj.Y)); - return hash; - } - } -} diff --git a/src/SixLabors.Primitives/Ellipse.cs b/src/SixLabors.Primitives/Ellipse.cs deleted file mode 100644 index e1890df275..0000000000 --- a/src/SixLabors.Primitives/Ellipse.cs +++ /dev/null @@ -1,180 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.ComponentModel; - using System.Numerics; - - /// - /// Represents an ellipse. - /// - public struct Ellipse : IEquatable - { - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly Ellipse Empty = default(Ellipse); - - /// - /// The center point. - /// - private Point center; - - /// - /// Initializes a new instance of the struct. - /// - /// The center point. - /// The x-radius. - /// The y-radius. - public Ellipse(Point center, float radiusX, float radiusY) - { - this.center = center; - this.RadiusX = radiusX; - this.RadiusY = radiusY; - } - - /// - /// Gets the x-radius of this . - /// - public float RadiusX { get; } - - /// - /// Gets the y-radius of this . - /// - public float RadiusY { get; } - - /// - /// Gets a value indicating whether this is empty. - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public bool IsEmpty => this.Equals(Empty); - - /// - /// Compares two objects for equality. - /// - /// - /// The on the left side of the operand. - /// - /// - /// The on the right side of the operand. - /// - /// - /// True if the current left is equal to the parameter; otherwise, false. - /// - public static bool operator ==(Ellipse left, Ellipse right) - { - return left.Equals(right); - } - - /// - /// Compares two objects for inequality. - /// - /// - /// The on the left side of the operand. - /// - /// - /// The on the right side of the operand. - /// - /// - /// True if the current left is unequal to the parameter; otherwise, false. - /// - public static bool operator !=(Ellipse left, Ellipse right) - { - return !left.Equals(right); - } - - /// - /// Returns the center point of the given - /// - /// The ellipse - /// - public static Vector2 Center(Ellipse ellipse) - { - return new Vector2(ellipse.center.X, ellipse.center.Y); - } - - /// - /// Determines if the specfied point is contained within the rectangular region defined by - /// this . - /// - /// The x-coordinate of the given point. - /// The y-coordinate of the given point. - /// The - public bool Contains(int x, int y) - { - if (this.RadiusX <= 0 || this.RadiusY <= 0) - { - return false; - } - - // TODO: SIMD? - // This is a more general form of the circle equation - // X^2/a^2 + Y^2/b^2 <= 1 - Point normalized = new Point(x - this.center.X, y - this.center.Y); - int nX = normalized.X; - int nY = normalized.Y; - - return ((double)(nX * nX) / (this.RadiusX * this.RadiusX)) - + ((double)(nY * nY) / (this.RadiusY * this.RadiusY)) - <= 1.0; - } - - /// - public override int GetHashCode() - { - return this.GetHashCode(this); - } - - /// - public override string ToString() - { - if (this.IsEmpty) - { - return "Ellipse [ Empty ]"; - } - - return - $"Ellipse [ RadiusX={this.RadiusX}, RadiusY={this.RadiusX}, Centre={this.center.X},{this.center.Y} ]"; - } - - /// - public override bool Equals(object obj) - { - if (obj is Ellipse) - { - return this.Equals((Ellipse)obj); - } - - return false; - } - - /// - public bool Equals(Ellipse other) - { - return this.center.Equals(other.center) - && this.RadiusX.Equals(other.RadiusX) - && this.RadiusY.Equals(other.RadiusY); - } - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(Ellipse ellipse) - { - int hashCode = ellipse.center.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusX.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, ellipse.RadiusY.GetHashCode()); - return hashCode; - } - } -} diff --git a/src/SixLabors.Primitives/LongRational.cs b/src/SixLabors.Primitives/LongRational.cs deleted file mode 100644 index 4f01936eec..0000000000 --- a/src/SixLabors.Primitives/LongRational.cs +++ /dev/null @@ -1,352 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - using System.Text; - - /// - /// Represents a number that can be expressed as a fraction - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - internal struct LongRational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// - /// The number above the line in a vulgar fraction showing how many of the parts - /// indicated by the denominator are taken. - /// - /// - /// The number below the line in a vulgar fraction; a divisor. - /// - public LongRational(long numerator, long denominator) - : this(numerator, denominator, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// - /// The number above the line in a vulgar fraction showing how many of the parts - /// indicated by the denominator are taken. - /// - /// - /// The number below the line in a vulgar fraction; a divisor. - /// - /// - /// Whether to attempt to simplify the fractional parts. - /// - public LongRational(long numerator, long denominator, bool simplify) - : this() - { - this.Numerator = numerator; - this.Denominator = denominator; - - if (simplify) - { - this.Simplify(); - } - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public LongRational(double value, bool bestPrecision) - : this() - { - if (double.IsNaN(value)) - { - this.Numerator = this.Denominator = 0; - return; - } - - if (double.IsPositiveInfinity(value)) - { - this.Numerator = 1; - this.Denominator = 0; - return; - } - - if (double.IsNegativeInfinity(value)) - { - this.Numerator = -1; - this.Denominator = 0; - return; - } - - this.Numerator = 1; - this.Denominator = 1; - - double val = Math.Abs(value); - double df = this.Numerator / (double)this.Denominator; - double epsilon = bestPrecision ? double.Epsilon : .000001; - - while (Math.Abs(df - val) > epsilon) - { - if (df < val) - { - this.Numerator++; - } - else - { - this.Denominator++; - this.Numerator = (int)(val * this.Denominator); - } - - df = this.Numerator / (double)this.Denominator; - } - - if (value < 0.0) - { - this.Numerator *= -1; - } - - this.Simplify(); - } - - /// - /// Gets the numerator of a number. - /// - public long Numerator - { - get; - private set; - } - - /// - /// Gets the denominator of a number. - /// - public long Denominator - { - get; - private set; - } - - /// - /// Gets a value indicating whether this instance is indeterminate. - /// - public bool IsIndeterminate - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == 0; - } - } - - /// - /// Gets a value indicating whether this instance is an integer (n, 1) - /// - public bool IsInteger => this.Denominator == 1; - - /// - /// Gets a value indicating whether this instance is equal to negative infinity (-1, 0) - /// - public bool IsNegativeInfinity - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == -1; - } - } - - /// - /// Gets a value indicating whether this instance is equal to positive infinity (1, 0) - /// - public bool IsPositiveInfinity - { - get - { - if (this.Denominator != 0) - { - return false; - } - - return this.Numerator == 1; - } - } - - /// - /// Gets a value indicating whether this instance is equal to 0 (0, 1) - /// - public bool IsZero - { - get - { - if (this.Denominator != 1) - { - return false; - } - - return this.Numerator == 0; - } - } - - /// - public bool Equals(LongRational other) - { - if (this.Denominator == other.Denominator) - { - return this.Numerator == other.Numerator; - } - - if (this.Numerator == 0 && this.Denominator == 0) - { - return other.Numerator == 0 && other.Denominator == 0; - } - - if (other.Numerator == 0 && other.Denominator == 0) - { - return this.Numerator == 0 && this.Denominator == 0; - } - - return (this.Numerator * other.Denominator) == (this.Denominator * other.Numerator); - } - - /// - public override int GetHashCode() - { - return this.GetHashCode(this); - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - if (this.IsIndeterminate) - { - return "[ Indeterminate ]"; - } - - if (this.IsPositiveInfinity) - { - return "[ PositiveInfinity ]"; - } - - if (this.IsNegativeInfinity) - { - return "[ NegativeInfinity ]"; - } - - if (this.IsZero) - { - return "0"; - } - - if (this.IsInteger) - { - return this.Numerator.ToString(provider); - } - - StringBuilder sb = new StringBuilder(); - sb.Append(this.Numerator.ToString(provider)); - sb.Append("/"); - sb.Append(this.Denominator.ToString(provider)); - return sb.ToString(); - } - - /// - /// Finds the greatest common divisor of two values. - /// - /// The first value - /// The second value - /// The - private static long GreatestCommonDivisor(long left, long right) - { - return right == 0 ? left : GreatestCommonDivisor(right, left % right); - } - - /// - /// Simplifies the - /// - private void Simplify() - { - if (this.IsIndeterminate) - { - return; - } - - if (this.IsNegativeInfinity) - { - return; - } - - if (this.IsPositiveInfinity) - { - return; - } - - if (this.IsInteger) - { - return; - } - - if (this.IsZero) - { - return; - } - - if (this.Numerator == 0) - { - this.Denominator = 0; - return; - } - - if (this.Numerator == this.Denominator) - { - this.Numerator = 1; - this.Denominator = 1; - } - - long gcd = GreatestCommonDivisor(Math.Abs(this.Numerator), Math.Abs(this.Denominator)); - if (gcd > 1) - { - this.Numerator = this.Numerator / gcd; - this.Denominator = this.Denominator / gcd; - } - } - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(LongRational rational) => HashHelpers.Combine(rational.Numerator.GetHashCode(), rational.Denominator.GetHashCode()); - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Rational.cs b/src/SixLabors.Primitives/Rational.cs deleted file mode 100644 index 3d7003b4eb..0000000000 --- a/src/SixLabors.Primitives/Rational.cs +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - - /// - /// Represents a number that can be expressed as a fraction. - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - public struct Rational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// The to create the rational from. - public Rational(uint value) - : this(value, 1) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - public Rational(uint numerator, uint denominator) - : this(numerator, denominator, true) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - /// Specified if the rational should be simplified. - public Rational(uint numerator, uint denominator, bool simplify) - { - LongRational rational = new LongRational(numerator, denominator, simplify); - - this.Numerator = (uint)rational.Numerator; - this.Denominator = (uint)rational.Denominator; - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - public Rational(double value) - : this(value, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public Rational(double value, bool bestPrecision) - { - LongRational rational = new LongRational(Math.Abs(value), bestPrecision); - - this.Numerator = (uint)rational.Numerator; - this.Denominator = (uint)rational.Denominator; - } - - /// - /// Gets the numerator of a number. - /// - public uint Numerator { get; } - - /// - /// Gets the denominator of a number. - /// - public uint Denominator { get; } - - /// - /// Determines whether the specified instances are considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator ==(Rational left, Rational right) - { - return Rational.Equals(left, right); - } - - /// - /// Determines whether the specified instances are not considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator !=(Rational left, Rational right) - { - return !Rational.Equals(left, right); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// - /// The . - /// - public static Rational FromDouble(double value) - { - return new Rational(value, false); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// Whether to use the best possible precision when parsing the value. - /// - /// The . - /// - public static Rational FromDouble(double value, bool bestPrecision) - { - return new Rational(value, bestPrecision); - } - - /// - public override bool Equals(object obj) - { - if (obj is Rational) - { - return this.Equals((Rational)obj); - } - - return false; - } - - /// - public bool Equals(Rational other) - { - LongRational left = new LongRational(this.Numerator, this.Denominator); - LongRational right = new LongRational(other.Numerator, other.Denominator); - - return left.Equals(right); - } - - /// - public override int GetHashCode() - { - LongRational self = new LongRational(this.Numerator, this.Denominator); - return self.GetHashCode(); - } - - /// - /// Converts a rational number to the nearest . - /// - /// - /// The . - /// - public double ToDouble() - { - return this.Numerator / (double)this.Denominator; - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - LongRational rational = new LongRational(this.Numerator, this.Denominator); - return rational.ToString(provider); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/SignedRational.cs b/src/SixLabors.Primitives/SignedRational.cs deleted file mode 100644 index 07fd105da4..0000000000 --- a/src/SixLabors.Primitives/SignedRational.cs +++ /dev/null @@ -1,189 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives -{ - using System; - using System.Globalization; - - /// - /// Represents a number that can be expressed as a fraction. - /// - /// - /// This is a very simplified implementation of a rational number designed for use with metadata only. - /// - public struct SignedRational : IEquatable - { - /// - /// Initializes a new instance of the struct. - /// - /// The to create the rational from. - public SignedRational(int value) - : this(value, 1) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - public SignedRational(int numerator, int denominator) - : this(numerator, denominator, true) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The number above the line in a vulgar fraction showing how many of the parts indicated by the denominator are taken. - /// The number below the line in a vulgar fraction; a divisor. - /// Specified if the rational should be simplified. - public SignedRational(int numerator, int denominator, bool simplify) - { - LongRational rational = new LongRational(numerator, denominator, simplify); - - this.Numerator = (int)rational.Numerator; - this.Denominator = (int)rational.Denominator; - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - public SignedRational(double value) - : this(value, false) - { - } - - /// - /// Initializes a new instance of the struct. - /// - /// The to create the instance from. - /// Whether to use the best possible precision when parsing the value. - public SignedRational(double value, bool bestPrecision) - { - LongRational rational = new LongRational(value, bestPrecision); - - this.Numerator = (int)rational.Numerator; - this.Denominator = (int)rational.Denominator; - } - - /// - /// Gets the numerator of a number. - /// - public int Numerator { get; } - - /// - /// Gets the denominator of a number. - /// - public int Denominator { get; } - - /// - /// Determines whether the specified instances are considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator ==(SignedRational left, SignedRational right) - { - return SignedRational.Equals(left, right); - } - - /// - /// Determines whether the specified instances are not considered equal. - /// - /// The first to compare. - /// The second to compare. - /// The - public static bool operator !=(SignedRational left, SignedRational right) - { - return !SignedRational.Equals(left, right); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// - /// The . - /// - public static SignedRational FromDouble(double value) - { - return new SignedRational(value, false); - } - - /// - /// Converts the specified to an instance of this type. - /// - /// The to convert to an instance of this type. - /// Whether to use the best possible precision when parsing the value. - /// - /// The . - /// - public static SignedRational FromDouble(double value, bool bestPrecision) - { - return new SignedRational(value, bestPrecision); - } - - /// - public override bool Equals(object obj) - { - if (obj is SignedRational) - { - return this.Equals((SignedRational)obj); - } - - return false; - } - - /// - public bool Equals(SignedRational other) - { - LongRational left = new LongRational(this.Numerator, this.Denominator); - LongRational right = new LongRational(other.Numerator, other.Denominator); - - return left.Equals(right); - } - - /// - public override int GetHashCode() - { - LongRational self = new LongRational(this.Numerator, this.Denominator); - return self.GetHashCode(); - } - - /// - /// Converts a rational number to the nearest . - /// - /// - /// The . - /// - public double ToDouble() - { - return this.Numerator / (double)this.Denominator; - } - - /// - public override string ToString() - { - return this.ToString(CultureInfo.InvariantCulture); - } - - /// - /// Converts the numeric value of this instance to its equivalent string representation using - /// the specified culture-specific format information. - /// - /// - /// An object that supplies culture-specific formatting information. - /// - /// The - public string ToString(IFormatProvider provider) - { - LongRational rational = new LongRational(this.Numerator, this.Denominator); - return rational.ToString(provider); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Primitives/Size.cs index d0716d5ac3..abc7ad4cb2 100644 --- a/src/SixLabors.Primitives/Size.cs +++ b/src/SixLabors.Primitives/Size.cs @@ -124,6 +124,55 @@ public Size(Point point) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator -(Size left, Size right) => Subtract(left, right); + /// + /// Multiplies a by an producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static Size operator *(int left, Size right) => Multiply(right, left); + + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static Size operator *(Size left, int right) => Multiply(left, right); + + /// + /// Divides by an producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static Size operator /(Size left, int right) => new Size(unchecked(left.Width / right), unchecked(left.Height / right)); + + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static SizeF operator *(float left, Size right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static SizeF operator *(Size left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static SizeF operator /(Size left, float right) + => new SizeF(left.Width / right, left.Height / right); + /// /// Compares two objects for equality. /// @@ -172,6 +221,24 @@ public Size(Point point) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + private static Size Multiply(Size size, int multiplier) => + new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(Size size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Primitives/SizeF.cs index 54db16b77f..e356a4edbe 100644 --- a/src/SixLabors.Primitives/SizeF.cs +++ b/src/SixLabors.Primitives/SizeF.cs @@ -116,6 +116,31 @@ public SizeF(PointF point) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static SizeF operator *(float left, SizeF right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static SizeF operator *(SizeF left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static SizeF operator /(SizeF left, float right) + => new SizeF(left.Width / right, left.Height / right); + /// /// Compares two objects for equality. /// @@ -156,6 +181,15 @@ public SizeF(PointF point) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(SizeF size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// public override int GetHashCode() { diff --git a/tests/SixLabors.Primitives.Tests/RationalTests.cs b/tests/SixLabors.Primitives.Tests/RationalTests.cs deleted file mode 100644 index e59505cf5f..0000000000 --- a/tests/SixLabors.Primitives.Tests/RationalTests.cs +++ /dev/null @@ -1,115 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using Xunit; - - /// - /// Tests the struct. - /// - public class RationalTests - { - /// - /// Tests the equality operators for equality. - /// - [Fact] - public void AreEqual() - { - Rational r1 = new Rational(3, 2); - Rational r2 = new Rational(3, 2); - - Assert.Equal(r1, r2); - Assert.True(r1 == r2); - - Rational r3 = new Rational(7.55); - Rational r4 = new Rational(755, 100); - Rational r5 = new Rational(151, 20); - - Assert.Equal(r3, r4); - Assert.Equal(r4, r5); - } - - /// - /// Tests the equality operators for inequality. - /// - [Fact] - public void AreNotEqual() - { - Rational first = new Rational(0, 100); - Rational second = new Rational(100, 100); - - Assert.NotEqual(first, second); - Assert.True(first != second); - } - - /// - /// Tests whether the Rational constructor correctly assign properties. - /// - [Fact] - public void ConstructorAssignsProperties() - { - Rational rational = new Rational(7, 55); - Assert.Equal(7U, rational.Numerator); - Assert.Equal(55U, rational.Denominator); - - rational = new Rational(755, 100); - Assert.Equal(151U, rational.Numerator); - Assert.Equal(20U, rational.Denominator); - - rational = new Rational(755, 100, false); - Assert.Equal(755U, rational.Numerator); - Assert.Equal(100U, rational.Denominator); - - rational = new Rational(-7.55); - Assert.Equal(151U, rational.Numerator); - Assert.Equal(20U, rational.Denominator); - - rational = new Rational(7); - Assert.Equal(7U, rational.Numerator); - Assert.Equal(1U, rational.Denominator); - } - - [Fact] - public void Fraction() - { - Rational first = new Rational(1.0 / 1600); - Rational second = new Rational(1.0 / 1600, true); - Assert.False(first.Equals(second)); - } - - [Fact] - public void ToDouble() - { - Rational rational = new Rational(0, 0); - Assert.Equal(double.NaN, rational.ToDouble()); - - rational = new Rational(2, 0); - Assert.Equal(double.PositiveInfinity, rational.ToDouble()); - } - - [Fact] - public void ToStringRepresention() - { - Rational rational = new Rational(0, 0); - Assert.Equal("[ Indeterminate ]", rational.ToString()); - - rational = new Rational(double.PositiveInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new Rational(double.NegativeInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new Rational(0, 1); - Assert.Equal("0", rational.ToString()); - - rational = new Rational(2, 1); - Assert.Equal("2", rational.ToString()); - - rational = new Rational(1, 2); - Assert.Equal("1/2", rational.ToString()); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs b/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs deleted file mode 100644 index bc7a5b8106..0000000000 --- a/tests/SixLabors.Primitives.Tests/SignedRationalTests.cs +++ /dev/null @@ -1,122 +0,0 @@ -// -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. -// - -namespace SixLabors.Primitives.Tests -{ - using Xunit; - - /// - /// Tests the struct. - /// - public class SignedRationalTests - { - /// - /// Tests the equality operators for equality. - /// - [Fact] - public void AreEqual() - { - SignedRational r1 = new SignedRational(3, 2); - SignedRational r2 = new SignedRational(3, 2); - - Assert.Equal(r1, r2); - Assert.True(r1 == r2); - - SignedRational r3 = new SignedRational(7.55); - SignedRational r4 = new SignedRational(755, 100); - SignedRational r5 = new SignedRational(151, 20); - - Assert.Equal(r3, r4); - Assert.Equal(r4, r5); - } - - /// - /// Tests the equality operators for inequality. - /// - [Fact] - public void AreNotEqual() - { - SignedRational first = new SignedRational(0, 100); - SignedRational second = new SignedRational(100, 100); - - Assert.NotEqual(first, second); - Assert.True(first != second); - } - - /// - /// Tests whether the Rational constructor correctly assign properties. - /// - [Fact] - public void ConstructorAssignsProperties() - { - SignedRational rational = new SignedRational(7, -55); - Assert.Equal(7, rational.Numerator); - Assert.Equal(-55, rational.Denominator); - - rational = new SignedRational(-755, 100); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(20, rational.Denominator); - - rational = new SignedRational(-755, -100, false); - Assert.Equal(-755, rational.Numerator); - Assert.Equal(-100, rational.Denominator); - - rational = new SignedRational(-151, -20); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(-20, rational.Denominator); - - rational = new SignedRational(-7.55); - Assert.Equal(-151, rational.Numerator); - Assert.Equal(20, rational.Denominator); - - rational = new SignedRational(7); - Assert.Equal(7, rational.Numerator); - Assert.Equal(1, rational.Denominator); - } - - [Fact] - public void Fraction() - { - SignedRational first = new SignedRational(1.0 / 1600); - SignedRational second = new SignedRational(1.0 / 1600, true); - Assert.False(first.Equals(second)); - } - - [Fact] - public void ToDouble() - { - SignedRational rational = new SignedRational(0, 0); - Assert.Equal(double.NaN, rational.ToDouble()); - - rational = new SignedRational(2, 0); - Assert.Equal(double.PositiveInfinity, rational.ToDouble()); - - rational = new SignedRational(-2, 0); - Assert.Equal(double.NegativeInfinity, rational.ToDouble()); - } - - [Fact] - public void ToStringRepresention() - { - SignedRational rational = new SignedRational(0, 0); - Assert.Equal("[ Indeterminate ]", rational.ToString()); - - rational = new SignedRational(double.PositiveInfinity); - Assert.Equal("[ PositiveInfinity ]", rational.ToString()); - - rational = new SignedRational(double.NegativeInfinity); - Assert.Equal("[ NegativeInfinity ]", rational.ToString()); - - rational = new SignedRational(0, 1); - Assert.Equal("0", rational.ToString()); - - rational = new SignedRational(2, 1); - Assert.Equal("2", rational.ToString()); - - rational = new SignedRational(1, 2); - Assert.Equal("1/2", rational.ToString()); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Primitives.Tests/SizeFTests.cs index baa16c7e40..e4dec3fd6a 100644 --- a/tests/SixLabors.Primitives.Tests/SizeFTests.cs +++ b/tests/SixLabors.Primitives.Tests/SizeFTests.cs @@ -159,5 +159,86 @@ public void ToStringTestEmpty() var sz = new SizeF(0, 0); Assert.Equal("SizeF [ Empty ]", sz.ToString()); } + + [Theory] + [InlineData(1000.234f, 0.0f)] + [InlineData(1000.234f, 1.0f)] + [InlineData(1000.234f, 2400.933f)] + [InlineData(1000.234f, float.MaxValue)] + [InlineData(1000.234f, -1.0f)] + [InlineData(1000.234f, -2400.933f)] + [InlineData(1000.234f, float.MinValue)] + [InlineData(float.MaxValue, 0.0f)] + [InlineData(float.MaxValue, 1.0f)] + [InlineData(float.MaxValue, 2400.933f)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, -1.0f)] + [InlineData(float.MaxValue, -2400.933f)] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, 0.0f)] + [InlineData(float.MinValue, 1.0f)] + [InlineData(float.MinValue, 2400.933f)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, -1.0f)] + [InlineData(float.MinValue, -2400.933f)] + [InlineData(float.MinValue, float.MinValue)] + public void MultiplicationTest(float dimension, float multiplier) + { + SizeF sz1 = new SizeF(dimension, dimension); + SizeF mulExpected; + + mulExpected = new SizeF(dimension * multiplier, dimension * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1111.1111f, 2222.2222f, 3333.3333f)] + public void MultiplicationTestWidthHeightMultiplier(float width, float height, float multiplier) + { + SizeF sz1 = new SizeF(width, height); + SizeF mulExpected; + + mulExpected = new SizeF(width * multiplier, height * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(0.0f, 1.0f)] + [InlineData(1.0f, 1.0f)] + [InlineData(-1.0f, 1.0f)] + [InlineData(1.0f, -1.0f)] + [InlineData(-1.0f, -1.0f)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, 1.0f)] + [InlineData(float.MinValue, 1.0f)] + [InlineData(float.MaxValue, -1.0f)] + [InlineData(float.MinValue, -1.0f)] + [InlineData(float.MinValue, 0.0f)] + [InlineData(1.0f, float.MinValue)] + [InlineData(1.0f, float.MinValue)] + [InlineData(-1.0f, float.MinValue)] + [InlineData(-1.0f, float.MinValue)] + public void DivideTestSizeFloat(float dimension, float divisor) + { + SizeF size = new SizeF(dimension, dimension); + SizeF expected = new SizeF(dimension / divisor, dimension / divisor); + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(-111.111f, 222.222f, 333.333f)] + public void DivideTestSizeFloatWidthHeightDivisor(float width, float height, float divisor) + { + SizeF size = new SizeF(width, height); + SizeF expected = new SizeF(width / divisor, height / divisor); + Assert.Equal(expected, size / divisor); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Primitives.Tests/SizeTests.cs index 3eabf6221d..821cf16914 100644 --- a/tests/SixLabors.Primitives.Tests/SizeTests.cs +++ b/tests/SixLabors.Primitives.Tests/SizeTests.cs @@ -5,6 +5,7 @@ namespace SixLabors.Primitives.Tests { + using System; using System.Globalization; using Xunit; @@ -191,5 +192,184 @@ public void ToStringTestEmpty() var sz = new Size(0, 0); Assert.Equal("Size [ Empty ]", sz.ToString()); } + + [Theory] + [InlineData(1000, 0)] + [InlineData(1000, 1)] + [InlineData(1000, 2400)] + [InlineData(1000, int.MaxValue)] + [InlineData(1000, -1)] + [InlineData(1000, -2400)] + [InlineData(1000, int.MinValue)] + [InlineData(int.MaxValue, 0)] + [InlineData(int.MaxValue, 1)] + [InlineData(int.MaxValue, 2400)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, -1)] + [InlineData(int.MaxValue, -2400)] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, 0)] + [InlineData(int.MinValue, 1)] + [InlineData(int.MinValue, 2400)] + [InlineData(int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, -1)] + [InlineData(int.MinValue, -2400)] + [InlineData(int.MinValue, int.MinValue)] + public void MultiplicationTestSizeInt(int dimension, int multiplier) + { + Size sz1 = new Size(dimension, dimension); + Size mulExpected; + + unchecked + { + mulExpected = new Size(dimension * multiplier, dimension * multiplier); + } + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1000, 2000, 3000)] + public void MultiplicationTestSizeIntWidthHeightMultiplier(int width, int height, int multiplier) + { + Size sz1 = new Size(width, height); + Size mulExpected; + + unchecked + { + mulExpected = new Size(width * multiplier, height * multiplier); + } + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + + [Theory] + [InlineData(1000, 0.0f)] + [InlineData(1000, 1.0f)] + [InlineData(1000, 2400.933f)] + [InlineData(1000, float.MaxValue)] + [InlineData(1000, -1.0f)] + [InlineData(1000, -2400.933f)] + [InlineData(1000, float.MinValue)] + [InlineData(int.MaxValue, 0.0f)] + [InlineData(int.MaxValue, 1.0f)] + [InlineData(int.MaxValue, 2400.933f)] + [InlineData(int.MaxValue, float.MaxValue)] + [InlineData(int.MaxValue, -1.0f)] + [InlineData(int.MaxValue, -2400.933f)] + [InlineData(int.MaxValue, float.MinValue)] + [InlineData(int.MinValue, 0.0f)] + [InlineData(int.MinValue, 1.0f)] + [InlineData(int.MinValue, 2400.933f)] + [InlineData(int.MinValue, float.MaxValue)] + [InlineData(int.MinValue, -1.0f)] + [InlineData(int.MinValue, -2400.933f)] + [InlineData(int.MinValue, float.MinValue)] + public void MultiplicationTestSizeFloat(int dimension, float multiplier) + { + Size sz1 = new Size(dimension, dimension); + SizeF mulExpected; + + mulExpected = new SizeF(dimension * multiplier, dimension * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + [Theory] + [InlineData(1000, 2000, 30.33f)] + public void MultiplicationTestSizeFloatWidthHeightMultiplier(int width, int height, float multiplier) + { + Size sz1 = new Size(width, height); + SizeF mulExpected; + + mulExpected = new SizeF(width * multiplier, height * multiplier); + + Assert.Equal(mulExpected, sz1 * multiplier); + Assert.Equal(mulExpected, multiplier * sz1); + } + + + [Fact] + public void DivideByZeroChecks() + { + Size size = new Size(100, 100); + Assert.Throws(() => size / 0); + + SizeF expectedSizeF = new SizeF(float.PositiveInfinity, float.PositiveInfinity); + Assert.Equal(expectedSizeF, size / 0.0f); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + [InlineData(-1, 1)] + [InlineData(1, -1)] + [InlineData(-1, -1)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, 1)] + [InlineData(int.MinValue, 1)] + [InlineData(int.MaxValue, -1)] + public void DivideTestSizeInt(int dimension, int divisor) + { + Size size = new Size(dimension, dimension); + Size expected; + + expected = new Size(dimension / divisor, dimension / divisor); + + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(1111, 2222, 3333)] + public void DivideTestSizeIntWidthHeightDivisor(int width, int height, int divisor) + { + Size size = new Size(width, height); + Size expected; + + expected = new Size(width / divisor, height / divisor); + + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(0, 1.0f)] + [InlineData(1, 1.0f)] + [InlineData(-1, 1.0f)] + [InlineData(1, -1.0f)] + [InlineData(-1, -1.0f)] + [InlineData(int.MaxValue, float.MaxValue)] + [InlineData(int.MaxValue, float.MinValue)] + [InlineData(int.MinValue, float.MaxValue)] + [InlineData(int.MinValue, float.MinValue)] + [InlineData(int.MaxValue, 1.0f)] + [InlineData(int.MinValue, 1.0f)] + [InlineData(int.MaxValue, -1.0f)] + [InlineData(int.MinValue, -1.0f)] + public void DivideTestSizeFloat(int dimension, float divisor) + { + SizeF size = new SizeF(dimension, dimension); + SizeF expected; + + expected = new SizeF(dimension / divisor, dimension / divisor); + Assert.Equal(expected, size / divisor); + } + + [Theory] + [InlineData(1111, 2222, -333.33f)] + public void DivideTestSizeFloatWidthHeightDivisor(int width, int height, float divisor) + { + SizeF size = new SizeF(width, height); + SizeF expected; + + expected = new SizeF(width / divisor, height / divisor); + Assert.Equal(expected, size / divisor); + } } } \ No newline at end of file From 29ca4195ec4da6853446da6735be85f9cdae5598 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 18:01:47 +0100 Subject: [PATCH 009/136] [SL.Core] remove opencover --- tests/CodeCoverage/.gitignore | 2 +- .../OpenCover.4.6.519/License.rtf | 166 --- .../MSBuild/OpenCover.MSBuild.dll | Bin 10240 -> 0 bytes .../MSBuild/OpenCover.targets | 10 - .../SampleSln/.nuget/packages.config | 6 - .../SampleSln/Bom/Bom.csproj | 53 - .../SampleSln/Bom/BomManager.cs | 17 - .../SampleSln/Bom/Properties/AssemblyInfo.cs | 36 - .../OpenCover.4.6.519/SampleSln/BomSample.sln | 31 - .../SampleSln/BomTest/BomManagerTests.cs | 39 - .../SampleSln/BomTest/BomTest.csproj | 65 - .../BomTest/Properties/AssemblyInfo.cs | 36 - .../SampleSln/BomTest/packages.config | 4 - .../OpenCover.4.6.519/SampleSln/coverage.bat | 5 - .../OpenCover.4.6.519/docs/ReleaseNotes.txt | 137 -- .../OpenCover.4.6.519/docs/Usage.rtf | 1138 ----------------- .../CodeCoverage/OpenCover.4.6.519/readme.txt | 21 - .../tools/Autofac.Configuration.dll | Bin 40448 -> 0 bytes .../OpenCover.4.6.519/tools/Autofac.dll | Bin 203264 -> 0 bytes .../tools/CrashReporter.NET.dll | Bin 109056 -> 0 bytes .../tools/Gendarme.Framework.dll | Bin 84992 -> 0 bytes .../tools/Gendarme.Rules.Maintainability.dll | Bin 36352 -> 0 bytes .../tools/Mono.Cecil.Mdb.dll | Bin 45056 -> 0 bytes .../tools/Mono.Cecil.Pdb.dll | Bin 81920 -> 0 bytes .../OpenCover.4.6.519/tools/Mono.Cecil.dll | Bin 280576 -> 0 bytes .../tools/OpenCover.Console.exe | Bin 80384 -> 0 bytes .../tools/OpenCover.Console.exe.config | 26 - .../tools/OpenCover.Extensions.dll | Bin 11264 -> 0 bytes .../tools/OpenCover.Framework.dll | Bin 151040 -> 0 bytes .../OpenCover.4.6.519/tools/log4net.config | 39 - .../OpenCover.4.6.519/tools/log4net.dll | Bin 301056 -> 0 bytes .../transform/simple_report.xslt | 332 ----- .../OpenCover.4.6.519/transform/transform.ps1 | 17 - 33 files changed, 1 insertion(+), 2179 deletions(-) delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/License.rtf delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/readme.txt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Framework.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Gendarme.Rules.Maintainability.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Mdb.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.Pdb.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt delete mode 100644 tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore index 861c19344e..6a14856d0a 100644 --- a/tests/CodeCoverage/.gitignore +++ b/tests/CodeCoverage/.gitignore @@ -1 +1 @@ -/OpenCover.4.6.519 +/OpenCover* \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf b/tests/CodeCoverage/OpenCover.4.6.519/License.rtf deleted file mode 100644 index 0916f4d611..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/License.rtf +++ /dev/null @@ -1,166 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;} -{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} -{\f382\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f387\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} -{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f417\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp -\f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive -\ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* -\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused Normal Table;}} -{\*\rsidtbl \rsid11275983\rsid14818796\rsid15367925\rsid16724145}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun} -{\creatim\yr2012\mo1\dy5\hr7\min52}{\revtim\yr2012\mo2\dy21\hr8\min10}{\version3}{\edmins2}{\nofpages1}{\nofwords157}{\nofchars900}{\*\company Microsoft}{\nofcharsws1055}{\vern49273}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/word -ml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen -\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale60\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot15367925\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14818796 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Copyright (c) 2011}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16724145 -2012}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14818796 Shaun Wilde -\par 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 fu -rnished to do so, subject to the following conditions: -\par The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -\par THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF -CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11275983 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 -fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 -ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae -a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 -399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 -4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 -0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b -c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 -689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 -5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 -aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d -316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 -545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a -c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 -0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 -8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 -d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 -1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f -bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 -a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a -0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 -0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 -00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; -\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; -\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; -\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 -4d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e5000000000000000000000000e00b -b50e14f0cc01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 -0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.MSBuild.dll deleted file mode 100644 index 4e5b94aaf085b8bf29f639361809f7216d39d51e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10240 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 T?}OP1_r=xp|DOL3_Q3xDcd->A diff --git a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets b/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets deleted file mode 100644 index caf2b79ba3..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/MSBuild/OpenCover.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - $(MSBuildExtensionsPath32)\OpenCover - $(OpenCoverMSBuildTasksPath)\OpenCover.MSBuild.dll - - - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config deleted file mode 100644 index cfe9c46fbe..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/.nuget/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj deleted file mode 100644 index 400bb251a4..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Bom.csproj +++ /dev/null @@ -1,53 +0,0 @@ - - - - - Debug - AnyCPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} - Library - Properties - Bom - Bom - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs deleted file mode 100644 index ad91490d39..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/BomManager.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Bom -{ - public class BomManager - { - public int MethodToTest(IEnumerable collection) - { - return (collection ?? new int[0]).Sum(); - } - } -} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs deleted file mode 100644 index cc769d0e45..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/Bom/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Bom")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Bom")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("2b4e3956-c04a-42f8-a367-87bc16ffa08d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln deleted file mode 100644 index f5edc5b2d8..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomSample.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bom", "Bom\Bom.csproj", "{0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BomTest", "BomTest\BomTest.csproj", "{E25E828A-5D71-4E95-AEBC-7AD21315DFEC}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".nuget", ".nuget", "{A3CD3B1D-4C14-4A8C-A57F-A265BC49FB29}" - ProjectSection(SolutionItems) = preProject - .nuget\packages.config = .nuget\packages.config - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605}.Release|Any CPU.Build.0 = Release|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs deleted file mode 100644 index 486e2b3897..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomManagerTests.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Bom; -using NUnit.Framework; - -namespace BomTest -{ - [TestFixture] - public class BomManagerTests - { - [Test] - public void Sum_Is_Zero_When_No_Entries() - { - var bomManager = new BomManager(); - Assert.AreEqual(0, bomManager.MethodToTest(new Collection())); - } - - [Test] - [TestCase(new[] { 0 }, 0)] - [TestCase(new[] { 1 }, 1)] - [TestCase(new[] { 1, 2, 3 }, 6)] - public void Sum_Is_Calculated_Correctly_When_Entries_Supplied(int[] data, int expected) - { - var bomManager = new BomManager(); - Assert.AreEqual(expected, bomManager.MethodToTest(new Collection(data))); - } - - [Test] - public void Sum_Is_Zero_When_Null_Collection() - { - var bomManager = new BomManager(); - Assert.AreEqual(0, bomManager.MethodToTest(null)); - } - } -} diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj deleted file mode 100644 index 4942e9f288..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/BomTest.csproj +++ /dev/null @@ -1,65 +0,0 @@ - - - - - Debug - AnyCPU - {E25E828A-5D71-4E95-AEBC-7AD21315DFEC} - Library - Properties - BomTest - BomTest - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\NUnit.2.6.4\lib\nunit.framework.dll - - - - - - - - - - - - - - - - - - - {0C1E1E72-A92D-4B64-83B1-FEF1D05B8605} - Bom - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs deleted file mode 100644 index 60d4b26d9a..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("BomTest")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("BomTest")] -[assembly: AssemblyCopyright("Copyright © 2014")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("688e9792-727d-4e39-a0ae-93461aa13b49")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config deleted file mode 100644 index c714ef3a23..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/BomTest/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat b/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat deleted file mode 100644 index 02415f7e30..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/SampleSln/coverage.bat +++ /dev/null @@ -1,5 +0,0 @@ -.\packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -register:user "-filter:+[Bom]* -[*Test]*" "-target:.\packages\NUnit.Runners.2.6.4\tools\nunit-console-x86.exe" "-targetargs:/noshadow .\BomTest\bin\Debug\BomTest.dll" - -.\packages\ReportGenerator.2.1.8.0\tools\ReportGenerator.exe "-reports:results.xml" "-targetdir:.\coverage" - -pause \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt b/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt deleted file mode 100644 index cc71c4a16e..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/docs/ReleaseNotes.txt +++ /dev/null @@ -1,137 +0,0 @@ -Version 4.6.519 -#528 -safemode:on to address incomplete coverage due to thread based buffers (feature) -#521 add exclude paths (feature) -#376 protect buffer allocation in multithreaded environment (fix) -#335 allow short wait timeout to be configured (feature) -#310 improved reporting - hide branches due to iterators (feature) -#352 improved reporting - hide branches due to async (feature) -#363 calculate npath comlexity (feature) -#282 exclude by process (feature) -#246 auto crash reports (feature) -#329 address ArgumentOutOfRangeException (potentially related to #274) (fix for VS2015) -#335 error on unrecognized arguments/prefixes (fix) -#328 exclude types when declaredtype is excluded (fix-feature) -#302 ignore branches in known autogenerated sequences (feature) - -Version 4.6.166 -#323 push releases and candidates to github via appveyor (prj-mgmt) -#315 update nuget package (fix for VS2015) -#320 update packages (fix for VS2015) -#304 add switch to control timeout wait (feature) -#307 add -version to args (feature) -#305 add corclr_profiler_path support (feature) -#303 support for test cases and theories during track by test (feature) -#295 exclude assembly by attribute (feature) -#288 report (to console) if can't ready body of method (diag) -#287 fix crash (fix) -#283 Add visited class/method to summary entity (feature) -#274 Use thread based buffers for performance improvement (fix) - -Version 4.5.3723 -#244 support ApplicationUnderTest.Launch to propagate required OPENCOVER environment variables (feature) -#256 support Microsoft Fakes (feature) - beta support until we bed feature in (feature) -#248 address issue with Mono.Cecil and latest PDB (.NET 4.6) version (fix) -#252 use AppVeyor for building code and pull requests (prj-mgmt) - -Version 4.5.3522 -#243 null reference exception when excluding branch point in using finally block (fix) - -Version 4.5.3427 -#234 improved IIS support (fix) -#237 handle multiple files for a method e.g. during code contract re-writes (fix) -#228 add MDB support (feature) -#226 remove branch points on methods without sequence points (fix) -#225 Enable filters to use regular expressions (feature) -#218 Auto tag release notes (prj-mgmt) -#116 output results to accumulate with previous coverage file activate by -mergeoutput (feature) - -Version 4.5.3207 -#209 The number of WaitHandles must be less than or equal to 64 (fix) -#208 Line Number for Branch Points (feature) -#207 "using" statement causes incorrect Branch Coverage (fix) -#201 NETWORK SERVICE support (feature) - -Version 4.5.2506 -#188 Bring back COR_PRF_DISABLE_ALL_NGEN_IMAGES -#190 Compiler generated "Empty" Branch Points feature high close on next release -#191 SequencePoint FileID [CodeContractClass/For] - -Version 4.5.2316 -#170 - Overflow fixed -#188 - re-introduced COR_PRF_DISABLE_ALL_NGEN_IMAGES -#174 / #176 - pass arguments as multiple variable - -Version 4.5.1923 -#168 - skip auto implemented properties -#164 - allow registryless loading -#163 - improved error messages - -Version 4.5.1604 -#156 - prepend targetdir when applying test strategies (silverlight) - -Version 4.5.1528 -#158 - fix app domain crash due to timeout of proxy - -Version 4.5.1403 -#154 - Add xUnit to the list of supported strategies for the Cover by Test feature -#150 - fix for Xslt issue -Build Environment now uses BDD tests to ensure the packages have all assemblies required to run - -Version 4.5.1314 -#148 - Fix issue with nuget and zip packages and missing Autofac assembly. - -Version 4.5.1313 -#118 - Fix communication issue between profiler and host when many processes are vying for the channel - - improved thread management - - only check if method needs tracing if coverbytest option is utilised - -Version 4.5.1310 -#128 - Add threshold limits (optional commandline) to reduce reporting of visits -#135 - Add performance counters (admin privileges required) around the memory processing queues - -Version 4.5.1302 -Update version number to reflect 4.5 support -Fix bug in summaries - -Version 4.0.1229 -Supports .NET 4.5 (not windows store apps) -#120 - Built in Summary Reports - useful for build systems - -Version 4.0.1128 -#125 - Hide compiler generated method when no source remains after skipping -#107 - fix 'sporadic' crash when dealing with Generic methods. - -Version 4.0.1118 -#137 - Fix instrumentation issue when dealing with typed clauses -#107 - fix 'sporadic' crash when dealing with Generic methods. - -Version 4.0.1107 -#133 - Remove skipped File/Module/Class/Methods from report -#130 - Support for 'returntargetcode' switch in msbuild task -#126, #127, #132 - ReportGenerator upgrades -#122 - filter from file instead of command line list option (#123 patch) - -Version 4.0.804 -#117 - fix filter crash with anonymous types -#110 - fix timeout issues due to performance woes in dealing with large number of types/methods - -Version 4.0.724 -#94 - remove thread that "may" have been the cause of the nunit-agent.exe closedown issue - switched to a shared memory buffer per child process/profiler object instantiated -#108 - merge pull request - ToolPath property for MSBuild command - -Version 4.0.519 -#102 - add msbuild parts to zip and nuget package -#99 - exclude anonymous functions if containing method is excluded -#97 - fix crash based on receiving corrupt data (sequence point with id==0) -#88 - only use COR_PRF_DISABLE_TRANSPARENCY_CHECKS_UNDER_FULL_TRUST if oldStyle instrumentation - -Version 4.0.408 -#83 - build a zip package -#88 - provide a switch for "old school" instrumentation -#95 - fix for namespaces with spaces - -Version 4.0.301.10 -#78 - fix for endfault/endfinally -#71 - detect disabled service - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf b/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf deleted file mode 100644 index a078a647e0..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/docs/Usage.rtf +++ /dev/null @@ -1,1138 +0,0 @@ -{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch0\stshfloch31506\stshfhich31506\stshfbi31506\deflang3081\deflangfe3081\themelang3081\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;} -{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} -{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\f39\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\f40\fbidi \fmodern\fcharset0\fprq1{\*\panose 020b0609020204030204}Consolas;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} -{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} -{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} -{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f42\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\f44\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f45\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f46\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f47\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\f48\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f49\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f61\fbidi \fmodern\fcharset238\fprq1 Courier New CE;}{\f62\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;} -{\f64\fbidi \fmodern\fcharset161\fprq1 Courier New Greek;}{\f65\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f66\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f67\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} -{\f68\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f69\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f81\fbidi \fswiss\fcharset238\fprq2 Helvetica CE;}{\f82\fbidi \fswiss\fcharset204\fprq2 Helvetica Cyr;} -{\f84\fbidi \fswiss\fcharset161\fprq2 Helvetica Greek;}{\f85\fbidi \fswiss\fcharset162\fprq2 Helvetica Tur;}{\f86\fbidi \fswiss\fcharset177\fprq2 Helvetica (Hebrew);}{\f87\fbidi \fswiss\fcharset178\fprq2 Helvetica (Arabic);} -{\f88\fbidi \fswiss\fcharset186\fprq2 Helvetica Baltic;}{\f89\fbidi \fswiss\fcharset163\fprq2 Helvetica (Vietnamese);}{\f381\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f382\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;} -{\f384\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f385\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f388\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f389\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);} -{\f411\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f412\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f414\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f415\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\f418\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\f419\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\f431\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\f432\fbidi \froman\fcharset204\fprq2 Cambria Cyr;} -{\f434\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\f435\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\f438\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\f439\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);} -{\f441\fbidi \fmodern\fcharset238\fprq1 Consolas CE;}{\f442\fbidi \fmodern\fcharset204\fprq1 Consolas Cyr;}{\f444\fbidi \fmodern\fcharset161\fprq1 Consolas Greek;}{\f445\fbidi \fmodern\fcharset162\fprq1 Consolas Tur;} -{\f448\fbidi \fmodern\fcharset186\fprq1 Consolas Baltic;}{\f449\fbidi \fmodern\fcharset163\fprq1 Consolas (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} -{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fhimajor\f31536\fbidi \froman\fcharset163\fprq2 Cambria (Vietnamese);}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} -{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} -{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} -{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} -{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} -{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;} -{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} -{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} -{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} -{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} -{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0; -\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192; -\caccentone\ctint255\cshade191\red54\green95\blue145;\caccentone\ctint255\cshade255\red79\green129\blue189;\ctexttwo\ctint255\cshade191\red23\green54\blue93;\cfollowedhyperlink\ctint255\cshade255\red128\green0\blue128; -\ctextone\ctint255\cshade255\red0\green0\blue0;\red51\green51\blue51;\red43\green145\blue175;\cbackgroundone\ctint255\cshade191\red191\green191\blue191;}{\*\defchp \f31506\fs22\lang3081\langfe1033\langfenp1033 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\s1\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af0\afs28\alang1025 \ltrch\fcs0 \b\fs28\cf17\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink15 \sqformat \spriority9 \styrsid13184707 heading 1;}{\s2\ql \li0\ri0\sb200\sl276\slmult1 -\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 \b\fs26\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext0 \slink16 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 2;}{\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0 \rtlch\fcs1 -\ab\af0\afs22\alang1025 \ltrch\fcs0 \b\fs22\cf18\lang3081\langfe1033\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink17 \sunhideused \sqformat \spriority9 \styrsid12068581 heading 3;}{\*\cs10 \additive -\sunhideused \spriority1 Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31506\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \snext11 \ssemihidden \sunhideused -Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \ab\af0\afs28 \ltrch\fcs0 \b\fs28\cf17\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink1 \slocked \spriority9 \styrsid13184707 Heading 1 Char;}{\*\cs16 \additive \rtlch\fcs1 \ab\af0\afs26 \ltrch\fcs0 -\b\fs26\cf18\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink2 \slocked \spriority9 \styrsid12068581 Heading 2 Char;}{\*\cs17 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf18\loch\f31502\hich\af31502\dbch\af31501 -\sbasedon10 \slink3 \slocked \spriority9 \styrsid12068581 Heading 3 Char;}{\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 -\b\fs28\cf17\lang1033\langfe1041\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 \sbasedon1 \snext0 \ssemihidden \sunhideused \sqformat \spriority39 \styrsid7372180 TOC Heading;}{\*\cs19 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 -\sbasedon10 \sunhideused \styrsid8939988 Hyperlink;}{\s20\ql \li0\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 1;}{\s21\ql \li220\ri0\sa100\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 -toc 2;}{\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext0 \sautoupd \sunhideused \spriority39 \styrsid7372180 toc 3;}{\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\contextualspace \rtlch\fcs1 -\af0\afs52\alang1025 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\f31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sbasedon0 \snext0 \slink24 \sqformat \spriority10 \styrsid7372180 Title;}{\*\cs24 \additive -\rtlch\fcs1 \af0\afs52 \ltrch\fcs0 \fs52\expnd1\expndtw5\cf19\kerning28\loch\f31502\hich\af31502\dbch\af31501 \sbasedon10 \slink23 \slocked \spriority10 \styrsid7372180 Title Char;}{\s25\ql \li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -\sbasedon0 \snext25 \sqformat \spriority34 \styrsid6453762 List Paragraph;}{\s26\ql \li0\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 -\fs24\lang3081\langfe3081\cgrid\langnp3081\langfenp3081 \sbasedon0 \snext26 \ssemihidden \sunhideused \styrsid11687369 Normal (Web);}{\*\cs27 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \sbasedon10 \spriority0 \styrsid11687369 apple-converted-space;}{\* -\ts28\tsrowd\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv -\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af37\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 \sbasedon11 \snext28 \spriority59 \styrsid5114927 -Table Grid;}{\*\cs29 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf20 \sbasedon10 \styrsid11032164 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid740077246\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid382339409}{\list\listtemplateid1903328102\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360 -\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext -\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417 -\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;} -\f2\fbias0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 -\fi-360\li4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916417\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\lin5040 } -{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916419\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916421\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0 \fi-360\li6480\lin6480 }{\listname ;}\listid401637325}{\list\listtemplateid508579338 -\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916433\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel -\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2 -\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0 -\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid405616751}{\list\listtemplateid1306685724\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0 -\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0 -\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1 -\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative -\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 -\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid484125747}{\list\listtemplateid1826631064{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1 -\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 -{\leveltext\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers -\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 -\ltrch\fcs0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li4320 -\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\jclisttab\tx5040\lin5040 } -{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid723678808} -{\list\listtemplateid-842228772\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid-1138174080\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li6840\lin6840 }{\listname ;}\listid950892184}{\list\listtemplateid-1038568524\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;} -\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li2880\lin2880 } -{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3600\lin3600 }{\listlevel -\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4320\lin4320 }{\listlevel\levelnfc0 -\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4 -\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2 -\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace360\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6480\lin6480 }{\listname ;}\listid1199853486} -{\list\listtemplateid-1235995406\listhybrid{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid201916439\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 -\fi-360\li720\lin720 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li1440\lin1440 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li2160\lin2160 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li2880\lin2880 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li3600\lin3600 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li4320\lin4320 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5040\lin5040 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-360\li5760\lin5760 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 -\fi-180\li6480\lin6480 }{\listname ;}\listid1997226378}{\list\listtemplateid-2031863006\listhybrid{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid1313997542 -\'02\'00);}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fbias0 \fi-360\li1080\lin1080 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'01.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li1800\lin1800 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'02.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li2520\lin2520 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'03.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3240\lin3240 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'04.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li3960\lin3960 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'05.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li4680\lin4680 }{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916431 -\'02\'06.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li5400\lin5400 }{\listlevel\levelnfc4\levelnfcn4\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916441 -\'02\'07.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-360\li6120\lin6120 }{\listlevel\levelnfc2\levelnfcn2\leveljc2\leveljcn2\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid201916443 -\'02\'08.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \fi-180\li6840\lin6840 }{\listname ;}\listid2120176231}}{\*\listoverridetable{\listoverride\listid405616751\listoverridecount0\ls1}{\listoverride\listid2120176231\listoverridecount0\ls2} -{\listoverride\listid950892184\listoverridecount0\ls3}{\listoverride\listid484125747\listoverridecount0\ls4}{\listoverride\listid1997226378\listoverridecount0\ls5}{\listoverride\listid723678808\listoverridecount0\ls6}{\listoverride\listid1199853486 -\listoverridecount0\ls7}{\listoverride\listid382339409\listoverridecount0\ls8}{\listoverride\listid401637325\listoverridecount0\ls9}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}} -{\*\rsidtbl \rsid97460\rsid221265\rsid284426\rsid537180\rsid664540\rsid735477\rsid735614\rsid738226\rsid879886\rsid935281\rsid1070110\rsid1510934\rsid1583585\rsid1586953\rsid1598011\rsid1775295\rsid1841268\rsid1903893\rsid1926955\rsid1967093\rsid2060806 -\rsid2177067\rsid2243939\rsid2312332\rsid2783484\rsid2827362\rsid2846494\rsid2890017\rsid2959880\rsid2981254\rsid3290111\rsid3490457\rsid3741585\rsid3829756\rsid4010500\rsid4327818\rsid4477453\rsid4484449\rsid4522593\rsid4545630\rsid5050788\rsid5114927 -\rsid5794820\rsid5921453\rsid6438937\rsid6453762\rsid6518571\rsid6886783\rsid7160127\rsid7237901\rsid7289096\rsid7292194\rsid7372180\rsid7816154\rsid8091909\rsid8145172\rsid8329235\rsid8339308\rsid8475156\rsid8479050\rsid8651410\rsid8728997\rsid8847473 -\rsid8852142\rsid8939988\rsid9049101\rsid9068514\rsid9132688\rsid9137041\rsid9332253\rsid9639182\rsid9639869\rsid10224112\rsid10314410\rsid10845574\rsid11032164\rsid11212548\rsid11687369\rsid11802269\rsid12024666\rsid12060006\rsid12068581\rsid12129336 -\rsid12348517\rsid12584760\rsid13184707\rsid13261933\rsid13513498\rsid13586263\rsid13596290\rsid13722641\rsid13847658\rsid14041828\rsid14097242\rsid14228117\rsid14243083\rsid14371182\rsid14497238\rsid14513928\rsid14565649\rsid14684873\rsid14885541 -\rsid15205038\rsid15221525\rsid15280621\rsid15795287\rsid15819295\rsid15938139\rsid16071677\rsid16142742\rsid16259852\rsid16349201\rsid16469695\rsid16712264}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1 -\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\author Shaun}{\operator Shaun Wilde}{\creatim\yr2012\mo1\dy3\hr1\min4}{\revtim\yr2016\mo1\dy31\hr14\min3}{\printim\yr2016\mo1\dy31\hr14\min2}{\version61}{\edmins4613}{\nofpages11}{\nofwords3439}{\nofchars19608} -{\*\company Microsoft}{\nofcharsws23001}{\vern57439}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}}\paperw11906\paperh16838\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect -\widowctrl\ftnbj\aenddoc\hyphhotz425\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1 -\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1440\dgvorigin1440\dghshow1\dgvshow1 -\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct -\asianbrkrule\rsidroot284426\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 -{\*\wgrffmtfilter 2450}\nofeaturethrottle1\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 -\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 -\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang -{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\s23\ql \li0\ri0\sa300\widctlpar\brdrb\brdrs\brdrw20\brsp80\brdrcf18 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180\contextualspace \rtlch\fcs1 \af0\afs52\alang1025 \ltrch\fcs0 -\fs52\expnd1\expndtw5\cf19\lang3081\langfe1033\kerning28\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13184707 \hich\af31502\dbch\af31501\loch\f31502 OpenCover Usage Guide}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 {\*\bkmkstart _Toc442012125}\hich\af31502\dbch\af31501\loch\f31502 Intro{\*\bkmkend _Toc442012125} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 The following guide describes how to use }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 HYPERLINK "https://github.com/OpenCover/opencover"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11032164 -{\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b66000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f004f00700065006e0043006f007600650072002f006f00700065006e0063006f007600650072000000795881f4 -3b1d7f48af2c825dc485276300000000a5ab000000000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 OpenCover}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 HYPERLINK "http://nuget.org/packages/OpenCover/" }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6200000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f004f00700065006e0043006f007600650072002f000000795881f43b1d7f48 -af2c825dc485276300000000a5ab0000004500000000ff00ffe65b0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid221265\charrsid221265 NUGET}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid221265 ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 to gather coverage statistics of your application. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls5\adjustright\rin0\lin720\itap0\pararsid879886\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid879886 C}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 an handle 32 and 64 bit .NET processes running on the .NET 2 and .NET 4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 +}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 frameworks. }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid879886 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 b)\tab}W}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 ill gather sequence and branch coverage informatio -n of your assemblies that match the filters and for which the PDB files can be found.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 c)\tab}Can gather coverage reports of Silverlight applications -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 d)\tab}Can gather coverage reports of Windows Service applications. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid879886 \hich\af31506\dbch\af0\loch\f31506 e)\tab}Can record which tests where executing at a particular time when a coverage point was visited \endash - only MSTest and NUnit supported (requests accepted for others).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1775295 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 Currently OpenCover has no }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid735477 full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 presentation of results other than the XML output file; }{\field{\*\fldinst { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 HYPERLINK "http://www.palmmedia.de/Net/ReportGenerator" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7000000068007400740070003a002f002f007700770077002e00700061006c006d006d0065006400690061002e00640065002f004e00650074002f005200650070006f0072007400470065006e006500720061007400 -6f0072000000795881f43b1d7f48af2c825dc485276300000000a5ab00006c0000000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 ReportGenerator}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 (also available on }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 - HYPERLINK "http://nuget.org/packages/ReportGenerator/" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6e00000068007400740070003a002f002f006e0075006700650074002e006f00720067002f007000610063006b0061006700650073002f005200650070006f0072007400470065006e0065007200610074006f007200 -2f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000005600000000ff00ff00000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid879886\charrsid879886 NUGET}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid879886 )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 is currently the recommended tool for visualizing the results. -\par NOTE: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 When there is n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 o PDB for an assembly then no coverage data will be gathered; this is different to }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid879886 HYPERLINK "https://github.com/sawilde/partcover.net4" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0073006100770069006c00640065002f00700061007200740063006f007600650072002e006e00650074003400 -0000795881f43b1d7f48af2c825dc485276300000000a5ab0000da0000000000ff00ff1f000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid1775295\charrsid879886 PartCover}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 which will default to IL coverage under this situation but it - was considered as not required as this is supposed to be a code-coverage tool which can relate such coverage to }{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\i\insrsid1775295\charrsid4484449 your}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 code. -\par }\pard\plain \ltrpar\s18\ql \li0\ri0\sb480\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs28\alang1025 \ltrch\fcs0 -\b\fs28\cf17\lang1033\langfe1041\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp1033\langfenp1041 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 \hich\af31502\dbch\af31501\loch\f31502 Table of Contents -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 TOC \\o "1-3" \\h \\z \\u }}{\fldrslt {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012125"}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -{\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Intro}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 -\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012125 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 1}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012126"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Command Arguments}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012126 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012127"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Mandatory}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012127 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320037000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012128"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012128 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 2}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012129"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Handling Spaces}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012129 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100320039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 5}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012130"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Understanding Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012130 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330030000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012131"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012131 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330031000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012132"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Regular Expressions in Filters}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012132 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012133"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012133 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330033000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 6}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012134"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against IIS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012134 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330034000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012135"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Running against an application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -\tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012135 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012136"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012136 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330036000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012137"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against a Silverlight application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012137 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 7}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012138"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012138 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330038000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012139"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Running against a Service application}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012139 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100330039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012140"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Sample}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF -_Toc442012140 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340030000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012141"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludeb\hich\af31506\dbch\af31501\loch\f31506 -yattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012141 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012142"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\i\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 -excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 -\af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012142 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 8}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012143"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Shimming support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012143 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012144"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Microsoft Moles support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012144 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340034000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012145"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 Microsoft Fakes support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012145 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012146"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 TypeMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012146 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340036000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012147"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 JustMock support}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012147 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340037000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012148"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Build system integration}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 - PAGEREF _Toc442012148 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340038000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 9}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012149"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 all-users (32-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 -PAGEREF _Toc442012149 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100340039000000}}}{\fldrslt { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012150"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 all-users (64-bit)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012150 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350030000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012151"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 single-user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab } -{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012151 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350031000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s21\ql \li220\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin220\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012152"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 R\hich\af31506\dbch\af31501\loch\f31506 eporting}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012152 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350032000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012153"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 FAQ}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst { -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012153 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350033000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s22\ql \li440\ri0\sa100\sl276\slmult1\widctlpar\tqr\tldot\tx9016\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin440\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 -\f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012154"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 -\hich\af31506\dbch\af31501\loch\f31506 Why do I have no results?}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012154 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield -08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350034000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid16712264 10}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 -\lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\insrsid664540 HYPERLINK \\l "_Toc442012155"}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 }{\rtlch\fcs1 \af0 -\ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 -\af0 \ltrch\fcs0 \cs19\ul\cf2\lang1024\langfe1024\dbch\af31501\noproof\insrsid664540\charrsid16737848 \hich\af31506\dbch\af31501\loch\f31506 All my tests are failing and I am getting MissingMethodException}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 \tab }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\webhidden\insrsid664540 PAGEREF _Toc442012155 \\h }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid664540 {\*\datafield 08d0c9ea79f9bace118c8200aa004ba90b02000000080000000e0000005f0054006f0063003400340032003000310032003100350035000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 -\lang1024\langfe1024\noproof\webhidden\insrsid16712264 11}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj }}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\dbch\af31505\noproof\langfenp3081\insrsid664540 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 }}\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1 -\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12129336 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 -{\*\bkmkstart _Toc442012126}\hich\af31502\dbch\af31501\loch\f31502 Command Arguments{\*\bkmkend _Toc442012126} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988 OpenCover has a number of arguments that can be used to control the code coverage gathering. If an argument requires s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8939988\charrsid8939988 paces}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid8939988\charrsid8939988 then use "}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8939988 \rquote s to wrap the argument, where they are applicable they will be indicated with an optional syntax [].}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid4484449 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12068581 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012127}\hich\af31502\dbch\af31501\loch\f31502 Mandatory{\*\bkmkend _Toc442012127} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 ["]-target:<}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 target application}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8939988\charrsid5050788 >["] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid16349201 -The name of the target application or service that will be started; this can also be a path to the target application. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 Alternatively use }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid8728997\charrsid5050788 -?}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 to show command line help, or }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2060806\charrsid2060806 -version}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2060806 - to print the current version and exit.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8728997 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8728997 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 {\*\bkmkstart _Toc442012128}\hich\af31502\dbch\af31501\loch\f31502 Optional}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid8939988 {\*\bkmkend _Toc442012128} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16349201 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid16349201\charrsid5050788 ["]-targetdir:["] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16349201 -The path to the target directory; if the target argument already contains a path then this argument can be used to provide an alternate path wh}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 ere PDB files may be found. }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid16349201 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8728997\charrsid5050788 -targetargs:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8728997 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Arguments to be passed to the target process.}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1841268 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 [\'93]-searchdirs:[;[\'93] - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 \tab Additional locations to check for PDB files.\page -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 -register[:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid9639182 |path32|path64}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid5050788 ] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid9639182 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Use this switch to register and d -e-register the code coverage profiler. Alternatively use the optional }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8728997\charrsid9639182 user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 - argument to do per-user registration where the user account does not have administrative permissions. }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 -\par If access to registry is limited then try the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 path64}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid9639182 , depending on your application (32- or 64-bit), to use an alternate method to load the profiler; unfortunately you cannot profile 32- and 64-bit processes at the same time using these switches.}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid9639182\charrsid9639182 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8728997 Alternatively use an administrative account to register the profi}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 lers using t -he regsvr32 utility; this is the recommended option when running on a build server especially if \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9639182\charrsid9639182 \endash register:user}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639182 does not work. - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid13513498 -returntargetcode[:] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953\charrsid2783484 -Return the target process return code instead of the OpenCover console return code. Use the offset to return the OpenCover console at a value outside the range returned by the target process. }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid1586953\charrsid1586953 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid15205038 -safemode:on|off|yes|no -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Use this switch to disable safe mode (default is }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \b\insrsid15205038\charrsid15205038 on}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 /yes). When in safe mode the profiler will use a common buffer for all threads which may have performance impacts if you code or tests use threads he -avily. When safe mode is disabled, there may on occasions be some data loss if the runtime closes the application under profile before the profiler has been able to retrieve the visit count data. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid5050788\charrsid13513498 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5050788\charrsid13513498 ["]}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12068581\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5050788 -The location and name of the output xml file. If no value is supplied then the current directory will be used and the outpu}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 t filename will be results.xml.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid1586953\charrsid2312332 -threshold: -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid1586953 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 -Limits the number of visit counts recorded/reported for an instrumentation point. May have some performance gains as it can reduce the number of messages sent fr -om the profiler. Coverage results should not be affected but will have an obvious impact on the Visit Counts reported.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 -\par -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["]}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid664540\charrsid13513498 -filter:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 ["] -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 A list of filters to apply to selectively include or -exclude assemblies and classes from coverage results. Filters have their own form}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid9332253 at }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540 \'b1[module}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\b\insrsid664540\charrsid9332253 -filter]class-filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 . If no filter(s) are supplied then a default include all filter is applied +[*]*. As can be seen you can use an * as a wildcard. -\par -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid664540\charrsid13261933 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 : Also an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 exclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (-) -filter takes precedence over an }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13261933 inclusion}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid13261933 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 (+) filter.}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9639869 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid9639869\charrsid9639869 -regex -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 \tab -\par \tab Filters are supplied using regular expressions rather than wildcards. -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid1586953 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid9639869 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14243083\charrsid13513498 -nodefaultfilters -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 A list of default exclusion filters are usually applied}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid10314410\charrsid2783484 , this option can be used to turn them off. The default filters are:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14243083\charrsid2783484 -\par }\pard \ltrpar\ql \li1440\ri0\widctlpar\wrapdefault\faauto\rin0\lin1440\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -[mscorlib]* -\par -[mscorlib.*]* -\par -[System]* -\par -[System.*]* -\par -[Microsoft.VisualBasic]* -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid13513498 -mergebyhash -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10314410\charrsid2783484 -Under some scenarios e.g. using MSTest, an assembly may be loaded many times from different locations. This option is used to merge the coverage results for an assembly regardless of where it was loaded as -suming the assembly has the same file-hash in each location. -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 -skipautoprops}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10314410\charrsid2846494 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 -\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid2846494 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2846494 Neither track nor record Auto-Implemented properties. -\par -\par i.e. skip getters and setters like these -\par -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 public}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 bool}{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 Service \{ }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 get}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; }{ -\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf2\highlight8\insrsid2846494 set}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\highlight8\insrsid2846494 ; \}}{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid2846494 -\par }{\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\cf1\insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid13513498 -showunvisited -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid664540 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid2783484 Show a list of unvisited methods and classes after the coverage run is finished}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid664540 and the results are presented.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15205038 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540\charrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid15205038\charrsid9639182 [\'93]-}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid15205038 excludeddirs:[;[\'93 -] -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid15205038 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid15205038 Any assembly found in an excluded folder (or its children) will be ignored, regardless of any inclusive -filter matches.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2846494 -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid9332253 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14228117\charrsid2783484 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyattribute:[;][;]} -{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2783484\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 -Exclude a class or method by filter(s) that match attributes that have been applied that have been applied.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid4327818 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid10845574\charrsid13513498 -excludebyfile:[;][;] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid4327818 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid10845574 Exclude a class (or methods) by filter(s)}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid13513498 that match the filenames.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 An * can be used as a wildcard.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid664540 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid664540 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid664540 \page -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 -hideskipped:}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid3490457\charrsid15280621 File|Filter|Attribute|MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 -MissingPdb }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540\charrsid664540 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid664540 Excl -udedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457\charrsid15280621 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 [}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3490457 {\*\bkmkstart OLE_LINK1}{\*\bkmkstart OLE_LINK2};}{ -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 File|}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid15280621 Filter}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |Attribute}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid15280621\charrsid15280621 |MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494 |}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid2846494 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2846494\charrsid15280621 MissingPdb }{ -\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 |All}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15205038 {\*\bkmkend OLE_LINK1}{\*\bkmkend OLE_LINK2}|ExcludedFolder}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid15280621 ] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12060006 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 Remove information from output file (}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \i\insrsid12060006\charrsid8475156 -output:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ) that relates to classes/modules that have been skipped (filtered) due to the use of}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 - the following switches}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid3741585 excludeb}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid12060006\charrsid8475156 yfile}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 ,}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid3741585\charrsid3741585 \_}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid3741585 e}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 xcludebyattribut}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8475156 e:}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid3741585 and}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid15280621\charrsid8475156 \endash }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid12060006\charrsid8475156 filter}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \i\insrsid8475156\charrsid8475156 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3741585 }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 or where the PDB is missing}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid12060006 . -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5794820 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid5794820 -coverbytest}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid5794820\charrsid13513498 :[;][;] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid1967093 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 -Gather coverage by test by analysing the assemblies that match these filters for Test m}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 ethods. Currently only }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8339308 MSTest and }{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid5794820 NUnit tests}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15280621 are supported; other frameworks can be added on request \endash please raise support request on GitHub.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid5794820 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12068581 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -log:[Off|Fatal|Error|Warn|Info|Debug|Verbose|All] - -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 Change the logging level, default is set to Info. }{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid13513498\charrsid13513498 Logging is based on log4net logging levels and appenders}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 . -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid13513498\charrsid13513498 -service -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15795287 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid15795287\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid15795287 : \'93Administrator\'94 privileges recommended. -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid13513498 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13513498 -The value provided in the target parameter is the name of a service rather than a name of a process. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8145172\charrsid8145172 -servicestarttimeout:[1m|23s|1m23s] -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8145172 Overrides the default time to wait for the profiled service t -o start. The examples above correspond to a timeout of 1 minute, 23 seconds and 1 minutes and 23 seconds accordingly. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\i\insrsid14513928 oldstyle}{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid14513928\charrsid13513498 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14513928 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 Use old style instru}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid3490457 mentation \endash the instrumentation}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid14513928 is not Silverlight friendly and is provided to support environments where mscorlib instrumentation is not working. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8145172 {\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid2312332\charrsid2312332 -enableperformancecounters -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \b\insrsid2312332\charrsid7816154 NOTE}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid2312332 : \'93Administrator\'94 privileges}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid15795287 required}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 . -\par Allows the monitoring in \'93Performance Monitor\'94 of the following }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 values}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 : -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li1080\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin1080\itap0\pararsid2312332\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid2312332\charrsid2312332 \'93messages remaining on the queue}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 \'94 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid2312332\charrsid2312332 \hich\af31506\dbch\af0\loch\f31506 2)\tab}}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 \'93number of messages processed\'94 -}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332 -\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid7816154 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154 These values are usually cleared at the end of a performance run.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid7816154\charrsid7816154 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid2312332 {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2312332\charrsid2312332 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 {\*\bkmkstart _Toc442012129}\hich\af31502\dbch\af31501\loch\f31502 Handling Spaces}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid14513928 {\*\bkmkend _Toc442012129} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4484449 If your argument needs to escape quotes i.e. to pass arguments with spaces to the target process then you can use \\". -\par e.g. -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid4484449\charrsid8847473 -targetargs:"\\"c:\\program files\\" arg2 arg3" - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 Or -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 {\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8847473\charrsid8847473 \'93-targetargs:\\"c:\\program files\\ -" arg2 arg3" -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4484449 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid4484449 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 {\*\bkmkstart _Toc442012130}\hich\af31502\dbch\af31501\loch\f31502 Understanding Filters -{\*\bkmkend _Toc442012130} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2827362 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 Filters are core to understanding how OpenCover works and how it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 is determined}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 - which assemblies are to be instrumented to provide coverage results. -\par Filters can be inclusive and exclusive represented by + and }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 \endash prefix }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 respectively, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 where e}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid2827362 xclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (-) filters take precedence}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 over inclusive}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 (+)}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid2827362 filters. -\par The next }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 part of a filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 -is the module-filter and usually this happens to be the same name as the assembly but without the extension and this rule will normally apply 99.999% of the time. If this filter isn\rquote -t working look in the coverage XML and compare the found entries against the filter.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 The final part of the filter is the class-filter and this also }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 includes}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12348517 the namespace part of the class as well. - -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 {\*\bkmkstart _Toc442012131}\hich\af31502\dbch\af31501\loch\f31502 Examples{\*\bkmkend _Toc442012131} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3290111 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 +[Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111\charrsid3290111 -*]* -[Open.Test]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid3290111\charrsid3290111 -\par +[Open]*}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 -[Open]Data.*\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid3290111\charrsid3290111 -\par +[Open]* -[Open]*Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid3290111 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid3290111 Include all classes in module Open but exclude all classes ending with Attribute. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012132}\hich\af31502\dbch\af31501\loch\f31502 Regular Expressions in Filters -{\*\bkmkend _Toc442012132} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 It is also possible to use regular expressions instead of wildcards but to do so require that you use the \endash regex swit -ch when specifying the filters. NOTE: When using this feature it is required that all filters use regular expressions rather than wildcards. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid9639869 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 {\*\bkmkstart _Toc442012133}\hich\af31502\dbch\af31501\loch\f31502 Examples}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid9639869 {\*\bkmkend _Toc442012133}\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid9639869 -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14684873 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid9639869 \\.}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 .}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 -\af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 \\}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 .Test}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 -\f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 Include all classes in modules starting with Open.* but exclude all those in modules Open.Test}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 ) -[(Open)](Data\\..*)\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 -Include all classes in module Open but exclude all classes in the Data namespace.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -\par +[}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 -[}{\rtlch\fcs1 -\af2 \ltrch\fcs0 \f2\insrsid14684873 (}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 Open}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 ]}{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid14684873 (.}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873\charrsid3290111 *Attribute}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid14684873 )\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873 -Include all classes in module Open but exclude all classes ending with Attribute.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9639869 \line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14684873\charrsid3290111 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 {\*\bkmkstart _Toc442012134}\hich\af31502\dbch\af31501\loch\f31502 Running against IIS -{\*\bkmkend _Toc442012134} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 Normally I\rquote d suggest running against }{\field\flddirty{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 HYPERLINK "http://www.microsoft.com/en-us/download/details.aspx?id=1038" }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f0064006f0077006e006c006f00610064002f006400 -65007400610069006c0073002e0061007300700078003f00690064003d0031003000330038000000795881f43b1d7f48af2c825dc485276300000000a5ab0000000000000039000065960800}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid10224112\charrsid10224112 IISEXPPRESS}}} -\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10224112 as I think it is easier to automate. However for those}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14565649 - who really want to run against a full blown IIS then the following instructions (supplied by a }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid14565649\charrsid14565649 user) will hopefully suffice.}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\cf21\insrsid11687369\charrsid14565649 -\par \'93}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 The trick is to start OpenCover to run the}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\insrsid14565649 w3wp.exe process in debug mode}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\insrsid11687369\charrsid14565649 e.g. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe -targetargs:-debug\~\line -targetdir:C:\\Inetpub\\wwwwoot\\MyWebApp -\\bin\\ -filter:+[*]* -register:user -\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 There are some prerequisites tho}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 ugh:}{ -\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 \hich\af31506\dbch\af0\loch\f31506 1.\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls7\adjustright\rin0\lin720\itap0\pararsid14565649\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ll applications running under the site must }{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 make use of the same app pool; y}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 ou'll get error}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid14565649\charrsid14565649 s in the EventLog otherwise. -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 \hich\af31506\dbch\af0\loch\f31506 2.\tab}}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command: -\par }\pard\plain \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14565649 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 -{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net stop w3svc /y -\par }{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 A}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 -fter testing/code coverage completion you can close the w3wp.exe proce}{\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid14565649 s}{\rtlch\fcs1 \af4 \ltrch\fcs0 -\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 s and start the inetserver again: -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 net start w3svc -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14565649 {\rtlch\fcs1 \af4 \ltrch\fcs0 \cf21\lang3081\langfe3081\langfenp3081\insrsid11687369\charrsid14565649 -This procedure was tested on a Win2008 machine with IIS7.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369\charrsid14565649 \'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid11687369 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 You can also run multiple OpenCover instances against separate IIS sites by using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\cf21\insrsid12584760 \endash }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\cf21\insrsid12584760\charrsid12584760 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760 option when running IIS to choose the siteid e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cf21\insrsid12584760\charrsid12584760 -\par }\pard \ltrpar\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid12584760 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -OpenCover.Console.exe -target:C:\\Windows\\System32\\inetsrv\\w3wp.exe }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetargs:"-debug -s 1" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -targetdir:%WebSite_Path% }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -filter:+[*]* }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 \line \tab }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -output:%CoverageResult_Path%}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12584760 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12584760 Then you can use ReportGenerator to merge the coverage results. }{ -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\cf22\chshdng0\chcfpat0\chcbpat8\insrsid12584760\charrsid12584760 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012135}\hich\af31502\dbch\af31501\loch\f31502 Running against an application -{\*\bkmkend _Toc442012135} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid7237901 This most common usage }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 of any code coverage utility such as OpenCover }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7237901 is in a testing environment}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid12068581 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid7237901 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid13513498 {\*\bkmkstart _Toc442012136}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012136} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13513498 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid13513498\charrsid7237901 OpenCover.Console.exe -register:user -target:..\\..\\..\\tools\\NUnit-2.5.10.11092\\bin\\net-2.0\\nunit-console-x86.exe -targetargs:"OpenCover.Test -.dll /noshadow" -filter:"+[Open*]* -[OpenCover.T*]*" -output:opencovertests.xml -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012137}\hich\af31502\dbch\af31501\loch\f31502 Running against a Silverlight application -{\*\bkmkend _Toc442012137} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid16469695 To run against a Silverlight application it is necessary to ensure the site hosting the application is runni -ng beforehand. To profile a Silverlight application it is necessary to launch a browser against the site and as the PDB files are not packaged in the XAP files it is necessary to give the console a hint where to look for the PDB files}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1510934 (using the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 \endash targetdir}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1510934 option)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 . -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid12068581 {\*\bkmkstart _Toc442012138}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012138} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -register:user }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "-target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid16469695\charrsid12068581 C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe" }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid16469695\charrsid12068581 -targetar}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 gs:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 http://localhost:4128/SampleSilverlightTestPage.aspx}{ -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581 -t}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid8728997 argetdir:..}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid12068581\charrsid12068581 \\SampleSilverlight\\SampleSilverlight\\Bin\\Debug"}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkstart _Toc442012139}\hich\af31502\dbch\af31501\loch\f31502 Running against a Service application -{\*\bkmkend _Toc442012139} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid7289096 It is preferable to run the service in a console mode if it has one rather than as a service however if you do decide to use it against a service then you will nee -d to make sure you use an account that can access the windows synchronisation objects in the Global namespace (rather than Local namespace). \'93Local System\'94 seems to work quite well and so do user accounts w}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid8479050 ith the appropriate permissions;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 \'93Local Service\'94 is}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 usually}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7289096 - problematic and is not recommended. The console host will also need to be run from an account that can access the Global namespace as such an Administrator account or an Administrative prompt is recommended}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 -.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid12068581 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16469695 {\*\bkmkstart _Toc442012140}\hich\af31502\dbch\af31501\loch\f31502 Sample{\*\bkmkend _Toc442012140} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16469695 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 OpenCover.Console.exe -target:}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16349201 "}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 -OpenCover Sample Service" -service }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid8479050 \endash }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695\charrsid12068581 register}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid16469695 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8479050 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid8479050 NOTE}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 -: Rather than use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 \endash register}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 switch, it is usually simpler to use the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8479050\charrsid8479050 regsvr32}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050 utility to pre-register the two profiler assemblies (32 and 64-bit) beforehand.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8479050\charrsid12068581 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid738226 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkstart _Toc442012141}\hich\af31502\dbch\af31501\loch\f31502 Using -\hich\af31502\dbch\af31501\loch\f31502 the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid4327818\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyattribute}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid4327818 \hich\af31502\dbch\af31501\loch\f31502 option}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid97460 {\*\bkmkend _Toc442012141} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid4327818 Normally you would include/exclude modules and classes by using the inclusion/exclusion filters, however there may be situations where you can\rquote t get coverage via testing and you wish to ignore the uncovered method. - -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 First create a \'93public\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 - attribute that you can apply to class/method/property which you use to mark up something to ignore. You can have more than one and you can add other data to provide a reason why you are excluding it. -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1775295 e.g. -\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\faauto\rin0\lin720\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 [}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 -AttributeUsage}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 (}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 -\f40\fs16\insrsid738226\charrsid738226 .Class|}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 .Method|}{\rtlch\fcs1 \af40\afs16 -\ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 AttributeTargets}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226 .Property)] -\par }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \b\f40\fs16\cf2\insrsid738226\charrsid1775295 public}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf2\insrsid738226\charrsid738226 class} -{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 ExcludeFromCoverageAttribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 -\f40\fs16\insrsid738226\charrsid738226 : }{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\cf23\insrsid738226\charrsid738226 Attribute}{\rtlch\fcs1 \af40\afs16 \ltrch\fcs0 \f40\fs16\insrsid738226\charrsid738226 \{\} -\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af40\afs19 \ltrch\fcs0 \f40\fs19\insrsid738226 -\par -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 Then you apply this attribute to the class/method/property that you wish to exclude. - -\par Then you add this attribute to the }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid1510934\charrsid1510934 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid1510934 excludebyattribute}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 - option using namespaces and wildcards where necessary. -\par e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 --excludebyattribute:*.ExcludeFromCoverage* -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 NOTE: Use with care as you could exclude a method which you should be testing}{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 ;}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 {\*\bkmkstart _Toc442012142}\hich\af31502\dbch\af31501\loch\f31502 Using the }{\rtlch\fcs1 \af0 \ltrch\fcs0 -\i\insrsid8479050\charrsid8479050 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid738226\charrsid8479050 \hich\af31502\dbch\af31501\loch\f31502 excludebyfile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 \hich\af31502\dbch\af31501\loch\f31502 option}{ -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012142} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid738226 This is a useful option to use to ignore a}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 uto}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 generated files}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid738226 . This works on file and pathnames. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 e.g.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid9049101 - the following would ignore all code in files ending in }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\insrsid9049101\charrsid9049101 generated.cs}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -\par }\pard \ltrpar\ql \fi720\li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 -excludebyfile}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 -\f2\fs16\insrsid738226\charrsid738226 :}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226 *\\}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid2177067 *.generated.cs}{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid738226\charrsid738226 - -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid738226 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid738226 -NOTE: Use with care as you could exclude a method which you should be testing; also it can become too tempting to ignore a method and not test due to it being difficult and use this option to \lquote skip\rquote it. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid5114927 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012143}\hich\af31502\dbch\af31501\loch\f31502 Shimming support}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid5114927\charrsid5114927 {\*\bkmkend _Toc442012143} -\par \ltrrow}\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 -\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\pard\plain \ltrpar\qj \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5114927\yts28 \rtlch\fcs1 \af0\afs22\alang1025 -\ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 In comput -er programming, a shim is a small library that transparently intercepts API calls and changes the arguments passed, handles the operation itself, or redirects the operation elsewhere. Shims typically come about when the behavior of an API changes, thereby - -causing compatibility issues for older applications which still rely on the older functionality. In such cases, the older API can still be supported by a thin compatibility layer on top of the newer code. Web polyfills are a related concept. Shims can als -o be used for running programs on different software platforms than they were developed for. -\par - }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 HYPE -RLINK "http://en.wikipedia.org/wiki/Shim_%28computing%29" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b7c00000068007400740070003a002f002f0065006e002e00770069006b006900700065006400690061002e006f00720067002f00770069006b0069002f005300680069006d005f0025003200380063006f006d007000 -7500740069006e0067002500320039000000795881f43b1d7f48af2c825dc485276300000000a5ab00000465a901000000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid5114927\charrsid5114927 wikipedia}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 \cell }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1 -\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 -\trowd \irow0\irowband0\lastrow \ltrrow\ts28\trgaph108\trleft-108\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 -\trftsWidth1\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid5114927\tbllkhdrrows\tbllkhdrcols\tbllknocolband\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 -\clbrdrr\brdrs\brdrw10 \clcbpat24\cltxlrtb\clftsWidth3\clwWidth9242\clcbpatraw24 \cellx9134\row }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5114927 {\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid5114927 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 Depending on the provider of the Shimming utility will determine on how the OpenCover will be used alongside it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5114927 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid2243939\charrsid2243939 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012144}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Moles support -{\*\bkmkend _Toc442012144} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 To use Moles with OpenCover requires that you first inform Moles that you are using OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid5921453 Before you run moles you need to set an environment variable -\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 -set CLRMONITOR_EXTERNAL_PROFILERS=\{1542C21D-80C3-45E6-A56C-A9C1E4BEB7B8\} -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f3\fs22\insrsid5921453 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls9\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 Then use OpenCover to run the moles runner -\par }\pard \ltrpar\s25\ql \li720\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid5921453\charrsid5921453 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 {\*\bkmkstart _Toc442012145}\hich\af31502\dbch\af31501\loch\f31502 Microsoft Fakes support -{\*\bkmkend _Toc442012145} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 OpenCover has support for }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 HYPERLINK "https://msdn.microsoft.com/en-us/library/hh549175.aspx" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 -{\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b86000000680074007400700073003a002f002f006d00730064006e002e006d006900630072006f0073006f00660074002e0063006f006d002f0065006e002d00750073002f006c006900620072006100720079002f00 -680068003500340039003100370035002e0061007300700078000000795881f43b1d7f48af2c825dc485276300000000a5ab00003000000000eb08}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid2243939\charrsid2243939 Microsoft Fakes}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2243939 just use OpenCover to execute vstest.cons -ole.exe and it will detect if the Microsoft Fakes profiler is going to be activated and it will do the rest. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid5921453 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 {\*\bkmkstart _Toc442012146}\hich\af31502\dbch\af31501\loch\f31502 TypeMock support -{\*\bkmkend _Toc442012146} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 The }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 developers}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5921453 at TypeMock add}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 ed}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid5921453 OpenCover support several years ago; please review their documentation to get both TypeMock and OpenCover to work correctly with the versions you have installed. -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid8091909 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\bkmkstart _Toc442012147}\hich\af31502\dbch\af31501\loch\f31502 JustMock support -{\*\bkmkend _Toc442012147} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2243939 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 The developers at JustMock have also added support for OpenCover; please review their }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 - HYPERLINK "http://www.telerik.com/help/justmock/integration-opencover.html" }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b9800000068007400740070003a002f002f007700770077002e00740065006c006500720069006b002e0063006f006d002f00680065006c0070002f006a007500730074006d006f0063006b002f0069006e0074006500 -670072006100740069006f006e002d006f00700065006e0063006f007600650072002e00680074006d006c000000795881f43b1d7f48af2c825dc485276300000000a5ab0000002f00000700}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid8091909\charrsid8091909 documentation}}} -\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8091909 to get both JustMock and OpenCover to work correctly with the versions you have installed.}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid8091909\charrsid2243939 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 {\*\bkmkstart _Toc442012148}\hich\af31502\dbch\af31501\loch\f31502 Build system integration}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid4327818 {\*\bkmkend _Toc442012148} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1926955 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 It is not unexpected that OpenCover will be used in a build environment and that the build will be running under a system account under these scenarios it is recommended that you pre-register the prof -iler DLLs using the regsvr32 utility where applicable for your environment. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid1926955\charrsid1903893 regsvr32 x86\\OpenCover.Profiler.dll\line regsvr32 x64\\OpenCover.Profiler.dll -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 To assist your build environment when you install OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 using the MSI}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 it will store in the registry a lo -cation of the installation folder. The location in the registry depends on whether it is a single-user or}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 an}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 all-user installation and}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid1903893 also}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 if you}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 are on a 32/64 bit environment. -\par See the following examples based on default settings:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1926955 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012149}\hich\af31502\dbch\af31501\loch\f31502 all-users -\hich\af31502\dbch\af31501\loch\f31502 (32-bit){\*\bkmkend _Toc442012149} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012150}\hich\af31502\dbch\af31501\loch\f31502 all-users (64-bit) -{\*\bkmkend _Toc442012150} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKLM\\Software\\Wow6432Node\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{ -\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %PROGRAMFILES(X86)%\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkstart _Toc442012151}\hich\af31502\dbch\af31501\loch\f31502 single-user{\*\bkmkend _Toc442012151} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1903893 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 Registry Entry: }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 HKCU\\Software\\OpenCover\\Location}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 \line Install Location: }{\rtlch\fcs1 \af2 -\ltrch\fcs0 \f2\insrsid1903893\charrsid1903893 %LOCALAPPDATA%\\Apps\\OpenCover}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid1903893 -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 {\*\bkmkstart _Toc442012152}\hich\af31502\dbch\af31501\loch\f31502 Reporting{\*\bkmkend _Toc442012152} - -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7160127 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 It is recommended that ReportGenerator (also available on Nuget) is used to view the coverage results however if you want to make your own reporting then a sample XSLT has been made available by }{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 Pavan Tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 (}{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 HYPERLINK "}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127\charrsid7160127 -https://github.com/pawan52tiwari}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 " }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid16071677 {\*\datafield -00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5a000000680074007400700073003a002f002f006700690074006800750062002e0063006f006d002f0070006100770061006e00350032007400690077006100720069000000795881f43b1d7f48af2c825dc4852763 -00000000a5ab0000006f000000005b5a088700ff00}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs19\ul\cf2\insrsid7160127\charrsid2981254 https://github.com/pawan52tiwari}}}\sectd \ltrsect -\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 ). It is simple to use with the supplied powershell script. -\par }{\rtlch\fcs1 \af2\afs16 \ltrch\fcs0 \f2\fs16\insrsid7160127\charrsid7160127 powershell -noexit -file ..\\..\\transform\\transform.ps1 -xsl ..\\..\\transform\\simple_report.xslt -xml opencovertests.xml -output simple_output.html -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7160127 Feel free to extend it to your own requirements. -\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\itap0\pararsid7372180 \rtlch\fcs1 \ab\af0\afs26\alang1025 \ltrch\fcs0 -\b\fs26\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012153}\hich\af31502\dbch\af31501\loch\f31502 FAQ{\*\bkmkend _Toc442012153} -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 {\*\bkmkstart _Toc442012154}\hich\af31502\dbch\af31501\loch\f31502 Why do I have no results?}{\rtlch\fcs1 -\af0 \ltrch\fcs0 \insrsid1903893 {\*\bkmkend _Toc442012154} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8847473 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 There are two common reasons why this may happen.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473\charrsid8847473 -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7372180 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8847473 1) Instrumentation skipped due to filters. -\par The usual reason for no results}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid7372180 because OpenCover cannot locate the PDBs for assemblies that match the filters to be profiled i.e. gather c -overage results from. When each assembly is loaded the location and reason the assembly wasn\rquote t profiled is provided in the coverage results file e.g. -\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8852142 {\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 -\f2\fs14\insrsid8852142\charrsid8852142 \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 C:\\Personal\\opencover.git -\\working\\main\\bin\\Debug\\OpenCover.Test.dll\line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 OpenCover.Test\line \line }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid8852142\charrsid8852142 }{\rtlch\fcs1 \af2\afs14 \ltrch\fcs0 \f2\fs14\insrsid7372180 -\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 The two most common reasons}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8329235 provided}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 are }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter} -{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 . }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid8852142\charrsid2827362 Filter}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 is obviously connected to the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8852142\charrsid1510934 \endash filter:}{\rtlch\fcs1 \af0 -\ltrch\fcs0 \insrsid8852142 argument and that the ModuleName was not matched}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2827362 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8852142 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid2827362\charrsid2827362 MissingPdb}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 is usually because the PDB is not where the assembly is being loaded from}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 -. The most common reason is }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 due to }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 test tools such as NUnit or MSTest which copy the assembly under test to a new location}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid8329235 ; t}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3290111 his can be corrected by either using the /no}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 shadow or /noisolation option. An alternative is to use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 -\i\insrsid8329235\charrsid1510934 \endash targetdir:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 argument to provide an alternative location for OpenCover to use.}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid2827362 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 The other reasons are only applicable to classes and are related to the use of \line }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyattribute}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \i\insrsid8329235\charrsid1510934 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 and }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid8329235\charrsid1510934 \endash excludebyfile:}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8329235 options. -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 2) Failure to register the profiler assemblies. -\par The profiler assemblies are COM objects and need to be registered in the Registry before the target process is run. -\par This can }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 usually }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 be solved in }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid13596290 one of }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 two ways}{\rtlch\fcs1 -\af37 \ltrch\fcs0 \insrsid13596290 :}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 a)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid8847473\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid8847473 Use the }{\rtlch\fcs1 \af37 \ltrch\fcs0 \i\insrsid8847473\charrsid1510934 \endash register[:user] }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 switch -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid8847473 \hich\af31506\dbch\af0\loch\f31506 b)\tab}}\pard \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid5921453\contextualspace {\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid8847473 Pre-register the assemblies using the regsvr32 utility}{\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid5921453\charrsid5921453 -\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb200\sl276\slmult1\keep\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \ab\af0\afs22\alang1025 \ltrch\fcs0 -\b\fs22\cf18\lang3081\langfe1033\loch\af31502\hich\af31502\dbch\af31501\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 {\*\bkmkstart _Toc442012155}\hich\af31502\dbch\af31501\loch\f31502 -All my tests are failing and I am getting MissingMethodException{\*\bkmkend _Toc442012155} -\par }\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14513928 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 { -\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid14513928 This has been seen on a few systems}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid6453762 where the following command has been executed to improve performance (or something similar)}{\rtlch\fcs1 \af0 \ltrch\fcs0 -\insrsid14513928 -\par }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen install /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 -\par }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 The}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid3490457 re}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 are two ways to fix or handle this issue -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 1)\tab}}\pard\plain \ltrpar\s25\ql \fi-360\li720\ri0\sa200\sl276\slmult1 -\widctlpar\wrapdefault\aspalpha\aspnum\faauto\ls1\adjustright\rin0\lin720\itap0\pararsid6453762\contextualspace \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \f31506\fs22\lang3081\langfe1033\cgrid\langnp3081\langfenp1033 {\rtlch\fcs1 \af37 \ltrch\fcs0 -\insrsid6453762 Undo the previous command - }{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762\charrsid6453762 ngen uninstall /Profile \'93mscorlib\'94}{\rtlch\fcs1 \af2 \ltrch\fcs0 \f2\insrsid6453762 .}{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762 - -\par {\listtext\pard\plain\ltrpar \s25 \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \f31506\fs22\insrsid6453762 \hich\af31506\dbch\af0\loch\f31506 2)\tab}Use the }{\rtlch\fcs1 \af2 \ltrch\fcs0 \i\insrsid6453762\charrsid1510934 \endash oldstyle}{\rtlch\fcs1 \af37 -\ltrch\fcs0 \insrsid6453762 switch, note however that this is not Silverlight friendly. }{\rtlch\fcs1 \af37 \ltrch\fcs0 \insrsid6453762\charrsid6453762 -\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a -9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad -5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6 -b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0 -0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6 -a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f -c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512 -0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462 -a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865 -6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b -4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b -4757e8d3f729e245eb2b260a0238fd010000ffff0300504b03041400060008000000210030dd4329a8060000a41b0000160000007468656d652f7468656d652f -7468656d65312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87 -615b8116d8a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad -79482a9c0498f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b -5d8a314d3c94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab -999fb7b4717509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9 -699640f6719e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd586 -8b37a088d1e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d6 -0cf03ac1a5193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f -9e7ef3f2d117d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be -15c308d3f28acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a9979 -3849c26ae66252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d -32a423279a668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2a -f074481847bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86 -e877f0034e16bafb0e258ebb4faf06b769e888340b103d331115bebc4eb813bf83291b63624a0d1475a756c734f9bbc2cd28546ecbe1e20a3794ca175f3fae90 -fb6d2dd99bb07b55e5ccf68942bd0877b23c77b908e8db5f9db7f024d9239010f35bd4bbe2fcae387bfff9e2bc289f2fbe24cfaa301468dd8bd846dbb4ddf1c2 -ae7b4c191ba8292337a469bc25ec3d411f06f53a73e224c5292c8de0516732307070a1c0660d125c7d44553488700a4d7bddd3444299910e254ab984c3a219ae -a4adf1d0f82b7bd46cea4388ad1c12ab5d1ed8e1153d9c9f350a3246aad01c6873462b9ac05999ad5cc988826eafc3acae853a33b7ba11cd1445875ba1b236b1 -399483c90bd560b0b0263435085a21b0f22a9cf9356b38ec6046026d77eba3dc2dc60b17e92219e180643ed27acffba86e9c94c7ca9c225a0f1b0cfae0788ad5 -4adc5a9aec1b703b8b93caec1a0bd8e5de7b132fe5113cf312503b998e2c2927274bd051db6b35979b1ef271daf6c6704e86c73805af4bdd476216c26593af84 -0dfb5393d964f9cc9bad5c313709ea70f561ed3ea7b053075221d51696910d0d339585004b34272bff7213cc7a510a5454a3b349b1b206c1f0af490176745d4b -c663e2abb2b34b23da76f6352ba57ca2881844c1111ab189d8c7e07e1daaa04f40255c77988aa05fe06e4e5bdb4cb9c5394bbaf28d98c1d971ccd20867e556a7 -689ec9166e0a522183792b8907ba55ca6e943bbf2a26e52f48957218ffcf54d1fb09dc3eac04da033e5c0d0b8c74a6b43d2e54c4a10aa511f5fb021a07533b20 -5ae07e17a621a8e082dafc17e450ffb739676998b48643a4daa7211214f623150942f6a02c99e83b85583ddbbb2c4996113211551257a656ec1139246ca86be0 -aadedb3d1441a89b6a929501833b197fee7b9641a3503739e57c732a59b1f7da1cf8a73b1f9bcca0945b874d4393dbbf10b1680f66bbaa5d6f96e77b6f59113d -316bb31a795600b3d256d0cad2fe354538e7566b2bd69cc6cbcd5c38f0e2bcc63058344429dc2121fd07f63f2a7c66bf76e80d75c8f7a1b622f878a18941d840 -545fb28d07d205d20e8ea071b283369834296bdaac75d256cb37eb0bee740bbe278cad253b8bbfcf69eca23973d939b97891c6ce2cecd8da8e2d343578f6648a -c2d0383fc818c798cf64e52f597c740f1cbd05df0c264c49134cf09d4a60e8a107260f20f92d47b374e32f000000ffff0300504b030414000600080000002100 -0dd1909fb60000001b010000270000007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f7 -8277086f6fd3ba109126dd88d0add40384e4350d363f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89 -d93b64b060828e6f37ed1567914b284d262452282e3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd500 -1996509affb3fd381a89672f1f165dfe514173d9850528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0f -bfff0000001c0200001300000000000000000000000000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6 -a7e7c0000000360100000b00000000000000000000000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a -0000001c00000000000000000000000000190200007468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d00140006000800000021 -0030dd4329a8060000a41b00001600000000000000000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d001400060008 -00000021000dd1909fb60000001b0100002700000000000000000000000000b20900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000ad0a00000000} -{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d -617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 -6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 -656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} -{\*\latentstyles\lsdstimax371\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title; -\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date; -\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdpriority59 \lsdlocked0 Table Grid;\lsdsemihidden1 \lsdlocked0 Placeholder Text; -\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; -\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; -\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; -\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdlocked0 Revision; -\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; -\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; -\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; -\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; -\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; -\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; -\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; -\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; -\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; -\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; -\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; -\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; -\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; -\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; -\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; -\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; -\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; -\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4; -\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2; -\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3; -\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4; -\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4; -\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5; -\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5; -\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6; -\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6; -\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3; -\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3; -\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4; -\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4; -\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5; -\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5; -\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6; -\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;}}{\*\datastore 010500000200000018000000 -4d73786d6c322e534158584d4c5265616465722e362e30000000000000000000000e0000 -d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff010000000c6ad98892f1d411a65f0040963251e5000000000000000000000000d03b -4506d45bd1010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff020000000000000000000000000000000000000000000000d03b4506d45bd101 -d03b4506d45bd101000000000000000000000000dc00c600d3004b00c000350050003100c600d400d200d600d1004400c2005900cd00d3004700c300490041003d003d000000000000000000000000000000000032000101ffffffffffffffff030000000000000000000000000000000000000000000000d03b4506d45b -d101d03b4506d45bd1010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 -00000000000000000000000000000000d800000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff -ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f75726365732053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d224150412220786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f7267 -2f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879223e3c2f623a536f75726365733e00000000 -0000000000000000000000000000000000000000000000000000000000000000000000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b38314341 -364346322d444246332d344339422d423643342d3338393842373331413332307d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c -64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 -0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f -72654974656d3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt b/tests/CodeCoverage/OpenCover.4.6.519/readme.txt deleted file mode 100644 index 7e5988f730..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/readme.txt +++ /dev/null @@ -1,21 +0,0 @@ -Welcome to OpenCover. - -OpenCover is an open source (MIT licence) code coverage utility for all .NET -Frameworks (2 and above, including Silverlight). It can handle all .NET -languages as long as the compiled assemblies use the .NET Runtime. - -It is most commonly used to gather coverage data of code that is being -exercised by unit testing i.e. nunit, mstest etc. - -We recommend that you view the documents that have also been installed -alongside the utility to get started or you can look at the documentation -provided on the wiki https://github.com/OpenCover/opencover/wiki/Usage. - -Currently OpenCover has no visualization of its results and we recommend that -your use ReportGenerator (2.1.8 and above) to view the results against your code. - -A sample project showing a possible way to use OpenCover with ReportGenerator -has also been provided for your convenience. - -If you have any issues or feature requests with OpenCover please raise them -with the project owners on https://github.com/opencover/opencover. diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Autofac.Configuration.dll deleted file mode 100644 index 230786aa2498e16803f418a8d2c8a8a3bf349312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40448 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/CrashReporter.NET.dll deleted file mode 100644 index f2d05ec7ac96b4ad498e8edd3214379a08bb61ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109056 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 OTJMg-`82$=T)n$Y}m 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 whUsj5>c4$9R81c8Q-3^1DHgqevF<7iN% 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 dcQ~f^cj_Ex&Hq%`#-4${vTJ~v8ez6 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/Mono.Cecil.dll deleted file mode 100644 index bf3acf1795f96526cf4c86b1cb18d1cacfb9dd79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 280576 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 N(3l^$;op`5{~x`C!AAf9 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Console.exe deleted file mode 100644 index b1c416d5314029b540c5720c85122dd8fec09f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80384 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 cfJf}V$Db - - -

- - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Extensions.dll deleted file mode 100644 index cb691377e090bc944deb1dfcd219763c23985093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11264 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/OpenCover.Framework.dll deleted file mode 100644 index 1accffc18dd5a1b62ef223bcffabc9cb156b3d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151040 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config deleted file mode 100644 index d6c61f7078..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.config +++ /dev/null @@ -1,39 +0,0 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll b/tests/CodeCoverage/OpenCover.4.6.519/tools/log4net.dll deleted file mode 100644 index 47cd9ad41bd21c765693ef396831e01a13f80f8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301056 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 diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt b/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt deleted file mode 100644 index e8367515a7..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/transform/simple_report.xslt +++ /dev/null @@ -1,332 +0,0 @@ - - - - - - - - - -

Code Coverage Report

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Generated on: - - -
- Parser: - - Pawan Tiwari's Parser -
- Assemblies: - - -
- Files: - - -
- Coverage: - - % -
- Covered lines: - - -
- UnCovered lines: - - -
- Coverable lines: - - -
- Total lines: - - Yet To be discovered - -
-

- Assemblies -

-

- Collapse all classes | Expand all classes -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Details -
- - - - - - - - - - - - - - - - - - - - - -
- Classes: - - -
- Covered lines: - - -
- Coverable lines: - - -
- Coverage: - - - - % - - - 0 - - -
-
-
- - % - - - - - - - - -
-   - -   -
-
-

- Class Name: -

-
- % - - - - - - - -
-   - -   -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Class: - - -
- Assembly: - - -
- File(s): - - - - - - - -
- Coverage: - - - % -
- Covered lines: - - -
- Coverable lines: - - -
- Total lines: - - 51 -
-
- - - - - - - - - - - - - - - - - -
- Method - - Cyclomatic Complexity - - Sequence Coverage - - Branch Coverage - - Static Method -
- - - - - - - - - - -
-
- - - diff --git a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 b/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 deleted file mode 100644 index 72008aafae..0000000000 --- a/tests/CodeCoverage/OpenCover.4.6.519/transform/transform.ps1 +++ /dev/null @@ -1,17 +0,0 @@ -[CmdletBinding()] -Param( - [Parameter(Mandatory=$True,Position=1)] - [string]$xsl, - - [Parameter(Mandatory=$True)] - [string]$xml, - - [Parameter(Mandatory=$True)] - [string]$output -) - -$xslt = New-Object System.Xml.Xsl.XslCompiledTransform; -$xslt.Load($xsl); -$xslt.Transform($xml, $output); - -Write-Host "The file has been transformed." From 1dac8dbfb003653a056ee03b831908f18094a4be Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Thu, 8 Jun 2017 18:15:45 +0100 Subject: [PATCH 010/136] [SL.Core] rename project from Primitives to Core --- README.md | 2 +- ...abors.Primitives.ruleset => SixLabors.Core.ruleset | 0 SixLabors.Primitives.sln => SixLabors.Core.sln | 4 ++-- ....sln.DotSettings => SixLabors.Core.sln.DotSettings | 0 appveyor.yml | 2 +- build.cmd | 6 +++--- src/Shared/AssemblyInfo.Common.cs | 6 +++--- .../Constants.cs | 2 +- .../HashHelpers.cs | 2 +- src/{SixLabors.Primitives => SixLabors.Core}/MathF.cs | 2 +- .../Primitives}/Matrix3x2Extensions.cs | 0 .../Primitives}/Point.cs | 0 .../Primitives}/PointF.cs | 0 .../Primitives}/Rectangle.cs | 0 .../Primitives}/RectangleF.cs | 0 .../Primitives}/Size.cs | 0 .../Primitives}/SizeF.cs | 0 .../SixLabors.Core.csproj} | 9 +++++---- .../stylecop.json | 0 tests/CodeCoverage/CodeCoverage.cmd | 8 ++++---- .../Primitives}/PointFTests.cs | 0 .../Primitives}/PointTests.cs | 0 .../Primitives}/RectangleFTests.cs | 0 .../Primitives}/RectangleTests.cs | 0 .../Primitives}/SizeFTests.cs | 0 .../Primitives}/SizeTests.cs | 0 .../SixLabors.Core.Tests.csproj} | 11 ++++++----- 27 files changed, 28 insertions(+), 26 deletions(-) rename SixLabors.Primitives.ruleset => SixLabors.Core.ruleset (100%) rename SixLabors.Primitives.sln => SixLabors.Core.sln (86%) rename SixLabors.Primitives.sln.DotSettings => SixLabors.Core.sln.DotSettings (100%) rename src/{SixLabors.Primitives => SixLabors.Core}/Constants.cs (93%) rename src/{SixLabors.Primitives => SixLabors.Core}/HashHelpers.cs (95%) rename src/{SixLabors.Primitives => SixLabors.Core}/MathF.cs (99%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Matrix3x2Extensions.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Point.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/PointF.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Rectangle.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/RectangleF.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/Size.cs (100%) rename src/{SixLabors.Primitives => SixLabors.Core/Primitives}/SizeF.cs (100%) rename src/{SixLabors.Primitives/SixLabors.Primitives.csproj => SixLabors.Core/SixLabors.Core.csproj} (87%) rename src/{SixLabors.Primitives => SixLabors.Core}/stylecop.json (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/PointFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/PointTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/RectangleFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/RectangleTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/SizeFTests.cs (100%) rename tests/{SixLabors.Primitives.Tests => SixLabors.Core.Tests/Primitives}/SizeTests.cs (100%) rename tests/{SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj => SixLabors.Core.Tests/SixLabors.Core.Tests.csproj} (87%) diff --git a/README.md b/README.md index 6352287055..5b92ec28f7 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ -# Primitives +# Core Point, Rectangle, Size Primitives for use across SixLabors libraries. diff --git a/SixLabors.Primitives.ruleset b/SixLabors.Core.ruleset similarity index 100% rename from SixLabors.Primitives.ruleset rename to SixLabors.Core.ruleset diff --git a/SixLabors.Primitives.sln b/SixLabors.Core.sln similarity index 86% rename from SixLabors.Primitives.sln rename to SixLabors.Core.sln index b1a03f64f5..63fe397d4e 100644 --- a/SixLabors.Primitives.sln +++ b/SixLabors.Core.sln @@ -21,9 +21,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A src\Shared\stylecop.json = src\Shared\stylecop.json EndProjectSection EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives", "src\SixLabors.Primitives\SixLabors.Primitives.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Primitives.Tests", "tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/SixLabors.Primitives.sln.DotSettings b/SixLabors.Core.sln.DotSettings similarity index 100% rename from SixLabors.Primitives.sln.DotSettings rename to SixLabors.Core.sln.DotSettings diff --git a/appveyor.yml b/appveyor.yml index 0c1d45047c..edb297ed48 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,7 +13,7 @@ build_script: - cmd: tests\CodeCoverage\CodeCoverage.cmd after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Primitives.%GitVersion_NuGetVersion%.nupkg" + - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%GitVersion_NuGetVersion%.nupkg" deploy: - provider: NuGet diff --git a/build.cmd b/build.cmd index 727bdf8807..d1eaa59b01 100644 --- a/build.cmd +++ b/build.cmd @@ -14,13 +14,13 @@ if not "%GitVersion_NuGetVersion%" == "" ( ) if not "%errorlevel%"=="0" goto failure -dotnet test ./tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( - dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% + dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% )ELSE ( - dotnet pack ./src/SixLabors.Primitives/ -c Release --output ../../artifacts --no-build + dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build ) if not "%errorlevel%"=="0" goto failure diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/Shared/AssemblyInfo.Common.cs index b140dd9176..c9cc15b730 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/Shared/AssemblyInfo.Common.cs @@ -12,8 +12,8 @@ // associated with an assembly. [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Scott Williams")] -[assembly: AssemblyProduct("SixLabors.Primitives")] +[assembly: AssemblyCompany("Six Labors")] +[assembly: AssemblyProduct("SixLabors.Core")] [assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -34,4 +34,4 @@ [assembly: AssemblyInformationalVersion("1.0.0.0")] // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Primitives.Tests")] +[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Primitives/Constants.cs b/src/SixLabors.Core/Constants.cs similarity index 93% rename from src/SixLabors.Primitives/Constants.cs rename to src/SixLabors.Core/Constants.cs index 44f68f8988..1d9dd24d9e 100644 --- a/src/SixLabors.Primitives/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives +namespace SixLabors { /// /// Common constants used throughout the project diff --git a/src/SixLabors.Primitives/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs similarity index 95% rename from src/SixLabors.Primitives/HashHelpers.cs rename to src/SixLabors.Core/HashHelpers.cs index d622d308c5..e481e03dae 100644 --- a/src/SixLabors.Primitives/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace SixLabors.Primitives +namespace SixLabors { // lifted from coreFX repo internal static class HashHelpers diff --git a/src/SixLabors.Primitives/MathF.cs b/src/SixLabors.Core/MathF.cs similarity index 99% rename from src/SixLabors.Primitives/MathF.cs rename to src/SixLabors.Core/MathF.cs index eeaca821b7..b05914e74a 100644 --- a/src/SixLabors.Primitives/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ // Licensed under the Apache License, Version 2.0. // -namespace SixLabors.Primitives +namespace SixLabors { using System; using System.Runtime.CompilerServices; diff --git a/src/SixLabors.Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs similarity index 100% rename from src/SixLabors.Primitives/Matrix3x2Extensions.cs rename to src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs diff --git a/src/SixLabors.Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs similarity index 100% rename from src/SixLabors.Primitives/Point.cs rename to src/SixLabors.Core/Primitives/Point.cs diff --git a/src/SixLabors.Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs similarity index 100% rename from src/SixLabors.Primitives/PointF.cs rename to src/SixLabors.Core/Primitives/PointF.cs diff --git a/src/SixLabors.Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs similarity index 100% rename from src/SixLabors.Primitives/Rectangle.cs rename to src/SixLabors.Core/Primitives/Rectangle.cs diff --git a/src/SixLabors.Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs similarity index 100% rename from src/SixLabors.Primitives/RectangleF.cs rename to src/SixLabors.Core/Primitives/RectangleF.cs diff --git a/src/SixLabors.Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs similarity index 100% rename from src/SixLabors.Primitives/Size.cs rename to src/SixLabors.Core/Primitives/Size.cs diff --git a/src/SixLabors.Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs similarity index 100% rename from src/SixLabors.Primitives/SizeF.cs rename to src/SixLabors.Core/Primitives/SizeF.cs diff --git a/src/SixLabors.Primitives/SixLabors.Primitives.csproj b/src/SixLabors.Core/SixLabors.Core.csproj similarity index 87% rename from src/SixLabors.Primitives/SixLabors.Primitives.csproj rename to src/SixLabors.Core/SixLabors.Core.csproj index 3a1265cff9..f7f25dfc18 100644 --- a/src/SixLabors.Primitives/SixLabors.Primitives.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -9,14 +9,14 @@ netstandard1.1 true true - SixLabors.Primitives - SixLabors.Primitives + SixLabors.Core + SixLabors.Core rectangle;point;size,primitives https://raw.githubusercontent.com/SixLabors/Home/master/logo.png - https://github.com/SixLabors/Primitives + https://github.com/SixLabors/Core http://www.apache.org/licenses/LICENSE-2.0 git - https://github.com/SixLabors/Primitives + https://github.com/SixLabors/Core false false false @@ -27,6 +27,7 @@ false false full + SixLabors diff --git a/src/SixLabors.Primitives/stylecop.json b/src/SixLabors.Core/stylecop.json similarity index 100% rename from src/SixLabors.Primitives/stylecop.json rename to src/SixLabors.Core/stylecop.json diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 2547eace17..7a89ab210e 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -7,15 +7,15 @@ nuget restore packages.config -PackagesDirectory . cd .. cd .. -dotnet restore SixLabors.Primitives.sln -dotnet build SixLabors.Primitives.sln --no-incremental -c debug /p:codecov=true +dotnet restore SixLabors.Core.sln +dotnet build SixLabors.Core.sln --no-incremental -c debug /p:codecov=true rem The -threshold options prevents this taking ages... rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Primitives.Tests\SixLabors.Primitives.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Primitives.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Primitives.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.Primitives*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% pip install codecov -codecov -f "SixLabors.Primitives.Coverage.xml" \ No newline at end of file +codecov -f "SixLabors.Core.Coverage.xml" \ No newline at end of file diff --git a/tests/SixLabors.Primitives.Tests/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/PointFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/PointFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/PointTests.cs rename to tests/SixLabors.Core.Tests/Primitives/PointTests.cs diff --git a/tests/SixLabors.Primitives.Tests/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/RectangleFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/RectangleTests.cs rename to tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/SizeFTests.cs rename to tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs similarity index 100% rename from tests/SixLabors.Primitives.Tests/SizeTests.cs rename to tests/SixLabors.Core.Tests/Primitives/SizeTests.cs diff --git a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj similarity index 87% rename from tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj rename to tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 2dd674fdcb..cd34a8421a 100644 --- a/tests/SixLabors.Primitives.Tests/SixLabors.Primitives.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -3,7 +3,7 @@ 0.0.0 netcoreapp1.1 - SixLabors.Primitives.Tests + SixLabors.Core.Tests SixLabors.Shapes.Tests true false @@ -13,12 +13,9 @@ false false full + SixLabors.Tests - - - - @@ -26,6 +23,10 @@ + + + + From d563233bf47625750963edc31c495fc103d2fe09 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:17:21 +0100 Subject: [PATCH 011/136] [SL.Core] add center property to rectangle --- src/SixLabors.Core/Primitives/Rectangle.cs | 10 ++++++++++ src/SixLabors.Core/Primitives/RectangleF.cs | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 735920f0a2..e7fa218670 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -110,6 +110,16 @@ public Size Size } } + /// + /// Gets the coordinates of the center of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public Point Center + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new Point(this.X + (this.Width / 2), this.Y + (this.Height / 2)); + } + /// /// Gets a value indicating whether this is empty. /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 36578a455b..f914091b30 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -110,6 +110,16 @@ public SizeF Size } } + /// + /// Gets the coordinates of the center of the rectangular region represented by this . + /// + [EditorBrowsable(EditorBrowsableState.Never)] + public PointF Center + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get => new PointF(this.X + (this.Width / 2), this.Y + (this.Height / 2)); + } + /// /// Gets a value indicating whether this is empty. /// From 90dff77ca3a0112dc47eb6e2355555054bdc00a5 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:18:25 +0100 Subject: [PATCH 012/136] [SL.Core] add multiplication and divide operators to Point --- src/SixLabors.Core/Primitives/Point.cs | 34 +++++++++++++++++++++++++ src/SixLabors.Core/Primitives/PointF.cs | 34 +++++++++++++++++++++++++ 2 files changed, 68 insertions(+) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 5d37d01a68..f922711aa2 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -127,6 +127,31 @@ public Point(Size size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator -(Point point, Size size) => Subtract(point, size); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static Point operator *(int left, Point right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static Point operator *(Point left, int right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static Point operator /(Point left, int right) + => new Point(left.X / right, left.Y / right); + /// /// Compares two objects for equality. /// @@ -158,6 +183,15 @@ public Point(Size size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); + /// + /// Translates a by the negative of a given value + /// + /// The point on the left hand of the operand. + /// The size on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); + /// /// Translates a by the negative of a given . /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index ca011483ea..032ba67264 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -145,6 +145,31 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); + /// + /// Multiplies by a producing . + /// + /// Multiplier of type . + /// Multiplicand of type . + /// Product of type . + public static PointF operator *(float left, PointF right) => Multiply(right, left); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + public static PointF operator *(PointF left, float right) => Multiply(left, right); + + /// + /// Divides by a producing . + /// + /// Dividend of type . + /// Divisor of type . + /// Result of type . + public static PointF operator /(PointF left, float right) + => new PointF(left.X / right, left.Y / right); + /// /// Compares two objects for equality. /// @@ -212,6 +237,15 @@ public PointF(SizeF size) public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); /// + /// Translates a by the multiplying the X and Y by the given value. + /// + /// The point on the left hand of the operand. + /// The value on the right hand of the operand. + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); + + /// PointF /// Rotates a point around the given rotation matrix. /// /// The point to rotate From cf9f6451b5e7f3fb2cd2659c8e5a144f8932a8a4 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Fri, 9 Jun 2017 20:19:57 +0100 Subject: [PATCH 013/136] [SL.Core] Revert "add center property to rectangle" This reverts commit bdd54d39b39e8c40e123587530dc489a54daddea. --- src/SixLabors.Core/Primitives/Rectangle.cs | 10 ---------- src/SixLabors.Core/Primitives/RectangleF.cs | 10 ---------- 2 files changed, 20 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index e7fa218670..735920f0a2 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -110,16 +110,6 @@ public Size Size } } - /// - /// Gets the coordinates of the center of the rectangular region represented by this . - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public Point Center - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => new Point(this.X + (this.Width / 2), this.Y + (this.Height / 2)); - } - /// /// Gets a value indicating whether this is empty. /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index f914091b30..36578a455b 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -110,16 +110,6 @@ public SizeF Size } } - /// - /// Gets the coordinates of the center of the rectangular region represented by this . - /// - [EditorBrowsable(EditorBrowsableState.Never)] - public PointF Center - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => new PointF(this.X + (this.Width / 2), this.Y + (this.Height / 2)); - } - /// /// Gets a value indicating whether this is empty. /// From 39aafb1d7aa956162ad3c833ad8cf81907b8ac43 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 10 Jun 2017 10:10:45 +0100 Subject: [PATCH 014/136] [SL.Core] drop zero in favor of empty doing this to be consistent with System.Drawing.Primitives --- src/SixLabors.Core/Primitives/Point.cs | 5 ----- src/SixLabors.Core/Primitives/PointF.cs | 5 ----- src/SixLabors.Core/Primitives/Size.cs | 5 ----- src/SixLabors.Core/Primitives/SizeF.cs | 5 ----- 4 files changed, 20 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f922711aa2..04779ee9be 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -25,11 +25,6 @@ public struct Point : IEquatable /// public static readonly Point Empty = default(Point); - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly Point Zero = new Point(0, 0); - /// /// Initializes a new instance of the struct. /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 032ba67264..985eda0fe1 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -25,11 +25,6 @@ public struct PointF : IEquatable ///

public static readonly PointF Empty = default(PointF); - /// - /// Represents a that has X and Y values set to zero. - /// - public static readonly PointF Zero = new PointF(0, 0); - /// /// Initializes a new instance of the struct. /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index abc7ad4cb2..799768a8f3 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -23,11 +23,6 @@ public struct Size : IEquatable /// Represents a that has Width and Height values set to zero. ///
public static readonly Size Empty = default(Size); - /// - /// Represents a that has Width and Height values set to zero. - /// - public static readonly Size Zero = new Size(0, 0); - /// /// Initializes a new instance of the struct. diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index e356a4edbe..d1d05e5011 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -24,11 +24,6 @@ public struct SizeF : IEquatable /// public static readonly SizeF Empty = default(SizeF); - /// - /// Represents a that has Width and Height values set to zero. - /// - public static readonly SizeF Zero = new SizeF(0, 0); - /// /// Initializes a new instance of the struct. /// From 7e377e605dce6682ec81e90248db500c43fd20de Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 10 Jun 2017 13:13:30 +0100 Subject: [PATCH 015/136] [SL.Core] remove IsEmpty based ToString() branches --- src/SixLabors.Core/Primitives/Point.cs | 5 ----- src/SixLabors.Core/Primitives/PointF.cs | 5 ----- src/SixLabors.Core/Primitives/Rectangle.cs | 5 ----- src/SixLabors.Core/Primitives/RectangleF.cs | 5 ----- src/SixLabors.Core/Primitives/Size.cs | 5 ----- src/SixLabors.Core/Primitives/SizeF.cs | 5 ----- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/PointTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 7 ------- tests/SixLabors.Core.Tests/Primitives/SizeTests.cs | 7 ------- 11 files changed, 65 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 04779ee9be..ca808c7ef5 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -274,11 +274,6 @@ public void Offset(int dx, int dy) /// public override string ToString() { - if (this.IsEmpty) - { - return "Point [ Empty ]"; - } - return $"Point [ X={this.X}, Y={this.Y} ]"; } diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 985eda0fe1..e2bfa5e504 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -283,11 +283,6 @@ public void Offset(float dx, float dy) /// public override string ToString() { - if (this.IsEmpty) - { - return "PointF [ Empty ]"; - } - return $"PointF [ X={this.X}, Y={this.Y} ]"; } diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 735920f0a2..981eee523e 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -437,11 +437,6 @@ public void Offset(int dx, int dy) /// public override string ToString() { - if (this.IsEmpty) - { - return "Rectangle [ Empty ]"; - } - return $"Rectangle [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 36578a455b..a126008bf3 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -370,11 +370,6 @@ public void Offset(float dx, float dy) /// public override string ToString() { - if (this.IsEmpty) - { - return "RectangleF [ Empty ]"; - } - return $"RectangleF [ X={this.X}, Y={this.Y}, Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 799768a8f3..77aa037cf6 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -264,11 +264,6 @@ private static SizeF Multiply(Size size, float multiplier) => /// public override string ToString() { - if (this.IsEmpty) - { - return "Size [ Empty ]"; - } - return $"Size [ Width={this.Width}, Height={this.Height} ]"; } diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index d1d05e5011..9c44e23557 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -194,11 +194,6 @@ public override int GetHashCode() /// public override string ToString() { - if (this.IsEmpty) - { - return "SizeF [ Empty ]"; - } - return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; } diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 7406b10cda..b6294cb1a5 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -181,12 +181,5 @@ public void ToStringTest() var p = new PointF(5.1F, -5.123F); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } - - [Fact] - public void ToStringEmptyTest() - { - var p = new PointF(0, 0); - Assert.Equal("PointF [ Empty ]", p.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 495a34ff6a..3f17aebfcb 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -241,12 +241,5 @@ public void ToStringTest() var p = new Point(5, -5); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } - - [Fact] - public void ToStringEmptyTest() - { - var p = new Point(0, 0); - Assert.Equal("Point [ Empty ]", p.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 24ac4fae10..640b27d678 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -297,12 +297,5 @@ public void ToStringTest() var r = new Rectangle(5, -5, 0, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } - - [Fact] - public void ToStringTestEmpty() - { - var r = new Rectangle(0, 0, 0, 0); - Assert.Equal("Rectangle [ Empty ]", r.ToString()); - } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index e4dec3fd6a..1cd3858c2f 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -153,13 +153,6 @@ public void ToStringTest() Assert.Equal(string.Format(CultureInfo.CurrentCulture, "SizeF [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); } - [Fact] - public void ToStringTestEmpty() - { - var sz = new SizeF(0, 0); - Assert.Equal("SizeF [ Empty ]", sz.ToString()); - } - [Theory] [InlineData(1000.234f, 0.0f)] [InlineData(1000.234f, 1.0f)] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 821cf16914..0117e5914f 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -186,13 +186,6 @@ public void ToStringTest() Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Size [ Width={0}, Height={1} ]", sz.Width, sz.Height), sz.ToString()); } - [Fact] - public void ToStringTestEmpty() - { - var sz = new Size(0, 0); - Assert.Equal("Size [ Empty ]", sz.ToString()); - } - [Theory] [InlineData(1000, 0)] [InlineData(1000, 1)] From a2349bf0b8ebe60e449031873d3cdad4f4afdefb Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:06:07 +0200 Subject: [PATCH 016/136] [SL.Core] Moved files in the Shared folder. --- SixLabors.Core.sln | 9 +-------- .../Properties/AssemblyInfo.cs} | 1 + src/SixLabors.Core/SixLabors.Core.csproj | 4 ++-- src/SixLabors.Core/stylecop.json | 9 --------- src/Shared/stylecop.json => stylecop.json | 0 5 files changed, 4 insertions(+), 19 deletions(-) rename src/{Shared/AssemblyInfo.Common.cs => SixLabors.Core/Properties/AssemblyInfo.cs} (96%) delete mode 100644 src/SixLabors.Core/stylecop.json rename src/Shared/stylecop.json => stylecop.json (100%) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index 63fe397d4e..dbd9600ee2 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26430.12 +VisualStudioVersion = 15.0.26430.14 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject @@ -15,12 +15,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C06 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{9E574A07-F879-4811-9C41-5CBDC6BAFDB7}" - ProjectSection(SolutionItems) = preProject - src\Shared\AssemblyInfo.Common.cs = src\Shared\AssemblyInfo.Common.cs - src\Shared\stylecop.json = src\Shared\stylecop.json - EndProjectSection -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" @@ -44,7 +38,6 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {9E574A07-F879-4811-9C41-5CBDC6BAFDB7} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} EndGlobalSection diff --git a/src/Shared/AssemblyInfo.Common.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs similarity index 96% rename from src/Shared/AssemblyInfo.Common.cs rename to src/SixLabors.Core/Properties/AssemblyInfo.cs index c9cc15b730..8a219d50d1 100644 --- a/src/Shared/AssemblyInfo.Common.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -10,6 +10,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. +[assembly: AssemblyTitle("SixLabors.Primitives")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Six Labors")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index f7f25dfc18..5d03d443af 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -2,7 +2,6 @@ Low level primitives for use across Six Labors projects.. - SixLabors.Primitives $(packageversion) 0.1.0-alpha1 Six Labors @@ -26,12 +25,13 @@ false false false + false full SixLabors - + diff --git a/src/SixLabors.Core/stylecop.json b/src/SixLabors.Core/stylecop.json deleted file mode 100644 index de88a8bfe6..0000000000 --- a/src/SixLabors.Core/stylecop.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": { - "documentationRules": { - "companyName": "Six Labors", - "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." - } - } -} \ No newline at end of file diff --git a/src/Shared/stylecop.json b/stylecop.json similarity index 100% rename from src/Shared/stylecop.json rename to stylecop.json From 9b632f308bdce99a5d535c65a7be16d8e2da2c96 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:08:04 +0200 Subject: [PATCH 017/136] [SL.Core] Whitespace --- build.cmd | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build.cmd b/build.cmd index d1eaa59b01..eaa54e8616 100644 --- a/build.cmd +++ b/build.cmd @@ -2,14 +2,14 @@ if not "%GitVersion_NuGetVersion%" == "" ( dotnet restore /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet restore +)ELSE ( + dotnet restore ) ECHO Building nuget packages if not "%GitVersion_NuGetVersion%" == "" ( dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( +)ELSE ( dotnet build -c Release ) if not "%errorlevel%"=="0" goto failure @@ -19,7 +19,7 @@ dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( +)ELSE ( dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build ) From 1e43e5096cc776da531168eeff2a3f29a8c853e6 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:15:03 +0200 Subject: [PATCH 018/136] [SL.Core] Fixed version numbers --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 6 +++--- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 8a219d50d1..ab2cf3b4a8 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -30,9 +30,9 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] -[assembly: AssemblyInformationalVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] +[assembly: AssemblyInformationalVersion("0.1.0-alpha02")] // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 5d03d443af..66b67c535d 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -3,7 +3,7 @@ Low level primitives for use across Six Labors projects.. $(packageversion) - 0.1.0-alpha1 + 0.1.0-alpha2 Six Labors netstandard1.1 true From b89b4cf4438c896c52eb2fd1235d7bf37e0a905b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:17:30 +0200 Subject: [PATCH 019/136] [SL.Core] Renamed ruleset file. --- SixLabors.Core.ruleset => SixLabors.ruleset | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename SixLabors.Core.ruleset => SixLabors.ruleset (100%) diff --git a/SixLabors.Core.ruleset b/SixLabors.ruleset similarity index 100% rename from SixLabors.Core.ruleset rename to SixLabors.ruleset From 55a161570b2a2be87fc6573af745d8be52c1bcc2 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:21:59 +0200 Subject: [PATCH 020/136] [SL.Core] Enabled stylecop. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 4 ++-- src/SixLabors.Core/SixLabors.Core.csproj | 8 ++++++++ stylecop.json | 18 ++++++++++++------ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index ab2cf3b4a8..b7c0287db8 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,5 +1,5 @@ -// -// Copyright (c) Scott Williams and contributors. +// +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 66b67c535d..c479c3cc12 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -30,11 +30,19 @@ SixLabors + + ..\..\SixLabors.ruleset + + + + + All + diff --git a/stylecop.json b/stylecop.json index df3c8c9d8c..02d23f59d8 100644 --- a/stylecop.json +++ b/stylecop.json @@ -1,9 +1,15 @@ { - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": { - "documentationRules": { - "companyName": "Scott Williams", - "copyrightText": "Copyright (c) Scott Williams and contributors.\nLicensed under the Apache License, Version 2.0." + "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", + "settings": + { + "orderingRules": + { + "usingDirectivesPlacement": "outsideNamespace" + }, + "documentationRules": + { + "companyName": "Six Labors", + "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." + } } - } } \ No newline at end of file From f58afef9ef6457014c36c741ada3faee46fd8223 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:34:29 +0200 Subject: [PATCH 021/136] [SL.Core] Fixed all stylecop warnings. --- src/SixLabors.Core/HashHelpers.cs | 19 +++-- src/SixLabors.Core/MathF.cs | 6 +- .../Primitives/Matrix3x2Extensions.cs | 4 +- src/SixLabors.Core/Primitives/Point.cs | 38 +++++----- src/SixLabors.Core/Primitives/PointF.cs | 32 ++++----- src/SixLabors.Core/Primitives/Rectangle.cs | 36 +++++----- src/SixLabors.Core/Primitives/RectangleF.cs | 36 +++++----- src/SixLabors.Core/Primitives/Size.cs | 72 +++++++++---------- src/SixLabors.Core/Primitives/SizeF.cs | 64 ++++++++--------- 9 files changed, 157 insertions(+), 150 deletions(-) diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs index e481e03dae..39a94d989a 100644 --- a/src/SixLabors.Core/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -1,14 +1,21 @@ -using System; -using System.Collections.Generic; -using System.Text; +// +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. +// namespace SixLabors { - // lifted from coreFX repo + /// + /// Lifted from coreFX repo + /// internal static class HashHelpers { - public static readonly int RandomSeed = Guid.NewGuid().GetHashCode(); - + /// + /// Combines the two specified hash codes. + /// + /// Hash code one + /// Hash code two + /// Returns a hash code for the two specified has codes. public static int Combine(int h1, int h2) { unchecked diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index b05914e74a..d099cb3b82 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,11 +3,11 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.Runtime.CompilerServices; + namespace SixLabors { - using System; - using System.Runtime.CompilerServices; - /// /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. /// diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 626be8ed74..c54ce6593d 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -3,10 +3,10 @@ // Licensed under the Apache License, Version 2.0. // +using System.Numerics; + namespace SixLabors.Primitives { - using System.Numerics; - /// /// Extension methods for the struct. /// diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index ca808c7ef5..f216575722 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Represents an ordered pair of integer x- and y-coordinates that defines a point in /// a two-dimensional plane. @@ -182,7 +182,7 @@ public Point(Size size) /// Translates a by the negative of a given value /// /// The point on the left hand of the operand. - /// The size on the right hand of the operand. + /// The value on the right hand of the operand. /// The [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); @@ -212,6 +212,17 @@ public Point(Size size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); + /// + /// Transforms a point by the given matrix. + /// + /// The source point. + /// The transformation matrix. + /// A transformed point. + public static PointF Transform(Point position, Matrix3x2 matrix) + { + return Vector2.Transform(position, matrix); + } + /// /// Converts a to a by performing a truncate operation on all the coordinates. /// @@ -235,7 +246,7 @@ public Point(Size size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, System.Numerics.Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); /// /// Skews a point using the given skew matrix. @@ -244,7 +255,7 @@ public Point(Size size) /// Rotation matrix used /// The rotated [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, System.Numerics.Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); /// /// Translates this by the specified amount. @@ -289,16 +300,5 @@ public override string ToString() private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point - /// The transformation matrix. - /// - public static PointF Transform(Point position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index e2bfa5e504..b4ae390c30 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in /// a two-dimensional plane. @@ -258,6 +258,17 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); + /// + /// Transforms a point by the given matrix. + /// + /// The source point. + /// The transformation matrix. + /// A transformed point. + public static PointF Transform(PointF position, Matrix3x2 matrix) + { + return Vector2.Transform(position, matrix); + } + /// /// Translates this by the specified amount. /// @@ -303,16 +314,5 @@ public override string ToString() /// A 32-bit signed integer that is the hash code for this instance. /// private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point - /// The transformation matrix. - /// - public static PointF Transform(PointF position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 981eee523e..9969e9ba68 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores a set of four integers that represent the location and size of a rectangle. /// @@ -276,6 +276,19 @@ public static Rectangle Ceiling(RectangleF rectangle) } } + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle. + /// The transformation matrix. + /// A transformed rectangle. + public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) + { + PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = Point.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); + } + /// /// Converts a to a by performing a truncate operation on all the coordinates. /// @@ -455,18 +468,5 @@ private int GetHashCode(Rectangle rectangle) hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); return hashCode; } - - /// - /// Transforms a rectangle by the given matrix. - /// - /// The source rectangle - /// The transformation matrix. - /// - public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) - { - PointF bottomRight = Point.Transform(new Point(rectangle.Right, rectangle.Bottom), matrix); - PointF topLeft = Point.Transform(rectangle.Location, matrix); - return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a126008bf3..7069006e19 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores a set of four single precision floating points that represent the location and size of a rectangle. /// @@ -251,6 +251,19 @@ public static RectangleF Inflate(RectangleF rectangle, float x, float y) return r; } + /// + /// Transforms a rectangle by the given matrix. + /// + /// The source rectangle. + /// The transformation matrix. + /// A transformed rectangle. + public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) + { + PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); + PointF topLeft = PointF.Transform(rectangle.Location, matrix); + return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); + } + /// /// Creates a rectangle that represents the union between and . /// @@ -388,18 +401,5 @@ private int GetHashCode(RectangleF rectangle) hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); return hashCode; } - - /// - /// Transforms a rectangle by the given matrix. - /// - /// The source rectangle - /// The transformation matrix. - /// - public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) - { - PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); - PointF topLeft = PointF.Transform(rectangle.Location, matrix); - return new RectangleF(topLeft, new SizeF(bottomRight - topLeft)); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 77aa037cf6..893717a358 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores an ordered pair of integers, which specify a height and width. /// @@ -216,24 +216,6 @@ public Size(Point point) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); - /// - /// Multiplies by an producing . - /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type . - private static Size Multiply(Size size, int multiplier) => - new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); - - /// - /// Multiplies by a producing . - /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type SizeF. - private static SizeF Multiply(Size size, float multiplier) => - new SizeF(size.Width * multiplier, size.Height * multiplier); - /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// @@ -250,6 +232,19 @@ private static SizeF Multiply(Size size, float multiplier) => [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); + /// + /// Transforms a size by the given matrix. + /// + /// The source size + /// The transformation matrix. + /// A transformed size. + public static SizeF Transform(Size size, Matrix3x2 matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } + /// /// Converts a to a by performing a round operation on all the dimensions. /// @@ -274,6 +269,24 @@ public override string ToString() [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + /// + /// Multiplies by an producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type . + private static Size Multiply(Size size, int multiplier) => + new Size(unchecked(size.Width * multiplier), unchecked(size.Height * multiplier)); + + /// + /// Multiplies by a producing . + /// + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(Size size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); + /// /// Returns the hash code for this instance. /// @@ -284,18 +297,5 @@ public override string ToString() /// A 32-bit signed integer that is the hash code for this instance. /// private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); - - /// - /// Transforms a size by the given matrix. - /// - /// The source size - /// The transformation matrix. - /// - public static SizeF Transform(Size size, Matrix3x2 matrix) - { - var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); - - return new SizeF(v.X, v.Y); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 9c44e23557..af5d8b0bdf 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -3,13 +3,13 @@ // Licensed under the Apache License, Version 2.0. // +using System; +using System.ComponentModel; +using System.Numerics; +using System.Runtime.CompilerServices; + namespace SixLabors.Primitives { - using System; - using System.ComponentModel; - using System.Numerics; - using System.Runtime.CompilerServices; - /// /// Stores an ordered pair of single precision floating points, which specify a height and width. /// @@ -72,6 +72,16 @@ public SizeF(PointF point) [EditorBrowsable(EditorBrowsableState.Never)] public bool IsEmpty => this.Equals(Empty); + /// + /// Creates a with the coordinates of the specified . + /// + /// The point. + /// + /// The . + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); + /// /// Creates a with the dimensions of the specified by truncating each of the dimensions. /// @@ -177,13 +187,17 @@ public SizeF(PointF point) public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); /// - /// Multiplies by a producing . + /// Transforms a size by the given matrix. /// - /// Multiplicand of type . - /// Multiplier of type . - /// Product of type SizeF. - private static SizeF Multiply(SizeF size, float multiplier) => - new SizeF(size.Width * multiplier, size.Height * multiplier); + /// The source size. + /// The transformation matrix. + /// A transformed size. + public static SizeF Transform(SizeF size, Matrix3x2 matrix) + { + var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + + return new SizeF(v.X, v.Y); + } /// public override int GetHashCode() @@ -204,29 +218,15 @@ public override string ToString() [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(SizeF other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); - /// - /// Creates a with the coordinates of the specified . - /// - /// The point. - /// - /// The . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Vector2(SizeF point) => new Vector2(point.Width, point.Height); - - /// - /// Transforms a size by the given matrix. + /// Multiplies by a producing . /// - /// The source size - /// The transformation matrix. - /// - public static SizeF Transform(SizeF size, Matrix3x2 matrix) - { - var v = Vector2.Transform(new Vector2(size.Width, size.Height), matrix); + /// Multiplicand of type . + /// Multiplier of type . + /// Product of type SizeF. + private static SizeF Multiply(SizeF size, float multiplier) => + new SizeF(size.Width * multiplier, size.Height * multiplier); - return new SizeF(v.X, v.Y); - } + private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 0910b0ba36bfb337c104539380f43687b79a15d1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:35:54 +0200 Subject: [PATCH 022/136] [SL.Core] Changed copyright header. --- src/SixLabors.Core/Constants.cs | 4 +--- src/SixLabors.Core/HashHelpers.cs | 4 +--- src/SixLabors.Core/MathF.cs | 4 +--- src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs | 4 +--- src/SixLabors.Core/Primitives/Point.cs | 4 +--- src/SixLabors.Core/Primitives/PointF.cs | 4 +--- src/SixLabors.Core/Primitives/Rectangle.cs | 4 +--- src/SixLabors.Core/Primitives/RectangleF.cs | 4 +--- src/SixLabors.Core/Primitives/Size.cs | 4 +--- src/SixLabors.Core/Primitives/SizeF.cs | 4 +--- src/SixLabors.Core/Properties/AssemblyInfo.cs | 4 +--- stylecop.json | 2 +- 12 files changed, 12 insertions(+), 34 deletions(-) diff --git a/src/SixLabors.Core/Constants.cs b/src/SixLabors.Core/Constants.cs index 1d9dd24d9e..eda2f596f4 100644 --- a/src/SixLabors.Core/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// namespace SixLabors { diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/HashHelpers.cs index 39a94d989a..40a2b3f96a 100644 --- a/src/SixLabors.Core/HashHelpers.cs +++ b/src/SixLabors.Core/HashHelpers.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// namespace SixLabors { diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index d099cb3b82..a4ad9ed666 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.Runtime.CompilerServices; diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index c54ce6593d..80c4f46009 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System.Numerics; diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f216575722..1992d39226 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index b4ae390c30..454e69e5cb 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 9969e9ba68..27cba5d15e 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 7069006e19..09fa6f1ab4 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 893717a358..57884cf5dc 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index af5d8b0bdf..13c6552ac3 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System; using System.ComponentModel; diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index b7c0287db8..8b03160713 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,7 +1,5 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// using System.Reflection; using System.Resources; diff --git a/stylecop.json b/stylecop.json index 02d23f59d8..c67c0db325 100644 --- a/stylecop.json +++ b/stylecop.json @@ -8,7 +8,7 @@ }, "documentationRules": { - "companyName": "Six Labors", + "xmlHeader": false, "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." } } From 3863e7ee57b1c37a37ec8658b4faa9a928fa8ed1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:36:53 +0200 Subject: [PATCH 023/136] [SL.Core] Moved HashHelpers to a folder. --- src/SixLabors.Core/{ => Helpers}/HashHelpers.cs | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/SixLabors.Core/{ => Helpers}/HashHelpers.cs (100%) diff --git a/src/SixLabors.Core/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs similarity index 100% rename from src/SixLabors.Core/HashHelpers.cs rename to src/SixLabors.Core/Helpers/HashHelpers.cs From d99554be37a59ee248970913bb1af54d73fa1b89 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 14:43:52 +0200 Subject: [PATCH 024/136] [SL.Core] Fixed value in attribute. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 8b03160713..b24029bb01 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -8,7 +8,7 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("SixLabors.Primitives")] +[assembly: AssemblyTitle("SixLabors.Core")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("Six Labors")] From 4b940f129420ca944a99a7e02135bb9cf8cb6c8c Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 15:08:07 +0200 Subject: [PATCH 025/136] [SL.Core] Added guards from the ImageSharp project and added InternalsVisibleTo to make sure they can be used. --- src/SixLabors.Core/Helpers/DebugGuard.cs | 201 ++++++++++++++ src/SixLabors.Core/Helpers/Guard.cs | 250 ++++++++++++++++++ src/SixLabors.Core/Properties/AssemblyInfo.cs | 6 + src/SixLabors.Core/SixLabors.Core.csproj | 1 + 4 files changed, 458 insertions(+) create mode 100644 src/SixLabors.Core/Helpers/DebugGuard.cs create mode 100644 src/SixLabors.Core/Helpers/Guard.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs new file mode 100644 index 0000000000..f20a763aa7 --- /dev/null +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -0,0 +1,201 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Diagnostics; + +namespace SixLabors +{ + /// + /// Provides methods to protect against invalid parameters for a DEBUG build. + /// + [DebuggerStepThrough] + internal static class DebugGuard + { + /// + /// Verifies, that the method parameter with specified object value is not null + /// and throws an exception if it is found to be so. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// is null + [Conditional("DEBUG")] + public static void NotNull(object target, string parameterName) + { + if (target == null) + { + throw new ArgumentNullException(parameterName); + } + } + + /// + /// Verifies that the specified value is less than a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + [Conditional("DEBUG")] + public static void MustBeLessThan(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) >= 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + } + } + + /// + /// Verifies that the specified value is less than or equal to a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + [Conditional("DEBUG")] + public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + } + } + + /// + /// Verifies that the specified value is greater than a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + [Conditional("DEBUG")] + public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) <= 0) + { + throw new ArgumentOutOfRangeException( + parameterName, + $"Value must be greater than {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + [Conditional("DEBUG")] + public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// + /// The target value, which cannot be false. + /// + /// + /// The name of the parameter that is to be checked. + /// + /// + /// The error message, if any to add to the exception. + /// + /// + /// is false + /// + [Conditional("DEBUG")] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the target span is of same size than the 'other' span. + /// + /// The element type of the spans + /// The target span. + /// The 'other' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSameSized(Span target, Span other, string parameterName) + where T : struct + { + if (target.Length != other.Length) + { + throw new ArgumentException("Span-s must be the same size!", parameterName); + } + } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The 'minSpan' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + where T : struct + { + if (target.Length < minSpan.Length) + { + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + } + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs new file mode 100644 index 0000000000..9901877726 --- /dev/null +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -0,0 +1,250 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; + +namespace SixLabors +{ + /// + /// Provides methods to protect against invalid parameters. + /// + [DebuggerStepThrough] + internal static class Guard + { + /// + /// Verifies, that the method parameter with specified object value is not null + /// and throws an exception if it is found to be so. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// is null + public static void NotNull(object target, string parameterName, string message = "") + { + if (target == null) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentNullException(parameterName, message); + } + + throw new ArgumentNullException(parameterName); + } + } + + /// + /// Verifies, that the string method parameter with specified object value and message + /// is not null, not empty and does not contain only blanks and throws an exception + /// if the object is null. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// The error message, if any to add to the exception. + /// is null. + /// is empty or contains only blanks. + public static void NotNullOrEmpty(string target, string parameterName, string message = "") + { + NotNull(target, parameterName, message); + + if (string.IsNullOrWhiteSpace(target)) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentException(message, parameterName); + } + + throw new ArgumentException("Value cannot be null or empty and cannot contain only blanks.", parameterName); + } + } + + /// + /// Verifies, that the enumeration is not null and not empty. + /// + /// The type of objects in the + /// The target enumeration, which should be checked against being null or empty. + /// Name of the parameter. + /// The error message, if any to add to the exception. + /// is null. + /// is empty. + public static void NotNullOrEmpty(IEnumerable target, string parameterName, string message = "") + { + NotNull(target, parameterName, message); + + if (!target.Any()) + { + if (!string.IsNullOrWhiteSpace(message)) + { + throw new ArgumentException(message, parameterName); + } + + throw new ArgumentException("Value cannot be empty.", parameterName); + } + } + + /// + /// Verifies that the specified value is less than a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + public static void MustBeLessThan(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) >= 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + } + } + + /// + /// Verifies that the specified value is less than or equal to a maximum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is greater than the maximum value. + /// + public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + } + } + + /// + /// Verifies that the specified value is greater than a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) <= 0) + { + throw new ArgumentOutOfRangeException( + parameterName, + $"Value must be greater than {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value + /// and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value. + /// + public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + } + } + + /// + /// Verifies that the specified value is greater than or equal to a minimum value and less than + /// or equal to a maximum value and throws an exception if it is not. + /// + /// The target value, which should be validated. + /// The minimum value. + /// The maximum value. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value of greater than the maximum value. + /// + public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) + { + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// + /// The target value, which cannot be false. + /// + /// + /// The name of the parameter that is to be checked. + /// + /// + /// The error message, if any to add to the exception. + /// + /// + /// is false + /// + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true + /// + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + throw new ArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + public static void MustBeSizedAtLeast(Span target, int minLength, string parameterName) + { + if (target.Length < minLength) + { + throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + } +} diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index b24029bb01..559a161d52 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -34,3 +34,9 @@ // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] + +// Ensure the internals are visible to the other projects. +[assembly: InternalsVisibleTo("SixLabors.Exif")] +[assembly: InternalsVisibleTo("SixLabors.Fonts")] +[assembly: InternalsVisibleTo("SixLabors.ImageSharp")] +[assembly: InternalsVisibleTo("SixLabors.Shapes")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index c479c3cc12..57422a9c17 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -44,6 +44,7 @@ All + \ No newline at end of file From 4f06b519a327035b16aafa94993281d344bae2f8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 16:56:30 +0200 Subject: [PATCH 026/136] [SL.Core] Switch to ReadOnlySpan. --- src/SixLabors.Core/Helpers/DebugGuard.cs | 4 ++-- src/SixLabors.Core/Helpers/Guard.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f20a763aa7..7850545f34 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -169,7 +169,7 @@ public static void IsFalse(bool target, string parameterName, string message) /// is true /// [Conditional("DEBUG")] - public static void MustBeSameSized(Span target, Span other, string parameterName) + public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan other, string parameterName) where T : struct { if (target.Length != other.Length) @@ -189,7 +189,7 @@ public static void MustBeSameSized(Span target, Span other, string para /// is true /// [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan minSpan, string parameterName) where T : struct { if (target.Length < minSpan.Length) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 9901877726..e433de44e8 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -239,7 +239,7 @@ public static void IsFalse(bool target, string parameterName, string message) /// /// is true /// - public static void MustBeSizedAtLeast(Span target, int minLength, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan target, int minLength, string parameterName) { if (target.Length < minLength) { From d53a5ca0a5b799c6b16031a079c9e204bd3dec6d Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 16:57:46 +0200 Subject: [PATCH 027/136] [SL.Core] Added SixLabors.ImageSharp.Drawing to the InternalsVisibleTo. --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 559a161d52..368bab2485 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -39,4 +39,5 @@ [assembly: InternalsVisibleTo("SixLabors.Exif")] [assembly: InternalsVisibleTo("SixLabors.Fonts")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] +[assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] From cba462aa223b3d6bea24755e34a85be6054684d0 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sun, 25 Jun 2017 16:19:39 +0100 Subject: [PATCH 028/136] [SL.Core] push develop branch to an unstable feed for now --- appveyor.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index edb297ed48..fd038f953e 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,6 +24,16 @@ deploy: artifact: /.*\.nupkg/ on: branch: master + +deploy: + - provider: NuGet + server: https://www.myget.org/F/sixlabors-unstable/api/v2/package + symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package + api_key: + secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 + artifact: /.*\.nupkg/ + on: + branch: develop # prevent the double build when a branch has an active PR skip_branch_with_pr: true From 403a1bd94d570f41396f90a4897f5f23db970c2f Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sun, 25 Jun 2017 16:20:20 +0100 Subject: [PATCH 029/136] [SL.Core] woops added duplicate section --- appveyor.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index fd038f953e..5a74728faf 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -24,8 +24,6 @@ deploy: artifact: /.*\.nupkg/ on: branch: master - -deploy: - provider: NuGet server: https://www.myget.org/F/sixlabors-unstable/api/v2/package symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package From 80e6911b7474238bfb9008503b212df0ef308f4f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:40:45 +0200 Subject: [PATCH 030/136] [SL.Core] Move ruleset into src folder. --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- SixLabors.ruleset => src/SixLabors.ruleset | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename SixLabors.ruleset => src/SixLabors.ruleset (100%) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 57422a9c17..37d4b90130 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -31,7 +31,7 @@ - ..\..\SixLabors.ruleset + ..\SixLabors.ruleset diff --git a/SixLabors.ruleset b/src/SixLabors.ruleset similarity index 100% rename from SixLabors.ruleset rename to src/SixLabors.ruleset From 5ac709d8890530e4dd4b1a07709f242825549dbc Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:50:15 +0200 Subject: [PATCH 031/136] [SL.Core] Added stylecop to the test project. --- .../Primitives/PointFTests.cs | 24 +++++------ .../Primitives/PointTests.cs | 23 +++++------ .../Primitives/RectangleFTests.cs | 41 +++++++++---------- .../Primitives/RectangleTests.cs | 33 +++++++-------- .../Primitives/SizeFTests.cs | 22 +++++----- .../Primitives/SizeTests.cs | 22 ++++------ .../SixLabors.Core.Tests.csproj | 10 +++++ tests/SixLabors.ruleset | 10 +++++ 8 files changed, 94 insertions(+), 91 deletions(-) create mode 100644 tests/SixLabors.ruleset diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index b6294cb1a5..5a29d1cff6 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -1,22 +1,20 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Numerics; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Numerics; - using System.Reflection; - using Xunit; - public class PointFTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(PointF.Empty, new PointF()); + Assert.Equal(PointF.Empty, default(PointF)); } [Theory] @@ -37,7 +35,7 @@ public void NonDefaultConstructorTest(float x, float y) public void IsEmptyDefaultsTest() { Assert.True(PointF.Empty.IsEmpty); - Assert.True(new PointF().IsEmpty); + Assert.True(default(PointF).IsEmpty); Assert.True(new PointF(0, 0).IsEmpty); } @@ -151,7 +149,7 @@ public void EqualityTest(float x, float y) } [Fact] - public static void EqualityTest_NotPointF() + public void EqualityTest_NotPointF() { var point = new PointF(0, 0); Assert.False(point.Equals(null)); @@ -167,7 +165,7 @@ public static void EqualityTest_NotPointF() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var point = new PointF(10, 10); Assert.Equal(point.GetHashCode(), new PointF(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 3f17aebfcb..a1880d0e1e 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,21 +1,18 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System.Globalization; +using System.Numerics; +using Xunit; namespace SixLabors.Primitives.Tests { - using System.Globalization; - using System.Numerics; - - using Xunit; - public class PointTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(Point.Empty, new Point()); + Assert.Equal(Point.Empty, default(Point)); } [Theory] @@ -47,7 +44,7 @@ public void SingleIntConstructorTest(int x) public void IsEmptyDefaultsTest() { Assert.True(Point.Empty.IsEmpty); - Assert.True(new Point().IsEmpty); + Assert.True(default(Point).IsEmpty); Assert.True(new Point(0, 0).IsEmpty); } @@ -186,7 +183,7 @@ public void SkewTest() public void EqualityTest(int x, int y) { var p1 = new Point(x, y); - var p2 = new Point(x / 2 - 1, y / 2 - 1); + var p2 = new Point((x / 2) - 1, (y / 2) - 1); var p3 = new Point(x, y); Assert.True(p1 == p3); @@ -205,7 +202,7 @@ public void EqualityTest(int x, int y) } [Fact] - public static void EqualityTest_NotPoint() + public void EqualityTest_NotPoint() { var point = new Point(0, 0); Assert.False(point.Equals(null)); @@ -214,7 +211,7 @@ public static void EqualityTest_NotPoint() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var point = new Point(10, 10); Assert.Equal(point.GetHashCode(), new Point(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 4dc7d9d35a..a202cc6dea 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -1,16 +1,13 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Reflection; - - using Xunit; - /// /// Tests the struct. /// @@ -19,7 +16,7 @@ public class RectangleFTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(RectangleF.Empty, new RectangleF()); + Assert.Equal(RectangleF.Empty, default(RectangleF)); } [Theory] @@ -77,7 +74,7 @@ public void DimensionsTest(float x, float y, float width, float height) public void IsEmptyTest() { Assert.True(RectangleF.Empty.IsEmpty); - Assert.True(new RectangleF().IsEmpty); + Assert.True(default(RectangleF).IsEmpty); Assert.True(new RectangleF(1, -2, -10, 10).IsEmpty); Assert.True(new RectangleF(1, -2, 10, -10).IsEmpty); Assert.True(new RectangleF(1, -2, 0, 0).IsEmpty); @@ -88,7 +85,7 @@ public void IsEmptyTest() [Theory] [InlineData(0, 0)] [InlineData(float.MaxValue, float.MinValue)] - public static void LocationSetTest(float x, float y) + public void LocationSetTest(float x, float y) { var point = new PointF(x, y); var rect = new RectangleF(10, 10, 10, 10) { Location = point }; @@ -100,7 +97,7 @@ public static void LocationSetTest(float x, float y) [Theory] [InlineData(0, 0)] [InlineData(float.MaxValue, float.MinValue)] - public static void SizeSetTest(float x, float y) + public void SizeSetTest(float x, float y) { var size = new SizeF(x, y); var rect = new RectangleF(10, 10, 10, 10) { Size = size }; @@ -125,7 +122,7 @@ public void EqualityTest(float x, float y, float width, float height) } [Fact] - public static void EqualityTestNotRectangleF() + public void EqualityTestNotRectangleF() { var rectangle = new RectangleF(0, 0, 0, 0); Assert.False(rectangle.Equals(null)); @@ -141,7 +138,7 @@ public static void EqualityTestNotRectangleF() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var rect1 = new RectangleF(10, 10, 10, 10); var rect2 = new RectangleF(10, 10, 10, 10); @@ -158,12 +155,12 @@ public static void GetHashCodeTest() public void ContainsTest(float x, float y, float width, float height) { var rect = new RectangleF(x, y, width, height); - float X = (x + width) / 2; - float Y = (y + height) / 2; - var p = new PointF(X, Y); - var r = new RectangleF(X, Y, width / 2, height / 2); + float x1 = (x + width) / 2; + float y1 = (y + height) / 2; + var p = new PointF(x1, y1); + var r = new RectangleF(x1, y1, width / 2, height / 2); - Assert.False(rect.Contains(X, Y)); + Assert.False(rect.Contains(x1, y1)); Assert.False(rect.Contains(p)); Assert.False(rect.Contains(r)); } @@ -175,7 +172,7 @@ public void ContainsTest(float x, float y, float width, float height) public void InflateTest(float x, float y, float width, float height) { var rect = new RectangleF(x, y, width, height); - var inflatedRect = new RectangleF(x - width, y - height, width + 2 * width, height + 2 * height); + var inflatedRect = new RectangleF(x - width, y - height, width + (2 * width), height + (2 * height)); rect.Inflate(width, height); Assert.Equal(inflatedRect, rect); @@ -201,7 +198,7 @@ public void IntersectTest(float x, float y, float width, float height) } [Fact] - public static void IntersectIntersectingRectsTest() + public void IntersectIntersectingRectsTest() { var rect1 = new RectangleF(0, 0, 5, 5); var rect2 = new RectangleF(1, 1, 3, 3); diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 640b27d678..90354bd72e 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -1,15 +1,12 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - - using Xunit; - /// /// Tests the struct. /// @@ -18,7 +15,7 @@ public class RectangleTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Rectangle.Empty, new Rectangle()); + Assert.Equal(Rectangle.Empty, default(Rectangle)); } [Theory] @@ -51,8 +48,8 @@ public void FromLTRBTest(int left, int top, int right, int bottom) public void EmptyTest() { Assert.True(Rectangle.Empty.IsEmpty); + Assert.True(default(Rectangle).IsEmpty); Assert.True(new Rectangle(0, 0, 0, 0).IsEmpty); - Assert.True(new Rectangle().IsEmpty); } [Theory] @@ -107,7 +104,7 @@ public void DimensionsTest(int x, int y, int width, int height) [Theory] [InlineData(0, 0)] [InlineData(int.MaxValue, int.MinValue)] - public static void LocationSetTest(int x, int y) + public void LocationSetTest(int x, int y) { var point = new Point(x, y); var rect = new Rectangle(10, 10, 10, 10) { Location = point }; @@ -119,7 +116,7 @@ public static void LocationSetTest(int x, int y) [Theory] [InlineData(0, 0)] [InlineData(int.MaxValue, int.MinValue)] - public static void SizeSetTest(int x, int y) + public void SizeSetTest(int x, int y) { var size = new Size(x, y); var rect = new Rectangle(10, 10, 10, 10) { Size = size }; @@ -145,7 +142,7 @@ public void EqualityTest(int x, int y, int width, int height) } [Fact] - public static void EqualityTestNotRectangle() + public void EqualityTestNotRectangle() { var rectangle = new Rectangle(0, 0, 0, 0); Assert.False(rectangle.Equals(null)); @@ -154,7 +151,7 @@ public static void EqualityTestNotRectangle() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var rect1 = new Rectangle(10, 10, 10, 10); var rect2 = new Rectangle(10, 10, 10, 10); @@ -193,7 +190,7 @@ public void RectangleFConversionTest(float x, float y, float width, float height [InlineData(0, int.MinValue, int.MaxValue, 0)] public void ContainsTest(int x, int y, int width, int height) { - var rect = new Rectangle(unchecked(2 * x - width), unchecked(2 * y - height), width, height); + var rect = new Rectangle(unchecked((2 * x) - width), unchecked((2 * y) - height), width, height); var p = new Point(x, y); var r = new Rectangle(x, y, width / 2, height / 2); @@ -211,7 +208,7 @@ public void InflateTest(int x, int y, int width, int height) Rectangle inflatedRect, rect = new Rectangle(x, y, width, height); unchecked { - inflatedRect = new Rectangle(x - width, y - height, width + 2 * width, height + 2 * height); + inflatedRect = new Rectangle(x - width, y - height, width + (2 * width), height + (2 * height)); } Assert.Equal(inflatedRect, Rectangle.Inflate(rect, width, height)); @@ -222,7 +219,7 @@ public void InflateTest(int x, int y, int width, int height) var s = new Size(x, y); unchecked { - inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + 2 * x, rect.Height + 2 * y); + inflatedRect = new Rectangle(rect.X - x, rect.Y - y, rect.Width + (2 * x), rect.Height + (2 * y)); } rect.Inflate(s); @@ -243,7 +240,7 @@ public void IntersectTest(int x, int y, int width, int height) } [Fact] - public static void IntersectIntersectingRectsTest() + public void IntersectIntersectingRectsTest() { var rect1 = new Rectangle(0, 0, 5, 5); var rect2 = new Rectangle(1, 1, 3, 3); diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 1cd3858c2f..04363fa943 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,21 +1,19 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using System.Reflection; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using System.Reflection; - using Xunit; - public class SizeFTests { [Fact] public void DefaultConstructorTest() { - Assert.Equal(SizeF.Empty, new SizeF()); + Assert.Equal(SizeF.Empty, default(SizeF)); } [Theory] @@ -47,7 +45,7 @@ public void NonDefaultConstructorAndDimensionsTest(float width, float height) public void IsEmptyDefaultsTest() { Assert.True(SizeF.Empty.IsEmpty); - Assert.True(new SizeF().IsEmpty); + Assert.True(default(SizeF).IsEmpty); Assert.True(new SizeF(0, 0).IsEmpty); } @@ -106,7 +104,7 @@ public void EqualityTest(float width, float height) } [Fact] - public static void EqualityTest_NotSizeF() + public void EqualityTest_NotSizeF() { var size = new SizeF(0, 0); Assert.False(size.Equals(null)); @@ -122,7 +120,7 @@ public static void EqualityTest_NotSizeF() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var size = new SizeF(10, 10); Assert.Equal(size.GetHashCode(), new SizeF(10, 10).GetHashCode()); diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 0117e5914f..0cfb62dd5c 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -1,14 +1,12 @@ -// -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -// + +using System; +using System.Globalization; +using Xunit; namespace SixLabors.Primitives.Tests { - using System; - using System.Globalization; - using Xunit; - /// /// Tests the struct. /// @@ -17,7 +15,7 @@ public class SizeTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Size.Empty, new Size()); + Assert.Equal(Size.Empty, default(Size)); } [Theory] @@ -43,7 +41,7 @@ public void NonDefaultConstructorTest(int width, int height) public void IsEmptyDefaultsTest() { Assert.True(Size.Empty.IsEmpty); - Assert.True(new Size().IsEmpty); + Assert.True(default(Size).IsEmpty); Assert.True(new Size(0, 0).IsEmpty); } @@ -162,7 +160,7 @@ public void EqualityTest(int width, int height) } [Fact] - public static void EqualityTest_NotSize() + public void EqualityTest_NotSize() { var size = new Size(0, 0); Assert.False(size.Equals(null)); @@ -171,7 +169,7 @@ public static void EqualityTest_NotSize() } [Fact] - public static void GetHashCodeTest() + public void GetHashCodeTest() { var size = new Size(10, 10); Assert.Equal(size.GetHashCode(), new Size(10, 10).GetHashCode()); @@ -238,7 +236,6 @@ public void MultiplicationTestSizeIntWidthHeightMultiplier(int width, int height Assert.Equal(mulExpected, multiplier * sz1); } - [Theory] [InlineData(1000, 0.0f)] [InlineData(1000, 1.0f)] @@ -285,7 +282,6 @@ public void MultiplicationTestSizeFloatWidthHeightMultiplier(int width, int heig Assert.Equal(mulExpected, multiplier * sz1); } - [Fact] public void DivideByZeroChecks() { diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index cd34a8421a..a80bf5a60e 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -16,7 +16,17 @@ SixLabors.Tests + + ..\SixLabors.ruleset + + + + + + + + diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset new file mode 100644 index 0000000000..9729157125 --- /dev/null +++ b/tests/SixLabors.ruleset @@ -0,0 +1,10 @@ + + + + + + + + + + From a3532338c374472c15930869d7fcf6e187772d44 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:56:45 +0200 Subject: [PATCH 032/136] [SL.Core] Added CodeCoverage.cmd to the solution. --- SixLabors.Core.sln | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index dbd9600ee2..c1f05176ce 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -19,6 +19,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLa EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeCoverage", "CodeCoverage", "{10A74B46-930F-49E3-A579-BC3A6A23321D}" + ProjectSection(SolutionItems) = preProject + tests\CodeCoverage\CodeCoverage.cmd = tests\CodeCoverage\CodeCoverage.cmd + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -40,6 +45,7 @@ Global GlobalSection(NestedProjects) = preSolution {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} + {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true From 4b5485f408c4e5962cccfb6ad66371f4f2fdf3b5 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 17:58:07 +0200 Subject: [PATCH 033/136] [SL.Core] Use release build for code coverage. --- tests/CodeCoverage/CodeCoverage.cmd | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index 7a89ab210e..d5318bf7a6 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -7,12 +7,10 @@ nuget restore packages.config -PackagesDirectory . cd .. cd .. -dotnet restore SixLabors.Core.sln -dotnet build SixLabors.Core.sln --no-incremental -c debug /p:codecov=true - -rem The -threshold options prevents this taking ages... -rem tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Shapes.Tests\SixLabors.Shapes.Tests.csproj --no-build -c Release /p:codecov=true" -threshold:10 -register:user -filter:"+[SixLabors.Shapes*]*" -excludebyattribute:*.ExcludeFromCodeCoverage* -hideskipped:All -returntargetcode -output:.\SixLabors.Shapes.Coverage.xml -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c debug" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" +dotnet restore SixLabors.Core.sln +dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true + +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% From 9c71c0fc22f70cd8cda211689e851b95678f3261 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:11:07 +0200 Subject: [PATCH 034/136] [SL.Core] Removed old test. --- tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index a202cc6dea..463509eac8 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -252,13 +252,5 @@ public void ToStringTest() var r = new RectangleF(5, 5.1F, 1.3F, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } - - [InlineData(0, 0, 0, 0)] - [InlineData(5, -5, 0.2, -1.3)] - public void ToStringTestEmpty(float x, float y, float width, float height) - { - var r = new RectangleF(x, y, width, height); - Assert.Equal("RectangleF [ Empty ]", r.ToString()); - } } } \ No newline at end of file From 5b38dc136282fa1fd82dc43699afa109fa1367c6 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:14:34 +0200 Subject: [PATCH 035/136] [SL.Core] Added yml files to the solution. --- SixLabors.Core.sln | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index c1f05176ce..d10b177877 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -8,6 +8,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt .editorconfig = .editorconfig appveyor.yml = appveyor.yml build.cmd = build.cmd + codecov.yml = codecov.yml + gitversion.yml = gitversion.yml README.md = README.md EndProjectSection EndProject From 3b6d794dbe981ef6dca198d1257a02a4624a3b7b Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 18:14:51 +0200 Subject: [PATCH 036/136] [SL.Core] Changed codecov to use the develop branch. --- codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/codecov.yml b/codecov.yml index cadf5c5da6..ad0b0be56b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,4 +1,5 @@ codecov: + branch: develop notify: require_ci_to_pass: true comment: off From 9b9306e73f14a7a6c7847161f5efe5b7e174897e Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:21:41 +0200 Subject: [PATCH 037/136] [SL.Core] Added unit tests for the Guard class. --- src/SixLabors.Core/Helpers/Guard.cs | 44 ++- .../Helpers/GuardTests.cs | 286 ++++++++++++++++++ 2 files changed, 307 insertions(+), 23 deletions(-) create mode 100644 tests/SixLabors.Core.Tests/Helpers/GuardTests.cs diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index e433de44e8..4a738d8b36 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -56,7 +56,7 @@ public static void NotNullOrEmpty(string target, string parameterName, string me throw new ArgumentException(message, parameterName); } - throw new ArgumentException("Value cannot be null or empty and cannot contain only blanks.", parameterName); + throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); } } @@ -92,7 +92,7 @@ public static void NotNullOrEmpty(IEnumerable target, string parameterName /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// public static void MustBeLessThan(TValue value, TValue max, string parameterName) @@ -112,7 +112,7 @@ public static void MustBeLessThan(TValue value, TValue max, string param /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) @@ -132,7 +132,7 @@ public static void MustBeLessThanOrEqualTo(TValue value, TValue max, str /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) @@ -140,9 +140,7 @@ public static void MustBeGreaterThan(TValue value, TValue min, string pa { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException( - parameterName, - $"Value must be greater than {min}."); + throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than {min}."); } } @@ -154,7 +152,7 @@ public static void MustBeGreaterThan(TValue value, TValue min, string pa /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) @@ -175,7 +173,7 @@ public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value of greater than the maximum value. /// public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) @@ -191,7 +189,7 @@ public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TVal /// Verifies, that the method parameter with specified target value is true /// and throws an exception if it is found to be so. /// - /// + /// /// The target value, which cannot be false. /// /// @@ -201,11 +199,11 @@ public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TVal /// The error message, if any to add to the exception. /// /// - /// is false + /// is false /// - public static void IsTrue(bool target, string parameterName, string message) + public static void IsTrue(bool value, string parameterName, string message) { - if (!target) + if (!value) { throw new ArgumentException(message, parameterName); } @@ -215,35 +213,35 @@ public static void IsTrue(bool target, string parameterName, string message) /// Verifies, that the method parameter with specified target value is false /// and throws an exception if it is found to be so. /// - /// The target value, which cannot be true. + /// The target value, which cannot be true. /// The name of the parameter that is to be checked. /// The error message, if any to add to the exception. /// - /// is true + /// is true /// - public static void IsFalse(bool target, string parameterName, string message) + public static void IsFalse(bool value, string parameterName, string message) { - if (target) + if (value) { throw new ArgumentException(message, parameterName); } } /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// Verifies, that the `target` span has the length of 'minLength', or longer. /// /// The element type of the spans - /// The target span. + /// The target span. /// The minimum length. /// The name of the parameter that is to be checked. /// - /// is true + /// The length of is less than . /// - public static void MustBeSizedAtLeast(ReadOnlySpan target, int minLength, string parameterName) + public static void MustBeSizedAtLeast(ReadOnlySpan value, int minLength, string parameterName) { - if (target.Length < minLength) + if (value.Length < minLength) { - throw new ArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); } } } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs new file mode 100644 index 0000000000..c91ebbcd6f --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -0,0 +1,286 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace SixLabors.Helpers.Tests +{ + public class GuardTests + { + [Fact] + public void NotNull_TargetNotNull_ThrowsNoException() + { + Guard.NotNull("test", "myParamName"); + } + + [Fact] + public void NotNull_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNull(null, "myParamName"); + }); + } + + [Fact] + public void NotNull_TargetNullWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNull(null, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() + { + Guard.NotNullOrEmpty("test", "myParamName"); + } + + [Fact] + public void NotNullOrEmpty_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty(null, "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmpty_TargetWhitespace_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty("\n\n", "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmpty_TargetEmpty_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(string.Empty, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); + } + + [Fact] + public void NotNullOrEmpty_TargetEmptyWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(string.Empty, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() + { + Guard.NotNullOrEmpty(new string[] { "test" }, "myParamName"); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + Guard.NotNullOrEmpty((IEnumerable)null, "myParamName"); + }); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetEmpty_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(new string[] { }, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("Value cannot be empty.")); + } + + [Fact] + public void NotNullOrEmptyIEnumerable_TargetEmptyWithMessage_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.NotNullOrEmpty(new string[] { }, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void MustBeLessThan_IsLess_ThrowsNoException() + { + Guard.MustBeLessThan(0, 1, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) + { + var exception = Assert.Throws(() => + { + Guard.MustBeLessThan(value, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) + { + Guard.MustBeLessThanOrEqualTo(value, max, "myParamName"); + } + + [Fact] + public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + } + + [Fact] + public void MustBeGreaterThan_IsGreater_ThrowsNoException() + { + Guard.MustBeGreaterThan(2, 1, "myParamName"); + } + + [Theory] + [InlineData(1, 2)] + [InlineData(1, 1)] + public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) + { + var exception = Assert.Throws(() => + { + Guard.MustBeGreaterThan(value, min, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) + { + Guard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); + } + + [Fact] + public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + } + + [Theory] + [InlineData(1, 1, 3)] + [InlineData(2, 1, 3)] + [InlineData(3, 1, 3)] + public void MustBeBetweenOrEqualTo_IsBetweenOrEqual_ThrowsNoException(int value, int min, int max) + { + Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); + } + + [Theory] + [InlineData(0, 1, 3)] + [InlineData(4, 1, 3)] + public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) + { + var exception = Assert.Throws(() => + { + Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); + } + + [Fact] + public void IsTrue_IsTrue_ThrowsNoException() + { + Guard.IsTrue(true, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsTrue_IsFalse_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.IsTrue(false, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void IsFalse_IsFalse_ThrowsNoException() + { + Guard.IsFalse(false, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsFalse_IsTrue_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.IsFalse(true, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Theory] + [InlineData(new int[] { 1, 2 }, 1)] + [InlineData(new int[] { 1, 2 }, 2)] + public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + { + Guard.MustBeSizedAtLeast(value, minLength, "myParamName"); + } + + [Fact] + public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } + } +} From 008d185271db23b1d52c28ec1ad34e730627e01f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:37:50 +0200 Subject: [PATCH 038/136] [SL.Core] Added some of the badges to the README. --- README.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b92ec28f7..71a287513a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,10 @@ -# Core -Point, Rectangle, Size Primitives for use across SixLabors libraries. +# SixLabers.Core + +**SixLabors.Core** provides classes for use across SixLabors libraries. + +[![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) +[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) + +[![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) +[![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) +[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) \ No newline at end of file From 2df68dc7a878659c8d1b9dcc18403f75996c2ab2 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Sun, 25 Jun 2017 19:42:18 +0200 Subject: [PATCH 039/136] [SL.Core] Added build status badge. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 71a287513a..a2f16a7394 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,7 @@ **SixLabors.Core** provides classes for use across SixLabors libraries. +[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) [![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) [![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) From d5407856baeb42a10fcd4ba1c0f1016af2105970 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Mon, 26 Jun 2017 20:55:00 +0100 Subject: [PATCH 040/136] [SL.Core] Add test for DebugGuard --- src/SixLabors.Core/Helpers/DebugGuard.cs | 60 ++++ .../Helpers/DebugGuardTests.cs | 260 ++++++++++++++++++ 2 files changed, 320 insertions(+) create mode 100644 tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 7850545f34..e836a1bba4 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -178,6 +178,26 @@ public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan ot } } + /// + /// Verifies, that the target span is of same size than the 'other' span. + /// + /// The element type of the spans + /// The target span. + /// The 'other' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSameSized(Span target, Span other, string parameterName) + where T : struct + { + if (target.Length != other.Length) + { + throw new ArgumentException("Span-s must be the same size!", parameterName); + } + } + /// /// Verifies, that the `target` span has the length of 'minSpan', or longer. /// @@ -197,5 +217,45 @@ public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); } } + + /// + /// Verifies, that the `target` span has the length of 'minSpan', or longer. + /// + /// The element type of the spans + /// The target span. + /// The 'minSpan' span to compare 'target' to. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) + where T : struct + { + if (target.Length < minSpan.Length) + { + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + } + } + + /// + /// Verifies, that the `target` array has declared the length or longer. + /// + /// The element type of the spans + /// The target array. + /// The min length the array must have. + /// The name of the parameter that is to be checked. + /// + /// is true + /// + [Conditional("DEBUG")] + public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) + where T : struct + { + if (target.Length < minLength) + { + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + } + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs new file mode 100644 index 0000000000..71b6436ca5 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -0,0 +1,260 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// tell this file to enable debug conditional method calls, i.e. all the debug guard calls +#define DEBUG + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace SixLabors.Helpers.Tests +{ + public class DebugGuardTests + { + [Fact] + public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() + { + var methods = typeof(DebugGuard).GetTypeInfo().GetMethods() + .Where(x => x.IsStatic); + + foreach (var m in methods) + { + var attribs = m.GetCustomAttributes(); + Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); + } + } + + [Fact] + public void NotNull_TargetNotNull_ThrowsNoException() + { + DebugGuard.NotNull("test", "myParamName"); + } + + [Fact] + public void NotNull_TargetNull_ThrowsException() + { + Assert.Throws(() => + { + DebugGuard.NotNull(null, "myParamName"); + }); + } + + + [Fact] + public void MustBeLessThan_IsLess_ThrowsNoException() + { + DebugGuard.MustBeLessThan(0, 1, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeLessThan(value, max, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + } + + [Theory] + [InlineData(0, 1)] + [InlineData(1, 1)] + public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) + { + DebugGuard.MustBeLessThanOrEqualTo(value, max, "myParamName"); + } + + [Fact] + public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + } + + [Fact] + public void MustBeGreaterThan_IsGreater_ThrowsNoException() + { + DebugGuard.MustBeGreaterThan(2, 1, "myParamName"); + } + + [Theory] + [InlineData(1, 2)] + [InlineData(1, 1)] + public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeGreaterThan(value, min, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(1, 1)] + public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) + { + DebugGuard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); + } + + [Fact] + public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + } + + [Fact] + public void IsTrue_IsTrue_ThrowsNoException() + { + DebugGuard.IsTrue(true, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsTrue_IsFalse_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.IsTrue(false, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Fact] + public void IsFalse_IsFalse_ThrowsNoException() + { + DebugGuard.IsFalse(false, "myParamName", "myTestMessage"); + } + + [Fact] + public void IsFalse_IsTrue_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.IsFalse(true, "myParamName", "myTestMessage"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains("myTestMessage")); + } + + [Theory] + [InlineData(new int[] { 1, 2 }, 1)] + [InlineData(new int[] { 1, 2 }, 2)] + public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + { + DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); + } + + [Fact] + public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"The size must be at least 3.", exception.Message); + } + + [Fact] + public void ReadOnlySpan_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + } + + [Fact] + public void Span_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSizedAtLeast(new Span(new int[2]), new Span(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + } + + + [Fact] + public void ReadOnlySpan_MustBeSameSized_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be the same size!", exception.Message); + } + + [Fact] + public void Span_MustBeSameSized_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[3]), "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.Contains($"Span-s must be the same size!", exception.Message); + } + + [Theory] + [InlineData(2, 2)] + [InlineData(2, 4)] + public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + { + DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); + } + + [Theory] + [InlineData(2, 2)] + [InlineData(2, 4)] + public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + { + DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); + } + + [Fact] + public void ReadOnlySpan_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + { + DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); + } + + [Fact] + public void Span_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + { + DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); + } + } +} From 43fe6eaf893528bb5539458c54c55ef01873b2c7 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Mon, 26 Jun 2017 22:24:03 +0100 Subject: [PATCH 041/136] [SL.Core] fix order of paramaters --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 71b6436ca5..f8b15f3fd5 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -231,7 +231,7 @@ public void Span_MustBeSameSized_LengthIsLess_ThrowsException() [Theory] [InlineData(2, 2)] - [InlineData(2, 4)] + [InlineData(4, 3)] public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); @@ -239,7 +239,7 @@ public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, i [Theory] [InlineData(2, 2)] - [InlineData(2, 4)] + [InlineData(4, 3)] public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); From 05a9332216ddab261b3d033b001b1a723cdf8760 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Tue, 27 Jun 2017 07:53:25 +0100 Subject: [PATCH 042/136] [SL.Core] Fix test names + additional overloads --- src/SixLabors.Core/Helpers/DebugGuard.cs | 8 +-- src/SixLabors.Core/Helpers/Guard.cs | 18 +++++++ .../Helpers/DebugGuardTests.cs | 30 ++++++----- .../Helpers/GuardTests.cs | 50 +++++++++++++++++-- 4 files changed, 81 insertions(+), 25 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index e836a1bba4..4a2ed9473b 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -174,7 +174,7 @@ public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan ot { if (target.Length != other.Length) { - throw new ArgumentException("Span-s must be the same size!", parameterName); + throw new ArgumentException("Span-s must be the same size.", parameterName); } } @@ -194,7 +194,7 @@ public static void MustBeSameSized(Span target, Span other, string para { if (target.Length != other.Length) { - throw new ArgumentException("Span-s must be the same size!", parameterName); + throw new ArgumentException("Span-s must be the same size.", parameterName); } } @@ -214,7 +214,7 @@ public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan { if (target.Length < minSpan.Length) { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); } } @@ -234,7 +234,7 @@ public static void MustBeSizedAtLeast(Span target, Span minSpan, string { if (target.Length < minSpan.Length) { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}!", parameterName); + throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); } } diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 4a738d8b36..ea92a85c02 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -227,6 +227,24 @@ public static void IsFalse(bool value, string parameterName, string message) } } + /// + /// Verifies, that the `target` span has the length of 'minLength', or longer. + /// + /// The element type of the spans + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// The length of is less than . + /// + public static void MustBeSizedAtLeast(T[] value, int minLength, string parameterName) + { + if (value.Length < minLength) + { + throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index f8b15f3fd5..e1d8b1f220 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -43,7 +43,6 @@ public void NotNull_TargetNull_ThrowsException() }); } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { @@ -163,13 +162,13 @@ public void IsFalse_IsTrue_ThrowsException() [Theory] [InlineData(new int[] { 1, 2 }, 1)] [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) { DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); } [Fact] - public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -181,7 +180,7 @@ public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() } [Fact] - public void ReadOnlySpan_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -189,11 +188,11 @@ public void ReadOnlySpan_MustBeSizedAtLeast_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + Assert.Contains($"Span-s must be at least of length 3.", exception.Message); } [Fact] - public void Span_MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -201,12 +200,11 @@ public void Span_MustBeSizedAtLeast_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3!", exception.Message); + Assert.Contains($"Span-s must be at least of length 3.", exception.Message); } - [Fact] - public void ReadOnlySpan_MustBeSameSized_LengthIsLess_ThrowsException() + public void MustBeSameSized_ReadOnlySpan_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -214,11 +212,11 @@ public void ReadOnlySpan_MustBeSameSized_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size!", exception.Message); + Assert.Contains($"Span-s must be the same size.", exception.Message); } [Fact] - public void Span_MustBeSameSized_LengthIsLess_ThrowsException() + public void MustBeSameSized_Span_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -226,13 +224,13 @@ public void Span_MustBeSameSized_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size!", exception.Message); + Assert.Contains($"Span-s must be the same size.", exception.Message); } [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_ReadOnlySpan_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); } @@ -240,19 +238,19 @@ public void ReadOnlySpan_MustBeSizedAtLeast_DoesNotThowException(int leftSize, i [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void Span_MustBeSizedAtLeast_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_Span_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); } [Fact] - public void ReadOnlySpan_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + public void MustBeSameSized_ReadOnlySpan_LengthIsEqual_DoesNotThrowException() { DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); } [Fact] - public void Span_MustBeSameSized_LengthIsEqual_DoesNotThrowException() + public void MustBeSameSized_Span_LengthIsEqual_DoesNotThrowException() { DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index c91ebbcd6f..b7f859f358 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -264,15 +264,31 @@ public void IsFalse_IsTrue_ThrowsException() } [Theory] - [InlineData(new int[] { 1, 2 }, 1)] - [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) + { + Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_Span_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) + { + Guard.MustBeSizedAtLeast(new Span(new int[valueLength]), minLength, "myParamName"); + } + + [Theory] + [InlineData(2, 1)] + [InlineData(2, 2)] + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) { - Guard.MustBeSizedAtLeast(value, minLength, "myParamName"); + Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[valueLength]), minLength, "myParamName"); } [Fact] - public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() + public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { var exception = Assert.Throws(() => { @@ -282,5 +298,29 @@ public void MustBeSizedAtLeast_LengthIsLess_ThrowsException() Assert.Equal("myParamName", exception.ParamName); Assert.True(exception.Message.Contains($"The size must be at least 3.")); } + + [Fact] + public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new Span(new int[2]), 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } + + [Fact] + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() + { + var exception = Assert.Throws(() => + { + Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), 3, "myParamName"); + }); + + Assert.Equal("myParamName", exception.ParamName); + Assert.True(exception.Message.Contains($"The size must be at least 3.")); + } } } From a43dd3fe2965161f57d3f23373713fa7a302e909 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Tue, 27 Jun 2017 08:35:49 +0100 Subject: [PATCH 043/136] [SL.Core] add reason --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index e1d8b1f220..1e651f2674 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -230,7 +230,7 @@ public void MustBeSameSized_Span_LengthIsLess_ThrowsException() [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void MustBeSizedAtLeast_ReadOnlySpan_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); } @@ -238,7 +238,7 @@ public void MustBeSizedAtLeast_ReadOnlySpan_DoesNotThowException(int leftSize, i [Theory] [InlineData(2, 2)] [InlineData(4, 3)] - public void MustBeSizedAtLeast_Span_DoesNotThowException(int leftSize, int rightSize) + public void MustBeSizedAtLeast_Span_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) { DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); } From 3dadce9484530370f9e1de64c170ff5a51b4f2bb Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 13 Sep 2017 20:13:57 +0100 Subject: [PATCH 044/136] [SL.Core] Remove System.Memory from core --- src/SixLabors.Core/Helpers/DebugGuard.cs | 80 ------------------- src/SixLabors.Core/Helpers/Guard.cs | 18 ----- src/SixLabors.Core/SixLabors.Core.csproj | 3 +- .../Helpers/DebugGuardTests.cs | 76 ------------------ .../Helpers/GuardTests.cs | 40 ---------- 5 files changed, 1 insertion(+), 216 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 4a2ed9473b..c649372ee3 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -158,86 +158,6 @@ public static void IsFalse(bool target, string parameterName, string message) } } - /// - /// Verifies, that the target span is of same size than the 'other' span. - /// - /// The element type of the spans - /// The target span. - /// The 'other' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSameSized(ReadOnlySpan target, ReadOnlySpan other, string parameterName) - where T : struct - { - if (target.Length != other.Length) - { - throw new ArgumentException("Span-s must be the same size.", parameterName); - } - } - - /// - /// Verifies, that the target span is of same size than the 'other' span. - /// - /// The element type of the spans - /// The target span. - /// The 'other' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSameSized(Span target, Span other, string parameterName) - where T : struct - { - if (target.Length != other.Length) - { - throw new ArgumentException("Span-s must be the same size.", parameterName); - } - } - - /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. - /// - /// The element type of the spans - /// The target span. - /// The 'minSpan' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(ReadOnlySpan target, ReadOnlySpan minSpan, string parameterName) - where T : struct - { - if (target.Length < minSpan.Length) - { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); - } - } - - /// - /// Verifies, that the `target` span has the length of 'minSpan', or longer. - /// - /// The element type of the spans - /// The target span. - /// The 'minSpan' span to compare 'target' to. - /// The name of the parameter that is to be checked. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(Span target, Span minSpan, string parameterName) - where T : struct - { - if (target.Length < minSpan.Length) - { - throw new ArgumentException($"Span-s must be at least of length {minSpan.Length}.", parameterName); - } - } - /// /// Verifies, that the `target` array has declared the length or longer. /// diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index ea92a85c02..3a38551d8c 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -244,23 +244,5 @@ public static void MustBeSizedAtLeast(T[] value, int minLength, string parame throw new ArgumentException($"The size must be at least {minLength}.", parameterName); } } - - /// - /// Verifies, that the `target` span has the length of 'minLength', or longer. - /// - /// The element type of the spans - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// The length of is less than . - /// - public static void MustBeSizedAtLeast(ReadOnlySpan value, int minLength, string parameterName) - { - if (value.Length < minLength) - { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); - } - } } } diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 37d4b90130..a5a1745361 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -43,8 +43,7 @@ All - - + \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 1e651f2674..99661dfe0b 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -178,81 +178,5 @@ public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"The size must be at least 3.", exception.Message); } - - [Fact] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3.", exception.Message); - } - - [Fact] - public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new Span(new int[2]), new Span(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be at least of length 3.", exception.Message); - } - - [Fact] - public void MustBeSameSized_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size.", exception.Message); - } - - [Fact] - public void MustBeSameSized_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[3]), "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Span-s must be the same size.", exception.Message); - } - - [Theory] - [InlineData(2, 2)] - [InlineData(4, 3)] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) - { - DebugGuard.MustBeSizedAtLeast(new ReadOnlySpan(new int[leftSize]), new ReadOnlySpan(new int[rightSize]), "myParamName"); - } - - [Theory] - [InlineData(2, 2)] - [InlineData(4, 3)] - public void MustBeSizedAtLeast_Span_LengthIsEqualOrGreater_DoesNotThowException(int leftSize, int rightSize) - { - DebugGuard.MustBeSizedAtLeast(new Span(new int[leftSize]), new Span(new int[rightSize]), "myParamName"); - } - - [Fact] - public void MustBeSameSized_ReadOnlySpan_LengthIsEqual_DoesNotThrowException() - { - DebugGuard.MustBeSameSized(new ReadOnlySpan(new int[2]), new ReadOnlySpan(new int[2]), "myParamName"); - } - - [Fact] - public void MustBeSameSized_Span_LengthIsEqual_DoesNotThrowException() - { - DebugGuard.MustBeSameSized(new Span(new int[2]), new Span(new int[2]), "myParamName"); - } } } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index b7f859f358..95901c774f 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -271,22 +271,6 @@ public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(in Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); } - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_Span_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new Span(new int[valueLength]), minLength, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[valueLength]), minLength, "myParamName"); - } - [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { @@ -298,29 +282,5 @@ public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() Assert.Equal("myParamName", exception.ParamName); Assert.True(exception.Message.Contains($"The size must be at least 3.")); } - - [Fact] - public void MustBeSizedAtLeast_Span_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new Span(new int[2]), 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); - } - - [Fact] - public void MustBeSizedAtLeast_ReadOnlySpan_LengthIsLess_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new ReadOnlySpan(new int[2]), 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); - } } } From a68b76f83df596dcaea789f8cf1021e9ffb2f6c7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 14 Sep 2017 19:16:19 +1000 Subject: [PATCH 045/136] [SL.Core] Use MathF for Core 2.0 Also a little cleanup --- src/SixLabors.Core/MathF.cs | 72 +----------- src/SixLabors.Core/MathFExtensions.cs | 40 +++++++ .../Primitives/Matrix3x2Extensions.cs | 18 +-- src/SixLabors.Core/SixLabors.Core.csproj | 87 +++++++------- .../Helpers/FloatRoundingComparer.cs | 59 ++++++++++ .../Helpers/MathFTests.cs | 107 ++++++++++++++++++ .../Primitives/PointTests.cs | 1 + .../SixLabors.Core.Tests.csproj | 2 +- 8 files changed, 266 insertions(+), 120 deletions(-) create mode 100644 src/SixLabors.Core/MathFExtensions.cs create mode 100644 tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs create mode 100644 tests/SixLabors.Core.Tests/Helpers/MathFTests.cs diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index a4ad9ed666..836c8d482d 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,14 +1,15 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; +#if !NETCOREAPP2_0 using System.Runtime.CompilerServices; -namespace SixLabors +namespace System { /// /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. /// + /// MathF emulation on platforms that don't support it natively. // ReSharper disable InconsistentNaming internal static class MathF { @@ -84,19 +85,6 @@ public static float Cos(float f) return (float)Math.Cos(f); } - /// - /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. - /// - /// The angle in degrees. - /// - /// The representing the degree as radians. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float ToRadians(float degree) - { - return degree * (PI / 180F); - } - /// /// Returns e raised to the specified power. /// @@ -171,19 +159,6 @@ public static float Pow(float x, float y) return (float)Math.Pow(x, y); } - /// - /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. - /// - /// The angle in radians. - /// - /// The representing the degree as radians. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float ToDegree(float radian) - { - return radian / (PI / 180F); - } - /// /// Rounds a single-precision floating-point value to the nearest integral value. /// @@ -233,26 +208,6 @@ public static float Sin(float f) return (float)Math.Sin(f); } - /// - /// Returns the result of a normalized sine cardinal function for the given value. - /// SinC(x) = sin(pi*x)/(pi*x). - /// - /// A single-precision floating-point number to calculate the result for. - /// - /// The sine cardinal of . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float SinC(float f) - { - if (Abs(f) > Constants.Epsilon) - { - f *= PI; - return Clean(Sin(f) / f); - } - - return 1F; - } - /// /// Returns the square root of a specified number. /// @@ -269,23 +224,6 @@ public static float Sqrt(float f) { return (float)Math.Sqrt(f); } - - /// - /// Ensures that any passed float is correctly rounded to zero - /// - /// The value to clean. - /// - /// The - /// . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static float Clean(float x) - { - if (Abs(x) < Constants.Epsilon) - { - return 0F; - } - - return x; - } } -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/src/SixLabors.Core/MathFExtensions.cs b/src/SixLabors.Core/MathFExtensions.cs new file mode 100644 index 0000000000..27d18d4815 --- /dev/null +++ b/src/SixLabors.Core/MathFExtensions.cs @@ -0,0 +1,40 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.CompilerServices; + +namespace SixLabors +{ + /// + /// Provides common mathematical methods. + /// + internal static class MathFExtensions + { + /// + /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. + /// + /// The angle in degrees. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float DegreeToRadian(float degree) + { + return degree * (MathF.PI / 180F); + } + + /// + /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. + /// + /// The angle in radians. + /// + /// The representing the degree as radians. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static float RadianToDegree(float radian) + { + return radian / (MathF.PI / 180F); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 80c4f46009..55d75b83db 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -50,12 +50,12 @@ public static class Matrix3x2Extensions public static Matrix3x2 CreateScale(float scale, PointF centerPoint) => Matrix3x2.CreateScale(scale, centerPoint); /// - /// Creates a skew matrix from the given angles in radians. + /// Creates a skew matrix from the given angles in degrees. /// /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -67,20 +67,20 @@ public static class Matrix3x2Extensions public static Matrix3x2 CreateSkew(float radiansX, float radiansY, PointF centerPoint) => Matrix3x2.CreateSkew(radiansX, radiansY, centerPoint); /// - /// Creates a skew matrix from the given angles in radians and a center point. + /// Creates a skew matrix from the given angles in degrees and a center point. /// /// The X angle, in degrees. /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathF.ToRadians(degreesX), MathF.ToRadians(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY), centerPoint); /// - /// Creates a rotation matrix using the given rotation in radians. + /// Creates a rotation matrix using the given rotation in degrees. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -91,11 +91,11 @@ public static class Matrix3x2Extensions public static Matrix3x2 CreateRotation(float radians, PointF centerPoint) => Matrix3x2.CreateRotation(radians, centerPoint); /// - /// Creates a rotation matrix using the given rotation in radians and a center point. + /// Creates a rotation matrix using the given rotation in degrees and a center point. /// /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathF.ToRadians(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees), centerPoint); } -} +} \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index a5a1745361..0998e722eb 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -1,49 +1,50 @@  - - Low level primitives for use across Six Labors projects.. - $(packageversion) - 0.1.0-alpha2 - Six Labors - netstandard1.1 - true - true - SixLabors.Core - SixLabors.Core - rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Home/master/logo.png - https://github.com/SixLabors/Core - http://www.apache.org/licenses/LICENSE-2.0 - git - https://github.com/SixLabors/Core - false - false - false - false - false - false - false - false - false - false - full - SixLabors - + + Low level primitives for use across Six Labors projects.. + $(packageversion) + 0.1.0-alpha2 + Six Labors + netstandard1.1;netcoreapp2.0; + true + true + SixLabors.Core + SixLabors.Core + rectangle;point;size,primitives + https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://github.com/SixLabors/Core + http://www.apache.org/licenses/LICENSE-2.0 + git + https://github.com/SixLabors/Core + false + false + false + false + false + false + false + false + false + false + full + SixLabors + - - ..\SixLabors.ruleset - + + ..\SixLabors.ruleset + - - - - - - - - All - - - + + + + + + + All + + + + + \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs new file mode 100644 index 0000000000..e3ef6a01b8 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -0,0 +1,59 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Collections.Generic; +using System.Numerics; + +namespace SixLabors.Tests.Helpers +{ + /// + /// Allows the comparison of single-precision floating point values by precision. + /// + public struct FloatRoundingComparer : IEqualityComparer, IEqualityComparer + { + /// + /// Initializes a new instance of the struct. + /// + /// The number of decimal places (valid values: 0-7) + public FloatRoundingComparer(int precision) + { + Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); + this.Precision = precision; + } + + /// + /// Gets the number of decimal places (valid values: 0-7) + /// + public int Precision { get; } + + /// + public bool Equals(float x, float y) + { + float xp = (float)Math.Round(x, this.Precision, MidpointRounding.AwayFromZero); + float yp = (float)Math.Round(y, this.Precision, MidpointRounding.AwayFromZero); + + return Comparer.Default.Compare(xp, yp) == 0; + } + + /// + public bool Equals(Vector4 x, Vector4 y) + { + return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W); + } + + /// + public int GetHashCode(float obj) + { + unchecked + { + int hashCode = obj.GetHashCode(); + hashCode = (hashCode * 397) ^ this.Precision.GetHashCode(); + return hashCode; + } + } + + /// + public int GetHashCode(Vector4 obj) => HashHelpers.Combine(obj.GetHashCode(), this.Precision.GetHashCode()); + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs new file mode 100644 index 0000000000..477259983c --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -0,0 +1,107 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class MathFTests + { + [Fact] + public void MathF_PI_Is_Equal() + { + Assert.Equal(MathF.PI, (float)Math.PI); + } + + [Fact] + public void MathF_Ceililng_Is_Equal() + { + Assert.Equal(MathF.Ceiling(0.3333F), (float)Math.Ceiling(0.3333F)); + } + + [Fact] + public void MathF_Cos_Is_Equal() + { + Assert.Equal(MathF.Cos(0.3333F), (float)Math.Cos(0.3333F)); + } + + [Fact] + public void MathF_Abs_Is_Equal() + { + Assert.Equal(MathF.Abs(-0.3333F), (float)Math.Abs(-0.3333F)); + } + + [Fact] + public void MathF_Atan2_Is_Equal() + { + Assert.Equal(MathF.Atan2(1.2345F, 1.2345F), (float)Math.Atan2(1.2345F, 1.2345F)); + } + + [Fact] + public void MathF_Exp_Is_Equal() + { + Assert.Equal(MathF.Exp(1.2345F), (float)Math.Exp(1.2345F)); + } + + [Fact] + public void MathF_Floor_Is_Equal() + { + Assert.Equal(MathF.Floor(1.2345F), (float)Math.Floor(1.2345F)); + } + + [Fact] + public void MathF_Min_Is_Equal() + { + Assert.Equal(MathF.Min(1.2345F, 5.4321F), (float)Math.Min(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Max_Is_Equal() + { + Assert.Equal(MathF.Max(1.2345F, 5.4321F), (float)Math.Max(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Pow_Is_Equal() + { + Assert.Equal(MathF.Pow(1.2345F, 5.4321F), (float)Math.Pow(1.2345F, 5.4321F)); + } + + [Fact] + public void MathF_Round_Is_Equal() + { + Assert.Equal(MathF.Round(1.2345F), (float)Math.Round(1.2345F)); + } + + [Fact] + public void MathF_Round_With_Midpoint_Is_Equal() + { + Assert.Equal(MathF.Round(1.2345F, MidpointRounding.AwayFromZero), (float)Math.Round(1.2345F, MidpointRounding.AwayFromZero)); + } + + [Fact] + public void MathF_Sin_Is_Equal() + { + Assert.Equal(MathF.Sin(1.2345F), (float)Math.Sin(1.2345F)); + } + + [Fact] + public void MathF_Sqrt_Is_Equal() + { + Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); + } + + [Fact] + public void Convert_Degree_To_Radian() + { + Assert.Equal((float)(Math.PI / 2D), MathFExtensions.DegreeToRadian(90F), new FloatRoundingComparer(6)); + } + + [Fact] + public void Convert_Radian_To_Degree() + { + Assert.Equal(60F, MathFExtensions.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index a1880d0e1e..79fd0bd4dc 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Globalization; using System.Numerics; using Xunit; diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index a80bf5a60e..6869491e32 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -2,7 +2,7 @@ 0.0.0 - netcoreapp1.1 + netcoreapp1.1;netcoreapp2.0; SixLabors.Core.Tests SixLabors.Shapes.Tests true From 548c0f50666f0ba2349b91a21fcd16db3cb7f8a3 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:15:58 +0100 Subject: [PATCH 046/136] [SL.Core] prevent stylecop.json form being included in package --- src/SixLabors.Core/SixLabors.Core.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index a5a1745361..e38298f846 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,6 @@ - From 491b683c79585d474294fe36b08aec83827e43f2 Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:19:58 +0100 Subject: [PATCH 047/136] [SL.Core] fix gitversion rules to match IS --- gitversion.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/gitversion.yml b/gitversion.yml index e07c90f0d9..9fae0d8c2f 100644 --- a/gitversion.yml +++ b/gitversion.yml @@ -9,5 +9,23 @@ branches: increment: Minor prevent-increment-of-merged-branch-version: false track-merge-target: true + pull-request: + regex: (pull|pull\-requests|pr)[/-] + mode: ContinuousDelivery + tag: PullRequest + increment: Inherit + prevent-increment-of-merged-branch-version: false + tag-number-pattern: '[/-](?\d+)[-/]' + track-merge-target: false + tracks-release-branches: false + is-release-branch: false + otherbranches: + regex: '.*' + mode: ContinuousDeployment + tag: ci + increment: Patch + prevent-increment-of-merged-branch-version: false + track-merge-target: true + is-release-branch: false ignore: sha: [] \ No newline at end of file From 570deb1e084d24608081242d12fbd4c19f56b0ce Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Sat, 16 Sep 2017 10:23:00 +0100 Subject: [PATCH 048/136] [SL.Core] fix appveyor.yml to user correct version of gitversion --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 5a74728faf..8938394487 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -6,7 +6,7 @@ install: before_build: - cmd: dotnet --version - - ps: gitversion /l console /output buildserver + - ps: c:\ProgramData\chocolatey\lib\gitversion.portable\tools\gitversion.exe /l console /output buildserver build_script: - cmd: build.cmd From 4596853b37168cb64dd7d02ccd4f2b04a481c154 Mon Sep 17 00:00:00 2001 From: JimBobSquarePants Date: Thu, 5 Oct 2017 15:59:29 +1100 Subject: [PATCH 049/136] [SL.Core] Use type forwarding as per example --- src/SixLabors.Core/MathF.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 836c8d482d..3079c91004 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -1,9 +1,11 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -#if !NETCOREAPP2_0 using System.Runtime.CompilerServices; +#if NETCOREAPP2_0 +[assembly: TypeForwardedTo(typeof(System.MathF))] +#else namespace System { /// From 96c30120a0cfc678798b6aebf09a2d19794a71e1 Mon Sep 17 00:00:00 2001 From: JimBobSquarePants Date: Thu, 5 Oct 2017 15:59:57 +1100 Subject: [PATCH 050/136] [SL.Core] Remove incorrect include --- src/SixLabors.Core/SixLabors.Core.csproj | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 0998e722eb..dee1f1ad2e 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,6 @@ - From f63535f3014ad8b15dcbb3a006366b469fefadf5 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 17 Nov 2017 19:44:56 +1100 Subject: [PATCH 051/136] [SL.Core] Fix test path in build command --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index eaa54e8616..e55aad06ff 100644 --- a/build.cmd +++ b/build.cmd @@ -14,7 +14,7 @@ if not "%GitVersion_NuGetVersion%" == "" ( ) if not "%errorlevel%"=="0" goto failure -dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Primitives.Tests.csproj +dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj if not "%GitVersion_NuGetVersion%" == "" ( From 9d4acb054eb15b3b6b52dd985e0afe2f9066ccc8 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Fri, 24 Nov 2017 16:56:29 +1100 Subject: [PATCH 052/136] [SL.Core] Replace skew and rotate with single transform --- src/SixLabors.Core/Primitives/Point.cs | 41 +++++++------------ src/SixLabors.Core/Primitives/PointF.cs | 30 +++----------- src/SixLabors.Core/Primitives/RectangleF.cs | 2 +- .../Primitives/PointFTests.cs | 4 +- .../Primitives/PointTests.cs | 4 +- 5 files changed, 25 insertions(+), 56 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 1992d39226..8bbb812e6e 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -211,15 +211,12 @@ public Point(Size size) public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); /// - /// Transforms a point by the given matrix. + /// Converts a to a by performing a round operation on all the coordinates. /// - /// The source point. - /// The transformation matrix. - /// A transformed point. - public static PointF Transform(Point position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } + /// The vector + /// The + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); /// /// Converts a to a by performing a truncate operation on all the coordinates. @@ -230,30 +227,22 @@ public static PointF Transform(Point position, Matrix3x2 matrix) public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); /// - /// Converts a to a by performing a round operation on all the coordinates. - /// - /// The vector - /// The - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); - - /// - /// Rotates a point around the given rotation matrix. + /// Transforms a point by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The point to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Rotate(Point point, Matrix3x2 rotation) => Round(Vector2.Transform(new Vector2(point.X, point.Y), rotation)); + public static Point Transform(Point point, Matrix3x2 matrix) => Transform(new Vector2(point.X, point.Y), matrix); /// - /// Skews a point using the given skew matrix. + /// Transforms a vector by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The vector to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Skew(Point point, Matrix3x2 skew) => Round(Vector2.Transform(new Vector2(point.X, point.Y), skew)); + public static Point Transform(Vector2 position, Matrix3x2 matrix) => Round(Vector2.Transform(position, matrix)); /// /// Translates this by the specified amount. diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 454e69e5cb..7c04315562 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -238,34 +238,14 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); - /// PointF - /// Rotates a point around the given rotation matrix. - /// - /// The point to rotate - /// Rotation matrix used - /// The rotated - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Rotate(PointF point, Matrix3x2 rotation) => Vector2.Transform(new Vector2(point.X, point.Y), rotation); - /// - /// Skews a point using the given skew matrix. + /// Transforms a point by a specified 3x2 matrix. /// - /// The point to rotate - /// Rotation matrix used - /// The rotated + /// The point to transform + /// The transformation matrix used + /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static PointF Skew(PointF point, Matrix3x2 skew) => Vector2.Transform(new Vector2(point.X, point.Y), skew); - - /// - /// Transforms a point by the given matrix. - /// - /// The source point. - /// The transformation matrix. - /// A transformed point. - public static PointF Transform(PointF position, Matrix3x2 matrix) - { - return Vector2.Transform(position, matrix); - } + public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); /// /// Translates this by the specified amount. diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 09fa6f1ab4..d5ee6a61b4 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -254,7 +254,7 @@ public static RectangleF Inflate(RectangleF rectangle, float x, float y) /// /// The source rectangle. /// The transformation matrix. - /// A transformed rectangle. + /// A transformed . public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) { PointF bottomRight = PointF.Transform(new PointF(rectangle.Right, rectangle.Bottom), matrix); diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 5a29d1cff6..6fdf1bbc37 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -106,7 +106,7 @@ public void RotateTest() var p = new PointF(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, PointF.Empty); - var pout = PointF.Rotate(p, matrix); + var pout = PointF.Transform(p, matrix); Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); } @@ -117,7 +117,7 @@ public void SkewTest() var p = new PointF(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, PointF.Empty); - var pout = PointF.Skew(p, matrix); + var pout = PointF.Transform(p, matrix); Assert.Equal(new PointF(30, 30), pout); } diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 79fd0bd4dc..43d662572f 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -161,7 +161,7 @@ public void RotateTest() var p = new Point(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateRotationDegrees(45, Point.Empty); - var pout = Point.Rotate(p, matrix); + var pout = Point.Transform(p, matrix); Assert.Equal(new Point(-3, 21), pout); } @@ -172,7 +172,7 @@ public void SkewTest() var p = new Point(13, 17); Matrix3x2 matrix = Matrix3x2Extensions.CreateSkewDegrees(45, 45, Point.Empty); - var pout = Point.Skew(p, matrix); + var pout = Point.Transform(p, matrix); Assert.Equal(new Point(30, 30), pout); } From a993b77feb8158fa2e22116e8893236046039738 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 20 Nov 2017 20:38:36 +1100 Subject: [PATCH 053/136] [SL.Core] Add missing library internal --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 368bab2485..96a40f6f6e 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -41,3 +41,4 @@ [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] From ceb18ee72fca8b3f4e54fa55c5c7c96d7dc81bfb Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 25 Nov 2017 10:40:49 +1100 Subject: [PATCH 054/136] [SL.Core] Remove Vector2 overload --- src/SixLabors.Core/Primitives/Point.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 8bbb812e6e..ab12e28ff3 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -233,16 +233,7 @@ public Point(Size size) /// The transformation matrix used /// The transformed [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Transform(Point point, Matrix3x2 matrix) => Transform(new Vector2(point.X, point.Y), matrix); - - /// - /// Transforms a vector by a specified 3x2 matrix. - /// - /// The vector to transform - /// The transformation matrix used - /// The transformed - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Point Transform(Vector2 position, Matrix3x2 matrix) => Round(Vector2.Transform(position, matrix)); + public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); /// /// Translates this by the specified amount. From 9ff9dafb1393e9aa2eaffe33a2aac10458a4c1e7 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Thu, 22 Mar 2018 23:22:33 +1100 Subject: [PATCH 055/136] [SL.Core] Update logo and readme. --- README.md | 14 +++++++++++--- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a2f16a7394..159761bd6e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,11 @@ -# SixLabers.Core +

-**SixLabors.Core** provides classes for use across SixLabors libraries. +SixLabors.Core +
+SixLabors.Core +

+ +
[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) [![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) @@ -8,4 +13,7 @@ [![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) [![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) \ No newline at end of file +[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) +
+ +**SixLabors.Core** provides core primitives and helper methods for use across SixLabors libraries. diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index dee1f1ad2e..d14738dd5b 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -11,7 +11,7 @@ SixLabors.Core SixLabors.Core rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Home/master/logo.png + https://raw.githubusercontent.com/SixLabors/Branding/master/icons/core/sixlabors.core.128.png https://github.com/SixLabors/Core http://www.apache.org/licenses/LICENSE-2.0 git From a5bfedd97cd7af5eb593985209c52709fb96f5e1 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 00:17:34 +0200 Subject: [PATCH 056/136] [SL.Core] Make Guard.NotNull() and DebugGuard.NotNull() generic --- src/SixLabors.Core/Helpers/DebugGuard.cs | 4 +++- src/SixLabors.Core/Helpers/Guard.cs | 4 +++- src/SixLabors.Core/SixLabors.Core.csproj.DotSettings | 2 ++ tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 2 +- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 4 ++-- 5 files changed, 11 insertions(+), 5 deletions(-) create mode 100644 src/SixLabors.Core/SixLabors.Core.csproj.DotSettings diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index c649372ee3..f41d7eacfb 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -19,8 +19,10 @@ internal static class DebugGuard /// The target object, which cannot be null. /// The name of the parameter that is to be checked. /// is null + /// The type of the object to verify [Conditional("DEBUG")] - public static void NotNull(object target, string parameterName) + public static void NotNull(T target, string parameterName) + where T : class { if (target == null) { diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 3a38551d8c..41db42fc1a 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -22,7 +22,9 @@ internal static class Guard /// The name of the parameter that is to be checked. /// The error message, if any to add to the exception. /// is null - public static void NotNull(object target, string parameterName, string message = "") + /// The type of the object to verify + public static void NotNull(T target, string parameterName, string message = "") + where T : class { if (target == null) { diff --git a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings new file mode 100644 index 0000000000..8b01856ae9 --- /dev/null +++ b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 99661dfe0b..843b74dede 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -39,7 +39,7 @@ public void NotNull_TargetNull_ThrowsException() { Assert.Throws(() => { - DebugGuard.NotNull(null, "myParamName"); + DebugGuard.NotNull((object)null, "myParamName"); }); } diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index 95901c774f..ed2e0b5c75 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -21,7 +21,7 @@ public void NotNull_TargetNull_ThrowsException() { Assert.Throws(() => { - Guard.NotNull(null, "myParamName"); + Guard.NotNull((object)null, "myParamName"); }); } @@ -30,7 +30,7 @@ public void NotNull_TargetNullWithMessage_ThrowsException() { var exception = Assert.Throws(() => { - Guard.NotNull(null, "myParamName", "myTestMessage"); + Guard.NotNull((object)null, "myParamName", "myTestMessage"); }); Assert.Equal("myParamName", exception.ParamName); From 9f51d65d950fa691ec70eeb129aad5db35c49fee Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 01:15:12 +0200 Subject: [PATCH 057/136] [SL.Core] Add MemoryAllocator-s with tests --- SixLabors.Core.sln.DotSettings | 3 +- .../Memory/AllocationOptions.cs | 21 ++ .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 84 +++++ ...oolMemoryAllocator.CommonFactoryMethods.cs | 72 ++++ .../Memory/ArrayPoolMemoryAllocator.cs | 140 ++++++++ src/SixLabors.Core/Memory/BasicArrayBuffer.cs | 78 +++++ src/SixLabors.Core/Memory/BasicByteBuffer.cs | 20 ++ .../Memory/IManagedByteBuffer.cs | 18 + .../Memory/ManagedBufferBase.cs | 45 +++ src/SixLabors.Core/Memory/MemoryAllocator.cs | 39 +++ .../Memory/SimpleGcMemoryAllocator.cs | 25 ++ src/SixLabors.Core/SixLabors.Core.csproj | 3 + .../Memory/ArrayPoolMemoryManagerTests.cs | 240 +++++++++++++ .../Memory/BufferExtensions.cs | 25 ++ .../Memory/BufferTestSuite.cs | 318 ++++++++++++++++++ .../Memory/SimpleGcMemoryManagerTests.cs | 16 + .../SixLabors.Core.Tests.csproj | 1 + tests/SixLabors.Core.Tests/TestEnvironment.cs | 12 + 18 files changed, 1159 insertions(+), 1 deletion(-) create mode 100644 src/SixLabors.Core/Memory/AllocationOptions.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs create mode 100644 src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs create mode 100644 src/SixLabors.Core/Memory/BasicArrayBuffer.cs create mode 100644 src/SixLabors.Core/Memory/BasicByteBuffer.cs create mode 100644 src/SixLabors.Core/Memory/IManagedByteBuffer.cs create mode 100644 src/SixLabors.Core/Memory/ManagedBufferBase.cs create mode 100644 src/SixLabors.Core/Memory/MemoryAllocator.cs create mode 100644 src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs create mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs create mode 100644 tests/SixLabors.Core.Tests/TestEnvironment.cs diff --git a/SixLabors.Core.sln.DotSettings b/SixLabors.Core.sln.DotSettings index 613ba38826..82961f0d05 100644 --- a/SixLabors.Core.sln.DotSettings +++ b/SixLabors.Core.sln.DotSettings @@ -2,4 +2,5 @@ DO_NOT_SHOW DO_NOT_SHOW DO_NOT_SHOW - DO_NOT_SHOW \ No newline at end of file + DO_NOT_SHOW + <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/AllocationOptions.cs b/src/SixLabors.Core/Memory/AllocationOptions.cs new file mode 100644 index 0000000000..5eda00505e --- /dev/null +++ b/src/SixLabors.Core/Memory/AllocationOptions.cs @@ -0,0 +1,21 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Options for allocating buffers. + /// + public enum AllocationOptions + { + /// + /// Indicates that the buffer should just be allocated. + /// + None, + + /// + /// Indicates that the allocated buffer should be cleaned following allocation. + /// + Clean + } +} diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs new file mode 100644 index 0000000000..b563d4a793 --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -0,0 +1,84 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory +{ + /// + /// Contains and + /// + public partial class ArrayPoolMemoryAllocator + { + /// + /// The buffer implementation of . + /// + private class Buffer : ManagedBufferBase + where T : struct + { + /// + /// The length of the buffer + /// + private readonly int length; + + /// + /// A weak reference to the source pool. + /// + /// + /// By using a weak reference here, we are making sure that array pools and their retained arrays are always GC-ed + /// after a call to , regardless of having buffer instances still being in use. + /// + private WeakReference> sourcePoolReference; + + public Buffer(byte[] data, int length, ArrayPool sourcePool) + { + this.Data = data; + this.length = length; + this.sourcePoolReference = new WeakReference>(sourcePool); + } + + /// + /// Gets the buffer as a byte array. + /// + protected byte[] Data { get; private set; } + + /// + public override Span GetSpan() => MemoryMarshal.Cast(this.Data.AsSpan()).Slice(0, this.length); + + /// + protected override void Dispose(bool disposing) + { + if (!disposing || this.Data == null || this.sourcePoolReference == null) + { + return; + } + + if (this.sourcePoolReference.TryGetTarget(out ArrayPool pool)) + { + pool.Return(this.Data); + } + + this.sourcePoolReference = null; + this.Data = null; + } + + protected override object GetPinnableObject() => this.Data; + } + + /// + /// The implementation of . + /// + private class ManagedByteBuffer : Buffer, IManagedByteBuffer + { + public ManagedByteBuffer(byte[] data, int length, ArrayPool sourcePool) + : base(data, length, sourcePool) + { + } + + /// + public byte[] Array => this.Data; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs new file mode 100644 index 0000000000..a82948ebc8 --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -0,0 +1,72 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Contains common factory methods and configuration constants. + /// + public partial class ArrayPoolMemoryAllocator + { + /// + /// The default value for: maximum size of pooled arrays in bytes. + /// Currently set to 24MB, which is equivalent to 8 megapixels of raw RGBA32 data. + /// + internal const int DefaultMaxPooledBufferSizeInBytes = 24 * 1024 * 1024; + + /// + /// The value for: The threshold to pool arrays in which has less buckets for memory safety. + /// + private const int DefaultBufferSelectorThresholdInBytes = 8 * 1024 * 1024; + + /// + /// The default bucket count for . + /// + private const int DefaultLargePoolBucketCount = 6; + + /// + /// The default bucket count for . + /// + private const int DefaultNormalPoolBucketCount = 16; + + /// + /// This is the default. Should be good for most use cases. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateDefault() + { + return new ArrayPoolMemoryAllocator( + DefaultMaxPooledBufferSizeInBytes, + DefaultBufferSelectorThresholdInBytes, + DefaultLargePoolBucketCount, + DefaultNormalPoolBucketCount); + } + + /// + /// For environments with limited memory capabilities. Only small images are pooled, which can result in reduced througput. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithModeratePooling() + { + return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); + } + + /// + /// Only pool small buffers like image rows. + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() + { + return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); + } + + /// + /// RAM is not an issue for me, gimme maximum througput! + /// + /// The memory manager + public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() + { + return new ArrayPoolMemoryAllocator(128 * 1024 * 1024, 32 * 1024 * 1024, 16, 32); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs new file mode 100644 index 0000000000..8681a594bb --- /dev/null +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -0,0 +1,140 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; +using System.Runtime.CompilerServices; + +namespace SixLabors.Memory +{ + /// + /// Implements by allocating memory from . + /// + public sealed partial class ArrayPoolMemoryAllocator : MemoryAllocator + { + private readonly int maxArraysPerBucketNormalPool; + + private readonly int maxArraysPerBucketLargePool; + + /// + /// The for small-to-medium buffers which is not kept clean. + /// + private ArrayPool normalArrayPool; + + /// + /// The for huge buffers, which is not kept clean. + /// + private ArrayPool largeArrayPool; + + /// + /// Initializes a new instance of the class. + /// + public ArrayPoolMemoryAllocator() + : this(DefaultMaxPooledBufferSizeInBytes, DefaultBufferSelectorThresholdInBytes) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes) + : this(maxPoolSizeInBytes, GetLargeBufferThresholdInBytes(maxPoolSizeInBytes)) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + /// Arrays over this threshold will be pooled in which has less buckets for memory safety. + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes) + : this(maxPoolSizeInBytes, poolSelectorThresholdInBytes, DefaultLargePoolBucketCount, DefaultNormalPoolBucketCount) + { + } + + /// + /// Initializes a new instance of the class. + /// + /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. + /// The threshold to pool arrays in which has less buckets for memory safety. + /// Max arrays per bucket for the large array pool + /// Max arrays per bucket for the normal array pool + public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes, int maxArraysPerBucketLargePool, int maxArraysPerBucketNormalPool) + { + Guard.MustBeGreaterThan(maxPoolSizeInBytes, 0, nameof(maxPoolSizeInBytes)); + Guard.MustBeLessThanOrEqualTo(poolSelectorThresholdInBytes, maxPoolSizeInBytes, nameof(poolSelectorThresholdInBytes)); + + this.MaxPoolSizeInBytes = maxPoolSizeInBytes; + this.PoolSelectorThresholdInBytes = poolSelectorThresholdInBytes; + this.maxArraysPerBucketLargePool = maxArraysPerBucketLargePool; + this.maxArraysPerBucketNormalPool = maxArraysPerBucketNormalPool; + + this.InitArrayPools(); + } + + /// + /// Gets the maximum size of pooled arrays in bytes. + /// + public int MaxPoolSizeInBytes { get; } + + /// + /// Gets the threshold to pool arrays in which has less buckets for memory safety. + /// + public int PoolSelectorThresholdInBytes { get; } + + /// + public override void ReleaseRetainedResources() + { + this.InitArrayPools(); + } + + /// + public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + { + int itemSizeBytes = Unsafe.SizeOf(); + int bufferSizeInBytes = length * itemSizeBytes; + + ArrayPool pool = this.GetArrayPool(bufferSizeInBytes); + byte[] byteArray = pool.Rent(bufferSizeInBytes); + + var buffer = new Buffer(byteArray, length, pool); + if (options == AllocationOptions.Clean) + { + buffer.GetSpan().Clear(); + } + + return buffer; + } + + /// + public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) + { + ArrayPool pool = this.GetArrayPool(length); + byte[] byteArray = pool.Rent(length); + + var buffer = new ManagedByteBuffer(byteArray, length, pool); + if (options == AllocationOptions.Clean) + { + buffer.GetSpan().Clear(); + } + + return buffer; + } + + private static int GetLargeBufferThresholdInBytes(int maxPoolSizeInBytes) + { + return maxPoolSizeInBytes / 4; + } + + private ArrayPool GetArrayPool(int bufferSizeInBytes) + { + return bufferSizeInBytes <= this.PoolSelectorThresholdInBytes ? this.normalArrayPool : this.largeArrayPool; + } + + private void InitArrayPools() + { + this.largeArrayPool = ArrayPool.Create(this.MaxPoolSizeInBytes, this.maxArraysPerBucketLargePool); + this.normalArrayPool = ArrayPool.Create(this.PoolSelectorThresholdInBytes, this.maxArraysPerBucketNormalPool); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/BasicArrayBuffer.cs new file mode 100644 index 0000000000..a3e2d02cc7 --- /dev/null +++ b/src/SixLabors.Core/Memory/BasicArrayBuffer.cs @@ -0,0 +1,78 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.CompilerServices; + +namespace SixLabors.Memory +{ + /// + /// Wraps an array as an instance. + /// + /// + internal class BasicArrayBuffer : ManagedBufferBase + where T : struct + { + /// + /// Initializes a new instance of the class + /// + /// The array + /// The length of the buffer + public BasicArrayBuffer(T[] array, int length) + { + DebugGuard.MustBeLessThanOrEqualTo(length, array.Length, nameof(length)); + this.Array = array; + this.Length = length; + } + + /// + /// Initializes a new instance of the class + /// + /// The array + public BasicArrayBuffer(T[] array) + : this(array, array.Length) + { + } + + /// + /// Gets the array + /// + public T[] Array { get; } + + /// + /// Gets the length + /// + public int Length { get; } + + /// + /// Returns a reference to specified element of the buffer. + /// + /// The index + /// The reference to the specified element + public ref T this[int index] + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + get + { + DebugGuard.MustBeLessThan(index, this.Length, nameof(index)); + + Span span = this.GetSpan(); + return ref span[index]; + } + } + + /// + public override Span GetSpan() => this.Array.AsSpan(0, this.Length); + + /// + protected override void Dispose(bool disposing) + { + } + + /// + protected override object GetPinnableObject() + { + return this.Array; + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/BasicByteBuffer.cs new file mode 100644 index 0000000000..5706ca87a6 --- /dev/null +++ b/src/SixLabors.Core/Memory/BasicByteBuffer.cs @@ -0,0 +1,20 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory +{ + /// + /// Provides an based on . + /// + internal sealed class BasicByteBuffer : BasicArrayBuffer, IManagedByteBuffer + { + /// + /// Initializes a new instance of the class + /// + /// The byte array + internal BasicByteBuffer(byte[] array) + : base(array) + { + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/IManagedByteBuffer.cs b/src/SixLabors.Core/Memory/IManagedByteBuffer.cs new file mode 100644 index 0000000000..b6d956c102 --- /dev/null +++ b/src/SixLabors.Core/Memory/IManagedByteBuffer.cs @@ -0,0 +1,18 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Represents a byte buffer backed by a managed array. Useful for interop with classic .NET API-s. + /// + public interface IManagedByteBuffer : IMemoryOwner + { + /// + /// Gets the managed array backing this buffer instance. + /// + byte[] Array { get; } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/ManagedBufferBase.cs new file mode 100644 index 0000000000..1d07b2dac6 --- /dev/null +++ b/src/SixLabors.Core/Memory/ManagedBufferBase.cs @@ -0,0 +1,45 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory +{ + /// + /// Provides a base class for implementations by implementing pinning logic for adaption. + /// + /// The element type + internal abstract class ManagedBufferBase : MemoryManager + where T : struct + { + private GCHandle pinHandle; + + /// + public override unsafe MemoryHandle Pin(int elementIndex = 0) + { + if (!this.pinHandle.IsAllocated) + { + this.pinHandle = GCHandle.Alloc(this.GetPinnableObject(), GCHandleType.Pinned); + } + + void* ptr = (void*)this.pinHandle.AddrOfPinnedObject(); + return new MemoryHandle(ptr, this.pinHandle); + } + + /// + public override void Unpin() + { + if (this.pinHandle.IsAllocated) + { + this.pinHandle.Free(); + } + } + + /// + /// Gets the object that should be pinned. + /// + /// The pinnable + protected abstract object GetPinnableObject(); + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/SixLabors.Core/Memory/MemoryAllocator.cs new file mode 100644 index 0000000000..36ce8fcce0 --- /dev/null +++ b/src/SixLabors.Core/Memory/MemoryAllocator.cs @@ -0,0 +1,39 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Memory managers are used to allocate memory for image processing operations. + /// + public abstract class MemoryAllocator + { + /// + /// Allocates an , holding a of length . + /// + /// Type of the data stored in the buffer + /// Size of the buffer to allocate + /// The allocation options. + /// A buffer of values of type . + public abstract IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + where T : struct; + + /// + /// Allocates an . + /// + /// The requested buffer length + /// The allocation options. + /// The + public abstract IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None); + + /// + /// Releases all retained resources not being in use. + /// Eg: by resetting array pools and letting GC to free the arrays. + /// + public virtual void ReleaseRetainedResources() + { + } + } +} diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs new file mode 100644 index 0000000000..9b4c0fda07 --- /dev/null +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -0,0 +1,25 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System.Buffers; + +namespace SixLabors.Memory +{ + /// + /// Implements by newing up arrays by the GC on every allocation requests. + /// + public sealed class SimpleGcMemoryAllocator : MemoryAllocator + { + /// + public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) + { + return new BasicArrayBuffer(new T[length]); + } + + /// + public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) + { + return new BasicByteBuffer(new byte[length]); + } + } +} \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index d14738dd5b..bc37cd2e2d 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -42,6 +42,9 @@ All + + + diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs new file mode 100644 index 0000000000..0068fce918 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs @@ -0,0 +1,240 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +// ReSharper disable InconsistentNaming + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using SixLabors.Tests; +using Xunit; + +namespace SixLabors.Memory.Tests +{ + public class ArrayPoolMemoryManagerTests + { + private const int MaxPooledBufferSizeInBytes = 2048; + + private const int PoolSelectorThresholdInBytes = MaxPooledBufferSizeInBytes / 2; + + private MemoryAllocator MemoryAllocator { get; set; } = + new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes); + + /// + /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location + /// + private bool CheckIsRentingPooledBuffer(int length) + where T : struct + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(length); + ref T ptrToPrevPosition0 = ref buffer.GetReference(); + buffer.Dispose(); + + buffer = this.MemoryAllocator.Allocate(length); + bool sameBuffers = Unsafe.AreSame(ref ptrToPrevPosition0, ref buffer.GetReference()); + buffer.Dispose(); + + return sameBuffers; + } + + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes)) + { + } + } + + public class Constructor + { + [Fact] + public void WhenBothParametersPassedByUser() + { + var mgr = new ArrayPoolMemoryAllocator(1111, 666); + Assert.Equal(1111, mgr.MaxPoolSizeInBytes); + Assert.Equal(666, mgr.PoolSelectorThresholdInBytes); + } + + [Fact] + public void WhenPassedOnly_MaxPooledBufferSizeInBytes_SmallerThresholdValueIsAutoCalculated() + { + var mgr = new ArrayPoolMemoryAllocator(5000); + Assert.Equal(5000, mgr.MaxPoolSizeInBytes); + Assert.True(mgr.PoolSelectorThresholdInBytes < mgr.MaxPoolSizeInBytes); + } + + [Fact] + public void When_PoolSelectorThresholdInBytes_IsGreaterThan_MaxPooledBufferSizeInBytes_ExceptionIsThrown() + { + Assert.ThrowsAny(() => { new ArrayPoolMemoryAllocator(100, 200); }); + } + } + + [Theory] + [InlineData(32)] + [InlineData(512)] + [InlineData(MaxPooledBufferSizeInBytes - 1)] + public void SmallBuffersArePooled_OfByte(int size) + { + Assert.True(this.CheckIsRentingPooledBuffer(size)); + } + + + [Theory] + [InlineData(128 * 1024 * 1024)] + [InlineData(MaxPooledBufferSizeInBytes + 1)] + public void LargeBuffersAreNotPooled_OfByte(int size) + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + Assert.False(this.CheckIsRentingPooledBuffer(size)); + } + + [Fact] + public unsafe void SmallBuffersArePooled_OfBigValueType() + { + int count = (MaxPooledBufferSizeInBytes / sizeof(LargeStruct)) - 1; + + Assert.True(this.CheckIsRentingPooledBuffer(count)); + } + + [Fact] + public unsafe void LaregeBuffersAreNotPooled_OfBigValueType() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + int count = (MaxPooledBufferSizeInBytes / sizeof(LargeStruct)) + 1; + + Assert.False(this.CheckIsRentingPooledBuffer(count)); + } + + [Theory] + [InlineData(AllocationOptions.None)] + [InlineData(AllocationOptions.Clean)] + public void CleaningRequests_AreControlledByAllocationParameter_Clean(AllocationOptions options) + { + using (IMemoryOwner firstAlloc = this.MemoryAllocator.Allocate(42)) + { + firstAlloc.GetSpan().Fill(666); + } + + using (IMemoryOwner secondAlloc = this.MemoryAllocator.Allocate(42, options)) + { + int expected = options == AllocationOptions.Clean ? 0 : 666; + Assert.Equal(expected, secondAlloc.GetSpan()[0]); + } + } + + [Theory] + [InlineData(false)] + [InlineData(true)] + public void ReleaseRetainedResources_ReplacesInnerArrayPool(bool keepBufferAlive) + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(32); + ref int ptrToPrev0 = ref MemoryMarshal.GetReference(buffer.GetSpan()); + + if (!keepBufferAlive) + { + buffer.Dispose(); + } + + this.MemoryAllocator.ReleaseRetainedResources(); + + buffer = this.MemoryAllocator.Allocate(32); + + Assert.False(Unsafe.AreSame(ref ptrToPrev0, ref buffer.GetReference())); + } + + [Fact] + public void ReleaseRetainedResources_DisposingPreviouslyAllocatedBuffer_IsAllowed() + { + IMemoryOwner buffer = this.MemoryAllocator.Allocate(32); + this.MemoryAllocator.ReleaseRetainedResources(); + buffer.Dispose(); + } + + [Fact] + public void AllocationOverLargeArrayThreshold_UsesDifferentPool() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + int arrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); + + IMemoryOwner small = this.MemoryAllocator.Allocate(arrayLengthThreshold - 1); + ref int ptr2Small = ref small.GetReference(); + small.Dispose(); + + IMemoryOwner large = this.MemoryAllocator.Allocate(arrayLengthThreshold + 1); + + Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); + } + + [Fact] + public void CreateWithAggressivePooling() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateWithAggressivePooling(); + + Assert.True(this.CheckIsRentingPooledBuffer(4096 * 4096)); + } + + [Fact] + public void CreateDefault() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateDefault(); + + Assert.False(this.CheckIsRentingPooledBuffer(2 * 4096 * 4096)); + Assert.True(this.CheckIsRentingPooledBuffer(2048 * 2048)); + } + + [Fact] + public void CreateWithModeratePooling() + { + if (!TestEnvironment.Is64BitProcess) + { + // can lead to OutOfMemoryException + return; + } + + this.MemoryAllocator = ArrayPoolMemoryAllocator.CreateWithModeratePooling(); + + Assert.False(this.CheckIsRentingPooledBuffer(2048 * 2048)); + Assert.True(this.CheckIsRentingPooledBuffer(1024 * 16)); + } + + [StructLayout(LayoutKind.Sequential)] + private struct Rgba32 + { + private uint dummy; + } + + [StructLayout(LayoutKind.Explicit, Size = MaxPooledBufferSizeInBytes / 5)] + private struct LargeStruct + { + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs b/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs new file mode 100644 index 0000000000..fd53db1d8d --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace SixLabors.Memory.Tests +{ + internal static class BufferExtensions + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static Span GetSpan(this IMemoryOwner buffer) + => buffer.Memory.Span; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int Length(this IMemoryOwner buffer) + => buffer.GetSpan().Length; + + public static ref T GetReference(this IMemoryOwner buffer) + where T : struct => + ref MemoryMarshal.GetReference(buffer.GetSpan()); + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs b/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs new file mode 100644 index 0000000000..eca1842646 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs @@ -0,0 +1,318 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Xunit; + +// ReSharper disable InconsistentNaming +namespace SixLabors.Memory.Tests +{ + /// + /// Inherit this class to test an implementation (provided by ). + /// + public abstract class BufferTestSuite + { + protected BufferTestSuite(MemoryAllocator memoryAllocator) + { + this.MemoryAllocator = memoryAllocator; + } + + protected MemoryAllocator MemoryAllocator { get; } + + public struct CustomStruct : IEquatable + { + public long A; + + public byte B; + + public float C; + + public CustomStruct(long a, byte b, float c) + { + this.A = a; + this.B = b; + this.C = c; + } + + public bool Equals(CustomStruct other) + { + return this.A == other.A && this.B == other.B && this.C.Equals(other.C); + } + + public override bool Equals(object obj) + { + return obj is CustomStruct other && this.Equals(other); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = this.A.GetHashCode(); + hashCode = (hashCode * 397) ^ this.B.GetHashCode(); + hashCode = (hashCode * 397) ^ this.C.GetHashCode(); + return hashCode; + } + } + } + + public static readonly TheoryData LenthValues = new TheoryData { 0, 1, 7, 1023, 1024 }; + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_byte(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_float(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void HasCorrectLength_CustomStruct(int desiredLength) + { + this.TestHasCorrectLength(desiredLength); + } + + private void TestHasCorrectLength(int desiredLength) + where T : struct + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(desiredLength)) + { + Assert.Equal(desiredLength, buffer.GetSpan().Length); + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_byte(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength, false); + this.TestCanAllocateCleanBuffer(desiredLength, true); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_double(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void CanAllocateCleanBuffer_CustomStruct(int desiredLength) + { + this.TestCanAllocateCleanBuffer(desiredLength); + } + + private IMemoryOwner Allocate(int desiredLength, AllocationOptions options, bool managedByteBuffer) + where T : struct + { + if (managedByteBuffer) + { + if (!(this.MemoryAllocator.AllocateManagedByteBuffer(desiredLength, options) is IMemoryOwner buffer)) + { + throw new InvalidOperationException("typeof(T) != typeof(byte)"); + } + + return buffer; + } + + return this.MemoryAllocator.Allocate(desiredLength, options); + } + + private void TestCanAllocateCleanBuffer(int desiredLength, bool testManagedByteBuffer = false) + where T : struct, IEquatable + { + ReadOnlySpan expected = new T[desiredLength]; + + for (int i = 0; i < 10; i++) + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.Clean, testManagedByteBuffer)) + { + Assert.True(buffer.GetSpan().SequenceEqual(expected)); + } + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void SpanPropertyIsAlwaysTheSame_int(int desiredLength) + { + this.TestSpanPropertyIsAlwaysTheSame(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void SpanPropertyIsAlwaysTheSame_byte(int desiredLength) + { + this.TestSpanPropertyIsAlwaysTheSame(desiredLength, false); + this.TestSpanPropertyIsAlwaysTheSame(desiredLength, true); + } + + private void TestSpanPropertyIsAlwaysTheSame(int desiredLength, bool testManagedByteBuffer = false) + where T : struct + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + ref T a = ref MemoryMarshal.GetReference(buffer.GetSpan()); + ref T b = ref MemoryMarshal.GetReference(buffer.GetSpan()); + ref T c = ref MemoryMarshal.GetReference(buffer.GetSpan()); + + Assert.True(Unsafe.AreSame(ref a, ref b)); + Assert.True(Unsafe.AreSame(ref b, ref c)); + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void WriteAndReadElements_float(int desiredLength) + { + this.TestWriteAndReadElements(desiredLength, x => x * 1.2f); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void WriteAndReadElements_byte(int desiredLength) + { + this.TestWriteAndReadElements(desiredLength, x => (byte)(x + 1), false); + this.TestWriteAndReadElements(desiredLength, x => (byte)(x + 1), true); + } + + private void TestWriteAndReadElements(int desiredLength, Func getExpectedValue, bool testManagedByteBuffer = false) + where T : struct + { + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + T[] expectedVals = new T[buffer.Length()]; + + for (int i = 0; i < buffer.Length(); i++) + { + Span span = buffer.GetSpan(); + expectedVals[i] = getExpectedValue(i); + span[i] = expectedVals[i]; + } + + for (int i = 0; i < buffer.Length(); i++) + { + Span span = buffer.GetSpan(); + Assert.Equal(expectedVals[i], span[i]); + } + } + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_byte(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength, false); + this.TestIndexOutOfRangeShouldThrow(desiredLength, true); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_long(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength); + } + + [Theory] + [MemberData(nameof(LenthValues))] + public void IndexingSpan_WhenOutOfRange_Throws_CustomStruct(int desiredLength) + { + this.TestIndexOutOfRangeShouldThrow(desiredLength); + } + + private T TestIndexOutOfRangeShouldThrow(int desiredLength, bool testManagedByteBuffer = false) + where T : struct, IEquatable + { + var dummy = default(T); + + using (IMemoryOwner buffer = this.Allocate(desiredLength, AllocationOptions.None, testManagedByteBuffer)) + { + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength]; + }); + + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength + 1]; + }); + + Assert.ThrowsAny( + () => + { + Span span = buffer.GetSpan(); + dummy = span[desiredLength + 42]; + }); + } + + return dummy; + } + + [Theory] + [InlineData(1)] + [InlineData(7)] + [InlineData(1024)] + [InlineData(6666)] + public void ManagedByteBuffer_ArrayIsCorrect(int desiredLength) + { + using (IManagedByteBuffer buffer = this.MemoryAllocator.AllocateManagedByteBuffer(desiredLength)) + { + ref byte array0 = ref buffer.Array[0]; + ref byte span0 = ref buffer.GetReference(); + + Assert.True(Unsafe.AreSame(ref span0, ref array0)); + Assert.True(buffer.Array.Length >= buffer.GetSpan().Length); + } + } + + [Fact] + public void GetMemory_ReturnsValidMemory() + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(42)) + { + Span span0 = buffer.GetSpan(); + span0[10].A = 30; + Memory memory = buffer.Memory; + + Assert.Equal(42, memory.Length); + Span span1 = memory.Span; + + Assert.Equal(42, span1.Length); + Assert.Equal(30, span1[10].A); + } + } + + [Fact] + public unsafe void GetMemory_ResultIsPinnable() + { + using (IMemoryOwner buffer = this.MemoryAllocator.Allocate(42)) + { + Span span0 = buffer.GetSpan(); + span0[10] = 30; + + Memory memory = buffer.Memory; + + using (MemoryHandle h = memory.Pin()) + { + int* ptr = (int*)h.Pointer; + Assert.Equal(30, ptr[10]); + } + } + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs new file mode 100644 index 0000000000..a6ddeb0507 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs @@ -0,0 +1,16 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +namespace SixLabors.Memory.Tests +{ + public class SimpleGcMemoryManagerTests + { + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new SimpleGcMemoryAllocator()) + { + } + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 6869491e32..d23fb956a1 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -14,6 +14,7 @@ false full SixLabors.Tests + true diff --git a/tests/SixLabors.Core.Tests/TestEnvironment.cs b/tests/SixLabors.Core.Tests/TestEnvironment.cs new file mode 100644 index 0000000000..77be7bfe10 --- /dev/null +++ b/tests/SixLabors.Core.Tests/TestEnvironment.cs @@ -0,0 +1,12 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; + +namespace SixLabors.Tests +{ + internal class TestEnvironment + { + internal static bool Is64BitProcess => IntPtr.Size == 8; + } +} \ No newline at end of file From fb58b5f2ef7df55af53a9bd3cfb9df419646d510 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 26 Jul 2018 01:21:32 +0200 Subject: [PATCH 058/136] [SL.Core] move internals into a nested namespace --- src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs | 1 + src/SixLabors.Core/Memory/{ => Internals}/BasicArrayBuffer.cs | 2 +- src/SixLabors.Core/Memory/{ => Internals}/BasicByteBuffer.cs | 2 +- src/SixLabors.Core/Memory/{ => Internals}/ManagedBufferBase.cs | 2 +- src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) rename src/SixLabors.Core/Memory/{ => Internals}/BasicArrayBuffer.cs (98%) rename src/SixLabors.Core/Memory/{ => Internals}/BasicByteBuffer.cs (94%) rename src/SixLabors.Core/Memory/{ => Internals}/ManagedBufferBase.cs (97%) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index b563d4a793..31096d3a93 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -4,6 +4,7 @@ using System; using System.Buffers; using System.Runtime.InteropServices; +using SixLabors.Memory.Internals; namespace SixLabors.Memory { diff --git a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs similarity index 98% rename from src/SixLabors.Core/Memory/BasicArrayBuffer.cs rename to src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index a3e2d02cc7..5e9f17c4fd 100644 --- a/src/SixLabors.Core/Memory/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -4,7 +4,7 @@ using System; using System.Runtime.CompilerServices; -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Wraps an array as an instance. diff --git a/src/SixLabors.Core/Memory/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs similarity index 94% rename from src/SixLabors.Core/Memory/BasicByteBuffer.cs rename to src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs index 5706ca87a6..ee76c2ee3a 100644 --- a/src/SixLabors.Core/Memory/BasicByteBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Provides an based on . diff --git a/src/SixLabors.Core/Memory/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs similarity index 97% rename from src/SixLabors.Core/Memory/ManagedBufferBase.cs rename to src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs index 1d07b2dac6..9dadcf5a28 100644 --- a/src/SixLabors.Core/Memory/ManagedBufferBase.cs +++ b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs @@ -4,7 +4,7 @@ using System.Buffers; using System.Runtime.InteropServices; -namespace SixLabors.Memory +namespace SixLabors.Memory.Internals { /// /// Provides a base class for implementations by implementing pinning logic for adaption. diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index 9b4c0fda07..cc11579794 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System.Buffers; +using SixLabors.Memory.Internals; namespace SixLabors.Memory { From 3450a4cfa07ca02ec579bfddb0f6113da7d47534 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 27 Jul 2018 01:08:08 +0200 Subject: [PATCH 059/136] [SL.Core] remove unused indexer --- .../Memory/Internals/BasicArrayBuffer.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index 5e9f17c4fd..bc12d7c2f1 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -44,23 +44,6 @@ public BasicArrayBuffer(T[] array) /// public int Length { get; } - /// - /// Returns a reference to specified element of the buffer. - /// - /// The index - /// The reference to the specified element - public ref T this[int index] - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - DebugGuard.MustBeLessThan(index, this.Length, nameof(index)); - - Span span = this.GetSpan(); - return ref span[index]; - } - } - /// public override Span GetSpan() => this.Array.AsSpan(0, this.Length); From 890d49daa026996fd21a469b41b53597131aecec Mon Sep 17 00:00:00 2001 From: Scott Williams Date: Wed, 1 Aug 2018 18:18:32 +0100 Subject: [PATCH 060/136] [SL.Core] fix build version number generation --- appveyor.yml | 13 +----- build.cmd | 23 +---------- build.ps1 | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 112 insertions(+), 34 deletions(-) create mode 100644 build.ps1 diff --git a/appveyor.yml b/appveyor.yml index 8938394487..016a9ee379 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,19 +1,16 @@ version: 0.0.{build} image: Visual Studio 2017 -install: - - choco install gitversion.portable -pre -y before_build: - cmd: dotnet --version - - ps: c:\ProgramData\chocolatey\lib\gitversion.portable\tools\gitversion.exe /l console /output buildserver build_script: - cmd: build.cmd - cmd: tests\CodeCoverage\CodeCoverage.cmd after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%GitVersion_NuGetVersion%.nupkg" + - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%APPVEYOR_BUILD_VERSION%.nupkg" deploy: - provider: NuGet @@ -24,14 +21,6 @@ deploy: artifact: /.*\.nupkg/ on: branch: master - - provider: NuGet - server: https://www.myget.org/F/sixlabors-unstable/api/v2/package - symbol_server: https://www.myget.org/F/sixlabors-unstable/symbols/api/v2/package - api_key: - secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 - artifact: /.*\.nupkg/ - on: - branch: develop # prevent the double build when a branch has an active PR skip_branch_with_pr: true diff --git a/build.cmd b/build.cmd index e55aad06ff..6372b41253 100644 --- a/build.cmd +++ b/build.cmd @@ -1,27 +1,6 @@ @echo Off -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet restore /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet restore -) - -ECHO Building nuget packages -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet build -c Release /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet build -c Release -) -if not "%errorlevel%"=="0" goto failure - -dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj - - -if not "%GitVersion_NuGetVersion%" == "" ( - dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=%GitVersion_NuGetVersion% -)ELSE ( - dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build -) +PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\build.ps1'" if not "%errorlevel%"=="0" goto failure diff --git a/build.ps1 b/build.ps1 new file mode 100644 index 0000000000..fcd63aea27 --- /dev/null +++ b/build.ps1 @@ -0,0 +1,110 @@ + +# lets calulat the correct version here +$fallbackVersion = "1.0.0"; +$version = '' + +$tagRegex = '^v?(\d+\.\d+\.\d+)(-([a-zA-Z]+)\.?(\d*))?$' + +# we are running on the build server +$isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex + + if($isVersionTag){ + + Write-Debug "Building commit tagged with a compatable version number" + + $version = $matches[1] + $postTag = $matches[3] + $count = $matches[4] + Write-Debug "version number: ${version} post tag: ${postTag} count: ${count}" + if("$postTag" -ne ""){ + $version = "${version}-${postTag}" + } + if("$count" -ne ""){ + # for consistancy with previous releases we pad the counter to only 4 places + $padded = $count.Trim().Trim('0').PadLeft(4,"0"); + Write-Debug "count '$count', padded '${padded}'" + + $version = "${version}${padded}" + } + }else { + + Write-Debug "Untagged" + $lastTag = (git tag --list --sort=-taggerdate) | Out-String + $list = $lastTag.Split("`n") + foreach ($tag in $list) { + + Write-Debug "testing ${tag}" + $tag = $tag.Trim(); + if($tag -match $tagRegex){ + Write-Debug "matched ${tag}" + $version = $matches[1]; + break; + } + } + + if("$version" -eq ""){ + $version = $fallbackVersion + Write-Debug "Failed to discover base version Fallback to '${version}'" + }else{ + + Write-Debug "Discovered base version from tags '${version}'" + } + + $buildNumber = $env:APPVEYOR_BUILD_NUMBER + + # build number replacement is padded to 6 places + $buildNumber = "$buildNumber".Trim().Trim('0').PadLeft(6,"0"); + if("$env:APPVEYOR_PULL_REQUEST_NUMBER" -ne ""){ + Write-Debug "building a PR" + + $prNumber = "$env:APPVEYOR_PULL_REQUEST_NUMBER".Trim().Trim('0').PadLeft(5,"0"); + # this is a PR + $version = "${version}-PullRequest${prNumber}${buildNumber}"; + }else{ + Write-Debug "building a branch commit" + + # this is a general branch commit + $branch = $env:APPVEYOR_REPO_BRANCH + + if("$branch" -eq ""){ + $branch = ((git rev-parse --abbrev-ref HEAD) | Out-String).Trim() + + if("$branch" -eq ""){ + $branch = "unknown" + } + } + + $branch = $branch.Replace("/","-").ToLower() + + if($branch.ToLower() -eq "master"){ + $branch = "dev" + } + + $version = "${version}-${branch}${buildNumber}"; + } + } + +if("$env:APPVEYOR_API_URL" -ne ""){ + # update appveyor build number for this build + Invoke-RestMethod -Method "PUT" ` + -Uri "${env:APPVEYOR_API_URL}api/build" ` + -Body "{version:'${version}'}" ` + -ContentType "application/json" +} + +Write-Host "Building version '${version}'" +dotnet restore /p:packageversion=$version + +Write-Host "Building projects" +dotnet build -c Release /p:packageversion=$version + +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } + +if ( $env:CI -ne "True") { + dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj --no-build -c Release +} +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } + +Write-Host "Packaging projects" +dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=$version +if ($LASTEXITCODE ){ Exit $LASTEXITCODE } \ No newline at end of file From 87c124eee4e700182444980981f9adc187e95274 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:08 -0700 Subject: [PATCH 061/136] [SL.Core] Cross target .NETCOREAPP2.1 --- src/SixLabors.Core/MathF.cs | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 3079c91004..1329dbdae9 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; -#if NETCOREAPP2_0 +#if NETCOREAPP2_0 || NETCOREAPP2_1 [assembly: TypeForwardedTo(typeof(System.MathF))] #else namespace System diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index bc37cd2e2d..65955529de 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netcoreapp2.0; + netstandard1.1;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core @@ -39,13 +39,18 @@ - - All - + + All + + + + + + - + From 480b35a636a17b3963f778a34ad9ccf2e479f209 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:18 -0700 Subject: [PATCH 062/136] [SL.Core] Use pattern matching --- src/SixLabors.Core/Primitives/Point.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index ab12e28ff3..f302b82182 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -267,7 +267,7 @@ public override string ToString() } /// - public override bool Equals(object obj) => obj is Point && this.Equals((Point)obj); + public override bool Equals(object obj) => obj is Point other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] From d4ac432d9fe6ac196b5514dff7ee6d61af5fcb2f Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:31:37 -0700 Subject: [PATCH 063/136] [SL.Core] Remove unused Gaurd overloads --- src/SixLabors.Core/Helpers/Guard.cs | 32 ++++------------ .../Helpers/GuardTests.cs | 37 ------------------- 2 files changed, 7 insertions(+), 62 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 41db42fc1a..069c4eb051 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -20,19 +20,13 @@ internal static class Guard /// /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. /// is null /// The type of the object to verify - public static void NotNull(T target, string parameterName, string message = "") + public static void NotNull(T target, string parameterName) where T : class { - if (target == null) + if (target is null) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentNullException(parameterName, message); - } - throw new ArgumentNullException(parameterName); } } @@ -44,20 +38,14 @@ public static void NotNull(T target, string parameterName, string message = " /// /// The target string, which should be checked against being null or empty. /// Name of the parameter. - /// The error message, if any to add to the exception. /// is null. /// is empty or contains only blanks. - public static void NotNullOrEmpty(string target, string parameterName, string message = "") + public static void NotNullOrEmpty(string target, string parameterName) { - NotNull(target, parameterName, message); + NotNull(target, parameterName); if (string.IsNullOrWhiteSpace(target)) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentException(message, parameterName); - } - throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); } } @@ -68,20 +56,14 @@ public static void NotNullOrEmpty(string target, string parameterName, string me /// The type of objects in the /// The target enumeration, which should be checked against being null or empty. /// Name of the parameter. - /// The error message, if any to add to the exception. /// is null. /// is empty. - public static void NotNullOrEmpty(IEnumerable target, string parameterName, string message = "") + public static void NotNullOrEmpty(IEnumerable target, string parameterName) { - NotNull(target, parameterName, message); + NotNull(target, parameterName); if (!target.Any()) { - if (!string.IsNullOrWhiteSpace(message)) - { - throw new ArgumentException(message, parameterName); - } - throw new ArgumentException("Value cannot be empty.", parameterName); } } @@ -247,4 +229,4 @@ public static void MustBeSizedAtLeast(T[] value, int minLength, string parame } } } -} +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index ed2e0b5c75..b3f1b96a0e 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Xunit; namespace SixLabors.Helpers.Tests @@ -25,18 +24,6 @@ public void NotNull_TargetNull_ThrowsException() }); } - [Fact] - public void NotNull_TargetNullWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNull((object)null, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() { @@ -73,18 +60,6 @@ public void NotNullOrEmpty_TargetEmpty_ThrowsException() Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); } - [Fact] - public void NotNullOrEmpty_TargetEmptyWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(string.Empty, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() { @@ -112,18 +87,6 @@ public void NotNullOrEmptyIEnumerable_TargetEmpty_ThrowsException() Assert.True(exception.Message.Contains("Value cannot be empty.")); } - [Fact] - public void NotNullOrEmptyIEnumerable_TargetEmptyWithMessage_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(new string[] { }, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From 14780a70c40c16115a51f7b3e59dfedd02d81ba6 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:32:58 -0700 Subject: [PATCH 064/136] [SL.Core] Seal ManagedByteBuffer --- .../Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index 31096d3a93..0b0d6c4d49 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -51,7 +51,7 @@ public Buffer(byte[] data, int length, ArrayPool sourcePool) /// protected override void Dispose(bool disposing) { - if (!disposing || this.Data == null || this.sourcePoolReference == null) + if (!disposing || this.Data is null || this.sourcePoolReference is null) { return; } @@ -71,7 +71,7 @@ protected override void Dispose(bool disposing) /// /// The implementation of . /// - private class ManagedByteBuffer : Buffer, IManagedByteBuffer + private sealed class ManagedByteBuffer : Buffer, IManagedByteBuffer { public ManagedByteBuffer(byte[] data, int length, ArrayPool sourcePool) : base(data, length, sourcePool) From 9f2ae5eaf9477524aeae34c89a80432616f40558 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:43:50 -0700 Subject: [PATCH 065/136] [SL.Core] Extend HashHelper.Combine to accept 2, 3, or 4 args --- src/SixLabors.Core/Helpers/HashHelpers.cs | 36 ++++++++++++++++++++- src/SixLabors.Core/Primitives/Rectangle.cs | 11 ++++--- src/SixLabors.Core/Primitives/RectangleF.cs | 11 ++++--- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 40a2b3f96a..a453a53de5 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -13,7 +13,7 @@ internal static class HashHelpers ///
/// Hash code one /// Hash code two - /// Returns a hash code for the two specified has codes. + /// Returns a hash code for the provided hash codes. public static int Combine(int h1, int h2) { unchecked @@ -24,5 +24,39 @@ public static int Combine(int h1, int h2) return ((int)rol5 + h1) ^ h2; } } + + /// + /// Combines the three specified hash codes. + /// + /// The first + /// Hash code two + /// Hash code three + /// Returns a hash code for the provided hash codes. + public static int Combine(int h1, int h2, int h3) + { + int hash = Combine(h1, h2); + + hash = Combine(hash, h3); + + return hash; + } + + /// + /// Combines the four specified hash codes. + /// + /// The first + /// Hash code two + /// Hash code three + /// Hash code four + /// Returns a hash code for the provided hash codes. + public static int Combine(int h1, int h2, int h3, int h4) + { + int hash = Combine(h1, h2); + + hash = Combine(hash, h3); + hash = Combine(hash, h4); + + return hash; + } } } diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 27cba5d15e..b68732c40c 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -460,11 +460,12 @@ public override string ToString() private int GetHashCode(Rectangle rectangle) { - int hashCode = rectangle.X.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); - return hashCode; + return HashHelpers.Combine( + rectangle.X.GetHashCode(), + rectangle.Y.GetHashCode(), + rectangle.Width.GetHashCode(), + rectangle.Height.GetHashCode() + ); } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index d5ee6a61b4..a33d227e06 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -393,11 +393,12 @@ public override string ToString() private int GetHashCode(RectangleF rectangle) { - int hashCode = rectangle.X.GetHashCode(); - hashCode = HashHelpers.Combine(hashCode, rectangle.Y.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Width.GetHashCode()); - hashCode = HashHelpers.Combine(hashCode, rectangle.Height.GetHashCode()); - return hashCode; + return HashHelpers.Combine( + rectangle.X.GetHashCode(), + rectangle.Y.GetHashCode(), + rectangle.Width.GetHashCode(), + rectangle.Height.GetHashCode() + ); } } } \ No newline at end of file From 1c29c7fc323c65440ce47a021fff09b1204a5f25 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:46:21 -0700 Subject: [PATCH 066/136] [SL.Core] Update Moq & xunit --- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index d23fb956a1..da61cd0b84 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -28,10 +28,10 @@ - - - - + + + + From 7b54e5602f29c4ed0b824b1c191186e7fbfd9a23 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:46:30 -0700 Subject: [PATCH 067/136] [SL.Core] Update System.Numerics.Vectors --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 65955529de..8215664dc2 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -52,6 +52,6 @@ - + \ No newline at end of file From 187d0a16c0e100984f532344061c4113f83c6407 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:53:44 -0700 Subject: [PATCH 068/136] [SL.Core] Remove unused Gaurd.IsTrue and Gaurd.IsFalse --- src/SixLabors.Core/Helpers/Guard.cs | 42 ------------------- .../Helpers/GuardTests.cs | 36 ---------------- 2 files changed, 78 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 069c4eb051..0e4ef336d4 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -169,48 +169,6 @@ public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TVal } } - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// - /// The target value, which cannot be false. - /// - /// - /// The name of the parameter that is to be checked. - /// - /// - /// The error message, if any to add to the exception. - /// - /// - /// is false - /// - public static void IsTrue(bool value, string parameterName, string message) - { - if (!value) - { - throw new ArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true - /// - public static void IsFalse(bool value, string parameterName, string message) - { - if (value) - { - throw new ArgumentException(message, parameterName); - } - } - /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index b3f1b96a0e..fee12db175 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -190,42 +190,6 @@ public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); } - [Fact] - public void IsTrue_IsTrue_ThrowsNoException() - { - Guard.IsTrue(true, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsTrue_IsFalse_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.IsTrue(false, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - - [Fact] - public void IsFalse_IsFalse_ThrowsNoException() - { - Guard.IsFalse(false, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsFalse_IsTrue_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.IsFalse(true, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Theory] [InlineData(2, 1)] [InlineData(2, 2)] From 1729bd662bdabc5c1b722fbfe49bc54e1f236bf0 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:54:29 -0700 Subject: [PATCH 069/136] [SL.Core] Remove private implementations of GetHashCode (and it's call overhead) --- src/SixLabors.Core/Primitives/Point.cs | 6 ++- src/SixLabors.Core/Primitives/PointF.cs | 16 ++------ src/SixLabors.Core/Primitives/Rectangle.cs | 19 ++++------ src/SixLabors.Core/Primitives/RectangleF.cs | 41 +++++++-------------- src/SixLabors.Core/Primitives/SizeF.cs | 4 +- 5 files changed, 30 insertions(+), 56 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index f302b82182..e42e2bf69d 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -258,7 +258,10 @@ public void Offset(int dx, int dy) public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + } /// public override string ToString() @@ -277,6 +280,5 @@ public override string ToString() private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - private int GetHashCode(Point point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 7c04315562..699cec8c69 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -267,7 +267,10 @@ public void Offset(float dx, float dy) public void Offset(PointF point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + } /// public override string ToString() @@ -281,16 +284,5 @@ public override string ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(PointF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(PointF point) => HashHelpers.Combine(point.X.GetHashCode(), point.Y.GetHashCode()); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index b68732c40c..5b4ac10a7d 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -443,7 +443,14 @@ public void Offset(int dx, int dy) } /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine( + this.X.GetHashCode(), + this.Y.GetHashCode(), + this.Width.GetHashCode(), + this.Height.GetHashCode()); + } /// public override string ToString() @@ -457,15 +464,5 @@ public override string ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; - - private int GetHashCode(Rectangle rectangle) - { - return HashHelpers.Combine( - rectangle.X.GetHashCode(), - rectangle.Y.GetHashCode(), - rectangle.Width.GetHashCode(), - rectangle.Height.GetHashCode() - ); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a33d227e06..a7f46db0a7 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -120,10 +120,7 @@ public SizeF Size public float Top { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y; - } + get => this.Y; } /// @@ -132,10 +129,7 @@ public float Top public float Right { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X + this.Width; - } + get => this.X + this.Width; } /// @@ -144,10 +138,7 @@ public float Right public float Bottom { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y + this.Height; - } + get => this.Y + this.Height; } /// @@ -156,10 +147,7 @@ public float Bottom public float Left { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X; - } + get => this.X; } /// @@ -376,7 +364,14 @@ public void Offset(float dx, float dy) } /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() + { + return HashHelpers.Combine( + this.X.GetHashCode(), + this.Y.GetHashCode(), + this.Width.GetHashCode(), + this.Height.GetHashCode()); + } /// public override string ToString() @@ -385,20 +380,10 @@ public override string ToString() } /// - public override bool Equals(object obj) => obj is RectangleF && this.Equals((RectangleF)obj); + public override bool Equals(object obj) => obj is RectangleF other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); - - private int GetHashCode(RectangleF rectangle) - { - return HashHelpers.Combine( - rectangle.X.GetHashCode(), - rectangle.Y.GetHashCode(), - rectangle.Width.GetHashCode(), - rectangle.Height.GetHashCode() - ); - } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 13c6552ac3..365efdc2aa 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -200,7 +200,7 @@ public static SizeF Transform(SizeF size, Matrix3x2 matrix) /// public override int GetHashCode() { - return this.GetHashCode(this); + return HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); } /// @@ -224,7 +224,5 @@ public override string ToString() /// Product of type SizeF. private static SizeF Multiply(SizeF size, float multiplier) => new SizeF(size.Width * multiplier, size.Height * multiplier); - - private int GetHashCode(SizeF size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 43693a96f5054aec5d798b177ebdb38ff0010ede Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 11:55:52 -0700 Subject: [PATCH 070/136] [SL.Core] Use expressions --- src/SixLabors.Core/Primitives/Point.cs | 6 +----- src/SixLabors.Core/Primitives/PointF.cs | 5 +---- src/SixLabors.Core/Primitives/Size.cs | 5 +---- src/SixLabors.Core/Primitives/SizeF.cs | 5 +---- 4 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index e42e2bf69d..8f9db05b83 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -264,10 +264,7 @@ public override int GetHashCode() } /// - public override string ToString() - { - return $"Point [ X={this.X}, Y={this.Y} ]"; - } + public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; /// public override bool Equals(object obj) => obj is Point other && this.Equals(other); @@ -279,6 +276,5 @@ public override string ToString() private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); private static short LowInt16(int n) => unchecked((short)(n & 0xffff)); - } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 699cec8c69..c163da7cd4 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -273,10 +273,7 @@ public override int GetHashCode() } /// - public override string ToString() - { - return $"PointF [ X={this.X}, Y={this.Y} ]"; - } + public override string ToString() => $"PointF [ X={this.X}, Y={this.Y} ]"; /// public override bool Equals(object obj) => obj is PointF && this.Equals((PointF)obj); diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 57884cf5dc..d5ff95ad5a 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -255,10 +255,7 @@ public static SizeF Transform(Size size, Matrix3x2 matrix) public override int GetHashCode() => this.GetHashCode(this); /// - public override string ToString() - { - return $"Size [ Width={this.Width}, Height={this.Height} ]"; - } + public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; /// public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 365efdc2aa..8dbdd74248 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -204,10 +204,7 @@ public override int GetHashCode() } /// - public override string ToString() - { - return $"SizeF [ Width={this.Width}, Height={this.Height} ]"; - } + public override string ToString() => $"SizeF [ Width={this.Width}, Height={this.Height} ]"; /// public override bool Equals(object obj) => obj is SizeF && this.Equals((SizeF)obj); From 177e1e2373d3e62026a6203554fa3a1a036714d9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:00:01 -0700 Subject: [PATCH 071/136] [SL.Core] Update tests to target netcoreapp2.1 --- tests/CodeCoverage/CodeCoverage.cmd | 2 +- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd index d5318bf7a6..347e0338c8 100644 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ b/tests/CodeCoverage/CodeCoverage.cmd @@ -10,7 +10,7 @@ cd .. dotnet restore SixLabors.Core.sln dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp1.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" +tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp2.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" if %errorlevel% neq 0 exit /b %errorlevel% diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index da61cd0b84..64545d0829 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -2,7 +2,7 @@ 0.0.0 - netcoreapp1.1;netcoreapp2.0; + netcoreapp1.1;netcoreapp2.1; SixLabors.Core.Tests SixLabors.Shapes.Tests true @@ -38,8 +38,4 @@ - - - - From a543ce637161350abd2e3e9c8a602814be1883c9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:02:47 -0700 Subject: [PATCH 072/136] [SL.Core] Remove additional unused Guard methods --- src/SixLabors.Core/Helpers/Guard.cs | 58 +------------- .../Helpers/GuardTests.cs | 79 ------------------- 2 files changed, 2 insertions(+), 135 deletions(-) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index 0e4ef336d4..b50cd4ab04 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -14,60 +14,6 @@ namespace SixLabors [DebuggerStepThrough] internal static class Guard { - /// - /// Verifies, that the method parameter with specified object value is not null - /// and throws an exception if it is found to be so. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// is null - /// The type of the object to verify - public static void NotNull(T target, string parameterName) - where T : class - { - if (target is null) - { - throw new ArgumentNullException(parameterName); - } - } - - /// - /// Verifies, that the string method parameter with specified object value and message - /// is not null, not empty and does not contain only blanks and throws an exception - /// if the object is null. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - public static void NotNullOrEmpty(string target, string parameterName) - { - NotNull(target, parameterName); - - if (string.IsNullOrWhiteSpace(target)) - { - throw new ArgumentException("Value cannot be null, empty, or cannot contain only whitespace.", parameterName); - } - } - - /// - /// Verifies, that the enumeration is not null and not empty. - /// - /// The type of objects in the - /// The target enumeration, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty. - public static void NotNullOrEmpty(IEnumerable target, string parameterName) - { - NotNull(target, parameterName); - - if (!target.Any()) - { - throw new ArgumentException("Value cannot be empty.", parameterName); - } - } - /// /// Verifies that the specified value is less than a maximum value /// and throws an exception if it is not. @@ -80,7 +26,7 @@ public static void NotNullOrEmpty(IEnumerable target, string parameterName /// is greater than the maximum value. /// public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) >= 0) { @@ -100,7 +46,7 @@ public static void MustBeLessThan(TValue value, TValue max, string param /// is greater than the maximum value. /// public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) > 0) { diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index fee12db175..f95e46e355 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -2,91 +2,12 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections.Generic; using Xunit; namespace SixLabors.Helpers.Tests { public class GuardTests { - [Fact] - public void NotNull_TargetNotNull_ThrowsNoException() - { - Guard.NotNull("test", "myParamName"); - } - - [Fact] - public void NotNull_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNull((object)null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetNotNullOrEmpty_ThrowsNoException() - { - Guard.NotNullOrEmpty("test", "myParamName"); - } - - [Fact] - public void NotNullOrEmpty_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty(null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetWhitespace_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty("\n\n", "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmpty_TargetEmpty_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(string.Empty, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("Value cannot be null, empty, or cannot contain only whitespace.")); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetNotNullOrEmpty_ThrowsNoException() - { - Guard.NotNullOrEmpty(new string[] { "test" }, "myParamName"); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetNull_ThrowsException() - { - Assert.Throws(() => - { - Guard.NotNullOrEmpty((IEnumerable)null, "myParamName"); - }); - } - - [Fact] - public void NotNullOrEmptyIEnumerable_TargetEmpty_ThrowsException() - { - var exception = Assert.Throws(() => - { - Guard.NotNullOrEmpty(new string[] { }, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("Value cannot be empty.")); - } - [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From ea9c9e9c8e29b1dec7c3996657046ab7233454d4 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:03:38 -0700 Subject: [PATCH 073/136] [SL.Core] Remove unused DebugGuard methods --- src/SixLabors.Core/Helpers/DebugGuard.cs | 47 +----------------------- 1 file changed, 2 insertions(+), 45 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f41d7eacfb..210b13c998 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -24,7 +24,7 @@ internal static class DebugGuard public static void NotNull(T target, string parameterName) where T : class { - if (target == null) + if (target is null) { throw new ArgumentNullException(parameterName); } @@ -115,50 +115,7 @@ public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); } } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// - /// The target value, which cannot be false. - /// - /// - /// The name of the parameter that is to be checked. - /// - /// - /// The error message, if any to add to the exception. - /// - /// - /// is false - /// - [Conditional("DEBUG")] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - throw new ArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true - /// - [Conditional("DEBUG")] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - throw new ArgumentException(message, parameterName); - } - } + /// /// Verifies, that the `target` array has declared the length or longer. From fb46544e0a9dd3a63c1b853a1aaef0af7f23d65c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 12:12:43 -0700 Subject: [PATCH 074/136] [SL.Core] Remove whitespace --- src/SixLabors.Core/Helpers/DebugGuard.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index 210b13c998..f1fc1c64c3 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -115,7 +115,6 @@ public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); } } - /// /// Verifies, that the `target` array has declared the length or longer. From 9b97df58c4385858ad86d88660a1778c6214df62 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 24 Aug 2018 14:45:41 -0700 Subject: [PATCH 075/136] [SL.Core] Remove unused DebugGaurd tests --- .../Helpers/DebugGuardTests.cs | 37 ------------------- 1 file changed, 37 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 843b74dede..f3db76ef54 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -5,7 +5,6 @@ #define DEBUG using System; -using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; @@ -123,42 +122,6 @@ public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); } - [Fact] - public void IsTrue_IsTrue_ThrowsNoException() - { - DebugGuard.IsTrue(true, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsTrue_IsFalse_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.IsTrue(false, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - - [Fact] - public void IsFalse_IsFalse_ThrowsNoException() - { - DebugGuard.IsFalse(false, "myParamName", "myTestMessage"); - } - - [Fact] - public void IsFalse_IsTrue_ThrowsException() - { - var exception = Assert.Throws(() => - { - DebugGuard.IsFalse(true, "myParamName", "myTestMessage"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains("myTestMessage")); - } - [Theory] [InlineData(new int[] { 1, 2 }, 1)] [InlineData(new int[] { 1, 2 }, 2)] From 2f61cafab168ac79216847fe6fa001581b172fce Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 07:58:38 -0700 Subject: [PATCH 076/136] [SL.Core] Cleanup AssemblyInfo add SUPPORT_MATHF symbol --- src/SixLabors.Core/MathF.cs | 2 +- src/SixLabors.Core/Properties/AssemblyInfo.cs | 29 ------------------- src/SixLabors.Core/SixLabors.Core.csproj | 29 ++++++++----------- 3 files changed, 13 insertions(+), 47 deletions(-) diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index 1329dbdae9..b0d760ade4 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -3,7 +3,7 @@ using System.Runtime.CompilerServices; -#if NETCOREAPP2_0 || NETCOREAPP2_1 +#if SUPPORTS_MATHF [assembly: TypeForwardedTo(typeof(System.MathF))] #else namespace System diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 96a40f6f6e..5402a1af1e 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -1,37 +1,8 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Reflection; -using System.Resources; using System.Runtime.CompilerServices; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("SixLabors.Core")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Six Labors")] -[assembly: AssemblyProduct("SixLabors.Core")] -[assembly: AssemblyCopyright("Copyright (c) Six Labors and contributors.")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -[assembly: NeutralResourcesLanguage("en")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] -[assembly: AssemblyInformationalVersion("0.1.0-alpha02")] - // Ensure the internals can be tested. [assembly: InternalsVisibleTo("SixLabors.Core.Tests")] diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 8215664dc2..b03eac761e 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -16,16 +16,7 @@ http://www.apache.org/licenses/LICENSE-2.0 git https://github.com/SixLabors/Core - false - false - false - false - false - false - false - false - false - false + Copyright (c) Six Labors and contributors. full SixLabors @@ -34,24 +25,28 @@ ..\SixLabors.ruleset + + $(DefineConstants);SUPPORTS_MATHF + + - - - - - + All + + + + - + - + \ No newline at end of file From d073bf833cb40903d8daaf292417a3219e5b797c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 07:59:53 -0700 Subject: [PATCH 077/136] [SL.Core] Add HashHelpersTests --- src/SixLabors.Core/Helpers/HashHelpers.cs | 2 +- .../Helpers/HashHelpersTests.cs | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index a453a53de5..b1e7ce6607 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -59,4 +59,4 @@ public static int Combine(int h1, int h2, int h3, int h4) return hash; } } -} +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs new file mode 100644 index 0000000000..7091038ad0 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs @@ -0,0 +1,28 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class HashHelpersTests + { + [Fact] + public void CanCombineTwoValues() + { + Assert.Equal(35, HashHelpers.Combine(1, 2)); + } + + [Fact] + public void CanCombineThreeValues() + { + Assert.Equal(1152, HashHelpers.Combine(1, 2, 3)); + } + + [Fact] + public void CanCombineFourValues() + { + Assert.Equal(38020, HashHelpers.Combine(1, 2, 3, 4)); + } + } +} \ No newline at end of file From e154df465445beccf70838320f6b3f351619bbb8 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:00:37 -0700 Subject: [PATCH 078/136] [SL.Core] Add test to ensure PointF has the same layout as Vector2 --- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 6fdf1bbc37..cdd7410d5d 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -5,12 +5,24 @@ using System.Globalization; using System.Numerics; using System.Reflection; +using System.Runtime.CompilerServices; using Xunit; namespace SixLabors.Primitives.Tests { public class PointFTests { + [Fact] + public void CanReinterpretCastFromVector2() + { + var vector = new Vector2(1, 2); + + PointF point = Unsafe.As(ref vector); + + Assert.Equal(vector.X, point.X); + Assert.Equal(vector.Y, point.Y); + } + [Fact] public void DefaultConstructorTest() { From 383bd7b147a640c72a4dcdef7a80deec031c7734 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:06:05 -0700 Subject: [PATCH 079/136] [SL.Core] Format Rectangle --- src/SixLabors.Core/Primitives/Rectangle.cs | 23 ++++++---------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 5b4ac10a7d..2c9eec2692 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -120,10 +120,7 @@ public Size Size public int Top { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.Y; - } + get => this.Y; } /// @@ -132,10 +129,7 @@ public int Top public int Right { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return unchecked(this.X + this.Width); - } + get => unchecked(this.X + this.Width); } /// @@ -144,10 +138,8 @@ public int Right public int Bottom { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return unchecked(this.Y + this.Height); - } + get => unchecked(this.Y + this.Height); + } /// @@ -156,10 +148,7 @@ public int Bottom public int Left { [MethodImpl(MethodImplOptions.AggressiveInlining)] - get - { - return this.X; - } + get => this.X; } /// @@ -459,7 +448,7 @@ public override string ToString() } /// - public override bool Equals(object obj) => obj is Rectangle && this.Equals((Rectangle)obj); + public override bool Equals(object obj) => obj is Rectangle other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] From 302bb885357d42b99318305a2a4da24492c2a174 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 27 Aug 2018 08:11:59 -0700 Subject: [PATCH 080/136] [SL.Core] Remove whitespace --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 2 +- tests/SixLabors.Core.Tests/Helpers/MathFTests.cs | 1 + .../SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 5402a1af1e..92c683b139 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -12,4 +12,4 @@ [assembly: InternalsVisibleTo("SixLabors.ImageSharp")] [assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] [assembly: InternalsVisibleTo("SixLabors.Shapes")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] +[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs index 477259983c..1d9ea1523e 100644 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -6,6 +6,7 @@ namespace SixLabors.Tests.Helpers { + public class MathFTests { [Fact] diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs index 0068fce918..6e7efebb89 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs @@ -80,7 +80,6 @@ public void SmallBuffersArePooled_OfByte(int size) Assert.True(this.CheckIsRentingPooledBuffer(size)); } - [Theory] [InlineData(128 * 1024 * 1024)] [InlineData(MaxPooledBufferSizeInBytes + 1)] From 6c3502976e12a4280809551307fdd9dcb4dce2be Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:08:56 -0700 Subject: [PATCH 081/136] [SL.Core] Remove aggressive inlining hint from trival accessors --- src/SixLabors.Core/Primitives/Rectangle.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 2c9eec2692..61dc799161 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -117,11 +117,7 @@ public Size Size /// /// Gets the y-coordinate of the top edge of this . /// - public int Top - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.Y; - } + public int Top => this.Y; /// /// Gets the x-coordinate of the right edge of this . @@ -145,11 +141,7 @@ public int Bottom /// /// Gets the x-coordinate of the left edge of this . /// - public int Left - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.X; - } + public int Left => this.X; /// /// Creates a with the coordinates of the specified . From 81e2185583d4ec72cd6ca7f69a74bb3f05defa03 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:09:16 -0700 Subject: [PATCH 082/136] [SL.Core] Format Point --- src/SixLabors.Core/Primitives/Point.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 8f9db05b83..112d8fea25 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -258,10 +258,7 @@ public void Offset(int dx, int dy) public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); - } + public override int GetHashCode() => HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); /// public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; From d32149ae7bed158b10a4f1c327adfb9fdf2e7f47 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:09:25 -0700 Subject: [PATCH 083/136] [SL.Core] Format HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index b1e7ce6607..9343842389 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,10 +1,12 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; + namespace SixLabors { /// - /// Lifted from coreFX repo + /// Provides a set of helpers for combining object hashes. /// internal static class HashHelpers { @@ -16,6 +18,8 @@ internal static class HashHelpers /// Returns a hash code for the provided hash codes. public static int Combine(int h1, int h2) { + // Lifted from coreFX repo + unchecked { // RyuJIT optimizes this to use the ROL instruction @@ -54,9 +58,8 @@ public static int Combine(int h1, int h2, int h3, int h4) int hash = Combine(h1, h2); hash = Combine(hash, h3); - hash = Combine(hash, h4); - return hash; + return Combine(hash, h4); } } } \ No newline at end of file From c31eb7e601b13743862e6f918690551344d6b7ca Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:10:07 -0700 Subject: [PATCH 084/136] [SL.Core] Use Assert.Contains when checking for substrings --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index f3db76ef54..68416b47dc 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -99,7 +99,7 @@ public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + Assert.Contains($"Value must be greater than {min}.", exception.Message); } [Theory] @@ -119,7 +119,7 @@ public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index f95e46e355..ecffd79daa 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -65,7 +65,7 @@ public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than {min}.")); + Assert.Contains($"Value must be greater than {min}.", exception.Message); } [Theory] @@ -108,7 +108,7 @@ public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.")); + Assert.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); } [Theory] @@ -128,7 +128,7 @@ public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"The size must be at least 3.")); + Assert.Contains("The size must be at least 3.", exception.Message); } } } From aada342517a5c9952414d1953c6a1c74ac21567c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:15:41 -0700 Subject: [PATCH 085/136] [SL.Core] Remove AggressiveInlining hint from trival accessors --- src/SixLabors.Core/Primitives/RectangleF.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index a7f46db0a7..1a275b623b 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -117,11 +117,7 @@ public SizeF Size /// /// Gets the y-coordinate of the top edge of this . /// - public float Top - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.Y; - } + public float Top => this.Y; /// /// Gets the x-coordinate of the right edge of this . @@ -144,11 +140,7 @@ public float Bottom /// /// Gets the x-coordinate of the left edge of this . /// - public float Left - { - [MethodImpl(MethodImplOptions.AggressiveInlining)] - get => this.X; - } + public float Left => this.X; /// /// Creates a with the coordinates of the specified by truncating each coordinate. From 3589057ca9c70634248d6922bc55a528c0388f44 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:15:48 -0700 Subject: [PATCH 086/136] [SL.Core] Format Size --- src/SixLabors.Core/Primitives/Size.cs | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index d5ff95ad5a..86412a1373 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -252,17 +252,17 @@ public static SizeF Transform(Size size, Matrix3x2 matrix) public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - public override int GetHashCode() => this.GetHashCode(this); + public override int GetHashCode() => HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); /// public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; /// - public override bool Equals(object obj) => obj is Size && this.Equals((Size)obj); + public override bool Equals(object obj) => obj is Size other && this.Equals(other); /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Size other) => this.Width == other.Width && this.Height == other.Height; + public bool Equals(Size other) => this.Width.Equals(other.Width) && this.Height.Equals(other.Height); /// /// Multiplies by an producing . @@ -281,16 +281,5 @@ private static Size Multiply(Size size, int multiplier) => /// Product of type SizeF. private static SizeF Multiply(Size size, float multiplier) => new SizeF(size.Width * multiplier, size.Height * multiplier); - - /// - /// Returns the hash code for this instance. - /// - /// - /// The instance of to return the hash code for. - /// - /// - /// A 32-bit signed integer that is the hash code for this instance. - /// - private int GetHashCode(Size size) => HashHelpers.Combine(size.Width.GetHashCode(), size.Height.GetHashCode()); } } \ No newline at end of file From 8c101f093b9a4d162a849a692faf73bbafa189fb Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:16:03 -0700 Subject: [PATCH 087/136] [SL.Core] Replace == with Equals --- src/SixLabors.Core/Primitives/Point.cs | 2 +- src/SixLabors.Core/Primitives/Rectangle.cs | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 112d8fea25..de01717962 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -268,7 +268,7 @@ public void Offset(int dx, int dy) /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Point other) => this.X == other.X && this.Y == other.Y; + public bool Equals(Point other) => this.X.Equals(other.X) && this.Y.Equals(other.Y); private static short HighInt16(int n) => unchecked((short)((n >> 16) & 0xffff)); diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 61dc799161..441c251eb0 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -444,6 +444,10 @@ public override string ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(Rectangle other) => this.X == other.X && this.Y == other.Y && this.Width == other.Width && this.Height == other.Height; + public bool Equals(Rectangle other) => + this.X.Equals(other.X) && + this.Y.Equals(other.Y) && + this.Width.Equals(other.Width) && + this.Height.Equals(other.Height); } } \ No newline at end of file From be099d3f831daec89e607a13c5df963f3f3ac469 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 31 Aug 2018 10:17:38 -0700 Subject: [PATCH 088/136] [SL.Core] Format long statement onto multiple lines --- src/SixLabors.Core/Primitives/RectangleF.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 1a275b623b..535705a28c 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -376,6 +376,10 @@ public override string ToString() /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(RectangleF other) => this.X.Equals(other.X) && this.Y.Equals(other.Y) && this.Width.Equals(other.Width) && this.Height.Equals(other.Height); + public bool Equals(RectangleF other) => + this.X.Equals(other.X) && + this.Y.Equals(other.Y) && + this.Width.Equals(other.Width) && + this.Height.Equals(other.Height); } } \ No newline at end of file From 876ec6db8a3e9c0dd36ccbbd0e41693ee8958b17 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 3 Sep 2018 19:22:54 -0700 Subject: [PATCH 089/136] [SL.Core] Cross target netstandard2.0 --- src/SixLabors.Core/SixLabors.Core.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index b03eac761e..f1ba5c22e9 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netcoreapp2.0;netcoreapp2.1; + netstandard1.1;netstandard2.0;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core @@ -45,8 +45,8 @@ - - - + + + \ No newline at end of file From 2c8f6202796f51b4c2f7fc8010fe9fc8b85691ff Mon Sep 17 00:00:00 2001 From: daniaal Date: Mon, 24 Sep 2018 14:43:24 +0100 Subject: [PATCH 090/136] [SL.Core] Update descriptions on the ArrayPoolMemoryAllocator class --- ...ayPoolMemoryAllocator.CommonFactoryMethods.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index a82948ebc8..f355478109 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -42,26 +42,28 @@ public static ArrayPoolMemoryAllocator CreateDefault() DefaultNormalPoolBucketCount); } + /// - /// For environments with limited memory capabilities. Only small images are pooled, which can result in reduced througput. + /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// /// The memory manager - public static ArrayPoolMemoryAllocator CreateWithModeratePooling() + public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() { - return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); + return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); } /// - /// Only pool small buffers like image rows. + /// For environments with limited memory capabilities, only small array requests are pooled, which can result in reduced throughput. /// /// The memory manager - public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() + public static ArrayPoolMemoryAllocator CreateWithModeratePooling() { - return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); + return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); } + /// - /// RAM is not an issue for me, gimme maximum througput! + /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// /// The memory manager public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() From ff6bf5804bbadc36d70063a31af458cd41b4623a Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Mon, 15 Oct 2018 09:08:38 -0700 Subject: [PATCH 091/136] [SL.Core] Increase minimium netstandard support to v1.3 --- src/SixLabors.Core/Helpers/HashHelpers.cs | 2 -- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 9343842389..896b6be104 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; - namespace SixLabors { /// diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index f1ba5c22e9..44f107599b 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -5,7 +5,7 @@ $(packageversion) 0.1.0-alpha2 Six Labors - netstandard1.1;netstandard2.0;netcoreapp2.0;netcoreapp2.1; + netstandard1.3;netstandard2.0;netcoreapp2.0;netcoreapp2.1; true true SixLabors.Core From bc0e52126504d6aab1e106cc80cbcade5efd3995 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 26 Nov 2018 20:27:24 +0000 Subject: [PATCH 092/136] [SL.Core] Make deg - rad conversion public --- ...athFExtensions.cs => GeometryUtilities.cs} | 14 ++++---------- src/SixLabors.Core/Helpers/HashHelpers.cs | 1 - .../Primitives/Matrix3x2Extensions.cs | 8 ++++---- src/SixLabors.Core/Primitives/Rectangle.cs | 1 - .../Helpers/GeometryUtilitiesTests.cs | 19 +++++++++++++++++++ .../Helpers/MathFTests.cs | 13 ------------- 6 files changed, 27 insertions(+), 29 deletions(-) rename src/SixLabors.Core/{MathFExtensions.cs => GeometryUtilities.cs} (74%) create mode 100644 tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs diff --git a/src/SixLabors.Core/MathFExtensions.cs b/src/SixLabors.Core/GeometryUtilities.cs similarity index 74% rename from src/SixLabors.Core/MathFExtensions.cs rename to src/SixLabors.Core/GeometryUtilities.cs index 27d18d4815..43c46f1812 100644 --- a/src/SixLabors.Core/MathFExtensions.cs +++ b/src/SixLabors.Core/GeometryUtilities.cs @@ -7,9 +7,9 @@ namespace SixLabors { /// - /// Provides common mathematical methods. + /// Utility class for common geometric functions. /// - internal static class MathFExtensions + public static class GeometryUtilities { /// /// Converts a degree (360-periodic) angle to a radian (2*Pi-periodic) angle. @@ -19,10 +19,7 @@ internal static class MathFExtensions /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float DegreeToRadian(float degree) - { - return degree * (MathF.PI / 180F); - } + public static float DegreeToRadian(float degree) => degree * (MathF.PI / 180F); /// /// Converts a radian (2*Pi-periodic) angle to a degree (360-periodic) angle. @@ -32,9 +29,6 @@ public static float DegreeToRadian(float degree) /// The representing the degree as radians. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float RadianToDegree(float radian) - { - return radian / (MathF.PI / 180F); - } + public static float RadianToDegree(float radian) => radian / (MathF.PI / 180F); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index 896b6be104..d45d75bf0b 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -17,7 +17,6 @@ internal static class HashHelpers public static int Combine(int h1, int h2) { // Lifted from coreFX repo - unchecked { // RyuJIT optimizes this to use the ROL instruction diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs index 55d75b83db..2d33ea70d6 100644 --- a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs +++ b/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs @@ -55,7 +55,7 @@ public static class Matrix3x2Extensions /// The X angle, in degrees. /// The Y angle, in degrees. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY)); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY) => Matrix3x2.CreateSkew(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY)); /// /// Creates a skew matrix from the given angles in radians and a center point. @@ -73,14 +73,14 @@ public static class Matrix3x2Extensions /// The Y angle, in degrees. /// The center point. /// A skew matrix. - public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(MathFExtensions.DegreeToRadian(degreesX), MathFExtensions.DegreeToRadian(degreesY), centerPoint); + public static Matrix3x2 CreateSkewDegrees(float degreesX, float degreesY, PointF centerPoint) => Matrix3x2.CreateSkew(GeometryUtilities.DegreeToRadian(degreesX), GeometryUtilities.DegreeToRadian(degreesY), centerPoint); /// /// Creates a rotation matrix using the given rotation in degrees. /// /// The amount of rotation, in degrees. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees)); + public static Matrix3x2 CreateRotationDegrees(float degrees) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees)); /// /// Creates a rotation matrix using the given rotation in radians and a center point. @@ -96,6 +96,6 @@ public static class Matrix3x2Extensions /// The amount of rotation, in degrees. /// The center point. /// A rotation matrix. - public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(MathFExtensions.DegreeToRadian(degrees), centerPoint); + public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees), centerPoint); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 441c251eb0..6b1b48d1fb 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -135,7 +135,6 @@ public int Bottom { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => unchecked(this.Y + this.Height); - } /// diff --git a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs new file mode 100644 index 0000000000..93e4cec60a --- /dev/null +++ b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs @@ -0,0 +1,19 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using Xunit; + +namespace SixLabors.Tests.Helpers +{ + public class GeometryUtilitiesTests + { + [Fact] + public void Convert_Degree_To_Radian() + => Assert.Equal((float)(Math.PI / 2D), GeometryUtilities.DegreeToRadian(90F), new FloatRoundingComparer(6)); + + [Fact] + public void Convert_Radian_To_Degree() + => Assert.Equal(60F, GeometryUtilities.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); + } +} diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs index 1d9ea1523e..9ae95f0140 100644 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs @@ -6,7 +6,6 @@ namespace SixLabors.Tests.Helpers { - public class MathFTests { [Fact] @@ -92,17 +91,5 @@ public void MathF_Sqrt_Is_Equal() { Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); } - - [Fact] - public void Convert_Degree_To_Radian() - { - Assert.Equal((float)(Math.PI / 2D), MathFExtensions.DegreeToRadian(90F), new FloatRoundingComparer(6)); - } - - [Fact] - public void Convert_Radian_To_Degree() - { - Assert.Equal(60F, MathFExtensions.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); - } } } \ No newline at end of file From 51212108493b2221668429976860c209f94028c9 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 7 Dec 2018 18:53:47 -0800 Subject: [PATCH 093/136] [SL.Core] Add and use HashCode polyfill --- src/SixLabors.Core/HashCode.cs | 443 ++++++++++++++++++ src/SixLabors.Core/Primitives/Point.cs | 4 +- src/SixLabors.Core/Primitives/PointF.cs | 7 +- src/SixLabors.Core/Primitives/Rectangle.cs | 8 +- src/SixLabors.Core/Primitives/RectangleF.cs | 8 +- src/SixLabors.Core/Primitives/Size.cs | 4 +- src/SixLabors.Core/Primitives/SizeF.cs | 7 +- src/SixLabors.Core/SixLabors.Core.csproj | 8 +- .../Helpers/FloatRoundingComparer.cs | 2 +- 9 files changed, 463 insertions(+), 28 deletions(-) create mode 100644 src/SixLabors.Core/HashCode.cs diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs new file mode 100644 index 0000000000..ae3e83c52a --- /dev/null +++ b/src/SixLabors.Core/HashCode.cs @@ -0,0 +1,443 @@ +#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 + +// SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs + +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +/* +The xxHash32 implementation is based on the code published by Yann Collet: +https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b39696afea1/xxhash.c + xxHash - Fast Hash algorithm + Copyright (C) 2012-2016, Yann Collet + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - xxHash homepage: http://www.xxhash.com + - xxHash source repository : https://github.com/Cyan4973/xxHash +*/ + +#if SUPPORTS_HASHCODE +using System.Runtime.CompilerServices; +[assembly: TypeForwardedTo(typeof(System.HashCode))] +#else +using System.Collections.Generic; +using System.ComponentModel; +using System.Runtime.CompilerServices; +using System.Security.Cryptography; + +namespace System +{ + // xxHash32 is used for the hash code. + // https://github.com/Cyan4973/xxHash + internal struct HashCode + { + private static readonly uint s_seed = GenerateGlobalSeed(); + + private const uint Prime1 = 2654435761U; + private const uint Prime2 = 2246822519U; + private const uint Prime3 = 3266489917U; + private const uint Prime4 = 668265263U; + private const uint Prime5 = 374761393U; + + private uint _v1, _v2, _v3, _v4; + private uint _queue1, _queue2, _queue3; + private uint _length; + + private static uint GenerateGlobalSeed() + { + byte[] data = new byte[4]; + + using (var rng = RandomNumberGenerator.Create()) + { + rng.GetBytes(data); + } + + return Convert.ToUInt32(data); + } + + public static int Combine(T1 value1) + { + // Provide a way of diffusing bits from something with a limited + // input hash space. For example, many enums only have a few + // possible hashes, only using the bottom few bits of the code. Some + // collections are built on the assumption that hashes are spread + // over a larger space, so diffusing the bits may help the + // collection work more efficiently. + + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 4; + + hash = QueueRound(hash, hc1); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 8; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + + uint hash = MixEmptyState(); + hash += 12; + + hash = QueueRound(hash, hc1); + hash = QueueRound(hash, hc2); + hash = QueueRound(hash, hc3); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 16; + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 20; + + hash = QueueRound(hash, hc5); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 24; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + var hc7 = (uint)(value7?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + uint hash = MixState(v1, v2, v3, v4); + hash += 28; + + hash = QueueRound(hash, hc5); + hash = QueueRound(hash, hc6); + hash = QueueRound(hash, hc7); + + hash = MixFinal(hash); + return (int)hash; + } + + public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) + { + var hc1 = (uint)(value1?.GetHashCode() ?? 0); + var hc2 = (uint)(value2?.GetHashCode() ?? 0); + var hc3 = (uint)(value3?.GetHashCode() ?? 0); + var hc4 = (uint)(value4?.GetHashCode() ?? 0); + var hc5 = (uint)(value5?.GetHashCode() ?? 0); + var hc6 = (uint)(value6?.GetHashCode() ?? 0); + var hc7 = (uint)(value7?.GetHashCode() ?? 0); + var hc8 = (uint)(value8?.GetHashCode() ?? 0); + + Initialize(out uint v1, out uint v2, out uint v3, out uint v4); + + v1 = Round(v1, hc1); + v2 = Round(v2, hc2); + v3 = Round(v3, hc3); + v4 = Round(v4, hc4); + + v1 = Round(v1, hc5); + v2 = Round(v2, hc6); + v3 = Round(v3, hc7); + v4 = Round(v4, hc8); + + uint hash = MixState(v1, v2, v3, v4); + hash += 32; + + hash = MixFinal(hash); + return (int)hash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint Rol(uint value, int count) + => (value << count) | (value >> (32 - count)); + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) + { + v1 = s_seed + Prime1 + Prime2; + v2 = s_seed + Prime2; + v3 = s_seed; + v4 = s_seed - Prime1; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint Round(uint hash, uint input) + { + hash += input * Prime2; + hash = Rol(hash, 13); + hash *= Prime1; + return hash; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint QueueRound(uint hash, uint queuedValue) + { + hash += queuedValue * Prime3; + return Rol(hash, 17) * Prime4; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixState(uint v1, uint v2, uint v3, uint v4) + { + return Rol(v1, 1) + Rol(v2, 7) + Rol(v3, 12) + Rol(v4, 18); + } + + private static uint MixEmptyState() + { + return s_seed + Prime5; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static uint MixFinal(uint hash) + { + hash ^= hash >> 15; + hash *= Prime2; + hash ^= hash >> 13; + hash *= Prime3; + hash ^= hash >> 16; + return hash; + } + + public void Add(T value) + { + Add(value?.GetHashCode() ?? 0); + } + + public void Add(T value, IEqualityComparer comparer) + { + Add(comparer != null ? comparer.GetHashCode(value) : (value?.GetHashCode() ?? 0)); + } + + private void Add(int value) + { + // The original xxHash works as follows: + // 0. Initialize immediately. We can't do this in a struct (no + // default ctor). + // 1. Accumulate blocks of length 16 (4 uints) into 4 accumulators. + // 2. Accumulate remaining blocks of length 4 (1 uint) into the + // hash. + // 3. Accumulate remaining blocks of length 1 into the hash. + + // There is no need for #3 as this type only accepts ints. _queue1, + // _queue2 and _queue3 are basically a buffer so that when + // ToHashCode is called we can execute #2 correctly. + + // We need to initialize the xxHash32 state (_v1 to _v4) lazily (see + // #0) nd the last place that can be done if you look at the + // original code is just before the first block of 16 bytes is mixed + // in. The xxHash32 state is never used for streams containing fewer + // than 16 bytes. + + // To see what's really going on here, have a look at the Combine + // methods. + + var val = (uint)value; + + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint previousLength = _length++; + uint position = previousLength % 4; + + // Switch can't be inlined. + + if (position == 0) + _queue1 = val; + else if (position == 1) + _queue2 = val; + else if (position == 2) + _queue3 = val; + else // position == 3 + { + if (previousLength == 3) + Initialize(out _v1, out _v2, out _v3, out _v4); + + _v1 = Round(_v1, _queue1); + _v2 = Round(_v2, _queue2); + _v3 = Round(_v3, _queue3); + _v4 = Round(_v4, val); + } + } + + public int ToHashCode() + { + // Storing the value of _length locally shaves of quite a few bytes + // in the resulting machine code. + uint length = _length; + + // position refers to the *next* queue position in this method, so + // position == 1 means that _queue1 is populated; _queue2 would have + // been populated on the next call to Add. + uint position = length % 4; + + // If the length is less than 4, _v1 to _v4 don't contain anything + // yet. xxHash32 treats this differently. + + uint hash = length < 4 ? MixEmptyState() : MixState(_v1, _v2, _v3, _v4); + + // _length is incremented once per Add(Int32) and is therefore 4 + // times too small (xxHash length is in bytes, not ints). + + hash += length * 4; + + // Mix what remains in the queue + + // Switch can't be inlined right now, so use as few branches as + // possible by manually excluding impossible scenarios (position > 1 + // is always false if position is not > 0). + if (position > 0) + { + hash = QueueRound(hash, _queue1); + if (position > 1) + { + hash = QueueRound(hash, _queue2); + if (position > 2) + hash = QueueRound(hash, _queue3); + } + } + + hash = MixFinal(hash); + return (int)hash; + } + +#pragma warning disable 0809 + // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. + // Disallowing GetHashCode and Equals is by design + + // * We decided to not override GetHashCode() to produce the hash code + // as this would be weird, both naming-wise as well as from a + // behavioral standpoint (GetHashCode() should return the object's + // hash code, not the one being computed). + + // * Even though ToHashCode() can be called safely multiple times on + // this implementation, it is not part of the contract. If the + // implementation has to change in the future we don't want to worry + // about people who might have incorrectly used this type. + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override int GetHashCode() => throw new NotSupportedException("Equality not supported"); + + [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)] + [EditorBrowsable(EditorBrowsableState.Never)] + public override bool Equals(object obj) => throw new NotSupportedException("Equality not supported"); +#pragma warning restore 0809 + } +} +#endif + +#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 \ No newline at end of file diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index de01717962..6b9e129d8e 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -21,7 +21,7 @@ public struct Point : IEquatable /// /// Represents a that has X and Y values set to zero. /// - public static readonly Point Empty = default(Point); + public static readonly Point Empty = default; /// /// Initializes a new instance of the struct. @@ -258,7 +258,7 @@ public void Offset(int dx, int dy) public void Offset(Point point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() => HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); + public override int GetHashCode() => HashCode.Combine(this.X, this.Y); /// public override string ToString() => $"Point [ X={this.X}, Y={this.Y} ]"; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index c163da7cd4..a214b32e55 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -21,7 +21,7 @@ public struct PointF : IEquatable /// /// Represents a that has X and Y values set to zero. /// - public static readonly PointF Empty = default(PointF); + public static readonly PointF Empty = default; /// /// Initializes a new instance of the struct. @@ -267,10 +267,7 @@ public void Offset(float dx, float dy) public void Offset(PointF point) => this.Offset(point.X, point.Y); /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.X.GetHashCode(), this.Y.GetHashCode()); - } + public override int GetHashCode() => HashCode.Combine(this.X, this.Y); /// public override string ToString() => $"PointF [ X={this.X}, Y={this.Y} ]"; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 6b1b48d1fb..26694a028d 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -20,7 +20,7 @@ public struct Rectangle : IEquatable /// /// Represents a that has X, Y, Width, and Height values set to zero. /// - public static readonly Rectangle Empty = default(Rectangle); + public static readonly Rectangle Empty = default; /// /// Initializes a new instance of the struct. @@ -425,11 +425,7 @@ public void Offset(int dx, int dy) /// public override int GetHashCode() { - return HashHelpers.Combine( - this.X.GetHashCode(), - this.Y.GetHashCode(), - this.Width.GetHashCode(), - this.Height.GetHashCode()); + return HashCode.Combine(this.X, this.Y, this.Width, this.Height); } /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index 535705a28c..b5b96efc8d 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -20,7 +20,7 @@ public struct RectangleF : IEquatable /// /// Represents a that has X, Y, Width, and Height values set to zero. /// - public static readonly RectangleF Empty = default(RectangleF); + public static readonly RectangleF Empty = default; /// /// Initializes a new instance of the struct. @@ -358,11 +358,7 @@ public void Offset(float dx, float dy) /// public override int GetHashCode() { - return HashHelpers.Combine( - this.X.GetHashCode(), - this.Y.GetHashCode(), - this.Width.GetHashCode(), - this.Height.GetHashCode()); + return HashCode.Combine(this.X, this.Y, this.Width, this.Height); } /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 86412a1373..4c6c379794 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -20,7 +20,7 @@ public struct Size : IEquatable /// /// Represents a that has Width and Height values set to zero. /// - public static readonly Size Empty = default(Size); + public static readonly Size Empty = default; /// /// Initializes a new instance of the struct. @@ -252,7 +252,7 @@ public static SizeF Transform(Size size, Matrix3x2 matrix) public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - public override int GetHashCode() => HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); + public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); /// public override string ToString() => $"Size [ Width={this.Width}, Height={this.Height} ]"; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index 8dbdd74248..a2bd687bec 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -20,7 +20,7 @@ public struct SizeF : IEquatable /// /// Represents a that has Width and Height values set to zero. /// - public static readonly SizeF Empty = default(SizeF); + public static readonly SizeF Empty = default; /// /// Initializes a new instance of the struct. @@ -198,10 +198,7 @@ public static SizeF Transform(SizeF size, Matrix3x2 matrix) } /// - public override int GetHashCode() - { - return HashHelpers.Combine(this.Width.GetHashCode(), this.Height.GetHashCode()); - } + public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); /// public override string ToString() => $"SizeF [ Width={this.Width}, Height={this.Height} ]"; diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 44f107599b..7454cc2389 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -19,16 +19,22 @@ Copyright (c) Six Labors and contributors. full SixLabors + 7.3 ..\SixLabors.ruleset + $(DefineConstants);SUPPORTS_MATHF - + + + $(DefineConstants);SUPPORTS_HASHCODE + + All diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs index e3ef6a01b8..a5c965b109 100644 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -54,6 +54,6 @@ public int GetHashCode(float obj) } /// - public int GetHashCode(Vector4 obj) => HashHelpers.Combine(obj.GetHashCode(), this.Precision.GetHashCode()); + public int GetHashCode(Vector4 obj) => HashCode.Combine(obj, this.Precision); } } \ No newline at end of file From 00eafc937b03f070f4f0b13a34712d7848fdba1c Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Fri, 7 Dec 2018 19:00:04 -0800 Subject: [PATCH 094/136] [SL.Core] Obsolete HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs index d45d75bf0b..b6241789b3 100644 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ b/src/SixLabors.Core/Helpers/HashHelpers.cs @@ -1,6 +1,8 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; + namespace SixLabors { /// @@ -14,6 +16,7 @@ internal static class HashHelpers /// Hash code one /// Hash code two /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2) { // Lifted from coreFX repo @@ -33,6 +36,7 @@ public static int Combine(int h1, int h2) /// Hash code two /// Hash code three /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2, int h3) { int hash = Combine(h1, h2); @@ -50,6 +54,7 @@ public static int Combine(int h1, int h2, int h3) /// Hash code three /// Hash code four /// Returns a hash code for the provided hash codes. + [Obsolete("Use HashCode.Combine instead")] public static int Combine(int h1, int h2, int h3, int h4) { int hash = Combine(h1, h2); From 78ca048ff6a61a2bb8e5c7ac6740f6201f38b0fc Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Sat, 8 Dec 2018 16:36:48 -0800 Subject: [PATCH 095/136] [SL.Core] Update supressions --- src/SixLabors.Core/HashCode.cs | 7 +++++-- .../ArrayPoolMemoryAllocator.CommonFactoryMethods.cs | 2 -- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index ae3e83c52a..be0e8bd3aa 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -1,4 +1,4 @@ -#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 +#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 // SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs @@ -57,7 +57,9 @@ namespace System // https://github.com/Cyan4973/xxHash internal struct HashCode { +#pragma warning disable SA1311 // Static readonly fields should begin with upper-case letter private static readonly uint s_seed = GenerateGlobalSeed(); +#pragma warning restore SA1311 // Static readonly fields should begin with upper-case letter private const uint Prime1 = 2654435761U; private const uint Prime2 = 2246822519U; @@ -415,6 +417,7 @@ public int ToHashCode() } #pragma warning disable 0809 + // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. // Disallowing GetHashCode and Equals is by design @@ -440,4 +443,4 @@ public int ToHashCode() } #endif -#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512 \ No newline at end of file +#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index f355478109..c56453b007 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -42,7 +42,6 @@ public static ArrayPoolMemoryAllocator CreateDefault() DefaultNormalPoolBucketCount); } - /// /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// @@ -61,7 +60,6 @@ public static ArrayPoolMemoryAllocator CreateWithModeratePooling() return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); } - /// /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// From 1c6a07fc364c213aad0b755154449af0afe420b6 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Sat, 8 Dec 2018 16:47:27 -0800 Subject: [PATCH 096/136] [SL.Core] Fix mistake. :( --- src/SixLabors.Core/HashCode.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index be0e8bd3aa..73d4b3574c 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -46,6 +46,7 @@ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT using System.Runtime.CompilerServices; [assembly: TypeForwardedTo(typeof(System.HashCode))] #else +using System.Buffers.Binary; using System.Collections.Generic; using System.ComponentModel; using System.Runtime.CompilerServices; @@ -80,7 +81,7 @@ private static uint GenerateGlobalSeed() rng.GetBytes(data); } - return Convert.ToUInt32(data); + return BinaryPrimitives.ReadUInt32LittleEndian(data); } public static int Combine(T1 value1) From 5334e39a6428ef23fb896baf47c79b1546cad693 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Tue, 11 Dec 2018 18:05:48 -0800 Subject: [PATCH 097/136] [SL.Core] Downgrade System.Buffers to 4.4.0 --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7454cc2389..7dd934b2fb 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -48,7 +48,7 @@ - + From 8100c04f3f219f3069d20cc096234e5a1acba941 Mon Sep 17 00:00:00 2001 From: Jason Nelson Date: Tue, 11 Dec 2018 18:05:58 -0800 Subject: [PATCH 098/136] [SL.Core] Remove HashHelpers --- src/SixLabors.Core/Helpers/HashHelpers.cs | 67 ------------------- .../Helpers/HashHelpersTests.cs | 28 -------- 2 files changed, 95 deletions(-) delete mode 100644 src/SixLabors.Core/Helpers/HashHelpers.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs diff --git a/src/SixLabors.Core/Helpers/HashHelpers.cs b/src/SixLabors.Core/Helpers/HashHelpers.cs deleted file mode 100644 index b6241789b3..0000000000 --- a/src/SixLabors.Core/Helpers/HashHelpers.cs +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; - -namespace SixLabors -{ - /// - /// Provides a set of helpers for combining object hashes. - /// - internal static class HashHelpers - { - /// - /// Combines the two specified hash codes. - /// - /// Hash code one - /// Hash code two - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2) - { - // Lifted from coreFX repo - unchecked - { - // RyuJIT optimizes this to use the ROL instruction - // Related GitHub pull request: dotnet/coreclr#1830 - uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27); - return ((int)rol5 + h1) ^ h2; - } - } - - /// - /// Combines the three specified hash codes. - /// - /// The first - /// Hash code two - /// Hash code three - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2, int h3) - { - int hash = Combine(h1, h2); - - hash = Combine(hash, h3); - - return hash; - } - - /// - /// Combines the four specified hash codes. - /// - /// The first - /// Hash code two - /// Hash code three - /// Hash code four - /// Returns a hash code for the provided hash codes. - [Obsolete("Use HashCode.Combine instead")] - public static int Combine(int h1, int h2, int h3, int h4) - { - int hash = Combine(h1, h2); - - hash = Combine(hash, h3); - - return Combine(hash, h4); - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs b/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs deleted file mode 100644 index 7091038ad0..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/HashHelpersTests.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class HashHelpersTests - { - [Fact] - public void CanCombineTwoValues() - { - Assert.Equal(35, HashHelpers.Combine(1, 2)); - } - - [Fact] - public void CanCombineThreeValues() - { - Assert.Equal(1152, HashHelpers.Combine(1, 2, 3)); - } - - [Fact] - public void CanCombineFourValues() - { - Assert.Equal(38020, HashHelpers.Combine(1, 2, 3, 4)); - } - } -} \ No newline at end of file From 4671658b7bbd8bbdedd52e086b07641965bd26c4 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sat, 20 Apr 2019 16:38:27 +0200 Subject: [PATCH 099/136] [SL.Core] Throw better exceptions from MemoryAllocators --- .../Memory/ArrayPoolMemoryAllocator.cs | 11 +++++ .../Memory/SimpleGcMemoryAllocator.cs | 7 +++ ...ts.cs => ArrayPoolMemoryAllocatorTests.cs} | 24 +++++++++- .../Memory/SimpleGcMemoryAllocatorTests.cs | 45 +++++++++++++++++++ .../Memory/SimpleGcMemoryManagerTests.cs | 16 ------- 5 files changed, 85 insertions(+), 18 deletions(-) rename tests/SixLabors.Core.Tests/Memory/{ArrayPoolMemoryManagerTests.cs => ArrayPoolMemoryAllocatorTests.cs} (88%) create mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 8681a594bb..0a5e47f283 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Buffers; using System.Runtime.CompilerServices; @@ -91,8 +92,15 @@ public override void ReleaseRetainedResources() /// public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); int itemSizeBytes = Unsafe.SizeOf(); int bufferSizeInBytes = length * itemSizeBytes; + if (bufferSizeInBytes < 0) + { + throw new ArgumentOutOfRangeException( + nameof(length), + $"{nameof(ArrayPoolMemoryAllocator)} can not allocate {length} elements of {typeof(T).Name}."); + } ArrayPool pool = this.GetArrayPool(bufferSizeInBytes); byte[] byteArray = pool.Rent(bufferSizeInBytes); @@ -109,6 +117,9 @@ public override IMemoryOwner Allocate(int length, AllocationOptions option /// public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + ArrayPool pool = this.GetArrayPool(length); byte[] byteArray = pool.Rent(length); diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index cc11579794..fc7fb607f2 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -1,6 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. +using System; using System.Buffers; using SixLabors.Memory.Internals; @@ -14,12 +15,18 @@ public sealed class SimpleGcMemoryAllocator : MemoryAllocator /// public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + return new BasicArrayBuffer(new T[length]); } /// public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { + Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); + Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); + return new BasicByteBuffer(new byte[length]); } } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs similarity index 88% rename from tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs rename to tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6e7efebb89..5226c9b011 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryManagerTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -12,7 +12,7 @@ namespace SixLabors.Memory.Tests { - public class ArrayPoolMemoryManagerTests + public class ArrayPoolMemoryAllocatorTests { private const int MaxPooledBufferSizeInBytes = 2048; @@ -231,9 +231,29 @@ private struct Rgba32 private uint dummy; } - [StructLayout(LayoutKind.Explicit, Size = MaxPooledBufferSizeInBytes / 5)] + private const int SizeOfLargeStruct = MaxPooledBufferSizeInBytes / 5; + + [StructLayout(LayoutKind.Explicit, Size = SizeOfLargeStruct)] private struct LargeStruct { } + + [Theory] + [InlineData(-1)] + [InlineData((int.MaxValue / SizeOfLargeStruct) + 1)] + public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + Assert.Equal("length", ex.ParamName); + } + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + Assert.Equal("length", ex.ParamName); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs new file mode 100644 index 0000000000..96f92e6829 --- /dev/null +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -0,0 +1,45 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using System; +using System.Runtime.InteropServices; +using Xunit; + +namespace SixLabors.Memory.Tests +{ + public class SimpleGcMemoryAllocatorTests + { + public class BufferTests : BufferTestSuite + { + public BufferTests() + : base(new SimpleGcMemoryAllocator()) + { + } + } + + protected SimpleGcMemoryAllocator MemoryAllocator { get; } = new SimpleGcMemoryAllocator(); + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); + Assert.Equal("length", ex.ParamName); + } + + [Theory] + [InlineData(-1)] + [InlineData(int.MaxValue)] + public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) + { + var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + Assert.Equal("length", ex.ParamName); + } + + [StructLayout(LayoutKind.Explicit, Size = 512)] + private struct BigStruct + { + } + } +} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs deleted file mode 100644 index a6ddeb0507..0000000000 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryManagerTests.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors.Memory.Tests -{ - public class SimpleGcMemoryManagerTests - { - public class BufferTests : BufferTestSuite - { - public BufferTests() - : base(new SimpleGcMemoryAllocator()) - { - } - } - } -} \ No newline at end of file From 18b9f182253f0740ec9c38d70646606d88ea45b6 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 21 Apr 2019 00:56:40 +0200 Subject: [PATCH 100/136] [SL.Core] drop meaningless upper limit check --- src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs | 1 - src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs | 2 -- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 1 - .../SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs | 2 -- 4 files changed, 6 deletions(-) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 0a5e47f283..113e127853 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -118,7 +118,6 @@ public override IMemoryOwner Allocate(int length, AllocationOptions option public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); ArrayPool pool = this.GetArrayPool(length); byte[] byteArray = pool.Rent(length); diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs index fc7fb607f2..acf17ad63d 100644 --- a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs @@ -16,7 +16,6 @@ public sealed class SimpleGcMemoryAllocator : MemoryAllocator public override IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); return new BasicArrayBuffer(new T[length]); } @@ -25,7 +24,6 @@ public override IMemoryOwner Allocate(int length, AllocationOptions option public override IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None) { Guard.MustBeGreaterThanOrEqualTo(length, 0, nameof(length)); - Guard.MustBeLessThan(length, int.MaxValue, nameof(length)); return new BasicByteBuffer(new byte[length]); } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 5226c9b011..e59590bae9 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -249,7 +249,6 @@ public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(in [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 96f92e6829..86e71717e7 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -21,7 +21,6 @@ public BufferTests() [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); @@ -30,7 +29,6 @@ public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(i [Theory] [InlineData(-1)] - [InlineData(int.MaxValue)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); From fb38a57fd12a293f608e47763f85523893e2ffd4 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 1 May 2019 17:17:50 +0200 Subject: [PATCH 101/136] [SL.Core] Added deconstructors --- src/SixLabors.Core/Primitives/Point.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/PointF.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/Rectangle.cs | 17 ++++++++++++++++- src/SixLabors.Core/Primitives/RectangleF.cs | 17 ++++++++++++++++- src/SixLabors.Core/Primitives/Size.cs | 13 ++++++++++++- src/SixLabors.Core/Primitives/SizeF.cs | 13 ++++++++++++- 6 files changed, 80 insertions(+), 6 deletions(-) diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 6b9e129d8e..77ebb62f64 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -235,6 +235,17 @@ public Point(Size size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); + /// + /// Deconstructs this point into two integers + /// + /// The out value for X + /// The out value for Y + public void Deconstruct(out int x, out int y) + { + x = this.X; + y = this.Y; + } + /// /// Translates this by the specified amount. /// diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index a214b32e55..844a5f264f 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -247,6 +247,17 @@ public PointF(SizeF size) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); + /// + /// Deconstructs this point into two floats + /// + /// The out value for X + /// The out value for Y + public void Deconstruct(out float x, out float y) + { + x = this.X; + y = this.Y; + } + /// /// Translates this by the specified amount. /// diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 26694a028d..239813ac73 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -320,6 +320,21 @@ public static Rectangle Union(Rectangle a, Rectangle b) return new Rectangle(x1, y1, x2 - x1, y2 - y1); } + /// + /// Deconstructs this rectangle into four integers + /// + /// The out value for X + /// The out value for Y + /// The out value for the width + /// The out value for the height + public void Deconstruct(out int x, out int y, out int width, out int height) + { + x = this.X; + y = this.Y; + width = this.Width; + height = this.Height; + } + /// /// Creates a Rectangle that represents the intersection between this Rectangle and the . /// diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index b5b96efc8d..f212e5bcc1 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -259,6 +259,21 @@ public static RectangleF Union(RectangleF a, RectangleF b) return new RectangleF(x1, y1, x2 - x1, y2 - y1); } + /// + /// Deconstructs this rectangle into four floats + /// + /// The out value for X + /// The out value for Y + /// The out value for the width + /// The out value for the height + public void Deconstruct(out float x, out float y, out float width, out float height) + { + x = this.X; + y = this.Y; + width = this.Width; + height = this.Height; + } + /// /// Creates a RectangleF that represents the intersection between this RectangleF and the . /// diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 4c6c379794..0c468a80b7 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -251,6 +251,17 @@ public static SizeF Transform(Size size, Matrix3x2 matrix) [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); + /// + /// Deconstructs this size into two integers + /// + /// The out value for the width + /// The out value for the height + public void Deconstruct(out int width, out int height) + { + width = this.Width; + height = this.Height; + } + /// public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index a2bd687bec..b7e15b5e3f 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -197,6 +197,17 @@ public static SizeF Transform(SizeF size, Matrix3x2 matrix) return new SizeF(v.X, v.Y); } + /// + /// Deconstructs this size into two floats + /// + /// The out value for the width + /// The out value for the height + public void Deconstruct(out float width, out float height) + { + width = this.Width; + height = this.Height; + } + /// public override int GetHashCode() => HashCode.Combine(this.Width, this.Height); From 6c6baa441e001717cdab9218a6bb08561333af5f Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Wed, 1 May 2019 17:18:06 +0200 Subject: [PATCH 102/136] [SL.Core] Added small tests for deconstructors --- .../Primitives/PointFTests.cs | 17 +++++++++- .../Primitives/PointTests.cs | 17 +++++++++- .../Primitives/RectangleFTests.cs | 32 ++++++++++++++++++- .../Primitives/RectangleTests.cs | 32 ++++++++++++++++++- .../Primitives/SizeFTests.cs | 17 +++++++++- .../Primitives/SizeTests.cs | 17 +++++++++- 6 files changed, 126 insertions(+), 6 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index cdd7410d5d..8535b3fb02 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -191,5 +191,20 @@ public void ToStringTest() var p = new PointF(5.1F, -5.123F); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "PointF [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(float x, float y) + { + PointF p = new PointF(x, y); + + (float deconstructedX, float deconstructedY) = p; + + Assert.Equal(x, deconstructedX); + Assert.Equal(y, deconstructedY); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 43d662572f..6a873567b1 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -239,5 +239,20 @@ public void ToStringTest() var p = new Point(5, -5); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Point [ X={0}, Y={1} ]", p.X, p.Y), p.ToString()); } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(int x, int y) + { + Point p = new Point(x, y); + + (int deconstructedX, int deconstructedY) = p; + + Assert.Equal(x, deconstructedX); + Assert.Equal(y, deconstructedY); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 463509eac8..926416ae5e 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -252,5 +252,35 @@ public void ToStringTest() var r = new RectangleF(5, 5.1F, 1.3F, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "RectangleF [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } + + [Theory] + [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MaxValue, float.MinValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MinValue, float.MinValue, float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MaxValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MaxValue, float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue, float.MaxValue, float.MinValue)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MaxValue)] + [InlineData(float.MaxValue, float.MinValue, float.MinValue, float.MinValue)] + [InlineData(0, 0, 0, 0)] + public void DeconstructTest(float x, float y, float width, float height) + { + RectangleF r = new RectangleF(x, y, width, height); + + (float dx, float dy, float dw, float dh) = r; + + Assert.Equal(x, dx); + Assert.Equal(y, dy); + Assert.Equal(width, dw); + Assert.Equal(height, dh); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 90354bd72e..8a00cd1fcd 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -294,5 +294,35 @@ public void ToStringTest() var r = new Rectangle(5, -5, 0, 1); Assert.Equal(string.Format(CultureInfo.CurrentCulture, "Rectangle [ X={0}, Y={1}, Width={2}, Height={3} ]", r.X, r.Y, r.Width, r.Height), r.ToString()); } + + [Theory] + [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MaxValue, int.MinValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MinValue, int.MinValue, int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MaxValue, int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue, int.MaxValue, int.MinValue)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MaxValue)] + [InlineData(int.MaxValue, int.MinValue, int.MinValue, int.MinValue)] + [InlineData(0, 0, 0, 0)] + public void DeconstructTest(int x, int y, int width, int height) + { + Rectangle r = new Rectangle(x, y, width, height); + + (int dx, int dy, int dw, int dh) = r; + + Assert.Equal(x, dx); + Assert.Equal(y, dy); + Assert.Equal(width, dw); + Assert.Equal(height, dh); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 04363fa943..a0a0ff6fec 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -231,5 +231,20 @@ public void DivideTestSizeFloatWidthHeightDivisor(float width, float height, flo SizeF expected = new SizeF(width / divisor, height / divisor); Assert.Equal(expected, size / divisor); } + + [Theory] + [InlineData(float.MaxValue, float.MinValue)] + [InlineData(float.MinValue, float.MinValue)] + [InlineData(float.MaxValue, float.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(float width, float height) + { + SizeF s = new SizeF(width, height); + + (float deconstructedWidth, float deconstructedHeight) = s; + + Assert.Equal(width, deconstructedWidth); + Assert.Equal(height, deconstructedHeight); + } } } \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 0cfb62dd5c..05f690603d 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -360,5 +360,20 @@ public void DivideTestSizeFloatWidthHeightDivisor(int width, int height, float d expected = new SizeF(width / divisor, height / divisor); Assert.Equal(expected, size / divisor); } + + [Theory] + [InlineData(int.MaxValue, int.MinValue)] + [InlineData(int.MinValue, int.MinValue)] + [InlineData(int.MaxValue, int.MaxValue)] + [InlineData(0, 0)] + public void DeconstructTest(int width, int height) + { + Size s = new Size(width, height); + + (int deconstructedWidth, int deconstructedHeight) = s; + + Assert.Equal(width, deconstructedWidth); + Assert.Equal(height, deconstructedHeight); + } } } \ No newline at end of file From e55f1b1e83bc99c0698e485b0e2ffe72df2300db Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Thu, 2 May 2019 11:04:44 +0200 Subject: [PATCH 103/136] [SL.Core] Changed double InlineData from MinValue to MaxValue --- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 04363fa943..71f8566466 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -213,9 +213,9 @@ public void MultiplicationTestWidthHeightMultiplier(float width, float height, f [InlineData(float.MinValue, -1.0f)] [InlineData(float.MinValue, 0.0f)] [InlineData(1.0f, float.MinValue)] - [InlineData(1.0f, float.MinValue)] - [InlineData(-1.0f, float.MinValue)] + [InlineData(1.0f, float.MaxValue)] [InlineData(-1.0f, float.MinValue)] + [InlineData(-1.0f, float.MaxValue)] public void DivideTestSizeFloat(float dimension, float divisor) { SizeF size = new SizeF(dimension, dimension); From 597c49d31232b05a8f5d5e404e3e3b3cd9638529 Mon Sep 17 00:00:00 2001 From: Gerard Gunnewijk Date: Thu, 2 May 2019 11:20:16 +0200 Subject: [PATCH 104/136] [SL.Core] Added .github folder based upon ImageSharp .github folder. --- .github/CONTRIBUTING.md | 35 +++++++++++++++++++++++ .github/ISSUE_TEMPLATE/ask-question.md | 13 +++++++++ .github/ISSUE_TEMPLATE/bug-report.md | 29 +++++++++++++++++++ .github/ISSUE_TEMPLATE/feature-request.md | 13 +++++++++ .github/PULL_REQUEST_TEMPLATE.md | 11 +++++++ SixLabors.Core.sln | 12 ++++++-- 6 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE/ask-question.md create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000000..9d83b43b52 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# How to contribute to SixLabors.Core + +#### **Did you find a bug?** + +- Please **ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SixLabors/Core/issues). + +- If you're unable to find an open issue addressing the problem, please [open a new one](https://github.com/SixLabors/Core/issues/new). Be sure to include a **title, the applicable version, a clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. Please do not hijack existing issues. + +#### **Did you write a patch that fixes a bug?** + +* Open a new GitHub pull request with the patch. + +* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. + +* Before submitting, please ensure that your code matches the existing coding patterns and practise as demonstrated in the repository. These follow strict Stylecop rules :cop:. + +#### **Do you intend to add a new feature or change an existing one?** + +* Suggest your change in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General) and start writing code. + +* Do not open an issue on GitHub until you have collected positive feedback about the change. GitHub issues are primarily intended for bug reports and fixes. + +#### **Running tests and Debugging** + +* Debugging (running tests in Debug mode) is only supported on .NET Core 2.1, because of JIT Code Generation bugs like [dotnet/coreclr#16443](https://github.com/dotnet/coreclr/issues/16443) or [dotnet/coreclr#20657](https://github.com/dotnet/coreclr/issues/20657) + +#### **Do you have questions about consuming the library or the source code?** + +* Ask any question about how to use SixLabors.Core in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General). + +And please remember. SixLabors.Core is the work of a very, very, small number of developers who struggle balancing time to contribute to the project with family time and work commitments. We encourage you to pitch in and help make our vision of simple accessible imageprocessing available to all. Open Source can only exist with your help. + +Thanks for reading! + +James Jackson-South :heart: diff --git a/.github/ISSUE_TEMPLATE/ask-question.md b/.github/ISSUE_TEMPLATE/ask-question.md new file mode 100644 index 0000000000..c8313fba9f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ask-question.md @@ -0,0 +1,13 @@ +--- +name: Ask question +about: Ask a question about this project. + +--- + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General + +You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000000..c1bf768fa8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,29 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + +### Prerequisites + +- [ ] I have written a descriptive issue title +- [ ] I have verified that I am running the latest version of ImageSharp +- [ ] I have verified if the problem exist in both `DEBUG` and `RELEASE` mode +- [ ] I have searched [open](https://github.com/SixLabors/Core/issues) and [closed](https://github.com/SixLabors/Core/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported + +### Description + + +### Steps to Reproduce + + +### System Configuration + + +- SixLabors.Core version: +- Other SixLabors packages and versions: +- Environment (Operating system, version and so on): +- .NET Framework version: +- Additional information: + + diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000000..be1e593be4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,13 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General + +You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..a717a05a1e --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,11 @@ +### Prerequisites + +- [ ] I have written a descriptive pull-request title +- [ ] I have verified that there are no overlapping [pull-requests](https://github.com/SixLabors/Core/pulls) open +- [ ] I have verified that I am following matches the existing coding patterns and practice as demonstrated in the repository. These follow strict Stylecop rules :cop:. +- [ ] I have provided test coverage for my change (where applicable) + +### Description + + + diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index d10b177877..040ce0688f 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -1,15 +1,20 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26430.14 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28803.352 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig appveyor.yml = appveyor.yml + .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md + .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md build.cmd = build.cmd codecov.yml = codecov.yml + .github\CONTRIBUTING.md = .github\CONTRIBUTING.md + .github\ISSUE_TEMPLATE\feature-request.md = .github\ISSUE_TEMPLATE\feature-request.md gitversion.yml = gitversion.yml + .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md README.md = README.md EndProjectSection EndProject @@ -49,6 +54,9 @@ Global {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {0DED1AC8-37DA-4EC2-8CAE-40E31CD439DE} + EndGlobalSection GlobalSection(Performance) = preSolution HasPerformanceSessions = true EndGlobalSection From 3cdd259c6aeb2ffea9c1deee0463e4e30c6e3762 Mon Sep 17 00:00:00 2001 From: Mertsch Date: Fri, 28 Jun 2019 16:23:35 +0200 Subject: [PATCH 105/136] [SL.Core] Remove typo in NuGet package description --- src/SixLabors.Core/SixLabors.Core.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7dd934b2fb..e733ee2fcf 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -1,7 +1,7 @@  - Low level primitives for use across Six Labors projects.. + Low level primitives for use across Six Labors projects. $(packageversion) 0.1.0-alpha2 Six Labors @@ -55,4 +55,4 @@ - \ No newline at end of file + From 9af8343e0134b8091fbf53f3a931863ca82434d8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:31:38 +0200 Subject: [PATCH 106/136] [SL.Core] Upgraded StyleCop. --- src/SixLabors.Core/SixLabors.Core.csproj | 2 +- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 7dd934b2fb..cbdee57ccd 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,7 @@ - + All diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 64545d0829..f1b5839fc1 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -27,7 +27,10 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + From 901929bdf590c91300fcb62794c6957f6917d187 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:32:59 +0200 Subject: [PATCH 107/136] [SL.Core] Fixed new StyleCop issues. --- src/SixLabors.Core/Constants.cs | 2 +- src/SixLabors.Core/Helpers/DebugGuard.cs | 8 +- src/SixLabors.Core/Helpers/Guard.cs | 2 +- src/SixLabors.Core/MathF.cs | 2 +- .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 4 +- ...oolMemoryAllocator.CommonFactoryMethods.cs | 8 +- .../Memory/ArrayPoolMemoryAllocator.cs | 4 +- .../Memory/Internals/BasicArrayBuffer.cs | 14 +-- .../Memory/Internals/BasicByteBuffer.cs | 4 +- .../Memory/Internals/ManagedBufferBase.cs | 4 +- src/SixLabors.Core/Memory/MemoryAllocator.cs | 8 +- src/SixLabors.Core/Primitives/Point.cs | 48 +++++------ src/SixLabors.Core/Primitives/PointF.cs | 32 +++---- src/SixLabors.Core/Primitives/Rectangle.cs | 86 +++++++++---------- src/SixLabors.Core/Primitives/RectangleF.cs | 72 ++++++++-------- src/SixLabors.Core/Primitives/Size.cs | 40 ++++----- src/SixLabors.Core/Primitives/SizeF.cs | 22 ++--- .../Helpers/FloatRoundingComparer.cs | 4 +- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 2 +- 19 files changed, 183 insertions(+), 183 deletions(-) diff --git a/src/SixLabors.Core/Constants.cs b/src/SixLabors.Core/Constants.cs index eda2f596f4..b8699e2d15 100644 --- a/src/SixLabors.Core/Constants.cs +++ b/src/SixLabors.Core/Constants.cs @@ -4,7 +4,7 @@ namespace SixLabors { /// - /// Common constants used throughout the project + /// Common constants used throughout the project. /// internal static class Constants { diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index f1fc1c64c3..bfc2a7a8d6 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -18,8 +18,8 @@ internal static class DebugGuard /// /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// is null - /// The type of the object to verify + /// is null. + /// The type of the object to verify. [Conditional("DEBUG")] public static void NotNull(T target, string parameterName) where T : class @@ -119,12 +119,12 @@ public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, /// /// Verifies, that the `target` array has declared the length or longer. /// - /// The element type of the spans + /// The element type of the spans. /// The target array. /// The min length the array must have. /// The name of the parameter that is to be checked. /// - /// is true + /// is true. /// [Conditional("DEBUG")] public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index b50cd4ab04..d6616aa78e 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -118,7 +118,7 @@ public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TVal /// /// Verifies, that the `target` span has the length of 'minLength', or longer. /// - /// The element type of the spans + /// The element type of the spans. /// The target span. /// The minimum length. /// The name of the parameter that is to be checked. diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs index b0d760ade4..d4a493a4f8 100644 --- a/src/SixLabors.Core/MathF.cs +++ b/src/SixLabors.Core/MathF.cs @@ -219,7 +219,7 @@ public static float Sin(float f) /// parameter Return value Zero or positive The positive square root of . /// Negative Equals /// Equals - /// + /// . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sqrt(float f) diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs index 0b0d6c4d49..5676ab23fc 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -9,7 +9,7 @@ namespace SixLabors.Memory { /// - /// Contains and + /// Contains and . /// public partial class ArrayPoolMemoryAllocator { @@ -20,7 +20,7 @@ private class Buffer : ManagedBufferBase where T : struct { /// - /// The length of the buffer + /// The length of the buffer. /// private readonly int length; diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index c56453b007..dd6e9a8f0b 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -32,7 +32,7 @@ public partial class ArrayPoolMemoryAllocator /// /// This is the default. Should be good for most use cases. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateDefault() { return new ArrayPoolMemoryAllocator( @@ -45,7 +45,7 @@ public static ArrayPoolMemoryAllocator CreateDefault() /// /// For environments with very limited memory capabilities, only small buffers like image rows are pooled. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() { return new ArrayPoolMemoryAllocator(64 * 1024, 32 * 1024, 8, 24); @@ -54,7 +54,7 @@ public static ArrayPoolMemoryAllocator CreateWithMinimalPooling() /// /// For environments with limited memory capabilities, only small array requests are pooled, which can result in reduced throughput. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithModeratePooling() { return new ArrayPoolMemoryAllocator(1024 * 1024, 32 * 1024, 16, 24); @@ -63,7 +63,7 @@ public static ArrayPoolMemoryAllocator CreateWithModeratePooling() /// /// For environments where memory capabilities are not an issue, the maximum amount of array requests are pooled which results in optimal throughput. /// - /// The memory manager + /// The memory manager. public static ArrayPoolMemoryAllocator CreateWithAggressivePooling() { return new ArrayPoolMemoryAllocator(128 * 1024 * 1024, 32 * 1024 * 1024, 16, 32); diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs index 113e127853..0905948e00 100644 --- a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs @@ -58,8 +58,8 @@ public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThreshol /// /// The maximum size of pooled arrays. Arrays over the thershold are gonna be always allocated. /// The threshold to pool arrays in which has less buckets for memory safety. - /// Max arrays per bucket for the large array pool - /// Max arrays per bucket for the normal array pool + /// Max arrays per bucket for the large array pool. + /// Max arrays per bucket for the normal array pool. public ArrayPoolMemoryAllocator(int maxPoolSizeInBytes, int poolSelectorThresholdInBytes, int maxArraysPerBucketLargePool, int maxArraysPerBucketNormalPool) { Guard.MustBeGreaterThan(maxPoolSizeInBytes, 0, nameof(maxPoolSizeInBytes)); diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs index bc12d7c2f1..c0d36afd55 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs @@ -14,10 +14,10 @@ internal class BasicArrayBuffer : ManagedBufferBase where T : struct { /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The array - /// The length of the buffer + /// The array. + /// The length of the buffer. public BasicArrayBuffer(T[] array, int length) { DebugGuard.MustBeLessThanOrEqualTo(length, array.Length, nameof(length)); @@ -26,21 +26,21 @@ public BasicArrayBuffer(T[] array, int length) } /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The array + /// The array. public BasicArrayBuffer(T[] array) : this(array, array.Length) { } /// - /// Gets the array + /// Gets the array. /// public T[] Array { get; } /// - /// Gets the length + /// Gets the length. /// public int Length { get; } diff --git a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs index ee76c2ee3a..fa6a5de4c7 100644 --- a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs +++ b/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs @@ -9,9 +9,9 @@ namespace SixLabors.Memory.Internals internal sealed class BasicByteBuffer : BasicArrayBuffer, IManagedByteBuffer { /// - /// Initializes a new instance of the class + /// Initializes a new instance of the class. /// - /// The byte array + /// The byte array. internal BasicByteBuffer(byte[] array) : base(array) { diff --git a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs index 9dadcf5a28..e1f131693c 100644 --- a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs +++ b/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs @@ -9,7 +9,7 @@ namespace SixLabors.Memory.Internals /// /// Provides a base class for implementations by implementing pinning logic for adaption. /// - /// The element type + /// The element type. internal abstract class ManagedBufferBase : MemoryManager where T : struct { @@ -39,7 +39,7 @@ public override void Unpin() /// /// Gets the object that should be pinned. /// - /// The pinnable + /// The pinnable . protected abstract object GetPinnableObject(); } } \ No newline at end of file diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/SixLabors.Core/Memory/MemoryAllocator.cs index 36ce8fcce0..24ed7bef38 100644 --- a/src/SixLabors.Core/Memory/MemoryAllocator.cs +++ b/src/SixLabors.Core/Memory/MemoryAllocator.cs @@ -13,8 +13,8 @@ public abstract class MemoryAllocator /// /// Allocates an , holding a of length . /// - /// Type of the data stored in the buffer - /// Size of the buffer to allocate + /// Type of the data stored in the buffer. + /// Size of the buffer to allocate. /// The allocation options. /// A buffer of values of type . public abstract IMemoryOwner Allocate(int length, AllocationOptions options = AllocationOptions.None) @@ -23,9 +23,9 @@ public abstract IMemoryOwner Allocate(int length, AllocationOptions option /// /// Allocates an . /// - /// The requested buffer length + /// The requested buffer length. /// The allocation options. - /// The + /// The . public abstract IManagedByteBuffer AllocateManagedByteBuffer(int length, AllocationOptions options = AllocationOptions.None); /// diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/SixLabors.Core/Primitives/Point.cs index 77ebb62f64..ec57330411 100644 --- a/src/SixLabors.Core/Primitives/Point.cs +++ b/src/SixLabors.Core/Primitives/Point.cs @@ -49,7 +49,7 @@ public Point(int x, int y) /// /// Initializes a new instance of the struct from the given . /// - /// The size + /// The size. public Point(Size size) { this.X = size.Width; @@ -75,21 +75,21 @@ public Point(Size size) /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator PointF(Point point) => new PointF(point.X, point.Y); /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector2(Point point) => new Vector2(point.X, point.Y); /// /// Creates a with the coordinates of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Size(Point point) => new Size(point.X, point.Y); @@ -106,7 +106,7 @@ public Point(Size size) /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator +(Point point, Size size) => Add(point, size); @@ -116,7 +116,7 @@ public Point(Size size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point operator -(Point point, Size size) => Subtract(point, size); @@ -172,16 +172,16 @@ public Point(Size size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Add(Point point, Size size) => new Point(unchecked(point.X + size.Width), unchecked(point.Y + size.Height)); /// - /// Translates a by the negative of a given value + /// Translates a by the negative of a given value. /// /// The point on the left hand of the operand. /// The value on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Multiply(Point point, int value) => new Point(unchecked(point.X * value), unchecked(point.Y * value)); @@ -190,56 +190,56 @@ public Point(Size size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Subtract(Point point, Size size) => new Point(unchecked(point.X - size.Width), unchecked(point.Y - size.Height)); /// /// Converts a to a by performing a ceiling operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Ceiling(PointF point) => new Point(unchecked((int)MathF.Ceiling(point.X)), unchecked((int)MathF.Ceiling(point.Y))); /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(PointF point) => new Point(unchecked((int)MathF.Round(point.X)), unchecked((int)MathF.Round(point.Y))); /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The vector - /// The + /// The vector. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Round(Vector2 vector) => new Point(unchecked((int)MathF.Round(vector.X)), unchecked((int)MathF.Round(vector.Y))); /// /// Converts a to a by performing a truncate operation on all the coordinates. /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Truncate(PointF point) => new Point(unchecked((int)point.X), unchecked((int)point.Y)); /// /// Transforms a point by a specified 3x2 matrix. /// - /// The point to transform - /// The transformation matrix used - /// The transformed + /// The point to transform. + /// The transformation matrix used. + /// The transformed . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Transform(Point point, Matrix3x2 matrix) => Round(Vector2.Transform(new Vector2(point.X, point.Y), matrix)); /// - /// Deconstructs this point into two integers + /// Deconstructs this point into two integers. /// - /// The out value for X - /// The out value for Y + /// The out value for X. + /// The out value for Y. public void Deconstruct(out int x, out int y) { x = this.X; diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/SixLabors.Core/Primitives/PointF.cs index 844a5f264f..4a2da5cdcd 100644 --- a/src/SixLabors.Core/Primitives/PointF.cs +++ b/src/SixLabors.Core/Primitives/PointF.cs @@ -38,7 +38,7 @@ public PointF(float x, float y) /// /// Initializes a new instance of the struct from the given . /// - /// The size + /// The size. public PointF(SizeF size) { this.X = size.Width; @@ -104,7 +104,7 @@ public PointF(SizeF size) /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, SizeF size) => Add(point, size); @@ -114,7 +114,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, PointF size) => Subtract(point, size); @@ -124,7 +124,7 @@ public PointF(SizeF size) /// The point on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator +(PointF point, PointF size) => Add(point, size); @@ -134,7 +134,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF operator -(PointF point, SizeF size) => Subtract(point, size); @@ -198,7 +198,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, SizeF size) => new PointF(point.X + size.Width, point.Y + size.Height); @@ -207,7 +207,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The point on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Add(PointF point, PointF pointb) => new PointF(point.X + pointb.X, point.Y + pointb.Y); @@ -216,7 +216,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, SizeF size) => new PointF(point.X - size.Width, point.Y - size.Height); @@ -225,7 +225,7 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The point on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Subtract(PointF point, PointF pointb) => new PointF(point.X - pointb.X, point.Y - pointb.Y); @@ -234,24 +234,24 @@ public PointF(SizeF size) /// /// The point on the left hand of the operand. /// The value on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Multiply(PointF point, float right) => new PointF(point.X * right, point.Y * right); /// /// Transforms a point by a specified 3x2 matrix. /// - /// The point to transform - /// The transformation matrix used - /// The transformed + /// The point to transform. + /// The transformation matrix used. + /// The transformed . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Transform(PointF point, Matrix3x2 matrix) => Vector2.Transform(point, matrix); /// - /// Deconstructs this point into two floats + /// Deconstructs this point into two floats. /// - /// The out value for X - /// The out value for Y + /// The out value for X. + /// The out value for Y. public void Deconstruct(out float x, out float y) { x = this.X; diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/SixLabors.Core/Primitives/Rectangle.cs index 239813ac73..8600e2e4c8 100644 --- a/src/SixLabors.Core/Primitives/Rectangle.cs +++ b/src/SixLabors.Core/Primitives/Rectangle.cs @@ -145,14 +145,14 @@ public int Bottom /// /// Creates a with the coordinates of the specified . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator RectangleF(Rectangle rectangle) => new RectangleF(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); /// /// Creates a with the coordinates of the specified . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Vector4(Rectangle rectangle) => new Vector4(rectangle.X, rectangle.Y, rectangle.Width, rectangle.Height); @@ -180,21 +180,21 @@ public int Bottom /// /// Creates a new with the specified location and size. - /// The left coordinate of the rectangle - /// The top coordinate of the rectangle - /// The right coordinate of the rectangle - /// The bottom coordinate of the rectangle - /// The + /// The left coordinate of the rectangle. + /// The top coordinate of the rectangle. + /// The right coordinate of the rectangle. + /// The bottom coordinate of the rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] // ReSharper disable once InconsistentNaming public static Rectangle FromLTRB(int left, int top, int right, int bottom) => new Rectangle(left, top, unchecked(right - left), unchecked(bottom - top)); /// - /// Returns the center point of the given + /// Returns the center point of the given . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Point Center(Rectangle rectangle) => new Point(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); @@ -202,9 +202,9 @@ public int Bottom /// Creates a rectangle that represents the intersection between and /// . If there is no intersection, an empty rectangle is returned. /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Intersect(Rectangle a, Rectangle b) { @@ -224,10 +224,10 @@ public static Rectangle Intersect(Rectangle a, Rectangle b) /// /// Creates a that is inflated by the specified amount. /// - /// The rectangle - /// The amount to inflate the width by - /// The amount to inflate the height by - /// A new + /// The rectangle. + /// The amount to inflate the width by. + /// The amount to inflate the height by. + /// A new . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Inflate(Rectangle rectangle, int x, int y) { @@ -239,8 +239,8 @@ public static Rectangle Inflate(Rectangle rectangle, int x, int y) /// /// Converts a to a by performing a ceiling operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Ceiling(RectangleF rectangle) { @@ -270,8 +270,8 @@ public static RectangleF Transform(Rectangle rectangle, Matrix3x2 matrix) /// /// Converts a to a by performing a truncate operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Truncate(RectangleF rectangle) { @@ -288,8 +288,8 @@ public static Rectangle Truncate(RectangleF rectangle) /// /// Converts a to a by performing a round operation on all the coordinates. /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Round(RectangleF rectangle) { @@ -306,9 +306,9 @@ public static Rectangle Round(RectangleF rectangle) /// /// Creates a rectangle that represents the union between and . /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Rectangle Union(Rectangle a, Rectangle b) { @@ -321,12 +321,12 @@ public static Rectangle Union(Rectangle a, Rectangle b) } /// - /// Deconstructs this rectangle into four integers + /// Deconstructs this rectangle into four integers. /// - /// The out value for X - /// The out value for Y - /// The out value for the width - /// The out value for the height + /// The out value for X. + /// The out value for Y. + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out int x, out int y, out int width, out int height) { x = this.X; @@ -338,7 +338,7 @@ public void Deconstruct(out int x, out int y, out int width, out int height) /// /// Creates a Rectangle that represents the intersection between this Rectangle and the . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Intersect(Rectangle rectangle) { @@ -353,8 +353,8 @@ public void Intersect(Rectangle rectangle) /// /// Inflates this by the specified amount. /// - /// The width - /// The height + /// The width. + /// The height. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(int width, int height) { @@ -371,7 +371,7 @@ public void Inflate(int width, int height) /// /// Inflates this by the specified amount. /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(Size size) => this.Inflate(size.Width, size.Height); @@ -381,15 +381,15 @@ public void Inflate(int width, int height) /// /// The x-coordinate of the given point. /// The y-coordinate of the given point. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(int x, int y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; /// /// Determines if the specified point is contained within the rectangular region defined by this . /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(Point point) => this.Contains(point.X, point.Y); @@ -397,8 +397,8 @@ public void Inflate(int width, int height) /// Determines if the rectangular region represented by is entirely contained /// within the rectangular region represented by this . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(Rectangle rectangle) => (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && @@ -408,8 +408,8 @@ public bool Contains(Rectangle rectangle) => /// Determines if the specfied intersects the rectangular region defined by /// this . /// - /// The other Rectange - /// The + /// The other Rectange. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IntersectsWith(Rectangle rectangle) => (rectangle.X < this.Right) && (this.X < rectangle.Right) && @@ -418,7 +418,7 @@ public bool IntersectsWith(Rectangle rectangle) => /// /// Adjusts the location of this rectangle by the specified amount. /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Offset(Point point) => this.Offset(point.X, point.Y); diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/SixLabors.Core/Primitives/RectangleF.cs index f212e5bcc1..c8b58f4ede 100644 --- a/src/SixLabors.Core/Primitives/RectangleF.cs +++ b/src/SixLabors.Core/Primitives/RectangleF.cs @@ -145,7 +145,7 @@ public float Bottom /// /// Creates a with the coordinates of the specified by truncating each coordinate. /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Rectangle(RectangleF rectangle) => Rectangle.Truncate(rectangle); @@ -173,21 +173,21 @@ public float Bottom /// /// Creates a new with the specified location and size. - /// The left coordinate of the rectangle - /// The top coordinate of the rectangle - /// The right coordinate of the rectangle - /// The bottom coordinate of the rectangle - /// The + /// The left coordinate of the rectangle. + /// The top coordinate of the rectangle. + /// The right coordinate of the rectangle. + /// The bottom coordinate of the rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] // ReSharper disable once InconsistentNaming public static RectangleF FromLTRB(float left, float top, float right, float bottom) => new RectangleF(left, top, right - left, bottom - top); /// - /// Returns the center point of the given + /// Returns the center point of the given . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static PointF Center(RectangleF rectangle) => new PointF(rectangle.Left + (rectangle.Width / 2), rectangle.Top + (rectangle.Height / 2)); @@ -195,9 +195,9 @@ public float Bottom /// Creates a rectangle that represents the intersection between and /// . If there is no intersection, an empty rectangle is returned. /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Intersect(RectangleF a, RectangleF b) { @@ -217,10 +217,10 @@ public static RectangleF Intersect(RectangleF a, RectangleF b) /// /// Creates a that is inflated by the specified amount. /// - /// The rectangle - /// The amount to inflate the width by - /// The amount to inflate the height by - /// A new + /// The rectangle. + /// The amount to inflate the width by. + /// The amount to inflate the height by. + /// A new . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Inflate(RectangleF rectangle, float x, float y) { @@ -245,9 +245,9 @@ public static RectangleF Transform(RectangleF rectangle, Matrix3x2 matrix) /// /// Creates a rectangle that represents the union between and . /// - /// The first rectangle - /// The second rectangle - /// The + /// The first rectangle. + /// The second rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static RectangleF Union(RectangleF a, RectangleF b) { @@ -260,12 +260,12 @@ public static RectangleF Union(RectangleF a, RectangleF b) } /// - /// Deconstructs this rectangle into four floats + /// Deconstructs this rectangle into four floats. /// - /// The out value for X - /// The out value for Y - /// The out value for the width - /// The out value for the height + /// The out value for X. + /// The out value for Y. + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out float x, out float y, out float width, out float height) { x = this.X; @@ -277,7 +277,7 @@ public void Deconstruct(out float x, out float y, out float width, out float hei /// /// Creates a RectangleF that represents the intersection between this RectangleF and the . /// - /// The rectangle + /// The rectangle. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Intersect(RectangleF rectangle) { @@ -292,8 +292,8 @@ public void Intersect(RectangleF rectangle) /// /// Inflates this by the specified amount. /// - /// The width - /// The height + /// The width. + /// The height. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(float width, float height) { @@ -307,7 +307,7 @@ public void Inflate(float width, float height) /// /// Inflates this by the specified amount. /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Inflate(SizeF size) => this.Inflate(size.Width, size.Height); @@ -317,15 +317,15 @@ public void Inflate(float width, float height) /// /// The x-coordinate of the given point. /// The y-coordinate of the given point. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(float x, float y) => this.X <= x && x < this.Right && this.Y <= y && y < this.Bottom; /// /// Determines if the specified point is contained within the rectangular region defined by this . /// - /// The point - /// The + /// The point. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(PointF point) => this.Contains(point.X, point.Y); @@ -333,8 +333,8 @@ public void Inflate(float width, float height) /// Determines if the rectangular region represented by is entirely contained /// within the rectangular region represented by this . /// - /// The rectangle - /// The + /// The rectangle. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Contains(RectangleF rectangle) => (this.X <= rectangle.X) && (rectangle.Right <= this.Right) && @@ -344,8 +344,8 @@ public bool Contains(RectangleF rectangle) => /// Determines if the specfied intersects the rectangular region defined by /// this . /// - /// The other Rectange - /// The + /// The other Rectange. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool IntersectsWith(RectangleF rectangle) => (rectangle.X < this.Right) && (this.X < rectangle.Right) && @@ -354,7 +354,7 @@ public bool IntersectsWith(RectangleF rectangle) => /// /// Adjusts the location of this rectangle by the specified amount. /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Offset(PointF point) => this.Offset(point.X, point.Y); diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/SixLabors.Core/Primitives/Size.cs index 0c468a80b7..e0eb6484ce 100644 --- a/src/SixLabors.Core/Primitives/Size.cs +++ b/src/SixLabors.Core/Primitives/Size.cs @@ -25,7 +25,7 @@ public struct Size : IEquatable /// /// Initializes a new instance of the struct. /// - /// The width and height of the size + /// The width and height of the size. public Size(int value) : this() { @@ -47,7 +47,7 @@ public Size(int width, int height) /// /// Initializes a new instance of the struct. /// - /// The size + /// The size. public Size(Size size) : this() { @@ -58,7 +58,7 @@ public Size(Size size) /// /// Initializes a new instance of the struct from the given . /// - /// The point + /// The point. public Size(Point point) { this.Width = point.X; @@ -84,14 +84,14 @@ public Size(Point point) /// /// Creates a with the dimensions of the specified . /// - /// The point + /// The point. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator SizeF(Size size) => new SizeF(size.Width, size.Height); /// /// Converts the given into a . /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator Point(Size size) => new Point(size.Width, size.Height); @@ -101,7 +101,7 @@ public Size(Point point) /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator +(Size left, Size right) => Add(left, right); @@ -112,7 +112,7 @@ public Size(Point point) /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size operator -(Size left, Size right) => Subtract(left, right); @@ -201,39 +201,39 @@ public Size(Point point) /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Add(Size left, Size right) => new Size(unchecked(left.Width + right.Width), unchecked(left.Height + right.Height)); /// - /// Contracts a by another + /// Contracts a by another . /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Subtract(Size left, Size right) => new Size(unchecked(left.Width - right.Width), unchecked(left.Height - right.Height)); /// /// Converts a to a by performing a ceiling operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Ceiling(SizeF size) => new Size(unchecked((int)MathF.Ceiling(size.Width)), unchecked((int)MathF.Ceiling(size.Height))); /// /// Converts a to a by performing a round operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Round(SizeF size) => new Size(unchecked((int)MathF.Round(size.Width)), unchecked((int)MathF.Round(size.Height))); /// /// Transforms a size by the given matrix. /// - /// The source size + /// The source size. /// The transformation matrix. /// A transformed size. public static SizeF Transform(Size size, Matrix3x2 matrix) @@ -246,16 +246,16 @@ public static SizeF Transform(Size size, Matrix3x2 matrix) /// /// Converts a to a by performing a round operation on all the dimensions. /// - /// The size - /// The + /// The size. + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Size Truncate(SizeF size) => new Size(unchecked((int)size.Width), unchecked((int)size.Height)); /// - /// Deconstructs this size into two integers + /// Deconstructs this size into two integers. /// - /// The out value for the width - /// The out value for the height + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out int width, out int height) { width = this.Width; diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/SixLabors.Core/Primitives/SizeF.cs index b7e15b5e3f..5d503a705d 100644 --- a/src/SixLabors.Core/Primitives/SizeF.cs +++ b/src/SixLabors.Core/Primitives/SizeF.cs @@ -36,7 +36,7 @@ public SizeF(float width, float height) /// /// Initializes a new instance of the struct. /// - /// The size + /// The size. public SizeF(SizeF size) : this() { @@ -47,7 +47,7 @@ public SizeF(SizeF size) /// /// Initializes a new instance of the struct from the given . /// - /// The point + /// The point. public SizeF(PointF point) { this.Width = point.X; @@ -93,7 +93,7 @@ public SizeF(PointF point) /// /// Converts the given into a . /// - /// The size + /// The size. [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator PointF(SizeF size) => new PointF(size.Width, size.Height); @@ -103,7 +103,7 @@ public SizeF(PointF point) /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator +(SizeF left, SizeF right) => Add(left, right); @@ -114,7 +114,7 @@ public SizeF(PointF point) /// The size on the left hand of the operand. /// The size on the right hand of the operand. /// - /// The + /// The . /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF operator -(SizeF left, SizeF right) => Subtract(left, right); @@ -171,16 +171,16 @@ public SizeF(PointF point) /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Add(SizeF left, SizeF right) => new SizeF(left.Width + right.Width, left.Height + right.Height); /// - /// Contracts a by another + /// Contracts a by another . /// /// The size on the left hand of the operand. /// The size on the right hand of the operand. - /// The + /// The . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static SizeF Subtract(SizeF left, SizeF right) => new SizeF(left.Width - right.Width, left.Height - right.Height); @@ -198,10 +198,10 @@ public static SizeF Transform(SizeF size, Matrix3x2 matrix) } /// - /// Deconstructs this size into two floats + /// Deconstructs this size into two floats. /// - /// The out value for the width - /// The out value for the height + /// The out value for the width. + /// The out value for the height. public void Deconstruct(out float width, out float height) { width = this.Width; diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs index a5c965b109..15220d4b14 100644 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs @@ -15,7 +15,7 @@ public struct FloatRoundingComparer : IEqualityComparer, IEqualityCompare /// /// Initializes a new instance of the struct. /// - /// The number of decimal places (valid values: 0-7) + /// The number of decimal places (valid values: 0-7). public FloatRoundingComparer(int precision) { Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); @@ -23,7 +23,7 @@ public FloatRoundingComparer(int precision) } /// - /// Gets the number of decimal places (valid values: 0-7) + /// Gets the number of decimal places (valid values: 0-7). /// public int Precision { get; } diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index e59590bae9..6f95a4d78c 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -22,7 +22,7 @@ public class ArrayPoolMemoryAllocatorTests new ArrayPoolMemoryAllocator(MaxPooledBufferSizeInBytes, PoolSelectorThresholdInBytes); /// - /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location + /// Rent a buffer -> return it -> re-rent -> verify if it's span points to the previous location. /// private bool CheckIsRentingPooledBuffer(int length) where T : struct From 124d34df96240083ad8c88fc1303e0a793f095a8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:38:42 +0200 Subject: [PATCH 108/136] [SL.Core] Ignore StyleCop rules that demand a certain order. --- tests/SixLabors.ruleset | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset index 9729157125..a4fa8c4f71 100644 --- a/tests/SixLabors.ruleset +++ b/tests/SixLabors.ruleset @@ -5,6 +5,8 @@ + + From 55e8063645139f81a8b4d8c3194ebee4c49a99a1 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:41:42 +0200 Subject: [PATCH 109/136] [SL.Core] Correct the Assert.Equals order. --- tests/SixLabors.Core.Tests/Primitives/PointFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/PointTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs | 2 +- tests/SixLabors.Core.Tests/Primitives/SizeTests.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs index 8535b3fb02..f78a18fc13 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs @@ -26,7 +26,7 @@ public void CanReinterpretCastFromVector2() [Fact] public void DefaultConstructorTest() { - Assert.Equal(PointF.Empty, default(PointF)); + Assert.Equal(default, PointF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs index 6a873567b1..7ad7f0b62c 100644 --- a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/PointTests.cs @@ -13,7 +13,7 @@ public class PointTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Point.Empty, default(Point)); + Assert.Equal(default, Point.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs index 926416ae5e..f83f6435a2 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs @@ -16,7 +16,7 @@ public class RectangleFTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(RectangleF.Empty, default(RectangleF)); + Assert.Equal(default, RectangleF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 8a00cd1fcd..2f56b9ecd6 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -15,7 +15,7 @@ public class RectangleTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Rectangle.Empty, default(Rectangle)); + Assert.Equal(default, Rectangle.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs index 0545a93dbb..5bfc8f5ef1 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs @@ -13,7 +13,7 @@ public class SizeFTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(SizeF.Empty, default(SizeF)); + Assert.Equal(default, SizeF.Empty); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs index 05f690603d..af4b8430d1 100644 --- a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs @@ -15,7 +15,7 @@ public class SizeTests [Fact] public void DefaultConstructorTest() { - Assert.Equal(Size.Empty, default(Size)); + Assert.Equal(default, Size.Empty); } [Theory] From 930f3573ebeab62150b3397af92bfc7b45e9be27 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:43:25 +0200 Subject: [PATCH 110/136] [SL.Core] Use Assert.Contains instead. --- tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs | 4 ++-- tests/SixLabors.Core.Tests/Helpers/GuardTests.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 68416b47dc..9b14fc8ca0 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -59,7 +59,7 @@ public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + Assert.Contains($"Value must be less than {max}.", exception.Message); } [Theory] @@ -79,7 +79,7 @@ public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + Assert.Contains($"Value must be less than or equal to 1.", exception.Message); } [Fact] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index ecffd79daa..d6ef967b83 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -25,7 +25,7 @@ public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than {max}.")); + Assert.Contains($"Value must be less than {max}.", exception.Message); } [Theory] @@ -45,7 +45,7 @@ public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be less than or equal to 1.")); + Assert.Contains($"Value must be less than or equal to 1.", exception.Message); } [Fact] @@ -85,7 +85,7 @@ public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.True(exception.Message.Contains($"Value must be greater than or equal to 2.")); + Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); } [Theory] From 5b32cb9a395bc28553d0a2034bbb0c3831440317 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 17:43:58 +0200 Subject: [PATCH 111/136] [SL.Core] Fixed StyleCop issues. --- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 1 - .../SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6f95a4d78c..6f72a076e6 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. // ReSharper disable InconsistentNaming - using System; using System.Buffers; using System.Runtime.CompilerServices; diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 86e71717e7..7b431126db 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -23,7 +23,7 @@ public BufferTests() [InlineData(-1)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate( length)); + var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } From 3b84a040136ba4d60ec24ba9153686d85364f3a8 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 18:03:52 +0200 Subject: [PATCH 112/136] [SL.Core] Silence warning. --- src/SixLabors.Core/HashCode.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs index 73d4b3574c..b93d4a97f0 100644 --- a/src/SixLabors.Core/HashCode.cs +++ b/src/SixLabors.Core/HashCode.cs @@ -44,6 +44,7 @@ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT #if SUPPORTS_HASHCODE using System.Runtime.CompilerServices; + [assembly: TypeForwardedTo(typeof(System.HashCode))] #else using System.Buffers.Binary; From 38cfae872c46b34c41bb4542cd17683dfee69b45 Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 8 Aug 2019 18:04:24 +0200 Subject: [PATCH 113/136] [SL.Core] Added LangVersion to the unit test project. --- tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index f1b5839fc1..55951fb43f 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -15,6 +15,7 @@ full SixLabors.Tests true + 7.3 From 20aef1b6da6ec581b2402a2ed648c63baf225172 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:04:35 +0200 Subject: [PATCH 114/136] [SL.Core] Extend Guard and DebugGuard --- src/SixLabors.Core/Helpers/DebugGuard.cs | 217 ++++++++++++++++-- src/SixLabors.Core/Helpers/Guard.cs | 217 ++++++++++++++++-- .../Helpers/GuardTests.cs | 102 +++++++- 3 files changed, 484 insertions(+), 52 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index bfc2a7a8d6..c7fb796b3d 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.Runtime.CompilerServices; namespace SixLabors { @@ -13,26 +14,47 @@ namespace SixLabors internal static class DebugGuard { /// - /// Verifies, that the method parameter with specified object value is not null - /// and throws an exception if it is found to be so. + /// Ensures that the value is not null. /// - /// The target object, which cannot be null. + /// The target object, which cannot be null. /// The name of the parameter that is to be checked. - /// is null. - /// The type of the object to verify. + /// The type of the value. + /// is null. [Conditional("DEBUG")] - public static void NotNull(T target, string parameterName) - where T : class + [DebuggerStepThrough] + public static void NotNull(TValue value, string parameterName) + where TValue : class { - if (target is null) + if (value is null) { - throw new ArgumentNullException(parameterName); + ThrowArgumentNullException(parameterName); } } /// - /// Verifies that the specified value is less than a maximum value - /// and throws an exception if it is not. + /// Ensures that the target value is not null, empty, or whitespace. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// is null. + /// is empty or contains only blanks. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void NotNullOrWhiteSpace(string value, string parameterName) + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + + if (string.IsNullOrWhiteSpace(value)) + { + ThrowArgumentException("Must not be empty or whitespace.", parameterName); + } + } + + /// + /// Ensures that the specified value is less than a maximum value. /// /// The target value, which should be validated. /// The maximum value. @@ -42,12 +64,13 @@ public static void NotNull(T target, string parameterName) /// is greater than the maximum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeLessThan(TValue value, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(max) >= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); } } @@ -63,12 +86,13 @@ public static void MustBeLessThan(TValue value, TValue max, string param /// is greater than the maximum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); } } @@ -84,14 +108,15 @@ public static void MustBeLessThanOrEqualTo(TValue value, TValue max, str /// is less than the minimum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException( + ThrowArgumentOutOfRangeException( parameterName, - $"Value must be greater than {min}."); + $"Value {value} must be greater than {min}."); } } @@ -107,33 +132,177 @@ public static void MustBeGreaterThan(TValue value, TValue min, string pa /// is less than the minimum value. /// [Conditional("DEBUG")] + [DebuggerStepThrough] public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); } } /// - /// Verifies, that the `target` array has declared the length or longer. + /// Verifies that the specified value is greater than or equal to a minimum value and less than + /// or equal to a maximum value and throws an exception if it is not. /// - /// The element type of the spans. - /// The target array. - /// The min length the array must have. + /// The target value, which should be validated. + /// The minimum value. + /// The maximum value. /// The name of the parameter that is to be checked. + /// The type of the value. + /// + /// is less than the minimum value of greater than the maximum value. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) + where TValue : IComparable + { + if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) + { + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be false. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is false. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + ThrowArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. /// /// is true. /// [Conditional("DEBUG")] - public static void MustBeSizedAtLeast(T[] target, int minLength, string parameterName) - where T : struct + [DebuggerStepThrough] + public static void IsFalse(bool target, string parameterName, string message) { - if (target.Length < minLength) + if (target) { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + ThrowArgumentException(message, parameterName); } } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The source span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + ReadOnlySpan source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + Span source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentException(string message, string parameterName) + { + throw new ArgumentException(message, parameterName); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentOutOfRangeException(string parameterName, string message) + { + throw new ArgumentOutOfRangeException(parameterName, message); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentNullException(string parameterName) + { + throw new ArgumentNullException(parameterName); + } } } \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs index d6616aa78e..09c8675d3a 100644 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ b/src/SixLabors.Core/Helpers/Guard.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; +using System.Runtime.CompilerServices; namespace SixLabors { @@ -15,22 +15,63 @@ namespace SixLabors internal static class Guard { /// - /// Verifies that the specified value is less than a maximum value - /// and throws an exception if it is not. + /// Ensures that the value is not null. + /// + /// The target object, which cannot be null. + /// The name of the parameter that is to be checked. + /// The type of the value. + /// is null. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void NotNull(TValue value, string parameterName) + where TValue : class + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + } + + /// + /// Ensures that the target value is not null, empty, or whitespace. + /// + /// The target string, which should be checked against being null or empty. + /// Name of the parameter. + /// is null. + /// is empty or contains only blanks. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void NotNullOrWhiteSpace(string value, string parameterName) + { + if (value is null) + { + ThrowArgumentNullException(parameterName); + } + + if (string.IsNullOrWhiteSpace(value)) + { + ThrowArgumentException("Must not be empty or whitespace.", parameterName); + } + } + + /// + /// Ensures that the specified value is less than a maximum value. /// /// The target value, which should be validated. /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) >= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); } } @@ -42,15 +83,17 @@ public static void MustBeLessThan(TValue value, TValue max, string param /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable + where TValue : IComparable { if (value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); } } @@ -62,15 +105,19 @@ public static void MustBeLessThanOrEqualTo(TValue value, TValue max, str /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) <= 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than {min}."); + ThrowArgumentOutOfRangeException( + parameterName, + $"Value {value} must be greater than {min}."); } } @@ -82,15 +129,17 @@ public static void MustBeGreaterThan(TValue value, TValue min, string pa /// The minimum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); } } @@ -103,34 +152,158 @@ public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, /// The maximum value. /// The name of the parameter that is to be checked. /// The type of the value. - /// + /// /// is less than the minimum value of greater than the maximum value. /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) where TValue : IComparable { if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) { - throw new ArgumentOutOfRangeException(parameterName, $"Value must be greater than or equal to {min} and less than or equal to {max}."); + ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); + } + } + + /// + /// Verifies, that the method parameter with specified target value is true + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be false. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is false. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void IsTrue(bool target, string parameterName, string message) + { + if (!target) + { + ThrowArgumentException(message, parameterName); + } + } + + /// + /// Verifies, that the method parameter with specified target value is false + /// and throws an exception if it is found to be so. + /// + /// The target value, which cannot be true. + /// The name of the parameter that is to be checked. + /// The error message, if any to add to the exception. + /// + /// is true. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void IsFalse(bool target, string parameterName, string message) + { + if (target) + { + ThrowArgumentException(message, parameterName); } } /// - /// Verifies, that the `target` span has the length of 'minLength', or longer. + /// Verifies, that the `source` span has the length of 'minLength', or longer. /// /// The element type of the spans. - /// The target span. + /// The source span. /// The minimum length. /// The name of the parameter that is to be checked. /// - /// The length of is less than . + /// has less than items. /// - public static void MustBeSizedAtLeast(T[] value, int minLength, string parameterName) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) { - if (value.Length < minLength) + if (source.Length < minLength) { - throw new ArgumentException($"The size must be at least {minLength}.", parameterName); + ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); } } + + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + ReadOnlySpan source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + /// + /// Verifies that the 'destination' span is not shorter than 'source'. + /// + /// The source element type. + /// The destination element type. + /// The source span. + /// The destination span. + /// The name of the argument for 'destination'. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + [DebuggerStepThrough] + public static void DestinationShouldNotBeTooShort( + Span source, + Span destination, + string destinationParamName) + { + if (destination.Length < source.Length) + { + ThrowArgumentException($"Destination span is too short!", destinationParamName); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentException(string message, string parameterName) + { + throw new ArgumentException(message, parameterName); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentOutOfRangeException(string parameterName, string message) + { + throw new ArgumentOutOfRangeException(parameterName, message); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + private static void ThrowArgumentNullException(string parameterName) + { + throw new ArgumentNullException(parameterName); + } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index d6ef967b83..bed743767a 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -8,6 +8,96 @@ namespace SixLabors.Helpers.Tests { public class GuardTests { + private class Foo + { + } + + [Fact] + public void NotNull_WhenNull_Throws() + { + Foo foo = null; + Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); + } + + [Fact] + public void NotNull_NotNull() + { + Foo foo = new Foo(); + Guard.NotNull(foo, nameof(foo)); + } + + [Theory] + [InlineData(null, true)] + [InlineData("", true)] + [InlineData(" ", true)] + [InlineData("$", false)] + [InlineData("lol", false)] + public void NotNullOrWhiteSpace(string str, bool shouldThrow) + { + if (shouldThrow) + { + Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); + } + else + { + Guard.NotNullOrWhiteSpace(str, nameof(str)); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsTrue(bool value) + { + if (!value) + { + Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); + } + else + { + Guard.IsTrue(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsFalse(bool value) + { + if (value) + { + Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); + } + else + { + Guard.IsFalse(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(0, 0, false)] + [InlineData(1, 1, false)] + [InlineData(1, 0, false)] + [InlineData(13, 13, false)] + [InlineData(20, 13, false)] + [InlineData(12, 13, true)] + [InlineData(0, 1, true)] + public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) + { + int[] data = new int[length]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); + Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); + } + else + { + Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); + Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); + } + } + [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { @@ -25,7 +115,7 @@ public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than {max}.", exception.Message); + Assert.Contains($"Value {value} must be less than {max}.", exception.Message); } [Theory] @@ -45,7 +135,7 @@ public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than or equal to 1.", exception.Message); + Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); } [Fact] @@ -65,7 +155,7 @@ public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than {min}.", exception.Message); + Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); } [Theory] @@ -85,7 +175,7 @@ public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); + Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); } [Theory] @@ -108,7 +198,7 @@ public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); + Assert.Contains($"Value {value} must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); } [Theory] @@ -128,7 +218,7 @@ public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains("The size must be at least 3.", exception.Message); + Assert.Contains("The size must be at least 3", exception.Message); } } } From ff972defaf9c18288519e0dc3a9cca9e19c1a921 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:17:30 +0200 Subject: [PATCH 115/136] [SL.Core] harmonize Guard + DebugGuard code and tests --- src/SixLabors.Core/Helpers/DebugGuard.cs | 42 +++---- .../Helpers/DebugGuardTests.cs | 119 ++++++++++++++++-- .../Helpers/GuardTests.cs | 40 ++++-- 3 files changed, 162 insertions(+), 39 deletions(-) diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs index c7fb796b3d..31d7d23f26 100644 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ b/src/SixLabors.Core/Helpers/DebugGuard.cs @@ -13,7 +13,7 @@ namespace SixLabors [DebuggerStepThrough] internal static class DebugGuard { - /// + /// /// Ensures that the value is not null. /// /// The target object, which cannot be null. @@ -225,6 +225,26 @@ public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, } } + /// + /// Verifies, that the `source` span has the length of 'minLength', or longer. + /// + /// The element type of the spans. + /// The target span. + /// The minimum length. + /// The name of the parameter that is to be checked. + /// + /// has less than items. + /// + [Conditional("DEBUG")] + [DebuggerStepThrough] + public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) + { + if (source.Length < minLength) + { + ThrowArgumentException($"The size must be at least {minLength}.", parameterName); + } + } + /// /// Verifies that the 'destination' span is not shorter than 'source'. /// @@ -267,26 +287,6 @@ public static void DestinationShouldNotBeTooShort( } } - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowArgumentException(string message, string parameterName) { diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 9b14fc8ca0..3db5642d11 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -14,6 +14,10 @@ namespace SixLabors.Helpers.Tests { public class DebugGuardTests { + private class Foo + { + } + [Fact] public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() { @@ -28,18 +32,113 @@ public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() } [Fact] - public void NotNull_TargetNotNull_ThrowsNoException() + public void NotNull_WhenNull_Throws() { - DebugGuard.NotNull("test", "myParamName"); + Foo foo = null; + Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); } [Fact] - public void NotNull_TargetNull_ThrowsException() + public void NotNull_WhenNotNull() + { + Foo foo = new Foo(); + Guard.NotNull(foo, nameof(foo)); + } + + [Theory] + [InlineData(null, true)] + [InlineData("", true)] + [InlineData(" ", true)] + [InlineData("$", false)] + [InlineData("lol", false)] + public void NotNullOrWhiteSpace(string str, bool shouldThrow) { - Assert.Throws(() => + if (shouldThrow) { - DebugGuard.NotNull((object)null, "myParamName"); - }); + Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); + } + else + { + Guard.NotNullOrWhiteSpace(str, nameof(str)); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsTrue(bool value) + { + if (!value) + { + Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); + } + else + { + Guard.IsTrue(value, nameof(value), "Boo."); + } + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public void IsFalse(bool value) + { + if (value) + { + Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); + } + else + { + Guard.IsFalse(value, nameof(value), "Boo."); + } + } + + public static readonly TheoryData SizeCheckData = new TheoryData + { + { 0, 0, false }, + { 1, 1, false }, + { 1, 0, false }, + { 13, 13, false }, + { 20, 13, false }, + { 12, 13, true }, + { 0, 1, true }, + }; + + [Theory] + [MemberData(nameof(SizeCheckData))] + public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) + { + int[] data = new int[length]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); + Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); + } + else + { + Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); + Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); + } + } + + [Theory] + [MemberData(nameof(SizeCheckData))] + public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) + { + int[] dest = new int[destLength]; + int[] source = new int[sourceLength]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); + } + else + { + Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); + Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); + } } [Fact] @@ -59,7 +158,7 @@ public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than {max}.", exception.Message); + Assert.Contains($"Value {value} must be less than {max}.", exception.Message); } [Theory] @@ -79,7 +178,7 @@ public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be less than or equal to 1.", exception.Message); + Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); } [Fact] @@ -99,7 +198,7 @@ public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than {min}.", exception.Message); + Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); } [Theory] @@ -119,7 +218,7 @@ public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() }); Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value must be greater than or equal to 2.", exception.Message); + Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); } [Theory] diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index bed743767a..a35668c38c 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -20,7 +20,7 @@ public void NotNull_WhenNull_Throws() } [Fact] - public void NotNull_NotNull() + public void NotNull_WhenNotNull() { Foo foo = new Foo(); Guard.NotNull(foo, nameof(foo)); @@ -74,14 +74,19 @@ public void IsFalse(bool value) } } + public static readonly TheoryData SizeCheckData = new TheoryData + { + { 0, 0, false }, + { 1, 1, false }, + { 1, 0, false }, + { 13, 13, false }, + { 20, 13, false }, + { 12, 13, true }, + { 0, 1, true }, + }; + [Theory] - [InlineData(0, 0, false)] - [InlineData(1, 1, false)] - [InlineData(1, 0, false)] - [InlineData(13, 13, false)] - [InlineData(20, 13, false)] - [InlineData(12, 13, true)] - [InlineData(0, 1, true)] + [MemberData(nameof(SizeCheckData))] public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) { int[] data = new int[length]; @@ -98,6 +103,25 @@ public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) } } + [Theory] + [MemberData(nameof(SizeCheckData))] + public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) + { + int[] dest = new int[destLength]; + int[] source = new int[sourceLength]; + + if (shouldThrow) + { + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); + Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); + } + else + { + Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); + Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); + } + } + [Fact] public void MustBeLessThan_IsLess_ThrowsNoException() { From e4beee618d8a561ecee9f2bd85717d1f7192522a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:32:46 +0200 Subject: [PATCH 116/136] [SL.Core] import standards submodule --- .gitmodules | 3 +++ standards | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 standards diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..b82e14d8db --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "standards"] + path = standards + url = https://github.com/SixLabors/Standards.git diff --git a/standards b/standards new file mode 160000 index 0000000000..8b085c0ec4 --- /dev/null +++ b/standards @@ -0,0 +1 @@ +Subproject commit 8b085c0ec4fb64797b9965741f7138f8f66a6b44 From b169e9252f4220b1722eeb9b53371ea7de9db7cd Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:34:04 +0200 Subject: [PATCH 117/136] [SL.Core] temporarily redirect "standards" to af/shared-guard branch --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 8b085c0ec4..4e6ebb923f 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 8b085c0ec4fb64797b9965741f7138f8f66a6b44 +Subproject commit 4e6ebb923f20a5280ada67aad1fa7478f45c44cc From eb40549006149c0f4be019d0131ec82ffab66b28 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 17:41:28 +0200 Subject: [PATCH 118/136] [SL.Core] use shared guards from standards --- src/SixLabors.Core/Helpers/DebugGuard.cs | 308 ---------------------- src/SixLabors.Core/Helpers/Guard.cs | 309 ----------------------- src/SixLabors.Core/SixLabors.Core.csproj | 10 +- standards | 2 +- 4 files changed, 10 insertions(+), 619 deletions(-) delete mode 100644 src/SixLabors.Core/Helpers/DebugGuard.cs delete mode 100644 src/SixLabors.Core/Helpers/Guard.cs diff --git a/src/SixLabors.Core/Helpers/DebugGuard.cs b/src/SixLabors.Core/Helpers/DebugGuard.cs deleted file mode 100644 index 31d7d23f26..0000000000 --- a/src/SixLabors.Core/Helpers/DebugGuard.cs +++ /dev/null @@ -1,308 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace SixLabors -{ - /// - /// Provides methods to protect against invalid parameters for a DEBUG build. - /// - [DebuggerStepThrough] - internal static class DebugGuard - { - /// - /// Ensures that the value is not null. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// is null. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void NotNull(TValue value, string parameterName) - where TValue : class - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - } - - /// - /// Ensures that the target value is not null, empty, or whitespace. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void NotNullOrWhiteSpace(string value, string parameterName) - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - - if (string.IsNullOrWhiteSpace(value)) - { - ThrowArgumentException("Must not be empty or whitespace.", parameterName); - } - } - - /// - /// Ensures that the specified value is less than a maximum value. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) >= 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); - } - } - - /// - /// Verifies that the specified value is less than or equal to a maximum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); - } - } - - /// - /// Verifies that the specified value is greater than a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) <= 0) - { - ThrowArgumentOutOfRangeException( - parameterName, - $"Value {value} must be greater than {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value and less than - /// or equal to a maximum value and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value of greater than the maximum value. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); - } - } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be false. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is false. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The source span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"The size must be at least {minLength}.", parameterName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - ReadOnlySpan source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [Conditional("DEBUG")] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - Span source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentException(string message, string parameterName) - { - throw new ArgumentException(message, parameterName); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentOutOfRangeException(string parameterName, string message) - { - throw new ArgumentOutOfRangeException(parameterName, message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentNullException(string parameterName) - { - throw new ArgumentNullException(parameterName); - } - } -} \ No newline at end of file diff --git a/src/SixLabors.Core/Helpers/Guard.cs b/src/SixLabors.Core/Helpers/Guard.cs deleted file mode 100644 index 09c8675d3a..0000000000 --- a/src/SixLabors.Core/Helpers/Guard.cs +++ /dev/null @@ -1,309 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace SixLabors -{ - /// - /// Provides methods to protect against invalid parameters. - /// - [DebuggerStepThrough] - internal static class Guard - { - /// - /// Ensures that the value is not null. - /// - /// The target object, which cannot be null. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// is null. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void NotNull(TValue value, string parameterName) - where TValue : class - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - } - - /// - /// Ensures that the target value is not null, empty, or whitespace. - /// - /// The target string, which should be checked against being null or empty. - /// Name of the parameter. - /// is null. - /// is empty or contains only blanks. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void NotNullOrWhiteSpace(string value, string parameterName) - { - if (value is null) - { - ThrowArgumentNullException(parameterName); - } - - if (string.IsNullOrWhiteSpace(value)) - { - ThrowArgumentException("Must not be empty or whitespace.", parameterName); - } - } - - /// - /// Ensures that the specified value is less than a maximum value. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeLessThan(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) >= 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than {max}."); - } - } - - /// - /// Verifies that the specified value is less than or equal to a maximum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeLessThanOrEqualTo(TValue value, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be less than or equal to {max}."); - } - } - - /// - /// Verifies that the specified value is greater than a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeGreaterThan(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) <= 0) - { - ThrowArgumentOutOfRangeException( - parameterName, - $"Value {value} must be greater than {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value - /// and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeGreaterThanOrEqualTo(TValue value, TValue min, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min}."); - } - } - - /// - /// Verifies that the specified value is greater than or equal to a minimum value and less than - /// or equal to a maximum value and throws an exception if it is not. - /// - /// The target value, which should be validated. - /// The minimum value. - /// The maximum value. - /// The name of the parameter that is to be checked. - /// The type of the value. - /// - /// is less than the minimum value of greater than the maximum value. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeBetweenOrEqualTo(TValue value, TValue min, TValue max, string parameterName) - where TValue : IComparable - { - if (value.CompareTo(min) < 0 || value.CompareTo(max) > 0) - { - ThrowArgumentOutOfRangeException(parameterName, $"Value {value} must be greater than or equal to {min} and less than or equal to {max}."); - } - } - - /// - /// Verifies, that the method parameter with specified target value is true - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be false. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is false. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void IsTrue(bool target, string parameterName, string message) - { - if (!target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the method parameter with specified target value is false - /// and throws an exception if it is found to be so. - /// - /// The target value, which cannot be true. - /// The name of the parameter that is to be checked. - /// The error message, if any to add to the exception. - /// - /// is true. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void IsFalse(bool target, string parameterName, string message) - { - if (target) - { - ThrowArgumentException(message, parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The source span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(ReadOnlySpan source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"Span-s must be at least of length {minLength}!", parameterName); - } - } - - /// - /// Verifies, that the `source` span has the length of 'minLength', or longer. - /// - /// The element type of the spans. - /// The target span. - /// The minimum length. - /// The name of the parameter that is to be checked. - /// - /// has less than items. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void MustBeSizedAtLeast(Span source, int minLength, string parameterName) - { - if (source.Length < minLength) - { - ThrowArgumentException($"The size must be at least {minLength}.", parameterName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - ReadOnlySpan source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - /// - /// Verifies that the 'destination' span is not shorter than 'source'. - /// - /// The source element type. - /// The destination element type. - /// The source span. - /// The destination span. - /// The name of the argument for 'destination'. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - [DebuggerStepThrough] - public static void DestinationShouldNotBeTooShort( - Span source, - Span destination, - string destinationParamName) - { - if (destination.Length < source.Length) - { - ThrowArgumentException($"Destination span is too short!", destinationParamName); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentException(string message, string parameterName) - { - throw new ArgumentException(message, parameterName); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentOutOfRangeException(string parameterName, string message) - { - throw new ArgumentOutOfRangeException(parameterName, message); - } - - [MethodImpl(MethodImplOptions.NoInlining)] - private static void ThrowArgumentNullException(string parameterName) - { - throw new ArgumentNullException(parameterName); - } - } -} diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 0c6c537f44..61b8fa4b65 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -34,7 +34,11 @@ $(DefineConstants);SUPPORTS_HASHCODE - + + + + + All @@ -55,4 +59,8 @@ + + + + diff --git a/standards b/standards index 4e6ebb923f..948a02984c 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 4e6ebb923f20a5280ada67aad1fa7478f45c44cc +Subproject commit 948a02984c6b62dca1c40b02b289f6d1c13d79b1 From 56277c4735ac19dab2db03cdfe40a415cd582616 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 18:08:43 +0200 Subject: [PATCH 119/136] [SL.Core] do not share internals across SixLabors projects --- src/SixLabors.Core/Properties/AssemblyInfo.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs index 92c683b139..241c0fe99c 100644 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ b/src/SixLabors.Core/Properties/AssemblyInfo.cs @@ -4,12 +4,4 @@ using System.Runtime.CompilerServices; // Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] - -// Ensure the internals are visible to the other projects. -[assembly: InternalsVisibleTo("SixLabors.Exif")] -[assembly: InternalsVisibleTo("SixLabors.Fonts")] -[assembly: InternalsVisibleTo("SixLabors.ImageSharp")] -[assembly: InternalsVisibleTo("SixLabors.ImageSharp.Drawing")] -[assembly: InternalsVisibleTo("SixLabors.Shapes")] -[assembly: InternalsVisibleTo("SixLabors.Shapes.Text")] \ No newline at end of file +[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] \ No newline at end of file From 4de4e5bfebed9a884fccd05877503a1891ac0533 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 18:23:27 +0200 Subject: [PATCH 120/136] [SL.Core] hope we can drop travis soon --- appveyor.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/appveyor.yml b/appveyor.yml index 016a9ee379..3c301a1964 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,6 +3,7 @@ image: Visual Studio 2017 before_build: + - git submodule -q update --init - cmd: dotnet --version build_script: From bfbda9863306a98c9dea8dd5c94e9d0334b79d76 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 20:34:17 +0200 Subject: [PATCH 121/136] [SL.Core] update submodule --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 948a02984c..30e6fe889d 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 948a02984c6b62dca1c40b02b289f6d1c13d79b1 +Subproject commit 30e6fe889dd8005634496c4d8aac85ab01f62c1d From c97def9117284aea55f635616a2aea745fc866a0 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 18 Aug 2019 20:42:35 +0200 Subject: [PATCH 122/136] [SL.Core] update submodule --- standards | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/standards b/standards index 30e6fe889d..10fa2a5d9f 160000 --- a/standards +++ b/standards @@ -1 +1 @@ -Subproject commit 30e6fe889dd8005634496c4d8aac85ab01f62c1d +Subproject commit 10fa2a5d9f3e16ff01faa857b6eaf7833a7163ca From 29046532a299ac497f875e8987b43a0e649ae050 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 29 Aug 2019 22:52:42 +0200 Subject: [PATCH 123/136] [SL.Core] Standards -> SharedInfrastructure --- .gitmodules | 6 +++--- standards => shared-infrastructure | 0 src/SixLabors.Core/SixLabors.Core.csproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename standards => shared-infrastructure (100%) diff --git a/.gitmodules b/.gitmodules index b82e14d8db..f560cd5905 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "standards"] - path = standards - url = https://github.com/SixLabors/Standards.git +[submodule "shared-infrastructure"] + path = shared-infrastructure + url = https://github.com/SixLabors/SharedInfrastructure.git diff --git a/standards b/shared-infrastructure similarity index 100% rename from standards rename to shared-infrastructure diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 61b8fa4b65..eafe9824ed 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -36,7 +36,7 @@ - + From 278a79e5009149f72e03e13d9b025395e6d810f7 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 29 Aug 2019 23:37:46 +0200 Subject: [PATCH 124/136] [SL.Core] use shared .editorconfig and stylecop.json --- .editorconfig | 3 --- SixLabors.Core.sln | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 14 +++++++++----- stylecop.json | 15 --------------- .../SixLabors.Core.Tests.csproj | 3 +-- 5 files changed, 11 insertions(+), 26 deletions(-) delete mode 100644 .editorconfig delete mode 100644 stylecop.json diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index f39b267256..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,3 +0,0 @@ -[*.cs] -indent_style = space -indent_size = 4 diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln index 040ce0688f..a796a9ebac 100644 --- a/SixLabors.Core.sln +++ b/SixLabors.Core.sln @@ -5,7 +5,6 @@ VisualStudioVersion = 16.0.28803.352 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig appveyor.yml = appveyor.yml .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md @@ -16,6 +15,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionIt gitversion.yml = gitversion.yml .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md README.md = README.md + shared-infrastructure\.editorconfig = shared-infrastructure\.editorconfig EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index eafe9824ed..2fb64cdf37 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -37,15 +37,19 @@ + - + + ..\..\shared-infrastructure\SixLabors.ruleset + + - All - - - + All + + + diff --git a/stylecop.json b/stylecop.json deleted file mode 100644 index c67c0db325..0000000000 --- a/stylecop.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json", - "settings": - { - "orderingRules": - { - "usingDirectivesPlacement": "outsideNamespace" - }, - "documentationRules": - { - "xmlHeader": false, - "copyrightText": "Copyright (c) Six Labors and contributors.\nLicensed under the Apache License, Version 2.0." - } - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index 55951fb43f..f33dde1c6f 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -23,8 +23,7 @@ - - + From 68dca4fddbd4cd5661cb2c93c1588ad2f736253c Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 31 Aug 2019 14:00:48 +1000 Subject: [PATCH 125/136] [SL.Core] Update submodule and fix warnings. --- .editorconfig | 372 ++++++++++++++++++ .gitattributes | 108 +++++ shared-infrastructure | 2 +- src/SixLabors.Core/SixLabors.Core.csproj | 5 +- src/SixLabors.ruleset | 6 - .../Helpers/DebugGuardTests.cs | 40 +- .../Helpers/GuardTests.cs | 12 +- .../Memory/ArrayPoolMemoryAllocatorTests.cs | 16 +- .../Memory/SimpleGcMemoryAllocatorTests.cs | 4 +- .../Primitives/RectangleTests.cs | 20 +- .../SixLabors.Core.Tests.csproj | 2 +- 11 files changed, 528 insertions(+), 59 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitattributes delete mode 100644 src/SixLabors.ruleset diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..b0d0662bf8 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,372 @@ +############################################################################### +# EditorConfig is awesome: http://EditorConfig.org +############################################################################### + +############################################################################### +# Top-most EditorConfig file +############################################################################### +root = true + +############################################################################### +# Set default behavior to: +# a UTF-8 encoding, +# Unix-style line endings, +# a newline ending the file, +# 4 space indentation, and +# trimming of trailing whitespace +############################################################################### +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +############################################################################### +# Set file behavior to: +# 2 space indentation +############################################################################### +[*.{cmd,config,csproj,json,props,ps1,resx,sh,targets}] +indent_size = 2 + +############################################################################### +# Set file behavior to: +# Windows-style line endings, and +# tabular indentation +############################################################################### +[*.sln] +end_of_line = crlf +indent_style = tab + +############################################################################### +# Set dotnet naming rules to: +# suggest async members be pascal case suffixed with Async +# suggest const declarations be pascal case +# suggest interfaces be pascal case prefixed with I +# suggest parameters be camel case +# suggest private and internal static fields be camel case +# suggest private and internal fields be camel case +# suggest public and protected declarations be pascal case +# suggest static readonly declarations be pascal case +# suggest type parameters be prefixed with T +############################################################################### +[*.cs] +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async +dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members + +dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations + +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i +dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces + +dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion +dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case +dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters + +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.style = camel_case +dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.symbols = private_and_internal_static_fields + +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.severity = suggestion +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.style = camel_case +dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.symbols = private_and_internal_fields + +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations +dotnet_naming_symbols.public_and_protected_declarations.applicable_kinds = method, field, event, property + +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case +dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations + +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t +dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters + +############################################################################### +# Set dotnet naming styles to define: +# camel case +# pascal case +# pascal case suffixed with Async +# pascal case prefixed with I +# pascal case prefixed with T +############################################################################### +[*.cs] +dotnet_naming_style.camel_case.capitalization = camel_case + +dotnet_naming_style.pascal_case.capitalization = pascal_case + +dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case +dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async + +dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case +dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I + +dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case +dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T + +############################################################################### +# Set dotnet naming symbols to: +# async members +# const declarations +# interfaces +# private and internal fields +# private and internal static fields +# public and protected declarations +# static readonly declarations +# type parameters +############################################################################### +[*.cs] +dotnet_naming_symbols.async_members.required_modifiers = async + +dotnet_naming_symbols.const_declarations.required_modifiers = const + +dotnet_naming_symbols.interfaces.applicable_kinds = interface + +dotnet_naming_symbols.parameters.applicable_kinds = parameter + +dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field + +dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal +dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field +dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static + +dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected + +dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly + +dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter + +############################################################################### +# Set dotnet sort options to: +# do not separate import directives into groups, and +# sort system directives first +############################################################################### +[*.cs] +dotnet_separate_import_directive_groups = false +dotnet_sort_system_directives_first = true + +############################################################################### +# Set dotnet style options to: +# suggest null-coalescing expressions, +# suggest collection-initializers, +# suggest explicit tuple names, +# suggest null-propogation +# suggest object-initializers, +# generate parentheses in arithmetic binary operators for clarity, +# generate parentheses in other binary operators for clarity, +# don't generate parentheses in other operators if unnecessary, +# generate parentheses in relational binary operators for clarity, +# warn when not using predefined-types for locals, parameters, and members, +# generate predefined-types of type names for member access, +# generate auto properties, +# suggest compound assignment, +# generate conditional expression over assignment, +# generate conditional expression over return, +# suggest inferred anonymous types, +# suggest inferred tuple names, +# suggest 'is null' checks over '== null', +# don't generate 'this.' and 'Me.' for events, +# warn when not using 'this.' and 'Me.' for fields, +# warn when not using 'this.' and 'Me.' for methods, +# warn when not using 'this.' and 'Me.' for properties, +# suggest readonly fields, and +# generate accessibility modifiers for non interface members +############################################################################### +[*.cs] +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_object_initializer = true:suggestion + +dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent +dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent +dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent + +dotnet_style_predefined_type_for_locals_parameters_members = true:warning +dotnet_style_predefined_type_for_member_access = true:silent + +dotnet_style_prefer_auto_properties = true:silent +dotnet_style_prefer_compound_assignment = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:silent +dotnet_style_prefer_conditional_expression_over_return = true:silent +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion + +dotnet_style_qualification_for_event = false:silent +dotnet_style_qualification_for_field = true:warning +dotnet_style_qualification_for_method = true:warning +dotnet_style_qualification_for_property = true:warning + +dotnet_style_readonly_field = true:suggestion +dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent + +############################################################################### +# Set dotnet style options to: +# suggest removing all unused parameters +############################################################################### +[*.cs] +dotnet_code_quality_unused_parameters = all:suggestion + +############################################################################### +# Set csharp indent options to: +# indent block contents, +# not indent braces, +# indent case contents, +# not indent case contents when block, +# indent labels one less than the current, and +# indent switch labels +############################################################################### +[*.cs] +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = false +csharp_indent_labels = one_less_than_current +csharp_indent_switch_labels = true + +############################################################################### +# Set csharp new-line options to: +# insert a new-line before "catch", +# insert a new-line before "else", +# insert a new-line before "finally", +# insert a new-line before members in anonymous-types, +# insert a new-line before members in object-initializers, and +# insert a new-line before all open braces +############################################################################### +[*.cs] +csharp_new_line_before_catch = true +csharp_new_line_before_else = true +csharp_new_line_before_finally = true + +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_before_members_in_object_initializers = true + +csharp_new_line_before_open_brace = all + +############################################################################### +# Set csharp preserve options to: +# preserve single-line blocks, and +# preserve single-line statements +############################################################################### +[*.cs] +csharp_preserve_single_line_blocks = true +csharp_preserve_single_line_statements = true + +############################################################################### +# Set csharp space options to: +# remove any space after a cast, +# add a space after the colon in an inheritance clause, +# add a space after a comma, +# remove any space after a dot, +# add a space after keywords in control flow statements, +# add a space after a semicolon in a "for" statement, +# add a space before and after binary operators, +# remove space around declaration statements, +# add a space before the colon in an inheritance clause, +# remove any space before a comma, +# remove any space before a dot, +# remove any space before an open square-bracket, +# remove any space before a semicolon in a "for" statement, +# remove any space between empty square-brackets, +# remove any space between a method call's empty parameter list parenthesis, +# remove any space between a method call's name and its opening parenthesis, +# remove any space between a method call's parameter list parenthesis, +# remove any space between a method declaration's empty parameter list parenthesis, +# remove any space between a method declaration's name and its openening parenthesis, +# remove any space between a method declaration's parameter list parenthesis, +# remove any space between parentheses, and +# remove any space between square brackets +############################################################################### +[*.cs] +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true + +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore + +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false + +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +############################################################################### +# Set csharp style options to: +# generate braces, +# suggest simple default expressions, +# generate a preferred modifier order, +# suggest conditional delegate calls, +# suggest deconstructed variable declarations, +# generate expression-bodied accessors, +# generate expression-bodied constructors, +# generate expression-bodied indexers, +# generate expression-bodied lambdas, +# generate expression-bodied methods, +# generate expression-bodied operators, +# generate expression-bodied properties, +# suggest inlined variable declarations, +# suggest local over anonymous functions, +# suggest pattern-matching over "as" with "null" check, +# suggest pattern-matching over "is" with "cast" check, +# suggest throw expressions, +# generate a discard variable for unused value expression statements, +# suggest a discard variable for unused assignments, +# warn when using var for built-in types, +# warn when using var when the type is not apparent, and +# warn when not using var when the type is apparent +############################################################################### +[*.cs] +csharp_prefer_braces = true:silent +csharp_prefer_simple_default_expression = true:suggestion +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent + +csharp_style_conditional_delegate_call = true:suggestion +csharp_style_deconstructed_variable_declaration = true:suggestion + +csharp_style_expression_bodied_accessors = true:silent +csharp_style_expression_bodied_constructors = true:silent +csharp_style_expression_bodied_indexers = true:silent +csharp_style_expression_bodied_lambdas = true:silent +csharp_style_expression_bodied_methods = true:silent +csharp_style_expression_bodied_operators = true:silent +csharp_style_expression_bodied_properties = true:silent + +csharp_style_inlined_variable_declaration = true:suggestion + +csharp_style_pattern_local_over_anonymous_function = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion + +csharp_style_throw_expression = true:suggestion + +csharp_style_unused_value_expression_statement_preference = discard_variable:silent +csharp_style_unused_value_assignment_preference = discard_variable:suggestion + +csharp_style_var_for_built_in_types = false:warning +csharp_style_var_elsewhere = false:warning +csharp_style_var_when_type_is_apparent = true:warning diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..537d9cef11 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,108 @@ +############################################################################### +# Set default behavior to: +# treat as text and +# normalize to Unix-style line endings +############################################################################### +* text eol=lf + +############################################################################### +# Set explicit file behavior to: +# treat as text and +# normalize to Unix-style line endings +############################################################################### +*.asm text eol=lf +*.c text eol=lf +*.clj text eol=lf +*.cmd text eol=lf +*.cpp text eol=lf +*.css text eol=lf +*.cxx text eol=lf +*.config text eol=lf +*.DotSettings text eol=lf +*.erl text eol=lf +*.fs text eol=lf +*.fsx text eol=lf +*.h text eol=lf +*.htm text eol=lf +*.html text eol=lf +*.hs text eol=lf +*.hxx text eol=lf +*.java text eol=lf +*.js text eol=lf +*.json text eol=lf +*.less text eol=lf +*.lisp text eol=lf +*.lua text eol=lf +*.m text eol=lf +*.md text eol=lf +*.php text eol=lf +*.props text eol=lf +*.ps1 text eol=lf +*.py text eol=lf +*.rb text eol=lf +*.resx text eol=lf +*.runsettings text eol=lf +*.ruleset text eol=lf +*.sass text eol=lf +*.scss text eol=lf +*.sh text eol=lf +*.sql text eol=lf +*.svg text eol=lf +*.targets text eol=lf +*.tt text eol=crlf +*.ttinclude text eol=crlf +*.txt text eol=lf +*.vb text eol=lf +*.yml text eol=lf + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Unix-style line endings and +# diff as csharp +############################################################################### +*.cs text eol=lf diff=csharp + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Unix-style line endings and +# use a union merge when resoling conflicts +############################################################################### +*.csproj text eol=lf merge=union +*.dbproj text eol=lf merge=union +*.fsproj text eol=lf merge=union +*.ncrunchproject text eol=lf merge=union +*.vbproj text eol=lf merge=union + +############################################################################### +# Set explicit file behavior to: +# treat as text +# normalize to Windows-style line endings and +# use a union merge when resoling conflicts +############################################################################### +*.sln text eol=crlf merge=union + +############################################################################### +# Set explicit file behavior to: +# treat as binary +############################################################################### +*.bmp binary +*.dll binary +*.exe binary +*.gif binary +*.jpg binary +*.png binary +*.ttf binary +*.snk binary + +############################################################################### +# Set explicit file behavior to: +# diff as plain text +############################################################################### +*.doc diff=astextplain +*.docx diff=astextplain +*.dot diff=astextplain +*.pdf diff=astextplain +*.pptx diff=astextplain +*.rtf diff=astextplain diff --git a/shared-infrastructure b/shared-infrastructure index 10fa2a5d9f..9b5a5b70b4 160000 --- a/shared-infrastructure +++ b/shared-infrastructure @@ -1 +1 @@ -Subproject commit 10fa2a5d9f3e16ff01faa857b6eaf7833a7163ca +Subproject commit 9b5a5b70b46bc23b9d8d8645cd691d5bc5a2d84f diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj index 2fb64cdf37..4611693b70 100644 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ b/src/SixLabors.Core/SixLabors.Core.csproj @@ -23,7 +23,7 @@ - ..\SixLabors.ruleset + ..\..\shared-infrastructure\SixLabors.ruleset @@ -39,9 +39,6 @@ - - ..\..\shared-infrastructure\SixLabors.ruleset - diff --git a/src/SixLabors.ruleset b/src/SixLabors.ruleset deleted file mode 100644 index 4106b892cf..0000000000 --- a/src/SixLabors.ruleset +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs index 3db5642d11..0b0d33090f 100644 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs @@ -1,10 +1,11 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. // tell this file to enable debug conditional method calls, i.e. all the debug guard calls #define DEBUG using System; +using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; @@ -21,12 +22,12 @@ private class Foo [Fact] public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() { - var methods = typeof(DebugGuard).GetTypeInfo().GetMethods() + IEnumerable methods = typeof(DebugGuard).GetTypeInfo().GetMethods() .Where(x => x.IsStatic); - foreach (var m in methods) + foreach (MethodInfo m in methods) { - var attribs = m.GetCustomAttributes(); + IEnumerable attribs = m.GetCustomAttributes(); Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); } } @@ -41,7 +42,7 @@ public void NotNull_WhenNull_Throws() [Fact] public void NotNull_WhenNotNull() { - Foo foo = new Foo(); + var foo = new Foo(); Guard.NotNull(foo, nameof(foo)); } @@ -152,10 +153,8 @@ public void MustBeLessThan_IsLess_ThrowsNoException() [InlineData(1, 1)] public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeLessThan(value, max, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeLessThan(value, max, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value {value} must be less than {max}.", exception.Message); @@ -172,10 +171,7 @@ public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, i [Fact] public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws(() => DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); @@ -192,10 +188,8 @@ public void MustBeGreaterThan_IsGreater_ThrowsNoException() [InlineData(1, 1)] public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeGreaterThan(value, min, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeGreaterThan(value, min, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); @@ -212,10 +206,8 @@ public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int va [Fact] public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); - }); + ArgumentOutOfRangeException exception = Assert.Throws( + () => DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); @@ -232,10 +224,8 @@ public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(in [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { - var exception = Assert.Throws(() => - { - DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); - }); + ArgumentException exception = Assert.Throws( + () => DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName")); Assert.Equal("myParamName", exception.ParamName); Assert.Contains($"The size must be at least 3.", exception.Message); diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs index a35668c38c..4b5ebbdfde 100644 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs @@ -133,7 +133,7 @@ public void MustBeLessThan_IsLess_ThrowsNoException() [InlineData(1, 1)] public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeLessThan(value, max, "myParamName"); }); @@ -153,7 +153,7 @@ public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, i [Fact] public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); }); @@ -173,7 +173,7 @@ public void MustBeGreaterThan_IsGreater_ThrowsNoException() [InlineData(1, 1)] public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeGreaterThan(value, min, "myParamName"); }); @@ -193,7 +193,7 @@ public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int va [Fact] public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); }); @@ -216,7 +216,7 @@ public void MustBeBetweenOrEqualTo_IsBetweenOrEqual_ThrowsNoException(int value, [InlineData(4, 1, 3)] public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) { - var exception = Assert.Throws(() => + ArgumentOutOfRangeException exception = Assert.Throws(() => { Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); }); @@ -236,7 +236,7 @@ public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(in [Fact] public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() { - var exception = Assert.Throws(() => + ArgumentException exception = Assert.Throws(() => { Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); }); diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs index 6f72a076e6..1c1d721674 100644 --- a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs @@ -66,7 +66,7 @@ public void WhenPassedOnly_MaxPooledBufferSizeInBytes_SmallerThresholdValueIsAut [Fact] public void When_PoolSelectorThresholdInBytes_IsGreaterThan_MaxPooledBufferSizeInBytes_ExceptionIsThrown() { - Assert.ThrowsAny(() => { new ArrayPoolMemoryAllocator(100, 200); }); + Assert.ThrowsAny(() => new ArrayPoolMemoryAllocator(100, 200)); } } @@ -169,13 +169,13 @@ public void AllocationOverLargeArrayThreshold_UsesDifferentPool() return; } - int arrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); + const int ArrayLengthThreshold = PoolSelectorThresholdInBytes / sizeof(int); - IMemoryOwner small = this.MemoryAllocator.Allocate(arrayLengthThreshold - 1); + IMemoryOwner small = this.MemoryAllocator.Allocate(ArrayLengthThreshold - 1); ref int ptr2Small = ref small.GetReference(); small.Dispose(); - IMemoryOwner large = this.MemoryAllocator.Allocate(arrayLengthThreshold + 1); + IMemoryOwner large = this.MemoryAllocator.Allocate(ArrayLengthThreshold + 1); Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); } @@ -227,7 +227,7 @@ public void CreateWithModeratePooling() [StructLayout(LayoutKind.Sequential)] private struct Rgba32 { - private uint dummy; + private readonly uint dummy; } private const int SizeOfLargeStruct = MaxPooledBufferSizeInBytes / 5; @@ -242,7 +242,7 @@ private struct LargeStruct [InlineData((int.MaxValue / SizeOfLargeStruct) + 1)] public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } @@ -250,8 +250,8 @@ public void AllocateIncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(in [InlineData(-1)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); Assert.Equal("length", ex.ParamName); } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs index 7b431126db..a22e9e375d 100644 --- a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs +++ b/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs @@ -23,7 +23,7 @@ public BufferTests() [InlineData(-1)] public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.Allocate(length)); Assert.Equal("length", ex.ParamName); } @@ -31,7 +31,7 @@ public void Allocate_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(i [InlineData(-1)] public void AllocateManagedByteBuffer_IncorrectAmount_ThrowsCorrect_ArgumentOutOfRangeException(int length) { - var ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); + ArgumentOutOfRangeException ex = Assert.Throws(() => this.MemoryAllocator.AllocateManagedByteBuffer(length)); Assert.Equal("length", ex.ParamName); } diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs index 2f56b9ecd6..84b15d36e0 100644 --- a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs +++ b/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs @@ -173,11 +173,19 @@ public void RectangleFConversionTest(float x, float y, float width, float height unchecked { - rCeiling = new Rectangle((int)Math.Ceiling(x), (int)Math.Ceiling(y), - (int)Math.Ceiling(width), (int)Math.Ceiling(height)); + rCeiling = new Rectangle( + (int)Math.Ceiling(x), + (int)Math.Ceiling(y), + (int)Math.Ceiling(width), + (int)Math.Ceiling(height)); + rTruncate = new Rectangle((int)x, (int)y, (int)width, (int)height); - rRound = new Rectangle((int)Math.Round(x), (int)Math.Round(y), - (int)Math.Round(width), (int)Math.Round(height)); + + rRound = new Rectangle( + (int)Math.Round(x), + (int)Math.Round(y), + (int)Math.Round(width), + (int)Math.Round(height)); } Assert.Equal(rCeiling, Rectangle.Ceiling(rect)); @@ -315,7 +323,7 @@ public void ToStringTest() [InlineData(0, 0, 0, 0)] public void DeconstructTest(int x, int y, int width, int height) { - Rectangle r = new Rectangle(x, y, width, height); + var r = new Rectangle(x, y, width, height); (int dx, int dy, int dw, int dh) = r; @@ -325,4 +333,4 @@ public void DeconstructTest(int x, int y, int width, int height) Assert.Equal(height, dh); } } -} \ No newline at end of file +} diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj index f33dde1c6f..45eeef1b73 100644 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj @@ -19,7 +19,7 @@ - ..\SixLabors.ruleset + ..\..\shared-infrastructure\SixLabors.Tests.ruleset From 25daf98fa84894c6e9657ae952f9e47662bc0d38 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sun, 1 Sep 2019 19:27:45 +1000 Subject: [PATCH 126/136] [SL.Core] Use shared source MathF and HashCode --- shared-infrastructure | 2 +- src/SixLabors.Core/HashCode.cs | 448 --------------------------------- src/SixLabors.Core/MathF.cs | 231 ----------------- 3 files changed, 1 insertion(+), 680 deletions(-) delete mode 100644 src/SixLabors.Core/HashCode.cs delete mode 100644 src/SixLabors.Core/MathF.cs diff --git a/shared-infrastructure b/shared-infrastructure index 9b5a5b70b4..faf84e44ec 160000 --- a/shared-infrastructure +++ b/shared-infrastructure @@ -1 +1 @@ -Subproject commit 9b5a5b70b46bc23b9d8d8645cd691d5bc5a2d84f +Subproject commit faf84e44ec90e8a42a7271bcd04fea76279efb08 diff --git a/src/SixLabors.Core/HashCode.cs b/src/SixLabors.Core/HashCode.cs deleted file mode 100644 index b93d4a97f0..0000000000 --- a/src/SixLabors.Core/HashCode.cs +++ /dev/null @@ -1,448 +0,0 @@ -#pragma warning disable SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 - -// SOURCE: https://github.com/dotnet/corefx/blob/master/src/Common/src/CoreLib/System/HashCode.cs - -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -/* -The xxHash32 implementation is based on the code published by Yann Collet: -https://raw.githubusercontent.com/Cyan4973/xxHash/5c174cfa4e45a42f94082dc0d4539b39696afea1/xxhash.c - xxHash - Fast Hash algorithm - Copyright (C) 2012-2016, Yann Collet - - BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are - met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following disclaimer - in the documentation and/or other materials provided with the - distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - You can contact the author at : - - xxHash homepage: http://www.xxhash.com - - xxHash source repository : https://github.com/Cyan4973/xxHash -*/ - -#if SUPPORTS_HASHCODE -using System.Runtime.CompilerServices; - -[assembly: TypeForwardedTo(typeof(System.HashCode))] -#else -using System.Buffers.Binary; -using System.Collections.Generic; -using System.ComponentModel; -using System.Runtime.CompilerServices; -using System.Security.Cryptography; - -namespace System -{ - // xxHash32 is used for the hash code. - // https://github.com/Cyan4973/xxHash - internal struct HashCode - { -#pragma warning disable SA1311 // Static readonly fields should begin with upper-case letter - private static readonly uint s_seed = GenerateGlobalSeed(); -#pragma warning restore SA1311 // Static readonly fields should begin with upper-case letter - - private const uint Prime1 = 2654435761U; - private const uint Prime2 = 2246822519U; - private const uint Prime3 = 3266489917U; - private const uint Prime4 = 668265263U; - private const uint Prime5 = 374761393U; - - private uint _v1, _v2, _v3, _v4; - private uint _queue1, _queue2, _queue3; - private uint _length; - - private static uint GenerateGlobalSeed() - { - byte[] data = new byte[4]; - - using (var rng = RandomNumberGenerator.Create()) - { - rng.GetBytes(data); - } - - return BinaryPrimitives.ReadUInt32LittleEndian(data); - } - - public static int Combine(T1 value1) - { - // Provide a way of diffusing bits from something with a limited - // input hash space. For example, many enums only have a few - // possible hashes, only using the bottom few bits of the code. Some - // collections are built on the assumption that hashes are spread - // over a larger space, so diffusing the bits may help the - // collection work more efficiently. - - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 4; - - hash = QueueRound(hash, hc1); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 8; - - hash = QueueRound(hash, hc1); - hash = QueueRound(hash, hc2); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - - uint hash = MixEmptyState(); - hash += 12; - - hash = QueueRound(hash, hc1); - hash = QueueRound(hash, hc2); - hash = QueueRound(hash, hc3); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 16; - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 20; - - hash = QueueRound(hash, hc5); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 24; - - hash = QueueRound(hash, hc5); - hash = QueueRound(hash, hc6); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - var hc7 = (uint)(value7?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - uint hash = MixState(v1, v2, v3, v4); - hash += 28; - - hash = QueueRound(hash, hc5); - hash = QueueRound(hash, hc6); - hash = QueueRound(hash, hc7); - - hash = MixFinal(hash); - return (int)hash; - } - - public static int Combine(T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) - { - var hc1 = (uint)(value1?.GetHashCode() ?? 0); - var hc2 = (uint)(value2?.GetHashCode() ?? 0); - var hc3 = (uint)(value3?.GetHashCode() ?? 0); - var hc4 = (uint)(value4?.GetHashCode() ?? 0); - var hc5 = (uint)(value5?.GetHashCode() ?? 0); - var hc6 = (uint)(value6?.GetHashCode() ?? 0); - var hc7 = (uint)(value7?.GetHashCode() ?? 0); - var hc8 = (uint)(value8?.GetHashCode() ?? 0); - - Initialize(out uint v1, out uint v2, out uint v3, out uint v4); - - v1 = Round(v1, hc1); - v2 = Round(v2, hc2); - v3 = Round(v3, hc3); - v4 = Round(v4, hc4); - - v1 = Round(v1, hc5); - v2 = Round(v2, hc6); - v3 = Round(v3, hc7); - v4 = Round(v4, hc8); - - uint hash = MixState(v1, v2, v3, v4); - hash += 32; - - hash = MixFinal(hash); - return (int)hash; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint Rol(uint value, int count) - => (value << count) | (value >> (32 - count)); - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static void Initialize(out uint v1, out uint v2, out uint v3, out uint v4) - { - v1 = s_seed + Prime1 + Prime2; - v2 = s_seed + Prime2; - v3 = s_seed; - v4 = s_seed - Prime1; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint Round(uint hash, uint input) - { - hash += input * Prime2; - hash = Rol(hash, 13); - hash *= Prime1; - return hash; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint QueueRound(uint hash, uint queuedValue) - { - hash += queuedValue * Prime3; - return Rol(hash, 17) * Prime4; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint MixState(uint v1, uint v2, uint v3, uint v4) - { - return Rol(v1, 1) + Rol(v2, 7) + Rol(v3, 12) + Rol(v4, 18); - } - - private static uint MixEmptyState() - { - return s_seed + Prime5; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static uint MixFinal(uint hash) - { - hash ^= hash >> 15; - hash *= Prime2; - hash ^= hash >> 13; - hash *= Prime3; - hash ^= hash >> 16; - return hash; - } - - public void Add(T value) - { - Add(value?.GetHashCode() ?? 0); - } - - public void Add(T value, IEqualityComparer comparer) - { - Add(comparer != null ? comparer.GetHashCode(value) : (value?.GetHashCode() ?? 0)); - } - - private void Add(int value) - { - // The original xxHash works as follows: - // 0. Initialize immediately. We can't do this in a struct (no - // default ctor). - // 1. Accumulate blocks of length 16 (4 uints) into 4 accumulators. - // 2. Accumulate remaining blocks of length 4 (1 uint) into the - // hash. - // 3. Accumulate remaining blocks of length 1 into the hash. - - // There is no need for #3 as this type only accepts ints. _queue1, - // _queue2 and _queue3 are basically a buffer so that when - // ToHashCode is called we can execute #2 correctly. - - // We need to initialize the xxHash32 state (_v1 to _v4) lazily (see - // #0) nd the last place that can be done if you look at the - // original code is just before the first block of 16 bytes is mixed - // in. The xxHash32 state is never used for streams containing fewer - // than 16 bytes. - - // To see what's really going on here, have a look at the Combine - // methods. - - var val = (uint)value; - - // Storing the value of _length locally shaves of quite a few bytes - // in the resulting machine code. - uint previousLength = _length++; - uint position = previousLength % 4; - - // Switch can't be inlined. - - if (position == 0) - _queue1 = val; - else if (position == 1) - _queue2 = val; - else if (position == 2) - _queue3 = val; - else // position == 3 - { - if (previousLength == 3) - Initialize(out _v1, out _v2, out _v3, out _v4); - - _v1 = Round(_v1, _queue1); - _v2 = Round(_v2, _queue2); - _v3 = Round(_v3, _queue3); - _v4 = Round(_v4, val); - } - } - - public int ToHashCode() - { - // Storing the value of _length locally shaves of quite a few bytes - // in the resulting machine code. - uint length = _length; - - // position refers to the *next* queue position in this method, so - // position == 1 means that _queue1 is populated; _queue2 would have - // been populated on the next call to Add. - uint position = length % 4; - - // If the length is less than 4, _v1 to _v4 don't contain anything - // yet. xxHash32 treats this differently. - - uint hash = length < 4 ? MixEmptyState() : MixState(_v1, _v2, _v3, _v4); - - // _length is incremented once per Add(Int32) and is therefore 4 - // times too small (xxHash length is in bytes, not ints). - - hash += length * 4; - - // Mix what remains in the queue - - // Switch can't be inlined right now, so use as few branches as - // possible by manually excluding impossible scenarios (position > 1 - // is always false if position is not > 0). - if (position > 0) - { - hash = QueueRound(hash, _queue1); - if (position > 1) - { - hash = QueueRound(hash, _queue2); - if (position > 2) - hash = QueueRound(hash, _queue3); - } - } - - hash = MixFinal(hash); - return (int)hash; - } - -#pragma warning disable 0809 - - // Obsolete member 'memberA' overrides non-obsolete member 'memberB'. - // Disallowing GetHashCode and Equals is by design - - // * We decided to not override GetHashCode() to produce the hash code - // as this would be weird, both naming-wise as well as from a - // behavioral standpoint (GetHashCode() should return the object's - // hash code, not the one being computed). - - // * Even though ToHashCode() can be called safely multiple times on - // this implementation, it is not part of the contract. If the - // implementation has to change in the future we don't want to worry - // about people who might have incorrectly used this type. - - [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)] - [EditorBrowsable(EditorBrowsableState.Never)] - public override int GetHashCode() => throw new NotSupportedException("Equality not supported"); - - [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)] - [EditorBrowsable(EditorBrowsableState.Never)] - public override bool Equals(object obj) => throw new NotSupportedException("Equality not supported"); -#pragma warning restore 0809 - } -} -#endif - -#pragma warning restore SA1636, SA1600, SA1503, SA1202, SA1101, SA1132, SA1309, SA1520, SA1108, SA1203, SA1028, SA1512, SA1308 \ No newline at end of file diff --git a/src/SixLabors.Core/MathF.cs b/src/SixLabors.Core/MathF.cs deleted file mode 100644 index d4a493a4f8..0000000000 --- a/src/SixLabors.Core/MathF.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System.Runtime.CompilerServices; - -#if SUPPORTS_MATHF -[assembly: TypeForwardedTo(typeof(System.MathF))] -#else -namespace System -{ - /// - /// Provides single-precision floating point constants and static methods for trigonometric, logarithmic, and other common mathematical functions. - /// - /// MathF emulation on platforms that don't support it natively. - // ReSharper disable InconsistentNaming - internal static class MathF - { - /// - /// Represents the ratio of the circumference of a circle to its diameter, specified by the constant, π. - /// - public const float PI = (float)Math.PI; - - /// - /// Returns the absolute value of a single-precision floating-point number. - /// - /// - /// A number that is greater than or equal to , but less than or equal to . - /// - /// - /// A single-precision floating-point number, x, such that 0 ≤ x ≤. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Abs(float f) - { - return Math.Abs(f); - } - - /// - /// Returns the angle whose tangent is the quotient of two specified numbers. - /// - /// The y coordinate of a point. - /// The x coordinate of a point. - /// - /// An angle, θ, measured in radians, such that -π≤θ≤π, and tan(θ) = y / x, where - /// (x, y) is a point in the Cartesian plane. Observe the following: For (x, y) in - /// quadrant 1, 0 < θ < π/2.For (x, y) in quadrant 2, π/2 < θ≤π.For (x, y) in quadrant - /// 3, -π < θ < -π/2.For (x, y) in quadrant 4, -π/2 < θ < 0.For points on the boundaries - /// of the quadrants, the return value is the following:If y is 0 and x is not negative, - /// θ = 0.If y is 0 and x is negative, θ = π.If y is positive and x is 0, θ = π/2.If - /// y is negative and x is 0, θ = -π/2.If y is 0 and x is 0, θ = 0. If x or y is - /// , or if x and y are either or - /// , the method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Atan2(float y, float x) - { - return (float)Math.Atan2(y, x); - } - - /// - /// Returns the smallest integral value that is greater than or equal to the specified single-precision floating-point number. - /// - /// A single-precision floating-point number. - /// - /// The smallest integral value that is greater than or equal to . - /// If is equal to , , - /// or , that value is returned. - /// Note that this method returns a instead of an integral type. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Ceiling(float f) - { - return (float)Math.Ceiling(f); - } - - /// - /// Returns the cosine of the specified angle. - /// - /// An angle, measured in radians. - /// - /// The cosine of . If is equal to , , - /// or , this method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Cos(float f) - { - return (float)Math.Cos(f); - } - - /// - /// Returns e raised to the specified power. - /// - /// A number specifying a power. - /// - /// The number e raised to the power . - /// If equals or , that value is returned. - /// If equals , 0 is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Exp(float f) - { - return (float)Math.Exp(f); - } - - /// - /// Returns the largest integer less than or equal to the specified single-precision floating-point number. - /// - /// A single-precision floating-point number. - /// - /// The largest integer less than or equal to . - /// If is equal to , , - /// or , that value is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Floor(float f) - { - return (float)Math.Floor(f); - } - - /// - /// Returns the larger of two single-precision floating-point numbers. - /// - /// The first of two single-precision floating-point numbers to compare. - /// The second of two single-precision floating-point numbers to compare. - /// - /// Parameter or , whichever is larger. - /// If , or , or both and are - /// equal to , is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Max(float val1, float val2) - { - return Math.Max(val1, val2); - } - - /// - /// Returns the smaller of two single-precision floating-point numbers. - /// - /// The first of two single-precision floating-point numbers to compare. - /// The second of two single-precision floating-point numbers to compare. - /// - /// Parameter or , whichever is smaller. - /// If , , or both and are equal - /// to , is returned. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Min(float val1, float val2) - { - return Math.Min(val1, val2); - } - - /// - /// Returns a specified number raised to the specified power. - /// - /// A single-precision floating-point number to be raised to a power. - /// A single-precision floating-point number that specifies a power. - /// The number raised to the power . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Pow(float x, float y) - { - return (float)Math.Pow(x, y); - } - - /// - /// Rounds a single-precision floating-point value to the nearest integral value. - /// - /// A single-precision floating-point number to be rounded. - /// - /// The integer nearest . - /// If the fractional component of is halfway between two integers, one of which is even and the other odd, then the even number is returned. - /// Note that this method returns a instead of an integral type. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Round(float f) - { - return (float)Math.Round(f); - } - - /// - /// Rounds a single-precision floating-point value to the nearest integer. - /// A parameter specifies how to round the value if it is midway between two numbers. - /// - /// A single-precision floating-point number to be rounded. - /// Specification for how to round if it is midway between two other numbers. - /// - /// The integer nearest . If is halfway between two integers, one of which is even - /// and the other odd, then determines which of the two is returned. - /// Note that this method returns a instead of an integral type. - /// - /// - /// is not a valid value of . - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Round(float f, MidpointRounding mode) - { - return (float)Math.Round(f, mode); - } - - /// - /// Returns the sine of the specified angle. - /// - /// An angle, measured in radians. - /// - /// The sine of . - /// If is equal to , , - /// or , this method returns . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sin(float f) - { - return (float)Math.Sin(f); - } - - /// - /// Returns the square root of a specified number. - /// - /// The number whose square root is to be found. - /// - /// One of the values in the following table. - /// parameter Return value Zero or positive The positive square root of . - /// Negative Equals - /// Equals - /// . - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static float Sqrt(float f) - { - return (float)Math.Sqrt(f); - } - } -} -#endif \ No newline at end of file From 46ba50241f549909b2fa6a0e9dd3b14a688561d7 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Sun, 19 Jan 2020 23:48:17 +0100 Subject: [PATCH 127/136] Keep only necessary stuff from SL.Core --- .editorconfig | 372 ------------------ .gitattributes | 108 ----- .github/CONTRIBUTING.md | 35 -- .github/ISSUE_TEMPLATE/ask-question.md | 13 - .github/ISSUE_TEMPLATE/bug-report.md | 29 -- .github/ISSUE_TEMPLATE/feature-request.md | 13 - .github/PULL_REQUEST_TEMPLATE.md | 11 - .gitignore | 288 -------------- .gitmodules | 3 - LICENSE | 201 ---------- README.md | 19 - SixLabors.Core.sln | 63 --- SixLabors.Core.sln.DotSettings | 6 - appveyor.yml | 29 -- build.cmd | 17 - build.ps1 | 110 ------ codecov.yml | 22 -- gitversion.yml | 31 -- shared-infrastructure | 1 - src/SixLabors.Core/Properties/AssemblyInfo.cs | 7 - src/SixLabors.Core/SixLabors.Core.csproj | 67 ---- .../SixLabors.Core.csproj.DotSettings | 2 - tests/CodeCoverage/.gitignore | 1 - tests/CodeCoverage/CodeCoverage.cmd | 19 - tests/CodeCoverage/packages.config | 4 - .../SixLabors.Core.Tests.csproj | 44 --- tests/SixLabors.Core.Tests/TestEnvironment.cs | 12 - tests/SixLabors.ruleset | 12 - 28 files changed, 1539 deletions(-) delete mode 100644 .editorconfig delete mode 100644 .gitattributes delete mode 100644 .github/CONTRIBUTING.md delete mode 100644 .github/ISSUE_TEMPLATE/ask-question.md delete mode 100644 .github/ISSUE_TEMPLATE/bug-report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature-request.md delete mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .gitignore delete mode 100644 .gitmodules delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 SixLabors.Core.sln delete mode 100644 SixLabors.Core.sln.DotSettings delete mode 100644 appveyor.yml delete mode 100644 build.cmd delete mode 100644 build.ps1 delete mode 100644 codecov.yml delete mode 100644 gitversion.yml delete mode 160000 shared-infrastructure delete mode 100644 src/SixLabors.Core/Properties/AssemblyInfo.cs delete mode 100644 src/SixLabors.Core/SixLabors.Core.csproj delete mode 100644 src/SixLabors.Core/SixLabors.Core.csproj.DotSettings delete mode 100644 tests/CodeCoverage/.gitignore delete mode 100644 tests/CodeCoverage/CodeCoverage.cmd delete mode 100644 tests/CodeCoverage/packages.config delete mode 100644 tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj delete mode 100644 tests/SixLabors.Core.Tests/TestEnvironment.cs delete mode 100644 tests/SixLabors.ruleset diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index b0d0662bf8..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,372 +0,0 @@ -############################################################################### -# EditorConfig is awesome: http://EditorConfig.org -############################################################################### - -############################################################################### -# Top-most EditorConfig file -############################################################################### -root = true - -############################################################################### -# Set default behavior to: -# a UTF-8 encoding, -# Unix-style line endings, -# a newline ending the file, -# 4 space indentation, and -# trimming of trailing whitespace -############################################################################### -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 4 -trim_trailing_whitespace = true - -############################################################################### -# Set file behavior to: -# 2 space indentation -############################################################################### -[*.{cmd,config,csproj,json,props,ps1,resx,sh,targets}] -indent_size = 2 - -############################################################################### -# Set file behavior to: -# Windows-style line endings, and -# tabular indentation -############################################################################### -[*.sln] -end_of_line = crlf -indent_style = tab - -############################################################################### -# Set dotnet naming rules to: -# suggest async members be pascal case suffixed with Async -# suggest const declarations be pascal case -# suggest interfaces be pascal case prefixed with I -# suggest parameters be camel case -# suggest private and internal static fields be camel case -# suggest private and internal fields be camel case -# suggest public and protected declarations be pascal case -# suggest static readonly declarations be pascal case -# suggest type parameters be prefixed with T -############################################################################### -[*.cs] -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.severity = suggestion -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.style = pascal_case_suffixed_with_async -dotnet_naming_rule.async_members_should_be_pascal_case_suffixed_with_async.symbols = async_members - -dotnet_naming_rule.const_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.const_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.const_declarations_should_be_pascal_case.symbols = const_declarations - -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.severity = suggestion -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.style = pascal_case_prefixed_with_i -dotnet_naming_rule.interfaces_should_be_pascal_case_prefixed_with_i.symbols = interfaces - -dotnet_naming_rule.parameters_should_be_camel_case.severity = suggestion -dotnet_naming_rule.parameters_should_be_camel_case.style = camel_case -dotnet_naming_rule.parameters_should_be_camel_case.symbols = parameters - -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_static_fields_should_be_camel_case.symbols = private_and_internal_static_fields - -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.severity = suggestion -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.style = camel_case -dotnet_naming_rule.private_and_internal_fields_should_be_camel_case.symbols = private_and_internal_fields - -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.public_and_protected_declarations_should_be_pascal_case.symbols = public_and_protected_declarations -dotnet_naming_symbols.public_and_protected_declarations.applicable_kinds = method, field, event, property - -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.severity = suggestion -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.style = pascal_case -dotnet_naming_rule.static_readonly_declarations_should_be_pascal_case.symbols = static_readonly_declarations - -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.severity = suggestion -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.style = pascal_case_prefixed_with_t -dotnet_naming_rule.type_parameters_should_be_pascal_case_prefixed_with_t.symbols = type_parameters - -############################################################################### -# Set dotnet naming styles to define: -# camel case -# pascal case -# pascal case suffixed with Async -# pascal case prefixed with I -# pascal case prefixed with T -############################################################################### -[*.cs] -dotnet_naming_style.camel_case.capitalization = camel_case - -dotnet_naming_style.pascal_case.capitalization = pascal_case - -dotnet_naming_style.pascal_case_suffixed_with_async.capitalization = pascal_case -dotnet_naming_style.pascal_case_suffixed_with_async.required_suffix = Async - -dotnet_naming_style.pascal_case_prefixed_with_i.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_i.required_prefix = I - -dotnet_naming_style.pascal_case_prefixed_with_t.capitalization = pascal_case -dotnet_naming_style.pascal_case_prefixed_with_t.required_prefix = T - -############################################################################### -# Set dotnet naming symbols to: -# async members -# const declarations -# interfaces -# private and internal fields -# private and internal static fields -# public and protected declarations -# static readonly declarations -# type parameters -############################################################################### -[*.cs] -dotnet_naming_symbols.async_members.required_modifiers = async - -dotnet_naming_symbols.const_declarations.required_modifiers = const - -dotnet_naming_symbols.interfaces.applicable_kinds = interface - -dotnet_naming_symbols.parameters.applicable_kinds = parameter - -dotnet_naming_symbols.private_and_internal_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_fields.applicable_kinds = field - -dotnet_naming_symbols.private_and_internal_static_fields.applicable_accessibilities = private, internal -dotnet_naming_symbols.private_and_internal_static_fields.applicable_kinds = field -dotnet_naming_symbols.private_and_internal_static_fields.required_modifiers = static - -dotnet_naming_symbols.public_and_protected_declarations.applicable_accessibilities = public, protected - -dotnet_naming_symbols.static_readonly_declarations.required_modifiers = static, readonly - -dotnet_naming_symbols.type_parameters.applicable_kinds = type_parameter - -############################################################################### -# Set dotnet sort options to: -# do not separate import directives into groups, and -# sort system directives first -############################################################################### -[*.cs] -dotnet_separate_import_directive_groups = false -dotnet_sort_system_directives_first = true - -############################################################################### -# Set dotnet style options to: -# suggest null-coalescing expressions, -# suggest collection-initializers, -# suggest explicit tuple names, -# suggest null-propogation -# suggest object-initializers, -# generate parentheses in arithmetic binary operators for clarity, -# generate parentheses in other binary operators for clarity, -# don't generate parentheses in other operators if unnecessary, -# generate parentheses in relational binary operators for clarity, -# warn when not using predefined-types for locals, parameters, and members, -# generate predefined-types of type names for member access, -# generate auto properties, -# suggest compound assignment, -# generate conditional expression over assignment, -# generate conditional expression over return, -# suggest inferred anonymous types, -# suggest inferred tuple names, -# suggest 'is null' checks over '== null', -# don't generate 'this.' and 'Me.' for events, -# warn when not using 'this.' and 'Me.' for fields, -# warn when not using 'this.' and 'Me.' for methods, -# warn when not using 'this.' and 'Me.' for properties, -# suggest readonly fields, and -# generate accessibility modifiers for non interface members -############################################################################### -[*.cs] -dotnet_style_coalesce_expression = true:suggestion -dotnet_style_collection_initializer = true:suggestion -dotnet_style_explicit_tuple_names = true:suggestion -dotnet_style_null_propagation = true:suggestion -dotnet_style_object_initializer = true:suggestion - -dotnet_style_parentheses_in_arithmetic_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_binary_operators = always_for_clarity:silent -dotnet_style_parentheses_in_other_operators = never_if_unnecessary:silent -dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity:silent - -dotnet_style_predefined_type_for_locals_parameters_members = true:warning -dotnet_style_predefined_type_for_member_access = true:silent - -dotnet_style_prefer_auto_properties = true:silent -dotnet_style_prefer_compound_assignment = true:suggestion -dotnet_style_prefer_conditional_expression_over_assignment = true:silent -dotnet_style_prefer_conditional_expression_over_return = true:silent -dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion -dotnet_style_prefer_inferred_tuple_names = true:suggestion -dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion - -dotnet_style_qualification_for_event = false:silent -dotnet_style_qualification_for_field = true:warning -dotnet_style_qualification_for_method = true:warning -dotnet_style_qualification_for_property = true:warning - -dotnet_style_readonly_field = true:suggestion -dotnet_style_require_accessibility_modifiers = for_non_interface_members:silent - -############################################################################### -# Set dotnet style options to: -# suggest removing all unused parameters -############################################################################### -[*.cs] -dotnet_code_quality_unused_parameters = all:suggestion - -############################################################################### -# Set csharp indent options to: -# indent block contents, -# not indent braces, -# indent case contents, -# not indent case contents when block, -# indent labels one less than the current, and -# indent switch labels -############################################################################### -[*.cs] -csharp_indent_block_contents = true -csharp_indent_braces = false -csharp_indent_case_contents = true -csharp_indent_case_contents_when_block = false -csharp_indent_labels = one_less_than_current -csharp_indent_switch_labels = true - -############################################################################### -# Set csharp new-line options to: -# insert a new-line before "catch", -# insert a new-line before "else", -# insert a new-line before "finally", -# insert a new-line before members in anonymous-types, -# insert a new-line before members in object-initializers, and -# insert a new-line before all open braces -############################################################################### -[*.cs] -csharp_new_line_before_catch = true -csharp_new_line_before_else = true -csharp_new_line_before_finally = true - -csharp_new_line_before_members_in_anonymous_types = true -csharp_new_line_before_members_in_object_initializers = true - -csharp_new_line_before_open_brace = all - -############################################################################### -# Set csharp preserve options to: -# preserve single-line blocks, and -# preserve single-line statements -############################################################################### -[*.cs] -csharp_preserve_single_line_blocks = true -csharp_preserve_single_line_statements = true - -############################################################################### -# Set csharp space options to: -# remove any space after a cast, -# add a space after the colon in an inheritance clause, -# add a space after a comma, -# remove any space after a dot, -# add a space after keywords in control flow statements, -# add a space after a semicolon in a "for" statement, -# add a space before and after binary operators, -# remove space around declaration statements, -# add a space before the colon in an inheritance clause, -# remove any space before a comma, -# remove any space before a dot, -# remove any space before an open square-bracket, -# remove any space before a semicolon in a "for" statement, -# remove any space between empty square-brackets, -# remove any space between a method call's empty parameter list parenthesis, -# remove any space between a method call's name and its opening parenthesis, -# remove any space between a method call's parameter list parenthesis, -# remove any space between a method declaration's empty parameter list parenthesis, -# remove any space between a method declaration's name and its openening parenthesis, -# remove any space between a method declaration's parameter list parenthesis, -# remove any space between parentheses, and -# remove any space between square brackets -############################################################################### -[*.cs] -csharp_space_after_cast = false -csharp_space_after_colon_in_inheritance_clause = true -csharp_space_after_comma = true -csharp_space_after_dot = false -csharp_space_after_keywords_in_control_flow_statements = true -csharp_space_after_semicolon_in_for_statement = true - -csharp_space_around_binary_operators = before_and_after -csharp_space_around_declaration_statements = do_not_ignore - -csharp_space_before_colon_in_inheritance_clause = true -csharp_space_before_comma = false -csharp_space_before_dot = false -csharp_space_before_open_square_brackets = false -csharp_space_before_semicolon_in_for_statement = false - -csharp_space_between_empty_square_brackets = false -csharp_space_between_method_call_empty_parameter_list_parentheses = false -csharp_space_between_method_call_name_and_opening_parenthesis = false -csharp_space_between_method_call_parameter_list_parentheses = false -csharp_space_between_method_declaration_empty_parameter_list_parentheses = false -csharp_space_between_method_declaration_name_and_open_parenthesis = false -csharp_space_between_method_declaration_parameter_list_parentheses = false -csharp_space_between_parentheses = false -csharp_space_between_square_brackets = false - -############################################################################### -# Set csharp style options to: -# generate braces, -# suggest simple default expressions, -# generate a preferred modifier order, -# suggest conditional delegate calls, -# suggest deconstructed variable declarations, -# generate expression-bodied accessors, -# generate expression-bodied constructors, -# generate expression-bodied indexers, -# generate expression-bodied lambdas, -# generate expression-bodied methods, -# generate expression-bodied operators, -# generate expression-bodied properties, -# suggest inlined variable declarations, -# suggest local over anonymous functions, -# suggest pattern-matching over "as" with "null" check, -# suggest pattern-matching over "is" with "cast" check, -# suggest throw expressions, -# generate a discard variable for unused value expression statements, -# suggest a discard variable for unused assignments, -# warn when using var for built-in types, -# warn when using var when the type is not apparent, and -# warn when not using var when the type is apparent -############################################################################### -[*.cs] -csharp_prefer_braces = true:silent -csharp_prefer_simple_default_expression = true:suggestion -csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:silent - -csharp_style_conditional_delegate_call = true:suggestion -csharp_style_deconstructed_variable_declaration = true:suggestion - -csharp_style_expression_bodied_accessors = true:silent -csharp_style_expression_bodied_constructors = true:silent -csharp_style_expression_bodied_indexers = true:silent -csharp_style_expression_bodied_lambdas = true:silent -csharp_style_expression_bodied_methods = true:silent -csharp_style_expression_bodied_operators = true:silent -csharp_style_expression_bodied_properties = true:silent - -csharp_style_inlined_variable_declaration = true:suggestion - -csharp_style_pattern_local_over_anonymous_function = true:suggestion -csharp_style_pattern_matching_over_as_with_null_check = true:suggestion -csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion - -csharp_style_throw_expression = true:suggestion - -csharp_style_unused_value_expression_statement_preference = discard_variable:silent -csharp_style_unused_value_assignment_preference = discard_variable:suggestion - -csharp_style_var_for_built_in_types = false:warning -csharp_style_var_elsewhere = false:warning -csharp_style_var_when_type_is_apparent = true:warning diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 537d9cef11..0000000000 --- a/.gitattributes +++ /dev/null @@ -1,108 +0,0 @@ -############################################################################### -# Set default behavior to: -# treat as text and -# normalize to Unix-style line endings -############################################################################### -* text eol=lf - -############################################################################### -# Set explicit file behavior to: -# treat as text and -# normalize to Unix-style line endings -############################################################################### -*.asm text eol=lf -*.c text eol=lf -*.clj text eol=lf -*.cmd text eol=lf -*.cpp text eol=lf -*.css text eol=lf -*.cxx text eol=lf -*.config text eol=lf -*.DotSettings text eol=lf -*.erl text eol=lf -*.fs text eol=lf -*.fsx text eol=lf -*.h text eol=lf -*.htm text eol=lf -*.html text eol=lf -*.hs text eol=lf -*.hxx text eol=lf -*.java text eol=lf -*.js text eol=lf -*.json text eol=lf -*.less text eol=lf -*.lisp text eol=lf -*.lua text eol=lf -*.m text eol=lf -*.md text eol=lf -*.php text eol=lf -*.props text eol=lf -*.ps1 text eol=lf -*.py text eol=lf -*.rb text eol=lf -*.resx text eol=lf -*.runsettings text eol=lf -*.ruleset text eol=lf -*.sass text eol=lf -*.scss text eol=lf -*.sh text eol=lf -*.sql text eol=lf -*.svg text eol=lf -*.targets text eol=lf -*.tt text eol=crlf -*.ttinclude text eol=crlf -*.txt text eol=lf -*.vb text eol=lf -*.yml text eol=lf - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Unix-style line endings and -# diff as csharp -############################################################################### -*.cs text eol=lf diff=csharp - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Unix-style line endings and -# use a union merge when resoling conflicts -############################################################################### -*.csproj text eol=lf merge=union -*.dbproj text eol=lf merge=union -*.fsproj text eol=lf merge=union -*.ncrunchproject text eol=lf merge=union -*.vbproj text eol=lf merge=union - -############################################################################### -# Set explicit file behavior to: -# treat as text -# normalize to Windows-style line endings and -# use a union merge when resoling conflicts -############################################################################### -*.sln text eol=crlf merge=union - -############################################################################### -# Set explicit file behavior to: -# treat as binary -############################################################################### -*.bmp binary -*.dll binary -*.exe binary -*.gif binary -*.jpg binary -*.png binary -*.ttf binary -*.snk binary - -############################################################################### -# Set explicit file behavior to: -# diff as plain text -############################################################################### -*.doc diff=astextplain -*.docx diff=astextplain -*.dot diff=astextplain -*.pdf diff=astextplain -*.pptx diff=astextplain -*.rtf diff=astextplain diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md deleted file mode 100644 index 9d83b43b52..0000000000 --- a/.github/CONTRIBUTING.md +++ /dev/null @@ -1,35 +0,0 @@ -# How to contribute to SixLabors.Core - -#### **Did you find a bug?** - -- Please **ensure the bug was not already reported** by searching on GitHub under [Issues](https://github.com/SixLabors/Core/issues). - -- If you're unable to find an open issue addressing the problem, please [open a new one](https://github.com/SixLabors/Core/issues/new). Be sure to include a **title, the applicable version, a clear description**, as much relevant information as possible, and a **code sample** or an **executable test case** demonstrating the expected behavior that is not occurring. Please do not hijack existing issues. - -#### **Did you write a patch that fixes a bug?** - -* Open a new GitHub pull request with the patch. - -* Ensure the PR description clearly describes the problem and solution. Include the relevant issue number if applicable. - -* Before submitting, please ensure that your code matches the existing coding patterns and practise as demonstrated in the repository. These follow strict Stylecop rules :cop:. - -#### **Do you intend to add a new feature or change an existing one?** - -* Suggest your change in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General) and start writing code. - -* Do not open an issue on GitHub until you have collected positive feedback about the change. GitHub issues are primarily intended for bug reports and fixes. - -#### **Running tests and Debugging** - -* Debugging (running tests in Debug mode) is only supported on .NET Core 2.1, because of JIT Code Generation bugs like [dotnet/coreclr#16443](https://github.com/dotnet/coreclr/issues/16443) or [dotnet/coreclr#20657](https://github.com/dotnet/coreclr/issues/20657) - -#### **Do you have questions about consuming the library or the source code?** - -* Ask any question about how to use SixLabors.Core in the [ImageSharp Gitter Chat Room](https://gitter.im/ImageSharp/General). - -And please remember. SixLabors.Core is the work of a very, very, small number of developers who struggle balancing time to contribute to the project with family time and work commitments. We encourage you to pitch in and help make our vision of simple accessible imageprocessing available to all. Open Source can only exist with your help. - -Thanks for reading! - -James Jackson-South :heart: diff --git a/.github/ISSUE_TEMPLATE/ask-question.md b/.github/ISSUE_TEMPLATE/ask-question.md deleted file mode 100644 index c8313fba9f..0000000000 --- a/.github/ISSUE_TEMPLATE/ask-question.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Ask question -about: Ask a question about this project. - ---- - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General - -You should not create an issue but use Gitter instead: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md deleted file mode 100644 index c1bf768fa8..0000000000 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -### Prerequisites - -- [ ] I have written a descriptive issue title -- [ ] I have verified that I am running the latest version of ImageSharp -- [ ] I have verified if the problem exist in both `DEBUG` and `RELEASE` mode -- [ ] I have searched [open](https://github.com/SixLabors/Core/issues) and [closed](https://github.com/SixLabors/Core/issues?q=is%3Aissue+is%3Aclosed) issues to ensure it has not already been reported - -### Description - - -### Steps to Reproduce - - -### System Configuration - - -- SixLabors.Core version: -- Other SixLabors packages and versions: -- Environment (Operating system, version and so on): -- .NET Framework version: -- Additional information: - - diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md deleted file mode 100644 index be1e593be4..0000000000 --- a/.github/ISSUE_TEMPLATE/feature-request.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General - -You should first discuss the feature on Gitter: https://gitter.im/ImageSharp/General \ No newline at end of file diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index a717a05a1e..0000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,11 +0,0 @@ -### Prerequisites - -- [ ] I have written a descriptive pull-request title -- [ ] I have verified that there are no overlapping [pull-requests](https://github.com/SixLabors/Core/pulls) open -- [ ] I have verified that I am following matches the existing coding patterns and practice as demonstrated in the repository. These follow strict Stylecop rules :cop:. -- [ ] I have provided test coverage for my change (where applicable) - -### Description - - - diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 940794e60f..0000000000 --- a/.gitignore +++ /dev/null @@ -1,288 +0,0 @@ -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. -## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore - -# User-specific files -*.suo -*.user -*.userosscache -*.sln.docstates - -# User-specific files (MonoDevelop/Xamarin Studio) -*.userprefs - -# Build results -[Dd]ebug/ -[Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ -x64/ -x86/ -bld/ -[Bb]in/ -[Oo]bj/ -[Ll]og/ - -# Visual Studio 2015 cache/options directory -.vs/ -# Uncomment if you have tasks that create the project's static files in wwwroot -#wwwroot/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -# NUNIT -*.VisualState.xml -TestResult.xml - -# Build Results of an ATL Project -[Dd]ebugPS/ -[Rr]eleasePS/ -dlldata.c - -# .NET Core -project.lock.json -project.fragment.lock.json -artifacts/ -**/Properties/launchSettings.json - -*_i.c -*_p.c -*_i.h -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.svclog -*.scc - -# Chutzpah Test files -_Chutzpah* - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opendb -*.opensdf -*.sdf -*.cachefile -*.VC.db -*.VC.VC.opendb - -# Visual Studio profiler -*.psess -*.vsp -*.vspx -*.sap - -# TFS 2012 Local Workspace -$tf/ - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper -*.DotSettings.user - -# JustCode is a .NET coding add-in -.JustCode - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# Visual Studio code coverage results -*.coverage -*.coveragexml - -# NCrunch -_NCrunch_* -.*crunch*.local.xml -nCrunchTemp_* - -# MightyMoose -*.mm.* -AutoTest.Net/ - -# Web workbench (sass) -.sass-cache/ - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.[Pp]ublish.xml -*.azurePubxml -# TODO: Comment the next line if you want to checkin your web deploy settings -# but database connection strings (with potential passwords) will be unencrypted -*.pubxml -*.publishproj - -# Microsoft Azure Web App publish settings. Comment the next line if you want to -# checkin your Azure Web App publish settings, but sensitive information contained -# in these scripts will be unencrypted -PublishScripts/ - -# NuGet Packages -*.nupkg -# The packages folder can be ignored because of Package Restore -**/packages/* -# except build/, which is used as an MSBuild target. -!**/packages/build/ -# Uncomment if necessary however generally it will be regenerated when needed -#!**/packages/repositories.config -# NuGet v3's project.json files produces more ignorable files -*.nuget.props -*.nuget.targets - -# Microsoft Azure Build Output -csx/ -*.build.csdef - -# Microsoft Azure Emulator -ecf/ -rcf/ - -# Windows Store app package directories and files -AppPackages/ -BundleArtifacts/ -Package.StoreAssociation.xml -_pkginfo.txt - -# Visual Studio cache files -# files ending in .cache can be ignored -*.[Cc]ache -# but keep track of directories ending in .cache -!*.[Cc]ache/ - -# Others -ClientBin/ -~$* -*~ -*.dbmdl -*.dbproj.schemaview -*.jfm -*.pfx -*.publishsettings -orleans.codegen.cs - -# Since there are multiple workflows, uncomment next line to ignore bower_components -# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) -#bower_components/ - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file -# to a newer Visual Studio version. Backup files are not needed, -# because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -*.mdf -*.ldf -*.ndf - -# Business Intelligence projects -*.rdl.data -*.bim.layout -*.bim_*.settings - -# Microsoft Fakes -FakesAssemblies/ - -# GhostDoc plugin setting file -*.GhostDoc.xml - -# Node.js Tools for Visual Studio -.ntvs_analysis.dat -node_modules/ - -# Typescript v1 declaration files -typings/ - -# Visual Studio 6 build log -*.plg - -# Visual Studio 6 workspace options file -*.opt - -# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) -*.vbw - -# Visual Studio LightSwitch build output -**/*.HTMLClient/GeneratedArtifacts -**/*.DesktopClient/GeneratedArtifacts -**/*.DesktopClient/ModelManifest.xml -**/*.Server/GeneratedArtifacts -**/*.Server/ModelManifest.xml -_Pvt_Extensions - -# Paket dependency manager -.paket/paket.exe -paket-files/ - -# FAKE - F# Make -.fake/ - -# JetBrains Rider -.idea/ -*.sln.iml - -# CodeRush -.cr/ - -# Python Tools for Visual Studio (PTVS) -__pycache__/ -*.pyc - -# Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config - -# Telerik's JustMock configuration file -*.jmconfig - -# BizTalk build output -*.btp.cs -*.btm.cs -*.odx.cs -*.xsd.cs diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index f560cd5905..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "shared-infrastructure"] - path = shared-infrastructure - url = https://github.com/SixLabors/SharedInfrastructure.git diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 8dada3edaf..0000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright {yyyy} {name of copyright owner} - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index 159761bd6e..0000000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -

- -SixLabors.Core -
-SixLabors.Core -

- -
- -[![Build status](https://ci.appveyor.com/api/projects/status/j1hvc99493b0jk3x/branch/develop?svg=true)](https://ci.appveyor.com/project/six-labors/core/branch/develop) -[![codecov](https://codecov.io/gh/SixLabors/Core/branch/develop/graph/badge.svg)](https://codecov.io/gh/SixLabors/Core) -[![GitHub license](https://img.shields.io/badge/license-Apache%202-blue.svg)](https://raw.githubusercontent.com/SixLabors/Core/master/LICENSE) - -[![GitHub issues](https://img.shields.io/github/issues/SixLabors/Core.svg)](https://github.com/SixLabors/Core/issues) -[![GitHub stars](https://img.shields.io/github/stars/SixLabors/Core.svg)](https://github.com/SixLabors/Core/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/SixLabors/Core.svg)](https://github.com/SixLabors/Core/network) -
- -**SixLabors.Core** provides core primitives and helper methods for use across SixLabors libraries. diff --git a/SixLabors.Core.sln b/SixLabors.Core.sln deleted file mode 100644 index a796a9ebac..0000000000 --- a/SixLabors.Core.sln +++ /dev/null @@ -1,63 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.28803.352 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}" - ProjectSection(SolutionItems) = preProject - appveyor.yml = appveyor.yml - .github\ISSUE_TEMPLATE\ask-question.md = .github\ISSUE_TEMPLATE\ask-question.md - .github\ISSUE_TEMPLATE\bug-report.md = .github\ISSUE_TEMPLATE\bug-report.md - build.cmd = build.cmd - codecov.yml = codecov.yml - .github\CONTRIBUTING.md = .github\CONTRIBUTING.md - .github\ISSUE_TEMPLATE\feature-request.md = .github\ISSUE_TEMPLATE\feature-request.md - gitversion.yml = gitversion.yml - .github\PULL_REQUEST_TEMPLATE.md = .github\PULL_REQUEST_TEMPLATE.md - README.md = README.md - shared-infrastructure\.editorconfig = shared-infrastructure\.editorconfig - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Source", "Source", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core", "src\SixLabors.Core\SixLabors.Core.csproj", "{09E744EC-4852-4FC7-BE78-C1B399F17967}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SixLabors.Core.Tests", "tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj", "{F836E8E6-B4D9-4208-8346-140C74678B91}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeCoverage", "CodeCoverage", "{10A74B46-930F-49E3-A579-BC3A6A23321D}" - ProjectSection(SolutionItems) = preProject - tests\CodeCoverage\CodeCoverage.cmd = tests\CodeCoverage\CodeCoverage.cmd - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Debug|Any CPU.Build.0 = Debug|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.ActiveCfg = Release|Any CPU - {09E744EC-4852-4FC7-BE78-C1B399F17967}.Release|Any CPU.Build.0 = Release|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F836E8E6-B4D9-4208-8346-140C74678B91}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {09E744EC-4852-4FC7-BE78-C1B399F17967} = {815C0625-CD3D-440F-9F80-2D83856AB7AE} - {F836E8E6-B4D9-4208-8346-140C74678B91} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC} - {10A74B46-930F-49E3-A579-BC3A6A23321D} = {C317F1B1-D75E-4C6D-83EB-80367343E0D7} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0DED1AC8-37DA-4EC2-8CAE-40E31CD439DE} - EndGlobalSection - GlobalSection(Performance) = preSolution - HasPerformanceSessions = true - EndGlobalSection -EndGlobal diff --git a/SixLabors.Core.sln.DotSettings b/SixLabors.Core.sln.DotSettings deleted file mode 100644 index 82961f0d05..0000000000 --- a/SixLabors.Core.sln.DotSettings +++ /dev/null @@ -1,6 +0,0 @@ - - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - DO_NOT_SHOW - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 3c301a1964..0000000000 --- a/appveyor.yml +++ /dev/null @@ -1,29 +0,0 @@ -version: 0.0.{build} -image: Visual Studio 2017 - - -before_build: - - git submodule -q update --init - - cmd: dotnet --version - -build_script: - - cmd: build.cmd - - cmd: tests\CodeCoverage\CodeCoverage.cmd - -after_build: - - cmd: appveyor PushArtifact "artifacts\SixLabors.Core.%APPVEYOR_BUILD_VERSION%.nupkg" - -deploy: - - provider: NuGet - server: https://www.myget.org/F/sixlabors/api/v2/package - symbol_server: https://www.myget.org/F/sixlabors/symbols/api/v2/package - api_key: - secure: V/lEHP0UeMWIpWd0fiNlY2IgbCnJKQlGdRksECdJbOBdaE20Fl0RNL7WyqHe02o4 - artifact: /.*\.nupkg/ - on: - branch: master - -# prevent the double build when a branch has an active PR -skip_branch_with_pr: true - -test: off diff --git a/build.cmd b/build.cmd deleted file mode 100644 index 6372b41253..0000000000 --- a/build.cmd +++ /dev/null @@ -1,17 +0,0 @@ -@echo Off - -PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& '.\build.ps1'" - -if not "%errorlevel%"=="0" goto failure - -:success -ECHO successfully built project -REM exit 0 -goto end - -:failure -ECHO failed to build. -REM exit -1 -goto end - -:end \ No newline at end of file diff --git a/build.ps1 b/build.ps1 deleted file mode 100644 index fcd63aea27..0000000000 --- a/build.ps1 +++ /dev/null @@ -1,110 +0,0 @@ - -# lets calulat the correct version here -$fallbackVersion = "1.0.0"; -$version = '' - -$tagRegex = '^v?(\d+\.\d+\.\d+)(-([a-zA-Z]+)\.?(\d*))?$' - -# we are running on the build server -$isVersionTag = $env:APPVEYOR_REPO_TAG_NAME -match $tagRegex - - if($isVersionTag){ - - Write-Debug "Building commit tagged with a compatable version number" - - $version = $matches[1] - $postTag = $matches[3] - $count = $matches[4] - Write-Debug "version number: ${version} post tag: ${postTag} count: ${count}" - if("$postTag" -ne ""){ - $version = "${version}-${postTag}" - } - if("$count" -ne ""){ - # for consistancy with previous releases we pad the counter to only 4 places - $padded = $count.Trim().Trim('0').PadLeft(4,"0"); - Write-Debug "count '$count', padded '${padded}'" - - $version = "${version}${padded}" - } - }else { - - Write-Debug "Untagged" - $lastTag = (git tag --list --sort=-taggerdate) | Out-String - $list = $lastTag.Split("`n") - foreach ($tag in $list) { - - Write-Debug "testing ${tag}" - $tag = $tag.Trim(); - if($tag -match $tagRegex){ - Write-Debug "matched ${tag}" - $version = $matches[1]; - break; - } - } - - if("$version" -eq ""){ - $version = $fallbackVersion - Write-Debug "Failed to discover base version Fallback to '${version}'" - }else{ - - Write-Debug "Discovered base version from tags '${version}'" - } - - $buildNumber = $env:APPVEYOR_BUILD_NUMBER - - # build number replacement is padded to 6 places - $buildNumber = "$buildNumber".Trim().Trim('0').PadLeft(6,"0"); - if("$env:APPVEYOR_PULL_REQUEST_NUMBER" -ne ""){ - Write-Debug "building a PR" - - $prNumber = "$env:APPVEYOR_PULL_REQUEST_NUMBER".Trim().Trim('0').PadLeft(5,"0"); - # this is a PR - $version = "${version}-PullRequest${prNumber}${buildNumber}"; - }else{ - Write-Debug "building a branch commit" - - # this is a general branch commit - $branch = $env:APPVEYOR_REPO_BRANCH - - if("$branch" -eq ""){ - $branch = ((git rev-parse --abbrev-ref HEAD) | Out-String).Trim() - - if("$branch" -eq ""){ - $branch = "unknown" - } - } - - $branch = $branch.Replace("/","-").ToLower() - - if($branch.ToLower() -eq "master"){ - $branch = "dev" - } - - $version = "${version}-${branch}${buildNumber}"; - } - } - -if("$env:APPVEYOR_API_URL" -ne ""){ - # update appveyor build number for this build - Invoke-RestMethod -Method "PUT" ` - -Uri "${env:APPVEYOR_API_URL}api/build" ` - -Body "{version:'${version}'}" ` - -ContentType "application/json" -} - -Write-Host "Building version '${version}'" -dotnet restore /p:packageversion=$version - -Write-Host "Building projects" -dotnet build -c Release /p:packageversion=$version - -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } - -if ( $env:CI -ne "True") { - dotnet test ./tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj --no-build -c Release -} -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } - -Write-Host "Packaging projects" -dotnet pack ./src/SixLabors.Core/ -c Release --output ../../artifacts --no-build /p:packageversion=$version -if ($LASTEXITCODE ){ Exit $LASTEXITCODE } \ No newline at end of file diff --git a/codecov.yml b/codecov.yml deleted file mode 100644 index ad0b0be56b..0000000000 --- a/codecov.yml +++ /dev/null @@ -1,22 +0,0 @@ -codecov: - branch: develop - notify: - require_ci_to_pass: true -comment: off -coverage: - precision: 2 - range: - - 70.0 - - 100.0 - round: down - status: - changes: false - patch: true - project: true -parsers: - gcov: - branch_detection: - conditional: true - loop: true - macro: false - method: false \ No newline at end of file diff --git a/gitversion.yml b/gitversion.yml deleted file mode 100644 index 9fae0d8c2f..0000000000 --- a/gitversion.yml +++ /dev/null @@ -1,31 +0,0 @@ -# to create a new package you create a new release/tag -# in github appveyor will build it without the -cixxx tag -# it will then be deployable cleanly to nuget.org - -branches: - master: - tag: ci - mode: ContinuousDeployment - increment: Minor - prevent-increment-of-merged-branch-version: false - track-merge-target: true - pull-request: - regex: (pull|pull\-requests|pr)[/-] - mode: ContinuousDelivery - tag: PullRequest - increment: Inherit - prevent-increment-of-merged-branch-version: false - tag-number-pattern: '[/-](?\d+)[-/]' - track-merge-target: false - tracks-release-branches: false - is-release-branch: false - otherbranches: - regex: '.*' - mode: ContinuousDeployment - tag: ci - increment: Patch - prevent-increment-of-merged-branch-version: false - track-merge-target: true - is-release-branch: false -ignore: - sha: [] \ No newline at end of file diff --git a/shared-infrastructure b/shared-infrastructure deleted file mode 160000 index faf84e44ec..0000000000 --- a/shared-infrastructure +++ /dev/null @@ -1 +0,0 @@ -Subproject commit faf84e44ec90e8a42a7271bcd04fea76279efb08 diff --git a/src/SixLabors.Core/Properties/AssemblyInfo.cs b/src/SixLabors.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index 241c0fe99c..0000000000 --- a/src/SixLabors.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System.Runtime.CompilerServices; - -// Ensure the internals can be tested. -[assembly: InternalsVisibleTo("SixLabors.Core.Tests")] \ No newline at end of file diff --git a/src/SixLabors.Core/SixLabors.Core.csproj b/src/SixLabors.Core/SixLabors.Core.csproj deleted file mode 100644 index 4611693b70..0000000000 --- a/src/SixLabors.Core/SixLabors.Core.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - Low level primitives for use across Six Labors projects. - $(packageversion) - 0.1.0-alpha2 - Six Labors - netstandard1.3;netstandard2.0;netcoreapp2.0;netcoreapp2.1; - true - true - SixLabors.Core - SixLabors.Core - rectangle;point;size,primitives - https://raw.githubusercontent.com/SixLabors/Branding/master/icons/core/sixlabors.core.128.png - https://github.com/SixLabors/Core - http://www.apache.org/licenses/LICENSE-2.0 - git - https://github.com/SixLabors/Core - Copyright (c) Six Labors and contributors. - full - SixLabors - 7.3 - - - - ..\..\shared-infrastructure\SixLabors.ruleset - - - - - $(DefineConstants);SUPPORTS_MATHF - - - - $(DefineConstants);SUPPORTS_HASHCODE - - - - - - - - - - All - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings b/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings deleted file mode 100644 index 8b01856ae9..0000000000 --- a/src/SixLabors.Core/SixLabors.Core.csproj.DotSettings +++ /dev/null @@ -1,2 +0,0 @@ - - True \ No newline at end of file diff --git a/tests/CodeCoverage/.gitignore b/tests/CodeCoverage/.gitignore deleted file mode 100644 index 6a14856d0a..0000000000 --- a/tests/CodeCoverage/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/OpenCover* \ No newline at end of file diff --git a/tests/CodeCoverage/CodeCoverage.cmd b/tests/CodeCoverage/CodeCoverage.cmd deleted file mode 100644 index 347e0338c8..0000000000 --- a/tests/CodeCoverage/CodeCoverage.cmd +++ /dev/null @@ -1,19 +0,0 @@ -@echo off - -cd tests\CodeCoverage - -nuget restore packages.config -PackagesDirectory . - -cd .. -cd .. - -dotnet restore SixLabors.Core.sln -dotnet build SixLabors.Core.sln --no-incremental -c release /p:codecov=true - -tests\CodeCoverage\OpenCover.4.6.519\tools\OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test tests\SixLabors.Core.Tests\SixLabors.Core.Tests.csproj --no-build -c release" -searchdirs:"tests\SixLabors.Core.Tests\bin\Release\netcoreapp2.1" -register:user -output:.\SixLabors.Core.Coverage.xml -hideskipped:All -returntargetcode -oldStyle -filter:"+[SixLabors.*]*" - -if %errorlevel% neq 0 exit /b %errorlevel% - -SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH% -pip install codecov -codecov -f "SixLabors.Core.Coverage.xml" \ No newline at end of file diff --git a/tests/CodeCoverage/packages.config b/tests/CodeCoverage/packages.config deleted file mode 100644 index 973b7f81b4..0000000000 --- a/tests/CodeCoverage/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj b/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj deleted file mode 100644 index 45eeef1b73..0000000000 --- a/tests/SixLabors.Core.Tests/SixLabors.Core.Tests.csproj +++ /dev/null @@ -1,44 +0,0 @@ - - - - 0.0.0 - netcoreapp1.1;netcoreapp2.1; - SixLabors.Core.Tests - SixLabors.Shapes.Tests - true - false - false - false - false - false - false - full - SixLabors.Tests - true - 7.3 - - - - ..\..\shared-infrastructure\SixLabors.Tests.ruleset - - - - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - diff --git a/tests/SixLabors.Core.Tests/TestEnvironment.cs b/tests/SixLabors.Core.Tests/TestEnvironment.cs deleted file mode 100644 index 77be7bfe10..0000000000 --- a/tests/SixLabors.Core.Tests/TestEnvironment.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; - -namespace SixLabors.Tests -{ - internal class TestEnvironment - { - internal static bool Is64BitProcess => IntPtr.Size == 8; - } -} \ No newline at end of file diff --git a/tests/SixLabors.ruleset b/tests/SixLabors.ruleset deleted file mode 100644 index a4fa8c4f71..0000000000 --- a/tests/SixLabors.ruleset +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - From 812b4e5c845f5b23bed64adc2cc97729f8b49a8a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:01:40 +0100 Subject: [PATCH 128/136] move product sources --- src/{SixLabors.Core => ImageSharp}/Constants.cs | 0 src/{SixLabors.Core => ImageSharp}/GeometryUtilities.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/AllocationOptions.cs | 0 .../Memory/Allocators}/ArrayPoolMemoryAllocator.Buffer{T}.cs | 0 .../Allocators}/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs | 0 .../Memory/Allocators}/ArrayPoolMemoryAllocator.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/IManagedByteBuffer.cs | 0 .../Memory/Allocators}/Internals/BasicArrayBuffer.cs | 0 .../Memory/Allocators}/Internals/BasicByteBuffer.cs | 0 .../Memory/Allocators}/Internals/ManagedBufferBase.cs | 0 .../Memory => ImageSharp/Memory/Allocators}/MemoryAllocator.cs | 0 .../Memory/Allocators}/SimpleGcMemoryAllocator.cs | 0 .../Primitives/Matrix3x2Extensions.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Point.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/PointF.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Rectangle.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/RectangleF.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/Size.cs | 0 src/{SixLabors.Core => ImageSharp}/Primitives/SizeF.cs | 0 19 files changed, 0 insertions(+), 0 deletions(-) rename src/{SixLabors.Core => ImageSharp}/Constants.cs (100%) rename src/{SixLabors.Core => ImageSharp}/GeometryUtilities.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/AllocationOptions.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.Buffer{T}.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/ArrayPoolMemoryAllocator.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/IManagedByteBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/BasicArrayBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/BasicByteBuffer.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/Internals/ManagedBufferBase.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/MemoryAllocator.cs (100%) rename src/{SixLabors.Core/Memory => ImageSharp/Memory/Allocators}/SimpleGcMemoryAllocator.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Matrix3x2Extensions.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Point.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/PointF.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Rectangle.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/RectangleF.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/Size.cs (100%) rename src/{SixLabors.Core => ImageSharp}/Primitives/SizeF.cs (100%) diff --git a/src/SixLabors.Core/Constants.cs b/src/ImageSharp/Constants.cs similarity index 100% rename from src/SixLabors.Core/Constants.cs rename to src/ImageSharp/Constants.cs diff --git a/src/SixLabors.Core/GeometryUtilities.cs b/src/ImageSharp/GeometryUtilities.cs similarity index 100% rename from src/SixLabors.Core/GeometryUtilities.cs rename to src/ImageSharp/GeometryUtilities.cs diff --git a/src/SixLabors.Core/Memory/AllocationOptions.cs b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs similarity index 100% rename from src/SixLabors.Core/Memory/AllocationOptions.cs rename to src/ImageSharp/Memory/Allocators/AllocationOptions.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.Buffer{T}.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs diff --git a/src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/ArrayPoolMemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs diff --git a/src/SixLabors.Core/Memory/IManagedByteBuffer.cs b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/IManagedByteBuffer.cs rename to src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/BasicArrayBuffer.cs rename to src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/BasicByteBuffer.cs rename to src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs diff --git a/src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs similarity index 100% rename from src/SixLabors.Core/Memory/Internals/ManagedBufferBase.cs rename to src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs diff --git a/src/SixLabors.Core/Memory/MemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/MemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/MemoryAllocator.cs diff --git a/src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs similarity index 100% rename from src/SixLabors.Core/Memory/SimpleGcMemoryAllocator.cs rename to src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs diff --git a/src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Matrix3x2Extensions.cs diff --git a/src/SixLabors.Core/Primitives/Point.cs b/src/ImageSharp/Primitives/Point.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Point.cs rename to src/ImageSharp/Primitives/Point.cs diff --git a/src/SixLabors.Core/Primitives/PointF.cs b/src/ImageSharp/Primitives/PointF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/PointF.cs rename to src/ImageSharp/Primitives/PointF.cs diff --git a/src/SixLabors.Core/Primitives/Rectangle.cs b/src/ImageSharp/Primitives/Rectangle.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Rectangle.cs rename to src/ImageSharp/Primitives/Rectangle.cs diff --git a/src/SixLabors.Core/Primitives/RectangleF.cs b/src/ImageSharp/Primitives/RectangleF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/RectangleF.cs rename to src/ImageSharp/Primitives/RectangleF.cs diff --git a/src/SixLabors.Core/Primitives/Size.cs b/src/ImageSharp/Primitives/Size.cs similarity index 100% rename from src/SixLabors.Core/Primitives/Size.cs rename to src/ImageSharp/Primitives/Size.cs diff --git a/src/SixLabors.Core/Primitives/SizeF.cs b/src/ImageSharp/Primitives/SizeF.cs similarity index 100% rename from src/SixLabors.Core/Primitives/SizeF.cs rename to src/ImageSharp/Primitives/SizeF.cs From 27e59ab824721800b15ac7deaff7131e14da39fa Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:05:16 +0100 Subject: [PATCH 129/136] update ImageSharp.csproj --- Directory.Build.targets | 3 +-- src/ImageSharp/ImageSharp.csproj | 29 +++++++++++++++++------------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index eb0764d899..3b903d36cd 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -23,10 +23,9 @@ - - + diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index a6beac7258..6c72696984 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -19,6 +19,23 @@ SixLabors.ImageSharp + + + + + + + + + + + + + + + + + True @@ -187,18 +204,6 @@ - - - - - - - - - - - - From f1d7c5fa949c74876f036c0626998416530601b3 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:51:36 +0100 Subject: [PATCH 130/136] move test code & delete shared code tests --- .../ArrayPoolMemoryAllocatorTests.cs | 0 .../Memory/Alocators}/BufferExtensions.cs | 0 .../Memory/Alocators}/BufferTestSuite.cs | 0 .../SimpleGcMemoryAllocatorTests.cs | 0 .../Primitives/PointFTests.cs | 0 .../Primitives/PointTests.cs | 0 .../Primitives/RectangleFTests.cs | 0 .../Primitives/RectangleTests.cs | 0 .../Primitives/SizeFTests.cs | 0 .../Primitives/SizeTests.cs | 0 .../Helpers/DebugGuardTests.cs | 234 ----------------- .../Helpers/FloatRoundingComparer.cs | 59 ----- .../Helpers/GeometryUtilitiesTests.cs | 19 -- .../Helpers/GuardTests.cs | 248 ------------------ .../Helpers/MathFTests.cs | 95 ------- 15 files changed, 655 deletions(-) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/ArrayPoolMemoryAllocatorTests.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/BufferExtensions.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/BufferTestSuite.cs (100%) rename tests/{SixLabors.Core.Tests/Memory => ImageSharp.Tests/Memory/Alocators}/SimpleGcMemoryAllocatorTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/PointFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/PointTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/RectangleFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/RectangleTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/SizeFTests.cs (100%) rename tests/{SixLabors.Core.Tests => ImageSharp.Tests}/Primitives/SizeTests.cs (100%) delete mode 100644 tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/GuardTests.cs delete mode 100644 tests/SixLabors.Core.Tests/Helpers/MathFTests.cs diff --git a/tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/ArrayPoolMemoryAllocatorTests.cs rename to tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs diff --git a/tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/BufferExtensions.cs rename to tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs diff --git a/tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/BufferTestSuite.cs rename to tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs diff --git a/tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Memory/SimpleGcMemoryAllocatorTests.cs rename to tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/PointFTests.cs rename to tests/ImageSharp.Tests/Primitives/PointFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/PointTests.cs b/tests/ImageSharp.Tests/Primitives/PointTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/PointTests.cs rename to tests/ImageSharp.Tests/Primitives/PointTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/RectangleFTests.cs rename to tests/ImageSharp.Tests/Primitives/RectangleFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/RectangleTests.cs rename to tests/ImageSharp.Tests/Primitives/RectangleTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/SizeFTests.cs rename to tests/ImageSharp.Tests/Primitives/SizeFTests.cs diff --git a/tests/SixLabors.Core.Tests/Primitives/SizeTests.cs b/tests/ImageSharp.Tests/Primitives/SizeTests.cs similarity index 100% rename from tests/SixLabors.Core.Tests/Primitives/SizeTests.cs rename to tests/ImageSharp.Tests/Primitives/SizeTests.cs diff --git a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs deleted file mode 100644 index 0b0d33090f..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/DebugGuardTests.cs +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -// tell this file to enable debug conditional method calls, i.e. all the debug guard calls -#define DEBUG - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using Xunit; - -namespace SixLabors.Helpers.Tests -{ - public class DebugGuardTests - { - private class Foo - { - } - - [Fact] - public void AllStaticMethodsOnOnDebugGuardHaveDEBUGConditional() - { - IEnumerable methods = typeof(DebugGuard).GetTypeInfo().GetMethods() - .Where(x => x.IsStatic); - - foreach (MethodInfo m in methods) - { - IEnumerable attribs = m.GetCustomAttributes(); - Assert.True(attribs.Select(x => x.ConditionString).Contains("DEBUG"), $"Method '{m.Name}' does not have [Conditional(\"DEBUG\")] set."); - } - } - - [Fact] - public void NotNull_WhenNull_Throws() - { - Foo foo = null; - Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); - } - - [Fact] - public void NotNull_WhenNotNull() - { - var foo = new Foo(); - Guard.NotNull(foo, nameof(foo)); - } - - [Theory] - [InlineData(null, true)] - [InlineData("", true)] - [InlineData(" ", true)] - [InlineData("$", false)] - [InlineData("lol", false)] - public void NotNullOrWhiteSpace(string str, bool shouldThrow) - { - if (shouldThrow) - { - Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); - } - else - { - Guard.NotNullOrWhiteSpace(str, nameof(str)); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsTrue(bool value) - { - if (!value) - { - Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); - } - else - { - Guard.IsTrue(value, nameof(value), "Boo."); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsFalse(bool value) - { - if (value) - { - Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); - } - else - { - Guard.IsFalse(value, nameof(value), "Boo."); - } - } - - public static readonly TheoryData SizeCheckData = new TheoryData - { - { 0, 0, false }, - { 1, 1, false }, - { 1, 0, false }, - { 13, 13, false }, - { 20, 13, false }, - { 12, 13, true }, - { 0, 1, true }, - }; - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) - { - int[] data = new int[length]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); - Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); - } - else - { - Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); - Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); - } - } - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) - { - int[] dest = new int[destLength]; - int[] source = new int[sourceLength]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); - } - else - { - Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); - Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); - } - } - - [Fact] - public void MustBeLessThan_IsLess_ThrowsNoException() - { - DebugGuard.MustBeLessThan(0, 1, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeLessThan(value, max, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be less than {max}.", exception.Message); - } - - [Theory] - [InlineData(0, 1)] - [InlineData(1, 1)] - public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) - { - DebugGuard.MustBeLessThanOrEqualTo(value, max, "myParamName"); - } - - [Fact] - public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => DebugGuard.MustBeLessThanOrEqualTo(2, 1, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); - } - - [Fact] - public void MustBeGreaterThan_IsGreater_ThrowsNoException() - { - DebugGuard.MustBeGreaterThan(2, 1, "myParamName"); - } - - [Theory] - [InlineData(1, 2)] - [InlineData(1, 1)] - public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeGreaterThan(value, min, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) - { - DebugGuard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); - } - - [Fact] - public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws( - () => DebugGuard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); - } - - [Theory] - [InlineData(new int[] { 1, 2 }, 1)] - [InlineData(new int[] { 1, 2 }, 2)] - public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int[] value, int minLength) - { - DebugGuard.MustBeSizedAtLeast(value, minLength, "myParamName"); - } - - [Fact] - public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() - { - ArgumentException exception = Assert.Throws( - () => DebugGuard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName")); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"The size must be at least 3.", exception.Message); - } - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs b/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs deleted file mode 100644 index 15220d4b14..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/FloatRoundingComparer.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using System.Collections.Generic; -using System.Numerics; - -namespace SixLabors.Tests.Helpers -{ - /// - /// Allows the comparison of single-precision floating point values by precision. - /// - public struct FloatRoundingComparer : IEqualityComparer, IEqualityComparer - { - /// - /// Initializes a new instance of the struct. - /// - /// The number of decimal places (valid values: 0-7). - public FloatRoundingComparer(int precision) - { - Guard.MustBeBetweenOrEqualTo(precision, 0, 7, nameof(precision)); - this.Precision = precision; - } - - /// - /// Gets the number of decimal places (valid values: 0-7). - /// - public int Precision { get; } - - /// - public bool Equals(float x, float y) - { - float xp = (float)Math.Round(x, this.Precision, MidpointRounding.AwayFromZero); - float yp = (float)Math.Round(y, this.Precision, MidpointRounding.AwayFromZero); - - return Comparer.Default.Compare(xp, yp) == 0; - } - - /// - public bool Equals(Vector4 x, Vector4 y) - { - return this.Equals(x.X, y.X) && this.Equals(x.Y, y.Y) && this.Equals(x.Z, y.Z) && this.Equals(x.W, y.W); - } - - /// - public int GetHashCode(float obj) - { - unchecked - { - int hashCode = obj.GetHashCode(); - hashCode = (hashCode * 397) ^ this.Precision.GetHashCode(); - return hashCode; - } - } - - /// - public int GetHashCode(Vector4 obj) => HashCode.Combine(obj, this.Precision); - } -} \ No newline at end of file diff --git a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs b/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs deleted file mode 100644 index 93e4cec60a..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/GeometryUtilitiesTests.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class GeometryUtilitiesTests - { - [Fact] - public void Convert_Degree_To_Radian() - => Assert.Equal((float)(Math.PI / 2D), GeometryUtilities.DegreeToRadian(90F), new FloatRoundingComparer(6)); - - [Fact] - public void Convert_Radian_To_Degree() - => Assert.Equal(60F, GeometryUtilities.RadianToDegree((float)(Math.PI / 3D)), new FloatRoundingComparer(5)); - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs b/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs deleted file mode 100644 index 4b5ebbdfde..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/GuardTests.cs +++ /dev/null @@ -1,248 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Helpers.Tests -{ - public class GuardTests - { - private class Foo - { - } - - [Fact] - public void NotNull_WhenNull_Throws() - { - Foo foo = null; - Assert.Throws(() => Guard.NotNull(foo, nameof(foo))); - } - - [Fact] - public void NotNull_WhenNotNull() - { - Foo foo = new Foo(); - Guard.NotNull(foo, nameof(foo)); - } - - [Theory] - [InlineData(null, true)] - [InlineData("", true)] - [InlineData(" ", true)] - [InlineData("$", false)] - [InlineData("lol", false)] - public void NotNullOrWhiteSpace(string str, bool shouldThrow) - { - if (shouldThrow) - { - Assert.ThrowsAny(() => Guard.NotNullOrWhiteSpace(str, nameof(str))); - } - else - { - Guard.NotNullOrWhiteSpace(str, nameof(str)); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsTrue(bool value) - { - if (!value) - { - Assert.Throws(() => Guard.IsTrue(value, nameof(value), "Boo!")); - } - else - { - Guard.IsTrue(value, nameof(value), "Boo."); - } - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void IsFalse(bool value) - { - if (value) - { - Assert.Throws(() => Guard.IsFalse(value, nameof(value), "Boo!")); - } - else - { - Guard.IsFalse(value, nameof(value), "Boo."); - } - } - - public static readonly TheoryData SizeCheckData = new TheoryData - { - { 0, 0, false }, - { 1, 1, false }, - { 1, 0, false }, - { 13, 13, false }, - { 20, 13, false }, - { 12, 13, true }, - { 0, 1, true }, - }; - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void MustBeSizedAtLeast(int length, int minLength, bool shouldThrow) - { - int[] data = new int[length]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data))); - Assert.Throws(() => Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data))); - } - else - { - Guard.MustBeSizedAtLeast((Span)data, minLength, nameof(data)); - Guard.MustBeSizedAtLeast((ReadOnlySpan)data, minLength, nameof(data)); - } - } - - [Theory] - [MemberData(nameof(SizeCheckData))] - public void DestinationShouldNotBeTooShort(int destLength, int sourceLength, bool shouldThrow) - { - int[] dest = new int[destLength]; - int[] source = new int[sourceLength]; - - if (shouldThrow) - { - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest))); - Assert.Throws(() => Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest))); - } - else - { - Guard.DestinationShouldNotBeTooShort((Span)source, (Span)dest, nameof(dest)); - Guard.DestinationShouldNotBeTooShort((ReadOnlySpan)source, (Span)dest, nameof(dest)); - } - } - - [Fact] - public void MustBeLessThan_IsLess_ThrowsNoException() - { - Guard.MustBeLessThan(0, 1, "myParamName"); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeLessThan_IsGreaterOrEqual_ThrowsNoException(int value, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeLessThan(value, max, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be less than {max}.", exception.Message); - } - - [Theory] - [InlineData(0, 1)] - [InlineData(1, 1)] - public void MustBeLessThanOrEqualTo_IsLessOrEqual_ThrowsNoException(int value, int max) - { - Guard.MustBeLessThanOrEqualTo(value, max, "myParamName"); - } - - [Fact] - public void MustBeLessThanOrEqualTo_IsGreater_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeLessThanOrEqualTo(2, 1, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 2 must be less than or equal to 1.", exception.Message); - } - - [Fact] - public void MustBeGreaterThan_IsGreater_ThrowsNoException() - { - Guard.MustBeGreaterThan(2, 1, "myParamName"); - } - - [Theory] - [InlineData(1, 2)] - [InlineData(1, 1)] - public void MustBeGreaterThan_IsLessOrEqual_ThrowsNoException(int value, int min) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeGreaterThan(value, min, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than {min}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(1, 1)] - public void MustBeGreaterThanOrEqualTo_IsGreaterOrEqual_ThrowsNoException(int value, int min) - { - Guard.MustBeGreaterThanOrEqualTo(value, min, "myParamName"); - } - - [Fact] - public void MustBeGreaterThanOrEqualTo_IsLess_ThrowsNoException() - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeGreaterThanOrEqualTo(1, 2, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value 1 must be greater than or equal to 2.", exception.Message); - } - - [Theory] - [InlineData(1, 1, 3)] - [InlineData(2, 1, 3)] - [InlineData(3, 1, 3)] - public void MustBeBetweenOrEqualTo_IsBetweenOrEqual_ThrowsNoException(int value, int min, int max) - { - Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); - } - - [Theory] - [InlineData(0, 1, 3)] - [InlineData(4, 1, 3)] - public void MustBeBetweenOrEqualTo_IsLessOrGreater_ThrowsNoException(int value, int min, int max) - { - ArgumentOutOfRangeException exception = Assert.Throws(() => - { - Guard.MustBeBetweenOrEqualTo(value, min, max, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains($"Value {value} must be greater than or equal to {min} and less than or equal to {max}.", exception.Message); - } - - [Theory] - [InlineData(2, 1)] - [InlineData(2, 2)] - public void MustBeSizedAtLeast_Array_LengthIsGreaterOrEqual_ThrowsNoException(int valueLength, int minLength) - { - Guard.MustBeSizedAtLeast(new int[valueLength], minLength, "myParamName"); - } - - [Fact] - public void MustBeSizedAtLeast_Array_LengthIsLess_ThrowsException() - { - ArgumentException exception = Assert.Throws(() => - { - Guard.MustBeSizedAtLeast(new int[] { 1, 2 }, 3, "myParamName"); - }); - - Assert.Equal("myParamName", exception.ParamName); - Assert.Contains("The size must be at least 3", exception.Message); - } - } -} diff --git a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs b/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs deleted file mode 100644 index 9ae95f0140..0000000000 --- a/tests/SixLabors.Core.Tests/Helpers/MathFTests.cs +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -using System; -using Xunit; - -namespace SixLabors.Tests.Helpers -{ - public class MathFTests - { - [Fact] - public void MathF_PI_Is_Equal() - { - Assert.Equal(MathF.PI, (float)Math.PI); - } - - [Fact] - public void MathF_Ceililng_Is_Equal() - { - Assert.Equal(MathF.Ceiling(0.3333F), (float)Math.Ceiling(0.3333F)); - } - - [Fact] - public void MathF_Cos_Is_Equal() - { - Assert.Equal(MathF.Cos(0.3333F), (float)Math.Cos(0.3333F)); - } - - [Fact] - public void MathF_Abs_Is_Equal() - { - Assert.Equal(MathF.Abs(-0.3333F), (float)Math.Abs(-0.3333F)); - } - - [Fact] - public void MathF_Atan2_Is_Equal() - { - Assert.Equal(MathF.Atan2(1.2345F, 1.2345F), (float)Math.Atan2(1.2345F, 1.2345F)); - } - - [Fact] - public void MathF_Exp_Is_Equal() - { - Assert.Equal(MathF.Exp(1.2345F), (float)Math.Exp(1.2345F)); - } - - [Fact] - public void MathF_Floor_Is_Equal() - { - Assert.Equal(MathF.Floor(1.2345F), (float)Math.Floor(1.2345F)); - } - - [Fact] - public void MathF_Min_Is_Equal() - { - Assert.Equal(MathF.Min(1.2345F, 5.4321F), (float)Math.Min(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Max_Is_Equal() - { - Assert.Equal(MathF.Max(1.2345F, 5.4321F), (float)Math.Max(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Pow_Is_Equal() - { - Assert.Equal(MathF.Pow(1.2345F, 5.4321F), (float)Math.Pow(1.2345F, 5.4321F)); - } - - [Fact] - public void MathF_Round_Is_Equal() - { - Assert.Equal(MathF.Round(1.2345F), (float)Math.Round(1.2345F)); - } - - [Fact] - public void MathF_Round_With_Midpoint_Is_Equal() - { - Assert.Equal(MathF.Round(1.2345F, MidpointRounding.AwayFromZero), (float)Math.Round(1.2345F, MidpointRounding.AwayFromZero)); - } - - [Fact] - public void MathF_Sin_Is_Equal() - { - Assert.Equal(MathF.Sin(1.2345F), (float)Math.Sin(1.2345F)); - } - - [Fact] - public void MathF_Sqrt_Is_Equal() - { - Assert.Equal(MathF.Sqrt(2F), (float)Math.Sqrt(2F)); - } - } -} \ No newline at end of file From 82a40f7f1046e11a82d3e47878a12e2417354a47 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 00:56:55 +0100 Subject: [PATCH 131/136] skip memory-intensive allocator tests --- .../Alocators/ArrayPoolMemoryAllocatorTests.cs | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs index 1c1d721674..6495ca21d7 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs @@ -6,11 +6,13 @@ using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Tests; +using SixLabors.ImageSharp.Tests; using Xunit; namespace SixLabors.Memory.Tests { + // TODO: Re-enable memory-intensive tests with arcade RemoteExecutor: + // https://github.com/dotnet/runtime/blob/master/docs/project/writing-tests.md#remoteexecutor public class ArrayPoolMemoryAllocatorTests { private const int MaxPooledBufferSizeInBytes = 2048; @@ -79,7 +81,7 @@ public void SmallBuffersArePooled_OfByte(int size) Assert.True(this.CheckIsRentingPooledBuffer(size)); } - [Theory] + [Theory(Skip = "Should be executed from a separate process.")] [InlineData(128 * 1024 * 1024)] [InlineData(MaxPooledBufferSizeInBytes + 1)] public void LargeBuffersAreNotPooled_OfByte(int size) @@ -101,7 +103,7 @@ public unsafe void SmallBuffersArePooled_OfBigValueType() Assert.True(this.CheckIsRentingPooledBuffer(count)); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public unsafe void LaregeBuffersAreNotPooled_OfBigValueType() { if (!TestEnvironment.Is64BitProcess) @@ -160,7 +162,8 @@ public void ReleaseRetainedResources_DisposingPreviouslyAllocatedBuffer_IsAllowe buffer.Dispose(); } - [Fact] + + [Fact(Skip = "Should be executed from a separate process.")] public void AllocationOverLargeArrayThreshold_UsesDifferentPool() { if (!TestEnvironment.Is64BitProcess) @@ -180,7 +183,7 @@ public void AllocationOverLargeArrayThreshold_UsesDifferentPool() Assert.False(Unsafe.AreSame(ref ptr2Small, ref large.GetReference())); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public void CreateWithAggressivePooling() { if (!TestEnvironment.Is64BitProcess) @@ -194,7 +197,7 @@ public void CreateWithAggressivePooling() Assert.True(this.CheckIsRentingPooledBuffer(4096 * 4096)); } - [Fact] + [Fact(Skip = "Should be executed from a separate process.")] public void CreateDefault() { if (!TestEnvironment.Is64BitProcess) From aa09911e00d0668c7555fb54647271f29f406240 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:07:35 +0100 Subject: [PATCH 132/136] move Core primitives to a subfolder for now --- src/ImageSharp/Primitives/{ => Core}/Matrix3x2Extensions.cs | 0 src/ImageSharp/Primitives/{ => Core}/Point.cs | 0 src/ImageSharp/Primitives/{ => Core}/PointF.cs | 0 src/ImageSharp/Primitives/{ => Core}/Rectangle.cs | 0 src/ImageSharp/Primitives/{ => Core}/RectangleF.cs | 0 src/ImageSharp/Primitives/{ => Core}/Size.cs | 0 src/ImageSharp/Primitives/{ => Core}/SizeF.cs | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/ImageSharp/Primitives/{ => Core}/Matrix3x2Extensions.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Point.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/PointF.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Rectangle.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/RectangleF.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/Size.cs (100%) rename src/ImageSharp/Primitives/{ => Core}/SizeF.cs (100%) diff --git a/src/ImageSharp/Primitives/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs similarity index 100% rename from src/ImageSharp/Primitives/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs diff --git a/src/ImageSharp/Primitives/Point.cs b/src/ImageSharp/Primitives/Core/Point.cs similarity index 100% rename from src/ImageSharp/Primitives/Point.cs rename to src/ImageSharp/Primitives/Core/Point.cs diff --git a/src/ImageSharp/Primitives/PointF.cs b/src/ImageSharp/Primitives/Core/PointF.cs similarity index 100% rename from src/ImageSharp/Primitives/PointF.cs rename to src/ImageSharp/Primitives/Core/PointF.cs diff --git a/src/ImageSharp/Primitives/Rectangle.cs b/src/ImageSharp/Primitives/Core/Rectangle.cs similarity index 100% rename from src/ImageSharp/Primitives/Rectangle.cs rename to src/ImageSharp/Primitives/Core/Rectangle.cs diff --git a/src/ImageSharp/Primitives/RectangleF.cs b/src/ImageSharp/Primitives/Core/RectangleF.cs similarity index 100% rename from src/ImageSharp/Primitives/RectangleF.cs rename to src/ImageSharp/Primitives/Core/RectangleF.cs diff --git a/src/ImageSharp/Primitives/Size.cs b/src/ImageSharp/Primitives/Core/Size.cs similarity index 100% rename from src/ImageSharp/Primitives/Size.cs rename to src/ImageSharp/Primitives/Core/Size.cs diff --git a/src/ImageSharp/Primitives/SizeF.cs b/src/ImageSharp/Primitives/Core/SizeF.cs similarity index 100% rename from src/ImageSharp/Primitives/SizeF.cs rename to src/ImageSharp/Primitives/Core/SizeF.cs From 3d5cd5c4c74f545fc2e52a230ebaa77a954619d6 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:12:12 +0100 Subject: [PATCH 133/136] cherry pick CI improvements from @JimBobSquarePants --- GitVersion.yml | 1 + ci-test.ps1 | 6 +----- src/Directory.Build.targets | 2 +- tests/Directory.Build.props | 3 +++ tests/Directory.Build.targets | 2 +- tests/ImageSharp.Tests/ImageSharp.Tests.csproj | 2 ++ 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 0cd51a4ad6..f2a251c55a 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -2,5 +2,6 @@ continuous-delivery-fallback-tag: ci branches: master: tag: unstable + mode: ContinuousDeployment pull-request: tag: pr diff --git a/ci-test.ps1 b/ci-test.ps1 index fc368b22fb..35a9b4646d 100644 --- a/ci-test.ps1 +++ b/ci-test.ps1 @@ -34,8 +34,4 @@ elseif ($platform -eq '-x86' -and $targetFramework -match $netFxRegex) { else { dotnet test --no-build -c Release -f $targetFramework -} - -# Explicitly exit with 0 to ignore errors caused by coverlet attempting to read -# project files that dotnet test is set to ignore. -exit 0 +} \ No newline at end of file diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index c0e01ae586..68d4f8949c 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -50,6 +50,6 @@ - + diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index 22c634d9b2..3d8286971e 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -28,6 +28,9 @@ +
+ + diff --git a/tests/Directory.Build.targets b/tests/Directory.Build.targets index 26baee07e3..9ee9c226d3 100644 --- a/tests/Directory.Build.targets +++ b/tests/Directory.Build.targets @@ -25,7 +25,7 @@ - + true true opencover diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj index 41e6749be6..4aabc2f4e2 100644 --- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj +++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj @@ -8,6 +8,8 @@ SixLabors.ImageSharp.Tests AnyCPU;x64;x86 SixLabors.ImageSharp.Tests + + true From a83eb3a471d314f6c9d3fc93bdf53d600111102e Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Mon, 20 Jan 2020 01:32:23 +0100 Subject: [PATCH 134/136] fix PointFTests robustness issue --- tests/ImageSharp.Tests/Primitives/PointFTests.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tests/ImageSharp.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs index f78a18fc13..f02433d9a8 100644 --- a/tests/ImageSharp.Tests/Primitives/PointFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointFTests.cs @@ -6,12 +6,16 @@ using System.Numerics; using System.Reflection; using System.Runtime.CompilerServices; +using SixLabors.ImageSharp.Tests; using Xunit; namespace SixLabors.Primitives.Tests { public class PointFTests { + private static readonly ApproximateFloatComparer ApproximateFloatComparer = + new ApproximateFloatComparer(1e-6f); + [Fact] public void CanReinterpretCastFromVector2() { @@ -120,7 +124,8 @@ public void RotateTest() var pout = PointF.Transform(p, matrix); - Assert.Equal(new PointF(-2.82842732F, 21.2132034F), pout); + Assert.Equal(-2.82842732F, pout.X, ApproximateFloatComparer); + Assert.Equal(21.2132034F, pout.Y, ApproximateFloatComparer); } [Fact] @@ -207,4 +212,4 @@ public void DeconstructTest(float x, float y) Assert.Equal(y, deconstructedY); } } -} \ No newline at end of file +} From 6384f44501014c7c78889444496a2619df82dbb6 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Mon, 20 Jan 2020 21:08:21 +1100 Subject: [PATCH 135/136] Merge namespaces --- Directory.Build.targets | 3 + .../Advanced/AdvancedImageExtensions.cs | 1 - .../ParallelExecutionSettings.cs | 2 +- .../Advanced/ParallelUtils/ParallelHelper.cs | 2 - .../Common/Extensions/StreamExtensions.cs | 1 - .../Common/Helpers/Buffer2DUtils.cs | 1 - .../Common/Helpers/DenseMatrixUtils.cs | 1 - src/ImageSharp/Common/Helpers/ImageMaths.cs | 1 - src/ImageSharp/Common/Helpers/Vector4Utils.cs | 1 - src/ImageSharp/Configuration.cs | 2 +- src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs | 1 - src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs | 1 - src/ImageSharp/Formats/Gif/GifDecoderCore.cs | 2 - src/ImageSharp/Formats/Gif/GifEncoderCore.cs | 1 - src/ImageSharp/Formats/Gif/LzwDecoder.cs | 1 - src/ImageSharp/Formats/Gif/LzwEncoder.cs | 1 - .../Jpeg/Components/Decoder/IJpegComponent.cs | 1 - .../Jpeg/Components/Decoder/IRawJpegData.cs | 2 - .../Decoder/JpegBlockPostProcessor.cs | 1 - .../Jpeg/Components/Decoder/JpegComponent.cs | 2 - .../Decoder/JpegComponentPostProcessor.cs | 2 - .../Decoder/JpegImagePostProcessor.cs | 2 - .../Formats/Jpeg/Components/SizeExtensions.cs | 2 - .../Formats/Jpeg/JpegDecoderCore.cs | 3 - src/ImageSharp/Formats/Png/PngChunk.cs | 2 +- src/ImageSharp/Formats/Png/PngDecoderCore.cs | 1 - src/ImageSharp/Formats/Png/PngEncoderCore.cs | 1 - src/ImageSharp/Formats/Png/PngThrowHelper.cs | 1 - src/ImageSharp/Formats/Png/Zlib/Deflater.cs | 2 +- .../Formats/Png/Zlib/DeflaterEngine.cs | 2 +- .../Formats/Png/Zlib/DeflaterHuffman.cs | 2 +- .../Formats/Png/Zlib/DeflaterOutputStream.cs | 2 +- .../Formats/Png/Zlib/DeflaterPendingBuffer.cs | 2 +- .../Formats/Png/Zlib/ZlibDeflateStream.cs | 2 +- src/ImageSharp/Formats/Tga/TgaDecoderCore.cs | 1 - src/ImageSharp/Formats/Tga/TgaEncoderCore.cs | 2 - .../IO/DoubleBufferedStreamReader.cs | 2 +- src/ImageSharp/Image.Decode.cs | 1 - src/ImageSharp/Image.cs | 1 - src/ImageSharp/ImageFrame.cs | 4 +- src/ImageSharp/ImageFrame{TPixel}.cs | 2 - src/ImageSharp/ImageInfoExtensions.cs | 2 - src/ImageSharp/ImageSharp.csproj | 6 +- src/ImageSharp/Image{TPixel}.cs | 1 - .../Memory/Allocators/AllocationOptions.cs | 4 +- .../ArrayPoolMemoryAllocator.Buffer{T}.cs | 8 +- ...oolMemoryAllocator.CommonFactoryMethods.cs | 2 +- .../Allocators/ArrayPoolMemoryAllocator.cs | 2 +- .../Memory/Allocators/IManagedByteBuffer.cs | 2 +- .../Allocators/Internals/BasicArrayBuffer.cs | 3 +- .../Allocators/Internals/BasicByteBuffer.cs | 2 +- .../Allocators/Internals/ManagedBufferBase.cs | 2 +- .../Memory/Allocators/MemoryAllocator.cs | 2 +- .../Allocators/SimpleGcMemoryAllocator.cs | 5 +- src/ImageSharp/Memory/Buffer2DExtensions.cs | 2 - src/ImageSharp/Memory/Buffer2D{T}.cs | 4 +- src/ImageSharp/Memory/BufferArea{T}.cs | 2 - .../Memory/MemoryAllocatorExtensions.cs | 3 - src/ImageSharp/Memory/MemorySource.cs | 2 - src/ImageSharp/Memory/RowInterval.cs | 5 +- .../Metadata/Profiles/Exif/ExifProfile.cs | 1 - .../Metadata/Profiles/Exif/ExifReader.cs | 1 - .../Metadata/Profiles/Exif/ExifWriter.cs | 1 - .../Profiles/Exif/Tags/ExifTag.Number.cs | 2 - .../Profiles/Exif/Tags/ExifTag.NumberArray.cs | 2 - .../Profiles/Exif/Tags/ExifTag.Rational.cs | 2 - .../Exif/Tags/ExifTag.RationalArray.cs | 2 - .../Exif/Tags/ExifTag.SignedRational.cs | 2 - .../Exif/Tags/ExifTag.SignedRationalArray.cs | 2 - .../Profiles/Exif/Values/ExifNumber.cs | 1 - .../Profiles/Exif/Values/ExifNumberArray.cs | 2 - .../Profiles/Exif/Values/ExifRational.cs | 1 - .../Profiles/Exif/Values/ExifRationalArray.cs | 1 - .../Exif/Values/ExifSignedRational.cs | 1 - .../Exif/Values/ExifSignedRationalArray.cs | 2 - .../ICC/DataWriter/IccDataWriter.Matrix.cs | 1 - .../IccMatrixProcessElement.cs | 2 - .../DefaultPixelBlenders.Generated.cs | 112 ------------------ .../DefaultPixelBlenders.Generated.tt | 4 - src/ImageSharp/Primitives/ColorMatrix.cs | 2 +- src/ImageSharp/Primitives/Complex64.cs | 2 +- src/ImageSharp/Primitives/ComplexVector4.cs | 2 +- src/ImageSharp/Primitives/DenseMatrix{T}.cs | 3 +- src/ImageSharp/Primitives/LongRational.cs | 2 +- .../{Core => }/Matrix3x2Extensions.cs | 6 +- src/ImageSharp/Primitives/Number.cs | 2 +- src/ImageSharp/Primitives/{Core => }/Point.cs | 2 +- .../Primitives/{Core => }/PointF.cs | 2 +- src/ImageSharp/Primitives/Rational.cs | 2 +- .../Primitives/{Core => }/Rectangle.cs | 2 +- .../Primitives/{Core => }/RectangleF.cs | 2 +- src/ImageSharp/Primitives/SignedRational.cs | 2 +- src/ImageSharp/Primitives/{Core => }/Size.cs | 2 +- src/ImageSharp/Primitives/{Core => }/SizeF.cs | 2 +- src/ImageSharp/Primitives/ValueSize.cs | 3 +- .../Processing/AffineTransformBuilder.cs | 1 - .../DefaultImageProcessorContext{TPixel}.cs | 1 - .../Binarization/BinaryDiffuseExtensions.cs | 1 - .../Binarization/BinaryDitherExtensions.cs | 1 - .../Binarization/BinaryThresholdExtensions.cs | 1 - .../Convolution/BokehBlurExtensions.cs | 1 - .../Convolution/BoxBlurExtensions.cs | 1 - .../Convolution/DetectEdgesExtensions.cs | 1 - .../Convolution/GaussianBlurExtensions.cs | 1 - .../Convolution/GaussianSharpenExtensions.cs | 1 - .../Extensions/Dithering/DiffuseExtensions.cs | 1 - .../Extensions/Dithering/DitherExtensions.cs | 1 - .../Extensions/Drawing/DrawImageExtensions.cs | 1 - .../Extensions/Effects/OilPaintExtensions.cs | 1 - .../Effects/PixelShaderExtensions.cs | 1 - .../Extensions/Effects/PixelateExtensions.cs | 1 - .../Filters/BlackWhiteExtensions.cs | 1 - .../Filters/BrightnessExtensions.cs | 1 - .../Filters/ColorBlindnessExtensions.cs | 1 - .../Extensions/Filters/ContrastExtensions.cs | 1 - .../Extensions/Filters/FilterExtensions.cs | 2 - .../Extensions/Filters/GrayscaleExtensions.cs | 1 - .../Extensions/Filters/HueExtensions.cs | 1 - .../Extensions/Filters/InvertExtensions.cs | 1 - .../Filters/KodachromeExtensions.cs | 1 - .../Extensions/Filters/LightnessExtensions.cs | 1 - .../Extensions/Filters/LomographExtensions.cs | 1 - .../Extensions/Filters/OpacityExtensions.cs | 1 - .../Extensions/Filters/PolaroidExtensions.cs | 1 - .../Extensions/Filters/SaturateExtensions.cs | 1 - .../Extensions/Filters/SepiaExtensions.cs | 1 - .../Overlays/BackgroundColorExtensions.cs | 1 - .../Extensions/Overlays/GlowExtensions.cs | 2 - .../Extensions/Overlays/VignetteExtensions.cs | 2 - .../Extensions/Transforms/CropExtensions.cs | 1 - .../Extensions/Transforms/PadExtensions.cs | 2 - .../Extensions/Transforms/ResizeExtensions.cs | 1 - .../Transforms/TransformExtensions.cs | 1 - .../Processing/IImageProcessingContext.cs | 2 - .../Processing/KnownFilterMatrices.cs | 1 - .../Processing/PositionAwarePixelShader.cs | 1 - .../BinaryErrorDiffusionProcessor.cs | 1 - .../BinaryErrorDiffusionProcessor{TPixel}.cs | 1 - .../BinaryOrderedDitherProcessor.cs | 1 - .../BinaryOrderedDitherProcessor{TPixel}.cs | 1 - .../Binarization/BinaryThresholdProcessor.cs | 1 - .../BinaryThresholdProcessor{TPixel}.cs | 1 - .../Processors/CloningImageProcessor.cs | 1 - .../CloningImageProcessor{TPixel}.cs | 3 - .../Convolution/BokehBlurProcessor.cs | 1 - .../Convolution/BokehBlurProcessor{TPixel}.cs | 3 - .../Convolution/BoxBlurProcessor.cs | 1 - .../Convolution/BoxBlurProcessor{TPixel}.cs | 2 - .../Convolution2DProcessor{TPixel}.cs | 2 - .../Convolution2PassProcessor{TPixel}.cs | 2 - .../ConvolutionProcessorHelpers.cs | 2 - .../ConvolutionProcessor{TPixel}.cs | 2 - .../EdgeDetector2DProcessor{TPixel}.cs | 2 - .../EdgeDetectorCompassProcessor{TPixel}.cs | 2 - .../Convolution/EdgeDetectorProcessor.cs | 1 - .../EdgeDetectorProcessor{TPixel}.cs | 2 - .../Convolution/GaussianBlurProcessor.cs | 1 - .../GaussianBlurProcessor{TPixel}.cs | 2 - .../Convolution/GaussianSharpenProcessor.cs | 1 - .../GaussianSharpenProcessor{TPixel}.cs | 2 - .../Convolution/KayyaliProcessor.cs | 2 - .../Convolution/Kernels/CompassKernels.cs | 2 - .../Convolution/Kernels/KayyaliKernels.cs | 2 - .../Convolution/Kernels/KirschKernels.cs | 2 - .../Kernels/LaplacianKernelFactory.cs | 2 - .../Convolution/Kernels/LaplacianKernels.cs | 2 - .../Convolution/Kernels/PrewittKernels.cs | 2 - .../Kernels/RobertsCrossKernels.cs | 2 - .../Convolution/Kernels/RobinsonKernels.cs | 2 - .../Convolution/Kernels/ScharrKernels.cs | 2 - .../Convolution/Kernels/SobelKernels.cs | 2 - .../Processors/Convolution/KirschProcessor.cs | 2 - .../Convolution/Laplacian3x3Processor.cs | 2 - .../Convolution/Laplacian5x5Processor.cs | 2 - .../LaplacianOfGaussianProcessor.cs | 2 - .../Parameters/BokehBlurKernelData.cs | 2 - .../Convolution/PrewittProcessor.cs | 2 - .../Convolution/RobertsCrossProcessor.cs | 2 - .../Convolution/RobinsonProcessor.cs | 2 - .../Processors/Convolution/ScharrProcessor.cs | 2 - .../Processors/Convolution/SobelProcessor.cs | 2 - .../Processors/Dithering/AtkinsonDiffuser.cs | 2 - .../Processors/Dithering/BurksDiffuser.cs | 2 - .../Processors/Dithering/ErrorDiffuser.cs | 1 - .../ErrorDiffusionPaletteProcessor.cs | 1 - .../ErrorDiffusionPaletteProcessor{TPixel}.cs | 1 - .../Dithering/FloydSteinbergDiffuser.cs | 2 - .../Dithering/JarvisJudiceNinkeDiffuser.cs | 2 - .../Processors/Dithering/OrderedDither.cs | 1 - .../Dithering/OrderedDitherFactory.cs | 1 - .../OrderedDitherPaletteProcessor.cs | 1 - .../OrderedDitherPaletteProcessor{TPixel}.cs | 1 - .../Dithering/PaletteDitherProcessor.cs | 1 - .../PaletteDitherProcessor{TPixel}.cs | 1 - .../Processors/Dithering/Sierra2Diffuser.cs | 2 - .../Processors/Dithering/Sierra3Diffuser.cs | 2 - .../Dithering/SierraLiteDiffuser.cs | 2 - .../Dithering/StevensonArceDiffuser.cs | 2 - .../Processors/Dithering/StuckiDiffuser.cs | 2 - .../Processors/Drawing/DrawImageProcessor.cs | 1 - .../DrawImageProcessor{TPixelBg,TPixelFg}.cs | 1 - .../Effects/OilPaintingProcessor.cs | 1 - .../Effects/OilPaintingProcessor{TPixel}.cs | 1 - .../Effects/PixelShaderProcessor.cs | 1 - .../Effects/PixelShaderProcessorBase.cs | 1 - .../Effects/PixelShaderProcessor{TPixel}.cs | 1 - .../Processors/Effects/PixelateProcessor.cs | 1 - .../Effects/PixelateProcessor{TPixel}.cs | 1 - .../PositionAwarePixelShaderProcessor.cs | 1 - ...sitionAwarePixelShaderProcessor{TPixel}.cs | 1 - .../Processors/Filters/FilterProcessor.cs | 2 - .../Filters/FilterProcessor{TPixel}.cs | 2 - .../Processors/Filters/LomographProcessor.cs | 2 - .../Filters/LomographProcessor{TPixel}.cs | 1 - .../Processors/Filters/PolaroidProcessor.cs | 2 - .../Filters/PolaroidProcessor{TPixel}.cs | 1 - .../Processors/ICloningImageProcessor.cs | 1 - .../Processing/Processors/IImageProcessor.cs | 1 - .../Processors/ImageProcessorExtensions.cs | 1 - .../Processors/ImageProcessor{TPixel}.cs | 2 - .../AdaptiveHistogramEqualizationProcessor.cs | 2 - ...eHistogramEqualizationProcessor{TPixel}.cs | 2 - ...ogramEqualizationSlidingWindowProcessor.cs | 2 - ...alizationSlidingWindowProcessor{TPixel}.cs | 2 - .../GlobalHistogramEqualizationProcessor.cs | 2 - ...lHistogramEqualizationProcessor{TPixel}.cs | 2 - .../HistogramEqualizationProcessor.cs | 1 - .../HistogramEqualizationProcessor{TPixel}.cs | 1 - .../Overlays/BackgroundColorProcessor.cs | 1 - .../BackgroundColorProcessor{TPixel}.cs | 1 - .../Processors/Overlays/GlowProcessor.cs | 2 - .../Overlays/GlowProcessor{TPixel}.cs | 1 - .../Processors/Overlays/VignetteProcessor.cs | 2 - .../Overlays/VignetteProcessor{TPixel}.cs | 1 - .../Quantization/QuantizeProcessor.cs | 1 - .../Quantization/QuantizeProcessor{TPixel}.cs | 1 - .../Quantization/QuantizedFrame{TPixel}.cs | 1 - .../Quantization/WuFrameQuantizer{TPixel}.cs | 1 - .../Transforms/AffineTransformProcessor.cs | 1 - .../AffineTransformProcessor{TPixel}.cs | 1 - .../Transforms/AutoOrientProcessor.cs | 1 - .../Transforms/AutoOrientProcessor{TPixel}.cs | 1 - .../Processors/Transforms/CropProcessor.cs | 2 - .../Transforms/CropProcessor{TPixel}.cs | 1 - .../Transforms/EntropyCropProcessor.cs | 1 - .../EntropyCropProcessor{TPixel}.cs | 1 - .../Processors/Transforms/FlipProcessor.cs | 1 - .../Transforms/FlipProcessor{TPixel}.cs | 1 - .../ProjectiveTransformProcessor.cs | 1 - .../ProjectiveTransformProcessor{TPixel}.cs | 1 - .../Transforms/Resize/ResizeHelper.cs | 1 - .../ResizeKernelMap.PeriodicKernelMap.cs | 2 +- .../Transforms/Resize/ResizeKernelMap.cs | 1 - .../Transforms/Resize/ResizeProcessor.cs | 2 - .../Resize/ResizeProcessor{TPixel}.cs | 2 - .../Transforms/Resize/ResizeWorker.cs | 2 - .../Processors/Transforms/RotateProcessor.cs | 1 - .../Transforms/RotateProcessor{TPixel}.cs | 1 - .../Processors/Transforms/SkewProcessor.cs | 1 - .../Transforms/TransformKernelMap.cs | 1 - .../Transforms/TransformProcessor.cs | 1 - .../Transforms/TransformProcessorHelpers.cs | 1 - .../Processors/Transforms/TransformUtils.cs | 1 - .../Processing/ProjectiveTransformBuilder.cs | 1 - src/ImageSharp/Processing/ResizeOptions.cs | 1 - .../ImageSharp.Benchmarks/Codecs/DecodeBmp.cs | 13 +- .../Codecs/DecodeFilteredPng.cs | 2 +- .../ImageSharp.Benchmarks/Codecs/DecodeGif.cs | 11 +- .../ImageSharp.Benchmarks/Codecs/DecodePng.cs | 9 +- .../Codecs/Jpeg/DecodeJpegParseStreamOnly.cs | 6 +- .../Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs | 9 +- .../ImageSharp.Benchmarks/General/Array2D.cs | 2 +- .../PixelBlenders/PorterDuffBulkVsPixel.cs | 2 +- tests/ImageSharp.Benchmarks/Samplers/Crop.cs | 14 ++- .../ImageSharp.Benchmarks/Samplers/Diffuse.cs | 2 +- .../ImageSharp.Benchmarks/Samplers/Rotate.cs | 2 +- tests/ImageSharp.Benchmarks/Samplers/Skew.cs | 2 +- .../Drawing/DrawImageTests.cs | 1 - .../Formats/Bmp/BmpFileHeaderTests.cs | 4 - .../Formats/GeneralFormatTests.cs | 2 +- .../Jpg/Block8x8FTests.CopyToBufferArea.cs | 2 - .../Formats/Jpg/JpegDecoderTests.cs | 2 +- .../Formats/Jpg/ParseStreamTests.cs | 1 - .../Jpg/Utils/LibJpegTools.ComponentData.cs | 1 - .../Formats/Jpg/Utils/VerifyJpeg.cs | 1 - .../Helpers/ImageMathsTests.cs | 3 - .../Helpers/ParallelHelperTests.cs | 2 - .../IO/DoubleBufferedStreamReaderTests.cs | 2 +- .../Image/ImageRotationTests.cs | 1 - ..._FileSystemPath_UseDefaultConfiguration.cs | 1 - ...s.Load_FromBytes_UseGlobalConfiguration.cs | 1 - ...Load_FromStream_UseDefaultConfiguration.cs | 1 - .../Image/ImageTests.WrapMemory.cs | 3 +- tests/ImageSharp.Tests/ImageInfoTests.cs | 1 - .../ArrayPoolMemoryAllocatorTests.cs | 2 +- .../Memory/Alocators/BufferExtensions.cs | 2 +- .../Memory/Alocators/BufferTestSuite.cs | 2 +- .../Alocators/SimpleGcMemoryAllocatorTests.cs | 2 +- .../ImageSharp.Tests/Memory/Buffer2DTests.cs | 2 - .../Memory/BufferAreaTests.cs | 1 - .../Memory/MemorySourceTests.cs | 1 - .../Metadata/ImageMetadataTests.cs | 1 - .../Profiles/Exif/ExifProfileTests.cs | 3 - .../Profiles/Exif/Values/ExifValuesTests.cs | 1 - .../DataWriter/IccDataWriter.MatrixTests.cs | 2 +- .../Numerics/RationalTests.cs | 2 - .../Numerics/SignedRationalTests.cs | 2 - .../Primitives/ColorMatrixTests.cs | 1 - .../Primitives/DenseMatrixTests.cs | 2 - .../Primitives/PointFTests.cs | 4 +- .../ImageSharp.Tests/Primitives/PointTests.cs | 2 +- .../Primitives/RectangleFTests.cs | 3 +- .../Primitives/RectangleTests.cs | 2 +- .../ImageSharp.Tests/Primitives/SizeFTests.cs | 3 +- .../ImageSharp.Tests/Primitives/SizeTests.cs | 4 +- .../BaseImageOperationsExtensionTest.cs | 1 - .../Binarization/OrderedDitherFactoryTests.cs | 1 - .../Processors/LaplacianKernelFactoryTests.cs | 1 - .../Processing/FakeImageOperationsProvider.cs | 1 - .../Processing/ImageProcessingContextTests.cs | 1 - .../Processing/Overlays/GlowTest.cs | 2 - .../Processing/Overlays/VignetteTest.cs | 2 - .../Binarization/BinaryDitherTests.cs | 1 - .../Binarization/BinaryThresholdTest.cs | 2 - .../Basic1ParameterConvolutionTests.cs | 1 - .../Processors/Convolution/BokehBlurTest.cs | 2 - .../Processors/Convolution/BoxBlurTest.cs | 1 - .../Processors/Convolution/DetectEdgesTest.cs | 1 - .../Convolution/GaussianBlurTest.cs | 1 - .../Convolution/GaussianSharpenTest.cs | 1 - .../Processors/Filters/FilterTest.cs | 2 +- .../Processors/Overlays/GlowTest.cs | 1 - .../Processors/Overlays/OverlayTestBase.cs | 1 - .../Processors/Overlays/VignetteTest.cs | 1 - .../Processors/Transforms/CropTest.cs | 1 - .../Transforms/ResizeHelperTests.cs | 1 - .../Processors/Transforms/ResizeTests.cs | 1 - .../Transforms/AffineTransformBuilderTests.cs | 1 - .../Transforms/AffineTransformTests.cs | 1 - .../Processing/Transforms/CropTest.cs | 1 - .../ProjectiveTransformBuilderTests.cs | 1 - .../Processing/Transforms/ResizeTests.cs | 1 - .../Transforms/TransformBuilderTestBase.cs | 1 - .../TestDataIcc/IccTestDataMatrix.cs | 2 +- .../TestUtilities/ApproximateFloatComparer.cs | 1 - .../ImageComparison/ExactImageComparer.cs | 2 - .../ImageDimensionsMismatchException.cs | 2 - .../ImageComparison/ImageComparer.cs | 2 - .../ImageComparison/PixelDifference.cs | 1 - .../ImageComparison/TolerantImageComparer.cs | 2 - .../ImageProviders/SolidProvider.cs | 1 - .../ReferenceCodecs/SystemDrawingBridge.cs | 10 +- .../TestUtilities/TestImageExtensions.cs | 1 - .../TestUtilities/TestMemoryAllocator.cs | 2 +- .../TestUtilities/TestUtils.cs | 1 - .../TestUtilities/Tests/ImageComparerTests.cs | 1 - .../Tests/TestEnvironmentTests.cs | 2 - 357 files changed, 113 insertions(+), 640 deletions(-) rename src/ImageSharp/Primitives/{Core => }/Matrix3x2Extensions.cs (98%) rename src/ImageSharp/Primitives/{Core => }/Point.cs (99%) rename src/ImageSharp/Primitives/{Core => }/PointF.cs (99%) rename src/ImageSharp/Primitives/{Core => }/Rectangle.cs (99%) rename src/ImageSharp/Primitives/{Core => }/RectangleF.cs (99%) rename src/ImageSharp/Primitives/{Core => }/Size.cs (99%) rename src/ImageSharp/Primitives/{Core => }/SizeF.cs (99%) diff --git a/Directory.Build.targets b/Directory.Build.targets index 3b903d36cd..e5c44f7761 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -23,8 +23,11 @@ + + + diff --git a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs index 22e6d47e9a..9bf8943b71 100644 --- a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs +++ b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Advanced { diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs index 431656ef91..f17d70a2a0 100644 --- a/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs +++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Advanced.ParallelUtils { diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs index c56337bffe..4833dbafdb 100644 --- a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs +++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs @@ -7,8 +7,6 @@ using System.Threading.Tasks; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Advanced.ParallelUtils { diff --git a/src/ImageSharp/Common/Extensions/StreamExtensions.cs b/src/ImageSharp/Common/Extensions/StreamExtensions.cs index cee3e24145..971bff3227 100644 --- a/src/ImageSharp/Common/Extensions/StreamExtensions.cs +++ b/src/ImageSharp/Common/Extensions/StreamExtensions.cs @@ -5,7 +5,6 @@ using System.Buffers; using System.IO; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs index b678e798ff..f827746015 100644 --- a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs +++ b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs index c5c9ddebe1..ff6e3a4ec6 100644 --- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs +++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs @@ -6,7 +6,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/ImageMaths.cs b/src/ImageSharp/Common/Helpers/ImageMaths.cs index 122952caeb..e7b14be420 100644 --- a/src/ImageSharp/Common/Helpers/ImageMaths.cs +++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs @@ -6,7 +6,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Common/Helpers/Vector4Utils.cs b/src/ImageSharp/Common/Helpers/Vector4Utils.cs index a4e0921d0a..594a5ff103 100644 --- a/src/ImageSharp/Common/Helpers/Vector4Utils.cs +++ b/src/ImageSharp/Common/Helpers/Vector4Utils.cs @@ -5,7 +5,6 @@ using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Configuration.cs b/src/ImageSharp/Configuration.cs index 4dba7a7e8e..9f26df300b 100644 --- a/src/ImageSharp/Configuration.cs +++ b/src/ImageSharp/Configuration.cs @@ -10,8 +10,8 @@ using SixLabors.ImageSharp.Formats.Png; using SixLabors.ImageSharp.Formats.Tga; using SixLabors.ImageSharp.IO; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Processing; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs index eda5f1f784..8d82d28fbc 100644 --- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs @@ -11,7 +11,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Bmp { diff --git a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs index 41be71d2b3..1c7c606ca6 100644 --- a/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpEncoderCore.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Bmp { diff --git a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs index b4d92b15dd..722c9c8992 100644 --- a/src/ImageSharp/Formats/Gif/GifDecoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifDecoderCore.cs @@ -10,8 +10,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs index f8b40306b8..b4aae0744b 100644 --- a/src/ImageSharp/Formats/Gif/GifEncoderCore.cs +++ b/src/ImageSharp/Formats/Gif/GifEncoderCore.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/LzwDecoder.cs b/src/ImageSharp/Formats/Gif/LzwDecoder.cs index 2ae8a834ef..0129db0e3d 100644 --- a/src/ImageSharp/Formats/Gif/LzwDecoder.cs +++ b/src/ImageSharp/Formats/Gif/LzwDecoder.cs @@ -8,7 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Gif/LzwEncoder.cs b/src/ImageSharp/Formats/Gif/LzwEncoder.cs index d809106143..eda0c5fb8c 100644 --- a/src/ImageSharp/Formats/Gif/LzwEncoder.cs +++ b/src/ImageSharp/Formats/Gif/LzwEncoder.cs @@ -8,7 +8,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Gif { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs index 2492a985a8..169b02e9fb 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IJpegComponent.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs index 2f393fadae..8075fd4bab 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/IRawJpegData.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { /// diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs index c5efb812e0..44f9048a59 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegBlockPostProcessor.cs @@ -4,7 +4,6 @@ using System; using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs index 9fa4ce6d85..622c34e9bb 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponent.cs @@ -4,8 +4,6 @@ using System; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs index e1a9380a03..39c8be3120 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegComponentPostProcessor.cs @@ -6,8 +6,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder { diff --git a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs index f3f2952b1d..0400978d2f 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/Decoder/JpegImagePostProcessor.cs @@ -7,8 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; using JpegColorConverter = SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder.ColorConverters.JpegColorConverter; namespace SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder diff --git a/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs b/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs index 48ad188561..94771aa64c 100644 --- a/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs +++ b/src/ImageSharp/Formats/Jpeg/Components/SizeExtensions.cs @@ -4,8 +4,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Formats.Jpeg.Components { /// diff --git a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs index 62765a8843..9b6a72cc97 100644 --- a/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs +++ b/src/ImageSharp/Formats/Jpeg/JpegDecoderCore.cs @@ -15,9 +15,6 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.Metadata.Profiles.Icc; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Formats.Jpeg { diff --git a/src/ImageSharp/Formats/Png/PngChunk.cs b/src/ImageSharp/Formats/Png/PngChunk.cs index 1fee4a8371..7d8498ab75 100644 --- a/src/ImageSharp/Formats/Png/PngChunk.cs +++ b/src/ImageSharp/Formats/Png/PngChunk.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngDecoderCore.cs b/src/ImageSharp/Formats/Png/PngDecoderCore.cs index 0161797128..69b341c8d4 100644 --- a/src/ImageSharp/Formats/Png/PngDecoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngDecoderCore.cs @@ -17,7 +17,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngEncoderCore.cs b/src/ImageSharp/Formats/Png/PngEncoderCore.cs index 22e3f252df..57a596bcd7 100644 --- a/src/ImageSharp/Formats/Png/PngEncoderCore.cs +++ b/src/ImageSharp/Formats/Png/PngEncoderCore.cs @@ -17,7 +17,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Quantization; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Png { diff --git a/src/ImageSharp/Formats/Png/PngThrowHelper.cs b/src/ImageSharp/Formats/Png/PngThrowHelper.cs index 00b40c50b4..dd3a054641 100644 --- a/src/ImageSharp/Formats/Png/PngThrowHelper.cs +++ b/src/ImageSharp/Formats/Png/PngThrowHelper.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace SixLabors.ImageSharp.Formats.Png diff --git a/src/ImageSharp/Formats/Png/Zlib/Deflater.cs b/src/ImageSharp/Formats/Png/Zlib/Deflater.cs index 6c4ea44d1d..7398b089bb 100644 --- a/src/ImageSharp/Formats/Png/Zlib/Deflater.cs +++ b/src/ImageSharp/Formats/Png/Zlib/Deflater.cs @@ -3,7 +3,7 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs index 0163eec0b7..7be794b5e7 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterEngine.cs @@ -4,7 +4,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs index 96ff6b6576..e8dd8a5200 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterHuffman.cs @@ -5,7 +5,7 @@ using System.Buffers; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs index 9eeb12cb08..a777e6f7db 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterOutputStream.cs @@ -3,7 +3,7 @@ using System; using System.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs b/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs index a5f00f03ca..731c9e80f0 100644 --- a/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs +++ b/src/ImageSharp/Formats/Png/Zlib/DeflaterPendingBuffer.cs @@ -4,7 +4,7 @@ using System; using System.Buffers; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs index 3c52d306f9..c723b463f8 100644 --- a/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs +++ b/src/ImageSharp/Formats/Png/Zlib/ZlibDeflateStream.cs @@ -3,7 +3,7 @@ using System; using System.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Formats.Png.Zlib { diff --git a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs index d4f42a6c36..91cc93e19d 100644 --- a/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaDecoderCore.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Tga { diff --git a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs index 9dcea142f5..a4b141f389 100644 --- a/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs +++ b/src/ImageSharp/Formats/Tga/TgaEncoderCore.cs @@ -4,14 +4,12 @@ using System; using System.Buffers.Binary; using System.IO; -using System.Numerics; using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Formats.Tga { diff --git a/src/ImageSharp/IO/DoubleBufferedStreamReader.cs b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs index 07f8928068..0345717d21 100644 --- a/src/ImageSharp/IO/DoubleBufferedStreamReader.cs +++ b/src/ImageSharp/IO/DoubleBufferedStreamReader.cs @@ -6,7 +6,7 @@ using System.IO; using System.Runtime.CompilerServices; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.IO { diff --git a/src/ImageSharp/Image.Decode.cs b/src/ImageSharp/Image.Decode.cs index db6a5e165e..e1376b4a25 100644 --- a/src/ImageSharp/Image.Decode.cs +++ b/src/ImageSharp/Image.Decode.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Image.cs b/src/ImageSharp/Image.cs index d7fed90164..a62bfed1e2 100644 --- a/src/ImageSharp/Image.cs +++ b/src/ImageSharp/Image.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageFrame.cs b/src/ImageSharp/ImageFrame.cs index 91872b21d6..fe2a2b7626 100644 --- a/src/ImageSharp/ImageFrame.cs +++ b/src/ImageSharp/ImageFrame.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. using System; - +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageFrame{TPixel}.cs b/src/ImageSharp/ImageFrame{TPixel}.cs index 64f37a3407..85454e1508 100644 --- a/src/ImageSharp/ImageFrame{TPixel}.cs +++ b/src/ImageSharp/ImageFrame{TPixel}.cs @@ -10,8 +10,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/ImageInfoExtensions.cs b/src/ImageSharp/ImageInfoExtensions.cs index dca5502d0f..abaa7c4bc4 100644 --- a/src/ImageSharp/ImageInfoExtensions.cs +++ b/src/ImageSharp/ImageInfoExtensions.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp { /// diff --git a/src/ImageSharp/ImageSharp.csproj b/src/ImageSharp/ImageSharp.csproj index 6c72696984..0fd449d90f 100644 --- a/src/ImageSharp/ImageSharp.csproj +++ b/src/ImageSharp/ImageSharp.csproj @@ -24,9 +24,9 @@ - - - + + + diff --git a/src/ImageSharp/Image{TPixel}.cs b/src/ImageSharp/Image{TPixel}.cs index 29184522f9..b7e63dc253 100644 --- a/src/ImageSharp/Image{TPixel}.cs +++ b/src/ImageSharp/Image{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp { diff --git a/src/ImageSharp/Memory/Allocators/AllocationOptions.cs b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs index 5eda00505e..4edb702ed9 100644 --- a/src/ImageSharp/Memory/Allocators/AllocationOptions.cs +++ b/src/ImageSharp/Memory/Allocators/AllocationOptions.cs @@ -1,7 +1,7 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Options for allocating buffers. diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs index 5676ab23fc..0d7e0b784f 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.Buffer{T}.cs @@ -1,12 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; using System.Buffers; using System.Runtime.InteropServices; -using SixLabors.Memory.Internals; +using SixLabors.ImageSharp.Memory.Internals; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Contains and . @@ -82,4 +82,4 @@ public ManagedByteBuffer(byte[] data, int length, ArrayPool sourcePool) public byte[] Array => this.Data; } } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs index dd6e9a8f0b..1ce2525b82 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.CommonFactoryMethods.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Contains common factory methods and configuration constants. diff --git a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs index 0905948e00..c4d92ca3c5 100644 --- a/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/ArrayPoolMemoryAllocator.cs @@ -5,7 +5,7 @@ using System.Buffers; using System.Runtime.CompilerServices; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Implements by allocating memory from . diff --git a/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs index b6d956c102..cb1f58ddba 100644 --- a/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/IManagedByteBuffer.cs @@ -3,7 +3,7 @@ using System.Buffers; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Represents a byte buffer backed by a managed array. Useful for interop with classic .NET API-s. diff --git a/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs index c0d36afd55..56057f3726 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/BasicArrayBuffer.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Runtime.CompilerServices; -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Wraps an array as an instance. diff --git a/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs index fa6a5de4c7..571ad70c5d 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/BasicByteBuffer.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Provides an based on . diff --git a/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs index e1f131693c..8909638600 100644 --- a/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs +++ b/src/ImageSharp/Memory/Allocators/Internals/ManagedBufferBase.cs @@ -4,7 +4,7 @@ using System.Buffers; using System.Runtime.InteropServices; -namespace SixLabors.Memory.Internals +namespace SixLabors.ImageSharp.Memory.Internals { /// /// Provides a base class for implementations by implementing pinning logic for adaption. diff --git a/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs index 24ed7bef38..20598c3e3a 100644 --- a/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/MemoryAllocator.cs @@ -3,7 +3,7 @@ using System.Buffers; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Memory managers are used to allocate memory for image processing operations. diff --git a/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs index acf17ad63d..54b64b131f 100644 --- a/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs +++ b/src/ImageSharp/Memory/Allocators/SimpleGcMemoryAllocator.cs @@ -1,11 +1,10 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System; using System.Buffers; -using SixLabors.Memory.Internals; +using SixLabors.ImageSharp.Memory.Internals; -namespace SixLabors.Memory +namespace SixLabors.ImageSharp.Memory { /// /// Implements by newing up arrays by the GC on every allocation requests. diff --git a/src/ImageSharp/Memory/Buffer2DExtensions.cs b/src/ImageSharp/Memory/Buffer2DExtensions.cs index 35d55ba590..ba4f9c925d 100644 --- a/src/ImageSharp/Memory/Buffer2DExtensions.cs +++ b/src/ImageSharp/Memory/Buffer2DExtensions.cs @@ -6,8 +6,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/Buffer2D{T}.cs b/src/ImageSharp/Memory/Buffer2D{T}.cs index 69dff78c17..6b7f3bf42f 100644 --- a/src/ImageSharp/Memory/Buffer2D{T}.cs +++ b/src/ImageSharp/Memory/Buffer2D{T}.cs @@ -4,8 +4,6 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// @@ -16,7 +14,7 @@ namespace SixLabors.ImageSharp.Memory /// Before RC1, this class might be target of API changes, use it on your own risk! /// /// The value type. - // TODO: Consider moving this type to the SixLabors.Memory namespace (SixLabors.Core). + // TODO: Consider moving this type to the SixLabors.ImageSharp.Memory namespace (SixLabors.Core). public sealed class Buffer2D : IDisposable where T : struct { diff --git a/src/ImageSharp/Memory/BufferArea{T}.cs b/src/ImageSharp/Memory/BufferArea{T}.cs index 38f0b8129d..08731846e8 100644 --- a/src/ImageSharp/Memory/BufferArea{T}.cs +++ b/src/ImageSharp/Memory/BufferArea{T}.cs @@ -3,8 +3,6 @@ using System; using System.Runtime.CompilerServices; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs index a3fa0e1ff1..6e317bb8f6 100644 --- a/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs +++ b/src/ImageSharp/Memory/MemoryAllocatorExtensions.cs @@ -3,9 +3,6 @@ using System.Buffers; -using SixLabors.Memory; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/MemorySource.cs b/src/ImageSharp/Memory/MemorySource.cs index f0b0ab0281..54f1bb0d1f 100644 --- a/src/ImageSharp/Memory/MemorySource.cs +++ b/src/ImageSharp/Memory/MemorySource.cs @@ -4,8 +4,6 @@ using System; using System.Buffers; -using SixLabors.Memory; - namespace SixLabors.ImageSharp.Memory { /// diff --git a/src/ImageSharp/Memory/RowInterval.cs b/src/ImageSharp/Memory/RowInterval.cs index 13037c889f..c2962cfe97 100644 --- a/src/ImageSharp/Memory/RowInterval.cs +++ b/src/ImageSharp/Memory/RowInterval.cs @@ -1,10 +1,8 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Memory { /// @@ -13,7 +11,6 @@ namespace SixLabors.ImageSharp.Memory /// /// Before RC1, this class might be target of API changes, use it on your own risk! /// - // TODO: Consider moving this type to the SixLabors.Memory namespace (SixLabors.Core). public readonly struct RowInterval : IEquatable { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs index f98a1f3c74..c2a731825a 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifProfile.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.IO; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs index 00410fb597..6ad8d24fa4 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifReader.cs @@ -7,7 +7,6 @@ using System.Collections.ObjectModel; using System.Runtime.CompilerServices; using System.Text; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs index 48b0fddca7..c068461b2f 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/ExifWriter.cs @@ -5,7 +5,6 @@ using System.Buffers.Binary; using System.Collections.Generic; using System.Text; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs index 7f6be3c4d6..6cea52b1a5 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Number.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs index b4feba056d..b515ab36a5 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.NumberArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs index db52bbb222..f1364b2c37 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.Rational.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs index ece06c2475..63b10e3e22 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.RationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs index 58a7134118..29d61db88c 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRational.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs index 4022f5c1a8..9a6e3063b0 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Tags/ExifTag.SignedRationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { /// diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs index 8d886d21c5..ef7d20c855 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumber.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs index a7ecf7bc8b..521cfc0857 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifNumberArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { internal sealed class ExifNumberArray : ExifArrayValue diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs index 2806386b55..3ab77ab321 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRational.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs index ae4fb0c57b..f78e363da4 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifRationalArray.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs index 2a4051601b..61fba979b3 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRational.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Globalization; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { diff --git a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs index 6c6bb0a4af..2545bd9b27 100644 --- a/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs +++ b/src/ImageSharp/Metadata/Profiles/Exif/Values/ExifSignedRationalArray.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Exif { internal sealed class ExifSignedRationalArray : ExifArrayValue diff --git a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs index b0bd377cb3..585892e96a 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/DataWriter/IccDataWriter.Matrix.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { diff --git a/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs b/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs index 0d8683397a..668883e1ae 100644 --- a/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs +++ b/src/ImageSharp/Metadata/Profiles/ICC/MultiProcessElements/IccMatrixProcessElement.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Metadata.Profiles.Icc { /// diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs index 51ee5d12d9..4075b664ce 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.cs @@ -4,10 +4,6 @@ // using System; using System.Numerics; -using System.Buffers; - -using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { @@ -26,7 +22,6 @@ internal static class DefaultPixelBlenders where TPixel : struct, IPixel { - /// /// A pixel blender that implements the "NormalSrc" composition equation. /// @@ -65,7 +60,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplySrc" composition equation. /// @@ -104,7 +98,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddSrc" composition equation. /// @@ -143,7 +136,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractSrc" composition equation. /// @@ -182,7 +174,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenSrc" composition equation. /// @@ -221,7 +212,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenSrc" composition equation. /// @@ -260,7 +250,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenSrc" composition equation. /// @@ -299,7 +288,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlaySrc" composition equation. /// @@ -338,7 +326,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightSrc" composition equation. /// @@ -377,7 +364,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalSrcAtop" composition equation. /// @@ -416,7 +402,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplySrcAtop" composition equation. /// @@ -455,7 +440,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddSrcAtop" composition equation. /// @@ -494,7 +478,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractSrcAtop" composition equation. /// @@ -533,7 +516,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenSrcAtop" composition equation. /// @@ -572,7 +554,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenSrcAtop" composition equation. /// @@ -611,7 +592,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenSrcAtop" composition equation. /// @@ -650,7 +630,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlaySrcAtop" composition equation. /// @@ -689,7 +668,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightSrcAtop" composition equation. /// @@ -728,7 +706,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalSrcOver" composition equation. /// @@ -767,7 +744,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplySrcOver" composition equation. /// @@ -806,7 +782,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddSrcOver" composition equation. /// @@ -845,7 +820,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractSrcOver" composition equation. ///
@@ -884,7 +858,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenSrcOver" composition equation. ///
@@ -923,7 +896,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenSrcOver" composition equation. ///
@@ -962,7 +934,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenSrcOver" composition equation. ///
@@ -1001,7 +972,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlaySrcOver" composition equation. ///
@@ -1040,7 +1010,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightSrcOver" composition equation. ///
@@ -1079,7 +1048,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalSrcIn" composition equation. ///
@@ -1118,7 +1086,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplySrcIn" composition equation. ///
@@ -1157,7 +1124,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddSrcIn" composition equation. ///
@@ -1196,7 +1162,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractSrcIn" composition equation. ///
@@ -1235,7 +1200,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenSrcIn" composition equation. ///
@@ -1274,7 +1238,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenSrcIn" composition equation. ///
@@ -1313,7 +1276,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenSrcIn" composition equation. ///
@@ -1352,7 +1314,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlaySrcIn" composition equation. ///
@@ -1391,7 +1352,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightSrcIn" composition equation. ///
@@ -1430,7 +1390,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalSrcOut" composition equation. ///
@@ -1469,7 +1428,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplySrcOut" composition equation. ///
@@ -1508,7 +1466,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddSrcOut" composition equation. ///
@@ -1547,7 +1504,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractSrcOut" composition equation. ///
@@ -1586,7 +1542,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenSrcOut" composition equation. ///
@@ -1625,7 +1580,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenSrcOut" composition equation. ///
@@ -1664,7 +1618,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenSrcOut" composition equation. ///
@@ -1703,7 +1656,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlaySrcOut" composition equation. ///
@@ -1742,7 +1694,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightSrcOut" composition equation. ///
@@ -1781,7 +1732,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalDest" composition equation. ///
@@ -1820,7 +1770,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyDest" composition equation. ///
@@ -1859,7 +1808,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddDest" composition equation. ///
@@ -1898,7 +1846,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractDest" composition equation. ///
@@ -1937,7 +1884,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenDest" composition equation. /// @@ -1976,7 +1922,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenDest" composition equation. /// @@ -2015,7 +1960,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenDest" composition equation. /// @@ -2054,7 +1998,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayDest" composition equation. /// @@ -2093,7 +2036,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightDest" composition equation. /// @@ -2132,7 +2074,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalDestAtop" composition equation. /// @@ -2171,7 +2112,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyDestAtop" composition equation. /// @@ -2210,7 +2150,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddDestAtop" composition equation. /// @@ -2249,7 +2188,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractDestAtop" composition equation. /// @@ -2288,7 +2226,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenDestAtop" composition equation. /// @@ -2327,7 +2264,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenDestAtop" composition equation. /// @@ -2366,7 +2302,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenDestAtop" composition equation. /// @@ -2405,7 +2340,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayDestAtop" composition equation. /// @@ -2444,7 +2378,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightDestAtop" composition equation. /// @@ -2483,7 +2416,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalDestOver" composition equation. /// @@ -2522,7 +2454,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyDestOver" composition equation. /// @@ -2561,7 +2492,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddDestOver" composition equation. /// @@ -2600,7 +2530,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractDestOver" composition equation. /// @@ -2639,7 +2568,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenDestOver" composition equation. /// @@ -2678,7 +2606,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenDestOver" composition equation. /// @@ -2717,7 +2644,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenDestOver" composition equation. /// @@ -2756,7 +2682,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayDestOver" composition equation. /// @@ -2795,7 +2720,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightDestOver" composition equation. /// @@ -2834,7 +2758,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalDestIn" composition equation. /// @@ -2873,7 +2796,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyDestIn" composition equation. /// @@ -2912,7 +2834,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddDestIn" composition equation. /// @@ -2951,7 +2872,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractDestIn" composition equation. /// @@ -2990,7 +2910,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenDestIn" composition equation. /// @@ -3029,7 +2948,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenDestIn" composition equation. /// @@ -3068,7 +2986,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenDestIn" composition equation. /// @@ -3107,7 +3024,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayDestIn" composition equation. /// @@ -3146,7 +3062,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightDestIn" composition equation. /// @@ -3185,7 +3100,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalDestOut" composition equation. /// @@ -3224,7 +3138,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyDestOut" composition equation. /// @@ -3263,7 +3176,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddDestOut" composition equation. /// @@ -3302,7 +3214,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractDestOut" composition equation. /// @@ -3341,7 +3252,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenDestOut" composition equation. /// @@ -3380,7 +3290,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenDestOut" composition equation. /// @@ -3419,7 +3328,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenDestOut" composition equation. /// @@ -3458,7 +3366,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayDestOut" composition equation. /// @@ -3497,7 +3404,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightDestOut" composition equation. /// @@ -3536,7 +3442,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalClear" composition equation. /// @@ -3575,7 +3480,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyClear" composition equation. /// @@ -3614,7 +3518,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddClear" composition equation. /// @@ -3653,7 +3556,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractClear" composition equation. /// @@ -3692,7 +3594,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenClear" composition equation. /// @@ -3731,7 +3632,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenClear" composition equation. /// @@ -3770,7 +3670,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenClear" composition equation. /// @@ -3809,7 +3708,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayClear" composition equation. /// @@ -3848,7 +3746,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightClear" composition equation. /// @@ -3887,7 +3784,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "NormalXor" composition equation. /// @@ -3926,7 +3822,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "MultiplyXor" composition equation. /// @@ -3965,7 +3860,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "AddXor" composition equation. /// @@ -4004,7 +3898,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "SubtractXor" composition equation. /// @@ -4043,7 +3936,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "ScreenXor" composition equation. /// @@ -4082,7 +3974,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "DarkenXor" composition equation. /// @@ -4121,7 +4012,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "LightenXor" composition equation. /// @@ -4160,7 +4050,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "OverlayXor" composition equation. /// @@ -4199,7 +4088,6 @@ protected override void BlendFunction(Span destination, ReadOnlySpan /// A pixel blender that implements the "HardLightXor" composition equation. /// diff --git a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt index 55eb01df31..ccb98c495e 100644 --- a/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt +++ b/src/ImageSharp/PixelFormats/PixelBlenders/DefaultPixelBlenders.Generated.tt @@ -14,10 +14,6 @@ // using System; using System.Numerics; -using System.Buffers; - -using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.PixelFormats.PixelBlenders { diff --git a/src/ImageSharp/Primitives/ColorMatrix.cs b/src/ImageSharp/Primitives/ColorMatrix.cs index 11886c9c2a..477d120faf 100644 --- a/src/ImageSharp/Primitives/ColorMatrix.cs +++ b/src/ImageSharp/Primitives/ColorMatrix.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.Runtime.InteropServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// A structure encapsulating a 5x4 matrix used for transforming the color and alpha components of an image. diff --git a/src/ImageSharp/Primitives/Complex64.cs b/src/ImageSharp/Primitives/Complex64.cs index 96883229c4..a5af3f2f71 100644 --- a/src/ImageSharp/Primitives/Complex64.cs +++ b/src/ImageSharp/Primitives/Complex64.cs @@ -5,7 +5,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a complex number, where the real and imaginary parts are stored as values. diff --git a/src/ImageSharp/Primitives/ComplexVector4.cs b/src/ImageSharp/Primitives/ComplexVector4.cs index b90da65b2d..5287ab23ff 100644 --- a/src/ImageSharp/Primitives/ComplexVector4.cs +++ b/src/ImageSharp/Primitives/ComplexVector4.cs @@ -5,7 +5,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// A vector with 4 values of type . diff --git a/src/ImageSharp/Primitives/DenseMatrix{T}.cs b/src/ImageSharp/Primitives/DenseMatrix{T}.cs index cc5e4a90a3..4229e69e78 100644 --- a/src/ImageSharp/Primitives/DenseMatrix{T}.cs +++ b/src/ImageSharp/Primitives/DenseMatrix{T}.cs @@ -4,9 +4,8 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -using SixLabors.Primitives; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a dense matrix with arbitrary elements. diff --git a/src/ImageSharp/Primitives/LongRational.cs b/src/ImageSharp/Primitives/LongRational.cs index b15aa4022f..d0f56917e1 100644 --- a/src/ImageSharp/Primitives/LongRational.cs +++ b/src/ImageSharp/Primitives/LongRational.cs @@ -5,7 +5,7 @@ using System.Globalization; using System.Text; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs similarity index 98% rename from src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs rename to src/ImageSharp/Primitives/Matrix3x2Extensions.cs index 2d33ea70d6..4ddbcc0173 100644 --- a/src/ImageSharp/Primitives/Core/Matrix3x2Extensions.cs +++ b/src/ImageSharp/Primitives/Matrix3x2Extensions.cs @@ -1,9 +1,9 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System.Numerics; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Extension methods for the struct. @@ -98,4 +98,4 @@ public static class Matrix3x2Extensions /// A rotation matrix. public static Matrix3x2 CreateRotationDegrees(float degrees, PointF centerPoint) => Matrix3x2.CreateRotation(GeometryUtilities.DegreeToRadian(degrees), centerPoint); } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Primitives/Number.cs b/src/ImageSharp/Primitives/Number.cs index 88974e72b6..3d575e866b 100644 --- a/src/ImageSharp/Primitives/Number.cs +++ b/src/ImageSharp/Primitives/Number.cs @@ -5,7 +5,7 @@ using System.Globalization; using System.Runtime.InteropServices; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an integral number. diff --git a/src/ImageSharp/Primitives/Core/Point.cs b/src/ImageSharp/Primitives/Point.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Point.cs rename to src/ImageSharp/Primitives/Point.cs index ec57330411..96e73766b9 100644 --- a/src/ImageSharp/Primitives/Core/Point.cs +++ b/src/ImageSharp/Primitives/Point.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an ordered pair of integer x- and y-coordinates that defines a point in diff --git a/src/ImageSharp/Primitives/Core/PointF.cs b/src/ImageSharp/Primitives/PointF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/PointF.cs rename to src/ImageSharp/Primitives/PointF.cs index 4a2da5cdcd..e43ad4daf1 100644 --- a/src/ImageSharp/Primitives/Core/PointF.cs +++ b/src/ImageSharp/Primitives/PointF.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Represents an ordered pair of single precision floating point x- and y-coordinates that defines a point in diff --git a/src/ImageSharp/Primitives/Rational.cs b/src/ImageSharp/Primitives/Rational.cs index f9299bc178..212178a246 100644 --- a/src/ImageSharp/Primitives/Rational.cs +++ b/src/ImageSharp/Primitives/Rational.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Rectangle.cs b/src/ImageSharp/Primitives/Rectangle.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Rectangle.cs rename to src/ImageSharp/Primitives/Rectangle.cs index 8600e2e4c8..95b01fd9d6 100644 --- a/src/ImageSharp/Primitives/Core/Rectangle.cs +++ b/src/ImageSharp/Primitives/Rectangle.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores a set of four integers that represent the location and size of a rectangle. diff --git a/src/ImageSharp/Primitives/Core/RectangleF.cs b/src/ImageSharp/Primitives/RectangleF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/RectangleF.cs rename to src/ImageSharp/Primitives/RectangleF.cs index c8b58f4ede..354daa4463 100644 --- a/src/ImageSharp/Primitives/Core/RectangleF.cs +++ b/src/ImageSharp/Primitives/RectangleF.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores a set of four single precision floating points that represent the location and size of a rectangle. diff --git a/src/ImageSharp/Primitives/SignedRational.cs b/src/ImageSharp/Primitives/SignedRational.cs index 395a24b14e..93a0ffe39f 100644 --- a/src/ImageSharp/Primitives/SignedRational.cs +++ b/src/ImageSharp/Primitives/SignedRational.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a number that can be expressed as a fraction. diff --git a/src/ImageSharp/Primitives/Core/Size.cs b/src/ImageSharp/Primitives/Size.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/Size.cs rename to src/ImageSharp/Primitives/Size.cs index e0eb6484ce..effd657a6c 100644 --- a/src/ImageSharp/Primitives/Core/Size.cs +++ b/src/ImageSharp/Primitives/Size.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores an ordered pair of integers, which specify a height and width. diff --git a/src/ImageSharp/Primitives/Core/SizeF.cs b/src/ImageSharp/Primitives/SizeF.cs similarity index 99% rename from src/ImageSharp/Primitives/Core/SizeF.cs rename to src/ImageSharp/Primitives/SizeF.cs index 5d503a705d..7d9bc58146 100644 --- a/src/ImageSharp/Primitives/Core/SizeF.cs +++ b/src/ImageSharp/Primitives/SizeF.cs @@ -6,7 +6,7 @@ using System.Numerics; using System.Runtime.CompilerServices; -namespace SixLabors.Primitives +namespace SixLabors.ImageSharp { /// /// Stores an ordered pair of single precision floating points, which specify a height and width. diff --git a/src/ImageSharp/Primitives/ValueSize.cs b/src/ImageSharp/Primitives/ValueSize.cs index 577e9187a6..be2ccb7251 100644 --- a/src/ImageSharp/Primitives/ValueSize.cs +++ b/src/ImageSharp/Primitives/ValueSize.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; -namespace SixLabors.ImageSharp.Primitives +namespace SixLabors.ImageSharp { /// /// Represents a value in relation to a value on the image. diff --git a/src/ImageSharp/Processing/AffineTransformBuilder.cs b/src/ImageSharp/Processing/AffineTransformBuilder.cs index c3d01241c9..90e00924ad 100644 --- a/src/ImageSharp/Processing/AffineTransformBuilder.cs +++ b/src/ImageSharp/Processing/AffineTransformBuilder.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs index 5d986b6ccc..a4a3f9b3d4 100644 --- a/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs +++ b/src/ImageSharp/Processing/DefaultImageProcessorContext{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs index 760102aacf..66337f669e 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDiffuseExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs index e8ce252a2d..afd4a49418 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryDitherExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs b/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs index 35aa681e33..d4fe9b562e 100644 --- a/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Binarization/BinaryThresholdExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Binarization; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs index 2bbdd03b05..7e0b3df390 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/BokehBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs index 42dfd425cc..4534e474a9 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/BoxBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs index 837b26910d..53b2d40b0d 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/DetectEdgesExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs index 858e3213b1..9c40d94ed7 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/GaussianBlurExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs b/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs index 79f4a0cc30..007fffb1a2 100644 --- a/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Convolution/GaussianSharpenExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs b/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs index 45eb932fe1..92d312fdf6 100644 --- a/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Dithering/DiffuseExtensions.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs index f83a9e9e81..f58b025f3a 100644 --- a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs index 6c79984378..4717c09eaf 100644 --- a/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Drawing/DrawImageExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Drawing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs index 1aa98c8c1b..5216172819 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/OilPaintExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs index b866e7fb14..00fd542672 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/PixelShaderExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs b/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs index bf40af91ad..f2a10532d0 100644 --- a/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Effects/PixelateExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Effects; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs index c148ccbcb9..788677fc80 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/BlackWhiteExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs index 8e43f06c5a..7bc441297e 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/BrightnessExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs index b8d503955e..e214c5a164 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/ColorBlindnessExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs index bdfd7c98a4..4a3e460b85 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/ContrastExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs index 662e3a6e16..088f618840 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/FilterExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs index d87c40226c..4125de8321 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/GrayscaleExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing.Processors; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs index 3955ea7f6e..ef1fa2a6ec 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/HueExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs index 16c7a89178..0642db849d 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/InvertExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs index 6c9b279835..eadbde7bc0 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/KodachromeExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs index 86db9509e8..d68cb6aacb 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/LightnessExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs index c2b6ac0804..84b11c5e71 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/LomographExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs index 9c67113ecf..2cf6085f34 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/OpacityExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs index 6b6d43d5b8..94ced7108d 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/PolaroidExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs index a94a9a407d..f68c424bdc 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/SaturateExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs b/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs index df32307f47..629ba03e77 100644 --- a/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Filters/SepiaExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs index 4241721f46..d068ba10b5 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/BackgroundColorExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs index 48ecb5108f..d5114e30ab 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/GlowExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs index a1f3a6e8a0..799b30e01e 100644 --- a/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Overlays/VignetteExtensions.cs @@ -1,9 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs index 7ec85169e2..5fc8125ea8 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/CropExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs index 270380084f..33a6fc36d6 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/PadExtensions.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing { /// diff --git a/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs index f494ed9094..882b177214 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/ResizeExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs index 7fffb71d20..6305649557 100644 --- a/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Transforms/TransformExtensions.cs @@ -4,7 +4,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/IImageProcessingContext.cs b/src/ImageSharp/Processing/IImageProcessingContext.cs index e10c14088f..8b57a289d4 100644 --- a/src/ImageSharp/Processing/IImageProcessingContext.cs +++ b/src/ImageSharp/Processing/IImageProcessingContext.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/KnownFilterMatrices.cs b/src/ImageSharp/Processing/KnownFilterMatrices.cs index 31b19433c7..268281e4fe 100644 --- a/src/ImageSharp/Processing/KnownFilterMatrices.cs +++ b/src/ImageSharp/Processing/KnownFilterMatrices.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; // Many of these matrices are translated from Chromium project where // SkScalar[] is memory-mapped to a row-major matrix. diff --git a/src/ImageSharp/Processing/PositionAwarePixelShader.cs b/src/ImageSharp/Processing/PositionAwarePixelShader.cs index 1ae3ba295a..c87d3ada6b 100644 --- a/src/ImageSharp/Processing/PositionAwarePixelShader.cs +++ b/src/ImageSharp/Processing/PositionAwarePixelShader.cs @@ -3,7 +3,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs index caedf87ba6..2878539795 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs index cdea1780fc..262e9d0242 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryErrorDiffusionProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs index 6a2ee7623e..1626bbe80e 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs index 64fb617c6d..66b92d1ce3 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryOrderedDitherProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Dithering; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs index 102232b132..7bfb024461 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs index 45cb1d9f70..380ce64d24 100644 --- a/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Binarization/BinaryThresholdProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Binarization { diff --git a/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs b/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs index 3b88cf7f07..92c84a9456 100644 --- a/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/CloningImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs index 780bec22cf..c539861f9b 100644 --- a/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/CloningImageProcessor{TPixel}.cs @@ -2,10 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections.Generic; -using System.Linq; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs index 477c3da9ad..6bb02f1d14 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs index 6ffda59a85..316579da70 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BokehBlurProcessor{TPixel}.cs @@ -11,10 +11,7 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs index 94ecce9d1a..7ca4b6c6f3 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs index f127fc1a8a..095c91bac0 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/BoxBlurProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs index 44faf3eb1b..c2b85a4ab8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2DProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs index 5182d90b16..32bdf6bc5c 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Convolution2PassProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs index 661ab523db..34b085fc6e 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessorHelpers.cs @@ -3,8 +3,6 @@ using System; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { internal static class ConvolutionProcessorHelpers diff --git a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs index 6f0e7914b0..285bcab279 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ConvolutionProcessor{TPixel}.cs @@ -8,8 +8,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs index dbd82191c4..31c4fad79f 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetector2DProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs index f3940bb730..c1897bed8d 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorCompassProcessor{TPixel}.cs @@ -9,9 +9,7 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs index f369d60ddc..eb7f07905b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs index e6411f8cb6..ce19ba82d4 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/EdgeDetectorProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Filters; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs index bdba8f4caf..9f511a7541 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs index 2ccd8d577a..3c1f82caa8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianBlurProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs index d1b2b3072c..b1f47863d4 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs index d61d8e6c59..f4f27a42de 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/GaussianSharpenProcessor{TPixel}.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Convolution { diff --git a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs index cc29be9837..90ed15aa33 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/KayyaliProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs index f44de9105b..423fc65917 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/CompassKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { internal abstract class CompassKernels diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs index dd4d023025..50d5bfafe4 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KayyaliKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs index 882b87075b..58568ce409 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/KirschKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs index 19f2d1161b..8371212fe8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernelFactory.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs index e7b7f965b9..f72e95ee8b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/LaplacianKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs index 381e028d49..cae9ecb5bf 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/PrewittKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs index f61220e1ec..8ffd624d21 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobertsCrossKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs index 699d669ec9..ba60bfdf64 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/RobinsonKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs index f0662c6672..ec583862f7 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/ScharrKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs b/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs index 113957c839..3dbd54a2c5 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Kernels/SobelKernels.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs index 182a30c08b..7207f95c4b 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/KirschProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs index 163420f3d4..b147a87cc8 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian3x3Processor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs index 77cfffced2..663ebf0517 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Laplacian5x5Processor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs index a8d3ff6f1b..8b0cfc6ff3 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/LaplacianOfGaussianProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs b/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs index 4338bcf6b9..5f03396bad 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/Parameters/BokehBlurKernelData.cs @@ -3,8 +3,6 @@ using System.Numerics; -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution.Parameters { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs index dcb20573a8..7fc54ff967 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/PrewittProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs index 84b6854676..74d5094f53 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/RobertsCrossProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs index 34c4ab35a2..18ac906140 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/RobinsonProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs index 76a4ae08d8..24248204b6 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/ScharrProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs index 185ac891dd..1ab56d1203 100644 --- a/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Convolution/SobelProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Convolution { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs index f167ac5cb9..9cf10ce591 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/AtkinsonDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs index 3c1ff75f4c..152704ec26 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/BurksDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs index 7911c6ca96..d6ccfb3694 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffuser.cs @@ -6,7 +6,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs index 48ad546f2f..0598160655 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs index ff4b6de520..f0c8610ed7 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/ErrorDiffusionPaletteProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs index ca0e3c647e..b3137337b4 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/FloydSteinbergDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs index 682db83523..40cf792662 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/JarvisJudiceNinkeDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs index 174732f802..34eff4fe94 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDither.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs index 4b93c42590..f4835f4214 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherFactory.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Runtime.CompilerServices; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs index d66ce21921..e28c662f89 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs index 6568033ea3..29baa9750f 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/OrderedDitherPaletteProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs index a8f46f3adf..0a1552c115 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor.cs @@ -4,7 +4,6 @@ using System; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs index 10c9a421e9..c9f09fc628 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/PaletteDitherProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Dithering { diff --git a/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs index 03791bff25..001df19af1 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/Sierra2Diffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs index c7d7acc82f..3e56c63b3b 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/Sierra3Diffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs index e969f1b70b..763695d661 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/SierraLiteDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs index 61727325ab..72ff30c114 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/StevensonArceDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs b/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs index 76203201cc..78e8fb4e49 100644 --- a/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs +++ b/src/ImageSharp/Processing/Processors/Dithering/StuckiDiffuser.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Dithering { /// diff --git a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs index e1dbefdb66..032a0aab01 100644 --- a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Drawing { diff --git a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs index 55f72c7fc9..a8b9093e5e 100644 --- a/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs +++ b/src/ImageSharp/Processing/Processors/Drawing/DrawImageProcessor{TPixelBg,TPixelFg}.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Drawing { diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs index 0e11020ebb..a35e4d828b 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs index f143e5643e..3bc6e7eac3 100644 --- a/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/OilPaintingProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs index 2d43fd53c1..fef80dfc46 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs index 9cee3779d7..681f44651f 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessorBase.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs index a4338423e0..244cfe3a70 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelShaderProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System.Numerics; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs index 9b67545e54..a71f8424fc 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs index d15bfc0077..df85afc5eb 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PixelateProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Common; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs index 46d2e31cf0..7494f6ffc0 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs index db2d85bfcf..a539b5105f 100644 --- a/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Effects/PositionAwarePixelShaderProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using System.Numerics; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Effects { diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs index 028060f66c..1542c6836b 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs index 86d990a387..28a5837dea 100644 --- a/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/FilterProcessor{TPixel}.cs @@ -6,8 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs index 8836bd62cf..3c150d7ebf 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Filters { /// diff --git a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs index 30731fcbf4..8e3759fba8 100644 --- a/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/LomographProcessor{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs index 9a8c2b518e..a5cf268625 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Filters { /// diff --git a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs index 08235e1bf0..24ee162966 100644 --- a/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Filters/PolaroidProcessor{TPixel}.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Overlays; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Filters { diff --git a/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs b/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs index 7ffa5bcc0c..ad8051e6bc 100644 --- a/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/ICloningImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/IImageProcessor.cs b/src/ImageSharp/Processing/Processors/IImageProcessor.cs index 6b9b82b10d..a9d5b20ec3 100644 --- a/src/ImageSharp/Processing/Processors/IImageProcessor.cs +++ b/src/ImageSharp/Processing/Processors/IImageProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs b/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs index 7956ecd9a4..6f486e74b5 100644 --- a/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs +++ b/src/ImageSharp/Processing/Processors/ImageProcessorExtensions.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs index 21d245a113..be8bc8e122 100644 --- a/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/ImageProcessor{TPixel}.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors { diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs index 6d8ccdca32..1fdb10661c 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs index 0e664a5984..b5b8cfe568 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs index cd29b18b9f..ff8a6b73d9 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs index 901668e1f6..987e4e392f 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/AdaptiveHistogramEqualizationSlidingWindowProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs index 288b59d6b8..3b984578b5 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Normalization { /// diff --git a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs index f75655006f..ff34457fbb 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/GlobalHistogramEqualizationProcessor{TPixel}.cs @@ -11,8 +11,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs index 7c1969ae2c..8bd619095a 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs index 8c25448d12..d7d72d4c8b 100644 --- a/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Normalization/HistogramEqualizationProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Normalization { diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs index 6531c74610..c9123bbbfb 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs index 0d9ee263a8..1c974612e9 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/BackgroundColorProcessor{TPixel}.cs @@ -8,7 +8,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs index 13936232ab..4f7ce7ba7b 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs index 3f52a1c889..d6aa6f8943 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/GlowProcessor{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs index ebec160622..9915a5f526 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs index 41f11f5af3..fd782261b2 100644 --- a/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Overlays/VignetteProcessor{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Overlays { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs index 0ac6b9b9c4..8e1dffeede 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs index 29b4c70c12..5e732982c3 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs index cbea82c1f3..4938f0e127 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizedFrame{TPixel}.cs @@ -6,7 +6,6 @@ using System.Runtime.CompilerServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Quantization { diff --git a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs index ee2751eaf2..9b5e894278 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; // TODO: Isn't an AOS ("array of structures") layout more efficient & more readable than SOA ("structure of arrays") for this particular use case? // (T, R, G, B, A, M2) could be grouped together! Investigate a ColorMoment struct. diff --git a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs index ffd5bc2d7f..849f061669 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs index 9251b95fcf..1b9ff82bf9 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AffineTransformProcessor{TPixel}.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs index e17588cd04..a059fb819a 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs index ebc81b604f..90edcfac51 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/AutoOrientProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs index 39f00e9a1e..9aa21e4dcd 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Transforms { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs index b63036a018..a286e8fa26 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/CropProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs index fdba6ed4f9..d5aaaf515e 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs index 62cd24fa00..74d719fbe7 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/EntropyCropProcessor{TPixel}.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing.Processors.Binarization; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs index 455edf6680..60e22e2d0e 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs index cbae932b85..d3afc72057 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/FlipProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs index 93ff800c8b..d8a9c3ed96 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs index f924ef3c93..56df606a77 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/ProjectiveTransformProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs index eacd3834f1..de44d32e4b 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeHelper.cs @@ -3,7 +3,6 @@ using System; using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs index 6d6e22a6a5..be2546369e 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.PeriodicKernelMap.cs @@ -1,7 +1,7 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs index 64c74a8b43..1b653a92c3 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeKernelMap.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs index 87b202ff7e..ec1f94c143 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Processing.Processors.Transforms { /// diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs index 24752ae489..2e94f88aca 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeProcessor{TPixel}.cs @@ -7,8 +7,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs index 52faac0cd8..4f5faa38e3 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/Resize/ResizeWorker.cs @@ -9,8 +9,6 @@ using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs index 0163953174..aae66e9eac 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs index 6adab8bdf3..8f1cf28ce4 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/RotateProcessor{TPixel}.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs index fb2114e03c..4d07333345 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/SkewProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System.Numerics; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs index 573120888f..a0d44cb7a1 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformKernelMap.cs @@ -7,7 +7,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs index 513e6962e8..3a0a7e54eb 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessor.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs index abc8c9d430..14eeca7cc3 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformProcessorHelpers.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs index 794645550e..e0fb554385 100644 --- a/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs +++ b/src/ImageSharp/Processing/Processors/Transforms/TransformUtils.cs @@ -4,7 +4,6 @@ using System; using System.Numerics; using System.Runtime.CompilerServices; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing.Processors.Transforms { diff --git a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs index c29941d071..0ff693d81c 100644 --- a/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs +++ b/src/ImageSharp/Processing/ProjectiveTransformBuilder.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/src/ImageSharp/Processing/ResizeOptions.cs b/src/ImageSharp/Processing/ResizeOptions.cs index ef88dc35b3..b54d2eae1c 100644 --- a/src/ImageSharp/Processing/ResizeOptions.cs +++ b/src/ImageSharp/Processing/ResizeOptions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Processing { diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs index 1ab5ed3099..6be1998fba 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeBmp.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ public void ReadImages() public string TestImage { get; set; } [Benchmark(Baseline = true, Description = "System.Drawing Bmp")] - public Size BmpSystemDrawing() + public SDSize BmpSystemDrawing() { using (var memoryStream = new MemoryStream(this.bmpBytes)) { @@ -43,15 +42,15 @@ public Size BmpSystemDrawing() } [Benchmark(Description = "ImageSharp Bmp")] - public CoreSize BmpCore() + public Size BmpCore() { using (var memoryStream = new MemoryStream(this.bmpBytes)) { using (var image = Image.Load(memoryStream)) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs index cc946e05ad..e4723d3a06 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeFilteredPng.cs @@ -6,7 +6,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; +using CoreSize = SixLabors.ImageSharp.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs index be7e853000..82dd57c299 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodeGif.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ public void ReadImages() public string TestImage { get; set; } [Benchmark(Baseline = true, Description = "System.Drawing Gif")] - public Size GifSystemDrawing() + public SDSize GifSystemDrawing() { using (var memoryStream = new MemoryStream(this.gifBytes)) { @@ -43,13 +42,13 @@ public Size GifSystemDrawing() } [Benchmark(Description = "ImageSharp Gif")] - public CoreSize GifCore() + public Size GifCore() { using (var memoryStream = new MemoryStream(this.gifBytes)) { using (var image = Image.Load(memoryStream)) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs index a19d8fa91e..b69dd36d78 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/DecodePng.cs @@ -1,13 +1,12 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs { @@ -31,7 +30,7 @@ public void ReadImages() } [Benchmark(Baseline = true, Description = "System.Drawing Png")] - public Size PngSystemDrawing() + public SDSize PngSystemDrawing() { using (var memoryStream = new MemoryStream(this.pngBytes)) { @@ -43,7 +42,7 @@ public Size PngSystemDrawing() } [Benchmark(Description = "ImageSharp Png")] - public CoreSize PngCore() + public Size PngCore() { using (var memoryStream = new MemoryStream(this.pngBytes)) { diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs index f40c15cc14..5b783dddca 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpegParseStreamOnly.cs @@ -1,11 +1,11 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using BenchmarkDotNet.Attributes; -using System.Drawing; using System.IO; +using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.Tests; +using SDSize = System.Drawing.Size; namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg { @@ -26,7 +26,7 @@ public void Setup() } [Benchmark(Baseline = true, Description = "System.Drawing FULL")] - public Size JpegSystemDrawing() + public SDSize JpegSystemDrawing() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { diff --git a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs index 17ad79e585..6a2040afc2 100644 --- a/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs +++ b/tests/ImageSharp.Benchmarks/Codecs/Jpeg/DecodeJpeg_ImageSpecific.cs @@ -1,7 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using System.Drawing; using System.IO; using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Configs; @@ -12,8 +11,8 @@ using SixLabors.ImageSharp.Formats.Jpeg; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests; -using CoreSize = SixLabors.Primitives.Size; using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; // ReSharper disable InconsistentNaming namespace SixLabors.ImageSharp.Benchmarks.Codecs.Jpeg @@ -72,7 +71,7 @@ public void ReadImages() } [Benchmark(Baseline = true, Description = "Decode Jpeg - System.Drawing")] - public Size JpegSystemDrawing() + public SDSize JpegSystemDrawing() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { @@ -84,13 +83,13 @@ public Size JpegSystemDrawing() } [Benchmark(Description = "Decode Jpeg - ImageSharp")] - public CoreSize JpegImageSharp() + public Size JpegImageSharp() { using (var memoryStream = new MemoryStream(this.jpegBytes)) { using (var image = Image.Load(memoryStream, new JpegDecoder { IgnoreMetadata = true })) { - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/General/Array2D.cs b/tests/ImageSharp.Benchmarks/General/Array2D.cs index 1f8961fcde..fe7fd2090c 100644 --- a/tests/ImageSharp.Benchmarks/General/Array2D.cs +++ b/tests/ImageSharp.Benchmarks/General/Array2D.cs @@ -5,7 +5,7 @@ using BenchmarkDotNet.Attributes; -using SixLabors.ImageSharp.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.General { diff --git a/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs b/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs index ce4e16c446..4241a12f6a 100644 --- a/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs +++ b/tests/ImageSharp.Benchmarks/PixelBlenders/PorterDuffBulkVsPixel.cs @@ -13,7 +13,7 @@ namespace SixLabors.ImageSharp.Benchmarks { - using CoreSize = SixLabors.Primitives.Size; + using CoreSize = SixLabors.ImageSharp.Size; public class PorterDuffBulkVsPixel : BenchmarkBase { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Crop.cs b/tests/ImageSharp.Benchmarks/Samplers/Crop.cs index 4fe7a365f3..e60ff8f02f 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Crop.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Crop.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; @@ -9,14 +9,16 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.Processing; -using CoreSize = SixLabors.Primitives.Size; +using SDImage = System.Drawing.Image; +using SDSize = System.Drawing.Size; +using SDRectangle = System.Drawing.Rectangle; namespace SixLabors.ImageSharp.Benchmarks { public class Crop : BenchmarkBase { [Benchmark(Baseline = true, Description = "System.Drawing Crop")] - public Size CropSystemDrawing() + public SDSize CropSystemDrawing() { using (var source = new Bitmap(800, 800)) using (var destination = new Bitmap(100, 100)) @@ -25,19 +27,19 @@ public Size CropSystemDrawing() graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.CompositingQuality = CompositingQuality.HighQuality; - graphics.DrawImage(source, new Rectangle(0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel); + graphics.DrawImage(source, new SDRectangle(0, 0, 100, 100), 0, 0, 100, 100, GraphicsUnit.Pixel); return destination.Size; } } [Benchmark(Description = "ImageSharp Crop")] - public CoreSize CropResizeCore() + public Size CropResizeCore() { using (var image = new Image(800, 800)) { image.Mutate(x => x.Crop(100, 100)); - return new CoreSize(image.Width, image.Height); + return new Size(image.Width, image.Height); } } } diff --git a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs index c2b9cdc193..e5b12a0a29 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs @@ -1,7 +1,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs b/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs index 69ff1549bd..244a0bb41d 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Rotate.cs @@ -4,7 +4,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Benchmarks/Samplers/Skew.cs b/tests/ImageSharp.Benchmarks/Samplers/Skew.cs index 559e49704b..4061120b76 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Skew.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Skew.cs @@ -4,7 +4,7 @@ using BenchmarkDotNet.Attributes; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; +using SixLabors.ImageSharp; namespace SixLabors.ImageSharp.Benchmarks.Samplers { diff --git a/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs b/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs index 202cd04c9b..d1fb54703f 100644 --- a/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs +++ b/tests/ImageSharp.Tests/Drawing/DrawImageTests.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs b/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs index 4c3fe31493..ccb57c35f1 100644 --- a/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Bmp/BmpFileHeaderTests.cs @@ -2,10 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.IO; -using System.Linq; - -using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using Xunit; diff --git a/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs b/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs index 1e28469101..ba3587a7a3 100644 --- a/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs +++ b/tests/ImageSharp.Tests/Formats/GeneralFormatTests.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp.Tests using System.Reflection; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Quantization; - using SixLabors.Memory; + using SixLabors.ImageSharp.Memory; public class GeneralFormatTests : FileTestBase { diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs index 4b1abf9094..6b803c3ae4 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Block8x8FTests.CopyToBufferArea.cs @@ -7,8 +7,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs index a9cddebc85..009f86483e 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegDecoderTests.cs @@ -6,7 +6,7 @@ using System.Linq; using SixLabors.ImageSharp.Formats.Jpeg; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs index 1d7ca746f6..44545092fd 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/ParseStreamTests.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components; using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.Tests.Formats.Jpg.Utils; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs b/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs index 91cd80d144..a4929fe809 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Utils/LibJpegTools.ComponentData.cs @@ -9,7 +9,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Formats.Jpg.Utils { diff --git a/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs b/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs index 296f424fa5..16fd352a99 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/Utils/VerifyJpeg.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Formats.Jpeg.Components.Decoder; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs index 817672f34a..16a27a9cea 100644 --- a/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ImageMathsTests.cs @@ -4,9 +4,6 @@ using System; using System.Numerics; -using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; - using Xunit; namespace SixLabors.ImageSharp.Tests.Helpers diff --git a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs index 4b5c87c7f5..93ddaefe6f 100644 --- a/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs +++ b/tests/ImageSharp.Tests/Helpers/ParallelHelperTests.cs @@ -10,8 +10,6 @@ using SixLabors.ImageSharp.Advanced.ParallelUtils; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs index 2d5e81173b..57e9dbad6e 100644 --- a/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs +++ b/tests/ImageSharp.Tests/IO/DoubleBufferedStreamReaderTests.cs @@ -4,7 +4,7 @@ using System; using System.IO; using SixLabors.ImageSharp.IO; -using SixLabors.Memory; +using SixLabors.ImageSharp.Memory; using Xunit; namespace SixLabors.ImageSharp.Tests.IO diff --git a/tests/ImageSharp.Tests/Image/ImageRotationTests.cs b/tests/ImageSharp.Tests/Image/ImageRotationTests.cs index e1c4a419e1..28196c0da1 100644 --- a/tests/ImageSharp.Tests/Image/ImageRotationTests.cs +++ b/tests/ImageSharp.Tests/Image/ImageRotationTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs index 4d3a229c55..39795fbf3d 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FileSystemPath_UseDefaultConfiguration.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs index 19887d9bcc..0632d74407 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromBytes_UseGlobalConfiguration.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs index 980ed17ceb..d9d1eb7c49 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.Load_FromStream_UseDefaultConfiguration.cs @@ -7,7 +7,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Formats.Bmp; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs index 04d05f6dc7..a018af6ed0 100644 --- a/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs +++ b/tests/ImageSharp.Tests/Image/ImageTests.WrapMemory.cs @@ -11,7 +11,6 @@ using SixLabors.ImageSharp.Common.Helpers; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; using Xunit; // ReSharper disable InconsistentNaming @@ -41,7 +40,7 @@ public BitmapMemoryManager(Bitmap bitmap) } this.bitmap = bitmap; - var rectangle = new Rectangle(0, 0, bitmap.Width, bitmap.Height); + var rectangle = new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height); this.bmpData = bitmap.LockBits(rectangle, ImageLockMode.ReadWrite, bitmap.PixelFormat); this.length = bitmap.Width * bitmap.Height; } diff --git a/tests/ImageSharp.Tests/ImageInfoTests.cs b/tests/ImageSharp.Tests/ImageInfoTests.cs index 67804a18fd..bde5f7b6a5 100644 --- a/tests/ImageSharp.Tests/ImageInfoTests.cs +++ b/tests/ImageSharp.Tests/ImageInfoTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Formats; using SixLabors.ImageSharp.Metadata; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs index 6495ca21d7..d38b5b9ddb 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/ArrayPoolMemoryAllocatorTests.cs @@ -9,7 +9,7 @@ using SixLabors.ImageSharp.Tests; using Xunit; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { // TODO: Re-enable memory-intensive tests with arcade RemoteExecutor: // https://github.com/dotnet/runtime/blob/master/docs/project/writing-tests.md#remoteexecutor diff --git a/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs index fd53db1d8d..8073d069d6 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/BufferExtensions.cs @@ -6,7 +6,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { internal static class BufferExtensions { diff --git a/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs index eca1842646..4590bbe974 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/BufferTestSuite.cs @@ -8,7 +8,7 @@ using Xunit; // ReSharper disable InconsistentNaming -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { /// /// Inherit this class to test an implementation (provided by ). diff --git a/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs index a22e9e375d..8e3b82be5b 100644 --- a/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs +++ b/tests/ImageSharp.Tests/Memory/Alocators/SimpleGcMemoryAllocatorTests.cs @@ -5,7 +5,7 @@ using System.Runtime.InteropServices; using Xunit; -namespace SixLabors.Memory.Tests +namespace SixLabors.ImageSharp.Memory.Tests { public class SimpleGcMemoryAllocatorTests { diff --git a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs index a0e4f54ac8..3b296f926c 100644 --- a/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs +++ b/tests/ImageSharp.Tests/Memory/Buffer2DTests.cs @@ -7,8 +7,6 @@ using System.Runtime.InteropServices; using SixLabors.ImageSharp.Memory; -using SixLabors.Memory; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs index 9192798628..7c93128b48 100644 --- a/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs +++ b/tests/ImageSharp.Tests/Memory/BufferAreaTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; using SixLabors.ImageSharp.Memory; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs b/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs index 535204e8dc..d940aa9874 100644 --- a/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs +++ b/tests/ImageSharp.Tests/Memory/MemorySourceTests.cs @@ -5,7 +5,6 @@ using System.Buffers; using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Memory; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs b/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs index bdca87ef7e..60d791e91e 100644 --- a/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs +++ b/tests/ImageSharp.Tests/Metadata/ImageMetadataTests.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs index 9c86d060a6..d2448f3d25 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/ExifProfileTests.cs @@ -2,16 +2,13 @@ // Licensed under the Apache License, Version 2.0. using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Reflection; using System.Text; using SixLabors.ImageSharp.Metadata; using SixLabors.ImageSharp.Metadata.Profiles.Exif; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs index d015fefc4c..5d8770acf5 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/Exif/Values/ExifValuesTests.cs @@ -1,5 +1,4 @@ using SixLabors.ImageSharp.Metadata.Profiles.Exif; -using SixLabors.ImageSharp.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Metadata.Profiles.Exif.Values diff --git a/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs b/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs index 15bf762e25..3667fda144 100644 --- a/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs +++ b/tests/ImageSharp.Tests/Metadata/Profiles/ICC/DataWriter/IccDataWriter.MatrixTests.cs @@ -8,7 +8,7 @@ namespace SixLabors.ImageSharp.Tests.Icc { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; public class IccDataWriterMatrixTests { diff --git a/tests/ImageSharp.Tests/Numerics/RationalTests.cs b/tests/ImageSharp.Tests/Numerics/RationalTests.cs index 7cdae7f602..7b3bd86fc9 100644 --- a/tests/ImageSharp.Tests/Numerics/RationalTests.cs +++ b/tests/ImageSharp.Tests/Numerics/RationalTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs b/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs index f828cf74f5..2931ab3910 100644 --- a/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs +++ b/tests/ImageSharp.Tests/Numerics/SignedRationalTests.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; - using Xunit; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs b/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs index 2fbe260ecd..80fcb4370a 100644 --- a/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs +++ b/tests/ImageSharp.Tests/Primitives/ColorMatrixTests.cs @@ -1,6 +1,5 @@ using System; using System.Globalization; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using Xunit; diff --git a/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs b/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs index d684198fa7..3e37cb30b5 100644 --- a/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs +++ b/tests/ImageSharp.Tests/Primitives/DenseMatrixTests.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Primitives diff --git a/tests/ImageSharp.Tests/Primitives/PointFTests.cs b/tests/ImageSharp.Tests/Primitives/PointFTests.cs index f02433d9a8..2bb4cc6dda 100644 --- a/tests/ImageSharp.Tests/Primitives/PointFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointFTests.cs @@ -4,12 +4,10 @@ using System; using System.Globalization; using System.Numerics; -using System.Reflection; using System.Runtime.CompilerServices; -using SixLabors.ImageSharp.Tests; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class PointFTests { diff --git a/tests/ImageSharp.Tests/Primitives/PointTests.cs b/tests/ImageSharp.Tests/Primitives/PointTests.cs index 7ad7f0b62c..8e86c72188 100644 --- a/tests/ImageSharp.Tests/Primitives/PointTests.cs +++ b/tests/ImageSharp.Tests/Primitives/PointTests.cs @@ -6,7 +6,7 @@ using System.Numerics; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class PointTests { diff --git a/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs index f83f6435a2..f0ba757160 100644 --- a/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/RectangleFTests.cs @@ -3,10 +3,9 @@ using System; using System.Globalization; -using System.Reflection; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. diff --git a/tests/ImageSharp.Tests/Primitives/RectangleTests.cs b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs index 84b15d36e0..acfbe9e61c 100644 --- a/tests/ImageSharp.Tests/Primitives/RectangleTests.cs +++ b/tests/ImageSharp.Tests/Primitives/RectangleTests.cs @@ -5,7 +5,7 @@ using System.Globalization; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. diff --git a/tests/ImageSharp.Tests/Primitives/SizeFTests.cs b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs index 5bfc8f5ef1..8cda5d4ebf 100644 --- a/tests/ImageSharp.Tests/Primitives/SizeFTests.cs +++ b/tests/ImageSharp.Tests/Primitives/SizeFTests.cs @@ -3,10 +3,9 @@ using System; using System.Globalization; -using System.Reflection; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { public class SizeFTests { diff --git a/tests/ImageSharp.Tests/Primitives/SizeTests.cs b/tests/ImageSharp.Tests/Primitives/SizeTests.cs index af4b8430d1..4aea060366 100644 --- a/tests/ImageSharp.Tests/Primitives/SizeTests.cs +++ b/tests/ImageSharp.Tests/Primitives/SizeTests.cs @@ -5,7 +5,7 @@ using System.Globalization; using Xunit; -namespace SixLabors.Primitives.Tests +namespace SixLabors.ImageSharp.Tests { /// /// Tests the struct. @@ -376,4 +376,4 @@ public void DeconstructTest(int width, int height) Assert.Equal(height, deconstructedHeight); } } -} \ No newline at end of file +} diff --git a/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs b/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs index e979781987..82c22245d2 100644 --- a/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs +++ b/tests/ImageSharp.Tests/Processing/BaseImageOperationsExtensionTest.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs b/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs index c98f910464..680db5a15b 100644 --- a/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs +++ b/tests/ImageSharp.Tests/Processing/Binarization/OrderedDitherFactoryTests.cs @@ -1,7 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Dithering; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs b/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs index 8b3524fe66..7dc0ff5678 100644 --- a/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs +++ b/tests/ImageSharp.Tests/Processing/Convolution/Processors/LaplacianKernelFactoryTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using System; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing.Processors.Convolution; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs index aecac22c0a..bd7c0245b4 100644 --- a/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs +++ b/tests/ImageSharp.Tests/Processing/FakeImageOperationsProvider.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing { diff --git a/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs b/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs index 6c2a142af4..1c6a1c7ddc 100644 --- a/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs +++ b/tests/ImageSharp.Tests/Processing/ImageProcessingContextTests.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing diff --git a/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs b/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs index 32c4c6fe74..f7d6eba974 100644 --- a/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs +++ b/tests/ImageSharp.Tests/Processing/Overlays/GlowTest.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Overlays; using SixLabors.ImageSharp.Tests.TestUtilities; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Overlays diff --git a/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs b/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs index ebf4fee317..da11edf738 100644 --- a/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs +++ b/tests/ImageSharp.Tests/Processing/Overlays/VignetteTest.cs @@ -1,11 +1,9 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Overlays; using SixLabors.ImageSharp.Tests.TestUtilities; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Overlays diff --git a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs index d3507ed4c4..13be1dd2d6 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Dithering; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs index 4ae5d60513..4fe5012377 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryThresholdTest.cs @@ -3,8 +3,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; - -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Binarization diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs index 0a10d0755f..05595eece9 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/Basic1ParameterConvolutionTests.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs index cf97ae4af5..cd3f74f8e2 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BokehBlurTest.cs @@ -8,10 +8,8 @@ using System.Text.RegularExpressions; using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Primitives; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Convolution; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs index a7cf9360cf..66e9ba2df3 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/BoxBlurTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs index 05524b20b0..0e8013a641 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/DetectEdgesTest.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; // ReSharper disable InconsistentNaming diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs index 24ed090d8a..d1a3baa5a3 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianBlurTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs index 96d223ee9f..535520cb8b 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Convolution/GaussianSharpenTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Convolution { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs index 68daa80eac..eca3da58ae 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Filters/FilterTest.cs @@ -7,7 +7,7 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Filters { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; using SixLabors.ImageSharp.Processing; [GroupOutput("Filters")] diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs index 5462a8b2da..e6a960f9e2 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/GlowTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Overlays { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs index c1c6bbd7cf..0c09b68723 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/OverlayTestBase.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs index 9448feefe2..470f48f781 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Overlays/VignetteTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Processors.Overlays { diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs index 50217e892d..b49ac3ea9a 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/CropTest.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs index b351ec235f..cdc96f042a 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeHelperTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs index c683a51dc4..763db47f99 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Transforms/ResizeTests.cs @@ -12,7 +12,6 @@ using SixLabors.ImageSharp.Processing.Processors.Transforms; using SixLabors.ImageSharp.Tests.Memory; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs index 70159e18ac..42017f3afb 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformBuilderTests.cs @@ -3,7 +3,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Transforms { diff --git a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs index ed6d3ef2bc..1c63d923aa 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/AffineTransformTests.cs @@ -6,7 +6,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; -using SixLabors.Primitives; using Xunit; using Xunit.Abstractions; diff --git a/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs b/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs index 5350bd4a33..edf6a64403 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/CropTest.cs @@ -5,7 +5,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Transforms diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs index d82cd1689d..309a73fb4b 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/ProjectiveTransformBuilderTests.cs @@ -3,7 +3,6 @@ using System.Numerics; using SixLabors.ImageSharp.Processing; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.Processing.Transforms { diff --git a/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs b/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs index f268eda86c..f87e17e060 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/ResizeTests.cs @@ -3,7 +3,6 @@ using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; namespace SixLabors.ImageSharp.Tests.Processing.Transforms diff --git a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs index 71e3b71797..c13d4affdc 100644 --- a/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs +++ b/tests/ImageSharp.Tests/Processing/Transforms/TransformBuilderTestBase.cs @@ -4,7 +4,6 @@ using System; using System.Numerics; using SixLabors.ImageSharp.Processing.Processors.Transforms; -using SixLabors.Primitives; using Xunit; diff --git a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs index 799794ca4f..c8ddc8f758 100644 --- a/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs +++ b/tests/ImageSharp.Tests/TestDataIcc/IccTestDataMatrix.cs @@ -5,7 +5,7 @@ namespace SixLabors.ImageSharp.Tests { - using SixLabors.ImageSharp.Primitives; + using SixLabors.ImageSharp; internal static class IccTestDataMatrix { diff --git a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs index 872a935ffe..2ed4d9382c 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ApproximateFloatComparer.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Numerics; -using SixLabors.ImageSharp.Primitives; namespace SixLabors.ImageSharp.Tests { diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs index 59167cc888..f5f709ce8d 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ExactImageComparer.cs @@ -3,8 +3,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class ExactImageComparer : ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs index 024c2ee215..c44b89568b 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/Exceptions/ImageDimensionsMismatchException.cs @@ -1,8 +1,6 @@ // Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class ImageDimensionsMismatchException : ImagesSimilarityException diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs index 38dada063c..95b3eb0245 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/ImageComparer.cs @@ -6,8 +6,6 @@ using System.Linq; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public abstract class ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs index 1ffeb60ad4..30380218c3 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/PixelDifference.cs @@ -1,5 +1,4 @@ using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs index 8bed3a7155..cbcc6b8450 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageComparison/TolerantImageComparer.cs @@ -5,8 +5,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.Primitives; - namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison { public class TolerantImageComparer : ImageComparer diff --git a/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs b/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs index e44de307ff..7da9707ef3 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ImageProviders/SolidProvider.cs @@ -4,7 +4,6 @@ using SixLabors.ImageSharp.Advanced; using SixLabors.ImageSharp.PixelFormats; -using SixLabors.ImageSharp.Processing; using Xunit.Abstractions; namespace SixLabors.ImageSharp.Tests diff --git a/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs b/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs index 79c19f2be7..1547edeeb2 100644 --- a/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs +++ b/tests/ImageSharp.Tests/TestUtilities/ReferenceCodecs/SystemDrawingBridge.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using System; @@ -29,7 +29,7 @@ internal static unsafe Image From32bppArgbSystemDrawingBitmap(Bi int w = bmp.Width; int h = bmp.Height; - var fullRect = new Rectangle(0, 0, w, h); + var fullRect = new System.Drawing.Rectangle(0, 0, w, h); if (bmp.PixelFormat != PixelFormat.Format32bppArgb) { @@ -88,7 +88,7 @@ internal static unsafe Image From24bppRgbSystemDrawingBitmap(Bit int w = bmp.Width; int h = bmp.Height; - var fullRect = new Rectangle(0, 0, w, h); + var fullRect = new System.Drawing.Rectangle(0, 0, w, h); if (bmp.PixelFormat != PixelFormat.Format24bppRgb) { @@ -139,7 +139,7 @@ internal static unsafe Bitmap To32bppArgbSystemDrawingBitmap(Image(Image Date: Mon, 20 Jan 2020 21:13:49 +1100 Subject: [PATCH 136/136] Remove duplicate Constants --- src/ImageSharp/Constants.cs | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 src/ImageSharp/Constants.cs diff --git a/src/ImageSharp/Constants.cs b/src/ImageSharp/Constants.cs deleted file mode 100644 index b8699e2d15..0000000000 --- a/src/ImageSharp/Constants.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Six Labors and contributors. -// Licensed under the Apache License, Version 2.0. - -namespace SixLabors -{ - /// - /// Common constants used throughout the project. - /// - internal static class Constants - { - /// - /// The epsilon for comparing floating point numbers. - /// - public static readonly float Epsilon = 0.001f; - } -} \ No newline at end of file