diff --git a/.gitattributes b/.gitattributes
index 195506770..2cbe4b423 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -62,15 +62,28 @@
# normalize to Windows-style line endings and
*.sln text eol=crlf merge=union
# treat as binary
+*.basis binary
*.bmp binary
+*.dds binary
*.dll binary
+*.eot binary
*.exe binary
*.gif binary
*.jpg binary
+*.ktx binary
+*.pbm binary
+*.pdf binary
*.png binary
-*.tga binary
+*.ppt binary
+*.pptx binary
+*.pvr binary
*.ttf binary
*.snk binary
+*.tga binary
+*.woff binary
+*.woff2 binary
+*.xls binary
+*.xlsx binary
# diff as plain text
*.doc diff=astextplain
*.docx diff=astextplain
@@ -78,6 +91,7 @@
*.pdf diff=astextplain
*.pptx diff=astextplain
*.rtf diff=astextplain
+*.svg diff=astextplain
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.bmp filter=lfs diff=lfs merge=lfs -text
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
new file mode 100644
index 000000000..d76d68c1a
--- /dev/null
+++ b/.github/workflows/build-and-test.yml
@@ -0,0 +1,148 @@
+name: Build
+
+on:
+ push:
+ branches:
+ - master
+ tags:
+ - "v*"
+ pull_request:
+ branches:
+ - master
+
+jobs:
+ Build:
+ strategy:
+ matrix:
+ options:
+ - os: ubuntu-latest
+ framework: netcoreapp3.1
+ runtime: -x64
+ codecov: false
+ - os: windows-latest
+ framework: netcoreapp3.1
+ runtime: -x64
+ codecov: true
+ - os: windows-latest
+ framework: netcoreapp2.1
+ runtime: -x64
+ codecov: false
+ - os: windows-latest
+ framework: net472
+ runtime: -x64
+ codecov: false
+ - os: windows-latest
+ framework: net472
+ runtime: -x86
+ codecov: false
+
+ runs-on: ${{matrix.options.os}}
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install NuGet
+ uses: NuGet/setup-nuget@v1
+
+ - name: Setup Git
+ shell: bash
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.longpaths true
+ git fetch --prune --unshallow
+ git submodule -q update --init --recursive
+
+ - name: Fetch Tags for GitVersion
+ run: |
+ git fetch --tags
+
+ - name: Fetch master for GitVersion
+ if: github.ref != 'refs/heads/master'
+ run: git branch --create-reflog master origin/master
+
+ - name: Install GitVersion
+ uses: gittools/actions/setup-gitversion@v0.3
+ with:
+ versionSpec: "5.1.x"
+
+ - name: Use GitVersion
+ id: gitversion # step id used as reference for output values
+ uses: gittools/actions/execute-gitversion@v0.3
+
+ - name: Setup DotNet SDK
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: "3.1.101"
+
+ - name: Build
+ shell: pwsh
+ run: ./ci-build.ps1 "${{steps.gitversion.outputs.nuGetVersion}}" "${{matrix.options.framework}}"
+
+ - name: Test
+ shell: pwsh
+ run: ./ci-test.ps1 "${{matrix.options.os}}" "${{matrix.options.framework}}" "${{matrix.options.runtime}}" "${{matrix.options.codecov}}"
+ env:
+ CI: True
+ XUNIT_PATH: .\tests\ImageSharp.Tests # Required for xunit
+
+ # Avoid "Please provide the repository token to upload reports via `-t :repository-token`"
+ # https://community.codecov.io/t/whitelist-github-action-servers-to-upload-without-a-token/491/10
+ # https://github.community/t5/GitHub-Actions/Make-secrets-available-to-builds-of-forks/m-p/42814/highlight/true#M5129
+ - name: Update Codecov
+ uses: iansu/codecov-action-node@v1.0.0
+ if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors')
+ with:
+ token: 0ef021c7-2679-4012-b42f-4bed33d99450
+ flags: unittests
+
+ Publish:
+ needs: [Build]
+
+ runs-on: windows-latest
+
+ if: (github.event_name == 'push')
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install NuGet
+ uses: NuGet/setup-nuget@v1
+
+ - name: Setup Git
+ shell: bash
+ run: |
+ git config --global core.autocrlf false
+ git config --global core.longpaths true
+ git fetch --prune --unshallow
+ git submodule -q update --init --recursive
+
+ - name: Fetch Tags for GitVersion
+ run: |
+ git fetch --tags
+
+ - name: Fetch master for GitVersion
+ if: github.ref != 'refs/heads/master'
+ run: git branch --create-reflog master origin/master
+
+ - name: Install GitVersion
+ uses: gittools/actions/setup-gitversion@v0.3
+ with:
+ versionSpec: "5.1.x"
+
+ - name: Use GitVersion
+ id: gitversion # step id used as reference for output values
+ uses: gittools/actions/execute-gitversion@v0.3
+
+ - name: Setup DotNet SDK
+ uses: actions/setup-dotnet@v1
+ with:
+ dotnet-version: "3.1.101"
+
+ - name: Pack
+ shell: pwsh
+ run: ./ci-pack.ps1 "${{steps.gitversion.outputs.nuGetVersion}}"
+
+ - name: Publish to MyGet
+ shell: pwsh
+ run: nuget.exe push .\artifacts\*.nupkg ${{secrets.MYGET_TOKEN}} -Source https://www.myget.org/F/sixlabors/api/v2/package
+ # TODO: If github.ref starts with 'refs/tags' then it was tag push and we can optionally push out package to nuget.org
diff --git a/.gitignore b/.gitignore
index d8f376a41..a89cfcf10 100644
--- a/.gitignore
+++ b/.gitignore
@@ -137,7 +137,7 @@ publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
-# TODO: Comment the next line if you want to checkin your web deploy settings
+# 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
@@ -216,7 +216,7 @@ artifacts/
*.csproj.bak
#CodeCoverage
-/ImageSharp.Coverage.xml
+*.lcov
# Tests
**/Images/ActualOutput
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 6fd38484d..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-language: csharp
-solution: ImageSharp.sln
-
-matrix:
- include:
- - os: linux # Ubuntu 16.04
- dist: xenial
- sudo: required
- dotnet: 2.1.603
- mono: latest
-# - os: osx # OSX 10.11
-# osx_image: xcode7.3.1
-# dotnet: 1.0.0-preview2-003121
-# mono: latest
-
-branches:
- only:
- - master
- - coverity_scan
-
-script:
- - git submodule -q update --init
- - dotnet restore
- - dotnet test tests/ImageSharp.Tests/ImageSharp.Tests.csproj -c Release -f "netcoreapp2.1"
-
-env:
- global:
- # The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
- # via the "travis encrypt" command using the project repo's public key
- - secure: "rjMvEMN9rpvIXqXqCAAKzbHyABzr7E4wPU/dYJ/mHBqlCccFpQrEXVVM1MfRFXYuWZSaIioknhLATZjT5xvIYpTNM6D57z4OTmqeRHhYm80="
-
-before_install:
- - echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca-
-
-addons:
- coverity_scan:
- project:
- name: "SixLabors/ImageSharp"
- description: "Build submitted via Travis CI"
- notification_email: james_south@hotmail.com
- build_command_prepend: "dotnet restore"
- build_command: "dotnet build -c Release"
- branch_pattern: coverity_scan
\ No newline at end of file
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index c772e647c..000000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- // Use IntelliSense to find out which attributes exist for C# debugging
- // Use hover for the description of the existing attributes
- // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
- "version": "0.2.0",
- "configurations": [
- {
- "name": ".NET Core Launch (console)",
- "type": "coreclr",
- "request": "launch",
- "preLaunchTask": "build",
- // If you have changed target frameworks, make sure to update the program path.
- "program": "${workspaceRoot}/tests/ImageSharp.Benchmarks/bin/Debug/netcoreapp2.0/ImageSharp.Benchmarks.dll",
- "args": [],
- "cwd": "${workspaceRoot}/samples/AvatarWithRoundedCorner",
- // For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
- "console": "internalConsole",
- "stopAtEntry": false,
- "internalConsoleOptions": "openOnSessionStart"
- },
- {
- "name": ".NET Core Attach",
- "type": "coreclr",
- "request": "attach",
- "processId": "${command:pickProcess}"
- }
- ]
-}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index 82aaa2f8d..000000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- // See https://go.microsoft.com/fwlink/?LinkId=733558
- // for the documentation about the tasks.json format
- "version": "0.1.0",
- "command": "dotnet",
- "isShellCommand": true,
- "args": [],
- "tasks": [
- {
- "taskName": "build",
- "args": [ "ImageSharp.sln" ],
- "isBuildCommand": true,
- "showOutput": "always",
- "problemMatcher": "$msCompile"
- },
- {
- "taskName": "build benchmark",
- "suppressTaskName": true,
- "args": [ "build", "tests/ImageSharp.Benchmarks/ImageSharp.Benchmarks.csproj", "-f", "netcoreapp2.0", "-c", "Release" ],
- "showOutput": "always",
- "problemMatcher": "$msCompile"
- },
- {
- "taskName": "test",
- "args": ["tests/ImageSharp.Tests/ImageSharp.Tests.csproj", "-c", "release", "-f", "netcoreapp2.0"],
- "isTestCommand": true,
- "showOutput": "always",
- "problemMatcher": "$msCompile"
- }
- ]
-}
\ No newline at end of file
diff --git a/CodeCoverage.runsettings b/CodeCoverage.runsettings
deleted file mode 100644
index d9c0848f1..000000000
--- a/CodeCoverage.runsettings
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-
-
-
-
-
-
- .*ImageSharp.dll
-
-
- .*tests*
- .*Tests*
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Directory.Build.props b/Directory.Build.props
index efe4cc966..604153f97 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -14,7 +14,7 @@
$(MSBuildThisFileDirectory)artifacts/
$(ImageSharpProjectCategory)/$(MSBuildProjectName)
- https://github.com/SixLabors/ImageSharp/
+ https://github.com/SixLabors/ImageSharp/
@@ -29,13 +29,38 @@
true
-
- true
+
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_RUNTIME_INTRINSICS;SUPPORTS_CODECOVERAGE
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_CODECOVERAGE
+
+
+ $(DefineConstants);SUPPORTS_MATHF;SUPPORTS_HASHCODE;SUPPORTS_SPAN_STREAM;SUPPORTS_ENCODING_STRING;SUPPORTS_CODECOVERAGE
+
+
+ $(DefineConstants);SUPPORTS_CODECOVERAGE
-
-
-
- false
+
+ $(DefineConstants);SUPPORTS_EXTENDED_INTRINSICS;SUPPORTS_CODECOVERAGE
@@ -56,26 +81,33 @@
Copyright © Six Labors and Contributors
strict;IOperation
true
- 7.3
+ 8.0
en
true
- https://raw.githubusercontent.com/SixLabors/Branding/master/icons/imagesharp/sixlabors.imagesharp.128.png
+ icon.png
Apache-2.0
$(RepositoryUrl)
true
git
https://www.myget.org/F/sixlabors/api/v3/index.json;
- https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json;
https://api.nuget.org/v3/index.json;
+
+ https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json;
002400000c8000009400000006020000002400005253413100040000010001000147e6fe6766715eec6cfed61f1e7dcdbf69748a3e355c67e9d8dfd953acab1d5e012ba34b23308166fdc61ee1d0390d5f36d814a6091dd4b5ed9eda5a26afced924c683b4bfb4b3d64b0586a57eff9f02b1f84e3cb0ddd518bd1697f2c84dcbb97eb8bb5c7801be12112ed0ec86db934b0e9a5171e6bb1384b6d2f7d54dfa97
true
-
+
+
+
+
+
+
+
diff --git a/Directory.Build.targets b/Directory.Build.targets
index f6523fee0..e5c44f776 100644
--- a/Directory.Build.targets
+++ b/Directory.Build.targets
@@ -15,34 +15,23 @@
$(DefineConstants);$(OS)
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
+
+
+
-
-
-
+
diff --git a/GitVersion.yml b/GitVersion.yml
new file mode 100644
index 000000000..f2a251c55
--- /dev/null
+++ b/GitVersion.yml
@@ -0,0 +1,7 @@
+continuous-delivery-fallback-tag: ci
+branches:
+ master:
+ tag: unstable
+ mode: ContinuousDeployment
+ pull-request:
+ tag: pr
diff --git a/ImageSharp.sln b/ImageSharp.sln
index d4a0419ee..40878c575 100644
--- a/ImageSharp.sln
+++ b/ImageSharp.sln
@@ -3,24 +3,20 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.28902.138
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{C317F1B1-D75E-4C6D-83EB-80367343E0D7}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
.gitattributes = .gitattributes
.gitignore = .gitignore
.gitmodules = .gitmodules
- .travis.yml = .travis.yml
- appveyor.yml = appveyor.yml
- build.cmd = build.cmd
- build.ps1 = build.ps1
- codecov.yml = codecov.yml
- CodeCoverage.runsettings = CodeCoverage.runsettings
+ ci-build.ps1 = ci-build.ps1
+ ci-pack.ps1 = ci-pack.ps1
+ ci-test.ps1 = ci-test.ps1
Directory.Build.props = Directory.Build.props
Directory.Build.targets = Directory.Build.targets
- ImageSharp.sln.DotSettings = ImageSharp.sln.DotSettings
+ GitVersion.yml = GitVersion.yml
LICENSE = LICENSE
README.md = README.md
- run-tests.ps1 = run-tests.ps1
EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{1799C43E-5C54-4A8F-8D64-B1475241DB0D}"
@@ -36,25 +32,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ISSUE_TEMPLATE", "ISSUE_TEM
.github\ISSUE_TEMPLATE\feature-request.md = .github\ISSUE_TEMPLATE\feature-request.md
EndProjectSection
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".vscode", ".vscode", "{0274D4CF-9932-47CC-8E89-54DC05B8F06E}"
- ProjectSection(SolutionItems) = preProject
- .vscode\launch.json = .vscode\launch.json
- .vscode\tasks.json = .vscode\tasks.json
- EndProjectSection
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{E919DF0B-2607-4462-8FC0-5C98FE50F8C9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "icons", "icons", "{2B02E303-7CC6-4E15-97EE-DBE86B287553}"
- ProjectSection(SolutionItems) = preProject
- build\icons\imagesharp-logo-128.png = build\icons\imagesharp-logo-128.png
- build\icons\imagesharp-logo-256.png = build\icons\imagesharp-logo-256.png
- build\icons\imagesharp-logo-32.png = build\icons\imagesharp-logo-32.png
- build\icons\imagesharp-logo-512.png = build\icons\imagesharp-logo-512.png
- build\icons\imagesharp-logo-64.png = build\icons\imagesharp-logo-64.png
- build\icons\imagesharp-logo.png = build\icons\imagesharp-logo.png
- build\icons\imagesharp-logo.svg = build\icons\imagesharp-logo.svg
- EndProjectSection
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{815C0625-CD3D-440F-9F80-2D83856AB7AE}"
ProjectSection(SolutionItems) = preProject
src\Directory.Build.props = src\Directory.Build.props
@@ -64,20 +41,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{815C0625-CD3
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp", "src\ImageSharp\ImageSharp.csproj", "{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Drawing", "src\ImageSharp.Drawing\ImageSharp.Drawing.csproj", "{2E33181E-6E28-4662-A801-E2E7DC206029}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{56801022-D71A-4FBE-BC5B-CBA08E2284EC}"
ProjectSection(SolutionItems) = preProject
tests\Directory.Build.props = tests\Directory.Build.props
tests\Directory.Build.targets = tests\Directory.Build.targets
EndProjectSection
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeCoverage", "CodeCoverage", "{D4C5EC58-F8E6-4636-B9EE-C99D2578E5C6}"
- ProjectSection(SolutionItems) = preProject
- tests\CodeCoverage\CodeCoverage.cmd = tests\CodeCoverage\CodeCoverage.cmd
- tests\CodeCoverage\packages.config = tests\CodeCoverage\packages.config
- EndProjectSection
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Images", "Images", "{FA55F5DE-11A6-487D-ABA4-BC93A02717DD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Input", "Input", "{9DA226A1-8656-49A8-A58A-A8B5C081AD66}"
@@ -354,9 +323,19 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Tests", "tests\I
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Benchmarks", "tests\ImageSharp.Benchmarks\ImageSharp.Benchmarks.csproj", "{2BF743D8-2A06-412D-96D7-F448F00C5EA5}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Sandbox46", "tests\ImageSharp.Sandbox46\ImageSharp.Sandbox46.csproj", "{561B880A-D9EE-44EF-90F5-817C54A9D9AB}"
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{C0D7754B-5277-438E-ABEB-2BA34401B5A7}"
+ ProjectSection(SolutionItems) = preProject
+ .github\workflows\build-and-test.yml = .github\workflows\build-and-test.yml
+ EndProjectSection
+EndProject
+Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "SharedInfrastructure", "shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.shproj", "{68A8CC40-6AED-4E96-B524-31B1158FDEEA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ImageSharp.Tests.ProfilingSandbox", "tests\ImageSharp.Tests.ProfilingSandbox\ImageSharp.Tests.ProfilingSandbox.csproj", "{FC527290-2F22-432C-B77B-6E815726B02C}"
EndProject
Global
+ GlobalSection(SharedMSBuildProjectFiles) = preSolution
+ shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{68a8cc40-6aed-4e96-b524-31b1158fdeea}*SharedItemsImports = 13
+ EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
@@ -378,18 +357,6 @@ Global
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x64.Build.0 = Release|Any CPU
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x86.ActiveCfg = Release|Any CPU
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26}.Release|x86.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.Build.0 = Debug|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.Build.0 = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.ActiveCfg = Release|Any CPU
- {2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.Build.0 = Release|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -414,28 +381,25 @@ Global
{2BF743D8-2A06-412D-96D7-F448F00C5EA5}.Release|x64.Build.0 = Release|Any CPU
{2BF743D8-2A06-412D-96D7-F448F00C5EA5}.Release|x86.ActiveCfg = Release|Any CPU
{2BF743D8-2A06-412D-96D7-F448F00C5EA5}.Release|x86.Build.0 = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|x64.Build.0 = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Debug|x86.Build.0 = Debug|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|Any CPU.Build.0 = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|x64.ActiveCfg = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|x64.Build.0 = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|x86.ActiveCfg = Release|Any CPU
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB}.Release|x86.Build.0 = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|x64.Build.0 = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Debug|x86.Build.0 = Debug|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|x64.ActiveCfg = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|x64.Build.0 = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|x86.ActiveCfg = Release|Any CPU
+ {FC527290-2F22-432C-B77B-6E815726B02C}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{FBE8C1AD-5AEC-4514-9B64-091D8E145865} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D}
- {2B02E303-7CC6-4E15-97EE-DBE86B287553} = {E919DF0B-2607-4462-8FC0-5C98FE50F8C9}
{2AA31A1F-142C-43F4-8687-09ABCA4B3A26} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
- {2E33181E-6E28-4662-A801-E2E7DC206029} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
- {D4C5EC58-F8E6-4636-B9EE-C99D2578E5C6} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
{FA55F5DE-11A6-487D-ABA4-BC93A02717DD} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
{9DA226A1-8656-49A8-A58A-A8B5C081AD66} = {FA55F5DE-11A6-487D-ABA4-BC93A02717DD}
{1A82C5F6-90E0-4E97-BE16-A825C046B493} = {9DA226A1-8656-49A8-A58A-A8B5C081AD66}
@@ -452,7 +416,9 @@ Global
{E1C42A6F-913B-4A7B-B1A8-2BB62843B254} = {9DA226A1-8656-49A8-A58A-A8B5C081AD66}
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
{2BF743D8-2A06-412D-96D7-F448F00C5EA5} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
- {561B880A-D9EE-44EF-90F5-817C54A9D9AB} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
+ {C0D7754B-5277-438E-ABEB-2BA34401B5A7} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D}
+ {68A8CC40-6AED-4E96-B524-31B1158FDEEA} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
+ {FC527290-2F22-432C-B77B-6E815726B02C} = {56801022-D71A-4FBE-BC5B-CBA08E2284EC}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {5F8B9D1F-CD8B-4CC5-8216-D531E25BD795}
diff --git a/ImageSharp.sln.DotSettings b/ImageSharp.sln.DotSettings
deleted file mode 100644
index ece3dddb3..000000000
--- a/ImageSharp.sln.DotSettings
+++ /dev/null
@@ -1,393 +0,0 @@
-
- <?xml version="1.0" encoding="utf-16"?>
-<Profile name="StyleCop">
- <CSUpdateFileHeader>False</CSUpdateFileHeader>
- <CSArrangeQualifiers>True</CSArrangeQualifiers>
- <CSOptimizeUsings>
- <OptimizeUsings>True</OptimizeUsings>
- <EmbraceInRegion>False</EmbraceInRegion>
- <RegionName></RegionName>
- </CSOptimizeUsings>
- <CSReformatCode>True</CSReformatCode>
- <CSReorderTypeMembers>True</CSReorderTypeMembers>
-</Profile>
- StyleCop
- public protected internal private static new abstract virtual override sealed readonly extern unsafe volatile async
- Field, Property, Event, Method
- True
- True
- True
- True
- True
- True
- True
- True
- True
- NEXT_LINE_SHIFTED_2
- 1
- 1
- 1
- 1
- 1
- NEXT_LINE_SHIFTED_2
- ALWAYS_ADD
- ALWAYS_ADD
- ALWAYS_ADD
- ALWAYS_ADD
- ALWAYS_ADD
- NEXT_LINE_SHIFTED_2
- 1
- 1
- False
- False
- False
- NEVER
- False
- False
- NEVER
- False
- ALWAYS
- False
- True
- ON_SINGLE_LINE
- False
- True
- True
- False
- True
- True
- CHOP_IF_LONG
- True
- True
- CHOP_IF_LONG
- CHOP_IF_LONG
- <?xml version="1.0" encoding="utf-16"?>
-<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns">
- <TypePattern DisplayName="COM interfaces or structs">
- <TypePattern.Match>
- <Or>
- <And>
- <Kind Is="Interface" />
- <Or>
- <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" />
- <HasAttribute Name="System.Runtime.InteropServices.ComImport" />
- </Or>
- </And>
- <Kind Is="Struct" />
- </Or>
- </TypePattern.Match>
- </TypePattern>
- <TypePattern DisplayName="P/Invoke classes called 'NativeMethods' (StyleCop)">
- <TypePattern.Match>
- <And>
- <Kind Is="Class" />
- <Name Is=".*NativeMethods" />
- </And>
- </TypePattern.Match>
- </TypePattern>
- <TypePattern DisplayName="DataMember serialisation classes (StyleCop)">
- <TypePattern.Match>
- <And>
- <Or>
- <Kind Is="Field" />
- <Kind Is="Property" />
- </Or>
- <HasAttribute Name="System.Runtime.Serialization.DataMemberAttribute" />
- </And>
- </TypePattern.Match>
- </TypePattern>
- <TypePattern DisplayName="Default Pattern (StyleCop)" RemoveRegions="All">
- <Entry DisplayName="Constants">
- <Entry.Match>
- <Kind Is="Constant" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Static fields">
- <Entry.Match>
- <And>
- <Kind Is="Field" />
- <Static />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Readonly />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Fields">
- <Entry.Match>
- <Kind Is="Field" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Readonly />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="200" DisplayName="Constructors and Destructors">
- <Entry.Match>
- <Or>
- <Kind Is="Constructor" />
- <Kind Is="Destructor" />
- </Or>
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Kind Order="Constructor Destructor" />
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Delegates">
- <Entry.Match>
- <Kind Is="Delegate" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Public events">
- <Entry.Match>
- <And>
- <Kind Is="Event" />
- <Access Is="Public" />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Interface events">
- <Entry.Match>
- <And>
- <Kind Is="Event" />
- <ImplementsInterface />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <ImplementsInterface Immediate="True" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Other events">
- <Entry.Match>
- <Kind Is="Event" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Enums">
- <Entry.Match>
- <Kind Is="Enum" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Interfaces">
- <Entry.Match>
- <Kind Is="Interface" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Public properties">
- <Entry.Match>
- <And>
- <Kind Is="Property" />
- <Access Is="Public" />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Interface properties">
- <Entry.Match>
- <And>
- <Kind Is="Property" />
- <ImplementsInterface />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <ImplementsInterface Immediate="True" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Other properties">
- <Entry.Match>
- <Kind Is="Property" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="1000" DisplayName="Public indexers">
- <Entry.Match>
- <And>
- <Kind Is="Indexer" />
- <Access Is="Public" />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="1000" DisplayName="Interface indexers">
- <Entry.Match>
- <And>
- <Kind Is="Indexer" />
- <ImplementsInterface />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <ImplementsInterface Immediate="True" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="1000" DisplayName="Other indexers">
- <Entry.Match>
- <Kind Is="Indexer" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Public methods and operators">
- <Entry.Match>
- <And>
- <Or>
- <Kind Is="Method" />
- <Kind Is="Operator" />
- </Or>
- <Access Is="Public" />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Interface methods">
- <Entry.Match>
- <And>
- <Kind Is="Method" />
- <ImplementsInterface />
- </And>
- </Entry.Match>
- <Entry.SortBy>
- <ImplementsInterface Immediate="True" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Other methods">
- <Entry.Match>
- <Kind Is="Method" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="Operators">
- <Entry.Match>
- <Kind Is="Operator" />
- </Entry.Match>
- <Entry.SortBy>
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Static />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="600" DisplayName="Nested structs">
- <Entry.Match>
- <Kind Is="Struct" />
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry Priority="700" DisplayName="Nested classes">
- <Entry.Match>
- <Kind Is="Class" />
- </Entry.Match>
- <Entry.SortBy>
- <Static />
- <Access Order="Public Internal ProtectedInternal Protected Private" />
- <Name />
- </Entry.SortBy>
- </Entry>
- <Entry DisplayName="All other members" />
- </TypePattern>
-</Patterns>
- False
- True
- // Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
- AC
- DC
- DCT
- EOF
- FDCT
- IDCT
- JPEG
- MCU
- PNG
- RGB
- RLE
- XY
- XYZ
- $object$_On$event$
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="I" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" />
- <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" />
- True
- True
- True
- True
- True
- True
- True
- True
- True
- True
- True
- True
-
\ No newline at end of file
diff --git a/README.md b/README.md
index a1c9bca99..af8d4f73a 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,7 @@ SixLabors.ImageSharp
+[](https://github.com/SixLabors/ImageSharp/actions)
[](https://raw.githubusercontent.com/SixLabors/ImageSharp/master/LICENSE)
[](https://gitter.im/ImageSharp/General?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[](https://twitter.com/intent/tweet?hashtags=imagesharp,dotnet,oss&text=ImageSharp.+A+new+cross-platform+2D+graphics+API+in+C%23&url=https%3a%2f%2fgithub.com%2fSixLabors%2fImageSharp&via=sixlabors)
@@ -35,7 +36,6 @@ Install stable releases via Nuget; development releases are available via MyGet.
| Package Name | Release (NuGet) | Nightly (MyGet) |
|--------------------------------|-----------------|-----------------|
| `SixLabors.ImageSharp` | [](https://www.nuget.org/packages/SixLabors.ImageSharp/) | [](https://www.myget.org/feed/sixlabors/package/nuget/SixLabors.ImageSharp) |
-| `SixLabors.ImageSharp.Drawing` | [](https://www.nuget.org/packages/SixLabors.ImageSharp.Drawing/) | [](https://www.myget.org/feed/sixlabors/package/nuget/SixLabors.ImageSharp.Drawing) |
### Packages
@@ -46,18 +46,13 @@ The **ImageSharp** library is made up of multiple packages:
- Transform methods like Resize, Crop, Skew, Rotate - anything that alters the dimensions of the image
- Non-transform methods like Gaussian Blur, Pixelate, Edge Detection - anything that maintains the original image dimensions
-- **SixLabors.ImageSharp.Drawing**
- - Brushes and various drawing algorithms, including drawing images
- - Various vector drawing methods for drawing paths, polygons etc.
- - Text drawing
-
+
### Questions?
- Do you have questions? We are happy to help! Please [join our gitter channel](https://gitter.im/ImageSharp/General), or ask them on [stackoverflow](https://stackoverflow.com) using the `ImageSharp` tag. **Do not** open issues for questions!
@@ -80,7 +75,7 @@ using SixLabors.ImageSharp.PixelFormats;
// Image.Load(string path) is a shortcut for our default type.
// Other pixel formats use Image.Load
(string path))
-using (Image image = Image.Load("foo.jpg"))
+using (Image image = Image.Load("foo.jpg"))
{
image.Mutate(x => x
.Resize(image.Width / 2, image.Height / 2)
@@ -113,9 +108,9 @@ For more examples check out:
If you prefer, you can compile ImageSharp yourself (please do and help!)
-- Using [Visual Studio 2017](https://visualstudio.microsoft.com/vs/)
+- Using [Visual Studio 2019](https://visualstudio.microsoft.com/vs/)
- Make sure you have the latest version installed
- - Make sure you have [the .NET Core 2.1 SDK](https://www.microsoft.com/net/core#windows) installed
+ - Make sure you have [the .NET Core 3.1 SDK](https://www.microsoft.com/net/core#windows) installed
Alternatively, you can work from command line and/or with a lightweight editor on **both Linux/Unix and Windows**:
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 2cc5182d3..000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-version: 1.0.0.{build}
-image: Visual Studio 2017
-
-# prevent the double build when a branch has an active PR
-skip_branch_with_pr: true
-
-environment:
- matrix:
- - target_framework: netcoreapp2.1
- is_32bit: False
-
- - target_framework: netcoreapp2.1
- is_32bit: True
-
- - target_framework: net472
- is_32bit: False
-
- - target_framework: net472
- is_32bit: True
-
- - target_framework: net462
- is_32bit: False
-
- - target_framework: net462
- is_32bit: True
-
- #- target_framework: mono
- # is_32bit: False
- #- target_framework: mono
- # is_32bit: True
- #- target_framework: net47
- # is_32bit: False
- #- target_framework: net47
- # is_32bit: True
-
-install:
- - ps: |
- if ($env:target_framework -eq "mono") {
- if ($env:is_32bit -eq "True") {
- cinst mono --x86
- } else {
- cinst mono
- }
- }
-
-before_build:
- - git submodule -q update --init
- - cmd: dotnet --info
-
-build_script:
-- cmd: build.cmd
-
-test_script:
-- ps: .\run-tests.ps1 $env:target_framework $env:is_32bit
-
-after_test:
- - cmd: appveyor PushArtifact "artifacts\SixLabors.ImageSharp.%APPVEYOR_BUILD_VERSION%.nupkg"
- - cmd: appveyor PushArtifact "artifacts\SixLabors.ImageSharp.Drawing.%APPVEYOR_BUILD_VERSION%.nupkg"
-
-deploy:
- # MyGet Deployment for builds & releases
- - 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
\ No newline at end of file
diff --git a/build.cmd b/build.cmd
deleted file mode 100644
index 6372b4125..000000000
--- 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 215b55117..000000000
--- a/build.ps1
+++ /dev/null
@@ -1,122 +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 /p:DisableImplicitNuGetFallbackFolder=true
-
-Write-Host "Building projects"
-dotnet build -c Release /p:packageversion=$version
-
-if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
-
-#
-# TODO: DO WE NEED TO RUN TESTS IMPLICITLY?
-#
-# if ( $env:CI -ne "True") {
-# cd ./tests/ImageSharp.Tests/
-# dotnet xunit -nobuild -c Release -f netcoreapp2.0 --fx-version 2.0.0
-# ./RunExtendedTests.cmd
-# cd ../..
-# }
-#
-
-if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
-
-Write-Host "Packaging projects"
-dotnet pack ./src/ImageSharp/ -c Release --output ../../artifacts --no-build /p:packageversion=$version
-if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
-
-dotnet pack ./src/ImageSharp.Drawing/ -c Release --output ../../artifacts --no-build /p:packageversion=$version
-if ($LASTEXITCODE ){ Exit $LASTEXITCODE }
diff --git a/build/icons/imagesharp-logo-128.png b/build/icons/imagesharp-logo-128.png
deleted file mode 100644
index 5c2079144..000000000
--- a/build/icons/imagesharp-logo-128.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:148a268c589b628f5d0b5af0e86911a0b393c35b8b25233c71553657c88e0b96
-size 7568
diff --git a/build/icons/imagesharp-logo-256.png b/build/icons/imagesharp-logo-256.png
deleted file mode 100644
index e38807ae1..000000000
--- a/build/icons/imagesharp-logo-256.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7e4b2ff72aef1979500cd130c28490a00be116bb833bc96ca30c85dc0596099c
-size 15413
diff --git a/build/icons/imagesharp-logo-32.png b/build/icons/imagesharp-logo-32.png
deleted file mode 100644
index 273b171eb..000000000
--- a/build/icons/imagesharp-logo-32.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:021c12313afbdc65f58bfea8c7b436d5c2102513bb63d9e64ee2b61a1344c56a
-size 1799
diff --git a/build/icons/imagesharp-logo-512.png b/build/icons/imagesharp-logo-512.png
deleted file mode 100644
index 707dc9a35..000000000
--- a/build/icons/imagesharp-logo-512.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3ae54ae0035df1f8f1459081e2f1d5cceda6f88cca6ec015d8c0209bf0d34edf
-size 32534
diff --git a/build/icons/imagesharp-logo-64.png b/build/icons/imagesharp-logo-64.png
deleted file mode 100644
index 17577772e..000000000
--- a/build/icons/imagesharp-logo-64.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:92896854265693f28f9a503b9093cb2c9a4a9b329f310732efdd9c6f6c3761bc
-size 3736
diff --git a/build/icons/imagesharp-logo.png b/build/icons/imagesharp-logo.png
deleted file mode 100644
index 707dc9a35..000000000
--- a/build/icons/imagesharp-logo.png
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:3ae54ae0035df1f8f1459081e2f1d5cceda6f88cca6ec015d8c0209bf0d34edf
-size 32534
diff --git a/build/icons/imagesharp-logo.svg b/build/icons/imagesharp-logo.svg
deleted file mode 100644
index 620287457..000000000
--- a/build/icons/imagesharp-logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/ci-build.ps1 b/ci-build.ps1
new file mode 100644
index 000000000..17c6e6603
--- /dev/null
+++ b/ci-build.ps1
@@ -0,0 +1,13 @@
+param(
+ [Parameter(Mandatory, Position = 0)]
+ [string]$version,
+ [Parameter(Mandatory = $true, Position = 1)]
+ [string]$targetFramework
+)
+
+dotnet clean -c Release
+
+$repositoryUrl = "https://github.com/$env:GITHUB_REPOSITORY"
+
+# Building for a specific framework.
+dotnet build -c Release -f $targetFramework /p:packageversion=$version /p:RepositoryUrl=$repositoryUrl
diff --git a/ci-pack.ps1 b/ci-pack.ps1
new file mode 100644
index 000000000..a4e846db9
--- /dev/null
+++ b/ci-pack.ps1
@@ -0,0 +1,11 @@
+param(
+ [Parameter(Mandatory, Position = 0)]
+ [string]$version
+)
+
+dotnet clean -c Release
+
+$repositoryUrl = "https://github.com/$env:GITHUB_REPOSITORY"
+
+# Building for packing and publishing.
+dotnet pack -c Release --output "$PSScriptRoot/artifacts" /p:packageversion=$version /p:RepositoryUrl=$repositoryUrl
diff --git a/ci-test.ps1 b/ci-test.ps1
new file mode 100644
index 000000000..3915ae4cc
--- /dev/null
+++ b/ci-test.ps1
@@ -0,0 +1,37 @@
+param(
+ [Parameter(Mandatory, Position = 0)]
+ [string]$os,
+ [Parameter(Mandatory, Position = 1)]
+ [string]$targetFramework,
+ [Parameter(Mandatory, Position = 2)]
+ [string]$platform,
+ [Parameter(Mandatory, Position = 3)]
+ [string]$codecov,
+ [Parameter(Position = 4)]
+ [string]$codecovProfile = 'Release'
+)
+
+$netFxRegex = '^net\d+'
+
+if ($codecov -eq 'true') {
+
+ # Allow toggling of profile to workaround any potential JIT errors caused by code injection.
+ dotnet clean -c $codecovProfile
+ dotnet test --collect "XPlat Code Coverage" --settings .\tests\coverlet.runsettings -c $codecovProfile -f $targetFramework /p:CodeCov=true
+}
+elseif ($platform -eq '-x86' -and $targetFramework -match $netFxRegex) {
+
+ # xunit doesn't run on core with NET SDK 3.1+.
+ # xunit doesn't actually understand -x64 as an option.
+ #
+ # xunit requires explicit path.
+ Set-Location $env:XUNIT_PATH
+
+ dotnet xunit --no-build -c Release -f $targetFramework ${fxVersion} $platform
+
+ Set-Location $PSScriptRoot
+}
+else {
+
+ dotnet test --no-build -c Release -f $targetFramework
+}
diff --git a/codecov.yml b/codecov.yml
index ae6dd5f6b..3941f7ff9 100644
--- a/codecov.yml
+++ b/codecov.yml
@@ -1,4 +1,7 @@
-ignore:
- "src/ImageSharp/Common/Helpers/DebugGuard.cs"
+# Documentation: https://docs.codecov.io/docs/codecov-yaml
-
\ No newline at end of file
+codecov:
+ # Avoid "Missing base report"
+ # https://github.com/codecov/support/issues/363
+ # https://docs.codecov.io/docs/comparing-commits
+ allow_coverage_offsets: true
diff --git a/run-tests.ps1 b/run-tests.ps1
deleted file mode 100644
index 4aeaa1490..000000000
--- a/run-tests.ps1
+++ /dev/null
@@ -1,112 +0,0 @@
-param(
- [string]$targetFramework,
- [string]$is32Bit = "False"
-)
-
-if (!$targetFramework){
- Write-Host "run-tests.ps1 ERROR: targetFramework is undefined!"
- exit 1
-}
-
-function VerifyPath($path, $errorMessage) {
- if (!(Test-Path -Path $path)) {
- Write-Host "run-tests.ps1 $errorMessage `n $xunitRunnerPath"
- exit 1
- }
-}
-
-function CheckSubmoduleStatus() {
- $submoduleStatus = (git submodule status) | Out-String
- # if the result string is empty, the command failed to run (we didn't capture the error stream)
- if ($submoduleStatus) {
- # git has been called successfully, what about the status?
- if (($submoduleStatus -match "\-") -or ($submoduleStatus -match "\(\(null\)\)"))
- {
- # submodule has not been initialized!
- return 2;
- }
- elseif ($submoduleStatus -match "\+")
- {
- # submodule is not synced:
- return 1;
- }
- else {
- # everything fine:
- return 0;
- }
- } else {
- # git call failed, so we should warn
- return 3;
- }
-}
-
-
-if ( ($targetFramework -eq "netcoreapp2.1") -and ($env:CI -eq "True") -and ($is32Bit -ne "True")) {
- # We execute CodeCoverage.cmd only for one specific job on CI (netcoreapp2.1 + 64bit )
- $testRunnerCmd = ".\tests\CodeCoverage\CodeCoverage.cmd"
-}
-elseif ($targetFramework -eq "mono") {
- $testDllPath = "$PSScriptRoot\tests\ImageSharp.Tests\bin\Release\net462\SixLabors.ImageSharp.Tests.dll"
- VerifyPath($testDllPath, "test dll missing:")
-
- $xunitRunnerPath = "${env:HOMEPATH}\.nuget\packages\xunit.runner.console\2.3.1\tools\net452\"
-
- VerifyPath($xunitRunnerPath, "xunit console runner is missing on path:")
-
- cd "$xunitRunnerPath"
-
- if ($is32Bit -ne "True") {
- $monoPath = "${env:PROGRAMFILES}\Mono\bin\mono.exe"
- }
- else {
- $monoPath = "${env:ProgramFiles(x86)}\Mono\bin\mono.exe"
- }
-
- VerifyPath($monoPath, "mono runtime missing:")
-
- $testRunnerCmd = "& `"${monoPath}`" .\xunit.console.exe `"${testDllPath}`""
-}
-else {
- cd .\tests\ImageSharp.Tests
- $xunitArgs = "-nobuild -c Release -framework $targetFramework"
-
- if ($targetFramework -eq "netcoreapp2.1") {
- # There were issues matching the correct installed runtime if we do not specify it explicitly:
- $xunitArgs += " --fx-version 2.1.0"
- }
-
- if ($is32Bit -eq "True") {
- $xunitArgs += " -x86"
- }
-
- $testRunnerCmd = "dotnet xunit $xunitArgs"
-}
-
-Write-Host "running:"
-Write-Host $testRunnerCmd
-Write-Host "..."
-
-Invoke-Expression $testRunnerCmd
-
-cd $PSScriptRoot
-
-$exitCodeOfTests = $LASTEXITCODE;
-
-if (0 -ne ([int]$exitCodeOfTests)) {
- # check submodule status
- $submoduleStatus = CheckSubmoduleStatus
- if ([int]$submoduleStatus -eq 1) {
- # not synced
- Write-Host -ForegroundColor Yellow "Check if submodules are up to date. You can use 'git submodule update' to fix this";
- } elseif ($submoduleStatus -eq 2) {
- # not initialized
- Write-Host -ForegroundColor Yellow "Check if submodules are initialized. You can run 'git submodule init' to initialize them."
- } elseif ($submoduleStatus -eq 3) {
- # git not found, maybe submodules not synced?
- Write-Host -ForegroundColor Yellow "Could not check if submodules are initialized correctly. Maybe git is not installed?"
- } else {
- #Write-Host "Submodules are up to date";
- }
-}
-
-exit $exitCodeOfTests
diff --git a/shared-infrastructure b/shared-infrastructure
index faf84e44e..36b2d55f5 160000
--- a/shared-infrastructure
+++ b/shared-infrastructure
@@ -1 +1 @@
-Subproject commit faf84e44ec90e8a42a7271bcd04fea76279efb08
+Subproject commit 36b2d55f5bb0d91024955bd26ba220ee41cc96e5
diff --git a/src/Directory.Build.props b/src/Directory.Build.props
index 6fbbb7c91..5e3f9b061 100644
--- a/src/Directory.Build.props
+++ b/src/Directory.Build.props
@@ -22,11 +22,14 @@
true
-
-
-
+
+ true
+
+
+
+
@@ -34,8 +37,4 @@
-
-
-
-
diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets
index c0e01ae58..68d4f8949 100644
--- a/src/Directory.Build.targets
+++ b/src/Directory.Build.targets
@@ -50,6 +50,6 @@
-
+
diff --git a/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs b/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs
deleted file mode 100644
index c32d0a46e..000000000
--- a/src/ImageSharp.Drawing/Common/Extensions/GraphicsOptionsExtensions.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Numerics;
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp
-{
- ///
- /// Extensions methods fpor the class.
- ///
- internal static class GraphicsOptionsExtensions
- {
- ///
- /// Evaluates if a given SOURCE color can completely replace a BACKDROP color given the current blending and composition settings.
- ///
- /// The graphics options.
- /// The source color.
- /// true if the color can be considered opaque
- ///
- /// Blending and composition is an expensive operation, in some cases, like
- /// filling with a solid color, the blending can be avoided by a plain color replacement.
- /// This method can be useful for such processors to select the fast path.
- ///
- public static bool IsOpaqueColorWithoutBlending(this GraphicsOptions options, Color color)
- {
- if (options.ColorBlendingMode != PixelColorBlendingMode.Normal)
- {
- return false;
- }
-
- if (options.AlphaCompositionMode != PixelAlphaCompositionMode.SrcOver
- && options.AlphaCompositionMode != PixelAlphaCompositionMode.Src)
- {
- return false;
- }
-
- const float Opaque = 1F;
-
- if (options.BlendPercentage != Opaque)
- {
- return false;
- }
-
- if (((Vector4)color).W != Opaque)
- {
- return false;
- }
-
- return true;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
deleted file mode 100644
index 5a53d3e78..000000000
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
- SixLabors.ImageSharp.Drawing
- SixLabors.ImageSharp.Drawing
- An extension to ImageSharp that allows the drawing of images, paths, and text.
- SixLabors.ImageSharp.Drawing
- Image Draw Shape Path Font
- SixLabors.ImageSharp
- netcoreapp2.1;netstandard1.3;netstandard2.0
-
-
-
-
- $(DefineConstants);SUPPORTS_MATHF
-
-
-
- $(DefineConstants);SUPPORTS_HASHCODE
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings b/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings
deleted file mode 100644
index a728b5497..000000000
--- a/src/ImageSharp.Drawing/ImageSharp.Drawing.csproj.DotSettings
+++ /dev/null
@@ -1,2 +0,0 @@
-
- True
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/Region.cs b/src/ImageSharp.Drawing/Primitives/Region.cs
deleted file mode 100644
index 27f039f12..000000000
--- a/src/ImageSharp.Drawing/Primitives/Region.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// Represents a region of an image.
- ///
- public abstract class Region
- {
- ///
- /// Gets the maximum number of intersections to could be returned.
- ///
- public abstract int MaxIntersections { get; }
-
- ///
- /// Gets the bounding box that entirely surrounds this region.
- ///
- ///
- /// This should always contains all possible points returned from .
- ///
- public abstract Rectangle Bounds { get; }
-
- ///
- /// Scans the X axis for intersections at the Y axis position.
- ///
- /// The position along the y axis to find intersections.
- /// The buffer.
- /// A instance in the context of the caller.
- /// The number of intersections found.
- public abstract int Scan(float y, Span buffer, Configuration configuration);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/ShapePath.cs b/src/ImageSharp.Drawing/Primitives/ShapePath.cs
deleted file mode 100644
index a4fef66a6..000000000
--- a/src/ImageSharp.Drawing/Primitives/ShapePath.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Processing;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// A mapping between a and a region.
- ///
- internal class ShapePath : ShapeRegion
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The shape.
- /// The pen to apply to the shape.
- public ShapePath(IPath shape, IPen pen)
- : base(shape.GenerateOutline(pen.StrokeWidth, pen.StrokePattern))
- {
- }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs b/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
deleted file mode 100644
index c008f4419..000000000
--- a/src/ImageSharp.Drawing/Primitives/ShapeRegion.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Memory;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Primitives
-{
- ///
- /// A mapping between a and a region.
- ///
- internal class ShapeRegion : Region
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The shape.
- public ShapeRegion(IPath shape)
- {
- this.Shape = shape.AsClosedPath();
- int left = (int)MathF.Floor(shape.Bounds.Left);
- int top = (int)MathF.Floor(shape.Bounds.Top);
-
- int right = (int)MathF.Ceiling(shape.Bounds.Right);
- int bottom = (int)MathF.Ceiling(shape.Bounds.Bottom);
- this.Bounds = Rectangle.FromLTRB(left, top, right, bottom);
- }
-
- ///
- /// Gets the fillable shape
- ///
- public IPath Shape { get; }
-
- ///
- public override int MaxIntersections => this.Shape.MaxIntersections;
-
- ///
- public override Rectangle Bounds { get; }
-
- ///
- public override int Scan(float y, Span buffer, Configuration configuration)
- {
- var start = new PointF(this.Bounds.Left - 1, y);
- var end = new PointF(this.Bounds.Right + 1, y);
-
- using (IMemoryOwner tempBuffer = configuration.MemoryAllocator.Allocate(buffer.Length))
- {
- Span innerBuffer = tempBuffer.Memory.Span;
- int count = this.Shape.FindIntersections(start, end, innerBuffer);
-
- for (int i = 0; i < count; i++)
- {
- buffer[i] = innerBuffer[i].X;
- }
-
- return count;
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs b/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
deleted file mode 100644
index a9df07ced..000000000
--- a/src/ImageSharp.Drawing/Processing/BrushApplicator.cs
+++ /dev/null
@@ -1,113 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A primitive that converts a point into a color for discovering the fill color based on an implementation.
- ///
- /// The pixel format.
- ///
- public abstract class BrushApplicator : IDisposable
- where TPixel : struct, IPixel
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target.
- internal BrushApplicator(Configuration configuration, GraphicsOptions options, ImageFrame target)
- {
- this.Configuration = configuration;
- this.Target = target;
- this.Options = options;
- this.Blender = PixelOperations.Instance.GetPixelBlender(options);
- }
-
- ///
- /// Gets the configuration instance to use when performing operations.
- ///
- protected Configuration Configuration { get; }
-
- ///
- /// Gets the pixel blender.
- ///
- internal PixelBlender Blender { get; }
-
- ///
- /// Gets the target image.
- ///
- protected ImageFrame Target { get; }
-
- ///
- /// Gets thegraphics options
- ///
- protected GraphicsOptions Options { get; }
-
- ///
- /// Gets the overlay pixel at the specified position.
- ///
- /// The x-coordinate.
- /// The y-coordinate.
- /// The at the specified position.
- internal abstract TPixel this[int x, int y] { get; }
-
- ///
- public void Dispose()
- {
- this.Dispose(true);
- GC.SuppressFinalize(this);
- }
-
- ///
- /// Disposes the object and frees resources for the Garbage Collector.
- ///
- /// Whether to dispose managed and unmanaged objects.
- protected virtual void Dispose(bool disposing)
- {
- }
-
- ///
- /// Applies the opacity weighting for each pixel in a scanline to the target based on the pattern contained in the brush.
- ///
- /// A collection of opacity values between 0 and 1 to be merged with the brushed color value before being applied to the target.
- /// The x-position in the target pixel space that the start of the scanline data corresponds to.
- /// The y-position in the target pixel space that whole scanline corresponds to.
- /// scanlineBuffer will be > scanlineWidth but provide and offset in case we want to share a larger buffer across runs.
- internal virtual void Apply(Span scanline, int x, int y)
- {
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- if (this.Options.BlendPercentage < 1)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
- }
- else
- {
- amountSpan[i] = scanline[i];
- }
-
- overlaySpan[i] = this[x + i, y];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(this.Configuration, destinationRow, destinationRow, overlaySpan, amountSpan);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Brushes.cs b/src/ImageSharp.Drawing/Processing/Brushes.cs
deleted file mode 100644
index bd10e90c6..000000000
--- a/src/ImageSharp.Drawing/Processing/Brushes.cs
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A collection of methods for creating generic brushes.
- ///
- /// A New
- public static class Brushes
- {
- ///
- /// Percent10 Hatch Pattern
- ///
- /// ---> x axis
- /// ^
- /// | y - axis
- /// |
- /// see PatternBrush for details about how to make new patterns work
- private static readonly bool[,] Percent10Pattern =
- {
- { true, false, false, false },
- { false, false, false, false },
- { false, false, true, false },
- { false, false, false, false }
- };
-
- ///
- /// Percent20 pattern.
- ///
- private static readonly bool[,] Percent20Pattern =
- {
- { true, false, false, false },
- { false, false, true, false },
- { true, false, false, false },
- { false, false, true, false }
- };
-
- ///
- /// Horizontal Hatch Pattern
- ///
- private static readonly bool[,] HorizontalPattern =
- {
- { false },
- { true },
- { false },
- { false }
- };
-
- ///
- /// Min Pattern
- ///
- private static readonly bool[,] MinPattern =
- {
- { false },
- { false },
- { false },
- { true }
- };
-
- ///
- /// Vertical Pattern
- ///
- private static readonly bool[,] VerticalPattern =
- {
- { false, true, false, false },
- };
-
- ///
- /// Forward Diagonal Pattern
- ///
- private static readonly bool[,] ForwardDiagonalPattern =
- {
- { false, false, false, true },
- { false, false, true, false },
- { false, true, false, false },
- { true, false, false, false }
- };
-
- ///
- /// Backward Diagonal Pattern
- ///
- private static readonly bool[,] BackwardDiagonalPattern =
- {
- { true, false, false, false },
- { false, true, false, false },
- { false, false, true, false },
- { false, false, false, true }
- };
-
- ///
- /// Create as brush that will paint a solid color
- ///
- /// The color.
- /// A New
- public static SolidBrush Solid(Color color) => new SolidBrush(color);
-
- ///
- /// Create as brush that will paint a Percent10 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Percent10(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, Percent10Pattern);
-
- ///
- /// Create as brush that will paint a Percent10 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Percent10(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, Percent10Pattern);
-
- ///
- /// Create as brush that will paint a Percent20 Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Percent20(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, Percent20Pattern);
-
- ///
- /// Create as brush that will paint a Percent20 Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Percent20(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, Percent20Pattern);
-
- ///
- /// Create as brush that will paint a Horizontal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Horizontal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, HorizontalPattern);
-
- ///
- /// Create as brush that will paint a Horizontal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Horizontal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, HorizontalPattern);
-
- ///
- /// Create as brush that will paint a Min Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Min(Color foreColor) => new PatternBrush(foreColor, Color.Transparent, MinPattern);
-
- ///
- /// Create as brush that will paint a Min Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Min(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, MinPattern);
-
- ///
- /// Create as brush that will paint a Vertical Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush Vertical(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, VerticalPattern);
-
- ///
- /// Create as brush that will paint a Vertical Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush Vertical(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, VerticalPattern);
-
- ///
- /// Create as brush that will paint a Forward Diagonal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush ForwardDiagonal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, ForwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Forward Diagonal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush ForwardDiagonal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, ForwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Backward Diagonal Hatch Pattern with the specified foreground color and a
- /// transparent background.
- ///
- /// Color of the foreground.
- /// A New
- public static PatternBrush BackwardDiagonal(Color foreColor) =>
- new PatternBrush(foreColor, Color.Transparent, BackwardDiagonalPattern);
-
- ///
- /// Create as brush that will paint a Backward Diagonal Hatch Pattern with the specified colors
- ///
- /// Color of the foreground.
- /// Color of the background.
- /// A New
- public static PatternBrush BackwardDiagonal(Color foreColor, Color backColor) =>
- new PatternBrush(foreColor, backColor, BackwardDiagonalPattern);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/ColorStop.cs b/src/ImageSharp.Drawing/Processing/ColorStop.cs
deleted file mode 100644
index 21c82b63f..000000000
--- a/src/ImageSharp.Drawing/Processing/ColorStop.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Diagnostics;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A struct that defines a single color stop.
- ///
- [DebuggerDisplay("ColorStop({Ratio} -> {Color}")]
- public readonly struct ColorStop
- {
- ///
- /// Initializes a new instance of the struct.
- ///
- /// Where should it be? 0 is at the start, 1 at the end of the Gradient.
- /// What color should be used at that point?
- public ColorStop(float ratio, in Color color)
- {
- this.Ratio = ratio;
- this.Color = color;
- }
-
- ///
- /// Gets the point along the defined gradient axis.
- ///
- public float Ratio { get; }
-
- ///
- /// Gets the color to be used.
- ///
- public Color Color { get; }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs b/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs
deleted file mode 100644
index 25a8204f2..000000000
--- a/src/ImageSharp.Drawing/Processing/DrawingHelpers.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- internal static class DrawingHelpers
- {
- ///
- /// Convert a to a of the given pixel type.
- ///
- public static DenseMatrix ToPixelMatrix(this DenseMatrix colorMatrix, Configuration configuration)
- where TPixel : struct, IPixel
- {
- var result = new DenseMatrix(colorMatrix.Columns, colorMatrix.Rows);
- Color.ToPixel(configuration, colorMatrix.Span, result.Span);
- return result;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs b/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs
deleted file mode 100644
index fbab3605d..000000000
--- a/src/ImageSharp.Drawing/Processing/EllipticGradientBrush.cs
+++ /dev/null
@@ -1,165 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Gradient Brush with elliptic shape.
- /// The ellipse is defined by a center point,
- /// a point on the longest extension of the ellipse and
- /// the ratio between longest and shortest extension.
- ///
- public sealed class EllipticGradientBrush : GradientBrush
- {
- private readonly PointF center;
-
- private readonly PointF referenceAxisEnd;
-
- private readonly float axisRatio;
-
- ///
- /// The center of the elliptical gradient and 0 for the color stops.
- /// The end point of the reference axis of the ellipse.
- ///
- /// The ratio of the axis widths.
- /// The second axis' is perpendicular to the reference axis and
- /// it's length is the reference axis' length multiplied by this factor.
- ///
- /// Defines how the colors of the gradients are repeated.
- /// the color stops as defined in base class.
- public EllipticGradientBrush(
- PointF center,
- PointF referenceAxisEnd,
- float axisRatio,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.center = center;
- this.referenceAxisEnd = referenceAxisEnd;
- this.axisRatio = axisRatio;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new RadialGradientBrushApplicator(
- configuration,
- options,
- source,
- this.center,
- this.referenceAxisEnd,
- this.axisRatio,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- private sealed class RadialGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly PointF referenceAxisEnd;
-
- private readonly float axisRatio;
-
- private readonly double rotation;
-
- private readonly float referenceRadius;
-
- private readonly float secondRadius;
-
- private readonly float cosRotation;
-
- private readonly float sinRotation;
-
- private readonly float secondRadiusSquared;
-
- private readonly float referenceRadiusSquared;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// Center of the ellipse.
- /// Point on one angular points of the ellipse.
- ///
- /// Ratio of the axis length's. Used to determine the length of the second axis,
- /// the first is defined by and .
- /// Definition of colors.
- /// Defines how the gradient colors are repeated.
- public RadialGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- PointF center,
- PointF referenceAxisEnd,
- float axisRatio,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target, colorStops, repetitionMode)
- {
- this.center = center;
- this.referenceAxisEnd = referenceAxisEnd;
- this.axisRatio = axisRatio;
- this.rotation = this.AngleBetween(
- this.center,
- new PointF(this.center.X + 1, this.center.Y),
- this.referenceAxisEnd);
- this.referenceRadius = this.DistanceBetween(this.center, this.referenceAxisEnd);
- this.secondRadius = this.referenceRadius * this.axisRatio;
-
- this.referenceRadiusSquared = this.referenceRadius * this.referenceRadius;
- this.secondRadiusSquared = this.secondRadius * this.secondRadius;
-
- this.sinRotation = (float)Math.Sin(this.rotation);
- this.cosRotation = (float)Math.Cos(this.rotation);
- }
-
- ///
- protected override float PositionOnGradient(float xt, float yt)
- {
- float x0 = xt - this.center.X;
- float y0 = yt - this.center.Y;
-
- float x = (x0 * this.cosRotation) - (y0 * this.sinRotation);
- float y = (x0 * this.sinRotation) + (y0 * this.cosRotation);
-
- float xSquared = x * x;
- float ySquared = y * y;
-
- return (xSquared / this.referenceRadiusSquared) + (ySquared / this.secondRadiusSquared);
- }
-
- private float AngleBetween(PointF junction, PointF a, PointF b)
- {
- PointF vA = a - junction;
- PointF vB = b - junction;
- return MathF.Atan2(vB.Y, vB.X) - MathF.Atan2(vA.Y, vA.X);
- }
-
- private float DistanceBetween(
- PointF p1,
- PointF p2)
- {
- // TODO: Can we not just use Vector2 distance here?
- float dX = p1.X - p2.X;
- float dXsquared = dX * dX;
-
- float dY = p1.Y - p2.Y;
- float dYsquared = dY * dY;
- return MathF.Sqrt(dXsquared + dYsquared);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs
deleted file mode 100644
index 7660e7225..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawBezierExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of Bezier paths to the type.
- ///
- public static class DrawBezierExtensions
- {
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawBeziers(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided points as an open Bezier path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawBeziers(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided points as an open Bezier path with the supplied pen
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Path(new CubicBezierLineSegment(points)));
-
- ///
- /// Draws the provided points as an open Bezier path with the supplied pen
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawBeziers(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(pen, new Path(new CubicBezierLineSegment(points)));
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs
deleted file mode 100644
index 98e8fdc59..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawLineExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of lines to the type.
- ///
- public static class DrawLineExtensions
- {
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawLines(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as an open Linear path at the provided thickness with the supplied brush
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .>
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawLines(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as an open Linear path with the supplied pen
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Path(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as an open Linear path with the supplied pen
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawLines(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(pen, new Path(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs
deleted file mode 100644
index 90b8c68ac..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathCollectionExtensions.cs
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of collections of polygon outlines to the type.
- ///
- public static class DrawPathCollectionExtensions
- {
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- IPathCollection paths)
- {
- foreach (IPath path in paths)
- {
- source.Draw(options, pen, path);
- }
-
- return source;
- }
-
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The paths.
- /// The .
- public static IImageProcessingContext
- Draw(this IImageProcessingContext source, IPen pen, IPathCollection paths) =>
- source.Draw(new GraphicsOptions(), pen, paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shapes.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- IPathCollection paths) =>
- source.Draw(options, new Pen(brush, thickness), paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- IPathCollection paths) =>
- source.Draw(new Pen(brush, thickness), paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- IPathCollection paths) =>
- source.Draw(options, new SolidBrush(color), thickness, paths);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The paths.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- IPathCollection paths) =>
- source.Draw(new SolidBrush(color), thickness, paths);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs
deleted file mode 100644
index 822375ca9..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPathExtensions.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of polygon outlines to the type.
- ///
- public static class DrawPathExtensions
- {
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- IPath path) =>
- source.Fill(options, pen.StrokeFill, new ShapePath(path, pen));
-
- ///
- /// Draws the outline of the polygon with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(this IImageProcessingContext source, IPen pen, IPath path) =>
- source.Draw(new GraphicsOptions(), pen, path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- IPath path) =>
- source.Draw(options, new Pen(brush, thickness), path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- IPath path) =>
- source.Draw(new Pen(brush, thickness), path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- IPath path) =>
- source.Draw(options, new SolidBrush(color), thickness, path);
-
- ///
- /// Draws the outline of the polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The path.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- IPath path) =>
- source.Draw(new SolidBrush(color), thickness, path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs
deleted file mode 100644
index d51e58645..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawPolygonExtensions.cs
+++ /dev/null
@@ -1,106 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of closed linear polygons to the type.
- ///
- public static class DrawPolygonExtensions
- {
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(options, new Pen(brush, thickness), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- params PointF[] points) =>
- source.Draw(new Pen(brush, thickness), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawPolygon(new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- params PointF[] points) =>
- source.DrawPolygon(options, new SolidBrush(color), thickness, points);
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided Pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- IPen pen,
- params PointF[] points) =>
- source.Draw(new GraphicsOptions(), pen, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Draws the provided Points as a closed Linear Polygon with the provided Pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The points.
- /// The .
- public static IImageProcessingContext DrawPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- params PointF[] points) =>
- source.Draw(options, pen, new Polygon(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs
deleted file mode 100644
index b3b5dd76a..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawRectangleExtensions.cs
+++ /dev/null
@@ -1,103 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of rectangles to the type.
- ///
- public static class DrawRectangleExtensions
- {
- ///
- /// Draws the outline of the rectangle with the provided pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The pen.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IPen pen,
- RectangleF shape) =>
- source.Draw(options, pen, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Draws the outline of the rectangle with the provided pen.
- ///
- /// The image this method extends.
- /// The pen.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(this IImageProcessingContext source, IPen pen, RectangleF shape) =>
- source.Draw(new GraphicsOptions(), pen, shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- float thickness,
- RectangleF shape) =>
- source.Draw(options, new Pen(brush, thickness), shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The brush.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- IBrush brush,
- float thickness,
- RectangleF shape) =>
- source.Draw(new Pen(brush, thickness), shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- float thickness,
- RectangleF shape) =>
- source.Draw(options, new SolidBrush(color), thickness, shape);
-
- ///
- /// Draws the outline of the rectangle with the provided brush at the provided thickness.
- ///
- /// The image this method extends.
- /// The color.
- /// The thickness.
- /// The shape.
- /// The .
- public static IImageProcessingContext Draw(
- this IImageProcessingContext source,
- Color color,
- float thickness,
- RectangleF shape) =>
- source.Draw(new SolidBrush(color), thickness, shape);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs
deleted file mode 100644
index 82dbb8d97..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/DrawTextExtensions.cs
+++ /dev/null
@@ -1,179 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.Processing.Processors.Text;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the drawing of text to the type.
- ///
- public static class DrawTextExtensions
- {
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The color.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- Color color,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, color, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The color.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- Color color,
- PointF location) =>
- source.DrawText(options, text, font, Brushes.Solid(color), null, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The brush.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IBrush brush,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, brush, location);
-
- ///
- /// Draws the text onto the the image filled via the brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The brush.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IBrush brush,
- PointF location) =>
- source.DrawText(options, text, font, brush, null, location);
-
- ///
- /// Draws the text onto the the image outlined via the pen.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IPen pen,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, pen, location);
-
- ///
- /// Draws the text onto the the image outlined via the pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IPen pen,
- PointF location) =>
- source.DrawText(options, text, font, null, pen, location);
-
- ///
- /// Draws the text onto the the image filled via the brush then outlined via the pen.
- ///
- /// The image this method extends.
- /// The text.
- /// The font.
- /// The brush.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- string text,
- Font font,
- IBrush brush,
- IPen pen,
- PointF location) =>
- source.DrawText(new TextGraphicsOptions(), text, font, brush, pen, location);
-
- ///
- /// Draws the text using the default resolution of 72dpi onto the the image filled via the brush then outlined via the pen.
- ///
- /// The image this method extends.
- /// The options.
- /// The text.
- /// The font.
- /// The brush.
- /// The pen.
- /// The location.
- ///
- /// The .
- ///
- public static IImageProcessingContext DrawText(
- this IImageProcessingContext source,
- TextGraphicsOptions options,
- string text,
- Font font,
- IBrush brush,
- IPen pen,
- PointF location) =>
- source.ApplyProcessor(new DrawTextProcessor(options, text, font, brush, pen, location));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs
deleted file mode 100644
index 030fe6ff1..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathBuilderExtensions.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of polygons with various brushes to the type.
- ///
- public static class FillPathBuilderExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- Action path)
- {
- var pb = new PathBuilder();
- path(pb);
-
- return source.Fill(options, brush, pb.Build());
- }
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- IBrush brush,
- Action path) =>
- source.Fill(new GraphicsOptions(), brush, path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- Action path) =>
- source.Fill(options, new SolidBrush(color), path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- Color color,
- Action path) =>
- source.Fill(new SolidBrush(color), path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs
deleted file mode 100644
index 5d8aaf307..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathCollectionExtensions.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of collections of polygon outlines to the type.
- ///
- public static class FillPathCollectionExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shapes.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- IPathCollection paths)
- {
- foreach (IPath s in paths)
- {
- source.Fill(options, brush, s);
- }
-
- return source;
- }
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- IBrush brush,
- IPathCollection paths) =>
- source.Fill(new GraphicsOptions(), brush, paths);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- IPathCollection paths) =>
- source.Fill(options, new SolidBrush(color), paths);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The paths.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- Color color,
- IPathCollection paths) =>
- source.Fill(new SolidBrush(color), paths);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs
deleted file mode 100644
index 4d262aa5f..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPathExtensions.cs
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of polygon outlines to the type.
- ///
- public static class FillPathExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- IPath path) =>
- source.Fill(options, brush, new ShapeRegion(path));
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush, IPath path) =>
- source.Fill(new GraphicsOptions(), brush, new ShapeRegion(path));
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush..
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- IPath path) =>
- source.Fill(options, new SolidBrush(color), path);
-
- ///
- /// Flood fills the image in the shape of the provided polygon with the specified brush..
- ///
- /// The image this method extends.
- /// The color.
- /// The path.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color, IPath path) =>
- source.Fill(new SolidBrush(color), path);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs
deleted file mode 100644
index 9262c8baa..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillPolygonExtensions.cs
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of closed linear polygons to the type.
- ///
- public static class FillPolygonExtensions
- {
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- params PointF[] points) =>
- source.Fill(options, brush, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The brush.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- IBrush brush,
- params PointF[] points) =>
- source.Fill(brush, new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- params PointF[] points) =>
- source.Fill(options, new SolidBrush(color), new Polygon(new LinearLineSegment(points)));
-
- ///
- /// Flood fills the image in the shape of a Linear polygon described by the points
- ///
- /// The image this method extends.
- /// The color.
- /// The points.
- /// The .
- public static IImageProcessingContext FillPolygon(
- this IImageProcessingContext source,
- Color color,
- params PointF[] points) =>
- source.Fill(new SolidBrush(color), new Polygon(new LinearLineSegment(points)));
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs
deleted file mode 100644
index cfe37deb2..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillRectangleExtensions.cs
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of rectangles to the type.
- ///
- public static class FillRectangleExtensions
- {
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- RectangleF shape) =>
- source.Fill(options, brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The shape.
- /// The .
- public static IImageProcessingContext
- Fill(this IImageProcessingContext source, IBrush brush, RectangleF shape) =>
- source.Fill(brush, new RectangularPolygon(shape.X, shape.Y, shape.Width, shape.Height));
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The shape.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- RectangleF shape) =>
- source.Fill(options, new SolidBrush(color), shape);
-
- ///
- /// Flood fills the image in the shape of the provided rectangle with the specified brush.
- ///
- /// The image this method extends.
- /// The color.
- /// The shape.
- /// The .
- public static IImageProcessingContext
- Fill(this IImageProcessingContext source, Color color, RectangleF shape) =>
- source.Fill(new SolidBrush(color), shape);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs b/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs
deleted file mode 100644
index fbb6dbda5..000000000
--- a/src/ImageSharp.Drawing/Processing/Extensions/FillRegionExtensions.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.ImageSharp.Processing.Processors.Drawing;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Adds extensions that allow the filling of regions with various brushes to the type.
- ///
- public static class FillRegionExtensions
- {
- ///
- /// Flood fills the image with the specified brush.
- ///
- /// The image this method extends.
- /// The details how to fill the region of interest.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush) =>
- source.Fill(new GraphicsOptions(), brush);
-
- ///
- /// Flood fills the image with the specified color.
- ///
- /// The image this method extends.
- /// The color.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color) =>
- source.Fill(new SolidBrush(color));
-
- ///
- /// Flood fills the image with in the region with the specified brush.
- ///
- /// The image this method extends.
- /// The brush.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, IBrush brush, Region region) =>
- source.Fill(new GraphicsOptions(), brush, region);
-
- ///
- /// Flood fills the image with in the region with the specified color.
- ///
- /// The image this method extends.
- /// The options.
- /// The color.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- Color color,
- Region region) =>
- source.Fill(options, new SolidBrush(color), region);
-
- ///
- /// Flood fills the image with in the region with the specified color.
- ///
- /// The image this method extends.
- /// The color.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(this IImageProcessingContext source, Color color, Region region) =>
- source.Fill(new SolidBrush(color), region);
-
- ///
- /// Flood fills the image with in the region with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The brush.
- /// The region.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush,
- Region region) =>
- source.ApplyProcessor(new FillRegionProcessor(options, brush, region));
-
- ///
- /// Flood fills the image with the specified brush.
- ///
- /// The image this method extends.
- /// The graphics options.
- /// The details how to fill the region of interest.
- /// The .
- public static IImageProcessingContext Fill(
- this IImageProcessingContext source,
- GraphicsOptions options,
- IBrush brush) =>
- source.ApplyProcessor(new FillProcessor(options, brush));
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/GradientBrush.cs b/src/ImageSharp.Drawing/Processing/GradientBrush.cs
deleted file mode 100644
index 3be56c042..000000000
--- a/src/ImageSharp.Drawing/Processing/GradientBrush.cs
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Numerics;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Base class for Gradient brushes
- ///
- public abstract class GradientBrush : IBrush
- {
- ///
- /// Defines how the colors are repeated beyond the interval [0..1]
- /// The gradient colors.
- protected GradientBrush(
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- {
- this.RepetitionMode = repetitionMode;
- this.ColorStops = colorStops;
- }
-
- ///
- /// Gets how the colors are repeated beyond the interval [0..1].
- ///
- protected GradientRepetitionMode RepetitionMode { get; }
-
- ///
- /// Gets the list of color stops for this gradient.
- ///
- protected ColorStop[] ColorStops { get; }
-
- ///
- public abstract BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel;
-
- ///
- /// Base class for gradient brush applicators
- ///
- internal abstract class GradientBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private static readonly TPixel Transparent = Color.Transparent.ToPixel();
-
- private readonly ColorStop[] colorStops;
-
- private readonly GradientRepetitionMode repetitionMode;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// An array of color stops sorted by their position.
- /// Defines if and how the gradient should be repeated.
- protected GradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target)
- {
- this.colorStops = colorStops; // TODO: requires colorStops to be sorted by position - should that be checked?
- this.repetitionMode = repetitionMode;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- float positionOnCompleteGradient = this.PositionOnGradient(x + 0.5f, y + 0.5f);
-
- switch (this.repetitionMode)
- {
- case GradientRepetitionMode.None:
- // do nothing. The following could be done, but is not necessary:
- // onLocalGradient = Math.Min(0, Math.Max(1, onLocalGradient));
- break;
- case GradientRepetitionMode.Repeat:
- positionOnCompleteGradient %= 1;
- break;
- case GradientRepetitionMode.Reflect:
- positionOnCompleteGradient %= 2;
- if (positionOnCompleteGradient > 1)
- {
- positionOnCompleteGradient = 2 - positionOnCompleteGradient;
- }
-
- break;
- case GradientRepetitionMode.DontFill:
- if (positionOnCompleteGradient > 1 || positionOnCompleteGradient < 0)
- {
- return Transparent;
- }
-
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
-
- (ColorStop from, ColorStop to) = this.GetGradientSegment(positionOnCompleteGradient);
-
- if (from.Color.Equals(to.Color))
- {
- return from.Color.ToPixel();
- }
- else
- {
- float onLocalGradient = (positionOnCompleteGradient - from.Ratio) / (to.Ratio - from.Ratio);
- return new Color(Vector4.Lerp((Vector4)from.Color, (Vector4)to.Color, onLocalGradient)).ToPixel();
- }
- }
- }
-
- ///
- /// calculates the position on the gradient for a given point.
- /// This method is abstract as it's content depends on the shape of the gradient.
- ///
- /// The x-coordinate of the point.
- /// The y-coordinate of the point.
- ///
- /// The position the given point has on the gradient.
- /// The position is not bound to the [0..1] interval.
- /// Values outside of that interval may be treated differently,
- /// e.g. for the enum.
- ///
- protected abstract float PositionOnGradient(float x, float y);
-
- private (ColorStop from, ColorStop to) GetGradientSegment(
- float positionOnCompleteGradient)
- {
- ColorStop localGradientFrom = this.colorStops[0];
- ColorStop localGradientTo = default;
-
- // TODO: ensure colorStops has at least 2 items (technically 1 would be okay, but that's no gradient)
- foreach (ColorStop colorStop in this.colorStops)
- {
- localGradientTo = colorStop;
-
- if (colorStop.Ratio > positionOnCompleteGradient)
- {
- // we're done here, so break it!
- break;
- }
-
- localGradientFrom = localGradientTo;
- }
-
- return (localGradientFrom, localGradientTo);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs b/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs
deleted file mode 100644
index 6aed8a030..000000000
--- a/src/ImageSharp.Drawing/Processing/GradientRepetitionMode.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Modes to repeat a gradient.
- ///
- public enum GradientRepetitionMode
- {
- ///
- /// don't repeat, keep the color of start and end beyond those points stable.
- ///
- None,
-
- ///
- /// Repeat the gradient.
- /// If it's a black-white gradient, with Repeat it will be Black->{gray}->White|Black->{gray}->White|...
- ///
- Repeat,
-
- ///
- /// Reflect the gradient.
- /// Similar to , but each other repetition uses inverse order of s.
- /// Used on a Black-White gradient, Reflect leads to Black->{gray}->White->{gray}->White...
- ///
- Reflect,
-
- ///
- /// With DontFill a gradient does not touch any pixel beyond it's borders.
- /// For the this is beyond the orthogonal through start and end,
- /// TODO For the cref="PolygonalGradientBrush" it's outside the polygon,
- /// For and it's beyond 1.0.
- ///
- DontFill
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/IBrush.cs b/src/ImageSharp.Drawing/Processing/IBrush.cs
deleted file mode 100644
index f4c7ef7cb..000000000
--- a/src/ImageSharp.Drawing/Processing/IBrush.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Brush represents a logical configuration of a brush which can be used to source pixel colors
- ///
- ///
- /// A brush is a simple class that will return an that will perform the
- /// logic for retrieving pixel values for specific locations.
- ///
- public interface IBrush
- {
- ///
- /// Creates the applicator for this brush.
- ///
- /// The pixel type.
- /// The configuration instance to use when performing operations.
- /// The graphic options.
- /// The source image.
- /// The region the brush will be applied to.
- ///
- /// The for this brush.
- ///
- ///
- /// The when being applied to things like shapes would usually be the
- /// bounding box of the shape not necessarily the bounds of the whole image.
- ///
- BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel;
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/IPen.cs b/src/ImageSharp.Drawing/Processing/IPen.cs
deleted file mode 100644
index 0efcfc108..000000000
--- a/src/ImageSharp.Drawing/Processing/IPen.cs
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Interface representing the pattern and size of the stroke to apply with a Pen.
- ///
- public interface IPen
- {
- ///
- /// Gets the stroke fill.
- ///
- IBrush StrokeFill { get; }
-
- ///
- /// Gets the width to apply to the stroke
- ///
- float StrokeWidth { get; }
-
- ///
- /// Gets the stoke pattern.
- ///
- ReadOnlySpan StrokePattern { get; }
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/ImageBrush.cs b/src/ImageSharp.Drawing/Processing/ImageBrush.cs
deleted file mode 100644
index e38614070..000000000
--- a/src/ImageSharp.Drawing/Processing/ImageBrush.cs
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of an image brush for painting images within areas.
- ///
- public class ImageBrush : IBrush
- {
- ///
- /// The image to paint.
- ///
- private readonly Image image;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The image.
- public ImageBrush(Image image)
- {
- this.image = image;
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- if (this.image is Image specificImage)
- {
- return new ImageBrushApplicator(configuration, options, source, specificImage, region, false);
- }
-
- specificImage = this.image.CloneAs();
-
- return new ImageBrushApplicator(configuration, options, source, specificImage, region, true);
- }
-
- ///
- /// The image brush applicator.
- ///
- private class ImageBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private ImageFrame sourceFrame;
-
- private Image sourceImage;
-
- private readonly bool shouldDisposeImage;
-
- ///
- /// The y-length.
- ///
- private readonly int yLength;
-
- ///
- /// The x-length.
- ///
- private readonly int xLength;
-
- ///
- /// The Y offset.
- ///
- private readonly int offsetY;
-
- ///
- /// The X offset.
- ///
- private readonly int offsetX;
-
- private bool isDisposed;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// The image.
- /// The region.
- /// Whether to dispose the image on disposal of the applicator.
- public ImageBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- Image image,
- RectangleF region,
- bool shouldDisposeImage)
- : base(configuration, options, target)
- {
- this.sourceImage = image;
- this.sourceFrame = image.Frames.RootFrame;
- this.shouldDisposeImage = shouldDisposeImage;
- this.xLength = image.Width;
- this.yLength = image.Height;
- this.offsetY = (int)MathF.Max(MathF.Floor(region.Top), 0);
- this.offsetX = (int)MathF.Max(MathF.Floor(region.Left), 0);
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- int srcX = (x - this.offsetX) % this.xLength;
- int srcY = (y - this.offsetY) % this.yLength;
- return this.sourceFrame[srcX, srcY];
- }
- }
-
- ///
- protected override void Dispose(bool disposing)
- {
- if (this.isDisposed)
- {
- return;
- }
-
- if (disposing && this.shouldDisposeImage)
- {
- this.sourceImage?.Dispose();
- }
-
- this.sourceImage = null;
- this.sourceFrame = null;
- this.isDisposed = true;
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- // Create a span for colors
- using (IMemoryOwner amountBuffer = this.Target.MemoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = this.Target.MemoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- int sourceY = (y - this.offsetY) % this.yLength;
- int offsetX = x - this.offsetX;
- Span sourceRow = this.sourceFrame.GetPixelRowSpan(sourceY);
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
-
- int sourceX = (i + offsetX) % this.xLength;
- overlaySpan[i] = sourceRow[sourceX];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs b/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs
deleted file mode 100644
index 044bee72c..000000000
--- a/src/ImageSharp.Drawing/Processing/LinearGradientBrush.cs
+++ /dev/null
@@ -1,160 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush for painting linear gradients within areas.
- /// Supported right now:
- /// - a set of colors in relative distances to each other.
- ///
- public sealed class LinearGradientBrush : GradientBrush
- {
- private readonly PointF p1;
-
- private readonly PointF p2;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Start point
- /// End point
- /// defines how colors are repeated.
- ///
- public LinearGradientBrush(
- PointF p1,
- PointF p2,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.p1 = p1;
- this.p2 = p2;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new LinearGradientBrushApplicator(
- configuration,
- options,
- source,
- this.p1,
- this.p2,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- /// The linear gradient brush applicator.
- ///
- private sealed class LinearGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF start;
-
- private readonly PointF end;
-
- ///
- /// the vector along the gradient, x component
- ///
- private readonly float alongX;
-
- ///
- /// the vector along the gradient, y component
- ///
- private readonly float alongY;
-
- ///
- /// the vector perpendicular to the gradient, y component
- ///
- private readonly float acrossY;
-
- ///
- /// the vector perpendicular to the gradient, x component
- ///
- private readonly float acrossX;
-
- ///
- /// the result of ^2 + ^2
- ///
- private readonly float alongsSquared;
-
- ///
- /// the length of the defined gradient (between source and end)
- ///
- private readonly float length;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The start point of the gradient.
- /// The end point of the gradient.
- /// A tuple list of colors and their respective position between 0 and 1 on the line.
- /// Defines how the gradient colors are repeated.
- public LinearGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- PointF start,
- PointF end,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, source, colorStops, repetitionMode)
- {
- this.start = start;
- this.end = end;
-
- // the along vector:
- this.alongX = this.end.X - this.start.X;
- this.alongY = this.end.Y - this.start.Y;
-
- // the cross vector:
- this.acrossX = this.alongY;
- this.acrossY = -this.alongX;
-
- // some helpers:
- this.alongsSquared = (this.alongX * this.alongX) + (this.alongY * this.alongY);
- this.length = MathF.Sqrt(this.alongsSquared);
- }
-
- protected override float PositionOnGradient(float x, float y)
- {
- if (this.acrossX == 0)
- {
- return (x - this.start.X) / (this.end.X - this.start.X);
- }
- else if (this.acrossY == 0)
- {
- return (y - this.start.Y) / (this.end.Y - this.start.Y);
- }
- else
- {
- float deltaX = x - this.start.X;
- float deltaY = y - this.start.Y;
- float k = ((this.alongY * deltaX) - (this.alongX * deltaY)) / this.alongsSquared;
-
- // point on the line:
- float x4 = x - (k * this.alongY);
- float y4 = y + (k * this.alongX);
-
- // get distance from (x4,y4) to start
- float distance = MathF.Sqrt(MathF.Pow(x4 - this.start.X, 2) + MathF.Pow(y4 - this.start.Y, 2));
-
- // get and return ratio
- return distance / this.length;
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs b/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs
deleted file mode 100644
index 9e354120e..000000000
--- a/src/ImageSharp.Drawing/Processing/PathGradientBrush.cs
+++ /dev/null
@@ -1,285 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Numerics;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush for painting gradients between multiple color positions in 2D coordinates.
- /// It works similarly with the class in System.Drawing.Drawing2D of the same name.
- ///
- public sealed class PathGradientBrush : IBrush
- {
- private readonly IList edges;
-
- private readonly Color centerColor;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Points that constitute a polygon that represents the gradient area.
- /// Array of colors that correspond to each point in the polygon.
- /// Color at the center of the gradient area to which the other colors converge.
- public PathGradientBrush(PointF[] points, Color[] colors, Color centerColor)
- {
- if (points == null)
- {
- throw new ArgumentNullException(nameof(points));
- }
-
- if (points.Length < 3)
- {
- throw new ArgumentOutOfRangeException(
- nameof(points),
- "There must be at least 3 lines to construct a path gradient brush.");
- }
-
- if (colors == null)
- {
- throw new ArgumentNullException(nameof(colors));
- }
-
- if (!colors.Any())
- {
- throw new ArgumentOutOfRangeException(
- nameof(colors),
- "One or more color is needed to construct a path gradient brush.");
- }
-
- int size = points.Length;
-
- var lines = new ILineSegment[size];
-
- for (int i = 0; i < size; i++)
- {
- lines[i] = new LinearLineSegment(points[i % size], points[(i + 1) % size]);
- }
-
- this.centerColor = centerColor;
-
- Color ColorAt(int index) => colors[index % colors.Length];
-
- this.edges = lines.Select(s => new Path(s))
- .Select((path, i) => new Edge(path, ColorAt(i), ColorAt(i + 1))).ToList();
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Points that constitute a polygon that represents the gradient area.
- /// Array of colors that correspond to each point in the polygon.
- public PathGradientBrush(PointF[] points, Color[] colors)
- : this(points, colors, CalculateCenterColor(colors))
- {
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new PathGradientBrushApplicator(configuration, options, source, this.edges, this.centerColor);
- }
-
- private static Color CalculateCenterColor(Color[] colors)
- {
- if (colors == null)
- {
- throw new ArgumentNullException(nameof(colors));
- }
-
- if (!colors.Any())
- {
- throw new ArgumentOutOfRangeException(
- nameof(colors),
- "One or more color is needed to construct a path gradient brush.");
- }
-
- return new Color(colors.Select(c => (Vector4)c).Aggregate((p1, p2) => p1 + p2) / colors.Length);
- }
-
- private static float DistanceBetween(PointF p1, PointF p2) => ((Vector2)(p2 - p1)).Length();
-
- private struct Intersection
- {
- public Intersection(PointF point, float distance)
- {
- this.Point = point;
- this.Distance = distance;
- }
-
- public PointF Point { get; }
-
- public float Distance { get; }
- }
-
- ///
- /// An edge of the polygon that represents the gradient area.
- ///
- private class Edge
- {
- private readonly Path path;
-
- private readonly float length;
-
- private readonly PointF[] buffer;
-
- public Edge(Path path, Color startColor, Color endColor)
- {
- this.path = path;
-
- Vector2[] points = path.LineSegments.SelectMany(s => s.Flatten()).Select(p => (Vector2)p).ToArray();
-
- this.Start = points.First();
- this.StartColor = (Vector4)startColor;
-
- this.End = points.Last();
- this.EndColor = (Vector4)endColor;
-
- this.length = DistanceBetween(this.End, this.Start);
- this.buffer = new PointF[this.path.MaxIntersections];
- }
-
- public PointF Start { get; }
-
- public Vector4 StartColor { get; }
-
- public PointF End { get; }
-
- public Vector4 EndColor { get; }
-
- public Intersection? FindIntersection(PointF start, PointF end)
- {
- int intersections = this.path.FindIntersections(start, end, this.buffer);
-
- if (intersections == 0)
- {
- return null;
- }
-
- return this.buffer.Take(intersections)
- .Select(p => new Intersection(point: p, distance: ((Vector2)(p - start)).LengthSquared()))
- .Aggregate((min, current) => min.Distance > current.Distance ? current : min);
- }
-
- public Vector4 ColorAt(float distance)
- {
- float ratio = this.length > 0 ? distance / this.length : 0;
-
- return Vector4.Lerp(this.StartColor, this.EndColor, ratio);
- }
-
- public Vector4 ColorAt(PointF point) => this.ColorAt(DistanceBetween(point, this.Start));
- }
-
- ///
- /// The path gradient brush applicator.
- ///
- private class PathGradientBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly Vector4 centerColor;
-
- private readonly float maxDistance;
-
- private readonly IList edges;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// Edges of the polygon.
- /// Color at the center of the gradient area to which the other colors converge.
- public PathGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- IList edges,
- Color centerColor)
- : base(configuration, options, source)
- {
- this.edges = edges;
-
- PointF[] points = edges.Select(s => s.Start).ToArray();
-
- this.center = points.Aggregate((p1, p2) => p1 + p2) / edges.Count;
- this.centerColor = (Vector4)centerColor;
-
- this.maxDistance = points.Select(p => (Vector2)(p - this.center)).Select(d => d.Length()).Max();
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- var point = new PointF(x, y);
-
- if (point == this.center)
- {
- return new Color(this.centerColor).ToPixel();
- }
-
- var direction = Vector2.Normalize(point - this.center);
-
- PointF end = point + (PointF)(direction * this.maxDistance);
-
- (Edge edge, Intersection? info) = this.FindIntersection(point, end);
-
- if (!info.HasValue)
- {
- return Color.Transparent.ToPixel();
- }
-
- PointF intersection = info.Value.Point;
-
- Vector4 edgeColor = edge.ColorAt(intersection);
-
- float length = DistanceBetween(intersection, this.center);
- float ratio = length > 0 ? DistanceBetween(intersection, point) / length : 0;
-
- var color = Vector4.Lerp(edgeColor, this.centerColor, ratio);
-
- return new Color(color).ToPixel();
- }
- }
-
- private (Edge edge, Intersection? info) FindIntersection(PointF start, PointF end)
- {
- (Edge edge, Intersection? info) closest = default;
-
- foreach (Edge edge in this.edges)
- {
- Intersection? intersection = edge.FindIntersection(start, end);
-
- if (!intersection.HasValue)
- {
- continue;
- }
-
- if (closest.info == null || closest.info.Value.Distance > intersection.Value.Distance)
- {
- closest = (edge, intersection);
- }
- }
-
- return closest;
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/PatternBrush.cs b/src/ImageSharp.Drawing/Processing/PatternBrush.cs
deleted file mode 100644
index 726df5a79..000000000
--- a/src/ImageSharp.Drawing/Processing/PatternBrush.cs
+++ /dev/null
@@ -1,178 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using System.Numerics;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a pattern brush for painting patterns.
- ///
- ///
- /// The patterns that are used to create a custom pattern brush are made up of a repeating matrix of flags,
- /// where each flag denotes whether to draw the foreground color or the background color.
- /// so to create a new bool[,] with your flags
- ///
- /// For example if you wanted to create a diagonal line that repeat every 4 pixels you would use a pattern like so
- /// 1000
- /// 0100
- /// 0010
- /// 0001
- ///
- ///
- /// or you want a horizontal stripe which is 3 pixels apart you would use a pattern like
- /// 1
- /// 0
- /// 0
- ///
- ///
- public class PatternBrush : IBrush
- {
- ///
- /// The pattern.
- ///
- private readonly DenseMatrix pattern;
- private readonly DenseMatrix patternVector;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the fore.
- /// Color of the back.
- /// The pattern.
- public PatternBrush(Color foreColor, Color backColor, bool[,] pattern)
- : this(foreColor, backColor, new DenseMatrix(pattern))
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the fore.
- /// Color of the back.
- /// The pattern.
- internal PatternBrush(Color foreColor, Color backColor, in DenseMatrix pattern)
- {
- var foreColorVector = (Vector4)foreColor;
- var backColorVector = (Vector4)backColor;
- this.pattern = new DenseMatrix(pattern.Columns, pattern.Rows);
- this.patternVector = new DenseMatrix(pattern.Columns, pattern.Rows);
- for (int i = 0; i < pattern.Data.Length; i++)
- {
- if (pattern.Data[i])
- {
- this.pattern.Data[i] = foreColor;
- this.patternVector.Data[i] = foreColorVector;
- }
- else
- {
- this.pattern.Data[i] = backColor;
- this.patternVector.Data[i] = backColorVector;
- }
- }
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- internal PatternBrush(PatternBrush brush)
- {
- this.pattern = brush.pattern;
- this.patternVector = brush.patternVector;
- }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel =>
- new PatternBrushApplicator(
- configuration,
- options,
- source,
- this.pattern.ToPixelMatrix(configuration));
-
- ///
- /// The pattern brush applicator.
- ///
- private class PatternBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- ///
- /// The pattern.
- ///
- private readonly DenseMatrix pattern;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The pattern.
- public PatternBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- in DenseMatrix pattern)
- : base(configuration, options, source)
- {
- this.pattern = pattern;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- x %= this.pattern.Columns;
- y %= this.pattern.Rows;
-
- // 2d array index at row/column
- return this.pattern[y, x];
- }
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- int patternY = y % this.pattern.Rows;
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = NumberUtils.ClampFloat(scanline[i] * this.Options.BlendPercentage, 0, 1F);
-
- int patternX = (x + i) % this.pattern.Columns;
- overlaySpan[i] = this.pattern[patternY, patternX];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Pen.cs b/src/ImageSharp.Drawing/Processing/Pen.cs
deleted file mode 100644
index ebad687d5..000000000
--- a/src/ImageSharp.Drawing/Processing/Pen.cs
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides a pen that can apply a pattern to a line with a set brush and thickness
- ///
- ///
- /// The pattern will be in to the form of new float[]{ 1f, 2f, 0.5f} this will be
- /// converted into a pattern that is 3.5 times longer that the width with 3 sections
- /// section 1 will be width long (making a square) and will be filled by the brush
- /// section 2 will be width * 2 long and will be empty
- /// section 3 will be width/2 long and will be filled
- /// the the pattern will immediately repeat without gap.
- ///
- public class Pen : IPen
- {
- private readonly float[] pattern;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- /// The width.
- /// The pattern.
- public Pen(Color color, float width, float[] pattern)
- : this(new SolidBrush(color), width, pattern)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- /// The width.
- /// The pattern.
- public Pen(IBrush brush, float width, float[] pattern)
- {
- this.StrokeFill = brush;
- this.StrokeWidth = width;
- this.pattern = pattern;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- /// The width.
- public Pen(Color color, float width)
- : this(new SolidBrush(color), width)
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The brush.
- /// The width.
- public Pen(IBrush brush, float width)
- : this(brush, width, Pens.EmptyPattern)
- {
- }
-
- ///
- public IBrush StrokeFill { get; }
-
- ///
- public float StrokeWidth { get; }
-
- ///
- public ReadOnlySpan StrokePattern => this.pattern;
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Pens.cs b/src/ImageSharp.Drawing/Processing/Pens.cs
deleted file mode 100644
index e60b5b6c7..000000000
--- a/src/ImageSharp.Drawing/Processing/Pens.cs
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Contains a collection of common Pen styles
- ///
- public static class Pens
- {
- private static readonly float[] DashDotPattern = { 3f, 1f, 1f, 1f };
- private static readonly float[] DashDotDotPattern = { 3f, 1f, 1f, 1f, 1f, 1f };
- private static readonly float[] DottedPattern = { 1f, 1f };
- private static readonly float[] DashedPattern = { 3f, 1f };
- internal static readonly float[] EmptyPattern = new float[0];
-
- ///
- /// Create a solid pen with out any drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Solid(Color color, float width) => new Pen(color, width);
-
- ///
- /// Create a solid pen with out any drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Solid(IBrush brush, float width) => new Pen(brush, width);
-
- ///
- /// Create a pen with a 'Dash' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Dash(Color color, float width) => new Pen(color, width, DashedPattern);
-
- ///
- /// Create a pen with a 'Dash' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Dash(IBrush brush, float width) => new Pen(brush, width, DashedPattern);
-
- ///
- /// Create a pen with a 'Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen Dot(Color color, float width) => new Pen(color, width, DottedPattern);
-
- ///
- /// Create a pen with a 'Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen Dot(IBrush brush, float width) => new Pen(brush, width, DottedPattern);
-
- ///
- /// Create a pen with a 'Dash Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen DashDot(Color color, float width) => new Pen(color, width, DashDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen DashDot(IBrush brush, float width) => new Pen(brush, width, DashDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot Dot' drawing patterns
- ///
- /// The color.
- /// The width.
- /// The Pen
- public static Pen DashDotDot(Color color, float width) => new Pen(color, width, DashDotDotPattern);
-
- ///
- /// Create a pen with a 'Dash Dot Dot' drawing patterns
- ///
- /// The brush.
- /// The width.
- /// The Pen
- public static Pen DashDotDot(IBrush brush, float width) => new Pen(brush, width, DashDotDotPattern);
- }
-}
\ No newline at end of file
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
deleted file mode 100644
index c94e0c179..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Defines a processor to fill an with the given
- /// using blending defined by the given .
- ///
- public class FillProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The defining how to blend the brush pixels over the image pixels.
- /// The brush to use for filling.
- public FillProcessor(GraphicsOptions options, IBrush brush)
- {
- this.Brush = brush;
- this.Options = options;
- }
-
- ///
- /// Gets the used for filling the destination image.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the defining how to blend the brush pixels over the image pixels.
- ///
- public GraphicsOptions Options { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new FillProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs
deleted file mode 100644
index 524b66e05..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillProcessor{TPixel}.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Advanced.ParallelUtils;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Using the brush as a source of pixels colors blends the brush color with source.
- ///
- /// The pixel format.
- internal class FillProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private readonly FillProcessor definition;
-
- public FillProcessor(Configuration configuration, FillProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- Rectangle sourceRectangle = this.SourceRectangle;
- Configuration configuration = this.Configuration;
- int startX = sourceRectangle.X;
- int endX = sourceRectangle.Right;
- int startY = sourceRectangle.Y;
- int endY = sourceRectangle.Bottom;
-
- // Align start/end positions.
- int minX = Math.Max(0, startX);
- int maxX = Math.Min(source.Width, endX);
- int minY = Math.Max(0, startY);
- int maxY = Math.Min(source.Height, endY);
-
- int width = maxX - minX;
-
- var workingRect = Rectangle.FromLTRB(minX, minY, maxX, maxY);
-
- IBrush brush = this.definition.Brush;
- GraphicsOptions options = this.definition.Options;
-
- // If there's no reason for blending, then avoid it.
- if (this.IsSolidBrushWithoutBlending(out SolidBrush solidBrush))
- {
- ParallelExecutionSettings parallelSettings = ParallelExecutionSettings.FromConfiguration(configuration)
- .MultiplyMinimumPixelsPerTask(4);
-
- TPixel colorPixel = solidBrush.Color.ToPixel();
-
- ParallelHelper.IterateRows(
- workingRect,
- parallelSettings,
- rows =>
- {
- for (int y = rows.Min; y < rows.Max; y++)
- {
- source.GetPixelRowSpan(y).Slice(minX, width).Fill(colorPixel);
- }
- });
- }
- else
- {
- // Reset offset if necessary.
- if (minX > 0)
- {
- startX = 0;
- }
-
- if (minY > 0)
- {
- startY = 0;
- }
-
- using (IMemoryOwner amount = source.MemoryAllocator.Allocate(width))
- using (BrushApplicator applicator = brush.CreateApplicator(
- configuration,
- options,
- source,
- sourceRectangle))
- {
- amount.Memory.Span.Fill(1f);
-
- ParallelHelper.IterateRows(
- workingRect,
- configuration,
- rows =>
- {
- for (int y = rows.Min; y < rows.Max; y++)
- {
- int offsetY = y - startY;
- int offsetX = minX - startX;
-
- applicator.Apply(amount.Memory.Span, offsetX, offsetY);
- }
- });
- }
- }
- }
-
- private bool IsSolidBrushWithoutBlending(out SolidBrush solidBrush)
- {
- solidBrush = this.definition.Brush as SolidBrush;
-
- if (solidBrush is null)
- {
- return false;
- }
-
- return this.definition.Options.IsOpaqueColorWithoutBlending(solidBrush.Color);
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
deleted file mode 100644
index 6cfeb785c..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Defines a processor to fill pixels withing a given
- /// with the given and blending defined by the given .
- ///
- public class FillRegionProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The graphics options.
- /// The details how to fill the region of interest.
- /// The region of interest to be filled.
- public FillRegionProcessor(GraphicsOptions options, IBrush brush, Region region)
- {
- this.Region = region;
- this.Brush = brush;
- this.Options = options;
- }
-
- ///
- /// Gets the used for filling the destination image.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the region that this processor applies to.
- ///
- public Region Region { get; }
-
- ///
- /// Gets the defining how to blend the brush pixels over the image pixels.
- ///
- public GraphicsOptions Options { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new FillRegionProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs
deleted file mode 100644
index 7d632ad23..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Drawing/FillRegionProcessor{TPixel}.cs
+++ /dev/null
@@ -1,197 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Primitives;
-using SixLabors.ImageSharp.Utils;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Drawing
-{
- ///
- /// Using a brush and a shape fills shape with contents of brush the
- ///
- /// The type of the color.
- ///
- internal class FillRegionProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private readonly FillRegionProcessor definition;
-
- public FillRegionProcessor(Configuration configuration, FillRegionProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- Configuration configuration = this.Configuration;
- GraphicsOptions options = this.definition.Options;
- IBrush brush = this.definition.Brush;
- Region region = this.definition.Region;
- Rectangle rect = region.Bounds;
-
- // Align start/end positions.
- int minX = Math.Max(0, rect.Left);
- int maxX = Math.Min(source.Width, rect.Right);
- int minY = Math.Max(0, rect.Top);
- int maxY = Math.Min(source.Height, rect.Bottom);
- if (minX >= maxX)
- {
- return; // no effect inside image;
- }
-
- if (minY >= maxY)
- {
- return; // no effect inside image;
- }
-
- int maxIntersections = region.MaxIntersections;
- float subpixelCount = 4;
-
- // we need to offset the pixel grid to account for when we outline a path.
- // basically if the line is [1,2] => [3,2] then when outlining at 1 we end up with a region of [0.5,1.5],[1.5, 1.5],[3.5,2.5],[2.5,2.5]
- // and this can cause missed fills when not using antialiasing.so we offset the pixel grid by 0.5 in the x & y direction thus causing the#
- // region to align with the pixel grid.
- float offset = 0.5f;
- if (options.Antialias)
- {
- offset = 0f; // we are antialiasing skip offsetting as real antialiasing should take care of offset.
- subpixelCount = options.AntialiasSubpixelDepth;
- if (subpixelCount < 4)
- {
- subpixelCount = 4;
- }
- }
-
- using (BrushApplicator applicator = brush.CreateApplicator(configuration, options, source, rect))
- {
- int scanlineWidth = maxX - minX;
- using (IMemoryOwner bBuffer = source.MemoryAllocator.Allocate(maxIntersections))
- using (IMemoryOwner bScanline = source.MemoryAllocator.Allocate(scanlineWidth))
- {
- bool scanlineDirty = true;
- float subpixelFraction = 1f / subpixelCount;
- float subpixelFractionPoint = subpixelFraction / subpixelCount;
-
- Span buffer = bBuffer.Memory.Span;
- Span scanline = bScanline.Memory.Span;
-
- bool isSolidBrushWithoutBlending = this.IsSolidBrushWithoutBlending(out SolidBrush solidBrush);
- TPixel solidBrushColor = isSolidBrushWithoutBlending ? solidBrush.Color.ToPixel() : default;
-
- for (int y = minY; y < maxY; y++)
- {
- if (scanlineDirty)
- {
- scanline.Clear();
- scanlineDirty = false;
- }
-
- float yPlusOne = y + 1;
- for (float subPixel = y; subPixel < yPlusOne; subPixel += subpixelFraction)
- {
- int pointsFound = region.Scan(subPixel + offset, buffer, configuration);
- if (pointsFound == 0)
- {
- // nothing on this line, skip
- continue;
- }
-
- QuickSort.Sort(buffer.Slice(0, pointsFound));
-
- for (int point = 0; point < pointsFound && point < buffer.Length - 1; point += 2)
- {
- // points will be paired up
- float scanStart = buffer[point] - minX;
- float scanEnd = buffer[point + 1] - minX;
- int startX = (int)MathF.Floor(scanStart + offset);
- int endX = (int)MathF.Floor(scanEnd + offset);
-
- if (startX >= 0 && startX < scanline.Length)
- {
- for (float x = scanStart; x < startX + 1; x += subpixelFraction)
- {
- scanline[startX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- if (endX >= 0 && endX < scanline.Length)
- {
- for (float x = endX; x < scanEnd; x += subpixelFraction)
- {
- scanline[endX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- int nextX = startX + 1;
- endX = Math.Min(endX, scanline.Length); // reduce to end to the right edge
- nextX = Math.Max(nextX, 0);
- for (int x = nextX; x < endX; x++)
- {
- scanline[x] += subpixelFraction;
- scanlineDirty = true;
- }
- }
- }
-
- if (scanlineDirty)
- {
- if (!options.Antialias)
- {
- bool hasOnes = false;
- bool hasZeros = false;
- for (int x = 0; x < scanlineWidth; x++)
- {
- if (scanline[x] >= 0.5)
- {
- scanline[x] = 1;
- hasOnes = true;
- }
- else
- {
- scanline[x] = 0;
- hasZeros = true;
- }
- }
-
- if (isSolidBrushWithoutBlending && hasOnes != hasZeros)
- {
- if (hasOnes)
- {
- source.GetPixelRowSpan(y).Slice(minX, scanlineWidth).Fill(solidBrushColor);
- }
-
- continue;
- }
- }
-
- applicator.Apply(scanline, minX, y);
- }
- }
- }
- }
- }
-
- private bool IsSolidBrushWithoutBlending(out SolidBrush solidBrush)
- {
- solidBrush = this.definition.Brush as SolidBrush;
-
- if (solidBrush == null)
- {
- return false;
- }
-
- return this.definition.Options.IsOpaqueColorWithoutBlending(solidBrush.Color);
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
deleted file mode 100644
index 75774a628..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor.cs
+++ /dev/null
@@ -1,79 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Text
-{
- ///
- /// Defines a processor to draw text on an .
- ///
- public class DrawTextProcessor : IImageProcessor
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The options
- /// The text we want to render
- /// The font we want to render with
- /// The brush to source pixel colors from.
- /// The pen to outline text with.
- /// The location on the image to start drawing the text from.
- public DrawTextProcessor(TextGraphicsOptions options, string text, Font font, IBrush brush, IPen pen, PointF location)
- {
- Guard.NotNull(text, nameof(text));
- Guard.NotNull(font, nameof(font));
-
- if (brush is null && pen is null)
- {
- throw new ArgumentNullException($"Expected a {nameof(brush)} or {nameof(pen)}. Both were null");
- }
-
- this.Options = options;
- this.Text = text;
- this.Font = font;
- this.Location = location;
- this.Brush = brush;
- this.Pen = pen;
- }
-
- ///
- /// Gets the brush used to fill the glyphs.
- ///
- public IBrush Brush { get; }
-
- ///
- /// Gets the defining blending modes and text-specific drawing settings.
- ///
- public TextGraphicsOptions Options { get; }
-
- ///
- /// Gets the text to draw.
- ///
- public string Text { get; }
-
- ///
- /// Gets the pen used for outlining the text, if Null then we will not outline
- ///
- public IPen Pen { get; }
-
- ///
- /// Gets the font used to render the text.
- ///
- public Font Font { get; }
-
- ///
- /// Gets the location to draw the text at.
- ///
- public PointF Location { get; }
-
- ///
- public IImageProcessor CreatePixelSpecificProcessor(Configuration configuration, Image source, Rectangle sourceRectangle)
- where TPixel : struct, IPixel
- => new DrawTextProcessor(configuration, this, source, sourceRectangle);
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs b/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs
deleted file mode 100644
index c47f764a2..000000000
--- a/src/ImageSharp.Drawing/Processing/Processors/Text/DrawTextProcessor{TPixel}.cs
+++ /dev/null
@@ -1,453 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using System.Collections.Generic;
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.Memory;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.ImageSharp.Utils;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-using SixLabors.Shapes;
-
-namespace SixLabors.ImageSharp.Processing.Processors.Text
-{
- ///
- /// Using the brush as a source of pixels colors blends the brush color with source.
- ///
- /// The pixel format.
- internal class DrawTextProcessor : ImageProcessor
- where TPixel : struct, IPixel
- {
- private CachingGlyphRenderer textRenderer;
-
- private readonly DrawTextProcessor definition;
-
- public DrawTextProcessor(Configuration configuration, DrawTextProcessor definition, Image source, Rectangle sourceRectangle)
- : base(configuration, source, sourceRectangle)
- {
- this.definition = definition;
- }
-
- private TextGraphicsOptions Options => this.definition.Options;
-
- private Font Font => this.definition.Font;
-
- private PointF Location => this.definition.Location;
-
- private string Text => this.definition.Text;
-
- private IPen Pen => this.definition.Pen;
-
- private IBrush Brush => this.definition.Brush;
-
- protected override void BeforeImageApply()
- {
- base.BeforeImageApply();
-
- // do everything at the image level as we are delegating the processing down to other processors
- var style = new RendererOptions(this.Font, this.Options.DpiX, this.Options.DpiY, this.Location)
- {
- ApplyKerning = this.Options.ApplyKerning,
- TabWidth = this.Options.TabWidth,
- WrappingWidth = this.Options.WrapTextWidth,
- HorizontalAlignment = this.Options.HorizontalAlignment,
- VerticalAlignment = this.Options.VerticalAlignment
- };
-
- this.textRenderer = new CachingGlyphRenderer(this.Configuration.MemoryAllocator, this.Text.Length, this.Pen, this.Brush != null);
- this.textRenderer.Options = (GraphicsOptions)this.Options;
- var renderer = new TextRenderer(this.textRenderer);
- renderer.RenderText(this.Text, style);
- }
-
- protected override void AfterImageApply()
- {
- base.AfterImageApply();
- this.textRenderer?.Dispose();
- this.textRenderer = null;
- }
-
- ///
- protected override void OnFrameApply(ImageFrame source)
- {
- // this is a no-op as we have processes all as an image, we should be able to pass out of before email apply a skip frames outcome
- Draw(this.textRenderer.FillOperations, this.Brush);
- Draw(this.textRenderer.OutlineOperations, this.Pen?.StrokeFill);
-
- void Draw(List operations, IBrush brush)
- {
- if (operations?.Count > 0)
- {
- using (BrushApplicator app = brush.CreateApplicator(this.Configuration, this.textRenderer.Options, source, this.SourceRectangle))
- {
- foreach (DrawingOperation operation in operations)
- {
- Buffer2D buffer = operation.Map;
- int startY = operation.Location.Y;
- int startX = operation.Location.X;
- int offsetSpan = 0;
- if (startX < 0)
- {
- offsetSpan = -startX;
- startX = 0;
- }
-
- if (startX >= source.Width)
- {
- continue;
- }
-
- int firstRow = 0;
- if (startY < 0)
- {
- firstRow = -startY;
- }
-
- int maxHeight = source.Height - startY;
- int end = Math.Min(operation.Map.Height, maxHeight);
-
- for (int row = firstRow; row < end; row++)
- {
- int y = startY + row;
- Span span = buffer.GetRowSpan(row).Slice(offsetSpan);
- app.Apply(span, startX, y);
- }
- }
- }
- }
- }
- }
-
- private struct DrawingOperation
- {
- public Buffer2D Map { get; set; }
-
- public Point Location { get; set; }
- }
-
- private class CachingGlyphRenderer : IGlyphRenderer, IDisposable
- {
- // just enough accuracy to allow for 1/8 pixel differences which
- // later are accumulated while rendering, but do not grow into full pixel offsets
- // The value 8 is benchmarked to:
- // - Provide a good accuracy (smaller than 0.2% image difference compared to the non-caching variant)
- // - Cache hit ratio above 60%
- private const float AccuracyMultiple = 8;
-
- private readonly PathBuilder builder;
-
- private Point currentRenderPosition;
- private (GlyphRendererParameters glyph, PointF subPixelOffset) currentGlyphRenderParams;
- private readonly int offset;
- private PointF currentPoint;
-
- private readonly Dictionary<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData>
- glyphData = new Dictionary<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData>();
-
- private readonly bool renderOutline;
- private readonly bool renderFill;
- private bool rasterizationRequired;
-
- public CachingGlyphRenderer(MemoryAllocator memoryAllocator, int size, IPen pen, bool renderFill)
- {
- this.MemoryAllocator = memoryAllocator;
- this.currentRenderPosition = default;
- this.Pen = pen;
- this.renderFill = renderFill;
- this.renderOutline = pen != null;
- this.offset = 2;
- if (this.renderFill)
- {
- this.FillOperations = new List(size);
- }
-
- if (this.renderOutline)
- {
- this.offset = (int)MathF.Ceiling((pen.StrokeWidth * 2) + 2);
- this.OutlineOperations = new List(size);
- }
-
- this.builder = new PathBuilder();
- }
-
- public List FillOperations { get; }
-
- public List OutlineOperations { get; }
-
- public MemoryAllocator MemoryAllocator { get; internal set; }
-
- public IPen Pen { get; internal set; }
-
- public GraphicsOptions Options { get; internal set; }
-
- public void BeginFigure()
- {
- this.builder.StartFigure();
- }
-
- public bool BeginGlyph(RectangleF bounds, GlyphRendererParameters parameters)
- {
- this.currentRenderPosition = Point.Truncate(bounds.Location);
- PointF subPixelOffset = bounds.Location - this.currentRenderPosition;
-
- subPixelOffset.X = MathF.Round(subPixelOffset.X * AccuracyMultiple) / AccuracyMultiple;
- subPixelOffset.Y = MathF.Round(subPixelOffset.Y * AccuracyMultiple) / AccuracyMultiple;
-
- // we have offset our rendering origin a little bit down to prevent edge cropping, move the draw origin up to compensate
- this.currentRenderPosition = new Point(this.currentRenderPosition.X - this.offset, this.currentRenderPosition.Y - this.offset);
- this.currentGlyphRenderParams = (parameters, subPixelOffset);
-
- if (this.glyphData.ContainsKey(this.currentGlyphRenderParams))
- {
- // we have already drawn the glyph vectors skip trying again
- this.rasterizationRequired = false;
- return false;
- }
-
- // we check to see if we have a render cache and if we do then we render else
- this.builder.Clear();
-
- // ensure all glyphs render around [zero, zero] so offset negative root positions so when we draw the glyph we can offset it back
- this.builder.SetOrigin(new PointF(-(int)bounds.X + this.offset, -(int)bounds.Y + this.offset));
-
- this.rasterizationRequired = true;
- return true;
- }
-
- public void BeginText(RectangleF bounds)
- {
- // not concerned about this one
- this.OutlineOperations?.Clear();
- this.FillOperations?.Clear();
- }
-
- public void CubicBezierTo(PointF secondControlPoint, PointF thirdControlPoint, PointF point)
- {
- this.builder.AddBezier(this.currentPoint, secondControlPoint, thirdControlPoint, point);
- this.currentPoint = point;
- }
-
- public void Dispose()
- {
- foreach (KeyValuePair<(GlyphRendererParameters glyph, PointF subPixelOffset), GlyphRenderData> kv in this.glyphData)
- {
- kv.Value.Dispose();
- }
-
- this.glyphData.Clear();
- }
-
- public void EndFigure()
- {
- this.builder.CloseFigure();
- }
-
- public void EndGlyph()
- {
- GlyphRenderData renderData = default;
-
- // has the glyph been rendered already?
- if (this.rasterizationRequired)
- {
- IPath path = this.builder.Build();
-
- if (this.renderFill)
- {
- renderData.FillMap = this.Render(path);
- }
-
- if (this.renderOutline)
- {
- if (this.Pen.StrokePattern.Length == 0)
- {
- path = path.GenerateOutline(this.Pen.StrokeWidth);
- }
- else
- {
- path = path.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern);
- }
-
- renderData.OutlineMap = this.Render(path);
- }
-
- this.glyphData[this.currentGlyphRenderParams] = renderData;
- }
- else
- {
- renderData = this.glyphData[this.currentGlyphRenderParams];
- }
-
- if (this.renderFill)
- {
- this.FillOperations.Add(new DrawingOperation
- {
- Location = this.currentRenderPosition,
- Map = renderData.FillMap
- });
- }
-
- if (this.renderOutline)
- {
- this.OutlineOperations.Add(new DrawingOperation
- {
- Location = this.currentRenderPosition,
- Map = renderData.OutlineMap
- });
- }
- }
-
- private Buffer2D Render(IPath path)
- {
- Size size = Rectangle.Ceiling(path.Bounds).Size;
- size = new Size(size.Width + (this.offset * 2), size.Height + (this.offset * 2));
-
- float subpixelCount = 4;
- float offset = 0.5f;
- if (this.Options.Antialias)
- {
- offset = 0f; // we are antialiasing skip offsetting as real antialiasing should take care of offset.
- subpixelCount = this.Options.AntialiasSubpixelDepth;
- if (subpixelCount < 4)
- {
- subpixelCount = 4;
- }
- }
-
- // take the path inside the path builder, scan thing and generate a Buffer2d representing the glyph and cache it.
- Buffer2D fullBuffer = this.MemoryAllocator.Allocate2D(size.Width + 1, size.Height + 1, AllocationOptions.Clean);
-
- using (IMemoryOwner bufferBacking = this.MemoryAllocator.Allocate(path.MaxIntersections))
- using (IMemoryOwner rowIntersectionBuffer = this.MemoryAllocator.Allocate(size.Width))
- {
- float subpixelFraction = 1f / subpixelCount;
- float subpixelFractionPoint = subpixelFraction / subpixelCount;
- Span intersectionSpan = rowIntersectionBuffer.Memory.Span;
- Span buffer = bufferBacking.Memory.Span;
-
- for (int y = 0; y <= size.Height; y++)
- {
- Span scanline = fullBuffer.GetRowSpan(y);
- bool scanlineDirty = false;
- float yPlusOne = y + 1;
-
- for (float subPixel = y; subPixel < yPlusOne; subPixel += subpixelFraction)
- {
- var start = new PointF(path.Bounds.Left - 1, subPixel);
- var end = new PointF(path.Bounds.Right + 1, subPixel);
- int pointsFound = path.FindIntersections(start, end, intersectionSpan);
-
- if (pointsFound == 0)
- {
- // nothing on this line skip
- continue;
- }
-
- for (int i = 0; i < pointsFound && i < intersectionSpan.Length; i++)
- {
- buffer[i] = intersectionSpan[i].X;
- }
-
- QuickSort.Sort(buffer.Slice(0, pointsFound));
-
- for (int point = 0; point < pointsFound; point += 2)
- {
- // points will be paired up
- float scanStart = buffer[point];
- float scanEnd = buffer[point + 1];
- int startX = (int)MathF.Floor(scanStart + offset);
- int endX = (int)MathF.Floor(scanEnd + offset);
-
- if (startX >= 0 && startX < scanline.Length)
- {
- for (float x = scanStart; x < startX + 1; x += subpixelFraction)
- {
- scanline[startX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- if (endX >= 0 && endX < scanline.Length)
- {
- for (float x = endX; x < scanEnd; x += subpixelFraction)
- {
- scanline[endX] += subpixelFractionPoint;
- scanlineDirty = true;
- }
- }
-
- int nextX = startX + 1;
- endX = Math.Min(endX, scanline.Length); // reduce to end to the right edge
- nextX = Math.Max(nextX, 0);
- for (int x = nextX; x < endX; x++)
- {
- scanline[x] += subpixelFraction;
- scanlineDirty = true;
- }
- }
- }
-
- if (scanlineDirty)
- {
- if (!this.Options.Antialias)
- {
- for (int x = 0; x < size.Width; x++)
- {
- if (scanline[x] >= 0.5)
- {
- scanline[x] = 1;
- }
- else
- {
- scanline[x] = 0;
- }
- }
- }
- }
- }
- }
-
- return fullBuffer;
- }
-
- public void EndText()
- {
- }
-
- public void LineTo(PointF point)
- {
- this.builder.AddLine(this.currentPoint, point);
- this.currentPoint = point;
- }
-
- public void MoveTo(PointF point)
- {
- this.builder.StartFigure();
- this.currentPoint = point;
- }
-
- public void QuadraticBezierTo(PointF secondControlPoint, PointF point)
- {
- this.builder.AddBezier(this.currentPoint, secondControlPoint, point);
- this.currentPoint = point;
- }
-
- private struct GlyphRenderData : IDisposable
- {
- public Buffer2D FillMap;
-
- public Buffer2D OutlineMap;
-
- public void Dispose()
- {
- this.FillMap?.Dispose();
- this.OutlineMap?.Dispose();
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs b/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs
deleted file mode 100644
index 2b1b6913f..000000000
--- a/src/ImageSharp.Drawing/Processing/RadialGradientBrush.cs
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// A radial gradient brush, defined by center point and radius.
- ///
- public sealed class RadialGradientBrush : GradientBrush
- {
- private readonly PointF center;
-
- private readonly float radius;
-
- ///
- /// The center of the circular gradient and 0 for the color stops.
- /// The radius of the circular gradient and 1 for the color stops.
- /// Defines how the colors in the gradient are repeated.
- /// the color stops as defined in base class.
- public RadialGradientBrush(
- PointF center,
- float radius,
- GradientRepetitionMode repetitionMode,
- params ColorStop[] colorStops)
- : base(repetitionMode, colorStops)
- {
- this.center = center;
- this.radius = radius;
- }
-
- ///
- public override BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region) =>
- new RadialGradientBrushApplicator(
- configuration,
- options,
- source,
- this.center,
- this.radius,
- this.ColorStops,
- this.RepetitionMode);
-
- ///
- private sealed class RadialGradientBrushApplicator : GradientBrushApplicator
- where TPixel : struct, IPixel
- {
- private readonly PointF center;
-
- private readonly float radius;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The target image.
- /// Center point of the gradient.
- /// Radius of the gradient.
- /// Definition of colors.
- /// How the colors are repeated beyond the first gradient.
- public RadialGradientBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame target,
- PointF center,
- float radius,
- ColorStop[] colorStops,
- GradientRepetitionMode repetitionMode)
- : base(configuration, options, target, colorStops, repetitionMode)
- {
- this.center = center;
- this.radius = radius;
- }
-
- ///
- /// As this is a circular gradient, the position on the gradient is based on
- /// the distance of the point to the center.
- ///
- /// The X coordinate of the target pixel.
- /// The Y coordinate of the target pixel.
- /// the position on the color gradient.
- protected override float PositionOnGradient(float x, float y)
- {
- // TODO: Can this not use Vector2 distance?
- float distance = MathF.Sqrt(MathF.Pow(this.center.X - x, 2) + MathF.Pow(this.center.Y - y, 2));
- return distance / this.radius;
- }
-
- internal override void Apply(Span scanline, int x, int y)
- {
- // TODO: each row is symmetric across center, so we can calculate half of it and mirror it to improve performance.
- base.Apply(scanline, x, y);
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/RecolorBrush.cs b/src/ImageSharp.Drawing/Processing/RecolorBrush.cs
deleted file mode 100644
index e0e43cf78..000000000
--- a/src/ImageSharp.Drawing/Processing/RecolorBrush.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-using System.Numerics;
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a brush that can recolor an image
- ///
- public class RecolorBrush : IBrush
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// Color of the source.
- /// Color of the target.
- /// The threshold as a value between 0 and 1.
- public RecolorBrush(Color sourceColor, Color targetColor, float threshold)
- {
- this.SourceColor = sourceColor;
- this.Threshold = threshold;
- this.TargetColor = targetColor;
- }
-
- ///
- /// Gets the threshold.
- ///
- public float Threshold { get; }
-
- ///
- /// Gets the source color.
- ///
- public Color SourceColor { get; }
-
- ///
- /// Gets the target color.
- ///
- public Color TargetColor { get; }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new RecolorBrushApplicator(
- configuration,
- options,
- source,
- this.SourceColor.ToPixel(),
- this.TargetColor.ToPixel(),
- this.Threshold);
- }
-
- ///
- /// The recolor brush applicator.
- ///
- private class RecolorBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- ///
- /// The source color.
- ///
- private readonly Vector4 sourceColor;
-
- ///
- /// The threshold.
- ///
- private readonly float threshold;
-
- private readonly TPixel targetColorPixel;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The options
- /// The source image.
- /// Color of the source.
- /// Color of the target.
- /// The threshold .
- public RecolorBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- TPixel sourceColor,
- TPixel targetColor,
- float threshold)
- : base(configuration, options, source)
- {
- this.sourceColor = sourceColor.ToVector4();
- this.targetColorPixel = targetColor;
-
- // Lets hack a min max extremes for a color space by letting the IPackedPixel clamp our values to something in the correct spaces :)
- var maxColor = default(TPixel);
- maxColor.FromVector4(new Vector4(float.MaxValue));
- var minColor = default(TPixel);
- minColor.FromVector4(new Vector4(float.MinValue));
- this.threshold = Vector4.DistanceSquared(maxColor.ToVector4(), minColor.ToVector4()) * threshold;
- }
-
- ///
- internal override TPixel this[int x, int y]
- {
- get
- {
- // Offset the requested pixel by the value in the rectangle (the shapes position)
- TPixel result = this.Target[x, y];
- var background = result.ToVector4();
- float distance = Vector4.DistanceSquared(background, this.sourceColor);
- if (distance <= this.threshold)
- {
- float lerpAmount = (this.threshold - distance) / this.threshold;
- return this.Blender.Blend(
- result,
- this.targetColorPixel,
- lerpAmount);
- }
-
- return result;
- }
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
-
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- using (IMemoryOwner overlay = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
- Span overlaySpan = overlay.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
-
- int offsetX = x + i;
-
- // No doubt this one can be optimized further but I can't imagine its
- // actually being used and can probably be removed/internalized for now
- overlaySpan[i] = this[offsetX, y];
- }
-
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x, scanline.Length);
- this.Blender.Blend(
- this.Configuration,
- destinationRow,
- destinationRow,
- overlaySpan,
- amountSpan);
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/SolidBrush.cs b/src/ImageSharp.Drawing/Processing/SolidBrush.cs
deleted file mode 100644
index c297ede21..000000000
--- a/src/ImageSharp.Drawing/Processing/SolidBrush.cs
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Buffers;
-
-using SixLabors.ImageSharp.Advanced;
-using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
-using SixLabors.Primitives;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Provides an implementation of a solid brush for painting solid color areas.
- ///
- public class SolidBrush : IBrush
- {
- ///
- /// Initializes a new instance of the class.
- ///
- /// The color.
- public SolidBrush(Color color)
- {
- this.Color = color;
- }
-
- ///
- /// Gets the color.
- ///
- public Color Color { get; }
-
- ///
- public BrushApplicator CreateApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- RectangleF region)
- where TPixel : struct, IPixel
- {
- return new SolidBrushApplicator(configuration, options, source, this.Color.ToPixel());
- }
-
- ///
- /// The solid brush applicator.
- ///
- private class SolidBrushApplicator : BrushApplicator
- where TPixel : struct, IPixel
- {
- private bool isDisposed;
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The configuration instance to use when performing operations.
- /// The graphics options.
- /// The source image.
- /// The color.
- public SolidBrushApplicator(
- Configuration configuration,
- GraphicsOptions options,
- ImageFrame source,
- TPixel color)
- : base(configuration, options, source)
- {
- this.Colors = source.MemoryAllocator.Allocate(source.Width);
- this.Colors.Memory.Span.Fill(color);
- }
-
- ///
- /// Gets the colors.
- ///
- protected IMemoryOwner Colors { get; private set; }
-
- ///
- internal override TPixel this[int x, int y] => this.Colors.Memory.Span[x];
-
- ///
- protected override void Dispose(bool disposing)
- {
- if (this.isDisposed)
- {
- return;
- }
-
- if (disposing)
- {
- this.Colors.Dispose();
- }
-
- this.Colors = null;
- this.isDisposed = true;
- }
-
- ///
- internal override void Apply(Span scanline, int x, int y)
- {
- Span destinationRow = this.Target.GetPixelRowSpan(y).Slice(x);
-
- // constrain the spans to each other
- if (destinationRow.Length > scanline.Length)
- {
- destinationRow = destinationRow.Slice(0, scanline.Length);
- }
- else
- {
- scanline = scanline.Slice(0, destinationRow.Length);
- }
-
- MemoryAllocator memoryAllocator = this.Target.MemoryAllocator;
- Configuration configuration = this.Configuration;
-
- if (this.Options.BlendPercentage == 1f)
- {
- this.Blender.Blend(configuration, destinationRow, destinationRow, this.Colors.Memory.Span, scanline);
- }
- else
- {
- using (IMemoryOwner amountBuffer = memoryAllocator.Allocate(scanline.Length))
- {
- Span amountSpan = amountBuffer.Memory.Span;
-
- for (int i = 0; i < scanline.Length; i++)
- {
- amountSpan[i] = scanline[i] * this.Options.BlendPercentage;
- }
-
- this.Blender.Blend(
- configuration,
- destinationRow,
- destinationRow,
- this.Colors.Memory.Span,
- amountSpan);
- }
- }
- }
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs b/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs
deleted file mode 100644
index 63730d1bf..000000000
--- a/src/ImageSharp.Drawing/Processing/TextGraphicsOptions.cs
+++ /dev/null
@@ -1,217 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using SixLabors.Fonts;
-using SixLabors.ImageSharp.PixelFormats;
-
-namespace SixLabors.ImageSharp.Processing
-{
- ///
- /// Options for influencing the drawing functions.
- ///
- public class TextGraphicsOptions : IDeepCloneable
- {
- private int antialiasSubpixelDepth = 16;
- private float blendPercentage = 1F;
- private float tabWidth = 4F;
- private float dpiX = 72F;
- private float dpiY = 72F;
-
- ///
- /// Initializes a new instance of the class.
- ///
- public TextGraphicsOptions()
- {
- }
-
- private TextGraphicsOptions(TextGraphicsOptions source)
- {
- this.AlphaCompositionMode = source.AlphaCompositionMode;
- this.Antialias = source.Antialias;
- this.AntialiasSubpixelDepth = source.AntialiasSubpixelDepth;
- this.ApplyKerning = source.ApplyKerning;
- this.BlendPercentage = source.BlendPercentage;
- this.ColorBlendingMode = source.ColorBlendingMode;
- this.DpiX = source.DpiX;
- this.DpiY = source.DpiY;
- this.HorizontalAlignment = source.HorizontalAlignment;
- this.TabWidth = source.TabWidth;
- this.WrapTextWidth = source.WrapTextWidth;
- this.VerticalAlignment = source.VerticalAlignment;
- }
-
- ///
- /// Gets or sets a value indicating whether antialiasing should be applied.
- /// Defaults to true.
- ///
- public bool Antialias { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating the number of subpixels to use while rendering with antialiasing enabled.
- ///
- public int AntialiasSubpixelDepth
- {
- get
- {
- return this.antialiasSubpixelDepth;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.AntialiasSubpixelDepth));
- this.antialiasSubpixelDepth = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the blending percentage to apply to the drawing operation.
- ///
- public float BlendPercentage
- {
- get
- {
- return this.blendPercentage;
- }
-
- set
- {
- Guard.MustBeBetweenOrEqualTo(value, 0, 1F, nameof(this.BlendPercentage));
- this.blendPercentage = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the color blending percentage to apply to the drawing operation.
- /// Defaults to .
- ///
- public PixelColorBlendingMode ColorBlendingMode { get; set; } = PixelColorBlendingMode.Normal;
-
- ///
- /// Gets or sets a value indicating the color blending percentage to apply to the drawing operation
- /// Defaults to .
- ///
- public PixelAlphaCompositionMode AlphaCompositionMode { get; set; } = PixelAlphaCompositionMode.SrcOver;
-
- ///
- /// Gets or sets a value indicating whether the text should be drawing with kerning enabled.
- /// Defaults to true;
- ///
- public bool ApplyKerning { get; set; } = true;
-
- ///
- /// Gets or sets a value indicating the number of space widths a tab should lock to.
- /// Defaults to 4.
- ///
- public float TabWidth
- {
- get
- {
- return this.tabWidth;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.TabWidth));
- this.tabWidth = value;
- }
- }
-
- ///
- /// Gets or sets a value, if greater than 0, indicating the width at which text should wrap.
- /// Defaults to 0.
- ///
- public float WrapTextWidth { get; set; }
-
- ///
- /// Gets or sets a value indicating the DPI (Dots Per Inch) to render text along the X axis.
- /// Defaults to 72.
- ///
- public float DpiX
- {
- get
- {
- return this.dpiX;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.DpiX));
- this.dpiX = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating the DPI (Dots Per Inch) to render text along the Y axis.
- /// Defaults to 72.
- ///
- public float DpiY
- {
- get
- {
- return this.dpiY;
- }
-
- set
- {
- Guard.MustBeGreaterThanOrEqualTo(value, 0, nameof(this.DpiY));
- this.dpiY = value;
- }
- }
-
- ///
- /// Gets or sets a value indicating how to align the text relative to the rendering space.
- /// If is greater than zero it will align relative to the space
- /// defined by the location and width, if equals zero, and thus
- /// wrapping disabled, then the alignment is relative to the drawing location.
- /// Defaults to .
- ///
- public HorizontalAlignment HorizontalAlignment { get; set; } = HorizontalAlignment.Left;
-
- ///
- /// Gets or sets a value indicating how to align the text relative to the rendering space.
- /// Defaults to .
- ///
- public VerticalAlignment VerticalAlignment { get; set; } = VerticalAlignment.Top;
-
- ///
- /// Performs an implicit conversion from to .
- ///
- /// The options.
- ///
- /// The result of the conversion.
- ///
- public static implicit operator TextGraphicsOptions(GraphicsOptions options)
- {
- return new TextGraphicsOptions()
- {
- Antialias = options.Antialias,
- AntialiasSubpixelDepth = options.AntialiasSubpixelDepth,
- blendPercentage = options.BlendPercentage,
- ColorBlendingMode = options.ColorBlendingMode,
- AlphaCompositionMode = options.AlphaCompositionMode
- };
- }
-
- ///
- /// Performs an explicit conversion from to .
- ///
- /// The options.
- ///
- /// The result of the conversion.
- ///
- public static explicit operator GraphicsOptions(TextGraphicsOptions options)
- {
- return new GraphicsOptions()
- {
- Antialias = options.Antialias,
- AntialiasSubpixelDepth = options.AntialiasSubpixelDepth,
- ColorBlendingMode = options.ColorBlendingMode,
- AlphaCompositionMode = options.AlphaCompositionMode,
- BlendPercentage = options.BlendPercentage
- };
- }
-
- ///
- public TextGraphicsOptions DeepClone() => new TextGraphicsOptions(this);
- }
-}
diff --git a/src/ImageSharp.Drawing/Utils/NumberUtils.cs b/src/ImageSharp.Drawing/Utils/NumberUtils.cs
deleted file mode 100644
index d034c5d7e..000000000
--- a/src/ImageSharp.Drawing/Utils/NumberUtils.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp
-{
- ///
- /// Utility methods for numeric primitives.
- ///
- internal static class NumberUtils
- {
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- public static float ClampFloat(float value, float min, float max)
- {
- if (value >= max)
- {
- return max;
- }
-
- if (value <= min)
- {
- return min;
- }
-
- return value;
- }
- }
-}
diff --git a/src/ImageSharp.Drawing/Utils/QuickSort.cs b/src/ImageSharp.Drawing/Utils/QuickSort.cs
deleted file mode 100644
index 14e3146a0..000000000
--- a/src/ImageSharp.Drawing/Utils/QuickSort.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright (c) Six Labors and contributors.
-// Licensed under the Apache License, Version 2.0.
-
-using System;
-using System.Runtime.CompilerServices;
-
-namespace SixLabors.ImageSharp.Utils
-{
- ///
- /// Optimized quick sort implementation for Span{float} input
- ///
- internal class QuickSort
- {
- ///
- /// Sorts the elements of in ascending order
- ///
- /// The items to sort
- public static void Sort(Span data)
- {
- if (data.Length < 2)
- {
- return;
- }
-
- if (data.Length == 2)
- {
- if (data[0] > data[1])
- {
- Swap(ref data[0], ref data[1]);
- }
-
- return;
- }
-
- Sort(ref data[0], 0, data.Length - 1);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private static void Swap(ref float left, ref float right)
- {
- float tmp = left;
- left = right;
- right = tmp;
- }
-
- private static void Sort(ref float data0, int lo, int hi)
- {
- if (lo < hi)
- {
- int p = Partition(ref data0, lo, hi);
- Sort(ref data0, lo, p);
- Sort(ref data0, p + 1, hi);
- }
- }
-
- private static int Partition(ref float data0, int lo, int hi)
- {
- float pivot = Unsafe.Add(ref data0, lo);
- int i = lo - 1;
- int j = hi + 1;
- while (true)
- {
- do
- {
- i = i + 1;
- }
- while (Unsafe.Add(ref data0, i) < pivot && i < hi);
-
- do
- {
- j = j - 1;
- }
- while (Unsafe.Add(ref data0, j) > pivot && j > lo);
-
- if (i >= j)
- {
- return j;
- }
-
- Swap(ref Unsafe.Add(ref data0, i), ref Unsafe.Add(ref data0, j));
- }
- }
- }
-}
diff --git a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
index 22e6d47e9..9bf8943b7 100644
--- a/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
+++ b/src/ImageSharp/Advanced/AdvancedImageExtensions.cs
@@ -6,7 +6,6 @@ using System.Runtime.InteropServices;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
namespace SixLabors.ImageSharp.Advanced
{
diff --git a/src/ImageSharp/Advanced/AotCompilerTools.cs b/src/ImageSharp/Advanced/AotCompilerTools.cs
index 60c1f4178..bb4ddb7d0 100644
--- a/src/ImageSharp/Advanced/AotCompilerTools.cs
+++ b/src/ImageSharp/Advanced/AotCompilerTools.cs
@@ -1,6 +1,7 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System.Diagnostics.CodeAnalysis;
using System.Numerics;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.Formats;
@@ -19,6 +20,7 @@ namespace SixLabors.ImageSharp.Advanced
/// None of the methods in this class should ever be called, the code only has to exist at compile-time to be picked up by the AoT compiler.
/// (Very similar to the LinkerIncludes.cs technique used in Xamarin.Android projects.)
///
+ [ExcludeFromCodeCoverage]
internal static class AotCompilerTools
{
static AotCompilerTools()
diff --git a/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs b/src/ImageSharp/Advanced/ParallelUtils/ParallelExecutionSettings.cs
index 431656ef9..f17d70a2a 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 c56337bff..4833dbafd 100644
--- a/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
+++ b/src/ImageSharp/Advanced/ParallelUtils/ParallelHelper.cs
@@ -7,8 +7,6 @@ using System.Runtime.CompilerServices;
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/EncoderExtensions.cs b/src/ImageSharp/Common/Extensions/EncoderExtensions.cs
index 59c878485..87aaa93a9 100644
--- a/src/ImageSharp/Common/Extensions/EncoderExtensions.cs
+++ b/src/ImageSharp/Common/Extensions/EncoderExtensions.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.
-#if !NETCOREAPP2_1
+#if !SUPPORTS_ENCODING_STRING
using System;
using System.Text;
@@ -32,4 +32,4 @@ namespace SixLabors.ImageSharp
}
}
}
-#endif
\ No newline at end of file
+#endif
diff --git a/src/ImageSharp/Common/Extensions/StreamExtensions.cs b/src/ImageSharp/Common/Extensions/StreamExtensions.cs
index 6af09b220..971bff322 100644
--- a/src/ImageSharp/Common/Extensions/StreamExtensions.cs
+++ b/src/ImageSharp/Common/Extensions/StreamExtensions.cs
@@ -4,9 +4,7 @@
using System;
using System.Buffers;
using System.IO;
-
using SixLabors.ImageSharp.Memory;
-using SixLabors.Memory;
namespace SixLabors.ImageSharp
{
@@ -15,7 +13,6 @@ namespace SixLabors.ImageSharp
///
internal static class StreamExtensions
{
-#if NETCOREAPP2_1
///
/// Writes data from a stream into the provided buffer.
///
@@ -24,23 +21,18 @@ namespace SixLabors.ImageSharp
/// The offset within the buffer to begin writing.
/// The number of bytes to write to the stream.
public static void Write(this Stream stream, Span buffer, int offset, int count)
- {
- stream.Write(buffer.Slice(offset, count));
- }
+ => stream.Write(buffer.Slice(offset, count));
///
/// Reads data from a stream into the provided buffer.
///
/// The stream.
- /// The buffer..
+ /// The buffer.
/// The offset within the buffer where the bytes are read into.
/// The number of bytes, if available, to read.
/// The actual number of bytes read.
public static int Read(this Stream stream, Span buffer, int offset, int count)
- {
- return stream.Read(buffer.Slice(offset, count));
- }
-#endif
+ => stream.Read(buffer.Slice(offset, count));
///
/// Skips the number of bytes in the given stream.
@@ -75,17 +67,39 @@ namespace SixLabors.ImageSharp
}
public static void Read(this Stream stream, IManagedByteBuffer buffer)
- {
- stream.Read(buffer.Array, 0, buffer.Length());
- }
+ => stream.Read(buffer.Array, 0, buffer.Length());
public static void Write(this Stream stream, IManagedByteBuffer buffer)
+ => stream.Write(buffer.Array, 0, buffer.Length());
+
+#if !SUPPORTS_SPAN_STREAM
+ // This is a port of the CoreFX implementation and is MIT Licensed:
+ // https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L742
+ public static int Read(this Stream stream, Span buffer)
{
- stream.Write(buffer.Array, 0, buffer.Length());
+ // This uses ArrayPool.Shared, rather than taking a MemoryAllocator,
+ // in order to match the signature of the framework method that exists in
+ // .NET Core.
+ byte[] sharedBuffer = ArrayPool.Shared.Rent(buffer.Length);
+ try
+ {
+ int numRead = stream.Read(sharedBuffer, 0, buffer.Length);
+ if ((uint)numRead > (uint)buffer.Length)
+ {
+ throw new IOException("Stream was too long.");
+ }
+
+ new Span(sharedBuffer, 0, numRead).CopyTo(buffer);
+ return numRead;
+ }
+ finally
+ {
+ ArrayPool.Shared.Return(sharedBuffer);
+ }
}
-#if NET472 || NETSTANDARD1_3 || NETSTANDARD2_0
- // This is a port of the CoreFX implementation and is MIT Licensed: https://github.com/dotnet/coreclr/blob/c4dca1072d15bdda64c754ad1ea474b1580fa554/src/System.Private.CoreLib/shared/System/IO/Stream.cs#L770
+ // This is a port of the CoreFX implementation and is MIT Licensed:
+ // https://github.com/dotnet/corefx/blob/17300169760c61a90cab8d913636c1058a30a8c1/src/Common/src/CoreLib/System/IO/Stream.cs#L775
public static void Write(this Stream stream, ReadOnlySpan buffer)
{
// This uses ArrayPool.Shared, rather than taking a MemoryAllocator,
diff --git a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs
index b678e798f..f82774601 100644
--- a/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs
+++ b/src/ImageSharp/Common/Helpers/Buffer2DUtils.cs
@@ -8,7 +8,6 @@ using System.Runtime.InteropServices;
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 c5c9ddebe..ff6e3a4ec 100644
--- a/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs
+++ b/src/ImageSharp/Common/Helpers/DenseMatrixUtils.cs
@@ -6,7 +6,6 @@ using System.Numerics;
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 122952cae..e7b14be42 100644
--- a/src/ImageSharp/Common/Helpers/ImageMaths.cs
+++ b/src/ImageSharp/Common/Helpers/ImageMaths.cs
@@ -6,7 +6,6 @@ using System.Numerics;
using System.Runtime.CompilerServices;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp
{
diff --git a/src/ImageSharp/Common/Helpers/TestHelpers.cs b/src/ImageSharp/Common/Helpers/TestHelpers.cs
index d330233c4..c6574e4b5 100644
--- a/src/ImageSharp/Common/Helpers/TestHelpers.cs
+++ b/src/ImageSharp/Common/Helpers/TestHelpers.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.
namespace SixLabors.ImageSharp.Common.Helpers
@@ -13,14 +13,18 @@ namespace SixLabors.ImageSharp.Common.Helpers
/// Only intended to be used in tests!
///
internal const string ImageSharpBuiltAgainst =
-#if NET472
- "netfx4.7.2";
+#if NETCOREAPP3_1
+ "netcoreapp3.1";
#elif NETCOREAPP2_1
"netcoreapp2.1";
+#elif NETSTANDARD2_1
+ "netstandard2.1";
+#elif NETSTANDARD2_0
+ "netstandard2.0";
#elif NETSTANDARD1_3
"netstandard1.3";
#else
- "netstandard2.0";
+ "net472";
#endif
}
-}
\ No newline at end of file
+}
diff --git a/src/ImageSharp/Common/Helpers/Vector4Utils.cs b/src/ImageSharp/Common/Helpers/Vector4Utils.cs
index a4e0921d0..594a5ff10 100644
--- a/src/ImageSharp/Common/Helpers/Vector4Utils.cs
+++ b/src/ImageSharp/Common/Helpers/Vector4Utils.cs
@@ -5,7 +5,6 @@ using System;
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 4dba7a7e8..9f26df300 100644
--- a/src/ImageSharp/Configuration.cs
+++ b/src/ImageSharp/Configuration.cs
@@ -10,8 +10,8 @@ using SixLabors.ImageSharp.Formats.Jpeg;
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 596710294..8d82d28fb 100644
--- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
+++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs
@@ -11,7 +11,6 @@ using SixLabors.ImageSharp.Common.Helpers;
using SixLabors.ImageSharp.Memory;
using SixLabors.ImageSharp.Metadata;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Memory;
namespace SixLabors.ImageSharp.Formats.Bmp
{
@@ -445,11 +444,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle4(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int count = 0;
while (count < buffer.Length)
@@ -556,11 +551,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle8(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int count = 0;
while (count < buffer.Length)
@@ -639,11 +630,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
/// Keeps track of rows, which have undefined pixels.
private void UncompressRle24(int w, Span buffer, Span undefinedPixels, Span rowsWithUndefinedPixels)
{
-#if NETCOREAPP2_1
Span cmd = stackalloc byte[2];
-#else
- var cmd = new byte[2];
-#endif
int uncompressedPixels = 0;
while (uncompressedPixels < buffer.Length)
@@ -1213,11 +1200,7 @@ namespace SixLabors.ImageSharp.Formats.Bmp
///
private void ReadInfoHeader()
{
-#if NETCOREAPP2_1
Span