Skip to content

Commit ce69978

Browse files
Blaze style works.
1 parent a8be3f9 commit ce69978

25 files changed

+2362
-128
lines changed

ImageSharp.Drawing.sln

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
339339
EndProject
340340
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PolygonClipper", "..\..\SixLabors\PolygonClipper\src\PolygonClipper\PolygonClipper.csproj", "{5ED54794-99BF-5E50-A861-0BAAAC794E44}"
341341
EndProject
342+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageSharp", "..\..\SixLabors\ImageSharp\src\ImageSharp\ImageSharp.csproj", "{AAF7501C-8537-7F13-5193-B538318BD071}"
343+
EndProject
342344
Global
343345
GlobalSection(SolutionConfigurationPlatforms) = preSolution
344346
Debug|Any CPU = Debug|Any CPU
@@ -365,6 +367,10 @@ Global
365367
{5ED54794-99BF-5E50-A861-0BAAAC794E44}.Debug|Any CPU.Build.0 = Debug|Any CPU
366368
{5ED54794-99BF-5E50-A861-0BAAAC794E44}.Release|Any CPU.ActiveCfg = Release|Any CPU
367369
{5ED54794-99BF-5E50-A861-0BAAAC794E44}.Release|Any CPU.Build.0 = Release|Any CPU
370+
{AAF7501C-8537-7F13-5193-B538318BD071}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
371+
{AAF7501C-8537-7F13-5193-B538318BD071}.Debug|Any CPU.Build.0 = Debug|Any CPU
372+
{AAF7501C-8537-7F13-5193-B538318BD071}.Release|Any CPU.ActiveCfg = Release|Any CPU
373+
{AAF7501C-8537-7F13-5193-B538318BD071}.Release|Any CPU.Build.0 = Release|Any CPU
368374
EndGlobalSection
369375
GlobalSection(SolutionProperties) = preSolution
370376
HideSolutionNode = FALSE
@@ -393,6 +399,7 @@ Global
393399
{5493F024-0A3F-420C-AC2D-05B77A36025B} = {528610AC-7C0C-46E8-9A2D-D46FD92FEE29}
394400
{23859314-5693-4E6C-BE5C-80A433439D2A} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D}
395401
{5ED54794-99BF-5E50-A861-0BAAAC794E44} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
402+
{AAF7501C-8537-7F13-5193-B538318BD071} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
396403
EndGlobalSection
397404
GlobalSection(ExtensibilityGlobals) = postSolution
398405
SolutionGuid = {5F8B9D1F-CD8B-4CC5-8216-D531E25BD795}
@@ -401,6 +408,7 @@ Global
401408
shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{2e33181e-6e28-4662-a801-e2e7dc206029}*SharedItemsImports = 5
402409
..\..\SixLabors\PolygonClipper\shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{5ed54794-99bf-5e50-a861-0baaac794e44}*SharedItemsImports = 5
403410
shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{68a8cc40-6aed-4e96-b524-31b1158fdeea}*SharedItemsImports = 13
411+
..\..\SixLabors\ImageSharp\shared-infrastructure\src\SharedInfrastructure\SharedInfrastructure.projitems*{aaf7501c-8537-7f13-5193-b538318bd071}*SharedItemsImports = 5
404412
EndGlobalSection
405413
GlobalSection(Performance) = preSolution
406414
HasPerformanceSessions = true
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (c) Six Labors.
2+
// Licensed under the Six Labors Split License.
3+
4+
using System;
5+
using SixLabors.ImageSharp.Drawing.Shapes.Rasterization;
6+
using SixLabors.ImageSharp.Memory;
7+
8+
namespace SixLabors.ImageSharp.Drawing.Processing.Backends;
9+
10+
/// <summary>
11+
/// Default CPU drawing backend.
12+
/// </summary>
13+
/// <remarks>
14+
/// This backend currently dispatches to the existing scanline rasterizer pipeline.
15+
/// A tiled rasterizer path is wired behind an AppContext switch for incremental rollout.
16+
/// </remarks>
17+
internal sealed class CpuDrawingBackend : IDrawingBackend
18+
{
19+
private const string ExperimentalTiledRasterizerSwitch = "SixLabors.ImageSharp.Drawing.ExperimentalTiledRasterizer";
20+
21+
private readonly IRasterizer defaultRasterizer;
22+
private readonly TiledRasterizer tiledRasterizer;
23+
24+
private CpuDrawingBackend(IRasterizer defaultRasterizer)
25+
{
26+
Guard.NotNull(defaultRasterizer, nameof(defaultRasterizer));
27+
this.defaultRasterizer = defaultRasterizer;
28+
this.tiledRasterizer = TiledRasterizer.Instance;
29+
}
30+
31+
/// <summary>
32+
/// Gets the default backend instance.
33+
/// </summary>
34+
public static CpuDrawingBackend Instance { get; } = new(DefaultRasterizer.Instance);
35+
36+
/// <summary>
37+
/// Gets the primary rasterizer used by this backend.
38+
/// </summary>
39+
public IRasterizer PrimaryRasterizer => this.defaultRasterizer;
40+
41+
/// <summary>
42+
/// Creates a backend that uses the given rasterizer as the primary implementation.
43+
/// </summary>
44+
/// <param name="rasterizer">Primary rasterizer.</param>
45+
/// <returns>A backend instance.</returns>
46+
public static CpuDrawingBackend Create(IRasterizer rasterizer)
47+
{
48+
Guard.NotNull(rasterizer, nameof(rasterizer));
49+
return ReferenceEquals(rasterizer, DefaultRasterizer.Instance) ? Instance : new CpuDrawingBackend(rasterizer);
50+
}
51+
52+
/// <inheritdoc />
53+
public void RasterizePath<TState>(
54+
IPath path,
55+
in RasterizerOptions options,
56+
MemoryAllocator allocator,
57+
ref TState state,
58+
RasterizerScanlineHandler<TState> scanlineHandler)
59+
where TState : struct
60+
{
61+
if (UseExperimentalTiledRasterizer())
62+
{
63+
this.tiledRasterizer.Rasterize(path, options, allocator, ref state, scanlineHandler);
64+
return;
65+
}
66+
67+
this.defaultRasterizer.Rasterize(path, options, allocator, ref state, scanlineHandler);
68+
}
69+
70+
private static bool UseExperimentalTiledRasterizer()
71+
=> AppContext.TryGetSwitch(ExperimentalTiledRasterizerSwitch, out bool enabled) && enabled;
72+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) Six Labors.
2+
// Licensed under the Six Labors Split License.
3+
4+
using SixLabors.ImageSharp.Drawing.Shapes.Rasterization;
5+
using SixLabors.ImageSharp.Memory;
6+
7+
namespace SixLabors.ImageSharp.Drawing.Processing.Backends;
8+
9+
/// <summary>
10+
/// Internal drawing backend abstraction used by processors.
11+
/// </summary>
12+
/// <remarks>
13+
/// This boundary allows processor logic to stay stable while the implementation evolves
14+
/// (for example: alternate CPU rasterizers or eventual non-CPU backends).
15+
/// </remarks>
16+
internal interface IDrawingBackend
17+
{
18+
/// <summary>
19+
/// Rasterizes a path into scanline coverage.
20+
/// </summary>
21+
/// <typeparam name="TState">The caller-provided mutable state type.</typeparam>
22+
/// <param name="path">The path to rasterize.</param>
23+
/// <param name="options">Rasterizer options.</param>
24+
/// <param name="allocator">Allocator for temporary data.</param>
25+
/// <param name="state">Caller-owned mutable state passed to the scanline callback.</param>
26+
/// <param name="scanlineHandler">Scanline callback.</param>
27+
void RasterizePath<TState>(
28+
IPath path,
29+
in RasterizerOptions options,
30+
MemoryAllocator allocator,
31+
ref TState state,
32+
RasterizerScanlineHandler<TState> scanlineHandler)
33+
where TState : struct;
34+
}

src/ImageSharp.Drawing/Processing/Processors/Drawing/FillPathProcessor.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@ namespace SixLabors.ImageSharp.Drawing.Processing.Processors.Drawing;
1212
public class FillPathProcessor : IImageProcessor
1313
{
1414
/// <summary>
15-
/// Minimum subpixel count for rasterization, being applied even if antialiasing is off.
15+
/// Fixed subpixel sampling density used by the CPU rasterizer for both antialiased and
16+
/// quantized-aliased rendering.
1617
/// </summary>
17-
internal const int MinimumSubpixelCount = 8;
18+
internal const int FixedRasterizerSubpixelCount = 16;
1819

1920
/// <summary>
2021
/// Initializes a new instance of the <see cref="FillPathProcessor" /> class.

0 commit comments

Comments
 (0)