Skip to content

Fix Settings/desktop window left black after a canvas surface swap (#5443)#5464

Merged
shai-almog merged 7 commits into
masterfrom
diagnose-settings-black-screen-5443
Jul 25, 2026
Merged

Fix Settings/desktop window left black after a canvas surface swap (#5443)#5464
shai-almog merged 7 commits into
masterfrom
diagnose-settings-black-screen-5443

Conversation

@shai-almog

Copy link
Copy Markdown
Collaborator

Follow-up to #5445, which did not fix issue #5443 — the reporter still sees the black Control Center on 7.0.261.

What the screenshots actually say

The reported window is pure #000000. That matches neither the light (#F3F4F7) nor the dark (#071B4D) SettingsForm background, so it is not a theme that failed to load — it is the raw TYPE_INT_RGB canvas buffer with nothing painted into it. The one thing drawn is the project's icon preview, at its correct pixel size, and it survives the reporter resizing the window between their two screenshots.

Root cause

JavaSEPort.C.updateBufferSize() discards and reallocates the paint buffer whenever the surface geometry changes. The replacement is blank, but nothing marked the form dirty, so the next paintDirty() refilled only whatever happened to be in the dirty list. Everything else stayed at the buffer's initial black. The only thing that healed it was an AWT-initiated paint (paintComponent queues a full f.repaint()), which a settled desktop window with no native peers may never receive.

Replacing the buffer now invalidates the whole form. The repaint is queued rather than run inline: the swap happens both while the EDT is acquiring paint graphics (it may be iterating the dirty list) and from the AWT thread inside blit().

CanvasSurfaceSwapRepaintTest drives a real port — shows a form, forces a surface swap with no size-change event behind it, marks a single child dirty, and asserts the form repaints in full. It fails without the fix.

Why CI did not catch this

The windows-tooling gate added in #5445 accepts the exact screenshot from the issue: 63 distinct colours and 89% single-colour dominance both pass. ScreenshotSanity gains a coverage check — the share of grid cells holding more than one colour. Healthy Settings windows measure 63–72% and the simulator 89–95%; the reported black window measures 16–18%. The gate now rejects both screenshots from the issue and passes every healthy capture with margin.

The job also only ever ran the runner's own desktop: 100% scale, light mode, en-US. It now runs a render matrix over HiDPI scale (125/150/175%), dark mode and locale, and captures the real on-screen pixels next to the offscreen paint, since contentPane.paint() can look healthy while the window shows something else. All seven scenarios pass on Windows — which is what ruled those variables out and pointed at the surface swap.

Diagnostics

mvn cn1:settings -Dsettings.diagnostics=diag.txt dumps the environment, the HiDPI scale the JVM reports, window/canvas geometry, the size Codename One laid the form out at, and the resolved theme colours and font metrics — plus an EDT stack trace if the EDT is wedged. Documented in the Maven getting-started guide so the next report of this failure class arrives actionable in one round trip.

Honest scope

The mechanism is confirmed by a test that fails without the fix, and it is the only mechanism consistent with the reported pixels. What triggers the surface swap on the reporter's specific machine is not reproduced here — CI is green across the whole matrix — so this fixes the failure rather than a demonstrated trigger. If a blank window survives this, the diagnostics dump will say why.

Verification

  • CanvasSurfaceSwapRepaintTest fails before the change, passes after
  • full codenameone-javase suite: 175 tests, 0 failures
  • cn1-settings suite: 34 tests, 0 failures
  • Settings tool verified end to end on macOS, including under a rapid resize storm

🤖 Generated with Claude Code

shai-almog and others added 2 commits July 25, 2026 05:48
Investigating issue #5443: the black Control Center window survived the
7.0.261 fix. The existing Windows CI gate accepts the exact screenshot
from the report (63 distinct colours, 89% dominant), so it could never
have caught it.

- ScreenshotSanity gains a coverage check: the share of grid cells with
  more than one colour. Healthy Settings windows cover 63-72% and the
  simulator 89-95%, while the reported black window covers 16-18%.
- The Settings stub can dump render state (settings.diagnostics) and grab
  the real on-screen pixels next to the offscreen paint, so a window that
  paints correctly into a BufferedImage while showing nothing is visible.
- The Windows harness now runs a render matrix over HiDPI scale, dark mode
  and locale instead of only the runner's 100%/light/en-US desktop.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…5443)

The JavaSE canvas paints into a TYPE_INT_RGB buffer that is discarded
and reallocated whenever the surface geometry changes. The replacement
starts out blank - black - but nothing marked the form dirty, so the
next paintDirty() refilled only whatever was in the dirty list. A window
that was up and correct became a black rectangle with a stray component
still painted in it, and stayed that way: the only thing that healed it
was an AWT-initiated paint, which a settled desktop window with no
native peers may never get. That is the shape of the Control Center
screenshots in issue #5443 - a pure #000000 surface, matching neither
the light (#F3F4F7) nor the dark (#071B4D) theme background, with the
project icon preview the one thing drawn.

Replacing the buffer now invalidates the whole form. The repaint is
queued rather than run inline because the swap happens both while the
EDT is acquiring paint graphics and from the AWT thread inside blit().

CanvasSurfaceSwapRepaintTest drives a real port: it shows a form,
forces a surface swap with no size-change event behind it, marks a
single child dirty and asserts the form repaints in full. It fails
without the fix.

Also adds a settings.diagnostics dump (environment, HiDPI scale, window
and canvas geometry, form size, resolved theme colours and font metrics,
plus an EDT stack when the EDT is wedged) and documents it, so the next
report of this failure class arrives actionable.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 25, 2026 03:05
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A Robot grab of a window that is not on screen captures whatever is
behind it, which reads as an empty window rather than as a missing
capture - a misleading artifact is worse than no artifact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes the Windows “Settings/Control Center window stays black after a canvas surface swap” regression by ensuring that when the JavaSE port reallocates its backing buffer, the current form is invalidated so the next paint repopulates the entire surface. The PR also strengthens Windows CI detection (so this failure mode is caught reliably) and adds a diagnostics dump to make future reports actionable.

Changes:

  • JavaSEPort: when the paint buffer is replaced, queue a full-form repaint to avoid leaving the new buffer as an unpainted black surface.
  • Windows tooling CI: extend screenshot sanity checks with a “content coverage” metric and run a Settings render matrix (HiDPI/dark mode/locale) using both offscreen and on-screen captures.
  • Settings tool: add render-state diagnostics output and corresponding unit tests; document how to collect diagnostics.

Reviewed changes

Copilot reviewed 8 out of 8 changed files in this pull request and generated no comments.

Show a summary per file
File Description
scripts/windows/ScreenshotSanity.java Adds a “content coverage” heuristic to reject screenshots that aren’t globally painted (catches the #5443 black-surface case).
scripts/settings/javase/src/test/java/com/codename1/settings/SettingsDiagnosticsTest.java Adds focused tests for diagnostics output and screenshot on-screen filename derivation.
scripts/settings/javase/src/desktop/java/com/codename1/settings/SettingsDiagnostics.java Implements a best-effort diagnostics report covering environment, scale, window geometry, theme sampling, and EDT stack.
scripts/settings/javase/src/desktop/java/com/codename1/settings/CodenameOneSettingsStub.java Captures on-screen pixels alongside offscreen paint; writes diagnostics without risking AWT↔EDT deadlocks; coordinates exit behavior.
scripts/run-windows-tooling-tests.sh Adds a Settings render scenario matrix (HiDPI/dark/locale) and gates primarily on on-screen captures when available.
Ports/JavaSE/src/com/codename1/impl/javase/JavaSEPort.java Invalidates the current form after buffer swaps to prevent a blank/black window after surface reallocation.
maven/javase/src/test/java/com/codename1/impl/javase/CanvasSurfaceSwapRepaintTest.java Adds a regression test ensuring a surface swap triggers a whole-form repaint (prevents the black-buffer scenario).
docs/developer-guide/Maven-Getting-Started.adoc Documents how to collect Settings diagnostics (and optional screenshots) for blank-window reports.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings July 25, 2026 03:09
@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 12 screenshots: 12 matched.
✅ JavaSE simulator integration screenshots matched stored baselines.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

The developer guide requires source blocks to be include-backed;
validate-guide-snippets.py rejected the inline block.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 25, 2026 03:15

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

@github-actions

Copy link
Copy Markdown
Contributor

Cloudflare Preview

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Developer Guide build artifacts are available for download from this workflow run:

Developer Guide quality checks:

  • AsciiDoc linter: No issues found (report)
  • Vale: No alerts found (report)
  • Paragraph capitalization: No paragraph capitalization issues (report)
  • LanguageTool: No grammar matches (report)
  • Image references: No unused images detected (report)

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

✅ Continuous Quality Report

Test & Coverage

Static Analysis

  • SpotBugs [HTML preview] [Download]
    • ByteCodeTranslator: 0 findings (no issues)
    • android: 1 findings (Normal: 1)
    • codenameone-maven-plugin: 0 findings (no issues)
    • core-unittests: 0 findings (no issues)
    • ios: 0 findings (no issues)
  • PMD: 0 findings (no issues) [Report archive]
  • Checkstyle: 0 findings (no issues) [Report archive]

Generated automatically by the PR CI workflow.

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 151 screenshots: 151 matched.

Native Android coverage

  • 📊 Line coverage: 8.37% (7322/87435 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.26% (38206/462263), branch 3.02% (1311/43428), complexity 3.29% (1572/47783), method 4.94% (1275/25820), class 10.04% (349/3475)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/551 lines covered)

✅ Native Android screenshot tests passed.

Native Android coverage

  • 📊 Line coverage: 8.37% (7322/87435 lines covered) [HTML preview] (artifact android-coverage-report, jacocoAndroidReport/html/index.html)
    • Other counters: instruction 8.26% (38206/462263), branch 3.02% (1311/43428), complexity 3.29% (1572/47783), method 4.94% (1275/25820), class 10.04% (349/3475)
    • Lowest covered classes
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysKt – 0.00% (0/6367 lines covered)
      • kotlin.collections.unsigned.kotlin.collections.unsigned.UArraysKt___UArraysKt – 0.00% (0/2384 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.ClassReader – 0.00% (0/1524 lines covered)
      • kotlin.collections.kotlin.collections.CollectionsKt___CollectionsKt – 0.00% (0/1187 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.MethodWriter – 0.00% (0/922 lines covered)
      • kotlin.sequences.kotlin.sequences.SequencesKt___SequencesKt – 0.00% (0/736 lines covered)
      • com.google.common.cache.com.google.common.cache.LocalCache$Segment – 0.00% (0/726 lines covered)
      • kotlin.text.kotlin.text.StringsKt___StringsKt – 0.00% (0/625 lines covered)
      • org.jacoco.agent.rt.internal_0e20598.asm.org.jacoco.agent.rt.internal_0e20598.asm.Frame – 0.00% (0/570 lines covered)
      • kotlin.collections.kotlin.collections.ArraysKt___ArraysJvmKt – 0.00% (0/551 lines covered)

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend scalar fallback (no native SIMD)
SIMD int-add (64K x300) java 214ms / native 68ms = 3.1x speedup
SIMD float-mul (64K x300) java 135ms / native 69ms = 1.9x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 90.000 ms
Base64 CN1 decode 87.000 ms
Base64 native encode 321.000 ms
Base64 encode ratio (CN1/native) 0.280x (72.0% faster)
Base64 native decode 293.000 ms
Base64 decode ratio (CN1/native) 0.297x (70.3% faster)
Image encode benchmark status skipped (SIMD unsupported)

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 148 screenshots: 148 matched.
✅ Native Mac screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 178 seconds

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 67ms / native 3ms = 22.3x speedup
SIMD float-mul (64K x300) java 67ms / native 4ms = 16.7x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 183.000 ms
Base64 CN1 decode 131.000 ms
Base64 native encode 740.000 ms
Base64 encode ratio (CN1/native) 0.247x (75.3% faster)
Base64 native decode 283.000 ms
Base64 decode ratio (CN1/native) 0.463x (53.7% faster)
Base64 SIMD encode 57.000 ms
Base64 encode ratio (SIMD/CN1) 0.311x (68.9% faster)
Base64 SIMD decode 53.000 ms
Base64 decode ratio (SIMD/CN1) 0.405x (59.5% faster)
Base64 encode ratio (SIMD/native) 0.077x (92.3% faster)
Base64 decode ratio (SIMD/native) 0.187x (81.3% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 11.000 ms
Image createMask (SIMD on) 5.000 ms
Image createMask ratio (SIMD on/off) 0.455x (54.5% faster)
Image applyMask (SIMD off) 86.000 ms
Image applyMask (SIMD on) 56.000 ms
Image applyMask ratio (SIMD on/off) 0.651x (34.9% faster)
Image modifyAlpha (SIMD off) 42.000 ms
Image modifyAlpha (SIMD on) 33.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.786x (21.4% faster)
Image modifyAlpha removeColor (SIMD off) 41.000 ms
Image modifyAlpha removeColor (SIMD on) 44.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 1.073x (7.3% slower)

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 146 screenshots: 146 matched.
Native Windows port, REAL shipping pipeline: the hellocodenameone screenshot suite rendered by a binary CROSS-COMPILED on Linux (clang-cl + xwin, WebView2 linked) and RUN on a Windows x64 runner. Compared against the in-repo baseline in scripts/windows/screenshots.

Benchmark Results

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 49ms / native 4ms = 12.2x speedup
SIMD float-mul (64K x300) java 48ms / native 4ms = 12.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 native bridge unavailable (CN1 + SIMD + image benchmarks only)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path gated to scalar (CPU autovectorizes scalar; explicit SIMD not beneficial here)
Base64 CN1 encode 156.000 ms
Base64 CN1 decode 103.000 ms
Base64 SIMD encode 83.000 ms
Base64 encode ratio (SIMD/CN1) 0.532x (46.8% faster)
Base64 SIMD decode 67.000 ms
Base64 decode ratio (SIMD/CN1) 0.650x (35.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 24.000 ms
Image createMask (SIMD on) 22.000 ms
Image createMask ratio (SIMD on/off) 0.917x (8.3% faster)
Image applyMask (SIMD off) 43.000 ms
Image applyMask (SIMD on) 172.000 ms
Image applyMask ratio (SIMD on/off) 4.000x (300.0% slower)
Image modifyAlpha (SIMD off) 50.000 ms
Image modifyAlpha (SIMD on) 48.000 ms
Image modifyAlpha ratio (SIMD on/off) 0.960x (4.0% faster)
Image modifyAlpha removeColor (SIMD off) 60.000 ms
Image modifyAlpha removeColor (SIMD on) 49.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.817x (18.3% faster)

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 217 screenshots: 217 matched.
✅ Native Apple Watch (watchOS, Core Graphics) screenshot tests passed.

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 144 screenshots: 144 matched.
✅ Native Apple TV (tvOS, Metal) screenshot tests passed.

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 149 screenshots: 149 matched.
✅ Native iOS Metal screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 518 seconds

Build and Run Timing

Metric Duration
Simulator Boot 101000 ms
Simulator Boot (Run) 1000 ms
App Install 19000 ms
App Launch 5000 ms
Test Execution 939000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 75ms / native 5ms = 15.0x speedup
SIMD float-mul (64K x300) java 143ms / native 3ms = 47.6x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 159.000 ms
Base64 CN1 decode 119.000 ms
Base64 native encode 299.000 ms
Base64 encode ratio (CN1/native) 0.532x (46.8% faster)
Base64 native decode 401.000 ms
Base64 decode ratio (CN1/native) 0.297x (70.3% faster)
Base64 SIMD encode 87.000 ms
Base64 encode ratio (SIMD/CN1) 0.547x (45.3% faster)
Base64 SIMD decode 67.000 ms
Base64 decode ratio (SIMD/CN1) 0.563x (43.7% faster)
Base64 encode ratio (SIMD/native) 0.291x (70.9% faster)
Base64 decode ratio (SIMD/native) 0.167x (83.3% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.286x (71.4% faster)
Image applyMask (SIMD off) 45.000 ms
Image applyMask (SIMD on) 32.000 ms
Image applyMask ratio (SIMD on/off) 0.711x (28.9% faster)
Image modifyAlpha (SIMD off) 34.000 ms
Image modifyAlpha (SIMD on) 110.000 ms
Image modifyAlpha ratio (SIMD on/off) 3.235x (223.5% slower)
Image modifyAlpha removeColor (SIMD off) 107.000 ms
Image modifyAlpha removeColor (SIMD on) 48.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.449x (55.1% faster)

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 143 screenshots: 143 matched.
✅ Native iOS screenshot tests passed.

Benchmark Results

  • VM Translation Time: 0 seconds
  • Compilation Time: 214 seconds

Build and Run Timing

Metric Duration
Simulator Boot 88000 ms
Simulator Boot (Run) 0 ms
App Install 11000 ms
App Launch 1000 ms
Test Execution 673000 ms

Detailed Performance Metrics

Metric Duration
SIMD kernel backend SSE2 (x64) / NEON (arm64) native kernels
SIMD int-add (64K x300) java 60ms / native 4ms = 15.0x speedup
SIMD float-mul (64K x300) java 57ms / native 3ms = 19.0x speedup
SIMD kernel correctness PASS (native result == scalar reference)
Base64 payload size 8192 bytes
Base64 benchmark iterations 6000
Base64 SIMD byte path active (NEON-accelerated)
Base64 CN1 encode 155.000 ms
Base64 CN1 decode 119.000 ms
Base64 native encode 326.000 ms
Base64 encode ratio (CN1/native) 0.475x (52.5% faster)
Base64 native decode 231.000 ms
Base64 decode ratio (CN1/native) 0.515x (48.5% faster)
Base64 SIMD encode 65.000 ms
Base64 encode ratio (SIMD/CN1) 0.419x (58.1% faster)
Base64 SIMD decode 44.000 ms
Base64 decode ratio (SIMD/CN1) 0.370x (63.0% faster)
Base64 encode ratio (SIMD/native) 0.199x (80.1% faster)
Base64 decode ratio (SIMD/native) 0.190x (81.0% faster)
Image encode benchmark iterations 100
Image createMask (SIMD off) 7.000 ms
Image createMask (SIMD on) 2.000 ms
Image createMask ratio (SIMD on/off) 0.286x (71.4% faster)
Image applyMask (SIMD off) 50.000 ms
Image applyMask (SIMD on) 28.000 ms
Image applyMask ratio (SIMD on/off) 0.560x (44.0% faster)
Image modifyAlpha (SIMD off) 43.000 ms
Image modifyAlpha (SIMD on) 59.000 ms
Image modifyAlpha ratio (SIMD on/off) 1.372x (37.2% slower)
Image modifyAlpha removeColor (SIMD off) 40.000 ms
Image modifyAlpha removeColor (SIMD on) 33.000 ms
Image modifyAlpha removeColor ratio (SIMD on/off) 0.825x (17.5% faster)

A merely slow EDT could run its probe after the timeout had already
written the unresponsive-EDT fallback, overwriting it and discarding the
stack dump naming whatever the EDT was stuck on - the reason the
fallback exists. Both writers now claim the report first, and the
timeout path waits for an in-flight EDT write rather than racing it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 25, 2026 03:48

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 1 comment.

The count is meant to distinguish a collapsed layout from a healthy one,
which only works if hidden and zero-sized components stay out of it. A
hidden or collapsed container takes its whole subtree with it - its
children cannot paint through it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings July 25, 2026 04:11

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated no new comments.

@shai-almog

shai-almog commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author

Compared 181 screenshots: 181 matched.
✅ JavaScript-port screenshot tests passed.

@shai-almog
shai-almog merged commit f625fb7 into master Jul 25, 2026
40 checks passed
@shai-almog
shai-almog deleted the diagnose-settings-black-screen-5443 branch July 25, 2026 05:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants