Skip to content

Commit

Permalink
Merge pull request #185 from jtjackson/expose_new_properties_on_ipen
Browse files Browse the repository at this point in the history
Expose JointStyle and EndCapStyle on IPen
  • Loading branch information
JimBobSquarePants authored Feb 8, 2022
2 parents 879f3cf + fb7d82c commit a1b8097
Show file tree
Hide file tree
Showing 40 changed files with 509 additions and 246 deletions.
299 changes: 154 additions & 145 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
@@ -1,149 +1,158 @@
name: Build

on:
push:
branches:
- master
tags:
- "v*"
pull_request:
branches:
- master
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: macos-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}}
if: "!contains(github.event.head_commit.message, '[skip ci]')"

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

# See https://github.com/actions/checkout/issues/165#issuecomment-657673315
- name: Git Create LFS FileList
run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id

- name: Git Setup LFS Cache
uses: actions/cache@v2
id: lfs-cache
with:
path: .git/lfs
key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}-v1

- name: Git Pull LFS
run: git lfs pull

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Build
shell: pwsh
run: ./ci-build.ps1
env:
SIXLABORS_TESTING: True

- name: DotNet Test
shell: pwsh
run: ./ci-test.ps1 "${{matrix.options.os}}" "${{matrix.options.framework}}" "${{matrix.options.runtime}}" "${{matrix.options.codecov}}"
env:
SIXLABORS_TESTING: True
XUNIT_PATH: .\tests\ImageSharp.Drawing.Tests # Required for xunit

- name: Export Failed Output
uses: actions/upload-artifact@v2
if: failure()
with:
name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
path: tests/Images/ActualOutput/

- name: Codecov Update
uses: codecov/codecov-action@v1
if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors')
with:
flags: unittests

Publish:
needs: [Build]

runs-on: ubuntu-latest

if: (github.event_name == 'push')

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Pack
shell: pwsh
run: ./ci-pack.ps1

- name: MyGet Publish
shell: pwsh
run: |
dotnet nuget push .\artifacts\*.nupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v2/package
dotnet nuget push .\artifacts\*.snupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v3/index.json
# TODO: If github.ref starts with 'refs/tags' then it was tag push and we can optionally push out package to nuget.org
Build:
strategy:
matrix:
options:
- os: ubuntu-latest
framework: netcoreapp3.1
runtime: -x64
codecov: false
- os: macos-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}}
if: "!contains(github.event.head_commit.message, '[skip ci]')"

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

# See https://github.com/actions/checkout/issues/165#issuecomment-657673315
- name: Git Create LFS FileList
run: git lfs ls-files -l | cut -d' ' -f1 | sort > .lfs-assets-id

- name: Git Setup LFS Cache
uses: actions/cache@v2
id: lfs-cache
with:
path: .git/lfs
key: ${{ runner.os }}-lfs-${{ hashFiles('.lfs-assets-id') }}-v1

- name: Git Pull LFS
run: git lfs pull

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Setup
uses: actions/setup-dotnet@v1
with:
dotnet-version: |
6.0.x
5.0.x
3.1.x
2.1.x
- name: DotNet Build
shell: pwsh
run: ./ci-build.ps1
env:
SIXLABORS_TESTING: True

- name: DotNet Test
shell: pwsh
run: ./ci-test.ps1 "${{matrix.options.os}}" "${{matrix.options.framework}}" "${{matrix.options.runtime}}" "${{matrix.options.codecov}}"
env:
SIXLABORS_TESTING: True
XUNIT_PATH: .\tests\ImageSharp.Drawing.Tests # Required for xunit

- name: Export Failed Output
uses: actions/upload-artifact@v2
if: failure()
with:
name: actual_output_${{ runner.os }}_${{ matrix.options.framework }}${{ matrix.options.runtime }}.zip
path: tests/Images/ActualOutput/

- name: Codecov Update
uses: codecov/codecov-action@v1
if: matrix.options.codecov == true && startsWith(github.repository, 'SixLabors')
with:
flags: unittests

Publish:
needs: [Build]

runs-on: ubuntu-latest

if: (github.event_name == 'push')

steps:
- name: Git Config
shell: bash
run: |
git config --global core.autocrlf false
git config --global core.longpaths true
- name: Git Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
submodules: recursive

- name: NuGet Install
uses: NuGet/setup-nuget@v1

- name: NuGet Setup Cache
uses: actions/cache@v2
id: nuget-cache
with:
path: ~/.nuget
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/*.props', '**/*.targets') }}
restore-keys: ${{ runner.os }}-nuget-

