> This PR adds a `getDrawingContext` method to `WritableImage`, which works > similar to `Canvas::getGraphicsContext` and shares the same signatures. Key > features include: > > - **Shape rendering**: `strokeRect`, `fillRect`, `strokeOval`, `fillOval`, > `strokeArc`, `fillArc`, `strokePolyline`, `fillPolygon`, etc. > - **Stroke and fill attributes**: `lineWidth`, `lineCap`, `lineJoin`, > `miterLimit`, `fillRule`, `stroke` and `fill` paints. > - **Global graphics settings**: `globalAlpha` and `globalBlendMode`. > - **Image drawing**: draw other `Image` instances with scaling and > source/destination rectangles. > - **Text rendering**: render text > - **Save/Restore**: store current stroke, font, dashes, etc and restore them > later > - **Paths**: begin a path, with lines, curves, etc, then stroke or fill it > - **Clips**: support rectangular clips in the SW renderer > > This feature enables direct software rendering to `WritableImage` without > requiring a `Canvas` + snapshot. > > **New API for `GraphicsContext`** > > Because `GraphicsContext` was never designed to support a more generic API > when it was conceived, it has gained a few new methods that were a better fit > for the reusable `DrawingContext` interface: > > - `clipRect(x, y, w, h)` -- convenience equivalent to `rect(...)` + `clip()` > - `getEffect()` -- no arg getter for the `Effect` > - `getTextDirection()` and `setTextDirection(NodeOrientation)` -- takes > precedence over `Canvas.getNodeOrientation()` when not set to `INHERIT` (the > default) > > **Additional notes**: > > - The implementation leverages the software stack consisting of the Marlin > rasterizer and Pisces compositor/painter. > > **Example usage**: > > > WritableImage img = new WritableImage(400, 400); > DrawingContext ctx = img.getDrawingContext(); > ctx.setFill(Color.RED); > ctx.fillRect(50, 50, 100, 100); > > > See the sample program `RandomShapesDemo` to see a `WritableImage` and > `Canvas` side by side performing the same operations: > > <img width="1249" height="741" alt="image" > src="https://github.com/user-attachments/assets/4a0b9dcc-8f96-4faa-99cf-83c66d2c851e" > /> > > Newer version: > > <img width="1249" height="741" alt="image" > src="https://github.com/user-attachments/assets/c0502620-3d02-4fbd-8c33-43bd5138b42c" > /> > > --------- > - [x] I confirm that I make this contribution in accordance with the [OpenJDK > Interim AI Policy](https://openjdk.org/legal/ai).
John Hendrikx has updated the pull request incrementally with eight additional commits since the last revision: - Add fast no copy draw path for heap backed INT_ARGB images - Document image size limitations - Add test for malformed polygon data - Fix new and pre-existing issue in JJavaSurface.c - Document and align behavior when not enough points supplied for polygon - Documented strokes/fills degenerate cases and made them consistent - Add missing table entry for GraphicsContext - Fix copyright year after botched merge ------------- Changes: - all: https://git.openjdk.org/jfx/pull/1969/files - new: https://git.openjdk.org/jfx/pull/1969/files/60e35b85..07d9f31d Webrevs: - full: https://webrevs.openjdk.org/?repo=jfx&pr=1969&range=21 - incr: https://webrevs.openjdk.org/?repo=jfx&pr=1969&range=20-21 Stats: 325 lines in 10 files changed: 298 ins; 10 del; 17 mod Patch: https://git.openjdk.org/jfx/pull/1969.diff Fetch: git fetch https://git.openjdk.org/jfx.git pull/1969/head:pull/1969 PR: https://git.openjdk.org/jfx/pull/1969
