Skip to content

Fix bug where offscreen layers would erroneously draw black pixels - #55762

Closed
Abbondanzo wants to merge 1 commit into
react:mainfrom
Abbondanzo:export-D94447724
Closed

Fix bug where offscreen layers would erroneously draw black pixels#55762
Abbondanzo wants to merge 1 commit into
react:mainfrom
Abbondanzo:export-D94447724

Conversation

@Abbondanzo

Copy link
Copy Markdown
Contributor

Summary:
On API <= 28, clipWithAntiAliasing uses saveLayer for anti-aliased border radius clipping. When a view is partially off-screen, the GPU only renders into the visible portion of the saveLayer buffer, leaving off-screen pixels as opaque black. These black pixels survive Porter-Duff compositing and appear as visible artifacts.

Adding canvas.clipRect(0, 0, view.width, view.height) before saveLayer forces HWUI to properly initialize the offscreen buffer relative to the GPU scissor. The clip is in local coordinates, so it stays correct across parent transform animations and scrolling offsets.

Changelog: [Internal]

Differential Revision: D94447724

@meta-cla meta-cla Bot added the CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. label Feb 26, 2026
@meta-codesync

meta-codesync Bot commented Feb 26, 2026

Copy link
Copy Markdown

@Abbondanzo has exported this pull request. If you are a Meta employee, you can view the originating Diff in D94447724.

…55762)

Summary:

On API <= 28, `clipWithAntiAliasing` uses `saveLayer` for anti-aliased border radius clipping. When a view is partially off-screen, the GPU only renders into the visible portion of the `saveLayer` buffer, leaving off-screen pixels as opaque black. These black pixels survive Porter-Duff compositing and appear as visible artifacts.

Adding `canvas.clipRect(0, 0, view.width, view.height)` before `saveLayer` forces HWUI to properly initialize the offscreen buffer relative to the GPU scissor. The clip is in local coordinates, so it stays correct across parent transform animations and scrolling offsets.

Changelog: [Internal]

Reviewed By: NickGerleman

Differential Revision: D94447724
@meta-codesync meta-codesync Bot closed this in f88946d Feb 27, 2026
@facebook-github-bot facebook-github-bot added the Merged This PR has been merged. label Feb 27, 2026
@meta-codesync

meta-codesync Bot commented Feb 27, 2026

Copy link
Copy Markdown

This pull request has been merged in f88946d.

@react-native-bot

Copy link
Copy Markdown
Collaborator

This pull request was successfully merged by @Abbondanzo in f88946d

When will my fix make it into a release? | How to file a pick request?

@Abbondanzo
Abbondanzo deleted the export-D94447724 branch March 17, 2026 19:20
meta-codesync Bot pushed a commit that referenced this pull request Apr 7, 2026
…56336)

Summary:
Pull Request resolved: #56336

Moves `clipRect` inside the outer `saveLayer` in `clipWithAntiAliasing()` to fix blank rendering on API 24 (Nougat) devices.

#55762 added `canvas.withClip()` to fix black pixels on partially off-screen views. However, it wrapped the entire compositing chain in an extra `save()`/`clipRect`/`restore()`, creating a triple-nested save/restore stack (`save` -> `saveLayer` -> `saveLayer(DST_IN)`) that breaks Porter-Duff compositing on API 24's HWUI renderer.

Moving `clipRect` inside the `saveLayer` reduces nesting from 3 to 2 levels while preserving the black-pixel mitigation. The `saveLayer` already saves and restores clip state, so a separate `save()`/`restore()` wrapper is unnecessary.

Changelog: [Android][Fixed] - Fix image content disappearing on API 24 (Nougat) when antialiased border radius clipping is applied

Reviewed By: NickGerleman

Differential Revision: D99677658

fbshipit-source-id: 55a9c84655cc08b05b95c29725492b9b8f759331
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. fb-exported Merged This PR has been merged. meta-exported p: Facebook Partner: Facebook Partner

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants