High performance Skia canvas implementation. Zero system dependencies.
This report summarizes scanner evidence for Brooooooklyn/canvas, a TypeScript project with 2,352 GitHub stars. SynthScan examined 122,967 lines of code across 274 source files, recording 156 pattern matches distributed across 7 syntactic categories. The legacy adjusted pattern signal is 1.5 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 152 finding(s).
Are imports declared and package/API names verified? 4 finding(s).
Are wrappers, guards, and repeated structures necessary? 2 finding(s).
Which changes need focused human review? 156 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 156 distinct pattern matches across 7 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | build.rs | 161 | .flag("/clang:-ffp-contract=off") | COMMENT |
| LOW | index.js | 421 | } | COMMENT |
| LOW | load-image.js | 21 | // use the same buffer without copying if the source is a buffer | COMMENT |
| LOW | __test__/text-raster.spec.ts | 1 | // Canvas text pixels and glyph boxes against Chrome 155's CPU canvas on the | COMMENT |
| LOW | __test__/alpha-false.spec.ts | 681 | COMMENT | |
| LOW | __test__/css-color-chrome.spec.ts | 241 | // On Windows, Chrome gives 54, not the fixture's 55 (Chrome macOS), for byte 17 (pixel 4, green) of | COMMENT |
| LOW | __test__/pdfjs-dots.spec.ts | 1 | // PDF subpaths of zero length, drawn by pdf.js in Node as in Chrome. ISO 32000 | COMMENT |
| LOW | __test__/stroke-prune-point-paths-chrome.spec.ts | 1 | // The one-point stroke prune for every path. Chrome strokes nothing for a path | COMMENT |
| LOW | __test__/text-bbox-chrome.spec.ts | 1 | // measureText's width and actualBoundingBox against Chrome 155 (CPU canvas, | COMMENT |
| LOW | __test__/svg-conic-gradient.spec.ts | 601 | // and the clip, written exactly, left 4 of the 10 columns. Chrome must also read the origin back | COMMENT |
| LOW | __test__/stroke-prune-chrome.spec.ts | 861 | tiny(c) | COMMENT |
| LOW | __test__/shadow.spec.ts | 821 | t.true(Math.abs(r - expected) <= 3, `x=${x}: expected ~${expected} (Chrome 150), got ${r}`) | COMMENT |
| LOW | __test__/shadow.spec.ts | 861 | // Every probe below is >= 10 device px from the nearest ramp, so a sub-pixel | COMMENT |
| LOW | __test__/shadow.spec.ts | 901 | ctx.rotate(0.5) | COMMENT |
| LOW | __test__/shadow.spec.ts | 1081 | // | COMMENT |
| LOW | skia-c/skia_c.cpp | 1 | #include <assert.h> | COMMENT |
| LOW | skia-c/skia_c.cpp | 201 | // writes a patternTransform), so a draw whose pattern has a non-identity | COMMENT |
| LOW | skia-c/skia_c.cpp | 621 | static constexpr int64_t kMaxSweepPixels = 4096 * 4096; | COMMENT |
| LOW | skia-c/skia_c.cpp | 761 | while (!ChromeReadsExactly(v)) { | COMMENT |
| LOW | skia-c/skia_c.cpp | 781 | // this comment gives. Past it, the origin moves down to the next number | COMMENT |
| LOW | skia-c/skia_c.cpp | 1641 | // level the draw needs. This is ours, one per decoded Image: a copy per | COMMENT |
| LOW | skia-c/skia_c.cpp | 2061 | // StaticBitmapImage::DrawHelper (static_bitmap_image.cc:83-116) do: clip the | COMMENT |
| LOW | skia-c/skia_c.cpp | 4321 | // Tag decoded AVIF pixels with the file's color space, as Chrome's AVIF | COMMENT |
| LOW | skia-c/font_scalers.cpp | 1 | // The typefaces the canvas makes from font files. By default every OS uses | COMMENT |
| LOW | skia-c/font_scalers.cpp | 21 | // WOFF and WOFF2 are decoded to SFNT first, as Blink's OTS step hands the | COMMENT |
| LOW | skia-c/text_words.cpp | 1 | // Word-by-word shaping like Blink's PlainTextNode: canvas text is split into | COMMENT |
| LOW | skia-c/text_words.cpp | 101 | return status <= 0 && | COMMENT |
| LOW | skia-c/text.cpp | 1 | // Canvas text: measureText, fillText and strokeText, laid out with | COMMENT |
| LOW | skia-c/text.cpp | 21 | #if defined(SK_DEBUG) || !defined(SK_RELEASE) | COMMENT |
| LOW | skia-c/text.cpp | 61 | std::vector<std::pair<uint32_t, BlinkRectF>> inks; | COMMENT |
| LOW | skia-c/text.cpp | 661 | static_cast<ParagraphImpl*>(builder.Build().release())); | COMMENT |
| LOW | skia-c/text.cpp | 721 | const float line_width = paragraph_width - blink.shift; | COMMENT |
| LOW | skia-c/text.cpp | 1081 | AppendLineKey(&key, *request); | COMMENT |
| LOW | skia-c/svg_image.cpp | 1 | // SVG images src/svg_doc prepared, drawn by SkSVGDOM through a canvas that | COMMENT |
| LOW | skia-c/text_raster.cpp | 1 | // Canvas text rasterization. By default every OS draws the same way: | COMMENT |
| LOW | skia-c/text_raster.cpp | 21 | // CoreText's headers declare a global TextRange, which skia_c.hpp's | COMMENT |
| LOW | skia-c/text_styles.cpp | 1 | // Variable font axes and synthetic bold and italic, like Blink. A registered | COMMENT |
| LOW | skia-c/text_metrics.cpp | 1 | // The primary font's vertical metrics and the textBaseline offsets, like | COMMENT |
| LOW | skia-c/text_raster.hpp | 21 | // The font flags skparagraph shapes with. They are the same for every | COMMENT |
| LOW | skia-c/text_caps.cpp | 1 | // font-variant-caps like Blink's HarfBuzzShaper: the OpenType caps features | COMMENT |
| LOW | skia-c/skia_c.hpp | 1 | #ifndef SKIA_CAPI_H | COMMENT |
| LOW | skia-c/skia_c.hpp | 21 | #include <include/core/SkPathBuilder.h> | COMMENT |
| LOW | skia-c/skia_c.hpp | 41 | #include <include/effects/SkGradient.h> | COMMENT |
| LOW | skia-c/skia_c.hpp | 61 | #include <modules/svg/include/SkSVGNode.h> | COMMENT |
| LOW | skia-c/skia_c.hpp | 141 | // The family "system-ui": CoreText's UI font and its bold, italic and bold | COMMENT |
| LOW | skia-c/skia_c.hpp | 721 | // font_families.cpp: every registered and system family name by its | COMMENT |
| LOW | skia-c/skia_c.hpp | 741 | std::unordered_set<size_t> font_arguments; | COMMENT |
| LOW | skia-c/skia_c.hpp | 1101 | // - Typefaces may be held by Paragraphs, Pictures, or cached renders | COMMENT |
| LOW | skia-c/font_families.cpp | 1 | // Which installed or registered family each canvas font family uses, like | COMMENT |
| LOW | skia-c/font_families.cpp | 21 | #include <algorithm> | COMMENT |
| LOW | skia-c/text.hpp | 1 | // Shared by the canvas text files (text.cpp, font_families.cpp, | COMMENT |
| LOW | skia-c/text.hpp | 81 | // for a canvas): U+0009 to U+000D are spaces, U+2028 and U+2029 draw as | COMMENT |
| LOW | src/pattern.rs | 101 | }; | COMMENT |
| LOW | src/avif.rs | 21 | pub alpha_quality: Option<u32>, | COMMENT |
| LOW | src/avif.rs | 41 | /// Many high-end digital video formats and interfaces use this scheme: | COMMENT |
| LOW | src/num.rs | 1 | //! The two ways Blink turns a JS double into a float for the 2D context. | COMMENT |
| LOW | src/gif.rs | 21 | /// Default: 0 (infinite) | COMMENT |
| LOW | src/gif.rs | 81 | /// Example usage: | COMMENT |
| LOW | src/gif.rs | 221 | /// Example: | COMMENT |
| LOW | src/page_recorder.rs | 21 | /// arms MUST NOT share a raw id space: `Resource::id` comes from our own | COMMENT |
| 67 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | __test__/global-fonts.spec.ts | 339 | // Step 1: Register Font A with alias "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 343 | // Step 2: Set an alias pointing to "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 350 | // Step 3: Remove Font A | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 356 | // Step 4: Register Font B with the SAME alias name "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 360 | // Step 5: Verify "StaleAliasX" does NOT exist (the stale alias should NOT transfer) | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 366 | // Step 6: Register and remove an unrelated font to trigger rebuild | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 370 | // Step 7: Verify "StaleAliasX" STILL does not exist after rebuild | COMMENT |
| LOW | src/page_recorder.rs | 432 | // Step 1: Always end the current recording before starting the | COMMENT |
| LOW⚡ | src/page_recorder.rs | 452 | // Step 2: Fresh recording for pixel data (clean canvas: no clip, identity transform) | COMMENT |
| LOW⚡ | src/page_recorder.rs | 460 | // Step 3: Promote the pixel data recording as a layer | COMMENT |
| LOW⚡ | src/page_recorder.rs | 465 | // Step 4: Start new recording and restore state | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | __test__/global-fonts.spec.ts | 339 | // Step 1: Register Font A with alias "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 343 | // Step 2: Set an alias pointing to "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 350 | // Step 3: Remove Font A | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 356 | // Step 4: Register Font B with the SAME alias name "StaleAliasTest" | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 360 | // Step 5: Verify "StaleAliasX" does NOT exist (the stale alias should NOT transfer) | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 366 | // Step 6: Register and remove an unrelated font to trigger rebuild | COMMENT |
| LOW⚡ | __test__/global-fonts.spec.ts | 370 | // Step 7: Verify "StaleAliasX" STILL does not exist after rebuild | COMMENT |
| LOW | src/page_recorder.rs | 432 | // Step 1: Always end the current recording before starting the | COMMENT |
| LOW⚡ | src/page_recorder.rs | 452 | // Step 2: Fresh recording for pixel data (clean canvas: no clip, identity transform) | COMMENT |
| LOW⚡ | src/page_recorder.rs | 460 | // Step 3: Promote the pixel data recording as a layer | COMMENT |
| LOW⚡ | src/page_recorder.rs | 465 | // Step 4: Start new recording and restore state | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | src/lib.rs | 837 | self.ctx.context.surface.canvas.fill(0, 0, 0, 255); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | README.md | 102 | author: 'Jane Doe', | CODE |
| LOW | __test__/image-metadata.spec.ts | 133 | author: 'Jane Doe', | CODE |
| LOW | src/svg_doc/select.rs | 182 | "placeholder", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | __test__/shadow.spec.ts | 948 | function isolationAlphaShadowScene(mode: string, shadowBlur: number) { | CODE |
| LOW | __test__/webidl-intrinsics.spec.ts | 18 | function convertWithReplacedGlobals(ctx: any) { | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/gif.rs | 81 | /// Example usage: | COMMENT |