Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: SixLabors/ImageSharp.Drawing
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v3.1.0
Choose a base ref
...
head repository: SixLabors/ImageSharp.Drawing
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: v3.1.2
Choose a head ref
  • 13 commits
  • 280 files changed
  • 1 contributor

Commits on Sep 11, 2026

  1. Share the guarded arc subdivision between round joins and caps, fix C…

    …PU edge accuracy
    
    - CalcArc and stroke_calc_arc take their vertex count from the guarded
      GetArcSubdivisionCount and stroke_arc_subdivision_count used by round caps.
    - StrokeOptions.ArcDetailScale rejects values not greater than zero.
    - DefaultRasterizer: band boundary X is interpolated from the segment
      endpoint and rounded to nearest, coverage uses the exact doubled area,
      and the DDA walkers round row and column boundaries to nearest.
    - Tests: ArcDetailScale validation, subdivision count monotonicity, and
      CPU/GPU parity theories for round joins at scales 0.01 to 16.
    - Reference images updated for the corrected edge coverage.
    JimBobSquarePants committed Sep 11, 2026
    Configuration menu
    Copy the full SHA
    e52d562 View commit details
    Browse the repository at this point in the history
  2. Configuration menu
    Copy the full SHA
    9bbd0a5 View commit details
    Browse the repository at this point in the history
  3. Merge pull request #417 from SixLabors/js/round-join-arc-guard

    Round join tessellation and CPU edge accuracy
    JimBobSquarePants authored Sep 11, 2026
    Configuration menu
    Copy the full SHA
    9b612ed View commit details
    Browse the repository at this point in the history

Commits on Sep 14, 2026

  1. Make DrawingTextCache thread-safe

    Protect cache metadata, publish complete glyph entries, and lease reusable working buffers to each drawing operation. Keep outline construction and rasterization unchanged.
    
    Add tests for concurrent drawing, outline reuse, complete publication, eviction, clearing, and buffer ownership. Update Fonts to 3.1.2 and ImageSharp to 4.1.2.
    
    Validation: Full Release suite passed on .NET 8 and .NET 10, with 2,754 passed and 9 skipped per target.
    JimBobSquarePants committed Sep 14, 2026
    Configuration menu
    Copy the full SHA
    1747da0 View commit details
    Browse the repository at this point in the history
  2. Stabilize concurrent cache tests

    Use `Task.Factory.StartNew` with `TaskCreationOptions.LongRunning` in the concurrent drawing text cache tests so each barrier participant gets a dedicated thread. This avoids thread-pool starvation and intermittent failures on small CI runners when other tests are also scheduling work.
    JimBobSquarePants committed Sep 14, 2026
    Configuration menu
    Copy the full SHA
    70d94cd View commit details
    Browse the repository at this point in the history
  3. Merge pull request #420 from SixLabors/js/drawing-cache

    Make DrawingTextCache thread-safe
    JimBobSquarePants authored Sep 14, 2026
    Configuration menu
    Copy the full SHA
    ef8c9c8 View commit details
    Browse the repository at this point in the history

Commits on Sep 15, 2026

  1. Add a Paint overload that takes a DrawingTextCache

    The Paint image processing extension created a private text cache for
    each frame canvas. The new overload passes an application-owned cache to
    every frame canvas so glyph geometry is shared across draws, matching
    the CreateCanvas overloads.
    JimBobSquarePants committed Sep 15, 2026
    Configuration menu
    Copy the full SHA
    715e0d3 View commit details
    Browse the repository at this point in the history
  2. Replay cached layered glyph paints in text space

    Cached color glyph layers re-create their paint brushes on replay. The
    cache stored the device-space glyph origin and appended the device-space
    delta after the drawing transform, so a draw whose transform carries an
    origin applied that offset twice and the gradient drifted off the glyph.
    Store the glyph origin before the drawing transform and apply the delta
    before it.
    JimBobSquarePants committed Sep 15, 2026
    Configuration menu
    Copy the full SHA
    f30b3ba View commit details
    Browse the repository at this point in the history
  3. Merge pull request #422 from SixLabors/js/emoji-replay-color

    Fix cached color glyph paint replay and add a Paint overload with a text cache
    JimBobSquarePants authored Sep 15, 2026
    Configuration menu
    Copy the full SHA
    22d08fc View commit details
    Browse the repository at this point in the history

Commits on Sep 17, 2026

  1. Compose gradient transforms on the brush

    Transforming a gradient brush projected its geometry point by point,
    which reduces any affine transform to a similarity. A COLRv1 radial
    paint squashed by its PaintTransform into a flat ellipse became a
    circle, and the pad region of that circle painted the toned thumbs-up
    opaque dark.
    
    GradientBrush carries a GradientTransform from the gradient's space to
    the drawing, every brush has a constructor overload that takes it, and
    Transform() composes it exactly for affine matrices. The old point
    projection remains for projective matrices, which have no affine
    inverse. Renderers fold the inverse: the linear brush into its axis,
    the two-circle radial brush into its canonical transform, and the
    others map each sample once when a transform is set. The glyph
    renderer builds paint-space brushes with the paint's transform
    composed after the glyph's.
    
    Interpolation is unchanged: premultiplied, as the CSS Color 4
    gradient rules require.
    JimBobSquarePants committed Sep 17, 2026
    Configuration menu
    Copy the full SHA
    44e5722 View commit details
    Browse the repository at this point in the history
  2. Carry the gradient transform through the WebGPU scene

    Every gradient payload starts with the six words of the inverse affine
    transform. The draw tag's scene-size field widens to four bits to hold
    the larger payloads. draw_leaf reads the transform once and composes
    it per gradient kind: the linear brush folds it into its line
    equation, the radial and elliptic brushes multiply it into their
    canonical transforms, and the sweep brush carries the matrix and
    translation.
    
    Adds a CPU and GPU parity test over the four transformed brushes.
    JimBobSquarePants committed Sep 17, 2026
    Configuration menu
    Copy the full SHA
    135b1a9 View commit details
    Browse the repository at this point in the history
  3. Configuration menu
    Copy the full SHA
    57892f9 View commit details
    Browse the repository at this point in the history
  4. Merge pull request #424 from SixLabors/js/colr-gradient-interpolation…

    …-3.1
    
    Compose gradient transforms on the brush and consume Fonts 3.1.3
    JimBobSquarePants authored Sep 17, 2026
    Configuration menu
    Copy the full SHA
    17815ec View commit details
    Browse the repository at this point in the history
Loading