@tscaps/engine 0.1.1 → 0.2.1
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/README.md +2 -4
- package/dist/modules/css/CssScoper.d.ts +21 -1
- package/dist/modules/css/CssScoper.d.ts.map +1 -1
- package/dist/modules/css/CssScoper.js +129 -56
- package/dist/modules/css/CssScoper.js.map +1 -1
- package/dist/modules/css/CssVarReferenceScanner.d.ts +13 -0
- package/dist/modules/css/CssVarReferenceScanner.d.ts.map +1 -0
- package/dist/modules/css/CssVarReferenceScanner.js +20 -0
- package/dist/modules/css/CssVarReferenceScanner.js.map +1 -0
- package/dist/modules/css/index.d.ts +1 -0
- package/dist/modules/css/index.d.ts.map +1 -1
- package/dist/modules/css/index.js +1 -0
- package/dist/modules/css/index.js.map +1 -1
- package/dist/modules/document/CssVariable.d.ts +24 -3
- package/dist/modules/document/CssVariable.d.ts.map +1 -1
- package/dist/modules/document/CssVariable.js +30 -2
- package/dist/modules/document/CssVariable.js.map +1 -1
- package/dist/modules/document/Decoration.d.ts +42 -0
- package/dist/modules/document/Decoration.d.ts.map +1 -0
- package/dist/modules/document/Decoration.js +52 -0
- package/dist/modules/document/Decoration.js.map +1 -0
- package/dist/modules/document/Document.d.ts.map +1 -1
- package/dist/modules/document/Document.js +0 -3
- package/dist/modules/document/Document.js.map +1 -1
- package/dist/modules/document/DocumentEditor.d.ts +11 -0
- package/dist/modules/document/DocumentEditor.d.ts.map +1 -1
- package/dist/modules/document/DocumentEditor.js +49 -9
- package/dist/modules/document/DocumentEditor.js.map +1 -1
- package/dist/modules/document/Line.d.ts +9 -6
- package/dist/modules/document/Line.d.ts.map +1 -1
- package/dist/modules/document/Line.js +11 -24
- package/dist/modules/document/Line.js.map +1 -1
- package/dist/modules/document/Section.d.ts +0 -4
- package/dist/modules/document/Section.d.ts.map +1 -1
- package/dist/modules/document/Section.js +2 -18
- package/dist/modules/document/Section.js.map +1 -1
- package/dist/modules/document/Segment.d.ts +10 -7
- package/dist/modules/document/Segment.d.ts.map +1 -1
- package/dist/modules/document/Segment.js +15 -22
- package/dist/modules/document/Segment.js.map +1 -1
- package/dist/modules/document/Tag.d.ts +3 -0
- package/dist/modules/document/Tag.d.ts.map +1 -1
- package/dist/modules/document/Tag.js +3 -0
- package/dist/modules/document/Tag.js.map +1 -1
- package/dist/modules/document/Word.d.ts +20 -7
- package/dist/modules/document/Word.d.ts.map +1 -1
- package/dist/modules/document/Word.js +32 -34
- package/dist/modules/document/Word.js.map +1 -1
- package/dist/modules/document/index.d.ts +1 -0
- package/dist/modules/document/index.d.ts.map +1 -1
- package/dist/modules/document/index.js +1 -0
- package/dist/modules/document/index.js.map +1 -1
- package/dist/modules/effect/CarryQuotesEffect.d.ts +1 -7
- package/dist/modules/effect/CarryQuotesEffect.d.ts.map +1 -1
- package/dist/modules/effect/CarryQuotesEffect.js +17 -30
- package/dist/modules/effect/CarryQuotesEffect.js.map +1 -1
- package/dist/modules/effect/RemovePunctuationEffect.d.ts +10 -2
- package/dist/modules/effect/RemovePunctuationEffect.d.ts.map +1 -1
- package/dist/modules/effect/RemovePunctuationEffect.js +26 -6
- package/dist/modules/effect/RemovePunctuationEffect.js.map +1 -1
- package/dist/modules/effect/SmartLowercaseEffect.d.ts +7 -6
- package/dist/modules/effect/SmartLowercaseEffect.d.ts.map +1 -1
- package/dist/modules/effect/SmartLowercaseEffect.js +11 -7
- package/dist/modules/effect/SmartLowercaseEffect.js.map +1 -1
- package/dist/modules/pipeline/RenderPipelineBuilder.d.ts +3 -3
- package/dist/modules/pipeline/RenderPipelineBuilder.d.ts.map +1 -1
- package/dist/modules/pipeline/RenderPipelineBuilder.js +11 -6
- package/dist/modules/pipeline/RenderPipelineBuilder.js.map +1 -1
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.d.ts +19 -25
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.d.ts.map +1 -1
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.js +40 -717
- package/dist/modules/rendering/BrowserSubtitleFrameRenderer.js.map +1 -1
- package/dist/modules/rendering/SubtitleFrameRenderer.d.ts +8 -5
- package/dist/modules/rendering/SubtitleFrameRenderer.d.ts.map +1 -1
- package/dist/modules/rendering/index.d.ts +13 -8
- package/dist/modules/rendering/index.d.ts.map +1 -1
- package/dist/modules/rendering/index.js +5 -2
- package/dist/modules/rendering/index.js.map +1 -1
- package/dist/modules/rendering/styles/BaselineCssComposer.d.ts +23 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.d.ts.map +1 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.js +40 -0
- package/dist/modules/rendering/styles/BaselineCssComposer.js.map +1 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.d.ts +19 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.d.ts.map +1 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.js +19 -0
- package/dist/modules/rendering/styles/BehindActorBaselineCss.js.map +1 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.d.ts +7 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.d.ts.map +1 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.js +34 -0
- package/dist/modules/rendering/styles/DecorationContainerBaselineCss.js.map +1 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.d.ts +27 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.d.ts.map +1 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.js +53 -0
- package/dist/modules/rendering/styles/InlineStyleEmitter.js.map +1 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.d.ts +15 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.js +33 -0
- package/dist/modules/rendering/styles/SegmentPaddingCssRuleBuilder.js.map +1 -0
- package/dist/modules/rendering/styles/VideoFrameLayerClass.d.ts.map +1 -0
- package/dist/modules/rendering/styles/VideoFrameLayerClass.js.map +1 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.d.ts +13 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.js +2 -0
- package/dist/modules/rendering/subtitle/AbstractAnim.js.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.d.ts +20 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.js +31 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSession.js.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.d.ts +19 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.js +41 -0
- package/dist/modules/rendering/subtitle/ActiveRenderSessionFactory.js.map +1 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.d.ts +25 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.js +198 -0
- package/dist/modules/rendering/subtitle/AnimationProbe.js.map +1 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.d.ts +15 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.js +26 -0
- package/dist/modules/rendering/subtitle/AssetGroupBuilder.js.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlan.d.ts +32 -0
- package/dist/modules/rendering/subtitle/BatchPlan.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlan.js +2 -0
- package/dist/modules/rendering/subtitle/BatchPlan.js.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.d.ts +31 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.js +91 -0
- package/dist/modules/rendering/subtitle/BatchPlanner.js.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.d.ts +35 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.js +2 -0
- package/dist/modules/rendering/subtitle/PreparedStyle.js.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.d.ts +31 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.js +91 -0
- package/dist/modules/rendering/subtitle/PreparedStyleFactory.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.d.ts +13 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.js +24 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionCache.js.map +1 -0
- package/dist/modules/rendering/{SegmentPaintRegionResolver.d.ts → subtitle/SegmentPaintRegionResolver.d.ts} +1 -1
- package/dist/modules/rendering/subtitle/SegmentPaintRegionResolver.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentPaintRegionResolver.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.d.ts +45 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.js +50 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeDecomposer.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.d.ts +80 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.js +188 -0
- package/dist/modules/rendering/subtitle/SegmentSubtreeHtmlBuilder.js.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.d.ts +45 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.js +141 -0
- package/dist/modules/rendering/subtitle/SegmentWrapperRenderer.js.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.d.ts +46 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.js +134 -0
- package/dist/modules/rendering/subtitle/SpriteSheetCompositor.js.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.d.ts +17 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.js +58 -0
- package/dist/modules/rendering/subtitle/SpriteSheetSizeProber.js.map +1 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.d.ts +27 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.js +40 -0
- package/dist/modules/rendering/subtitle/SvgFilterMaterializer.js.map +1 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.d.ts +42 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.d.ts.map +1 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.js +112 -0
- package/dist/modules/rendering/subtitle/VideoFrameVarsBuilder.js.map +1 -0
- package/dist/modules/rendering/types/AlignmentConfig.d.ts.map +1 -0
- package/dist/modules/rendering/types/AlignmentConfig.js.map +1 -0
- package/dist/modules/rendering/types/BehindActorRequirement.d.ts +12 -0
- package/dist/modules/rendering/types/BehindActorRequirement.d.ts.map +1 -0
- package/dist/modules/rendering/types/BehindActorRequirement.js +2 -0
- package/dist/modules/rendering/types/BehindActorRequirement.js.map +1 -0
- package/dist/modules/rendering/types/BoxEdges.d.ts.map +1 -0
- package/dist/modules/rendering/types/BoxEdges.js.map +1 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.d.ts +8 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.d.ts.map +1 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.js +2 -0
- package/dist/modules/rendering/types/DecorationPlacementSide.js.map +1 -0
- package/dist/modules/rendering/{ElementRenderOverrides.d.ts → types/ElementRenderOverrides.d.ts} +1 -1
- package/dist/modules/rendering/types/ElementRenderOverrides.d.ts.map +1 -0
- package/dist/modules/rendering/types/ElementRenderOverrides.js.map +1 -0
- package/dist/modules/rendering/types/InlineStyleMap.d.ts.map +1 -0
- package/dist/modules/rendering/types/InlineStyleMap.js.map +1 -0
- package/dist/modules/rendering/{RenderingConfig.d.ts → types/RenderingConfig.d.ts} +3 -1
- package/dist/modules/rendering/types/RenderingConfig.d.ts.map +1 -0
- package/dist/modules/rendering/types/RenderingConfig.js.map +1 -0
- package/dist/modules/rendering/{ScopedRenderOverride.d.ts → types/ScopedRenderOverride.d.ts} +2 -2
- package/dist/modules/rendering/types/ScopedRenderOverride.d.ts.map +1 -0
- package/dist/modules/rendering/types/ScopedRenderOverride.js.map +1 -0
- package/dist/modules/rendering/types/VideoFrameSource.d.ts.map +1 -0
- package/dist/modules/rendering/types/VideoFrameSource.js.map +1 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.d.ts +33 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.d.ts.map +1 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.js +100 -0
- package/dist/modules/splitting/BoundaryScoreLimitByCharsSegmentSplitter.js.map +1 -0
- package/dist/modules/splitting/FixedTailLineSplitter.d.ts +29 -0
- package/dist/modules/splitting/FixedTailLineSplitter.d.ts.map +1 -0
- package/dist/modules/splitting/FixedTailLineSplitter.js +43 -0
- package/dist/modules/splitting/FixedTailLineSplitter.js.map +1 -0
- package/dist/modules/splitting/index.d.ts +4 -0
- package/dist/modules/splitting/index.d.ts.map +1 -1
- package/dist/modules/splitting/index.js +2 -0
- package/dist/modules/splitting/index.js.map +1 -1
- package/dist/modules/tagging/PauseTagger.d.ts +24 -0
- package/dist/modules/tagging/PauseTagger.d.ts.map +1 -0
- package/dist/modules/tagging/PauseTagger.js +41 -0
- package/dist/modules/tagging/PauseTagger.js.map +1 -0
- package/dist/modules/tagging/StructureTagger.d.ts +1 -1
- package/dist/modules/tagging/StructureTagger.d.ts.map +1 -1
- package/dist/modules/tagging/StructureTagger.js +11 -5
- package/dist/modules/tagging/StructureTagger.js.map +1 -1
- package/dist/modules/tagging/index.d.ts +2 -0
- package/dist/modules/tagging/index.d.ts.map +1 -1
- package/dist/modules/tagging/index.js +1 -0
- package/dist/modules/tagging/index.js.map +1 -1
- package/dist/modules/transcription/VttTranscriber.d.ts +28 -0
- package/dist/modules/transcription/VttTranscriber.d.ts.map +1 -0
- package/dist/modules/transcription/VttTranscriber.js +59 -0
- package/dist/modules/transcription/VttTranscriber.js.map +1 -0
- package/dist/modules/transcription/index.d.ts +1 -0
- package/dist/modules/transcription/index.d.ts.map +1 -1
- package/dist/modules/transcription/index.js +1 -0
- package/dist/modules/transcription/index.js.map +1 -1
- package/dist/modules/video/RenderJob.d.ts +17 -0
- package/dist/modules/video/RenderJob.d.ts.map +1 -1
- package/dist/modules/video/RenderTimeMap.d.ts +50 -0
- package/dist/modules/video/RenderTimeMap.d.ts.map +1 -0
- package/dist/modules/video/RenderTimeMap.js +90 -0
- package/dist/modules/video/RenderTimeMap.js.map +1 -0
- package/dist/modules/video/index.d.ts +8 -1
- package/dist/modules/video/index.d.ts.map +1 -1
- package/dist/modules/video/index.js +4 -0
- package/dist/modules/video/index.js.map +1 -1
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.d.ts +102 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.js +199 -0
- package/dist/modules/video/mediabunny/MediaBunnyTranscodeCoordinator.js.map +1 -0
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.d.ts +12 -52
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.js +25 -190
- package/dist/modules/video/mediabunny/MediaBunnyVideoRenderer.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/AudioTrackBridgeFactory.d.ts +7 -0
- package/dist/modules/video/mediabunny/audio/AudioTrackBridgeFactory.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.js +2 -2
- package/dist/modules/video/mediabunny/audio/DefaultAudioTrackBridgeFactory.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.d.ts +2 -0
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.js +8 -2
- package/dist/modules/video/mediabunny/audio/PassthroughAudioTrackBridge.js.map +1 -1
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.d.ts +3 -0
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.js +9 -2
- package/dist/modules/video/mediabunny/audio/TranscodeAudioTrackBridge.js.map +1 -1
- package/dist/modules/video/mediabunny/codec/CodecPolicy.d.ts +7 -0
- package/dist/modules/video/mediabunny/codec/CodecPolicy.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/CurrentFrameVideoSource.d.ts +1 -1
- package/dist/modules/video/mediabunny/frame/CurrentFrameVideoSource.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/FrameCompositor.d.ts +9 -2
- package/dist/modules/video/mediabunny/frame/FrameCompositor.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.d.ts +5 -2
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.d.ts.map +1 -1
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.js +8 -2
- package/dist/modules/video/mediabunny/frame/LayeredFrameCompositor.js.map +1 -1
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.d.ts +35 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.js +69 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainter.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.d.ts +23 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.js +23 -0
- package/dist/modules/video/mediabunny/painter/CaptionsOverlayFramePainterFactory.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.d.ts +46 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.js +2 -0
- package/dist/modules/video/mediabunny/painter/FramePainter.js.map +1 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.d.ts +25 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.d.ts.map +1 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.js +2 -0
- package/dist/modules/video/mediabunny/painter/TopLayerSource.js.map +1 -0
- package/package.json +1 -1
- package/dist/modules/rendering/AlignmentConfig.d.ts.map +0 -1
- package/dist/modules/rendering/AlignmentConfig.js.map +0 -1
- package/dist/modules/rendering/BoxEdges.d.ts.map +0 -1
- package/dist/modules/rendering/BoxEdges.js.map +0 -1
- package/dist/modules/rendering/ElementRenderOverrides.d.ts.map +0 -1
- package/dist/modules/rendering/ElementRenderOverrides.js.map +0 -1
- package/dist/modules/rendering/InlineStyleMap.d.ts.map +0 -1
- package/dist/modules/rendering/InlineStyleMap.js.map +0 -1
- package/dist/modules/rendering/RenderingConfig.d.ts.map +0 -1
- package/dist/modules/rendering/RenderingConfig.js.map +0 -1
- package/dist/modules/rendering/ScopedRenderOverride.d.ts.map +0 -1
- package/dist/modules/rendering/ScopedRenderOverride.js.map +0 -1
- package/dist/modules/rendering/SegmentPaintRegionResolver.d.ts.map +0 -1
- package/dist/modules/rendering/SegmentPaintRegionResolver.js.map +0 -1
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.d.ts +0 -58
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.d.ts.map +0 -1
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.js +0 -132
- package/dist/modules/rendering/SegmentSubtreeHtmlBuilder.js.map +0 -1
- package/dist/modules/rendering/VideoFrameLayerClass.d.ts.map +0 -1
- package/dist/modules/rendering/VideoFrameLayerClass.js.map +0 -1
- package/dist/modules/rendering/VideoFrameSource.d.ts.map +0 -1
- package/dist/modules/rendering/VideoFrameSource.js.map +0 -1
- /package/dist/modules/rendering/{VideoFrameLayerClass.d.ts → styles/VideoFrameLayerClass.d.ts} +0 -0
- /package/dist/modules/rendering/{VideoFrameLayerClass.js → styles/VideoFrameLayerClass.js} +0 -0
- /package/dist/modules/rendering/{SegmentPaintRegionResolver.js → subtitle/SegmentPaintRegionResolver.js} +0 -0
- /package/dist/modules/rendering/{AlignmentConfig.d.ts → types/AlignmentConfig.d.ts} +0 -0
- /package/dist/modules/rendering/{AlignmentConfig.js → types/AlignmentConfig.js} +0 -0
- /package/dist/modules/rendering/{BoxEdges.d.ts → types/BoxEdges.d.ts} +0 -0
- /package/dist/modules/rendering/{BoxEdges.js → types/BoxEdges.js} +0 -0
- /package/dist/modules/rendering/{ElementRenderOverrides.js → types/ElementRenderOverrides.js} +0 -0
- /package/dist/modules/rendering/{InlineStyleMap.d.ts → types/InlineStyleMap.d.ts} +0 -0
- /package/dist/modules/rendering/{InlineStyleMap.js → types/InlineStyleMap.js} +0 -0
- /package/dist/modules/rendering/{RenderingConfig.js → types/RenderingConfig.js} +0 -0
- /package/dist/modules/rendering/{ScopedRenderOverride.js → types/ScopedRenderOverride.js} +0 -0
- /package/dist/modules/rendering/{VideoFrameSource.d.ts → types/VideoFrameSource.d.ts} +0 -0
- /package/dist/modules/rendering/{VideoFrameSource.js → types/VideoFrameSource.js} +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { CssVariable } from '../../document/CssVariable';
|
|
2
|
+
/**
|
|
3
|
+
* Builds the HTML wrapper for one render tile. Handles three subtree
|
|
4
|
+
* shapes: the main segment subtree, a sibling subtree for a per-word
|
|
5
|
+
* alignment override that pulls the word out of line flow, and a
|
|
6
|
+
* sibling subtree for a decoration-only override that pins the glyph
|
|
7
|
+
* at its own anchor. Each subtree carries its own anchor; the
|
|
8
|
+
* positioned siblings appear after the main wrapper, with their
|
|
9
|
+
* original slot in the line omitted so neighbours reflow. Aggregates
|
|
10
|
+
* the SVG `<filter>` defs each subtree needs into the tile's `defs`.
|
|
11
|
+
*/
|
|
12
|
+
export class SegmentWrapperRenderer {
|
|
13
|
+
subtreeBuilder;
|
|
14
|
+
subtreeDecomposer;
|
|
15
|
+
filterMaterializer;
|
|
16
|
+
videoFrameVarsBuilder;
|
|
17
|
+
width;
|
|
18
|
+
height;
|
|
19
|
+
constructor(subtreeBuilder, subtreeDecomposer, filterMaterializer, videoFrameVarsBuilder, width, height) {
|
|
20
|
+
this.subtreeBuilder = subtreeBuilder;
|
|
21
|
+
this.subtreeDecomposer = subtreeDecomposer;
|
|
22
|
+
this.filterMaterializer = filterMaterializer;
|
|
23
|
+
this.videoFrameVarsBuilder = videoFrameVarsBuilder;
|
|
24
|
+
this.width = width;
|
|
25
|
+
this.height = height;
|
|
26
|
+
}
|
|
27
|
+
async buildWrapperHtml(style, seg, t, indexInSection, nextUid) {
|
|
28
|
+
const segmentOverride = style.segmentOverrides.get(seg.id);
|
|
29
|
+
const segmentAlignment = { ...style.alignment, ...segmentOverride?.alignment };
|
|
30
|
+
const segmentInlineStylesOverride = segmentOverride?.inlineStyles;
|
|
31
|
+
const baseInlineStyles = segmentInlineStylesOverride
|
|
32
|
+
? { ...style.inlineStyles, ...segmentInlineStylesOverride }
|
|
33
|
+
: style.inlineStyles;
|
|
34
|
+
const decomposition = this.subtreeDecomposer.decompose(seg, style.wordOverrides);
|
|
35
|
+
// Skip the main segment subtree entirely when every word has been
|
|
36
|
+
// pulled into a positioned-word sibling — otherwise the segment's
|
|
37
|
+
// own decorations (background, ::before chrome, padding) would
|
|
38
|
+
// paint as an empty shell. Positioned words render below regardless.
|
|
39
|
+
let html = '';
|
|
40
|
+
let defs = '';
|
|
41
|
+
if (!decomposition.everyWordIsPositioned) {
|
|
42
|
+
const main = await this.buildSegmentSubtreeHtml(style, seg, t, indexInSection, segmentAlignment, baseInlineStyles, decomposition.excludedWordIds, nextUid);
|
|
43
|
+
html = main.html;
|
|
44
|
+
defs = main.defs;
|
|
45
|
+
}
|
|
46
|
+
const positionedInlineStyles = this.withoutBehindActorState(baseInlineStyles);
|
|
47
|
+
for (const positioned of decomposition.positionedWords) {
|
|
48
|
+
const wordAlignmentOverride = style.wordOverrides.get(positioned.word.id)?.alignment;
|
|
49
|
+
const wordAlignment = { ...segmentAlignment, ...wordAlignmentOverride };
|
|
50
|
+
const built = await this.buildPositionedWordSubtreeHtml(style, seg, positioned, t, indexInSection, wordAlignment, positionedInlineStyles, nextUid);
|
|
51
|
+
html += built.html;
|
|
52
|
+
defs += built.defs;
|
|
53
|
+
}
|
|
54
|
+
for (const positioned of decomposition.positionedDecorations) {
|
|
55
|
+
const decorationAlignmentOverride = style.wordOverrides.get(positioned.decoration.id)?.alignment;
|
|
56
|
+
const decorationAlignment = { ...segmentAlignment, ...decorationAlignmentOverride };
|
|
57
|
+
const built = await this.buildPositionedDecorationSubtreeHtml(style, seg, positioned, t, indexInSection, decorationAlignment, positionedInlineStyles, nextUid);
|
|
58
|
+
html += built.html;
|
|
59
|
+
defs += built.defs;
|
|
60
|
+
}
|
|
61
|
+
return { html, defs };
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* The positioned siblings pin an element at its own explicit anchor,
|
|
65
|
+
* so the text-behind-actor state variables stay off their wrapper —
|
|
66
|
+
* a style rule reacting to the state (e.g. a lift) would displace
|
|
67
|
+
* the element from the exact spot it was pinned to.
|
|
68
|
+
*/
|
|
69
|
+
withoutBehindActorState(styles) {
|
|
70
|
+
if (!(CssVariable.BEHIND_ACTOR_SCENE_VALID in styles) && !(CssVariable.BEHIND_ACTOR_FORCED in styles)) {
|
|
71
|
+
return styles;
|
|
72
|
+
}
|
|
73
|
+
const rest = {};
|
|
74
|
+
for (const [key, value] of Object.entries(styles)) {
|
|
75
|
+
if (key === CssVariable.BEHIND_ACTOR_SCENE_VALID || key === CssVariable.BEHIND_ACTOR_FORCED)
|
|
76
|
+
continue;
|
|
77
|
+
rest[key] = value;
|
|
78
|
+
}
|
|
79
|
+
return rest;
|
|
80
|
+
}
|
|
81
|
+
async buildSegmentSubtreeHtml(style, seg, t, indexInSection, alignment, baseInlineStyles, excludedWordIds, nextUid) {
|
|
82
|
+
const resolved = this.resolveAlignment(alignment);
|
|
83
|
+
const engineVars = await this.videoFrameVarsBuilder.build(style, seg, resolved, t);
|
|
84
|
+
const { defs, bindings } = this.filterMaterializer.materialize(style, t, engineVars, nextUid);
|
|
85
|
+
const styleInput = this.composeStyleInput(style, this.mergeExtras(engineVars, bindings, baseInlineStyles));
|
|
86
|
+
const subtreeHtml = this.subtreeBuilder.buildSegmentSubtree(styleInput, seg, t, excludedWordIds, indexInSection);
|
|
87
|
+
const anchorStyle = this.composeAnchorStyle(resolved);
|
|
88
|
+
return { html: `<div style="${anchorStyle}">${subtreeHtml}</div>`, defs };
|
|
89
|
+
}
|
|
90
|
+
async buildPositionedWordSubtreeHtml(style, seg, positioned, t, indexInSection, alignment, baseInlineStyles, nextUid) {
|
|
91
|
+
const resolved = this.resolveAlignment(alignment);
|
|
92
|
+
const engineVars = await this.videoFrameVarsBuilder.build(style, seg, resolved, t);
|
|
93
|
+
const { defs, bindings } = this.filterMaterializer.materialize(style, t, engineVars, nextUid);
|
|
94
|
+
const styleInput = this.composeStyleInput(style, this.mergeExtras(engineVars, bindings, baseInlineStyles));
|
|
95
|
+
const subtreeHtml = this.subtreeBuilder.buildSingleWordSubtree(styleInput, seg, positioned.line, positioned.word, t, indexInSection, positioned.indexInLine);
|
|
96
|
+
const anchorStyle = this.composeAnchorStyle(resolved);
|
|
97
|
+
return { html: `<div style="${anchorStyle}">${subtreeHtml}</div>`, defs };
|
|
98
|
+
}
|
|
99
|
+
async buildPositionedDecorationSubtreeHtml(style, seg, positioned, t, indexInSection, alignment, baseInlineStyles, nextUid) {
|
|
100
|
+
const resolved = this.resolveAlignment(alignment);
|
|
101
|
+
const engineVars = await this.videoFrameVarsBuilder.build(style, seg, resolved, t);
|
|
102
|
+
const { defs, bindings } = this.filterMaterializer.materialize(style, t, engineVars, nextUid);
|
|
103
|
+
const styleInput = this.composeStyleInput(style, this.mergeExtras(engineVars, bindings, baseInlineStyles));
|
|
104
|
+
const subtreeHtml = this.subtreeBuilder.buildSingleDecorationSubtree(styleInput, seg, positioned.line, positioned.word, t, indexInSection);
|
|
105
|
+
const anchorStyle = this.composeAnchorStyle(resolved);
|
|
106
|
+
return { html: `<div style="${anchorStyle}">${subtreeHtml}</div>`, defs };
|
|
107
|
+
}
|
|
108
|
+
// Zero-sized grid anchor places the wrapper via `place-items`
|
|
109
|
+
// so the wrapper stays transform-free and doesn't form a
|
|
110
|
+
// stacking context (which would trap descendant
|
|
111
|
+
// `mix-blend-mode` away from the layer).
|
|
112
|
+
composeAnchorStyle(resolved) {
|
|
113
|
+
return `position: absolute; top: ${resolved.yPx}px; left: ${resolved.xPx}px; width: 0; height: 0; display: grid; grid-template: 0 / 0; align-items: ${resolved.vGridAlign}; justify-items: ${resolved.hGridAlign};`;
|
|
114
|
+
}
|
|
115
|
+
composeStyleInput(style, extraWrapperStyles) {
|
|
116
|
+
return {
|
|
117
|
+
scopeClass: style.scopeClass,
|
|
118
|
+
baseInlineStyles: style.inlineStyles,
|
|
119
|
+
wordOverrides: style.wordOverrides,
|
|
120
|
+
splitWordsIntoLetters: style.rendering.splitWordsIntoLetters,
|
|
121
|
+
includeVideoFrameLayer: style.rendering.videoFrame.required,
|
|
122
|
+
extraWrapperStyles,
|
|
123
|
+
decorationPlacements: style.decorationPlacements,
|
|
124
|
+
inlineStyleEmitter: style.inlineStyleEmitter,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
mergeExtras(engineVars, bindings, baseInlineStyles) {
|
|
128
|
+
return { ...baseInlineStyles, ...engineVars, ...Object.fromEntries(bindings) };
|
|
129
|
+
}
|
|
130
|
+
resolveAlignment(alignment) {
|
|
131
|
+
return {
|
|
132
|
+
yPx: Math.round(alignment.verticalOffset * this.height),
|
|
133
|
+
xPx: Math.round(alignment.horizontalOffset * this.width),
|
|
134
|
+
vAnchorPct: alignment.verticalAlign === 'top' ? 0 : alignment.verticalAlign === 'center' ? 50 : 100,
|
|
135
|
+
hAnchorPct: alignment.horizontalAlign === 'left' ? 0 : alignment.horizontalAlign === 'center' ? 50 : 100,
|
|
136
|
+
vGridAlign: alignment.verticalAlign === 'top' ? 'start' : alignment.verticalAlign === 'center' ? 'center' : 'end',
|
|
137
|
+
hGridAlign: alignment.horizontalAlign === 'left' ? 'start' : alignment.horizontalAlign === 'center' ? 'center' : 'end',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=SegmentWrapperRenderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SegmentWrapperRenderer.js","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SegmentWrapperRenderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { SubtitleFrame } from '../../rendering/SubtitleFrameRenderer';
|
|
2
|
+
import type { PreparedStyle } from '../../rendering/subtitle/PreparedStyle';
|
|
3
|
+
import type { BaselineCssComposer } from '../../rendering/styles/BaselineCssComposer';
|
|
4
|
+
import type { SegmentWrapperRenderer } from '../../rendering/subtitle/SegmentWrapperRenderer';
|
|
5
|
+
import type { AssetGroup, TileAssignment } from '../../rendering/subtitle/BatchPlan';
|
|
6
|
+
/**
|
|
7
|
+
* Composes a sprite sheet per asset group: stacks unique tiles along
|
|
8
|
+
* the smaller dimension axis, emits the SVG holding one
|
|
9
|
+
* `foreignObject` per tile, decodes it through an `<img>` so the
|
|
10
|
+
* bitmap paints into any 2D context without tainting the canvas,
|
|
11
|
+
* and produces draw callbacks that slice the sheet by tile index.
|
|
12
|
+
*/
|
|
13
|
+
export declare class SpriteSheetCompositor {
|
|
14
|
+
private readonly styles;
|
|
15
|
+
private readonly wrapperRenderer;
|
|
16
|
+
private readonly baselineCssComposer;
|
|
17
|
+
private readonly width;
|
|
18
|
+
private readonly height;
|
|
19
|
+
constructor(styles: Readonly<Record<string, PreparedStyle>>, wrapperRenderer: SegmentWrapperRenderer, baselineCssComposer: BaselineCssComposer, width: number, height: number);
|
|
20
|
+
renderGroups(groups: ReadonlyMap<string, AssetGroup>): Promise<Map<string, HTMLImageElement>>;
|
|
21
|
+
buildFrames(assignments: ReadonlyArray<TileAssignment | null>, sprites: ReadonlyMap<string, HTMLImageElement>): Array<SubtitleFrame | null>;
|
|
22
|
+
private renderSpriteSheet;
|
|
23
|
+
/**
|
|
24
|
+
* Wraps the stylesheet in a `<![CDATA[...]]>` section so the XML
|
|
25
|
+
* parser that decodes the data-URL SVG ignores any `<` / `>` inside
|
|
26
|
+
* CSS string values (e.g. `@property syntax: '<integer>'`) instead
|
|
27
|
+
* of treating them as malformed tags. `]]>` inside the CSS would
|
|
28
|
+
* close the CDATA early — splitting around it terminates and
|
|
29
|
+
* re-opens the section cleanly. */
|
|
30
|
+
private composeStyleBlock;
|
|
31
|
+
private buildTileHtml;
|
|
32
|
+
private composeBaselineCssForKinds;
|
|
33
|
+
private collectActiveKinds;
|
|
34
|
+
private joinByKind;
|
|
35
|
+
private decodeSvg;
|
|
36
|
+
/**
|
|
37
|
+
* Re-parses the SVG through `DOMParser` to recover the XML-level
|
|
38
|
+
* error message browsers hide behind the opaque "source image cannot
|
|
39
|
+
* be decoded" image-decode failure. Returns the parser's error
|
|
40
|
+
* description, or `null` when the SVG parses cleanly (in which case
|
|
41
|
+
* the decode failed for a different reason — font loading, security,
|
|
42
|
+
* raster size cap, etc.).
|
|
43
|
+
*/
|
|
44
|
+
private extractXmlParseError;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=SpriteSheetCompositor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpriteSheetCompositor.d.ts","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SpriteSheetCompositor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+CAA+C,CAAC;AACzF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oDAAoD,CAAC;AACjG,OAAO,KAAK,EAAE,UAAU,EAAc,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAOpG;;;;;;GAMG;AACH,qBAAa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAJN,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,EAC/C,eAAe,EAAE,sBAAsB,EACvC,mBAAmB,EAAE,mBAAmB,EACxC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM;IAG3B,YAAY,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IASnG,WAAW,CACT,WAAW,EAAE,aAAa,CAAC,cAAc,GAAG,IAAI,CAAC,EACjD,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GAC7C,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;YAchB,iBAAiB;IAqB/B;;;;;;uCAMmC;IACnC,OAAO,CAAC,iBAAiB;YAKX,aAAa;IAiB3B,OAAO,CAAC,0BAA0B;IAKlC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,UAAU;YAIJ,SAAS;IA0BvB;;;;;;;OAOG;IACH,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composes a sprite sheet per asset group: stacks unique tiles along
|
|
3
|
+
* the smaller dimension axis, emits the SVG holding one
|
|
4
|
+
* `foreignObject` per tile, decodes it through an `<img>` so the
|
|
5
|
+
* bitmap paints into any 2D context without tainting the canvas,
|
|
6
|
+
* and produces draw callbacks that slice the sheet by tile index.
|
|
7
|
+
*/
|
|
8
|
+
export class SpriteSheetCompositor {
|
|
9
|
+
styles;
|
|
10
|
+
wrapperRenderer;
|
|
11
|
+
baselineCssComposer;
|
|
12
|
+
width;
|
|
13
|
+
height;
|
|
14
|
+
constructor(styles, wrapperRenderer, baselineCssComposer, width, height) {
|
|
15
|
+
this.styles = styles;
|
|
16
|
+
this.wrapperRenderer = wrapperRenderer;
|
|
17
|
+
this.baselineCssComposer = baselineCssComposer;
|
|
18
|
+
this.width = width;
|
|
19
|
+
this.height = height;
|
|
20
|
+
}
|
|
21
|
+
async renderGroups(groups) {
|
|
22
|
+
const sprites = new Map();
|
|
23
|
+
for (const group of groups.values()) {
|
|
24
|
+
const img = await this.renderSpriteSheet(group.uniqueTiles);
|
|
25
|
+
sprites.set(group.assetKey, img);
|
|
26
|
+
}
|
|
27
|
+
return sprites;
|
|
28
|
+
}
|
|
29
|
+
buildFrames(assignments, sprites) {
|
|
30
|
+
const isPortrait = this.width < this.height;
|
|
31
|
+
return assignments.map((assn) => {
|
|
32
|
+
if (!assn)
|
|
33
|
+
return null;
|
|
34
|
+
const img = sprites.get(assn.assetKey);
|
|
35
|
+
const sx = isPortrait ? assn.tileIndex * this.width : 0;
|
|
36
|
+
const sy = isPortrait ? 0 : assn.tileIndex * this.height;
|
|
37
|
+
return {
|
|
38
|
+
draw: (ctx, dx, dy, dw, dh) => ctx.drawImage(img, sx, sy, this.width, this.height, dx, dy, dw, dh),
|
|
39
|
+
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async renderSpriteSheet(tiles) {
|
|
43
|
+
const isPortrait = this.width < this.height;
|
|
44
|
+
const sheetW = isPortrait ? tiles.length * this.width : this.width;
|
|
45
|
+
const sheetH = isPortrait ? this.height : tiles.length * this.height;
|
|
46
|
+
let itemUid = 0;
|
|
47
|
+
const tileResults = await Promise.all(tiles.map((tile, i) => this.buildTileHtml(tile, i, isPortrait, () => itemUid++)));
|
|
48
|
+
const tilesHtml = tileResults.map((r) => r.html).join('');
|
|
49
|
+
const filterDefs = tileResults.map((r) => r.defs).filter(Boolean).join('');
|
|
50
|
+
const activeKinds = this.collectActiveKinds(tiles);
|
|
51
|
+
const sectionCss = this.joinByKind(activeKinds, (style) => style.scopedCss);
|
|
52
|
+
const baselineCss = this.composeBaselineCssForKinds(activeKinds);
|
|
53
|
+
const defsBlock = filterDefs ? `<defs>${filterDefs}</defs>` : '';
|
|
54
|
+
const styleBlock = this.composeStyleBlock(baselineCss + sectionCss);
|
|
55
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${sheetW}" height="${sheetH}">${defsBlock}${styleBlock}${tilesHtml}</svg>`;
|
|
56
|
+
return this.decodeSvg(svg, tiles, sheetW, sheetH);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Wraps the stylesheet in a `<![CDATA[...]]>` section so the XML
|
|
60
|
+
* parser that decodes the data-URL SVG ignores any `<` / `>` inside
|
|
61
|
+
* CSS string values (e.g. `@property syntax: '<integer>'`) instead
|
|
62
|
+
* of treating them as malformed tags. `]]>` inside the CSS would
|
|
63
|
+
* close the CDATA early — splitting around it terminates and
|
|
64
|
+
* re-opens the section cleanly. */
|
|
65
|
+
composeStyleBlock(css) {
|
|
66
|
+
const safe = css.split(']]>').join(']]]]><![CDATA[>');
|
|
67
|
+
return `<style><![CDATA[${safe}]]></style>`;
|
|
68
|
+
}
|
|
69
|
+
async buildTileHtml(tile, i, isPortrait, nextUid) {
|
|
70
|
+
const tx = isPortrait ? i * this.width : 0;
|
|
71
|
+
const ty = isPortrait ? 0 : i * this.height;
|
|
72
|
+
const wrapperResults = await Promise.all(tile.items.map(({ style, seg, t, indexInSection }) => this.wrapperRenderer.buildWrapperHtml(style, seg, t, indexInSection, nextUid)));
|
|
73
|
+
const wrappers = wrapperResults.map((r) => r.html).join('');
|
|
74
|
+
const defs = wrapperResults.map((r) => r.defs).filter(Boolean).join('');
|
|
75
|
+
const html = `<foreignObject x="${tx}" y="${ty}" width="${this.width}" height="${this.height}"><div xmlns="http://www.w3.org/1999/xhtml" style="position:relative;width:${this.width}px;height:${this.height}px;overflow:hidden;container-type:size;">${wrappers}</div></foreignObject>`;
|
|
76
|
+
return { html, defs };
|
|
77
|
+
}
|
|
78
|
+
composeBaselineCssForKinds(kinds) {
|
|
79
|
+
const perStyle = [...kinds].map((kind) => this.styles[kind].baselineNeeds);
|
|
80
|
+
return this.baselineCssComposer.composeUnion(perStyle);
|
|
81
|
+
}
|
|
82
|
+
collectActiveKinds(tiles) {
|
|
83
|
+
const kinds = new Set();
|
|
84
|
+
for (const tile of tiles)
|
|
85
|
+
for (const item of tile.items)
|
|
86
|
+
kinds.add(item.style.kind);
|
|
87
|
+
return kinds;
|
|
88
|
+
}
|
|
89
|
+
joinByKind(kinds, pick) {
|
|
90
|
+
return [...kinds].map((kind) => pick(this.styles[kind])).filter(Boolean).join('\n');
|
|
91
|
+
}
|
|
92
|
+
async decodeSvg(svg, tiles, sheetW, sheetH) {
|
|
93
|
+
const img = new Image();
|
|
94
|
+
img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
95
|
+
// `onload` can fire before custom fonts have finished applying,
|
|
96
|
+
// producing visually-laggy captures with foreignObject + @font-face.
|
|
97
|
+
// `decode()` only resolves once the image is fully paint-ready.
|
|
98
|
+
try {
|
|
99
|
+
await img.decode();
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
const kinds = new Set();
|
|
103
|
+
for (const tile of tiles)
|
|
104
|
+
for (const item of tile.items)
|
|
105
|
+
kinds.add(item.style.kind);
|
|
106
|
+
console.error('[tscaps] subtitle SVG decode failed', {
|
|
107
|
+
error: e instanceof Error ? e.message : String(e),
|
|
108
|
+
xmlParseError: this.extractXmlParseError(svg),
|
|
109
|
+
kinds: [...kinds],
|
|
110
|
+
tiles: tiles.length,
|
|
111
|
+
sheetW,
|
|
112
|
+
sheetH,
|
|
113
|
+
svgLength: svg.length,
|
|
114
|
+
svgHead: svg.slice(0, 400),
|
|
115
|
+
});
|
|
116
|
+
throw new Error(`Subtitle render failed: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
117
|
+
}
|
|
118
|
+
return img;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Re-parses the SVG through `DOMParser` to recover the XML-level
|
|
122
|
+
* error message browsers hide behind the opaque "source image cannot
|
|
123
|
+
* be decoded" image-decode failure. Returns the parser's error
|
|
124
|
+
* description, or `null` when the SVG parses cleanly (in which case
|
|
125
|
+
* the decode failed for a different reason — font loading, security,
|
|
126
|
+
* raster size cap, etc.).
|
|
127
|
+
*/
|
|
128
|
+
extractXmlParseError(svg) {
|
|
129
|
+
const parsed = new DOMParser().parseFromString(svg, 'image/svg+xml');
|
|
130
|
+
const parseError = parsed.querySelector('parsererror');
|
|
131
|
+
return parseError ? parseError.textContent ?? 'unknown XML parse error' : null;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=SpriteSheetCompositor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpriteSheetCompositor.js","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SpriteSheetCompositor.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,OAAO,qBAAqB;IAGb;IACA;IACA;IACA;IACA;IALnB,YACmB,MAA+C,EAC/C,eAAuC,EACvC,mBAAwC,EACxC,KAAa,EACb,MAAc;QAJd,WAAM,GAAN,MAAM,CAAyC;QAC/C,oBAAe,GAAf,eAAe,CAAwB;QACvC,wBAAmB,GAAnB,mBAAmB,CAAqB;QACxC,UAAK,GAAL,KAAK,CAAQ;QACb,WAAM,GAAN,MAAM,CAAQ;IAC9B,CAAC;IAEJ,KAAK,CAAC,YAAY,CAAC,MAAuC;QACxD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CACT,WAAiD,EACjD,OAA8C;QAE9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5C,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC;YACvB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC;YACxC,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACxD,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;YACzD,OAAO;gBACL,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;aACtE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,KAAgC;QAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QACnE,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAErE,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CACjF,CAAC;QACF,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1D,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3E,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,SAAS,UAAU,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,GAAG,UAAU,CAAC,CAAC;QACpE,MAAM,GAAG,GAAG,kDAAkD,MAAM,aAAa,MAAM,KAAK,SAAS,GAAG,UAAU,GAAG,SAAS,QAAQ,CAAC;QACvI,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;;;;;uCAMmC;IAC3B,iBAAiB,CAAC,GAAW;QACnC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,OAAO,mBAAmB,IAAI,aAAa,CAAC;IAC9C,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,IAAgB,EAChB,CAAS,EACT,UAAmB,EACnB,OAAqB;QAErB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5C,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CACtC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CACrI,CAAC;QACF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,MAAM,IAAI,GAAG,qBAAqB,EAAE,QAAQ,EAAE,YAAY,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,8EAA8E,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,MAAM,4CAA4C,QAAQ,wBAAwB,CAAC;QACzR,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxB,CAAC;IAEO,0BAA0B,CAAC,KAA0B;QAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,aAAa,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAEO,kBAAkB,CAAC,KAAgC;QACzD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;gBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,UAAU,CAAC,KAA0B,EAAE,IAAsC;QACnF,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvF,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,KAAgC,EAAE,MAAc,EAAE,MAAc;QACnG,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,GAAG,oCAAoC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,gEAAgE;QAChE,qEAAqE;QACrE,gEAAgE;QAChE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACrB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;oBAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACpF,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE;gBACnD,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;gBACjD,aAAa,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBAC7C,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;gBACjB,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,MAAM;gBACN,MAAM;gBACN,SAAS,EAAE,GAAG,CAAC,MAAM;gBACrB,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;aAC3B,CAAC,CAAC;YACH,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;;;OAOG;IACK,oBAAoB,CAAC,GAAW;QACtC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACvD,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,IAAI,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC;IACjF,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Empirically probes the maximum number of subtitle tiles that fit
|
|
3
|
+
* into a single sprite sheet at the given output dimensions without
|
|
4
|
+
* blowing past the host's 2D-canvas raster cap or the configured
|
|
5
|
+
* pixel budget. No public browser API surfaces the raster cap
|
|
6
|
+
* directly, and the reported WebGL limits bear no stable relation to
|
|
7
|
+
* what `img.decode` / `drawImage` accept. Some hosts decode oversize
|
|
8
|
+
* SVGs but blank the far edges of the raster; the probe reads back a
|
|
9
|
+
* corner pixel to detect that.
|
|
10
|
+
*/
|
|
11
|
+
export declare class SpriteSheetSizeProber {
|
|
12
|
+
private readonly maxBufferPixels;
|
|
13
|
+
constructor(maxBufferPixels?: number);
|
|
14
|
+
probe(width: number, height: number): Promise<number>;
|
|
15
|
+
private testTileSize;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SpriteSheetSizeProber.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpriteSheetSizeProber.d.ts","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SpriteSheetSizeProber.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAEpB,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,GAAE,MAAkC;IAE1E,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAiB7C,YAAY;CAgB3B"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const NUMBER_OF_TILES_TO_TEST = [1, 2, 4, 6, 8, 10, 12, 15, 18, 21, 25, 30];
|
|
2
|
+
// 10 frames at 1080×1920 ≈ 80 MB of pixel buffer.
|
|
3
|
+
// At 4K the same budget admits only ~2 tiles per batch.
|
|
4
|
+
const DEFAULT_MAX_BUFFER_PIXELS = 10 * 1080 * 1920;
|
|
5
|
+
/**
|
|
6
|
+
* Empirically probes the maximum number of subtitle tiles that fit
|
|
7
|
+
* into a single sprite sheet at the given output dimensions without
|
|
8
|
+
* blowing past the host's 2D-canvas raster cap or the configured
|
|
9
|
+
* pixel budget. No public browser API surfaces the raster cap
|
|
10
|
+
* directly, and the reported WebGL limits bear no stable relation to
|
|
11
|
+
* what `img.decode` / `drawImage` accept. Some hosts decode oversize
|
|
12
|
+
* SVGs but blank the far edges of the raster; the probe reads back a
|
|
13
|
+
* corner pixel to detect that.
|
|
14
|
+
*/
|
|
15
|
+
export class SpriteSheetSizeProber {
|
|
16
|
+
maxBufferPixels;
|
|
17
|
+
constructor(maxBufferPixels = DEFAULT_MAX_BUFFER_PIXELS) {
|
|
18
|
+
this.maxBufferPixels = maxBufferPixels;
|
|
19
|
+
}
|
|
20
|
+
async probe(width, height) {
|
|
21
|
+
try {
|
|
22
|
+
let lastPassing = 1;
|
|
23
|
+
for (const numberOfTiles of NUMBER_OF_TILES_TO_TEST) {
|
|
24
|
+
const isPortrait = width < height;
|
|
25
|
+
const scaledWidth = isPortrait ? width * numberOfTiles : width;
|
|
26
|
+
const scaledHeight = isPortrait ? height : height * numberOfTiles;
|
|
27
|
+
if (scaledWidth * scaledHeight > this.maxBufferPixels)
|
|
28
|
+
return lastPassing;
|
|
29
|
+
if (!(await this.testTileSize(scaledWidth, scaledHeight)))
|
|
30
|
+
return lastPassing;
|
|
31
|
+
lastPassing = numberOfTiles;
|
|
32
|
+
}
|
|
33
|
+
return lastPassing;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return 1;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async testTileSize(width, height) {
|
|
40
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}"><rect width="100%" height="100%" fill="green"/><rect x="${width - 2}" y="${height - 2}" width="2" height="2" fill="red"/></svg>`;
|
|
41
|
+
const img = new Image();
|
|
42
|
+
img.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
43
|
+
try {
|
|
44
|
+
await img.decode();
|
|
45
|
+
const canvas = new OffscreenCanvas(width, height);
|
|
46
|
+
const ctx = canvas.getContext('2d');
|
|
47
|
+
if (!ctx)
|
|
48
|
+
return false;
|
|
49
|
+
ctx.drawImage(img, 0, 0);
|
|
50
|
+
const px = ctx.getImageData(width - 1, height - 1, 1, 1).data;
|
|
51
|
+
return px[0] > 200 && px[1] < 80 && px[2] < 80 && px[3] > 200;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=SpriteSheetSizeProber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpriteSheetSizeProber.js","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SpriteSheetSizeProber.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAE5E,kDAAkD;AAClD,wDAAwD;AACxD,MAAM,yBAAyB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnD;;;;;;;;;GASG;AACH,MAAM,OAAO,qBAAqB;IAEH;IAA7B,YAA6B,kBAA0B,yBAAyB;QAAnD,oBAAe,GAAf,eAAe,CAAoC;IAAG,CAAC;IAEpF,KAAK,CAAC,KAAK,CAAC,KAAa,EAAE,MAAc;QACvC,IAAI,CAAC;YACH,IAAI,WAAW,GAAG,CAAC,CAAC;YACpB,KAAK,MAAM,aAAa,IAAI,uBAAuB,EAAE,CAAC;gBACpD,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;gBAClC,MAAM,WAAW,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC;gBAC/D,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,aAAa,CAAC;gBAClE,IAAI,WAAW,GAAG,YAAY,GAAG,IAAI,CAAC,eAAe;oBAAE,OAAO,WAAW,CAAC;gBAC1E,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;oBAAE,OAAO,WAAW,CAAC;gBAC9E,WAAW,GAAG,aAAa,CAAC;YAC9B,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAAc;QACtD,MAAM,GAAG,GAAG,kDAAkD,KAAK,aAAa,MAAM,6DAA6D,KAAK,GAAG,CAAC,QAAQ,MAAM,GAAG,CAAC,2CAA2C,CAAC;QAC1N,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,GAAG,CAAC,GAAG,GAAG,oCAAoC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;QACxE,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,GAAG;gBAAE,OAAO,KAAK,CAAC;YACvB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,MAAM,EAAE,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,OAAO,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAE,GAAG,GAAG,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { InlineStyleMap } from '../../rendering/types/InlineStyleMap';
|
|
2
|
+
import type { SvgFilterScoper } from '../../svg-filter/SvgFilterScoper';
|
|
3
|
+
import type { SvgFilterLengthResolver } from '../../svg-filter/SvgFilterLengthResolver';
|
|
4
|
+
import type { PreparedStyle } from '../../rendering/subtitle/PreparedStyle';
|
|
5
|
+
export interface FilterMaterialization {
|
|
6
|
+
defs: string;
|
|
7
|
+
bindings: ReadonlyMap<string, string>;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Materializes the SVG `<filter>` defs declared by a style's filter
|
|
11
|
+
* bundle for one render tile. Resolves each filter's length units
|
|
12
|
+
* against the render-surface pixel factors, layers the engine-
|
|
13
|
+
* injected vars onto the consumer's scope, and rebinds local ids to
|
|
14
|
+
* scope-unique ids so two tiles using the same source filter don't
|
|
15
|
+
* collide in the sprite-sheet SVG.
|
|
16
|
+
*
|
|
17
|
+
* Returns empty defs and empty bindings when the style declares no
|
|
18
|
+
* filters.
|
|
19
|
+
*/
|
|
20
|
+
export declare class SvgFilterMaterializer {
|
|
21
|
+
private readonly svgFilterScoper;
|
|
22
|
+
private readonly svgFilterLengthResolver;
|
|
23
|
+
private readonly renderHeightPx;
|
|
24
|
+
constructor(svgFilterScoper: SvgFilterScoper, svgFilterLengthResolver: SvgFilterLengthResolver, renderHeightPx: number);
|
|
25
|
+
materialize(style: PreparedStyle, t: number, engineVars: InlineStyleMap, nextUid: () => number): FilterMaterialization;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=SvgFilterMaterializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SvgFilterMaterializer.d.ts","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SvgFilterMaterializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,uBAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAFd,eAAe,EAAE,eAAe,EAChC,uBAAuB,EAAE,uBAAuB,EAChD,cAAc,EAAE,MAAM;IAGzC,WAAW,CACT,KAAK,EAAE,aAAa,EACpB,CAAC,EAAE,MAAM,EACT,UAAU,EAAE,cAAc,EAC1B,OAAO,EAAE,MAAM,MAAM,GACpB,qBAAqB;CAmBzB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { SvgFilterScope } from '../../svg-filter/SvgFilterScope';
|
|
2
|
+
/**
|
|
3
|
+
* Materializes the SVG `<filter>` defs declared by a style's filter
|
|
4
|
+
* bundle for one render tile. Resolves each filter's length units
|
|
5
|
+
* against the render-surface pixel factors, layers the engine-
|
|
6
|
+
* injected vars onto the consumer's scope, and rebinds local ids to
|
|
7
|
+
* scope-unique ids so two tiles using the same source filter don't
|
|
8
|
+
* collide in the sprite-sheet SVG.
|
|
9
|
+
*
|
|
10
|
+
* Returns empty defs and empty bindings when the style declares no
|
|
11
|
+
* filters.
|
|
12
|
+
*/
|
|
13
|
+
export class SvgFilterMaterializer {
|
|
14
|
+
svgFilterScoper;
|
|
15
|
+
svgFilterLengthResolver;
|
|
16
|
+
renderHeightPx;
|
|
17
|
+
constructor(svgFilterScoper, svgFilterLengthResolver, renderHeightPx) {
|
|
18
|
+
this.svgFilterScoper = svgFilterScoper;
|
|
19
|
+
this.svgFilterLengthResolver = svgFilterLengthResolver;
|
|
20
|
+
this.renderHeightPx = renderHeightPx;
|
|
21
|
+
}
|
|
22
|
+
materialize(style, t, engineVars, nextUid) {
|
|
23
|
+
const definitions = style.filters.definitions;
|
|
24
|
+
if (definitions.isEmpty())
|
|
25
|
+
return { defs: '', bindings: new Map() };
|
|
26
|
+
const context = { currentTime: t, renderHeightPx: this.renderHeightPx };
|
|
27
|
+
const consumerScope = style.filters.scopeProvider.scopeAt(context);
|
|
28
|
+
const scope = consumerScope.with(SvgFilterScope.fromEntries(Object.entries(engineVars)));
|
|
29
|
+
const lengthFactors = style.filters.scopeProvider.lengthFactorsAt(context);
|
|
30
|
+
const { idByLocal, bindings } = this.svgFilterScoper.scopeIds(definitions.ids, `${style.scopeClass}-${nextUid()}`);
|
|
31
|
+
const defs = definitions.filters
|
|
32
|
+
.map((filter) => {
|
|
33
|
+
const body = this.svgFilterLengthResolver.resolve(filter.materialize(scope), lengthFactors);
|
|
34
|
+
return `<filter id="${idByLocal.get(filter.id)}">${body}</filter>`;
|
|
35
|
+
})
|
|
36
|
+
.join('');
|
|
37
|
+
return { defs, bindings };
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=SvgFilterMaterializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SvgFilterMaterializer.js","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/SvgFilterMaterializer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAUpE;;;;;;;;;;GAUG;AACH,MAAM,OAAO,qBAAqB;IAGb;IACA;IACA;IAHnB,YACmB,eAAgC,EAChC,uBAAgD,EAChD,cAAsB;QAFtB,oBAAe,GAAf,eAAe,CAAiB;QAChC,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,mBAAc,GAAd,cAAc,CAAQ;IACtC,CAAC;IAEJ,WAAW,CACT,KAAoB,EACpB,CAAS,EACT,UAA0B,EAC1B,OAAqB;QAErB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,IAAI,WAAW,CAAC,OAAO,EAAE;YAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC;QACxE,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACzF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAC3E,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAC3D,WAAW,CAAC,GAAG,EACf,GAAG,KAAK,CAAC,UAAU,IAAI,OAAO,EAAE,EAAE,CACnC,CAAC;QACF,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO;aAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACd,MAAM,IAAI,GAAG,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;YAC5F,OAAO,eAAe,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,IAAI,WAAW,CAAC;QACrE,CAAC,CAAC;aACD,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Segment } from '../../document/Segment';
|
|
2
|
+
import type { InlineStyleMap } from '../../rendering/types/InlineStyleMap';
|
|
3
|
+
import type { VideoFrameSource } from '../../rendering/types/VideoFrameSource';
|
|
4
|
+
import type { SegmentSubtreeHtmlBuilder } from '../../rendering/subtitle/SegmentSubtreeHtmlBuilder';
|
|
5
|
+
import type { SegmentPaintRegionResolver, SegmentAnchorPlacement } from '../../rendering/subtitle/SegmentPaintRegionResolver';
|
|
6
|
+
import type { SegmentPaintRegionCache } from '../../rendering/subtitle/SegmentPaintRegionCache';
|
|
7
|
+
import type { PreparedStyle } from '../../rendering/subtitle/PreparedStyle';
|
|
8
|
+
/**
|
|
9
|
+
* Builds the inline-style map driving the video-frame backdrop for
|
|
10
|
+
* one segment: the JPEG data URL holding the painted region of the
|
|
11
|
+
* underlying frame, plus the region's pixel size and offset within
|
|
12
|
+
* the segment's anchor box. Caches paint regions per
|
|
13
|
+
* `(kind, segmentId)` so the JPEG crop is only measured once per
|
|
14
|
+
* segment.
|
|
15
|
+
*
|
|
16
|
+
* Returns an empty map for styles that don't consume the video
|
|
17
|
+
* frame.
|
|
18
|
+
*/
|
|
19
|
+
export declare class VideoFrameVarsBuilder {
|
|
20
|
+
private readonly subtreeBuilder;
|
|
21
|
+
private readonly paintRegionResolver;
|
|
22
|
+
private readonly paintRegionCache;
|
|
23
|
+
private readonly width;
|
|
24
|
+
private readonly height;
|
|
25
|
+
private readonly videoFrameSource;
|
|
26
|
+
constructor(subtreeBuilder: SegmentSubtreeHtmlBuilder, paintRegionResolver: SegmentPaintRegionResolver, paintRegionCache: SegmentPaintRegionCache, width: number, height: number, videoFrameSource: VideoFrameSource | null);
|
|
27
|
+
build(style: PreparedStyle, seg: Segment, placement: SegmentAnchorPlacement, t: number): Promise<InlineStyleMap>;
|
|
28
|
+
/**
|
|
29
|
+
* The tight-crop optimization assumes every word stays inside the
|
|
30
|
+
* segment's in-flow bounding box. As soon as a word is
|
|
31
|
+
* repositioned outside that bbox, the same crop leaves its
|
|
32
|
+
* video-frame backdrop sampling pixels that aren't in the JPEG
|
|
33
|
+
* payload. Falling back to the full viewport for those segments
|
|
34
|
+
* restores correctness; the optimization recovers automatically
|
|
35
|
+
* the moment the override is reset.
|
|
36
|
+
*/
|
|
37
|
+
private resolvePaintRegion;
|
|
38
|
+
private measureSegmentPaintRegion;
|
|
39
|
+
private hasPositionedWord;
|
|
40
|
+
private hasPositionedDecoration;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=VideoFrameVarsBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VideoFrameVarsBuilder.d.ts","sourceRoot":"","sources":["../../../../src/modules/rendering/subtitle/VideoFrameVarsBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,2CAA2C,CAAC;AACpG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uDAAuD,CAAC;AACvG,OAAO,KAAK,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,MAAM,wDAAwD,CAAC;AACjI,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAS/E;;;;;;;;;;GAUG;AACH,qBAAa,qBAAqB;IAG9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBALhB,cAAc,EAAE,yBAAyB,EACzC,mBAAmB,EAAE,0BAA0B,EAC/C,gBAAgB,EAAE,uBAAuB,EACzC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,GAAG,IAAI;IAGtD,KAAK,CACT,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,sBAAsB,EACjC,CAAC,EAAE,MAAM,GACR,OAAO,CAAC,cAAc,CAAC;IAiB1B;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,yBAAyB;IAqCjC,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,uBAAuB;CAShC"}
|