Skip to content

Commit 23c5c37

Browse files
Add WebGPUWindowDemo and backend feature checks
1 parent a96c74c commit 23c5c37

10 files changed

Lines changed: 825 additions & 24 deletions

File tree

ImageSharp.Drawing.sln

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,32 +339,90 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{
339339
EndProject
340340
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ImageSharp.Drawing.WebGPU", "src\ImageSharp.Drawing.WebGPU\ImageSharp.Drawing.WebGPU.csproj", "{061582C2-658F-40AE-A978-7D74A4EB2C0A}"
341341
EndProject
342+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebGPUWindowDemo", "samples\WebGPUWindowDemo\WebGPUWindowDemo.csproj", "{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}"
343+
EndProject
342344
Global
343345
GlobalSection(SolutionConfigurationPlatforms) = preSolution
344346
Debug|Any CPU = Debug|Any CPU
347+
Debug|x64 = Debug|x64
348+
Debug|x86 = Debug|x86
345349
Release|Any CPU = Release|Any CPU
350+
Release|x64 = Release|x64
351+
Release|x86 = Release|x86
346352
EndGlobalSection
347353
GlobalSection(ProjectConfigurationPlatforms) = postSolution
348354
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
349355
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|Any CPU.Build.0 = Debug|Any CPU
356+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.ActiveCfg = Debug|Any CPU
357+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x64.Build.0 = Debug|Any CPU
358+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.ActiveCfg = Debug|Any CPU
359+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Debug|x86.Build.0 = Debug|Any CPU
350360
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.ActiveCfg = Release|Any CPU
351361
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|Any CPU.Build.0 = Release|Any CPU
362+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.ActiveCfg = Release|Any CPU
363+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x64.Build.0 = Release|Any CPU
364+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.ActiveCfg = Release|Any CPU
365+
{2E33181E-6E28-4662-A801-E2E7DC206029}.Release|x86.Build.0 = Release|Any CPU
352366
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
353367
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
368+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x64.ActiveCfg = Debug|Any CPU
369+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x64.Build.0 = Debug|Any CPU
370+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x86.ActiveCfg = Debug|Any CPU
371+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Debug|x86.Build.0 = Debug|Any CPU
354372
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
355373
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|Any CPU.Build.0 = Release|Any CPU
374+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|x64.ActiveCfg = Release|Any CPU
375+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|x64.Build.0 = Release|Any CPU
376+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|x86.ActiveCfg = Release|Any CPU
377+
{EA3000E9-2A91-4EC4-8A68-E566DEBDC4F6}.Release|x86.Build.0 = Release|Any CPU
356378
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
357379
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|Any CPU.Build.0 = Debug|Any CPU
380+
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|x64.ActiveCfg = Debug|Any CPU
381+
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|x64.Build.0 = Debug|Any CPU
382+
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|x86.ActiveCfg = Debug|Any CPU
383+
{59804113-1DD4-4F80-8D06-35FF71652508}.Debug|x86.Build.0 = Debug|Any CPU
358384
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|Any CPU.ActiveCfg = Release|Any CPU
359385
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|Any CPU.Build.0 = Release|Any CPU
386+
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|x64.ActiveCfg = Release|Any CPU
387+
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|x64.Build.0 = Release|Any CPU
388+
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|x86.ActiveCfg = Release|Any CPU
389+
{59804113-1DD4-4F80-8D06-35FF71652508}.Release|x86.Build.0 = Release|Any CPU
360390
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
361391
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|Any CPU.Build.0 = Debug|Any CPU
392+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|x64.ActiveCfg = Debug|Any CPU
393+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|x64.Build.0 = Debug|Any CPU
394+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|x86.ActiveCfg = Debug|Any CPU
395+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Debug|x86.Build.0 = Debug|Any CPU
362396
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|Any CPU.ActiveCfg = Release|Any CPU
363397
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|Any CPU.Build.0 = Release|Any CPU
398+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|x64.ActiveCfg = Release|Any CPU
399+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|x64.Build.0 = Release|Any CPU
400+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|x86.ActiveCfg = Release|Any CPU
401+
{5493F024-0A3F-420C-AC2D-05B77A36025B}.Release|x86.Build.0 = Release|Any CPU
364402
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
365403
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
404+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|x64.ActiveCfg = Debug|Any CPU
405+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|x64.Build.0 = Debug|Any CPU
406+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|x86.ActiveCfg = Debug|Any CPU
407+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Debug|x86.Build.0 = Debug|Any CPU
366408
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
367409
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|Any CPU.Build.0 = Release|Any CPU
410+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|x64.ActiveCfg = Release|Any CPU
411+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|x64.Build.0 = Release|Any CPU
412+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|x86.ActiveCfg = Release|Any CPU
413+
{061582C2-658F-40AE-A978-7D74A4EB2C0A}.Release|x86.Build.0 = Release|Any CPU
414+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
415+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
416+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|x64.ActiveCfg = Debug|Any CPU
417+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|x64.Build.0 = Debug|Any CPU
418+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|x86.ActiveCfg = Debug|Any CPU
419+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Debug|x86.Build.0 = Debug|Any CPU
420+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
421+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|Any CPU.Build.0 = Release|Any CPU
422+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|x64.ActiveCfg = Release|Any CPU
423+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|x64.Build.0 = Release|Any CPU
424+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|x86.ActiveCfg = Release|Any CPU
425+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA}.Release|x86.Build.0 = Release|Any CPU
368426
EndGlobalSection
369427
GlobalSection(SolutionProperties) = preSolution
370428
HideSolutionNode = FALSE
@@ -393,6 +451,7 @@ Global
393451
{5493F024-0A3F-420C-AC2D-05B77A36025B} = {528610AC-7C0C-46E8-9A2D-D46FD92FEE29}
394452
{23859314-5693-4E6C-BE5C-80A433439D2A} = {1799C43E-5C54-4A8F-8D64-B1475241DB0D}
395453
{061582C2-658F-40AE-A978-7D74A4EB2C0A} = {815C0625-CD3D-440F-9F80-2D83856AB7AE}
454+
{2541FDCD-78AC-40DB-B5E3-6A715DC132BA} = {528610AC-7C0C-46E8-9A2D-D46FD92FEE29}
396455
EndGlobalSection
397456
GlobalSection(ExtensibilityGlobals) = postSolution
398457
SolutionGuid = {5F8B9D1F-CD8B-4CC5-8216-D531E25BD795}

