Loading the parity record
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Fetching the measured run — the pinned upstream oracle, every symbol and every case.
Parity / sharp
Every number on this page was produced by running both implementations over the same cases: the real sharp package pinned at 0.33.5 answers first, and its answer is the expectation the Go port is held to. Nothing is a hand-written expectation, so a new upstream release re-scores the port on its own. See sharp for the port's own documentation. Source: github.com/malcolmston/sharp.
Not a generic diagram: every node below names an artefact of this harness — the pinned package it installed, the runner files it started, the case files it streamed, and the counts it wrote out.
| Case group | Cases | Match | Mismatch | Group parity |
|---|---|---|---|---|
| geometry-fit | 100 | 60 | 40 | 60.0% |
| pixels | 60 | 38 | 22 | 63.3% |
| geometry-rotate | 24 | 16 | 8 | 66.7% |
| geometry-single-dim | 24 | 19 | 5 | 79.2% |
| channels | 20 | 8 | 12 | 40.0% |
| encode | 18 | 13 | 5 | 72.2% |
| geometry-resize-opts | 14 | 6 | 8 | 42.9% |
| metadata | 14 | 10 | 4 | 71.4% |
| geometry-extend | 13 | 12 | 1 | 92.3% |
| decode | 11 | 8 | 3 | 72.7% |
| geometry-extract | 9 | 9 | 0 | 100.0% |
| geometry-chain | 8 | 8 | 0 | 100.0% |
| tofile | 7 | 4 | 3 | 57.1% |
| surface | 5 | 2 | 3 | 40.0% |
Every exported symbol of the upstream package, and what the port offers for it. The upstream list is derived mechanically, never from a README: cd parity/sharp/node
node -e "const s=require('sharp');
console.log(Object.getOwnPropertyNames(s.prototype)
.filter(n => typeof s.prototype[n] === 'function'
&& n !== 'constructor' && !n.startsWith('_')).sort().join('\n'))". A symbol with no case is untested, never a match.
| Upstream symbol | Go symbol | Status | Cases | Note |
|---|---|---|---|---|
| Sharp#affine | Pipeline.Affine | differs | affine-shear, affine-scale, affine-singular | output bounding box 1 px wider (79 vs 78); sharp takes a 2×2 matrix + interpolator, the port a 2×3 matrix and no interpolator choice |
| Sharp#avif | — | missing | enc-avif, decode-avif, meta-avif | no AVIF at all: cannot encode, cannot decode |
| Sharp#bandbool | Pipeline.Bandbool | match | ch-bandbool-and, px-bandbool-and, px-bandbool-or | |
| Sharp#blur | Pipeline.Blur | differs | px-blur, px-blur-checker | agrees on a gradient (Δmean 0.05) but Δgrid 9.75 on a checkerboard: different Gaussian support/truncation |
| Sharp#boolean | Pipeline.Boolean | differs | ch-boolean-eor, ch-boolean-and, ch-boolean-size-mismatch, ch-boolean-bogus-op, px-boolean-eor | port XORs the alpha band (255^255 = 0) so eor wipes alpha; port rejects a differently-sized operand that sharp accepts |
| Sharp#clahe | Pipeline.CLAHE | differs | px-clahe | Δmean 64: different tile histogram/clip formulation |
| Sharp#clone | Pipeline.Clone | untested | — | present in both; no case |
| Sharp#composite | Pipeline.Composite | differs | px-composite-over, px-composite-offset, px-composite-multiply, px-composite-gravity | agrees for opaque overlays; Δmean 13 for a translucent overlay (the port's decode premultiplies — see divergence 7) |
| Sharp#convolve | Pipeline.Convolve, sharp.NewKernel | match | px-convolve-sharpen, px-convolve-box | exact to 0.000 |
| Sharp#ensureAlpha | Pipeline.EnsureAlpha | differs | ch-ensure-alpha, ch-ensure-alpha-half | with alpha 1 the port still reports 3 channels / hasAlpha:false (see divergence 6) |
| Sharp#extend | Pipeline.Extend, Pipeline.ExtendWith | differs | extend-* (13) | 12/13 agree including all four extendWith modes; a negative side throws upstream and is silently clamped to 0 by the port |
| Sharp#extract | Pipeline.Extract, Pipeline.Crop | match | extract-* (9) | including all four out-of-bounds/zero-size error cases |
| Sharp#extractChannel | Pipeline.ExtractChannel | differs | ch-extract-r/g/b, ch-extract-a-present, ch-extract-a-missing | upstream yields a 1-band image, the port a 3-band grey; extracting alpha from an image that has none throws upstream and succeeds in the port |
| Sharp#flatten | Pipeline.Flatten | differs | ch-flatten, px-flatten | geometry agrees; Δgrid 3.6 from the premultiplied decode |
| Sharp#flip | Pipeline.FlipVertical, Pipeline.Flip | match | flip-grad, flip-flop-grad, px-flip | |
| Sharp#flop | Pipeline.FlipHorizontal, Pipeline.Flop | match | flop-grad, px-flop | |
| Sharp#gamma | Pipeline.Gamma | differs | px-gamma, px-gamma-low | Δmean 49. sharp's gamma(g) decodes by 1/g pre-resize and re-encodes by g after, so with no resize it is near-identity; the port applies out = 255·(in/255)^(1/g) once and brightens |
| Sharp#gif | Pipeline.ToGIF | differs | enc-gif, enc-gif-alpha | opaque GIF agrees; the port's GIF drops alpha (3 bands) where sharp keeps it (4) |
| Sharp#grayscale | Pipeline.Grayscale | differs | ch-grayscale, px-grayscale | Δmean 12.2: sharp converts through linear-light B-W, the port applies Rec. 601 weights to sRGB values; also 1 band vs 3 |
| Sharp#greyscale | Pipeline.Grayscale | differs | ch-grayscale | same as above; the port has no British-spelled alias |
| Sharp#heif | — | missing | enc-heif | both sides error, but only because this prebuilt binary wants an explicit compression — not evidence of parity |
| Sharp#joinChannel | sharp.JoinChannels | untested | — | different shape (package function over image.Image, not a pipeline method) |
| Sharp#jp2 | — | missing | enc-jp2 | both error; upstream's is "requires libvips with OpenJPEG", so this pass is incidental |
| Sharp#jpeg | Pipeline.ToJPEG, Pipeline.ToJPEGWithOptions | match | enc-jpeg, enc-jpeg-q40, enc-jpeg-q100, enc-jpeg-alpha, tofile-jpeg | only quality of sharp's 13 JPEG keys exists in the port |
| Sharp#jxl | — | missing | enc-jxl | both error; upstream's is a missing libvips operation, so this pass is incidental |
| Sharp#keepExif | — | missing | — | no EXIF handling in the port at all |
| Sharp#keepIccProfile | — | missing | — | no ICC handling in the port at all |
| Sharp#keepMetadata | — | missing | — | |
| Sharp#linear | Pipeline.Linear | match | px-linear, px-linear-per-channel | Δmean 0.33 |
| Sharp#median | Pipeline.Median | differs | px-median, px-median-5, px-median-even | 3×3 exact; 5×5 Δmean 3.86; the port takes a radius so it cannot express an even window, which sharp accepts |
| Sharp#metadata | Pipeline.Metadata | differs | meta-* (14) | channels/hasAlpha are inferred from the pixels, not read from the file (see divergence 5); no WebP/AVIF/HEIF input, but BMP input that sharp lacks |
| Sharp#modulate | Pipeline.Modulate | match | px-modulate-brightness, px-modulate-saturation, px-modulate-hue | Δmean ≤ 0.02 — the port really does go through D65 CIELAB |
| Sharp#negate | Pipeline.Negate, Pipeline.Invert | differs | px-negate, px-negate-alpha | RGB agrees exactly; sharp's default alpha: true also negates alpha, the port always preserves it |
| Sharp#normalise | Pipeline.Normalise | differs | px-normalise, px-normalise-full | Δmean 9.6 at 1–99 %: different percentile/stretch basis |
| Sharp#normalize | Pipeline.Normalize | differs | px-normalise | alias of the above |
| Sharp#pipelineColorspace | — | missing | — | no control of the working colourspace |
| Sharp#pipelineColourspace | — | missing | — | |
| Sharp#png | Pipeline.ToPNG, Pipeline.ToPNGWithOptions | match | enc-png, enc-png-alpha, tofile-png | only compressionLevel of sharp's 11 PNG keys |
| Sharp#raw | Pipeline.ToRaw, sharp.FromRaw | differs | surface-raw-roundtrip-grad/circle/orgba, tofile-raw | round-trips cleanly, but the port always emits 4 bytes/px (12288 vs upstream's 9216 for a 3-band 64×48 image), and its doc comment says "non-premultiplied" while the buffer is premultiplied |
| Sharp#recomb | Pipeline.Recomb | match | px-recomb, px-recomb-identity | Δmean 0.5 |
| Sharp#removeAlpha | Pipeline.RemoveAlpha | match | ch-remove-alpha, ch-remove-alpha-opaque | |
| Sharp#resize | Pipeline.Resize, ResizeTo, ResizeWidth, ResizeHeight | differs | fit-* (100), dim-* (24), opt-* (14), px-resize-* (13) | 40 of 100 fit cases and 5 of 24 single-dimension cases disagree — see divergences 1–4 |
| Sharp#rotate | Pipeline.Rotate, Rotate90/180/270 | differs | rotate-* (16), px-rotate90/180/270 | exact multiples of 90° agree exactly; every other angle gets a bounding box 1 px too large (see divergence 2) |
| Sharp#sharpen | Pipeline.Sharpen, Pipeline.Unsharp | differs | px-sharpen | passes the coarse check (Δmean 0.09) but the signature cannot express sharp's {sigma, m1, m2, x1, y2, y3} — the port takes one unitless amount over a fixed 3×3 kernel |
| Sharp#stats | Pipeline.Stats, Pipeline.ChannelStats | untested | — | present but shaped differently (no entropy/dominant/isOpaque in one call); the coarse pixel summary is computed by the harness, not by either stats() |
| Sharp#threshold | Pipeline.Threshold | differs | px-threshold | Δmean 18.8, inherited from the greyscale difference the threshold is taken over |
| Sharp#tiff | Pipeline.ToTIFF | differs | enc-tiff, enc-tiff-alpha, tofile-tiff | opaque agrees; the port's TIFF keeps alpha (4 bands) where sharp drops it (3). Port writes baseline uncompressed only — none of sharp's 13 TIFF keys |
| Sharp#tile | — | missing | — | no tiled/deep-zoom output |
| Sharp#timeout | — | missing | — | |
| Sharp#tint | Pipeline.Tint | differs | px-tint | Δmean 80. sharp tints in LAB preserving lightness; the port multiplies each channel by the tint, which darkens |
| Sharp#toBuffer | Pipeline.ToFormat and friends | match | the whole encode group | resolveWithObject has no equivalent |
| Sharp#toColorspace | Pipeline.ToColorspace | differs | ch-tocolourspace-bw, -srgb, -bogus | alias of the below |
| Sharp#toColourspace | Pipeline.ToColourspace | differs | ch-tocolourspace-bw, -srgb, -bogus | b-w gives 1 band upstream, 3 in the port; an unknown space is ignored upstream and is a hard error in the port; only b-w/sRGB are recognised at all |
| Sharp#toFile | Pipeline.ToFile | differs | tofile-* (7) | ToFile(path, FormatRaw, …) writes a PNG while ToFormat(FormatRaw) writes real raw bytes** (see divergence 8); also accepts BMP (extra) and rejects WebP (missing) |
| Sharp#toFormat | Pipeline.ToFormat | differs | enc-* (18), surface-output-formats | no WebP/AVIF/HEIF/JXL/JP2; BMP is Go-only |
| Sharp#trim | Pipeline.Trim | match | trim-grad, trim-circle, px-trim | background and lineArt keys have no equivalent |
| Sharp#unflatten | Pipeline.Unflatten | differs | ch-unflatten, px-unflatten | upstream produces a 4-band result, the port still reports 3; Δgrid 13.9 from the premultiplied decode |
| Sharp#webp | — | missing | enc-webp, decode-webp, meta-webp, tofile-webp, surface-output-formats, surface-input-formats | no WebP at all: cannot encode, cannot decode |
| Sharp#withExif | — | missing | — | |
| Sharp#withExifMerge | — | missing | — | |
| Sharp#withIccProfile | — | missing | — | |
| Sharp#withMetadata | Pipeline.WithDensity | untested | — | only the density half is ported; no case |
| — | FormatBMP, Pipeline.ToBMP | extra | enc-bmp, decode-bmp, meta-bmp, tofile-bmp, surface-output-formats, surface-input-formats | the port both reads and writes BMP; sharp does neither |
| — | Pipeline.Rotate90/180/270 | extra | rotate-grad-90/180/270, px-rotate90/180/270 | exact-multiple shortcuts; agree with rotate(90 |
| — | Pipeline.Crop | extra | extract-crop-alias | alias of Extract |
| — | sharp.FromRaw | extra | surface-raw-roundtrip-* | upstream expresses this as an input option, not a constructor |
| — | Brightness, Contrast, Saturation, Sepia, Erode, Dilate, Morphology, Unsharp, Histogram, Entropy, Sharpness, DominantColor, MeanColor, IsOpaque, ChannelStats, RGBToLab/LabToRGB/RGBToXYZ/XYZToRGB/RGBToHSV/HSVToRGB/DeltaE76/Luma, WithDensity, JoinChannels, Invert, Flip/Flop aliases | extra | — | Go-only helpers with no upstream Sharp.prototype counterpart, so there is nothing to compare them against |
Every case the harness streamed to both runners, with the exact upstream symbol and Go symbol it exercised. A deliberate, documented difference is a deviation and is counted apart from a mismatch.
| Case | Group | Upstream symbol | Go symbol | Status | Note |
|---|---|---|---|---|---|
| ch-grayscale | channels | Sharp#grayscale | Pipeline.Grayscale | mismatch | |
| ch-tocolourspace-bw | channels | Sharp#toColourspace | Pipeline.ToColourspace | mismatch | |
| ch-tocolourspace-srgb | channels | Sharp#toColourspace | Pipeline.ToColourspace | match | |
| ch-tocolourspace-bogus | channels | Sharp#toColourspace | Pipeline.ToColourspace | mismatch | unknown colourspace |
| ch-ensure-alpha | channels | Sharp#ensureAlpha | Pipeline.EnsureAlpha | mismatch | |
| ch-ensure-alpha-half | channels | Sharp#ensureAlpha | Pipeline.EnsureAlpha | match | |
| ch-remove-alpha | channels | Sharp#removeAlpha | Pipeline.RemoveAlpha | match | |
| ch-remove-alpha-opaque | channels | Sharp#removeAlpha | Pipeline.RemoveAlpha | match | |
| ch-flatten | channels | Sharp#flatten | Pipeline.Flatten | match | |
| ch-unflatten | channels | Sharp#unflatten | Pipeline.Unflatten | mismatch | |
| ch-extract-r | channels | Sharp#extractChannel | Pipeline.ExtractChannel | mismatch | |
| ch-extract-g | channels | Sharp#extractChannel | Pipeline.ExtractChannel | mismatch | |
| ch-extract-b | channels | Sharp#extractChannel | Pipeline.ExtractChannel | mismatch | |
| ch-extract-a-missing | channels | Sharp#extractChannel | Pipeline.ExtractChannel | mismatch | alpha channel of an image that has none |
| ch-extract-a-present | channels | Sharp#extractChannel | Pipeline.ExtractChannel | mismatch | |
| ch-bandbool-and | channels | Sharp#bandbool | Pipeline.Bandbool | match | |
| ch-boolean-eor | channels | Sharp#boolean | Pipeline.Boolean | mismatch | XOR of two opaque images: the port XORs the alpha band too |
| ch-boolean-and | channels | Sharp#boolean | Pipeline.Boolean | match | |
| ch-boolean-size-mismatch | channels | Sharp#boolean | Pipeline.Boolean | mismatch | operand of a different size |
| ch-boolean-bogus-op | channels | Sharp#boolean | Pipeline.Boolean | match | unknown operator |
| decode-grad | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-circle | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-jpg | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-gif | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-tiff | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-bmp | decode | Sharp#metadata | sharp.FromFile | mismatch | input format acceptance |
| decode-webp | decode | Sharp#metadata | sharp.FromFile | mismatch | input format acceptance |
| decode-avif | decode | Sharp#metadata | sharp.FromFile | mismatch | input format acceptance |
| decode-garbage | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-empty | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| decode-trunc | decode | Sharp#metadata | sharp.FromFile | match | input format acceptance |
| enc-png | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-jpeg | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-gif | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-tiff | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-webp | encode | Sharp#toFormat | Pipeline.ToFormat | mismatch | output format acceptance |
| enc-avif | encode | Sharp#toFormat | Pipeline.ToFormat | mismatch | output format acceptance |
| enc-heif | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-bmp | encode | Sharp#toFormat | Pipeline.ToFormat | mismatch | output format acceptance |
| enc-raw | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-jp2 | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-jxl | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-xyz | encode | Sharp#toFormat | Pipeline.ToFormat | match | output format acceptance |
| enc-jpeg-q40 | encode | Sharp#jpeg | Pipeline.ToJPEGWithOptions | match | |
| enc-jpeg-q100 | encode | Sharp#jpeg | Pipeline.ToJPEGWithOptions | match | |
| enc-png-alpha | encode | Sharp#png | Pipeline.ToPNG | match | alpha must survive a PNG round trip |
| enc-jpeg-alpha | encode | Sharp#jpeg | Pipeline.ToJPEG | match | JPEG has no alpha: how is it dropped? |
| enc-tiff-alpha | encode | Sharp#tiff | Pipeline.ToTIFF | mismatch | |
| enc-gif-alpha | encode | Sharp#gif | Pipeline.ToGIF | mismatch | |
| chain-rotate-resize | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-resize-extract | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-resize-extend | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-extract-resize | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-resize-twice | geometry-chain | Sharp#resize | Pipeline.Resize | match | two resizes: sharp keeps only the last, the port applies both |
| chain-rotate-extend | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-flip-resize | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| chain-extract-extend | geometry-chain | Sharp#resize | Pipeline.Resize | match | |
| extend-all | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-top | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-right | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-bottom | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-left | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-zero | geometry-extend | Sharp#extend | Pipeline.Extend | match | |
| extend-negative | geometry-extend | Sharp#extend | Pipeline.Extend | mismatch | negative padding |
| extend-opaque-bg | geometry-extend | Sharp#extend | Pipeline.Extend | match | opaque background keeps the band count |
| extend-alpha-bg | geometry-extend | Sharp#extend | Pipeline.Extend | match | translucent background must add an alpha band |
| extend-with-background | geometry-extend | Sharp#extend(extendWith) | Pipeline.ExtendWith | match | extendWith:background |
| extend-with-copy | geometry-extend | Sharp#extend(extendWith) | Pipeline.ExtendWith | match | extendWith:copy |
| extend-with-repeat | geometry-extend | Sharp#extend(extendWith) | Pipeline.ExtendWith | match | extendWith:repeat |
| extend-with-mirror | geometry-extend | Sharp#extend(extendWith) | Pipeline.ExtendWith | match | extendWith:mirror |
| extract-inner | geometry-extract | Sharp#extract | Pipeline.Extract | match | |
| extract-origin | geometry-extract | Sharp#extract | Pipeline.Extract | match | |
| extract-full | geometry-extract | Sharp#extract | Pipeline.Extract | match | |
| extract-bottom-right | geometry-extract | Sharp#extract | Pipeline.Extract | match | |
| extract-overflow-x | geometry-extract | Sharp#extract | Pipeline.Extract | match | region runs off the right edge |
| extract-overflow-y | geometry-extract | Sharp#extract | Pipeline.Extract | match | region runs off the bottom edge |
| extract-negative-left | geometry-extract | Sharp#extract | Pipeline.Extract | match | negative offset |
| extract-zero-width | geometry-extract | Sharp#extract | Pipeline.Extract | match | zero-width region |
| extract-crop-alias | geometry-extract | Sharp#extract | Pipeline.Crop | match | Crop is the port's alias for Extract |
| fit-grad-32x32-fill | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:fill of grad into 32x32 |
| fit-grad-32x32-cover | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:cover of grad into 32x32 |
| fit-grad-32x32-inside | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:inside of grad into 32x32 |
| fit-grad-32x32-contain | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:contain of grad into 32x32 |
| fit-grad-32x32-outside | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:outside of grad into 32x32 |
| fit-grad-100x100-fill | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:fill of grad into 100x100 |
| fit-grad-100x100-cover | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:cover of grad into 100x100 |
| fit-grad-100x100-inside | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:inside of grad into 100x100 |
| fit-grad-100x100-contain | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:contain of grad into 100x100 |
| fit-grad-100x100-outside | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:outside of grad into 100x100 |
| fit-grad-50x20-fill | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:fill of grad into 50x20 |
| fit-grad-50x20-cover | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:cover of grad into 50x20 |
| fit-grad-50x20-inside | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:inside of grad into 50x20 |
| fit-grad-50x20-contain | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:contain of grad into 50x20 |
| fit-grad-50x20-outside | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:outside of grad into 50x20 |
| fit-grad-7x7-fill | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:fill of grad into 7x7 |
| fit-grad-7x7-cover | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:cover of grad into 7x7 |
| fit-grad-7x7-inside | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:inside of grad into 7x7 |
| fit-grad-7x7-contain | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:contain of grad into 7x7 |
| fit-grad-7x7-outside | geometry-fit | Sharp#resize | Pipeline.Resize | mismatch | fit:outside of grad into 7x7 |
| fit-grad-33x33-fill | geometry-fit | Sharp#resize | Pipeline.Resize | match | fit:fill of grad into 33x33 |