@hyperframes/engine 0.4.7 → 0.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/services/screenshotService.d.ts +81 -0
- package/dist/services/screenshotService.d.ts.map +1 -1
- package/dist/services/screenshotService.js +155 -0
- package/dist/services/screenshotService.js.map +1 -1
- package/dist/services/videoFrameInjector.d.ts +5 -0
- package/dist/services/videoFrameInjector.d.ts.map +1 -1
- package/dist/services/videoFrameInjector.js +132 -1
- package/dist/services/videoFrameInjector.js.map +1 -1
- package/dist/types.d.ts +32 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/shaderTransitions.d.ts +166 -0
- package/dist/utils/shaderTransitions.d.ts.map +1 -0
- package/dist/utils/shaderTransitions.js +894 -0
- package/dist/utils/shaderTransitions.js.map +1 -0
- package/package.json +2 -2
- package/src/index.ts +19 -0
- package/src/services/screenshotService.ts +169 -0
- package/src/services/videoFrameInjector.ts +143 -1
- package/src/types.ts +34 -0
- package/src/utils/shaderTransitions.test.ts +674 -0
- package/src/utils/shaderTransitions.ts +1130 -0
- package/src/utils/uint16-alignment-audit.test.ts +125 -0
package/dist/index.d.ts
CHANGED
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
* getFrameAtTime, detectGpuEncoder) return a nullable value instead of throwing.
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
|
-
export type { HfProtocol, HfMediaElement, CaptureOptions, CaptureResult, CaptureBufferResult, CapturePerfSummary, } from "./types.js";
|
|
32
|
+
export type { HfProtocol, HfMediaElement, HfTransitionMeta, CaptureOptions, CaptureResult, CaptureBufferResult, CapturePerfSummary, } from "./types.js";
|
|
33
33
|
export { resolveConfig, DEFAULT_CONFIG, type EngineConfig } from "./config.js";
|
|
34
34
|
export { acquireBrowser, releaseBrowser, resolveHeadlessShellPath, buildChromeArgs, ENABLE_BROWSER_POOL, type BuildChromeArgsOptions, type CaptureMode, type AcquiredBrowser, } from "./services/browserManager.js";
|
|
35
35
|
export { createCaptureSession, initializeSession, closeCaptureSession, captureFrame, captureFrameToBuffer, getCompositionDuration, getCapturePerfSummary, prepareCaptureSessionForReuse, type CaptureSession, type BeforeCaptureHook, } from "./services/frameCapture.js";
|
|
36
|
-
export { beginFrameCapture, pageScreenshotCapture, getCdpSession, injectVideoFramesBatch, syncVideoFrameVisibility, cdpSessionCache, initTransparentBackground, captureAlphaPng, type BeginFrameResult, } from "./services/screenshotService.js";
|
|
36
|
+
export { beginFrameCapture, pageScreenshotCapture, getCdpSession, injectVideoFramesBatch, syncVideoFrameVisibility, cdpSessionCache, initTransparentBackground, captureAlphaPng, applyDomLayerMask, removeDomLayerMask, DOM_LAYER_MASK_STYLE_ID, type BeginFrameResult, } from "./services/screenshotService.js";
|
|
37
37
|
export { encodeFramesFromDir, encodeFramesChunkedConcat, muxVideoWithAudio, applyFaststart, detectGpuEncoder, ENCODER_PRESETS, getEncoderPreset, type GpuEncoder, } from "./services/chunkEncoder.js";
|
|
38
38
|
export type { EncoderOptions, EncodeResult, MuxResult } from "./services/chunkEncoder.types.js";
|
|
39
39
|
export { spawnStreamingEncoder, createFrameReorderBuffer, type StreamingEncoder, type StreamingEncoderOptions, type StreamingEncoderResult, type FrameReorderBuffer, } from "./services/streamingEncoder.js";
|
|
@@ -46,8 +46,10 @@ export { createFileServer, type FileServerOptions, type FileServerHandle, } from
|
|
|
46
46
|
export { quantizeTimeToFrame, MEDIA_VISUAL_STYLE_PROPERTIES } from "@hyperframes/core";
|
|
47
47
|
export { extractVideoMetadata, extractAudioMetadata, analyzeKeyframeIntervals, type VideoMetadata, type AudioMetadata, type KeyframeAnalysis, } from "./utils/ffprobe.js";
|
|
48
48
|
export { downloadToTemp, isHttpUrl } from "./utils/urlDownloader.js";
|
|
49
|
-
export {
|
|
49
|
+
export { runFfmpeg, type RunFfmpegOptions, type RunFfmpegResult } from "./utils/runFfmpeg.js";
|
|
50
|
+
export { decodePng, decodePngToRgb48le, blitRgba8OverRgb48le, blitRgb48leRegion, blitRgb48leAffine, parseTransformMatrix, getSrgbToHdrLut, roundedRectAlpha, } from "./utils/alphaBlit.js";
|
|
50
51
|
export { groupIntoLayers, type CompositeLayer } from "./utils/layerCompositor.js";
|
|
52
|
+
export { type TransitionFn, TRANSITIONS, crossfade, sampleRgb48le, hdrToLinear, linearToHdr, convertTransfer, } from "./utils/shaderTransitions.js";
|
|
51
53
|
export { initHdrReadback, uploadAndReadbackHdrFrame, float16ToPqRgb, buildHdrChromeArgs, launchHdrBrowser, } from "./services/hdrCapture.js";
|
|
52
54
|
export { captureScreenshotWithAlpha } from "./services/screenshotService.js";
|
|
53
55
|
export { hideVideoElements, showVideoElements, queryVideoElementBounds, queryElementStacking, type VideoElementBounds, type ElementStackingInfo, } from "./services/videoFrameInjector.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/E,OAAO,EACL,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,EAC7B,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,KAAK,UAAU,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAEhG,OAAO,EACL,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,GACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACvF,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAG1F,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,EAClB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EACL,gBAAgB,EAChB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -36,7 +36,7 @@ export { acquireBrowser, releaseBrowser, resolveHeadlessShellPath, buildChromeAr
|
|
|
36
36
|
// ── Frame capture pipeline ──────────────────────────────────────────────────────
|
|
37
37
|
export { createCaptureSession, initializeSession, closeCaptureSession, captureFrame, captureFrameToBuffer, getCompositionDuration, getCapturePerfSummary, prepareCaptureSessionForReuse, } from "./services/frameCapture.js";
|
|
38
38
|
// ── Screenshot (BeginFrame) ─────────────────────────────────────────────────────
|
|
39
|
-
export { beginFrameCapture, pageScreenshotCapture, getCdpSession, injectVideoFramesBatch, syncVideoFrameVisibility, cdpSessionCache, initTransparentBackground, captureAlphaPng, } from "./services/screenshotService.js";
|
|
39
|
+
export { beginFrameCapture, pageScreenshotCapture, getCdpSession, injectVideoFramesBatch, syncVideoFrameVisibility, cdpSessionCache, initTransparentBackground, captureAlphaPng, applyDomLayerMask, removeDomLayerMask, DOM_LAYER_MASK_STYLE_ID, } from "./services/screenshotService.js";
|
|
40
40
|
// ── Encoding ───────────────────────────────────────────────────────────────────
|
|
41
41
|
export { encodeFramesFromDir, encodeFramesChunkedConcat, muxVideoWithAudio, applyFaststart, detectGpuEncoder, ENCODER_PRESETS, getEncoderPreset, } from "./services/chunkEncoder.js";
|
|
42
42
|
export { spawnStreamingEncoder, createFrameReorderBuffer, } from "./services/streamingEncoder.js";
|
|
@@ -52,8 +52,11 @@ export { createFileServer, } from "./services/fileServer.js";
|
|
|
52
52
|
export { quantizeTimeToFrame, MEDIA_VISUAL_STYLE_PROPERTIES } from "@hyperframes/core";
|
|
53
53
|
export { extractVideoMetadata, extractAudioMetadata, analyzeKeyframeIntervals, } from "./utils/ffprobe.js";
|
|
54
54
|
export { downloadToTemp, isHttpUrl } from "./utils/urlDownloader.js";
|
|
55
|
-
export {
|
|
55
|
+
export { runFfmpeg } from "./utils/runFfmpeg.js";
|
|
56
|
+
export { decodePng, decodePngToRgb48le, blitRgba8OverRgb48le, blitRgb48leRegion, blitRgb48leAffine, parseTransformMatrix, getSrgbToHdrLut, roundedRectAlpha, } from "./utils/alphaBlit.js";
|
|
56
57
|
export { groupIntoLayers } from "./utils/layerCompositor.js";
|
|
58
|
+
// ── Shader transitions ────────────────────────────────────────────────────────
|
|
59
|
+
export { TRANSITIONS, crossfade, sampleRgb48le, hdrToLinear, linearToHdr, convertTransfer, } from "./utils/shaderTransitions.js";
|
|
57
60
|
export { initHdrReadback, uploadAndReadbackHdrFrame, float16ToPqRgb, buildHdrChromeArgs, launchHdrBrowser, } from "./services/hdrCapture.js";
|
|
58
61
|
export { captureScreenshotWithAlpha } from "./services/screenshotService.js";
|
|
59
62
|
export { hideVideoElements, showVideoElements, queryVideoElementBounds, queryElementStacking, } from "./services/videoFrameInjector.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAaH,kFAAkF;AAClF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAE/E,kFAAkF;AAClF,OAAO,EACL,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,eAAe,EACf,mBAAmB,GAIpB,MAAM,8BAA8B,CAAC;AAEtC,mFAAmF;AACnF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,6BAA6B,GAG9B,MAAM,4BAA4B,CAAC;AAEpC,mFAAmF;AACnF,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,uBAAuB,GAExB,MAAM,iCAAiC,CAAC;AAEzC,kFAAkF;AAClF,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,GAEjB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,qBAAqB,EACrB,wBAAwB,GAKzB,MAAM,gCAAgC,CAAC;AAExC,kFAAkF;AAClF,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,sBAAsB,EACtB,gBAAgB,GAKjB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGvF,kFAAkF;AAClF,OAAO,EACL,uBAAuB,EACvB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,kBAAkB,GAInB,MAAM,mCAAmC,CAAC;AAE3C,kFAAkF;AAClF,OAAO,EACL,gBAAgB,GAGjB,MAAM,0BAA0B,CAAC;AAElC,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAEvF,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,GAIzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,SAAS,EAA+C,MAAM,sBAAsB,CAAC;AAE9F,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAuB,MAAM,4BAA4B,CAAC;AAElF,iFAAiF;AACjF,OAAO,EAEL,WAAW,EACX,SAAS,EACT,aAAa,EACb,WAAW,EACX,WAAW,EACX,eAAe,GAChB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,GAGrB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACL,eAAe,EACf,cAAc,EACd,wBAAwB,EACxB,qBAAqB,GAItB,MAAM,gBAAgB,CAAC"}
|
|
@@ -43,7 +43,20 @@ export declare function captureScreenshotWithAlpha(page: Page, width: number, he
|
|
|
43
43
|
* Only use on sessions that are exclusively dedicated to transparent capture
|
|
44
44
|
* (e.g., the HDR two-pass DOM layer session) — the background will stay
|
|
45
45
|
* transparent for the lifetime of the session.
|
|
46
|
+
*
|
|
47
|
+
* NOTE on the injected stylesheet: `Emulation.setDefaultBackgroundColorOverride`
|
|
48
|
+
* only replaces the *default* page background. Compositions almost always set
|
|
49
|
+
* `body { background: ... }` and `#root { background: ... }`, which paint over
|
|
50
|
+
* the override and ruin alpha capture for layered HDR compositing — the
|
|
51
|
+
* composition root's full-frame background paints across the entire viewport
|
|
52
|
+
* and wipes out HDR content captured beneath it.
|
|
53
|
+
*
|
|
54
|
+
* We force `html`, `body`, and any element marked as a composition root
|
|
55
|
+
* (`[data-composition-id]`) to transparent. In HDR layered compositing the HDR
|
|
56
|
+
* video itself is the backdrop, so DOM layers must only contribute their
|
|
57
|
+
* foreground UI pixels — never a page-spanning solid backdrop.
|
|
46
58
|
*/
|
|
59
|
+
export declare const TRANSPARENT_BG_STYLE_ID = "__hf_transparent_bg__";
|
|
47
60
|
export declare function initTransparentBackground(page: Page): Promise<void>;
|
|
48
61
|
/**
|
|
49
62
|
* Capture a transparent-background PNG screenshot without setting the
|
|
@@ -54,6 +67,74 @@ export declare function initTransparentBackground(page: Page): Promise<void>;
|
|
|
54
67
|
* two-pass compositing loop.
|
|
55
68
|
*/
|
|
56
69
|
export declare function captureAlphaPng(page: Page, width: number, height: number): Promise<Buffer>;
|
|
70
|
+
/**
|
|
71
|
+
* Stylesheet ID used by applyDomLayerMask / removeDomLayerMask. Exposed so
|
|
72
|
+
* tests can assert presence/absence of the mask between captures.
|
|
73
|
+
*/
|
|
74
|
+
export declare const DOM_LAYER_MASK_STYLE_ID = "__hf_dom_layer_mask__";
|
|
75
|
+
/**
|
|
76
|
+
* Mask the DOM so a single layer screenshot captures ONLY the layer's pixels.
|
|
77
|
+
*
|
|
78
|
+
* The HDR layered compositor walks z-ordered layers and blits each one over a
|
|
79
|
+
* shared canvas. DOM layers are full-page screenshots — a naive screenshot
|
|
80
|
+
* captures every painted pixel on the page, which means root background +
|
|
81
|
+
* static overlays + sibling-scene content all overwrite previously composited
|
|
82
|
+
* HDR content beneath. The mask narrows each screenshot to the elements that
|
|
83
|
+
* actually belong to this layer.
|
|
84
|
+
*
|
|
85
|
+
* Strategy:
|
|
86
|
+
*
|
|
87
|
+
* 1. Inject a stylesheet that hides every body descendant
|
|
88
|
+
* (`body * { visibility: hidden !important }`) and re-shows the layer's
|
|
89
|
+
* elements (and their descendants and their injected `__render_frame_*`
|
|
90
|
+
* siblings) via `visibility: visible !important`. CSS `visibility: visible`
|
|
91
|
+
* on a descendant overrides an ancestor's `visibility: hidden`, so deep
|
|
92
|
+
* layer elements remain visible even though intermediate parents are
|
|
93
|
+
* hidden by the mass-hide rule.
|
|
94
|
+
* 2. Inline-hide each `extraHideId` (and its `__render_frame_*` sibling) with
|
|
95
|
+
* `visibility: hidden !important`. Inline `!important` beats stylesheet
|
|
96
|
+
* `!important`, so this overrides the show rule for elements that fall
|
|
97
|
+
* under a show selector but should NOT paint — typically other-layer
|
|
98
|
+
* elements that are descendants of a container layer (for example HDR
|
|
99
|
+
* videos and other-layer SDR videos are descendants of `#root` when we
|
|
100
|
+
* capture the root DOM layer).
|
|
101
|
+
*
|
|
102
|
+
* Only `visibility` is set on extraHideIds — never `opacity`. CSS opacity is
|
|
103
|
+
* multiplicative through the descendant chain and a descendant cannot escape
|
|
104
|
+
* an ancestor's `opacity: 0`. If `#root` is in `extraHideIds` and we set
|
|
105
|
+
* `opacity: 0` on it, every descendant — including `#vid-5-b` and its
|
|
106
|
+
* `__render_frame_vid-5-b__` IMG — becomes invisible even with
|
|
107
|
+
* `visibility: visible !important`. `visibility` does NOT have this problem:
|
|
108
|
+
* a descendant with `visibility: visible` overrides an ancestor's
|
|
109
|
+
* `visibility: hidden`.
|
|
110
|
+
*
|
|
111
|
+
* Layout is preserved (visibility doesn't trigger reflow), so border-radius
|
|
112
|
+
* clipping, overflow:hidden, and absolute positioning continue to apply to
|
|
113
|
+
* the visible layer elements. Opacity is also preserved — an ancestor at
|
|
114
|
+
* `opacity: 0` (e.g. an inactive scene during a transition) still
|
|
115
|
+
* propagates to its descendants, which is the desired behavior during
|
|
116
|
+
* cross-scene blends.
|
|
117
|
+
*
|
|
118
|
+
* Idempotent across calls: an existing mask stylesheet is removed before a
|
|
119
|
+
* new one is installed, so consecutive `applyDomLayerMask` invocations leave
|
|
120
|
+
* exactly one stylesheet attached.
|
|
121
|
+
*/
|
|
122
|
+
export declare function applyDomLayerMask(page: Page, showIds: string[], extraHideIds: string[]): Promise<void>;
|
|
123
|
+
/**
|
|
124
|
+
* Tear down the mask installed by applyDomLayerMask.
|
|
125
|
+
*
|
|
126
|
+
* Removes the mask stylesheet and clears the inline `visibility` properties
|
|
127
|
+
* set on `extraHideIds` (and their `__render_frame_*` siblings).
|
|
128
|
+
*
|
|
129
|
+
* IMPORTANT: We do NOT strip inline `opacity` here. applyDomLayerMask only
|
|
130
|
+
* ever sets `visibility` (never `opacity`), so any inline opacity present on
|
|
131
|
+
* a wrapper was put there by user animation code (typically GSAP) and must
|
|
132
|
+
* survive across per-layer captures. GSAP's seek with suppress-events does
|
|
133
|
+
* not re-apply tweens when the timeline is already at the target time, so if
|
|
134
|
+
* we strip opacity here and then seek to the same time for the next layer,
|
|
135
|
+
* GSAP won't put it back and the wrapper will render fully opaque.
|
|
136
|
+
*/
|
|
137
|
+
export declare function removeDomLayerMask(page: Page, extraHideIds: string[]): Promise<void>;
|
|
57
138
|
export declare function injectVideoFramesBatch(page: Page, updates: Array<{
|
|
58
139
|
videoId: string;
|
|
59
140
|
dataUri: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotService.d.ts","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,eAAO,MAAM,eAAe,oDAA2D,CAAC;AAExF,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,gBAAgB,EAAE,UAAU,CAAC,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AA6CD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED
|
|
1
|
+
{"version":3,"file":"screenshotService.d.ts","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,eAAO,MAAM,eAAe,oDAA2D,CAAC;AAExF,wBAAsB,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,OAAO,gBAAgB,EAAE,UAAU,CAAC,CAO5F;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AA6CD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,CAAC,CAuC3B;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAWhG;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAoBjB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAazE;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAUhG;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,0BAA0B,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,MAAM,EAAE,EACjB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAsCf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB1F;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACnD,OAAO,CAAC,IAAI,CAAC,CAsGf;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,MAAM,EAAE,GACvB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -148,12 +148,34 @@ export async function captureScreenshotWithAlpha(page, width, height) {
|
|
|
148
148
|
* Only use on sessions that are exclusively dedicated to transparent capture
|
|
149
149
|
* (e.g., the HDR two-pass DOM layer session) — the background will stay
|
|
150
150
|
* transparent for the lifetime of the session.
|
|
151
|
+
*
|
|
152
|
+
* NOTE on the injected stylesheet: `Emulation.setDefaultBackgroundColorOverride`
|
|
153
|
+
* only replaces the *default* page background. Compositions almost always set
|
|
154
|
+
* `body { background: ... }` and `#root { background: ... }`, which paint over
|
|
155
|
+
* the override and ruin alpha capture for layered HDR compositing — the
|
|
156
|
+
* composition root's full-frame background paints across the entire viewport
|
|
157
|
+
* and wipes out HDR content captured beneath it.
|
|
158
|
+
*
|
|
159
|
+
* We force `html`, `body`, and any element marked as a composition root
|
|
160
|
+
* (`[data-composition-id]`) to transparent. In HDR layered compositing the HDR
|
|
161
|
+
* video itself is the backdrop, so DOM layers must only contribute their
|
|
162
|
+
* foreground UI pixels — never a page-spanning solid backdrop.
|
|
151
163
|
*/
|
|
164
|
+
export const TRANSPARENT_BG_STYLE_ID = "__hf_transparent_bg__";
|
|
152
165
|
export async function initTransparentBackground(page) {
|
|
153
166
|
const client = await getCdpSession(page);
|
|
154
167
|
await client.send("Emulation.setDefaultBackgroundColorOverride", {
|
|
155
168
|
color: { r: 0, g: 0, b: 0, a: 0 },
|
|
156
169
|
});
|
|
170
|
+
await page.evaluate((styleId) => {
|
|
171
|
+
if (document.getElementById(styleId))
|
|
172
|
+
return;
|
|
173
|
+
const style = document.createElement("style");
|
|
174
|
+
style.id = styleId;
|
|
175
|
+
style.textContent =
|
|
176
|
+
"html,body,[data-composition-id]{background:transparent !important;background-color:transparent !important;background-image:none !important;}";
|
|
177
|
+
document.head.appendChild(style);
|
|
178
|
+
}, TRANSPARENT_BG_STYLE_ID);
|
|
157
179
|
}
|
|
158
180
|
/**
|
|
159
181
|
* Capture a transparent-background PNG screenshot without setting the
|
|
@@ -174,6 +196,120 @@ export async function captureAlphaPng(page, width, height) {
|
|
|
174
196
|
});
|
|
175
197
|
return Buffer.from(result.data, "base64");
|
|
176
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* Stylesheet ID used by applyDomLayerMask / removeDomLayerMask. Exposed so
|
|
201
|
+
* tests can assert presence/absence of the mask between captures.
|
|
202
|
+
*/
|
|
203
|
+
export const DOM_LAYER_MASK_STYLE_ID = "__hf_dom_layer_mask__";
|
|
204
|
+
/**
|
|
205
|
+
* Mask the DOM so a single layer screenshot captures ONLY the layer's pixels.
|
|
206
|
+
*
|
|
207
|
+
* The HDR layered compositor walks z-ordered layers and blits each one over a
|
|
208
|
+
* shared canvas. DOM layers are full-page screenshots — a naive screenshot
|
|
209
|
+
* captures every painted pixel on the page, which means root background +
|
|
210
|
+
* static overlays + sibling-scene content all overwrite previously composited
|
|
211
|
+
* HDR content beneath. The mask narrows each screenshot to the elements that
|
|
212
|
+
* actually belong to this layer.
|
|
213
|
+
*
|
|
214
|
+
* Strategy:
|
|
215
|
+
*
|
|
216
|
+
* 1. Inject a stylesheet that hides every body descendant
|
|
217
|
+
* (`body * { visibility: hidden !important }`) and re-shows the layer's
|
|
218
|
+
* elements (and their descendants and their injected `__render_frame_*`
|
|
219
|
+
* siblings) via `visibility: visible !important`. CSS `visibility: visible`
|
|
220
|
+
* on a descendant overrides an ancestor's `visibility: hidden`, so deep
|
|
221
|
+
* layer elements remain visible even though intermediate parents are
|
|
222
|
+
* hidden by the mass-hide rule.
|
|
223
|
+
* 2. Inline-hide each `extraHideId` (and its `__render_frame_*` sibling) with
|
|
224
|
+
* `visibility: hidden !important`. Inline `!important` beats stylesheet
|
|
225
|
+
* `!important`, so this overrides the show rule for elements that fall
|
|
226
|
+
* under a show selector but should NOT paint — typically other-layer
|
|
227
|
+
* elements that are descendants of a container layer (for example HDR
|
|
228
|
+
* videos and other-layer SDR videos are descendants of `#root` when we
|
|
229
|
+
* capture the root DOM layer).
|
|
230
|
+
*
|
|
231
|
+
* Only `visibility` is set on extraHideIds — never `opacity`. CSS opacity is
|
|
232
|
+
* multiplicative through the descendant chain and a descendant cannot escape
|
|
233
|
+
* an ancestor's `opacity: 0`. If `#root` is in `extraHideIds` and we set
|
|
234
|
+
* `opacity: 0` on it, every descendant — including `#vid-5-b` and its
|
|
235
|
+
* `__render_frame_vid-5-b__` IMG — becomes invisible even with
|
|
236
|
+
* `visibility: visible !important`. `visibility` does NOT have this problem:
|
|
237
|
+
* a descendant with `visibility: visible` overrides an ancestor's
|
|
238
|
+
* `visibility: hidden`.
|
|
239
|
+
*
|
|
240
|
+
* Layout is preserved (visibility doesn't trigger reflow), so border-radius
|
|
241
|
+
* clipping, overflow:hidden, and absolute positioning continue to apply to
|
|
242
|
+
* the visible layer elements. Opacity is also preserved — an ancestor at
|
|
243
|
+
* `opacity: 0` (e.g. an inactive scene during a transition) still
|
|
244
|
+
* propagates to its descendants, which is the desired behavior during
|
|
245
|
+
* cross-scene blends.
|
|
246
|
+
*
|
|
247
|
+
* Idempotent across calls: an existing mask stylesheet is removed before a
|
|
248
|
+
* new one is installed, so consecutive `applyDomLayerMask` invocations leave
|
|
249
|
+
* exactly one stylesheet attached.
|
|
250
|
+
*/
|
|
251
|
+
export async function applyDomLayerMask(page, showIds, extraHideIds) {
|
|
252
|
+
await page.evaluate((args) => {
|
|
253
|
+
const existing = document.getElementById(args.styleId);
|
|
254
|
+
if (existing)
|
|
255
|
+
existing.remove();
|
|
256
|
+
const showSelectors = [];
|
|
257
|
+
for (const id of args.show) {
|
|
258
|
+
const escaped = CSS.escape(id);
|
|
259
|
+
showSelectors.push(`#${escaped}`, `#${escaped} *`);
|
|
260
|
+
const renderEscaped = CSS.escape(`__render_frame_${id}__`);
|
|
261
|
+
showSelectors.push(`#${renderEscaped}`, `#${renderEscaped} *`);
|
|
262
|
+
}
|
|
263
|
+
const massHideRule = "body *{visibility:hidden !important;}";
|
|
264
|
+
const showRule = showSelectors.length === 0
|
|
265
|
+
? ""
|
|
266
|
+
: `${showSelectors.join(",")}{visibility:visible !important;}`;
|
|
267
|
+
const style = document.createElement("style");
|
|
268
|
+
style.id = args.styleId;
|
|
269
|
+
style.textContent = `${massHideRule}\n${showRule}`;
|
|
270
|
+
document.head.appendChild(style);
|
|
271
|
+
for (const id of args.hide) {
|
|
272
|
+
const el = document.getElementById(id);
|
|
273
|
+
if (el) {
|
|
274
|
+
el.style.setProperty("visibility", "hidden", "important");
|
|
275
|
+
}
|
|
276
|
+
const img = document.getElementById(`__render_frame_${id}__`);
|
|
277
|
+
if (img) {
|
|
278
|
+
img.style.setProperty("visibility", "hidden", "important");
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}, { show: showIds, hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID });
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Tear down the mask installed by applyDomLayerMask.
|
|
285
|
+
*
|
|
286
|
+
* Removes the mask stylesheet and clears the inline `visibility` properties
|
|
287
|
+
* set on `extraHideIds` (and their `__render_frame_*` siblings).
|
|
288
|
+
*
|
|
289
|
+
* IMPORTANT: We do NOT strip inline `opacity` here. applyDomLayerMask only
|
|
290
|
+
* ever sets `visibility` (never `opacity`), so any inline opacity present on
|
|
291
|
+
* a wrapper was put there by user animation code (typically GSAP) and must
|
|
292
|
+
* survive across per-layer captures. GSAP's seek with suppress-events does
|
|
293
|
+
* not re-apply tweens when the timeline is already at the target time, so if
|
|
294
|
+
* we strip opacity here and then seek to the same time for the next layer,
|
|
295
|
+
* GSAP won't put it back and the wrapper will render fully opaque.
|
|
296
|
+
*/
|
|
297
|
+
export async function removeDomLayerMask(page, extraHideIds) {
|
|
298
|
+
await page.evaluate((args) => {
|
|
299
|
+
const style = document.getElementById(args.styleId);
|
|
300
|
+
if (style)
|
|
301
|
+
style.remove();
|
|
302
|
+
for (const id of args.hide) {
|
|
303
|
+
const el = document.getElementById(id);
|
|
304
|
+
if (el) {
|
|
305
|
+
el.style.removeProperty("visibility");
|
|
306
|
+
}
|
|
307
|
+
const img = document.getElementById(`__render_frame_${id}__`);
|
|
308
|
+
if (img)
|
|
309
|
+
img.style.removeProperty("visibility");
|
|
310
|
+
}
|
|
311
|
+
}, { hide: extraHideIds, styleId: DOM_LAYER_MASK_STYLE_ID });
|
|
312
|
+
}
|
|
177
313
|
export async function injectVideoFramesBatch(page, updates) {
|
|
178
314
|
if (updates.length === 0)
|
|
179
315
|
return;
|
|
@@ -186,6 +322,16 @@ export async function injectVideoFramesBatch(page, updates) {
|
|
|
186
322
|
let img = video.nextElementSibling;
|
|
187
323
|
const isNewImage = !img || !img.classList.contains("__render_frame__");
|
|
188
324
|
const computedStyle = window.getComputedStyle(video);
|
|
325
|
+
// GSAP seeks re-apply tween values during an active tween, but do not
|
|
326
|
+
// re-apply tweens that have already completed. After an opacity fade-in
|
|
327
|
+
// finishes, GSAP's last set value is overwritten on subsequent frames
|
|
328
|
+
// by the `opacity: 0 !important` we apply at the bottom of this
|
|
329
|
+
// function to hide the native <video>. That leaves `computedOpacity`
|
|
330
|
+
// stuck at 0 even though the user's intent is opacity 1 (the tween's
|
|
331
|
+
// end state). The `|| 1` fallback treats computedOpacity === 0 as a
|
|
332
|
+
// hidden-native-video artifact and recovers opacity 1, matching the
|
|
333
|
+
// final on-screen state for the vast majority of compositions.
|
|
334
|
+
// For active tweens in the [0,1] exclusive range this is a no-op.
|
|
189
335
|
const computedOpacity = parseFloat(computedStyle.opacity) || 1;
|
|
190
336
|
const sourceIsStatic = !computedStyle.position || computedStyle.position === "static";
|
|
191
337
|
if (isNewImage) {
|
|
@@ -220,6 +366,15 @@ export async function injectVideoFramesBatch(page, updates) {
|
|
|
220
366
|
img.style.objectPosition = computedStyle.objectPosition;
|
|
221
367
|
img.style.zIndex = computedStyle.zIndex;
|
|
222
368
|
for (const property of visualProperties) {
|
|
369
|
+
// Opacity is handled explicitly via `computedOpacity` below — copying
|
|
370
|
+
// via the generic loop would race against the opacity:0 hide applied
|
|
371
|
+
// to the <video> at the end of this function. GSAP may animate
|
|
372
|
+
// opacity either on a wrapper (the <img> inherits via the stacking
|
|
373
|
+
// context) or directly on the <video> (we must copy it to the <img>
|
|
374
|
+
// since they are siblings). Reading computedStyle.opacity before
|
|
375
|
+
// hiding the <video> handles both cases correctly.
|
|
376
|
+
if (property === "opacity")
|
|
377
|
+
continue;
|
|
223
378
|
if (sourceIsStatic &&
|
|
224
379
|
(property === "top" ||
|
|
225
380
|
property === "left" ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotService.js","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"screenshotService.js","sourceRoot":"","sources":["../../src/services/screenshotService.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,9 +56,14 @@ export interface ElementStackingInfo {
|
|
|
56
56
|
y: number;
|
|
57
57
|
width: number;
|
|
58
58
|
height: number;
|
|
59
|
+
/** Layout dimensions before CSS transforms (offsetWidth/offsetHeight). */
|
|
60
|
+
layoutWidth: number;
|
|
61
|
+
layoutHeight: number;
|
|
59
62
|
opacity: number;
|
|
60
63
|
visible: boolean;
|
|
61
64
|
isHdr: boolean;
|
|
65
|
+
transform: string;
|
|
66
|
+
borderRadius: [number, number, number, number];
|
|
62
67
|
}
|
|
63
68
|
/**
|
|
64
69
|
* Query Chrome for ALL timed elements' stacking context.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"videoFrameInjector.d.ts","sourceRoot":"","sources":["../../src/services/videoFrameInjector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAiDjE;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,GAC7D,iBAAiB,GAAG,IAAI,CAgD1B;AAID;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"videoFrameInjector.d.ts","sourceRoot":"","sources":["../../src/services/videoFrameInjector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAkB,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAiDjE;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,wBAAwB,CAAC,CAAC,GAC7D,iBAAiB,GAAG,IAAI,CAgD1B;AAID;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAcrF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAarF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyC/B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,IAAI,EACV,iBAAiB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC7B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA0MhC"}
|
|
@@ -223,6 +223,120 @@ export async function queryElementStacking(page, nativeHdrVideoIds) {
|
|
|
223
223
|
}
|
|
224
224
|
return 0;
|
|
225
225
|
}
|
|
226
|
+
// Find border-radius that clips the element. Replaced elements like <video>
|
|
227
|
+
// clip to their own border-radius; ancestors need overflow !== visible.
|
|
228
|
+
function getEffectiveBorderRadius(node) {
|
|
229
|
+
// Resolve a CSS border-radius value to pixels. Chrome's getComputedStyle
|
|
230
|
+
// returns percentages as-is (e.g. "50%"), not resolved to px.
|
|
231
|
+
// Uses offsetWidth/offsetHeight (layout dimensions before CSS transforms)
|
|
232
|
+
// because CSS resolves percentages against the padding box, not the
|
|
233
|
+
// transformed bounding box.
|
|
234
|
+
function resolveRadius(value, el) {
|
|
235
|
+
if (value.includes("%")) {
|
|
236
|
+
const pct = parseFloat(value) / 100;
|
|
237
|
+
const htmlEl = el;
|
|
238
|
+
const w = htmlEl.offsetWidth || 0;
|
|
239
|
+
const h = htmlEl.offsetHeight || 0;
|
|
240
|
+
return pct * Math.min(w, h);
|
|
241
|
+
}
|
|
242
|
+
return parseFloat(value) || 0;
|
|
243
|
+
}
|
|
244
|
+
// Check element itself (replaced elements clip to own border-radius)
|
|
245
|
+
const selfCs = window.getComputedStyle(node);
|
|
246
|
+
const selfRadii = [
|
|
247
|
+
resolveRadius(selfCs.borderTopLeftRadius, node),
|
|
248
|
+
resolveRadius(selfCs.borderTopRightRadius, node),
|
|
249
|
+
resolveRadius(selfCs.borderBottomRightRadius, node),
|
|
250
|
+
resolveRadius(selfCs.borderBottomLeftRadius, node),
|
|
251
|
+
];
|
|
252
|
+
if (selfRadii[0] > 0 || selfRadii[1] > 0 || selfRadii[2] > 0 || selfRadii[3] > 0) {
|
|
253
|
+
return selfRadii;
|
|
254
|
+
}
|
|
255
|
+
// Walk ancestors looking for clipping container
|
|
256
|
+
let current = node.parentElement;
|
|
257
|
+
while (current) {
|
|
258
|
+
const cs = window.getComputedStyle(current);
|
|
259
|
+
if (cs.overflow !== "visible") {
|
|
260
|
+
const tl = resolveRadius(cs.borderTopLeftRadius, current);
|
|
261
|
+
const tr = resolveRadius(cs.borderTopRightRadius, current);
|
|
262
|
+
const brr = resolveRadius(cs.borderBottomRightRadius, current);
|
|
263
|
+
const bl = resolveRadius(cs.borderBottomLeftRadius, current);
|
|
264
|
+
if (tl > 0 || tr > 0 || brr > 0 || bl > 0) {
|
|
265
|
+
return [tl, tr, brr, bl];
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
current = current.parentElement;
|
|
269
|
+
}
|
|
270
|
+
return [0, 0, 0, 0];
|
|
271
|
+
}
|
|
272
|
+
// Walk up the DOM multiplying each ancestor's opacity. GSAP animates
|
|
273
|
+
// opacity on wrapper divs, not directly on the video element, so the
|
|
274
|
+
// element's own opacity is often 1.0. Multiplying ancestors gives the
|
|
275
|
+
// true effective opacity.
|
|
276
|
+
function getEffectiveOpacity(node) {
|
|
277
|
+
let opacity = 1;
|
|
278
|
+
let current = node;
|
|
279
|
+
while (current) {
|
|
280
|
+
const cs = window.getComputedStyle(current);
|
|
281
|
+
const val = parseFloat(cs.opacity);
|
|
282
|
+
// Note: `val || 1` would turn opacity:0 into 1 (0 is falsy)
|
|
283
|
+
opacity *= Number.isNaN(val) ? 1 : val;
|
|
284
|
+
current = current.parentElement;
|
|
285
|
+
}
|
|
286
|
+
return opacity;
|
|
287
|
+
}
|
|
288
|
+
// Compute the full CSS transform matrix from element-local coords to
|
|
289
|
+
// viewport coords by walking the offsetParent chain and accumulating
|
|
290
|
+
// position offsets + CSS transforms. This correctly handles GSAP
|
|
291
|
+
// animations on wrapper divs (rotation, scale) that getBoundingClientRect
|
|
292
|
+
// conflates into an axis-aligned bounding box.
|
|
293
|
+
function getViewportMatrix(node) {
|
|
294
|
+
const chain = [];
|
|
295
|
+
let current = node;
|
|
296
|
+
while (current instanceof HTMLElement) {
|
|
297
|
+
chain.push(current);
|
|
298
|
+
const next = current.offsetParent ?? current.parentElement;
|
|
299
|
+
if (next === current)
|
|
300
|
+
break;
|
|
301
|
+
current = next;
|
|
302
|
+
}
|
|
303
|
+
let mat = new DOMMatrix();
|
|
304
|
+
for (let i = chain.length - 1; i >= 0; i--) {
|
|
305
|
+
const htmlEl = chain[i];
|
|
306
|
+
if (!htmlEl)
|
|
307
|
+
continue;
|
|
308
|
+
mat = mat.translate(htmlEl.offsetLeft, htmlEl.offsetTop);
|
|
309
|
+
const cs = window.getComputedStyle(htmlEl);
|
|
310
|
+
if (cs.transform && cs.transform !== "none") {
|
|
311
|
+
const origin = cs.transformOrigin.split(" ");
|
|
312
|
+
const ox = resolveLength(origin[0] ?? "0", htmlEl.offsetWidth);
|
|
313
|
+
const oy = resolveLength(origin[1] ?? "0", htmlEl.offsetHeight);
|
|
314
|
+
try {
|
|
315
|
+
const t = new DOMMatrix(cs.transform);
|
|
316
|
+
if (Number.isFinite(t.a) &&
|
|
317
|
+
Number.isFinite(t.b) &&
|
|
318
|
+
Number.isFinite(t.c) &&
|
|
319
|
+
Number.isFinite(t.d) &&
|
|
320
|
+
Number.isFinite(t.e) &&
|
|
321
|
+
Number.isFinite(t.f)) {
|
|
322
|
+
mat = mat.translate(ox, oy).multiply(t).translate(-ox, -oy);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
// DOMMatrix constructor throws on malformed input — skip ancestor.
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return mat.toString();
|
|
331
|
+
}
|
|
332
|
+
function resolveLength(value, basis) {
|
|
333
|
+
if (value.endsWith("%")) {
|
|
334
|
+
const pct = parseFloat(value) / 100;
|
|
335
|
+
return Number.isFinite(pct) ? pct * basis : 0;
|
|
336
|
+
}
|
|
337
|
+
const n = parseFloat(value);
|
|
338
|
+
return Number.isFinite(n) ? n : 0;
|
|
339
|
+
}
|
|
226
340
|
for (const el of elements) {
|
|
227
341
|
const id = el.id;
|
|
228
342
|
if (!id)
|
|
@@ -230,11 +344,21 @@ export async function queryElementStacking(page, nativeHdrVideoIds) {
|
|
|
230
344
|
const rect = el.getBoundingClientRect();
|
|
231
345
|
const style = window.getComputedStyle(el);
|
|
232
346
|
const zIndex = getEffectiveZIndex(el);
|
|
233
|
-
|
|
347
|
+
// For HDR video elements, the frame injector sets `opacity: 0 !important`
|
|
348
|
+
// on the element itself. Start the opacity walk from the parent to get the
|
|
349
|
+
// real GSAP-animated opacity from wrapper divs.
|
|
350
|
+
const isHdrEl = hdrSet.has(id);
|
|
351
|
+
const opacityStartNode = isHdrEl ? el.parentElement : el;
|
|
352
|
+
const opacity = opacityStartNode ? getEffectiveOpacity(opacityStartNode) : 1;
|
|
234
353
|
const visible = style.visibility !== "hidden" &&
|
|
235
354
|
style.display !== "none" &&
|
|
236
355
|
rect.width > 0 &&
|
|
237
356
|
rect.height > 0;
|
|
357
|
+
// offsetWidth/offsetHeight only exist on HTMLElement (not on
|
|
358
|
+
// SVGElement, MathMLElement, etc.). Fall back to the bounding rect
|
|
359
|
+
// dimensions for non-HTML elements so callers always get sensible
|
|
360
|
+
// layout numbers.
|
|
361
|
+
const htmlEl = el instanceof HTMLElement ? el : null;
|
|
238
362
|
results.push({
|
|
239
363
|
id,
|
|
240
364
|
zIndex,
|
|
@@ -242,9 +366,16 @@ export async function queryElementStacking(page, nativeHdrVideoIds) {
|
|
|
242
366
|
y: Math.round(rect.y),
|
|
243
367
|
width: Math.round(rect.width),
|
|
244
368
|
height: Math.round(rect.height),
|
|
369
|
+
layoutWidth: htmlEl?.offsetWidth || Math.round(rect.width),
|
|
370
|
+
layoutHeight: htmlEl?.offsetHeight || Math.round(rect.height),
|
|
245
371
|
opacity,
|
|
246
372
|
visible,
|
|
247
373
|
isHdr: hdrSet.has(id),
|
|
374
|
+
// For HDR elements, use the full accumulated viewport matrix so the
|
|
375
|
+
// affine blit can apply rotation/scale/translate properly. For DOM
|
|
376
|
+
// elements, the element-level transform is sufficient for reference.
|
|
377
|
+
transform: isHdrEl ? getViewportMatrix(el) : style.transform || "none",
|
|
378
|
+
borderRadius: isHdrEl ? getEffectiveBorderRadius(el) : [0, 0, 0, 0],
|
|
248
379
|
});
|
|
249
380
|
}
|
|
250
381
|
return results;
|