From 43e59bdc2f7675d4b75310f9f942802a89eeb9f4 Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Tue, 26 May 2026 22:20:08 -0400 Subject: [PATCH 1/3] feat(clipping): accept [top,right,bottom,left] margin tuple Widen the `clipping` prop type to `boolean | [number, number, number, number]` so callers can opt into clipping that lets children spill outward by a per-side pixel amount before the scissor cuts them off (negative values inset). The setter normalizes the tuple into four scalar margin fields and keeps `props.clipping` a plain boolean, so the hot-path `=== true`/`=== false` checks and the per-frame `calculateClippingRect` math stay branch-free and allocation-free. Optimized for the common case where clipping is set once at construction: the setter early-returns on identical re-assignment. Also expands the node's `strictBound` by the same margins so descendants sitting inside the margin region aren't culled as out-of-bounds before the scissor sees them. Adds unit tests for setter normalization, the clip-rect math, parent-clip intersection, and the rotation guard, plus a `clipping-margin` visual regression example covering boolean, per-side, all-sides, and inset variants. Co-Authored-By: Claude Opus 4.7 --- examples/tests/clipping-margin.ts | 72 +++++++++++++ src/core/CoreNode.test.ts | 171 ++++++++++++++++++++++++++++++ src/core/CoreNode.ts | 103 +++++++++++++++--- 3 files changed, 333 insertions(+), 13 deletions(-) create mode 100644 examples/tests/clipping-margin.ts diff --git a/examples/tests/clipping-margin.ts b/examples/tests/clipping-margin.ts new file mode 100644 index 0000000..10bd496 --- /dev/null +++ b/examples/tests/clipping-margin.ts @@ -0,0 +1,72 @@ +import type { ExampleSettings } from '../common/ExampleSettings.js'; +import robotImg from '../assets/robot/robot.png'; + +export async function automation(settings: ExampleSettings) { + await test(settings); + await settings.snapshot(); +} + +const SQUARE_SIZE = 200; +const PADDING = 40; + +/** + * Visual regression coverage for the `clipping: [top, right, bottom, left]` + * tuple form. Each green square is a clipping container at the same x/y/w/h; + * what differs is how far we let children spill beyond each side before the + * scissor clips them. + */ +export default async function test({ renderer, testRoot }: ExampleSettings) { + const cases: Array<{ + label: string; + margin: [number, number, number, number] | true; + }> = [ + { label: 'clipping: true', margin: true }, + { label: '[40, 0, 0, 0] (top only)', margin: [40, 0, 0, 0] }, + { label: '[0, 40, 0, 0] (right only)', margin: [0, 40, 0, 0] }, + { label: '[0, 0, 40, 0] (bottom only)', margin: [0, 0, 40, 0] }, + { label: '[0, 0, 0, 40] (left only)', margin: [0, 0, 0, 40] }, + { label: '[40, 40, 40, 40] (all sides)', margin: [40, 40, 40, 40] }, + { label: '[-20, -20, -20, -20] (inset)', margin: [-20, -20, -20, -20] }, + ]; + + let curX = 20; + const curY = 60; + + for (let i = 0; i < cases.length; i++) { + const c = cases[i]!; + + renderer.createTextNode({ + x: curX, + y: 20, + w: SQUARE_SIZE, + fontFamily: 'Ubuntu', + fontSize: 18, + color: 0xffffffff, + text: c.label, + parent: testRoot, + }); + + const clipContainer = renderer.createNode({ + x: curX, + y: curY, + w: SQUARE_SIZE, + h: SQUARE_SIZE, + color: 0x00ff00ff, + parent: testRoot, + clipping: c.margin, + }); + + // Child overflows the container on ALL sides so we can see which edges + // the margin opens up. + renderer.createNode({ + x: -60, + y: -60, + w: SQUARE_SIZE + 120, + h: SQUARE_SIZE + 120, + src: robotImg, + parent: clipContainer, + }); + + curX += SQUARE_SIZE + PADDING; + } +} diff --git a/src/core/CoreNode.test.ts b/src/core/CoreNode.test.ts index 6478aa3..5d7525a 100644 --- a/src/core/CoreNode.test.ts +++ b/src/core/CoreNode.test.ts @@ -971,4 +971,175 @@ describe('set color()', () => { expect(spyB).toHaveBeenCalledTimes(1); }); }); + + describe('clipping property', () => { + it('defaults to false with zero margins', () => { + const node = new CoreNode(stage, defaultProps()); + expect(node.clipping).toBe(false); + expect((node as any)._clipMarginT).toBe(0); + expect((node as any)._clipMarginR).toBe(0); + expect((node as any)._clipMarginB).toBe(0); + expect((node as any)._clipMarginL).toBe(0); + }); + + it('accepts boolean true via setter', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = true; + expect(node.clipping).toBe(true); + expect(node.props.clipping).toBe(true); + expect((node as any)._clipMarginT).toBe(0); + }); + + it('accepts a [top, right, bottom, left] tuple and normalizes props.clipping to true', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = [10, 20, 30, 40]; + expect(node.props.clipping).toBe(true); + expect((node as any)._clipMarginT).toBe(10); + expect((node as any)._clipMarginR).toBe(20); + expect((node as any)._clipMarginB).toBe(30); + expect((node as any)._clipMarginL).toBe(40); + expect(node.clipping).toEqual([10, 20, 30, 40]); + }); + + it('returns boolean from getter when all margins are zero', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = [0, 0, 0, 0]; + expect(node.clipping).toBe(true); + }); + + it('accepts negative margins (insets the clip rect)', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = [-5, -5, -5, -5]; + expect(node.clipping).toEqual([-5, -5, -5, -5]); + expect(node.props.clipping).toBe(true); + }); + + it('clears margins when reassigned to a plain boolean', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = [10, 20, 30, 40]; + node.clipping = true; + expect((node as any)._clipMarginT).toBe(0); + expect((node as any)._clipMarginL).toBe(0); + expect(node.clipping).toBe(true); + + node.clipping = false; + expect(node.clipping).toBe(false); + expect(node.props.clipping).toBe(false); + }); + + it('short-circuits redundant writes of identical values', () => { + const node = new CoreNode(stage, defaultProps()); + node.clipping = [10, 20, 30, 40]; + node.updateType = 0; + node.clipping = [10, 20, 30, 40]; + // No update should have been scheduled since the value did not change. + expect(node.updateType).toBe(0); + }); + + it('schedules clipping + render-bounds updates when value changes', () => { + const node = new CoreNode(stage, defaultProps()); + node.updateType = 0; + node.clipping = [10, 20, 30, 40]; + expect(node.updateType & UpdateType.Clipping).toBeTruthy(); + expect(node.updateType & UpdateType.RenderBounds).toBeTruthy(); + }); + + it('accepts the array form via the constructor props', () => { + const node = new CoreNode( + stage, + defaultProps({ clipping: [5, 10, 15, 20] }), + ); + expect(node.props.clipping).toBe(true); + expect(node.clipping).toEqual([5, 10, 15, 20]); + }); + + it('expands the clipping rect outward by the configured margins', () => { + const parent = new CoreNode(stage, defaultProps()); + parent.globalTransform = Matrix3d.identity(); + parent.worldAlpha = 1; + + const node = new CoreNode(stage, defaultProps({ parent })); + node.alpha = 1; + node.x = 100; + node.y = 100; + node.w = 50; + node.h = 50; + node.clipping = [10, 20, 30, 40]; + + node.update(0, { x: 0, y: 0, w: 1000, h: 1000, valid: true }); + + // Expected: x = 100 - 40 = 60, y = 100 - 10 = 90, + // w = 50 + 40 + 20 = 110, h = 50 + 10 + 30 = 90 + expect(node.clippingRect.valid).toBe(true); + expect(node.clippingRect.x).toBe(60); + expect(node.clippingRect.y).toBe(90); + expect(node.clippingRect.w).toBe(110); + expect(node.clippingRect.h).toBe(90); + }); + + it('produces the unmodified node rect when clipping = true with no margins', () => { + const parent = new CoreNode(stage, defaultProps()); + parent.globalTransform = Matrix3d.identity(); + parent.worldAlpha = 1; + + const node = new CoreNode(stage, defaultProps({ parent })); + node.alpha = 1; + node.x = 25; + node.y = 35; + node.w = 50; + node.h = 60; + node.clipping = true; + + node.update(0, { x: 0, y: 0, w: 1000, h: 1000, valid: true }); + + expect(node.clippingRect.x).toBe(25); + expect(node.clippingRect.y).toBe(35); + expect(node.clippingRect.w).toBe(50); + expect(node.clippingRect.h).toBe(60); + }); + + it('still intersects with parent clipping rect when margins push beyond it', () => { + const parent = new CoreNode(stage, defaultProps()); + parent.globalTransform = Matrix3d.identity(); + parent.worldAlpha = 1; + + const node = new CoreNode(stage, defaultProps({ parent })); + node.alpha = 1; + node.x = 100; + node.y = 100; + node.w = 50; + node.h = 50; + // Margins try to extend the clip past the parent bounds: + node.clipping = [100, 100, 100, 100]; + + // Parent clip limits us to (0,0,200,200). + node.update(0, { x: 0, y: 0, w: 200, h: 200, valid: true }); + + expect(node.clippingRect.valid).toBe(true); + expect(node.clippingRect.x).toBe(0); + expect(node.clippingRect.y).toBe(0); + expect(node.clippingRect.w).toBe(200); + expect(node.clippingRect.h).toBe(200); + }); + + it('does not produce its own clip rect when the node is rotated, even with margins', () => { + const parent = new CoreNode(stage, defaultProps()); + parent.globalTransform = Matrix3d.identity(); + parent.worldAlpha = 1; + + const node = new CoreNode(stage, defaultProps({ parent })); + node.alpha = 1; + node.x = 100; + node.y = 100; + node.w = 50; + node.h = 50; + node.clipping = [10, 10, 10, 10]; + node.rotation = Math.PI / 4; + + // No parent clip rect to inherit — rotated nodes must skip their own clip. + node.update(0, { x: 0, y: 0, w: 0, h: 0, valid: false }); + + expect(node.clippingRect.valid).toBe(false); + }); + }); }); diff --git a/src/core/CoreNode.ts b/src/core/CoreNode.ts index 213a5df..ade2412 100644 --- a/src/core/CoreNode.ts +++ b/src/core/CoreNode.ts @@ -295,6 +295,10 @@ export interface CoreNodeProps { * its descendants from overflowing outside of the Node's x/y/width/height * bounds. * + * Pass `true` to clip exactly to the Node's bounds, or pass a + * `[top, right, bottom, left]` tuple to expand the clip rectangle outward + * by the given pixel amounts on each side (negative values inset it). + * * For WebGL, clipping is implemented using the high-performance WebGL * operation scissor. As a consequence, clipping does not work for * non-rectangular areas. So, if the element is rotated @@ -305,7 +309,7 @@ export interface CoreNodeProps { * * @default `false` */ - clipping: boolean; + clipping: boolean | [number, number, number, number]; /** * The color of the Node. * @@ -811,6 +815,15 @@ export class CoreNode extends EventEmitter { h: 0, valid: false, }; + /** + * Per-side outward expansion (in pixels) of the clipping rectangle. + * Resolved from the `clipping` setter so the hot path reads four scalars + * instead of inspecting an array each frame. Negative values inset the rect. + */ + private _clipMarginT = 0; + private _clipMarginR = 0; + private _clipMarginB = 0; + private _clipMarginL = 0; public textureCoords?: TextureCoords; public updateShaderUniforms: boolean = false; public isRenderable = false; @@ -877,14 +890,23 @@ export class CoreNode extends EventEmitter { // creates a fresh object with a consistent shape. Save fields that are // re-applied through setters, then null them on props so the setters // detect the change. - const { texture, shader, src, rtt, boundsMargin, interactive, parent } = - props; + const { + texture, + shader, + src, + rtt, + boundsMargin, + clipping, + interactive, + parent, + } = props; const p = (this.props = props); p.texture = null; p.shader = null; p.src = null; p.rtt = false; p.boundsMargin = null; + p.clipping = false; p.scale = null; //check if any color props are set for premultiplied color updates @@ -935,6 +957,9 @@ export class CoreNode extends EventEmitter { if (boundsMargin !== null) { this.boundsMargin = boundsMargin; } + if (clipping !== false) { + this.clipping = clipping; + } if (interactive !== undefined) { this.interactive = interactive; } @@ -1366,7 +1391,7 @@ export class CoreNode extends EventEmitter { childUpdateType |= UpdateType.Global; } - if (this.clipping === true) { + if (this.props.clipping === true) { updateType |= UpdateType.Clipping | UpdateType.RenderBounds; childUpdateType |= UpdateType.RenderBounds; } @@ -1676,7 +1701,13 @@ export class CoreNode extends EventEmitter { const { tx, ty } = this.sceneGlobalTransform || this.globalTransform || {}; const _x = tx ?? x; const _y = ty ?? y; - this.strictBound = createBound(_x, _y, _x + w, _y + h, this.strictBound); + this.strictBound = createBound( + _x - this._clipMarginL, + _y - this._clipMarginT, + _x + w + this._clipMarginR, + _y + h + this._clipMarginB, + this.strictBound, + ); this.preloadBound = createPreloadBounds( this.strictBound, @@ -1917,10 +1948,14 @@ export class CoreNode extends EventEmitter { const isRotated = gt!.tb !== 0 || gt!.tc !== 0; if (clipping === true && isRotated === false) { - clippingRect.x = gt!.tx; - clippingRect.y = gt!.ty; - clippingRect.w = this.props.w * gt!.ta; - clippingRect.h = this.props.h * gt!.td; + const mT = this._clipMarginT; + const mR = this._clipMarginR; + const mB = this._clipMarginB; + const mL = this._clipMarginL; + clippingRect.x = gt!.tx - mL; + clippingRect.y = gt!.ty - mT; + clippingRect.w = this.props.w * gt!.ta + mL + mR; + clippingRect.h = this.props.h * gt!.td + mT + mB; clippingRect.valid = true; } else { clippingRect.valid = false; @@ -2421,12 +2456,54 @@ export class CoreNode extends EventEmitter { this.setUpdateType(UpdateType.RenderBounds); } - get clipping(): boolean { - return this.props.clipping; + get clipping(): boolean | [number, number, number, number] { + const t = this._clipMarginT; + const r = this._clipMarginR; + const b = this._clipMarginB; + const l = this._clipMarginL; + if (t === 0 && r === 0 && b === 0 && l === 0) { + return this.props.clipping as boolean; + } + return [t, r, b, l]; } - set clipping(value: boolean) { - this.props.clipping = value; + set clipping(value: boolean | [number, number, number, number]) { + // Hot-path: setter is typically called once at construction; the equality + // checks below short-circuit redundant writes (e.g. setting `false` on a + // never-clipped node, or re-applying the same margin tuple) so we avoid + // the cost of an unnecessary subtree traversal via setUpdateType. + let nextClipping: boolean; + let nextT = 0; + let nextR = 0; + let nextB = 0; + let nextL = 0; + + if (value === true || value === false) { + nextClipping = value; + } else { + nextClipping = true; + nextT = value[0]; + nextR = value[1]; + nextB = value[2]; + nextL = value[3]; + } + + if ( + this.props.clipping === nextClipping && + this._clipMarginT === nextT && + this._clipMarginR === nextR && + this._clipMarginB === nextB && + this._clipMarginL === nextL + ) { + return; + } + + this.props.clipping = nextClipping; + this._clipMarginT = nextT; + this._clipMarginR = nextR; + this._clipMarginB = nextB; + this._clipMarginL = nextL; + this.setUpdateType( UpdateType.Clipping | UpdateType.RenderBounds | UpdateType.Children, ); From d8ddaeeffc8627fe506bd6bb4d15e5a99d09cac0 Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Tue, 26 May 2026 22:27:26 -0400 Subject: [PATCH 2/3] refactor(clipping): store margin tuple directly on props, drop scalar fields MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The four `_clipMarginT/R/B/L` fields were sized for a hot path that never materializes — clipping margins are an uncommon opt-in, not a per-frame read. Storing the tuple directly on `props.clipping` removes four fields per CoreNode instance and the constructor's save-and-restore plumbing. Hot-path comparisons that previously checked `props.clipping === true` now use `!== false`; the two places that need the per-side values (`calculateClippingRect`, `createRenderBounds`) extract them inline with an `Array.isArray` check, which only runs when the corresponding update bit is set. Co-Authored-By: Claude Opus 4.7 --- src/core/CoreNode.test.ts | 48 ++++------------- src/core/CoreNode.ts | 109 ++++++++++++-------------------------- 2 files changed, 43 insertions(+), 114 deletions(-) diff --git a/src/core/CoreNode.test.ts b/src/core/CoreNode.test.ts index 5d7525a..dfce10a 100644 --- a/src/core/CoreNode.test.ts +++ b/src/core/CoreNode.test.ts @@ -973,13 +973,9 @@ describe('set color()', () => { }); describe('clipping property', () => { - it('defaults to false with zero margins', () => { + it('defaults to false', () => { const node = new CoreNode(stage, defaultProps()); expect(node.clipping).toBe(false); - expect((node as any)._clipMarginT).toBe(0); - expect((node as any)._clipMarginR).toBe(0); - expect((node as any)._clipMarginB).toBe(0); - expect((node as any)._clipMarginL).toBe(0); }); it('accepts boolean true via setter', () => { @@ -987,52 +983,37 @@ describe('set color()', () => { node.clipping = true; expect(node.clipping).toBe(true); expect(node.props.clipping).toBe(true); - expect((node as any)._clipMarginT).toBe(0); }); - it('accepts a [top, right, bottom, left] tuple and normalizes props.clipping to true', () => { + it('stores a [top, right, bottom, left] tuple as-is', () => { const node = new CoreNode(stage, defaultProps()); - node.clipping = [10, 20, 30, 40]; - expect(node.props.clipping).toBe(true); - expect((node as any)._clipMarginT).toBe(10); - expect((node as any)._clipMarginR).toBe(20); - expect((node as any)._clipMarginB).toBe(30); - expect((node as any)._clipMarginL).toBe(40); - expect(node.clipping).toEqual([10, 20, 30, 40]); - }); - - it('returns boolean from getter when all margins are zero', () => { - const node = new CoreNode(stage, defaultProps()); - node.clipping = [0, 0, 0, 0]; - expect(node.clipping).toBe(true); + const tuple: [number, number, number, number] = [10, 20, 30, 40]; + node.clipping = tuple; + expect(node.props.clipping).toBe(tuple); + expect(node.clipping).toBe(tuple); }); it('accepts negative margins (insets the clip rect)', () => { const node = new CoreNode(stage, defaultProps()); node.clipping = [-5, -5, -5, -5]; expect(node.clipping).toEqual([-5, -5, -5, -5]); - expect(node.props.clipping).toBe(true); }); it('clears margins when reassigned to a plain boolean', () => { const node = new CoreNode(stage, defaultProps()); node.clipping = [10, 20, 30, 40]; node.clipping = true; - expect((node as any)._clipMarginT).toBe(0); - expect((node as any)._clipMarginL).toBe(0); expect(node.clipping).toBe(true); - node.clipping = false; expect(node.clipping).toBe(false); - expect(node.props.clipping).toBe(false); }); - it('short-circuits redundant writes of identical values', () => { + it('short-circuits redundant writes of the same reference', () => { const node = new CoreNode(stage, defaultProps()); - node.clipping = [10, 20, 30, 40]; + const tuple: [number, number, number, number] = [10, 20, 30, 40]; + node.clipping = tuple; node.updateType = 0; - node.clipping = [10, 20, 30, 40]; - // No update should have been scheduled since the value did not change. + node.clipping = tuple; expect(node.updateType).toBe(0); }); @@ -1044,15 +1025,6 @@ describe('set color()', () => { expect(node.updateType & UpdateType.RenderBounds).toBeTruthy(); }); - it('accepts the array form via the constructor props', () => { - const node = new CoreNode( - stage, - defaultProps({ clipping: [5, 10, 15, 20] }), - ); - expect(node.props.clipping).toBe(true); - expect(node.clipping).toEqual([5, 10, 15, 20]); - }); - it('expands the clipping rect outward by the configured margins', () => { const parent = new CoreNode(stage, defaultProps()); parent.globalTransform = Matrix3d.identity(); diff --git a/src/core/CoreNode.ts b/src/core/CoreNode.ts index ade2412..2ddc40b 100644 --- a/src/core/CoreNode.ts +++ b/src/core/CoreNode.ts @@ -815,15 +815,6 @@ export class CoreNode extends EventEmitter { h: 0, valid: false, }; - /** - * Per-side outward expansion (in pixels) of the clipping rectangle. - * Resolved from the `clipping` setter so the hot path reads four scalars - * instead of inspecting an array each frame. Negative values inset the rect. - */ - private _clipMarginT = 0; - private _clipMarginR = 0; - private _clipMarginB = 0; - private _clipMarginL = 0; public textureCoords?: TextureCoords; public updateShaderUniforms: boolean = false; public isRenderable = false; @@ -890,23 +881,14 @@ export class CoreNode extends EventEmitter { // creates a fresh object with a consistent shape. Save fields that are // re-applied through setters, then null them on props so the setters // detect the change. - const { - texture, - shader, - src, - rtt, - boundsMargin, - clipping, - interactive, - parent, - } = props; + const { texture, shader, src, rtt, boundsMargin, interactive, parent } = + props; const p = (this.props = props); p.texture = null; p.shader = null; p.src = null; p.rtt = false; p.boundsMargin = null; - p.clipping = false; p.scale = null; //check if any color props are set for premultiplied color updates @@ -957,9 +939,6 @@ export class CoreNode extends EventEmitter { if (boundsMargin !== null) { this.boundsMargin = boundsMargin; } - if (clipping !== false) { - this.clipping = clipping; - } if (interactive !== undefined) { this.interactive = interactive; } @@ -1391,7 +1370,7 @@ export class CoreNode extends EventEmitter { childUpdateType |= UpdateType.Global; } - if (this.props.clipping === true) { + if (this.props.clipping !== false) { updateType |= UpdateType.Clipping | UpdateType.RenderBounds; childUpdateType |= UpdateType.RenderBounds; } @@ -1694,18 +1673,29 @@ export class CoreNode extends EventEmitter { } // clipping is enabled and we are in bounds create our own bounds - const { x, y, w, h } = this.props; + const { x, y, w, h, clipping } = this.props; // Pick the global transform if available, otherwise use the local transform // global transform is only available if the node in an RTT chain const { tx, ty } = this.sceneGlobalTransform || this.globalTransform || {}; const _x = tx ?? x; const _y = ty ?? y; + + let mT = 0; + let mR = 0; + let mB = 0; + let mL = 0; + if (Array.isArray(clipping) === true) { + mT = clipping[0]; + mR = clipping[1]; + mB = clipping[2]; + mL = clipping[3]; + } this.strictBound = createBound( - _x - this._clipMarginL, - _y - this._clipMarginT, - _x + w + this._clipMarginR, - _y + h + this._clipMarginB, + _x - mL, + _y - mT, + _x + w + mR, + _y + h + mB, this.strictBound, ); @@ -1947,11 +1937,17 @@ export class CoreNode extends EventEmitter { const { clipping } = props; const isRotated = gt!.tb !== 0 || gt!.tc !== 0; - if (clipping === true && isRotated === false) { - const mT = this._clipMarginT; - const mR = this._clipMarginR; - const mB = this._clipMarginB; - const mL = this._clipMarginL; + if (clipping !== false && isRotated === false) { + let mT = 0; + let mR = 0; + let mB = 0; + let mL = 0; + if (Array.isArray(clipping) === true) { + mT = clipping[0]; + mR = clipping[1]; + mB = clipping[2]; + mL = clipping[3]; + } clippingRect.x = gt!.tx - mL; clippingRect.y = gt!.ty - mT; clippingRect.w = this.props.w * gt!.ta + mL + mR; @@ -2457,53 +2453,14 @@ export class CoreNode extends EventEmitter { } get clipping(): boolean | [number, number, number, number] { - const t = this._clipMarginT; - const r = this._clipMarginR; - const b = this._clipMarginB; - const l = this._clipMarginL; - if (t === 0 && r === 0 && b === 0 && l === 0) { - return this.props.clipping as boolean; - } - return [t, r, b, l]; + return this.props.clipping; } set clipping(value: boolean | [number, number, number, number]) { - // Hot-path: setter is typically called once at construction; the equality - // checks below short-circuit redundant writes (e.g. setting `false` on a - // never-clipped node, or re-applying the same margin tuple) so we avoid - // the cost of an unnecessary subtree traversal via setUpdateType. - let nextClipping: boolean; - let nextT = 0; - let nextR = 0; - let nextB = 0; - let nextL = 0; - - if (value === true || value === false) { - nextClipping = value; - } else { - nextClipping = true; - nextT = value[0]; - nextR = value[1]; - nextB = value[2]; - nextL = value[3]; - } - - if ( - this.props.clipping === nextClipping && - this._clipMarginT === nextT && - this._clipMarginR === nextR && - this._clipMarginB === nextB && - this._clipMarginL === nextL - ) { + if (this.props.clipping === value) { return; } - - this.props.clipping = nextClipping; - this._clipMarginT = nextT; - this._clipMarginR = nextR; - this._clipMarginB = nextB; - this._clipMarginL = nextL; - + this.props.clipping = value; this.setUpdateType( UpdateType.Clipping | UpdateType.RenderBounds | UpdateType.Children, ); From 0f6e32430d8159c1f062a32b85e97923aadf71d6 Mon Sep 17 00:00:00 2001 From: Chris Lorenzo Date: Tue, 26 May 2026 22:36:09 -0400 Subject: [PATCH 3/3] add vrt --- .../chromium-ci/clipping-margin-1.png | Bin 0 -> 63959 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 visual-regression/certified-snapshots/chromium-ci/clipping-margin-1.png diff --git a/visual-regression/certified-snapshots/chromium-ci/clipping-margin-1.png b/visual-regression/certified-snapshots/chromium-ci/clipping-margin-1.png new file mode 100644 index 0000000000000000000000000000000000000000..95533575b3314f9327ef913af27e69faa8300ff5 GIT binary patch literal 63959 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 D