- name: DotNet Pack
shell: pwsh
run: ./ci-pack.ps1

- name: MyGet Publish
shell: pwsh
run: |
dotnet nuget push .\artifacts\*.nupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v2/package
dotnet nuget push .\artifacts\*.snupkg -k ${{secrets.MYGET_TOKEN}} -s https://www.myget.org/F/sixlabors/api/v3/index.json
# TODO: If github.ref starts with 'refs/tags' then it was tag push and we can optionally push out package to nuget.org
4 changes: 2 additions & 2 deletions samples/DrawShapesWithImageSharp/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private static void OutputStarOutline(int points, float inner = 10, float outer
float offset = outer + 10;

var star = new Star(offset, offset, points, inner, outer);
IPath outline = star.GenerateOutline(width, jointStyle);
IPath outline = star.GenerateOutline(width, jointStyle, EndCapStyle.Butt);
outline.SaveImage("Stars", $"StarOutline_{points}_{jointStyle}.png");
}

Expand All @@ -199,7 +199,7 @@ private static void OutputStarOutlineDashed(int points, float inner = 10, float
float offset = outer + 10;

var star = new Star(offset, offset, points, inner, outer);
IPath outline = star.GenerateOutline(width, new float[] { 3, 3 }, false, jointStyle, cap);
IPath outline = star.GenerateOutline(width, new float[] { 3, 3 }, jointStyle, cap);
outline.SaveImage("Stars", $"StarOutlineDashed_{points}_{jointStyle}_{cap}.png");
}

Expand Down
10 changes: 10 additions & 0 deletions src/ImageSharp.Drawing/Processing/IPen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,5 +24,15 @@ public interface IPen
/// Gets the stoke pattern.
/// </summary>
ReadOnlySpan<float> StrokePattern { get; }

/// <summary>
/// Gets or sets the stroke joint style
/// </summary>
public JointStyle JointStyle { get; set; }

/// <summary>
/// Gets or sets the stroke endcap style
/// </summary>
public EndCapStyle EndCapStyle { get; set; }
}
}
6 changes: 6 additions & 0 deletions src/ImageSharp.Drawing/Processing/Pen.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,5 +74,11 @@ public Pen(IBrush brush, float width)

/// <inheritdoc/>
public ReadOnlySpan<float> StrokePattern => this.pattern;

/// <inheritdoc/>
public JointStyle JointStyle { get; set; }

/// <inheritdoc/>
public EndCapStyle EndCapStyle { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public IImageProcessor<TPixel> CreatePixelSpecificProcessor<TPixel>(Configuratio
// The global transform is applied in the FillPathProcessor.
IPath outline = this.Path
.Transform(Matrix3x2.CreateTranslation(0.5F, 0.5F))
.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern);
.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern, this.Pen.JointStyle, this.Pen.EndCapStyle);

return new FillPathProcessor(this.Options, this.Pen.StrokeFill, outline)
.CreatePixelSpecificProcessor(configuration, source, sourceRectangle);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ public void EndGlyph()
}
else
{
path = path.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern);
path = path.GenerateOutline(this.Pen.StrokeWidth, this.Pen.StrokePattern, this.Pen.JointStyle, this.Pen.EndCapStyle);
}

renderData.OutlineMap = this.Render(path);
Expand Down
2 changes: 1 addition & 1 deletion src/ImageSharp.Drawing/Shapes/EndCapStyle.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright (c) Six Labors.
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.

namespace SixLabors.ImageSharp.Drawing
Expand Down
6 changes: 3 additions & 3 deletions src/ImageSharp.Drawing/Shapes/JointStyle.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
// Copyright (c) Six Labors.
// Copyright (c) Six Labors.
// Licensed under the Apache License, Version 2.0.

namespace SixLabors.ImageSharp.Drawing
{
/// <summary>
/// The style we use to generate the joints when outlining.
/// The style to apply to the joints when generating an outline.
/// </summary>
public enum JointStyle
{
/// <summary>
/// Joints will generate to a long point unless the end of the point will exceed 20 times the width then we generate the joint using <see cref="JointStyle.Square"/>.
/// Joints will generate to a long point unless the end of the point will exceed 20 times the width then we generate the joint using <see cref="Square"/>.
/// </summary>
Miter = 2,

Expand Down
Loading

0 comments on commit a1b8097

Please sign in to comment.