samples/DrawShapesWithImageSharp/Program.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ private static void DrawSerializedOPenSansLetterShape_a()
111111
})];
112112

113113
ComplexPolygon complex = new(polys);
114-
complex.SaveImage("letter", "a.png");
114+
complex.SaveImage("Letter", "a.png");
115115
}
116116

117117
private static void DrawSerializedOPenSansLetterShape_o()
@@ -129,7 +129,7 @@ private static void DrawSerializedOPenSansLetterShape_o()
129129
})];
130130

131131
ComplexPolygon complex = new(polys);
132-
complex.SaveImage("letter", "o.png");
132+
complex.SaveImage("Letter", "o.png");
133133
}
134134

135135
private static void DrawOval()
@@ -157,7 +157,7 @@ private static void OutputDrawnShape()
157157
sb.AddLine(new Vector2(25, 30), new Vector2(15, 30));
158158
sb.CloseFigure();
159159

160-
sb.Build().Translate(0, 10).Scale(10).SaveImage("drawing", $"paths.png");
160+
sb.Build().Translate(0, 10).Scale(10).SaveImage("Drawing", $"paths.png");
161161
}
162162

163163
private static void OutputDrawnShapeHourGlass()
@@ -174,7 +174,7 @@ private static void OutputDrawnShapeHourGlass()
174174
sb.AddLine(new Vector2(15, 30), new Vector2(25, 30));
175175
sb.CloseFigure();
176176

177-
sb.Build().Translate(0, 10).Scale(10).SaveImage("drawing", $"HourGlass.png");
177+
sb.Build().Translate(0, 10).Scale(10).SaveImage("Drawing", $"HourGlass.png");
178178
}
179179

180180
private static void OutputStarOutline(int points, float inner = 10, float outer = 20, float width = 5, LineJoin jointStyle = LineJoin.Miter)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Draw Shapes With ImageSharp
2+
3+
A sample application that demonstrates the core vector drawing capabilities of ImageSharp.Drawing. Each example renders shapes to an `Image<Rgba32>` using the `DrawingCanvas` API and saves the result as a PNG file in the `Output/` directory.
4+
5+
## What it demonstrates
6+
7+
- **Stars** — Filled and outlined star polygons with varying point counts, inner/outer radii, line join styles (miter, round, bevel), and dashed outlines with different line caps.
8+
- **Clipping** — Rectangle-on-rectangle clipping using `IPath.Clip()`.
9+
- **Path building** — Constructing complex shapes with `PathBuilder`, including multi-figure paths (a V overlaid with a rectangle) and an hourglass shape.
10+
- **Curves** — Ellipses via `EllipsePolygon` and cubic Bezier arcs via `CubicBezierLineSegment`.
11+
- **Text as paths** — Converting text to vector outlines using `TextBuilder.GeneratePaths()` with system fonts, including text laid out along a curved path.
12+
- **Serialized glyph data** — Rendering OpenSans letter shapes ('a' and 'o') from serialized coordinate data as `ComplexPolygon` instances.
13+
- **Canvas API**`Fill` for solid backgrounds and shape rendering via `ProcessWithCanvas`.
14+
15+
## Running
16+
17+
```bash
18+
dotnet run --project samples/DrawShapesWithImageSharp -c Debug
19+
```
20+
21+
Output images are written to the `Output/` directory, organized into subdirectories by category: `Stars/`, `Clipping/`, `Curves/`, `Text/`, `Drawing/`, `Letter/`, and `Issues/`.

0 commit comments

Comments
 (0)