libpag 4.5.1 → 4.5.3

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.
Files changed (81) hide show
  1. package/LICENSE.txt +1589 -0
  2. package/README.md +172 -10
  3. package/README.zh_CN.md +114 -15
  4. package/lib/libpag.cjs.js +389 -887
  5. package/lib/libpag.cjs.js.map +1 -1
  6. package/lib/libpag.esm.js +389 -887
  7. package/lib/libpag.esm.js.map +1 -1
  8. package/lib/libpag.min.js +1 -1
  9. package/lib/libpag.min.js.map +1 -1
  10. package/lib/libpag.umd.js +389 -887
  11. package/lib/libpag.umd.js.map +1 -1
  12. package/lib/libpag.wasm +0 -0
  13. package/package.json +24 -12
  14. package/src/.pag.wasm-mt.md5 +1 -0
  15. package/src/.pag.wasm.md5 +1 -1
  16. package/src/core/matrix.ts +1 -2
  17. package/src/core/video-reader.ts +73 -94
  18. package/src/interfaces.ts +8 -17
  19. package/src/pag-composition.ts +12 -5
  20. package/src/pag-file.ts +146 -129
  21. package/src/pag-font.ts +1 -3
  22. package/src/pag-image-layer.ts +1 -2
  23. package/src/pag-image.ts +1 -3
  24. package/src/pag-layer.ts +2 -3
  25. package/src/pag-player.ts +7 -6
  26. package/src/pag-solid-layer.ts +1 -2
  27. package/src/pag-surface.ts +1 -2
  28. package/src/pag-text-layer.ts +1 -2
  29. package/src/pag-view.ts +3 -14
  30. package/src/pag.ts +0 -6
  31. package/src/types.ts +46 -3
  32. package/src/utils/decorators.ts +0 -42
  33. package/src/utils/type-utils.ts +1 -9
  34. package/src/utils/ua.ts +0 -1
  35. package/src/wasm/libpag.js +1 -1
  36. package/src/wasm/libpag.wasm +0 -0
  37. package/src/wasm-mt/libpag.js +5 -5
  38. package/src/wasm-mt/libpag.wasm +0 -0
  39. package/src/wechat/pag-file.ts +1 -2
  40. package/src/wechat/pag-image.ts +0 -2
  41. package/src/wechat/pag-view.ts +1 -2
  42. package/types/third_party/tgfx/web/src/core/path-rasterizer.d.ts +4 -0
  43. package/types/third_party/tgfx/web/src/core/scaler-context.d.ts +9 -2
  44. package/types/third_party/tgfx/web/src/utils/decorators.d.ts +0 -2
  45. package/types/web/src/core/video-reader.d.ts +4 -3
  46. package/types/web/src/interfaces.d.ts +8 -15
  47. package/types/web/src/pag-composition.d.ts +4 -4
  48. package/types/web/src/pag-file.d.ts +4 -4
  49. package/types/web/src/pag-layer.d.ts +1 -1
  50. package/types/web/src/pag-player.d.ts +2 -2
  51. package/types/web/src/pag-view.d.ts +1 -1
  52. package/types/web/src/types.d.ts +13 -4
  53. package/types/web/src/utils/decorators.d.ts +0 -2
  54. package/types/web/src/utils/ua.d.ts +0 -1
  55. package/types/web/tsconfig.json +19 -0
  56. package/lib/libpag.worker.cjs.js +0 -798
  57. package/lib/libpag.worker.cjs.js.map +0 -1
  58. package/lib/libpag.worker.esm.js +0 -793
  59. package/lib/libpag.worker.esm.js.map +0 -1
  60. package/lib/libpag.worker.js +0 -804
  61. package/lib/libpag.worker.js.map +0 -1
  62. package/lib/libpag.worker.min.js +0 -2
  63. package/lib/libpag.worker.min.js.map +0 -1
  64. package/src/worker/client.ts +0 -80
  65. package/src/worker/events.ts +0 -41
  66. package/src/worker/pag-file.ts +0 -90
  67. package/src/worker/pag-image.ts +0 -43
  68. package/src/worker/pag-view.ts +0 -171
  69. package/src/worker/utils.ts +0 -29
  70. package/src/worker/video-reader.ts +0 -62
  71. package/src/worker/worker.ts +0 -169
  72. package/types/third_party/tgfx/web/src/core/web-mask.d.ts +0 -26
  73. package/types/web/src/utils/canvas.d.ts +0 -4
  74. package/types/web/src/worker/client.d.ts +0 -16
  75. package/types/web/src/worker/events.d.ts +0 -32
  76. package/types/web/src/worker/pag-file.d.ts +0 -33
  77. package/types/web/src/worker/pag-image.d.ts +0 -8
  78. package/types/web/src/worker/pag-view.d.ts +0 -67
  79. package/types/web/src/worker/utils.d.ts +0 -7
  80. package/types/web/src/worker/video-reader.d.ts +0 -16
  81. package/types/web/src/worker/worker.d.ts +0 -13
@@ -1 +0,0 @@
1
- {"version":3,"file":"libpag.worker.js","sources":["../src/worker/events.ts","../src/worker/utils.ts","../src/constant.ts","../src/utils/video-listener.ts","../src/utils/ua.ts","../src/pag-module.ts","../../third_party/tgfx/web/src/core/bitmap-image.ts","../src/worker/video-reader.ts","../src/utils/type-utils.ts","../src/core/video-reader.ts","../src/utils/common.ts","../src/utils/decorators.ts","../src/worker/pag-file.ts","../src/utils/canvas.ts","../src/worker/pag-view.ts","../src/worker/pag-image.ts","../src/worker/client.ts"],"sourcesContent":["export enum WorkerMessageType {\n PAGInit = 'PAGInit',\n // PAGView static methods\n PAGView_init = 'PAGView.init',\n // PAGView instance methods\n PAGView_duration = 'PAGView.duration',\n PAGView_play = 'PAGView.play',\n PAGView_pause = 'PAGView.pause',\n PAGView_stop = 'PAGView.stop',\n PAGView_setRepeatCount = 'PAGView.setRepeatCount',\n PAGView_getProgress = 'PAGView.getProgress',\n PAGView_currentFrame = 'PAGView.currentFrame',\n PAGView_setProgress = 'PAGView.setProgress',\n PAGView_scaleMode = 'PAGView.scaleMode',\n PAGView_setScaleMode = 'PAGView.setScaleMode',\n PAGView_flush = 'PAGView.flush',\n PAGView_getDebugData = 'PAGView.getDebugData',\n PAGView_destroy = 'PAGView.destroy',\n // PAGFile static methods\n PAGFile_load = 'PAGFile.load',\n // PAGFile instance methods\n PAGFile_getTextData = 'PAGFile.getTextData',\n PAGFile_replaceText = 'PAGFile.replaceText',\n PAGFile_replaceImage = 'PAGFile.replaceImage',\n PAGFile_destroy = 'PAGFile.destroy',\n // PAGImage static methods\n PAGImage_fromSource = 'PAGImage.fromSource',\n PAGImage_destroy = 'PAGImage.destroy',\n // VideoReader static methods\n VideoReader_constructor = 'VideoReader.constructor',\n // VideoReader instance methods\n VideoReader_prepare = 'VideoReader.prepare',\n VideoReader_play = 'VideoReader.play',\n VideoReader_pause = 'VideoReader.pause',\n VideoReader_stop = 'VideoReader.stop',\n VideoReader_getError = 'VideoReader.getError',\n // Binding video reader\n PAGModule_linkVideoReader = 'PAGModule.linkVideoReader',\n // TextDocument instance methods\n TextDocument_delete = 'TextDocument.delete',\n}\n","import type { WorkerMessage } from './worker';\n\nlet messageCount = 0;\nconst generateMessageName = (name: string) => `${name}_${messageCount++}`;\n\nexport interface WorkerInterface {\n postMessage: (message: any, transfer: Transferable[]) => void;\n addEventListener: (type: string, listener: (event: MessageEvent) => void) => void;\n removeEventListener: (type: string, listener: (event: MessageEvent) => void) => void;\n}\n\nexport const postMessage = <T>(\n worker: WorkerInterface,\n message: WorkerMessage,\n callback: (...args: any[]) => T,\n transfer: (OffscreenCanvas | Transferable)[] = [],\n): Promise<T> => {\n return new Promise((resolve) => {\n const name = generateMessageName(message.name);\n const handle = (event: MessageEvent<WorkerMessage>) => {\n if (event.data.name === name) {\n worker.removeEventListener('message', handle);\n resolve(callback(...event.data.args));\n }\n };\n worker.addEventListener('message', handle);\n worker.postMessage({ name, args: message.args }, transfer);\n });\n};\n","/**\n * VideoDecode wait frame num.\n */\nexport const VIDEO_DECODE_WAIT_FRAME = 3;\n/**\n * VideoDecode seek timeout frame num.\n */\nexport const VIDEO_DECODE_SEEK_TIMEOUT_FRAME = 12;\n/**\n * NAL unit length. [ 0, 0, 0, 1 ]\n */\nexport const NALU_HEADER_LENGTH = 4;\n/**\n * Web safe font.\n */\nexport const WEB_SAFE_FONT = 'Arial';\n/**\n * Default render canvas size.\n */\nexport const DEFAULT_CANVAS_SIZE = 2560;\n/**\n * Default WebGL ContextAttributes\n */\nexport const WEBGL_CONTEXT_ATTRIBUTES = {\n depth: false,\n stencil: false,\n antialias: false,\n};\n\nexport const VIDEO_PLAYBACK_RATE_MIN = 0.125;\nexport const VIDEO_PLAYBACK_RATE_MAX = 4;\n\nexport const CANVAS_POOL_MAX_SIZE = 10;\n","type K = keyof HTMLVideoElementEventMap;\n\nlet eventHandlers: {\n [key in K]?: {\n node: HTMLVideoElement;\n handler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any;\n capture: boolean;\n }[];\n} = {};\n\nexport const addListener = (\n node: HTMLVideoElement,\n event: K,\n handler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any,\n capture = false,\n) => {\n if (!(event in eventHandlers)) {\n eventHandlers[event] = [];\n }\n eventHandlers[event]?.push({ node: node, handler: handler, capture: capture });\n node.addEventListener(event, handler, capture);\n};\n\nexport const removeListener = (\n targetNode: HTMLElement,\n event: K,\n targetHandler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any,\n) => {\n if (!(event in eventHandlers)) return;\n eventHandlers[event]\n ?.filter(({ node, handler }) => node === targetNode && handler === targetHandler)\n .forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));\n};\n\nexport const removeAllListeners = (targetNode: HTMLElement, event: K) => {\n if (!(event in eventHandlers)) return;\n eventHandlers[event]\n ?.filter(({ node }) => node === targetNode)\n .forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));\n\n eventHandlers[event] = eventHandlers[event]?.filter(({ node }) => node !== targetNode);\n};\n","const nav = navigator?.userAgent || '';\nexport const ANDROID = /android|adr/i.test(nav);\nexport const MOBILE = /(mobile)/i.test(nav) && ANDROID;\nexport const MACOS = !(/(mobile)/i.test(nav) || MOBILE) && /Mac OS X/i.test(nav);\nexport const IPHONE = /(iphone|ipad|ipod)/i.test(nav);\nexport const WECHAT = /MicroMessenger/i.test(nav);\nexport const SAFARI_OR_IOS_WEBVIEW = /^((?!chrome|android).)*safari/i.test(nav) || IPHONE;\nexport const WORKER = typeof (globalThis as any).importScripts === 'function';\n","import type { PAG } from './types';\n\nexport let PAGModule: PAG;\n\nexport const setPAGModule = (module: PAG) => {\n PAGModule = module;\n};\n\nexport const getPAGModule = () => PAGModule;\n","/////////////////////////////////////////////////////////////////////////////////////////////////\n//\n// Tencent is pleased to support the open source community by making tgfx available.\n//\n// Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n//\n// Licensed under the BSD 3-Clause License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// https://opensource.org/licenses/BSD-3-Clause\n//\n// unless required by applicable law or agreed to in writing, software distributed under the\n// license is distributed on an \"as is\" basis, without warranties or conditions of any kind,\n// either express or implied. see the license for the specific language governing permissions\n// and limitations under the license.\n//\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport class BitmapImage {\n public bitmap: ImageBitmap | null;\n\n public constructor(bitmap: ImageBitmap | null) {\n this.bitmap = bitmap;\n }\n\n public setBitmap(bitmap: ImageBitmap) {\n if (this.bitmap) {\n this.bitmap.close();\n }\n this.bitmap = bitmap;\n }\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\n\nimport { BitmapImage } from '@tgfx/core/bitmap-image';\n\nexport class WorkerVideoReader {\n public bitmap: ImageBitmap | null = null;\n public isSought = false;\n public isPlaying = false;\n\n private proxyId: number;\n private bitmapImage: BitmapImage = new BitmapImage(null);\n\n public constructor(proxyId: number) {\n this.proxyId = proxyId;\n }\n\n public prepare(targetFrame: number, playbackRate: number) {\n return new Promise<void>((resolve) => {\n postMessage(\n self,\n { name: WorkerMessageType.VideoReader_prepare, args: [this.proxyId, targetFrame, playbackRate] },\n (res) => {\n this.bitmapImage.setBitmap(res);\n resolve();\n },\n );\n });\n }\n\n public getVideo() {\n return this.bitmapImage;\n }\n\n public onDestroy() {\n self.postMessage({ name: 'VideoReader.onDestroy', args: [this.proxyId] });\n }\n\n public play() {\n return new Promise<void>((resolve) => {\n postMessage(self, { name: WorkerMessageType.VideoReader_play, args: [this.proxyId] }, () => {\n resolve();\n });\n });\n }\n\n public pause() {\n postMessage(self, { name: WorkerMessageType.VideoReader_pause, args: [this.proxyId] }, () => {});\n }\n\n public stop() {\n postMessage(self, { name: WorkerMessageType.VideoReader_stop, args: [this.proxyId] }, () => {});\n }\n\n public getError() {\n return new Promise<any>((resolve) => {\n postMessage(self, { name: WorkerMessageType.VideoReader_getError, args: [this.proxyId] }, (res) => {\n resolve(res);\n });\n });\n }\n}\n","import { PAGModule } from '../pag-module';\nimport { LayerType, Vector } from '../types';\n\nimport type { PAGLayer } from '../pag-layer';\nimport type { PAGImageLayer } from '../pag-image-layer';\nimport type { PAGSolidLayer } from '../pag-solid-layer';\nimport type { PAGTextLayer } from '../pag-text-layer';\n\nconst rewindData = (fn: (...args: any[]) => any, scope: any, ...args: any[]) => {\n if (PAGModule.Asyncify.currData !== null) {\n const currData = PAGModule.Asyncify.currData;\n PAGModule.Asyncify.currData = null;\n const ret = fn.call(scope, ...args);\n PAGModule.Asyncify.currData = currData;\n return ret;\n } else {\n return fn.call(scope, ...args);\n }\n};\n\nexport const proxyVector = <T extends (...args: any) => any>(\n vector: Vector<any>,\n process: T,\n): Vector<ReturnType<T>> => {\n const proxy = new Proxy(vector, {\n get(target, property, receiver) {\n switch (property) {\n case 'get':\n return (index: number) => {\n const wasmIns = rewindData(target.get, target, index);\n return !wasmIns ? wasmIns : process(wasmIns);\n };\n case 'push_back':\n return (value: ReturnType<T>) => {\n rewindData(target.push_back, target, value.wasmIns || value);\n return undefined;\n };\n case 'size':\n return () => {\n return rewindData(target.size, target);\n };\n default:\n return Reflect.get(target, property, receiver);\n }\n },\n });\n return proxy;\n};\n\nexport const layer2typeLayer = (wasmIns: any): PAGSolidLayer | PAGTextLayer | PAGImageLayer | PAGLayer => {\n switch (rewindData(wasmIns._layerType, wasmIns)) {\n case LayerType.Solid:\n return new PAGModule.PAGSolidLayer(wasmIns);\n case LayerType.Text:\n return new PAGModule.PAGTextLayer(wasmIns);\n case LayerType.Image:\n return new PAGModule.PAGImageLayer(wasmIns);\n default:\n return new PAGModule.PAGLayer(wasmIns);\n }\n};\n\nexport const getLayerTypeName = (layerType: LayerType) => {\n switch (layerType) {\n case LayerType.Solid:\n return 'Solid';\n case LayerType.Text:\n return 'Text';\n case LayerType.Shape:\n return 'Shape';\n case LayerType.Image:\n return 'Image';\n case LayerType.PreCompose:\n return 'PreCompose';\n default:\n return 'Unknown';\n }\n};\n\nexport const getWasmIns = (value: any) => {\n if (value?.wasmIns) {\n return value.wasmIns;\n }\n return value;\n};\n\nexport const isInstanceOf = (value: any, type: any) => typeof type !== 'undefined' && value instanceof type;\n","import {\n VIDEO_DECODE_WAIT_FRAME,\n VIDEO_DECODE_SEEK_TIMEOUT_FRAME,\n VIDEO_PLAYBACK_RATE_MAX,\n VIDEO_PLAYBACK_RATE_MIN,\n} from '../constant';\nimport { addListener, removeListener, removeAllListeners } from '../utils/video-listener';\nimport { IPHONE, WECHAT, SAFARI_OR_IOS_WEBVIEW, WORKER } from '../utils/ua';\nimport { PAGModule } from '../pag-module';\nimport { WorkerMessageType } from '../worker/events';\nimport { WorkerVideoReader } from '../worker/video-reader';\nimport { postMessage } from '../worker/utils';\n\nimport type { TimeRange, VideoReader as VideoReaderInterfaces } from '../interfaces';\nimport type { PAGPlayer } from '../pag-player';\nimport { isInstanceOf } from '../utils/type-utils';\n\nconst UHD_RESOLUTION = 3840;\n\n// Get video initiated token on Wechat browser.\nconst getWechatNetwork = () => {\n return new Promise<void>((resolve) => {\n window.WeixinJSBridge.invoke(\n 'getNetworkType',\n {},\n () => {\n resolve();\n },\n () => {\n resolve();\n },\n );\n });\n};\n\nconst waitVideoCanPlay = (videoElement: HTMLVideoElement) => {\n return new Promise((resolve) => {\n const canplayHandle = () => {\n removeListener(videoElement, 'canplay', canplayHandle);\n clearTimeout(timer);\n resolve(true);\n };\n addListener(videoElement, 'canplay', canplayHandle);\n const timer = setTimeout(() => {\n removeListener(videoElement, 'canplay', canplayHandle);\n resolve(false);\n }, 1000);\n });\n};\n\nexport class VideoReader {\n public static async create(\n source: Uint8Array | HTMLVideoElement,\n width: number,\n height: number,\n frameRate: number,\n staticTimeRanges: TimeRange[],\n ): Promise<VideoReaderInterfaces> {\n if (WORKER) {\n const proxyId = await new Promise<number>((resolve) => {\n // TODO: source as HTMLVideoElement in WebWorker version.\n const uint8Array = source as Uint8Array;\n const buffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength);\n postMessage(\n self,\n {\n name: WorkerMessageType.VideoReader_constructor,\n args: [buffer, width, height, frameRate, staticTimeRanges, true],\n },\n (res) => {\n resolve(res);\n },\n [buffer],\n );\n });\n const videoReader = new WorkerVideoReader(proxyId);\n PAGModule.currentPlayer?.linkVideoReader(videoReader);\n return videoReader;\n }\n return new VideoReader(source, width, height, frameRate, staticTimeRanges);\n }\n\n public isSought = false;\n public isPlaying = false;\n public bitmap: ImageBitmap | null = null;\n\n private videoEl: HTMLVideoElement | null = null;\n private frameRate = 0;\n private canplay = false;\n private staticTimeRanges: StaticTimeRanges | null = null;\n private disablePlaybackRate = false;\n private error: any = null;\n private player: PAGPlayer | null = null;\n private width = 0;\n private height = 0;\n private bitmapCanvas: OffscreenCanvas | null = null;\n private bitmapCtx: OffscreenCanvasRenderingContext2D | null = null;\n\n public constructor(\n source: Uint8Array | HTMLVideoElement,\n width: number,\n height: number,\n frameRate: number,\n staticTimeRanges: TimeRange[],\n isWorker = false,\n ) {\n if (isInstanceOf(source, globalThis.HTMLVideoElement)) {\n this.videoEl = source as HTMLVideoElement;\n this.canplay = true;\n } else {\n this.videoEl = document.createElement('video');\n this.videoEl.style.display = 'none';\n this.videoEl.muted = true;\n this.videoEl.playsInline = true;\n this.videoEl.preload = 'auto'; // use load() will make a bug on Chrome.\n this.videoEl.width = width;\n this.videoEl.height = height;\n waitVideoCanPlay(this.videoEl).then(() => {\n this.canplay = true;\n });\n const blob = new Blob([source as Uint8Array], { type: 'video/mp4' });\n this.videoEl.src = URL.createObjectURL(blob);\n if (IPHONE) {\n // use load() will make a bug on Chrome.\n this.videoEl.load();\n }\n }\n this.frameRate = frameRate;\n this.width = width;\n this.height = height;\n this.staticTimeRanges = new StaticTimeRanges(staticTimeRanges);\n if (UHD_RESOLUTION < width || UHD_RESOLUTION < height) {\n this.disablePlaybackRate = true;\n }\n if (!isWorker) {\n this.linkPlayer(PAGModule.currentPlayer);\n }\n }\n\n public async prepare(targetFrame: number, playbackRate: number) {\n this.setError(null); // reset error\n this.isSought = false; // reset seek status\n const { currentTime } = this.videoEl!;\n const targetTime = targetFrame / this.frameRate;\n if (currentTime === 0 && targetTime === 0) {\n if (!this.canplay && !SAFARI_OR_IOS_WEBVIEW) {\n await waitVideoCanPlay(this.videoEl!);\n } else {\n try {\n await this.play();\n } catch (e) {\n this.setError(e);\n }\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n this.pause();\n resolve();\n });\n });\n }\n } else {\n if (Math.round(targetTime * this.frameRate) === Math.round(currentTime * this.frameRate)) {\n // Current frame\n } else if (this.staticTimeRanges?.contains(targetFrame)) {\n // Static frame\n await this.seek(targetTime, false);\n return;\n } else if (Math.abs(currentTime - targetTime) < (1 / this.frameRate) * VIDEO_DECODE_WAIT_FRAME) {\n // Within tolerable frame rate deviation\n } else {\n // Seek and play\n this.isSought = true;\n await this.seek(targetTime);\n return;\n }\n }\n\n const targetPlaybackRate = Math.min(Math.max(playbackRate, VIDEO_PLAYBACK_RATE_MIN), VIDEO_PLAYBACK_RATE_MAX);\n if (!this.disablePlaybackRate && this.videoEl!.playbackRate !== targetPlaybackRate) {\n this.videoEl!.playbackRate = targetPlaybackRate;\n }\n\n if (this.isPlaying && this.videoEl!.paused) {\n try {\n await this.play();\n } catch (e) {\n this.setError(e);\n }\n }\n }\n\n public getVideo() {\n return this.videoEl;\n }\n\n // Only work in web worker version\n public async generateBitmap() {\n // Batter than createImageBitmap from video element in benchmark\n if (!this.bitmapCanvas) {\n this.bitmapCanvas = new OffscreenCanvas(this.width, this.height);\n this.bitmapCanvas!.width = this.width;\n this.bitmapCanvas!.height = this.height;\n this.bitmapCtx = this.bitmapCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D | null;\n }\n this.bitmapCtx?.fillRect(0, 0, this.width, this.height);\n this.bitmapCtx?.drawImage(this.videoEl as HTMLVideoElement, 0, 0, this.width, this.height);\n this.bitmap = await createImageBitmap(this.bitmapCanvas);\n return this.bitmap;\n }\n\n public async play() {\n if (!this.videoEl!.paused) return;\n if (WECHAT && window.WeixinJSBridge) {\n await getWechatNetwork();\n }\n if (document.visibilityState !== 'visible') {\n const visibilityHandle = () => {\n if (document.visibilityState === 'visible') {\n if (this.videoEl) this.videoEl.play();\n window.removeEventListener('visibilitychange', visibilityHandle);\n }\n };\n window.addEventListener('visibilitychange', visibilityHandle);\n throw new Error('The play() request was interrupted because the document was hidden!');\n }\n await this.videoEl?.play();\n }\n\n public pause() {\n this.isPlaying = false;\n if (this.videoEl!.paused) return;\n this.videoEl?.pause();\n }\n\n public stop() {\n this.isPlaying = false;\n if (!this.videoEl!.paused) {\n this.videoEl?.pause();\n }\n this.videoEl!.currentTime = 0;\n }\n\n public getError() {\n return this.error;\n }\n\n public onDestroy() {\n if (this.player) {\n this.player.unlinkVideoReader(this);\n }\n removeAllListeners(this.videoEl!, 'playing');\n removeAllListeners(this.videoEl!, 'timeupdate');\n this.videoEl = null;\n this.bitmapCanvas = null;\n this.bitmapCtx = null;\n }\n\n private seek(targetTime: number, play = true) {\n return new Promise<void>((resolve, reject) => {\n if (!this.videoEl) {\n reject(new Error('Video element is not initialized.'));\n return;\n }\n\n const onSeeked = () => {\n removeListener(this.videoEl!, 'seeked', onSeeked);\n clearTimeout(seekTimeout);\n if (play) {\n this.videoEl?.play().catch((e) => {\n this.setError(e);\n });\n } else if (!play && !this.videoEl!.paused) {\n this.videoEl?.pause();\n }\n resolve();\n };\n \n const onCanPlay = () => {\n removeListener(this.videoEl!, 'canplay', onCanPlay);\n // Now that we have enough data, perform the seek.\n this.videoEl!.currentTime = targetTime;\n addListener(this.videoEl!, 'seeked', onSeeked);\n };\n \n const seekTimeout = setTimeout(() => {\n removeListener(this.videoEl!, 'canplay', onCanPlay);\n removeListener(this.videoEl!, 'seeked', onSeeked);\n reject(new Error('Seek operation timed out.'));\n }, (1000 / this.frameRate) * VIDEO_DECODE_SEEK_TIMEOUT_FRAME);\n \n // Check if we need to wait for 'canplay' event before seeking.\n if (this.videoEl.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n addListener(this.videoEl, 'canplay', onCanPlay);\n } else {\n // We already have enough data to perform the seek.\n this.videoEl!.currentTime = targetTime;\n addListener(this.videoEl, 'seeked', onSeeked);\n }\n });\n }\n\n private setError(e: any) {\n this.error = e;\n }\n\n private linkPlayer(player: PAGPlayer | null) {\n this.player = player;\n if (player) {\n player.linkVideoReader(this);\n }\n }\n}\n\nexport class StaticTimeRanges {\n private timeRanges: TimeRange[];\n\n public constructor(timeRanges: TimeRange[]) {\n this.timeRanges = timeRanges;\n }\n\n public contains(targetFrame: number) {\n if (this.timeRanges.length === 0) return false;\n for (let timeRange of this.timeRanges) {\n if (timeRange.start <= targetFrame && targetFrame < timeRange.end) {\n return true;\n }\n }\n return false;\n }\n}\n","import { isInstanceOf } from './type-utils';\n\nexport const readFile = (file: File) =>\n new Promise<ArrayBuffer | null>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer | null);\n };\n reader.onerror = () => {\n console.error((reader.error as DOMException).message);\n };\n reader.readAsArrayBuffer(file);\n });\n\nexport const transferToArrayBuffer = (data: File | Blob | ArrayBuffer) => {\n if (isInstanceOf(data, globalThis.File)) {\n return readFile(data as File);\n } else if (isInstanceOf(data, globalThis.Blob)) {\n return readFile(new File([data as Blob], ''));\n } else if (isInstanceOf(data, globalThis.ArrayBuffer)) {\n return Promise.resolve(data as ArrayBuffer);\n }\n return Promise.resolve(null);\n};\n\nexport const concatUint8Arrays = (arrays: Array<Uint8Array>) => {\n let totalLength = 0;\n for (const arr of arrays) {\n totalLength += arr.byteLength;\n }\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.byteLength;\n }\n return result;\n};\n","import { PAGModule } from '../pag-module';\n\nexport function wasmAwaitRewind(constructor: any) {\n const ignoreStaticFunctions = ['length', 'name', 'prototype', 'wasmAsyncMethods'];\n let staticFunctions = Object.getOwnPropertyNames(constructor).filter(\n (name) => ignoreStaticFunctions.indexOf(name) === -1,\n );\n if (constructor.wasmAsyncMethods && constructor.wasmAsyncMethods.length > 0) {\n staticFunctions = staticFunctions.filter((name) => constructor.wasmAsyncMethods.indexOf(name) === -1);\n }\n\n let functions = Object.getOwnPropertyNames(constructor.prototype).filter(\n (name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',\n );\n if (constructor.prototype.wasmAsyncMethods && constructor.prototype.wasmAsyncMethods.length > 0) {\n functions = functions.filter((name) => constructor.prototype.wasmAsyncMethods.indexOf(name) === -1);\n }\n\n const proxyFn = (target: { [prop: string]: (...args: any[]) => any }, methodName: string) => {\n const fn = target[methodName];\n target[methodName] = function (...args) {\n if (PAGModule.Asyncify.currData !== null) {\n const currData = PAGModule.Asyncify.currData;\n PAGModule.Asyncify.currData = null;\n const ret = fn.call(this, ...args);\n PAGModule.Asyncify.currData = currData;\n return ret;\n } else {\n return fn.call(this, ...args);\n }\n };\n };\n\n staticFunctions.forEach((name) => proxyFn(constructor, name));\n functions.forEach((name) => proxyFn(constructor.prototype, name));\n}\n\nexport function wasmAsyncMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n if (!target.wasmAsyncMethods) {\n target.wasmAsyncMethods = [];\n }\n target.wasmAsyncMethods.push(propertyKey);\n}\n\nexport function destroyVerify(constructor: any) {\n let functions = Object.getOwnPropertyNames(constructor.prototype).filter(\n (name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',\n );\n\n const proxyFn = (target: { [prop: string]: any }, methodName: string) => {\n const fn = target[methodName];\n target[methodName] = function (...args: any[]) {\n if (this['isDestroyed']) {\n console.error(`Don't call ${methodName} of the ${constructor.name} that is destroyed.`);\n return;\n }\n return fn.call(this, ...args);\n };\n };\n functions.forEach((name) => proxyFn(constructor.prototype, name));\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { transferToArrayBuffer } from '../utils/common';\nimport { destroyVerify } from '../utils/decorators';\n\nimport type { WorkerPAGImage } from './pag-image';\nimport type { TextDocument } from '../types';\n\n@destroyVerify\nexport class WorkerPAGFile {\n /**\n * Load pag file from file.\n */\n public static async load(worker: Worker, data: File | Blob | ArrayBuffer) {\n const buffer = await transferToArrayBuffer(data);\n if (!buffer)\n throw new Error(\n 'Initialize PAGFile data type error, please put check data type must to be File | Blob | ArrayBuffer!',\n );\n return await postMessage(\n worker,\n { name: WorkerMessageType.PAGFile_load, args: [data] },\n (key) => new WorkerPAGFile(worker, key),\n );\n }\n\n public key: number;\n public worker: Worker;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n /**\n * Get a text data of the specified index. The index ranges from 0 to numTexts - 1.\n * Note: It always returns the default text data.\n */\n public getTextData(editableTextIndex: number) {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_getTextData, args: [this.key, editableTextIndex] },\n (res: TextDocument & { key: number }) => {\n res.delete = () => {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.TextDocument_delete, args: [res.key] },\n () => undefined,\n );\n };\n return res;\n },\n );\n }\n /**\n * Replace the text data of the specified index. The index ranges from 0 to PAGFile.numTexts - 1.\n * Passing in null for the textData parameter will reset it to default text data.\n */\n public replaceText(editableTextIndex: number, textData: TextDocument & { [prop: string]: any }): Promise<void> {\n const textDocument: { [prop: string]: any } = {};\n for (const key in textData) {\n if (key !== 'delete') {\n textDocument[key] = textData[key];\n }\n }\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_replaceText, args: [this.key, editableTextIndex, textDocument] },\n () => undefined,\n );\n }\n /**\n * Replace the image content of the specified index with a PAGImage object. The index ranges from\n * 0 to PAGFile.numImages - 1. Passing in null for the image parameter will reset it to default\n * image content.\n */\n public replaceImage(editableImageIndex: number, pagImage: WorkerPAGImage) {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_replaceImage, args: [this.key, editableImageIndex, pagImage.key] },\n () => undefined,\n );\n }\n\n public destroy(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGFile_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n","export const calculateDisplaySize = (canvas: HTMLCanvasElement) => {\n const styleDeclaration = globalThis.getComputedStyle(canvas, null);\n const computedSize = {\n width: Number(styleDeclaration.width.replace('px', '')),\n height: Number(styleDeclaration.height.replace('px', '')),\n };\n if (computedSize.width > 0 && computedSize.height > 0) {\n return computedSize;\n } else {\n const styleSize = {\n width: Number(canvas.style.width.replace('px', '')),\n height: Number(canvas.style.height.replace('px', '')),\n };\n if (styleSize.width > 0 && styleSize.height > 0) {\n return styleSize;\n } else {\n return {\n width: canvas.width,\n height: canvas.height,\n };\n }\n }\n};\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { destroyVerify } from '../utils/decorators';\nimport { calculateDisplaySize } from '../utils/canvas';\n\nimport type { WorkerPAGFile } from './pag-file';\nimport type { PAGViewOptions } from '../pag-view';\nimport type { DebugData, PAGScaleMode } from '../types';\n\n@destroyVerify\nexport class WorkerPAGView {\n /**\n * Create pag view.\n * @param file pag file.\n * @param canvas target render canvas.\n * @param initOptions pag view options\n * @returns\n */\n public static init(file: WorkerPAGFile, canvas: HTMLCanvasElement, initOptions?: PAGViewOptions) {\n const options = {\n ...{\n useScale: true,\n useCanvas2D: false,\n firstFrame: true,\n },\n ...initOptions,\n };\n if (options.useScale) {\n resizeCanvas(canvas);\n }\n const offscreen = canvas.transferControlToOffscreen();\n return postMessage(\n file.worker,\n { name: WorkerMessageType.PAGView_init, args: [file.key, offscreen, initOptions] },\n (key: number) => new WorkerPAGView(file.worker, key),\n [offscreen],\n );\n }\n\n public key: number;\n public worker: Worker;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n /**\n * The duration of current composition in microseconds.\n */\n public duration() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_duration, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Start the animation.\n */\n public play() {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_play, args: [this.key] }, () => undefined);\n }\n /**\n * Pause the animation.\n */\n public pause(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_pause, args: [this.key] }, () => undefined);\n }\n /**\n * Stop the animation.\n */\n public stop(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_stop, args: [this.key] }, () => undefined);\n }\n /**\n * Set the number of times the animation will repeat. The default is 1, which means the animation\n * will play only once. 0 means the animation will play infinity times.\n */\n public setRepeatCount(repeatCount: number): Promise<void> {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_setRepeatCount, args: [this.key, repeatCount] },\n () => undefined,\n );\n }\n /**\n * Returns the current progress of play position, the value is from 0.0 to 1.0. It is applied only\n * when the composition is not null.\n */\n public getProgress() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_getProgress, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Returns the current frame.\n */\n public currentFrame() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_currentFrame, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Set the progress of play position, the value is from 0.0 to 1.0.\n */\n public setProgress(progress: number) {\n return postMessage(\n this.worker,\n {\n name: WorkerMessageType.PAGView_setProgress,\n args: [this.key, progress],\n },\n () => undefined,\n );\n }\n /**\n * Returns the current scale mode.\n */\n public scaleMode() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_scaleMode, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Specifies the rule of how to scale the pag content to fit the surface size. The matrix\n * changes when this method is called.\n */\n public setScaleMode(value: PAGScaleMode): Promise<void> {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_setScaleMode, args: [this.key, value] },\n () => undefined,\n );\n }\n /**\n * Call this method to render current position immediately. If the play() method is already\n * called, there is no need to call it. Returns true if the content has changed.\n */\n public flush() {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_flush, args: [this.key] }, (res: boolean) => res);\n }\n\n public getDebugData() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_getDebugData, args: [this.key] },\n (res: DebugData) => res,\n );\n }\n\n public destroy() {\n postMessage(this.worker, { name: WorkerMessageType.PAGView_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n\nconst resizeCanvas = (canvas: HTMLCanvasElement) => {\n const displaySize = calculateDisplaySize(canvas);\n canvas.style.width = `${displaySize.width}px`;\n canvas.style.height = `${displaySize.height}px`;\n canvas.width = displaySize.width * globalThis.devicePixelRatio;\n canvas.height = displaySize.height * globalThis.devicePixelRatio;\n};\n","import { destroyVerify } from '../utils/decorators';\nimport { isInstanceOf } from '../utils/type-utils';\nimport { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\n\n@destroyVerify\nexport class WorkerPAGImage {\n public static async fromSource(worker: Worker, source: TexImageSource) {\n const width = isInstanceOf(source, globalThis.HTMLVideoElement)\n ? (source as HTMLVideoElement).videoWidth\n : source.width;\n const height = isInstanceOf(source, globalThis.HTMLVideoElement)\n ? (source as HTMLVideoElement).videoHeight\n : source.height;\n const canvas = new OffscreenCanvas(width, height);\n canvas.width = source.width;\n canvas.height = source.height;\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n ctx.drawImage(source as CanvasImageSource, 0, 0, source.width, source.height);\n const bitmap = await createImageBitmap(canvas);\n return postMessage(\n worker,\n { name: WorkerMessageType.PAGImage_fromSource, args: [bitmap] },\n (key: number) => new WorkerPAGImage(worker, key),\n [bitmap],\n );\n }\n\n public worker: Worker;\n public key: number;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n\n public destroy(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGImage_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { VideoReader } from '../core/video-reader';\nimport { WorkerPAGFile } from './pag-file';\nimport { WorkerPAGView } from './pag-view';\nimport { WorkerPAGImage } from './pag-image';\n\nimport type { WorkerMessage } from './worker';\nimport type { ModuleOption } from '../pag';\nimport type { TimeRange } from '../interfaces';\n\nexport const MAX_ACTIVE_WORKER_CONTEXTS = 4;\n\nconst videoReaders: VideoReader[] = [];\n\nexport interface PAGWorkerOptions {\n /**\n * Link to wasm file and libpag core script.\n */\n locateFile?: (file: 'libpag.wasm' | 'libpag.js') => string;\n /**\n * Configure for worker.\n */\n workerOptions?: WorkerOptions;\n}\n\nexport const createPAGWorker = (pagWorkerOptions: PAGWorkerOptions = {}) => {\n let scriptUrl = pagWorkerOptions.locateFile ? pagWorkerOptions.locateFile('libpag.js') : 'libpag.js';\n const option: { fileUrl?: string } & ModuleOption = {};\n if (pagWorkerOptions.locateFile) {\n option.fileUrl = pagWorkerOptions.locateFile('libpag.wasm');\n }\n const workerOptions = pagWorkerOptions.workerOptions || {};\n const worker = new Worker(scriptUrl, {\n ...workerOptions,\n type: 'module'\n });\n return postMessage(worker, { name: WorkerMessageType.PAGInit, args: [option] }, () => {\n addGlobalWorkerListener(worker);\n return worker;\n });\n};\n\nconst addGlobalWorkerListener = (worker: Worker) => {\n const handle = (event: MessageEvent<WorkerMessage>) => {\n if (event.data.name.includes(WorkerMessageType.VideoReader_constructor)) {\n const videoReader = new VideoReader(\n ...(event.data.args as [Uint8Array, number, number, number, TimeRange[], boolean]),\n );\n videoReaders.push(videoReader);\n worker.postMessage({ name: event.data.name, args: [videoReaders.length - 1] });\n return;\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_prepare)) {\n const [proxyId, targetFrame, playbackRate] = event.data.args as [number, number, number];\n videoReaders[proxyId].prepare(targetFrame, playbackRate).then(() => {\n videoReaders[proxyId].generateBitmap().then((bitmap) => {\n worker.postMessage({ name: event.data.name, args: [bitmap] }, [bitmap]);\n });\n });\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_play)) {\n videoReaders[event.data.args[0]].play().then((res) => {\n worker.postMessage({ name: event.data.name, args: [res] });\n });\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_pause)) {\n videoReaders[event.data.args[0]].pause();\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_stop)) {\n videoReaders[event.data.args[0]].stop();\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_getError)) {\n worker.postMessage({ name: event.data.name, args: [videoReaders[event.data.args[0]].getError()] });\n }\n };\n worker.addEventListener('message', handle);\n};\n\nexport { WorkerPAGFile, WorkerPAGView, WorkerPAGImage };\n"],"names":["WorkerMessageType","WorkerPAGFile","__decorateClass","WorkerPAGView","WorkerPAGImage"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).libpag={})}(this,(function(e){"use strict";var t=(e=>(e.PAGInit="PAGInit",e.PAGView_init="PAGView.init",e.PAGView_duration="PAGView.duration",e.PAGView_play="PAGView.play",e.PAGView_pause="PAGView.pause",e.PAGView_stop="PAGView.stop",e.PAGView_setRepeatCount="PAGView.setRepeatCount",e.PAGView_getProgress="PAGView.getProgress",e.PAGView_currentFrame="PAGView.currentFrame",e.PAGView_setProgress="PAGView.setProgress",e.PAGView_scaleMode="PAGView.scaleMode",e.PAGView_setScaleMode="PAGView.setScaleMode",e.PAGView_flush="PAGView.flush",e.PAGView_getDebugData="PAGView.getDebugData",e.PAGView_destroy="PAGView.destroy",e.PAGFile_load="PAGFile.load",e.PAGFile_getTextData="PAGFile.getTextData",e.PAGFile_replaceText="PAGFile.replaceText",e.PAGFile_replaceImage="PAGFile.replaceImage",e.PAGFile_destroy="PAGFile.destroy",e.PAGImage_fromSource="PAGImage.fromSource",e.PAGImage_destroy="PAGImage.destroy",e.VideoReader_constructor="VideoReader.constructor",e.VideoReader_prepare="VideoReader.prepare",e.VideoReader_play="VideoReader.play",e.VideoReader_pause="VideoReader.pause",e.VideoReader_stop="VideoReader.stop",e.VideoReader_getError="VideoReader.getError",e.PAGModule_linkVideoReader="PAGModule.linkVideoReader",e.TextDocument_delete="TextDocument.delete",e))(t||{});let i=0;const r=(e,t,r,s=[])=>new Promise((a=>{const o=(e=>`${e}_${i++}`)(t.name),n=t=>{t.data.name===o&&(e.removeEventListener("message",n),a(r(...t.data.args)))};e.addEventListener("message",n),e.postMessage({name:o,args:t.args},s)}));let s={};const a=(e,t,i,r=!1)=>{t in s||(s[t]=[]),s[t]?.push({node:e,handler:i,capture:r}),e.addEventListener(t,i,r)},o=(e,t,i)=>{t in s&&s[t]?.filter((({node:t,handler:r})=>t===e&&r===i)).forEach((({node:e,handler:i,capture:r})=>e.removeEventListener(t,i,r)))},n=(e,t)=>{t in s&&(s[t]?.filter((({node:t})=>t===e)).forEach((({node:e,handler:i,capture:r})=>e.removeEventListener(t,i,r))),s[t]=s[t]?.filter((({node:t})=>t!==e)))},l=navigator?.userAgent||"",h=/android|adr/i.test(l),d=/(mobile)/i.test(l)&&h;!/(mobile)/i.test(l)&&!d&&/Mac OS X/i.test(l);const c=/(iphone|ipad|ipod)/i.test(l),p=/MicroMessenger/i.test(l),u=/^((?!chrome|android).)*safari/i.test(l)||c,g="function"==typeof globalThis.importScripts;let m;class w{constructor(e){this.bitmap=e}setBitmap(e){this.bitmap&&this.bitmap.close(),this.bitmap=e}}class y{constructor(e){this.bitmap=null,this.isSought=!1,this.isPlaying=!1,this.bitmapImage=new w(null),this.proxyId=e}prepare(e,i){return new Promise((s=>{r(self,{name:t.VideoReader_prepare,args:[this.proxyId,e,i]},(e=>{this.bitmapImage.setBitmap(e),s()}))}))}getVideo(){return this.bitmapImage}onDestroy(){self.postMessage({name:"VideoReader.onDestroy",args:[this.proxyId]})}play(){return new Promise((e=>{r(self,{name:t.VideoReader_play,args:[this.proxyId]},(()=>{e()}))}))}pause(){r(self,{name:t.VideoReader_pause,args:[this.proxyId]},(()=>{}))}stop(){r(self,{name:t.VideoReader_stop,args:[this.proxyId]},(()=>{}))}getError(){return new Promise((e=>{r(self,{name:t.VideoReader_getError,args:[this.proxyId]},(t=>{e(t)}))}))}}const P=(e,t)=>void 0!==t&&e instanceof t,f=e=>new Promise((t=>{const i=()=>{o(e,"canplay",i),clearTimeout(r),t(!0)};a(e,"canplay",i);const r=setTimeout((()=>{o(e,"canplay",i),t(!1)}),1e3)}));class v{constructor(e,t,i,r,s,a=!1){if(this.isSought=!1,this.isPlaying=!1,this.bitmap=null,this.videoEl=null,this.frameRate=0,this.canplay=!1,this.staticTimeRanges=null,this.disablePlaybackRate=!1,this.error=null,this.player=null,this.width=0,this.height=0,this.bitmapCanvas=null,this.bitmapCtx=null,P(e,globalThis.HTMLVideoElement))this.videoEl=e,this.canplay=!0;else{this.videoEl=document.createElement("video"),this.videoEl.style.display="none",this.videoEl.muted=!0,this.videoEl.playsInline=!0,this.videoEl.preload="auto",this.videoEl.width=t,this.videoEl.height=i,f(this.videoEl).then((()=>{this.canplay=!0}));const r=new Blob([e],{type:"video/mp4"});this.videoEl.src=URL.createObjectURL(r),c&&this.videoEl.load()}this.frameRate=r,this.width=t,this.height=i,this.staticTimeRanges=new A(s),(3840<t||3840<i)&&(this.disablePlaybackRate=!0),a||this.linkPlayer(m.currentPlayer)}static async create(e,i,s,a,o){if(g){const n=await new Promise((n=>{const l=e,h=l.buffer.slice(l.byteOffset,l.byteOffset+l.byteLength);r(self,{name:t.VideoReader_constructor,args:[h,i,s,a,o,!0]},(e=>{n(e)}),[h])})),l=new y(n);return m.currentPlayer?.linkVideoReader(l),l}return new v(e,i,s,a,o)}async prepare(e,t){this.setError(null),this.isSought=!1;const{currentTime:i}=this.videoEl,r=e/this.frameRate;if(0===i&&0===r)if(this.canplay||u){try{await this.play()}catch(e){this.setError(e)}await new Promise((e=>{requestAnimationFrame((()=>{this.pause(),e()}))}))}else await f(this.videoEl);else if(Math.round(r*this.frameRate)===Math.round(i*this.frameRate));else{if(this.staticTimeRanges?.contains(e))return void await this.seek(r,!1);if(!(Math.abs(i-r)<1/this.frameRate*3))return this.isSought=!0,void await this.seek(r)}const s=Math.min(Math.max(t,.125),4);if(this.disablePlaybackRate||this.videoEl.playbackRate===s||(this.videoEl.playbackRate=s),this.isPlaying&&this.videoEl.paused)try{await this.play()}catch(e){this.setError(e)}}getVideo(){return this.videoEl}async generateBitmap(){return this.bitmapCanvas||(this.bitmapCanvas=new OffscreenCanvas(this.width,this.height),this.bitmapCanvas.width=this.width,this.bitmapCanvas.height=this.height,this.bitmapCtx=this.bitmapCanvas.getContext("2d")),this.bitmapCtx?.fillRect(0,0,this.width,this.height),this.bitmapCtx?.drawImage(this.videoEl,0,0,this.width,this.height),this.bitmap=await createImageBitmap(this.bitmapCanvas),this.bitmap}async play(){if(this.videoEl.paused){if(p&&window.WeixinJSBridge&&await new Promise((e=>{window.WeixinJSBridge.invoke("getNetworkType",{},(()=>{e()}),(()=>{e()}))})),"visible"!==document.visibilityState){const e=()=>{"visible"===document.visibilityState&&(this.videoEl&&this.videoEl.play(),window.removeEventListener("visibilitychange",e))};throw window.addEventListener("visibilitychange",e),new Error("The play() request was interrupted because the document was hidden!")}await(this.videoEl?.play())}}pause(){this.isPlaying=!1,this.videoEl.paused||this.videoEl?.pause()}stop(){this.isPlaying=!1,this.videoEl.paused||this.videoEl?.pause(),this.videoEl.currentTime=0}getError(){return this.error}onDestroy(){this.player&&this.player.unlinkVideoReader(this),n(this.videoEl,"playing"),n(this.videoEl,"timeupdate"),this.videoEl=null,this.bitmapCanvas=null,this.bitmapCtx=null}seek(e,t=!0){return new Promise(((i,r)=>{if(!this.videoEl)return void r(new Error("Video element is not initialized."));const s=()=>{o(this.videoEl,"seeked",s),clearTimeout(l),t?this.videoEl?.play().catch((e=>{this.setError(e)})):t||this.videoEl.paused||this.videoEl?.pause(),i()},n=()=>{o(this.videoEl,"canplay",n),this.videoEl.currentTime=e,a(this.videoEl,"seeked",s)},l=setTimeout((()=>{o(this.videoEl,"canplay",n),o(this.videoEl,"seeked",s),r(new Error("Seek operation timed out."))}),1e3/this.frameRate*12);this.videoEl.readyState<HTMLMediaElement.HAVE_FUTURE_DATA?a(this.videoEl,"canplay",n):(this.videoEl.currentTime=e,a(this.videoEl,"seeked",s))}))}setError(e){this.error=e}linkPlayer(e){this.player=e,e&&e.linkVideoReader(this)}}class A{constructor(e){this.timeRanges=e}contains(e){if(0===this.timeRanges.length)return!1;for(let t of this.timeRanges)if(t.start<=e&&e<t.end)return!0;return!1}}const k=e=>new Promise((t=>{const i=new FileReader;i.onload=()=>{t(i.result)},i.onerror=()=>{console.error(i.error.message)},i.readAsArrayBuffer(e)}));function b(e){let t=Object.getOwnPropertyNames(e.prototype).filter((t=>"constructor"!==t&&"function"==typeof e.prototype[t]));const i=(t,i)=>{const r=t[i];t[i]=function(...t){if(!this.isDestroyed)return r.call(this,...t);console.error(`Don't call ${i} of the ${e.name} that is destroyed.`)}};t.forEach((t=>i(e.prototype,t)))}var V=Object.defineProperty,E=Object.getOwnPropertyDescriptor;e.WorkerPAGFile=class{constructor(e,t){this.isDestroyed=!1,this.worker=e,this.key=t}static async load(i,s){const a=await(e=>P(e,globalThis.File)?k(e):P(e,globalThis.Blob)?k(new File([e],"")):P(e,globalThis.ArrayBuffer)?Promise.resolve(e):Promise.resolve(null))(s);if(!a)throw new Error("Initialize PAGFile data type error, please put check data type must to be File | Blob | ArrayBuffer!");return await r(i,{name:t.PAGFile_load,args:[s]},(t=>new e.WorkerPAGFile(i,t)))}getTextData(e){return r(this.worker,{name:t.PAGFile_getTextData,args:[this.key,e]},(e=>(e.delete=()=>r(this.worker,{name:t.TextDocument_delete,args:[e.key]},(()=>{})),e)))}replaceText(e,i){const s={};for(const e in i)"delete"!==e&&(s[e]=i[e]);return r(this.worker,{name:t.PAGFile_replaceText,args:[this.key,e,s]},(()=>{}))}replaceImage(e,i){return r(this.worker,{name:t.PAGFile_replaceImage,args:[this.key,e,i.key]},(()=>{}))}destroy(){return r(this.worker,{name:t.PAGFile_destroy,args:[this.key]},(()=>{this.isDestroyed=!0}))}},e.WorkerPAGFile=((e,t,i,r)=>{for(var s,a=r>1?void 0:r?E(t,i):t,o=e.length-1;o>=0;o--)(s=e[o])&&(a=(r?s(t,i,a):s(a))||a);return r&&a&&V(t,i,a),a})([b],e.WorkerPAGFile);var G=Object.defineProperty,_=Object.getOwnPropertyDescriptor;e.WorkerPAGView=class{constructor(e,t){this.isDestroyed=!1,this.worker=e,this.key=t}static init(i,s,a){({useScale:!0,useCanvas2D:!1,firstFrame:!0,...a}).useScale&&R(s);const o=s.transferControlToOffscreen();return r(i.worker,{name:t.PAGView_init,args:[i.key,o,a]},(t=>new e.WorkerPAGView(i.worker,t)),[o])}duration(){return r(this.worker,{name:t.PAGView_duration,args:[this.key]},(e=>e))}play(){return r(this.worker,{name:t.PAGView_play,args:[this.key]},(()=>{}))}pause(){return r(this.worker,{name:t.PAGView_pause,args:[this.key]},(()=>{}))}stop(){return r(this.worker,{name:t.PAGView_stop,args:[this.key]},(()=>{}))}setRepeatCount(e){return r(this.worker,{name:t.PAGView_setRepeatCount,args:[this.key,e]},(()=>{}))}getProgress(){return r(this.worker,{name:t.PAGView_getProgress,args:[this.key]},(e=>e))}currentFrame(){return r(this.worker,{name:t.PAGView_currentFrame,args:[this.key]},(e=>e))}setProgress(e){return r(this.worker,{name:t.PAGView_setProgress,args:[this.key,e]},(()=>{}))}scaleMode(){return r(this.worker,{name:t.PAGView_scaleMode,args:[this.key]},(e=>e))}setScaleMode(e){return r(this.worker,{name:t.PAGView_setScaleMode,args:[this.key,e]},(()=>{}))}flush(){return r(this.worker,{name:t.PAGView_flush,args:[this.key]},(e=>e))}getDebugData(){return r(this.worker,{name:t.PAGView_getDebugData,args:[this.key]},(e=>e))}destroy(){r(this.worker,{name:t.PAGView_destroy,args:[this.key]},(()=>{this.isDestroyed=!0}))}},e.WorkerPAGView=((e,t,i,r)=>{for(var s,a=r>1?void 0:r?_(t,i):t,o=e.length-1;o>=0;o--)(s=e[o])&&(a=(r?s(t,i,a):s(a))||a);return r&&a&&G(t,i,a),a})([b],e.WorkerPAGView);const R=e=>{const t=(e=>{const t=globalThis.getComputedStyle(e,null),i={width:Number(t.width.replace("px","")),height:Number(t.height.replace("px",""))};if(i.width>0&&i.height>0)return i;{const t={width:Number(e.style.width.replace("px","")),height:Number(e.style.height.replace("px",""))};return t.width>0&&t.height>0?t:{width:e.width,height:e.height}}})(e);e.style.width=`${t.width}px`,e.style.height=`${t.height}px`,e.width=t.width*globalThis.devicePixelRatio,e.height=t.height*globalThis.devicePixelRatio};var T=Object.defineProperty,x=Object.getOwnPropertyDescriptor;e.WorkerPAGImage=class{constructor(e,t){this.isDestroyed=!1,this.worker=e,this.key=t}static async fromSource(i,s){const a=P(s,globalThis.HTMLVideoElement)?s.videoWidth:s.width,o=P(s,globalThis.HTMLVideoElement)?s.videoHeight:s.height,n=new OffscreenCanvas(a,o);n.width=s.width,n.height=s.height;n.getContext("2d").drawImage(s,0,0,s.width,s.height);const l=await createImageBitmap(n);return r(i,{name:t.PAGImage_fromSource,args:[l]},(t=>new e.WorkerPAGImage(i,t)),[l])}destroy(){return r(this.worker,{name:t.PAGImage_destroy,args:[this.key]},(()=>{this.isDestroyed=!0}))}},e.WorkerPAGImage=((e,t,i,r)=>{for(var s,a=r>1?void 0:r?x(t,i):t,o=e.length-1;o>=0;o--)(s=e[o])&&(a=(r?s(t,i,a):s(a))||a);return r&&a&&T(t,i,a),a})([b],e.WorkerPAGImage);const F=[],I=e=>{e.addEventListener("message",(i=>{if(i.data.name.includes(t.VideoReader_constructor)){const t=new v(...i.data.args);return F.push(t),void e.postMessage({name:i.data.name,args:[F.length-1]})}if(i.data.name.includes(t.VideoReader_prepare)){const[t,r,s]=i.data.args;F[t].prepare(r,s).then((()=>{F[t].generateBitmap().then((t=>{e.postMessage({name:i.data.name,args:[t]},[t])}))}))}i.data.name.includes(t.VideoReader_play)&&F[i.data.args[0]].play().then((t=>{e.postMessage({name:i.data.name,args:[t]})})),i.data.name.includes(t.VideoReader_pause)&&F[i.data.args[0]].pause(),i.data.name.includes(t.VideoReader_stop)&&F[i.data.args[0]].stop(),i.data.name.includes(t.VideoReader_getError)&&e.postMessage({name:i.data.name,args:[F[i.data.args[0]].getError()]})}))};e.MAX_ACTIVE_WORKER_CONTEXTS=4,e.createPAGWorker=(e={})=>{let i=e.locateFile?e.locateFile("libpag.js"):"libpag.js";const s={};e.locateFile&&(s.fileUrl=e.locateFile("libpag.wasm"));const a=e.workerOptions||{},o=new Worker(i,{...a,type:"module"});return r(o,{name:t.PAGInit,args:[s]},(()=>(I(o),o)))},Object.defineProperty(e,"__esModule",{value:!0})}));
2
- //# sourceMappingURL=libpag.worker.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"libpag.worker.min.js","sources":["../src/worker/events.ts","../src/worker/utils.ts","../src/utils/video-listener.ts","../src/utils/ua.ts","../src/pag-module.ts","../../third_party/tgfx/web/src/core/bitmap-image.ts","../src/worker/video-reader.ts","../src/utils/type-utils.ts","../src/core/video-reader.ts","../src/constant.ts","../src/utils/common.ts","../src/utils/decorators.ts","../src/worker/pag-file.ts","../src/worker/pag-view.ts","../src/utils/canvas.ts","../src/worker/pag-image.ts","../src/worker/client.ts"],"sourcesContent":["export enum WorkerMessageType {\n PAGInit = 'PAGInit',\n // PAGView static methods\n PAGView_init = 'PAGView.init',\n // PAGView instance methods\n PAGView_duration = 'PAGView.duration',\n PAGView_play = 'PAGView.play',\n PAGView_pause = 'PAGView.pause',\n PAGView_stop = 'PAGView.stop',\n PAGView_setRepeatCount = 'PAGView.setRepeatCount',\n PAGView_getProgress = 'PAGView.getProgress',\n PAGView_currentFrame = 'PAGView.currentFrame',\n PAGView_setProgress = 'PAGView.setProgress',\n PAGView_scaleMode = 'PAGView.scaleMode',\n PAGView_setScaleMode = 'PAGView.setScaleMode',\n PAGView_flush = 'PAGView.flush',\n PAGView_getDebugData = 'PAGView.getDebugData',\n PAGView_destroy = 'PAGView.destroy',\n // PAGFile static methods\n PAGFile_load = 'PAGFile.load',\n // PAGFile instance methods\n PAGFile_getTextData = 'PAGFile.getTextData',\n PAGFile_replaceText = 'PAGFile.replaceText',\n PAGFile_replaceImage = 'PAGFile.replaceImage',\n PAGFile_destroy = 'PAGFile.destroy',\n // PAGImage static methods\n PAGImage_fromSource = 'PAGImage.fromSource',\n PAGImage_destroy = 'PAGImage.destroy',\n // VideoReader static methods\n VideoReader_constructor = 'VideoReader.constructor',\n // VideoReader instance methods\n VideoReader_prepare = 'VideoReader.prepare',\n VideoReader_play = 'VideoReader.play',\n VideoReader_pause = 'VideoReader.pause',\n VideoReader_stop = 'VideoReader.stop',\n VideoReader_getError = 'VideoReader.getError',\n // Binding video reader\n PAGModule_linkVideoReader = 'PAGModule.linkVideoReader',\n // TextDocument instance methods\n TextDocument_delete = 'TextDocument.delete',\n}\n","import type { WorkerMessage } from './worker';\n\nlet messageCount = 0;\nconst generateMessageName = (name: string) => `${name}_${messageCount++}`;\n\nexport interface WorkerInterface {\n postMessage: (message: any, transfer: Transferable[]) => void;\n addEventListener: (type: string, listener: (event: MessageEvent) => void) => void;\n removeEventListener: (type: string, listener: (event: MessageEvent) => void) => void;\n}\n\nexport const postMessage = <T>(\n worker: WorkerInterface,\n message: WorkerMessage,\n callback: (...args: any[]) => T,\n transfer: (OffscreenCanvas | Transferable)[] = [],\n): Promise<T> => {\n return new Promise((resolve) => {\n const name = generateMessageName(message.name);\n const handle = (event: MessageEvent<WorkerMessage>) => {\n if (event.data.name === name) {\n worker.removeEventListener('message', handle);\n resolve(callback(...event.data.args));\n }\n };\n worker.addEventListener('message', handle);\n worker.postMessage({ name, args: message.args }, transfer);\n });\n};\n","type K = keyof HTMLVideoElementEventMap;\n\nlet eventHandlers: {\n [key in K]?: {\n node: HTMLVideoElement;\n handler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any;\n capture: boolean;\n }[];\n} = {};\n\nexport const addListener = (\n node: HTMLVideoElement,\n event: K,\n handler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any,\n capture = false,\n) => {\n if (!(event in eventHandlers)) {\n eventHandlers[event] = [];\n }\n eventHandlers[event]?.push({ node: node, handler: handler, capture: capture });\n node.addEventListener(event, handler, capture);\n};\n\nexport const removeListener = (\n targetNode: HTMLElement,\n event: K,\n targetHandler: (this: HTMLVideoElement, ev: HTMLVideoElementEventMap[K]) => any,\n) => {\n if (!(event in eventHandlers)) return;\n eventHandlers[event]\n ?.filter(({ node, handler }) => node === targetNode && handler === targetHandler)\n .forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));\n};\n\nexport const removeAllListeners = (targetNode: HTMLElement, event: K) => {\n if (!(event in eventHandlers)) return;\n eventHandlers[event]\n ?.filter(({ node }) => node === targetNode)\n .forEach(({ node, handler, capture }) => node.removeEventListener(event, handler, capture));\n\n eventHandlers[event] = eventHandlers[event]?.filter(({ node }) => node !== targetNode);\n};\n","const nav = navigator?.userAgent || '';\nexport const ANDROID = /android|adr/i.test(nav);\nexport const MOBILE = /(mobile)/i.test(nav) && ANDROID;\nexport const MACOS = !(/(mobile)/i.test(nav) || MOBILE) && /Mac OS X/i.test(nav);\nexport const IPHONE = /(iphone|ipad|ipod)/i.test(nav);\nexport const WECHAT = /MicroMessenger/i.test(nav);\nexport const SAFARI_OR_IOS_WEBVIEW = /^((?!chrome|android).)*safari/i.test(nav) || IPHONE;\nexport const WORKER = typeof (globalThis as any).importScripts === 'function';\n","import type { PAG } from './types';\n\nexport let PAGModule: PAG;\n\nexport const setPAGModule = (module: PAG) => {\n PAGModule = module;\n};\n\nexport const getPAGModule = () => PAGModule;\n","/////////////////////////////////////////////////////////////////////////////////////////////////\n//\n// Tencent is pleased to support the open source community by making tgfx available.\n//\n// Copyright (C) 2023 THL A29 Limited, a Tencent company. All rights reserved.\n//\n// Licensed under the BSD 3-Clause License (the \"License\"); you may not use this file except\n// in compliance with the License. You may obtain a copy of the License at\n//\n// https://opensource.org/licenses/BSD-3-Clause\n//\n// unless required by applicable law or agreed to in writing, software distributed under the\n// license is distributed on an \"as is\" basis, without warranties or conditions of any kind,\n// either express or implied. see the license for the specific language governing permissions\n// and limitations under the license.\n//\n/////////////////////////////////////////////////////////////////////////////////////////////////\n\nexport class BitmapImage {\n public bitmap: ImageBitmap | null;\n\n public constructor(bitmap: ImageBitmap | null) {\n this.bitmap = bitmap;\n }\n\n public setBitmap(bitmap: ImageBitmap) {\n if (this.bitmap) {\n this.bitmap.close();\n }\n this.bitmap = bitmap;\n }\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\n\nimport { BitmapImage } from '@tgfx/core/bitmap-image';\n\nexport class WorkerVideoReader {\n public bitmap: ImageBitmap | null = null;\n public isSought = false;\n public isPlaying = false;\n\n private proxyId: number;\n private bitmapImage: BitmapImage = new BitmapImage(null);\n\n public constructor(proxyId: number) {\n this.proxyId = proxyId;\n }\n\n public prepare(targetFrame: number, playbackRate: number) {\n return new Promise<void>((resolve) => {\n postMessage(\n self,\n { name: WorkerMessageType.VideoReader_prepare, args: [this.proxyId, targetFrame, playbackRate] },\n (res) => {\n this.bitmapImage.setBitmap(res);\n resolve();\n },\n );\n });\n }\n\n public getVideo() {\n return this.bitmapImage;\n }\n\n public onDestroy() {\n self.postMessage({ name: 'VideoReader.onDestroy', args: [this.proxyId] });\n }\n\n public play() {\n return new Promise<void>((resolve) => {\n postMessage(self, { name: WorkerMessageType.VideoReader_play, args: [this.proxyId] }, () => {\n resolve();\n });\n });\n }\n\n public pause() {\n postMessage(self, { name: WorkerMessageType.VideoReader_pause, args: [this.proxyId] }, () => {});\n }\n\n public stop() {\n postMessage(self, { name: WorkerMessageType.VideoReader_stop, args: [this.proxyId] }, () => {});\n }\n\n public getError() {\n return new Promise<any>((resolve) => {\n postMessage(self, { name: WorkerMessageType.VideoReader_getError, args: [this.proxyId] }, (res) => {\n resolve(res);\n });\n });\n }\n}\n","import { PAGModule } from '../pag-module';\nimport { LayerType, Vector } from '../types';\n\nimport type { PAGLayer } from '../pag-layer';\nimport type { PAGImageLayer } from '../pag-image-layer';\nimport type { PAGSolidLayer } from '../pag-solid-layer';\nimport type { PAGTextLayer } from '../pag-text-layer';\n\nconst rewindData = (fn: (...args: any[]) => any, scope: any, ...args: any[]) => {\n if (PAGModule.Asyncify.currData !== null) {\n const currData = PAGModule.Asyncify.currData;\n PAGModule.Asyncify.currData = null;\n const ret = fn.call(scope, ...args);\n PAGModule.Asyncify.currData = currData;\n return ret;\n } else {\n return fn.call(scope, ...args);\n }\n};\n\nexport const proxyVector = <T extends (...args: any) => any>(\n vector: Vector<any>,\n process: T,\n): Vector<ReturnType<T>> => {\n const proxy = new Proxy(vector, {\n get(target, property, receiver) {\n switch (property) {\n case 'get':\n return (index: number) => {\n const wasmIns = rewindData(target.get, target, index);\n return !wasmIns ? wasmIns : process(wasmIns);\n };\n case 'push_back':\n return (value: ReturnType<T>) => {\n rewindData(target.push_back, target, value.wasmIns || value);\n return undefined;\n };\n case 'size':\n return () => {\n return rewindData(target.size, target);\n };\n default:\n return Reflect.get(target, property, receiver);\n }\n },\n });\n return proxy;\n};\n\nexport const layer2typeLayer = (wasmIns: any): PAGSolidLayer | PAGTextLayer | PAGImageLayer | PAGLayer => {\n switch (rewindData(wasmIns._layerType, wasmIns)) {\n case LayerType.Solid:\n return new PAGModule.PAGSolidLayer(wasmIns);\n case LayerType.Text:\n return new PAGModule.PAGTextLayer(wasmIns);\n case LayerType.Image:\n return new PAGModule.PAGImageLayer(wasmIns);\n default:\n return new PAGModule.PAGLayer(wasmIns);\n }\n};\n\nexport const getLayerTypeName = (layerType: LayerType) => {\n switch (layerType) {\n case LayerType.Solid:\n return 'Solid';\n case LayerType.Text:\n return 'Text';\n case LayerType.Shape:\n return 'Shape';\n case LayerType.Image:\n return 'Image';\n case LayerType.PreCompose:\n return 'PreCompose';\n default:\n return 'Unknown';\n }\n};\n\nexport const getWasmIns = (value: any) => {\n if (value?.wasmIns) {\n return value.wasmIns;\n }\n return value;\n};\n\nexport const isInstanceOf = (value: any, type: any) => typeof type !== 'undefined' && value instanceof type;\n","import {\n VIDEO_DECODE_WAIT_FRAME,\n VIDEO_DECODE_SEEK_TIMEOUT_FRAME,\n VIDEO_PLAYBACK_RATE_MAX,\n VIDEO_PLAYBACK_RATE_MIN,\n} from '../constant';\nimport { addListener, removeListener, removeAllListeners } from '../utils/video-listener';\nimport { IPHONE, WECHAT, SAFARI_OR_IOS_WEBVIEW, WORKER } from '../utils/ua';\nimport { PAGModule } from '../pag-module';\nimport { WorkerMessageType } from '../worker/events';\nimport { WorkerVideoReader } from '../worker/video-reader';\nimport { postMessage } from '../worker/utils';\n\nimport type { TimeRange, VideoReader as VideoReaderInterfaces } from '../interfaces';\nimport type { PAGPlayer } from '../pag-player';\nimport { isInstanceOf } from '../utils/type-utils';\n\nconst UHD_RESOLUTION = 3840;\n\n// Get video initiated token on Wechat browser.\nconst getWechatNetwork = () => {\n return new Promise<void>((resolve) => {\n window.WeixinJSBridge.invoke(\n 'getNetworkType',\n {},\n () => {\n resolve();\n },\n () => {\n resolve();\n },\n );\n });\n};\n\nconst waitVideoCanPlay = (videoElement: HTMLVideoElement) => {\n return new Promise((resolve) => {\n const canplayHandle = () => {\n removeListener(videoElement, 'canplay', canplayHandle);\n clearTimeout(timer);\n resolve(true);\n };\n addListener(videoElement, 'canplay', canplayHandle);\n const timer = setTimeout(() => {\n removeListener(videoElement, 'canplay', canplayHandle);\n resolve(false);\n }, 1000);\n });\n};\n\nexport class VideoReader {\n public static async create(\n source: Uint8Array | HTMLVideoElement,\n width: number,\n height: number,\n frameRate: number,\n staticTimeRanges: TimeRange[],\n ): Promise<VideoReaderInterfaces> {\n if (WORKER) {\n const proxyId = await new Promise<number>((resolve) => {\n // TODO: source as HTMLVideoElement in WebWorker version.\n const uint8Array = source as Uint8Array;\n const buffer = uint8Array.buffer.slice(uint8Array.byteOffset, uint8Array.byteOffset + uint8Array.byteLength);\n postMessage(\n self,\n {\n name: WorkerMessageType.VideoReader_constructor,\n args: [buffer, width, height, frameRate, staticTimeRanges, true],\n },\n (res) => {\n resolve(res);\n },\n [buffer],\n );\n });\n const videoReader = new WorkerVideoReader(proxyId);\n PAGModule.currentPlayer?.linkVideoReader(videoReader);\n return videoReader;\n }\n return new VideoReader(source, width, height, frameRate, staticTimeRanges);\n }\n\n public isSought = false;\n public isPlaying = false;\n public bitmap: ImageBitmap | null = null;\n\n private videoEl: HTMLVideoElement | null = null;\n private frameRate = 0;\n private canplay = false;\n private staticTimeRanges: StaticTimeRanges | null = null;\n private disablePlaybackRate = false;\n private error: any = null;\n private player: PAGPlayer | null = null;\n private width = 0;\n private height = 0;\n private bitmapCanvas: OffscreenCanvas | null = null;\n private bitmapCtx: OffscreenCanvasRenderingContext2D | null = null;\n\n public constructor(\n source: Uint8Array | HTMLVideoElement,\n width: number,\n height: number,\n frameRate: number,\n staticTimeRanges: TimeRange[],\n isWorker = false,\n ) {\n if (isInstanceOf(source, globalThis.HTMLVideoElement)) {\n this.videoEl = source as HTMLVideoElement;\n this.canplay = true;\n } else {\n this.videoEl = document.createElement('video');\n this.videoEl.style.display = 'none';\n this.videoEl.muted = true;\n this.videoEl.playsInline = true;\n this.videoEl.preload = 'auto'; // use load() will make a bug on Chrome.\n this.videoEl.width = width;\n this.videoEl.height = height;\n waitVideoCanPlay(this.videoEl).then(() => {\n this.canplay = true;\n });\n const blob = new Blob([source as Uint8Array], { type: 'video/mp4' });\n this.videoEl.src = URL.createObjectURL(blob);\n if (IPHONE) {\n // use load() will make a bug on Chrome.\n this.videoEl.load();\n }\n }\n this.frameRate = frameRate;\n this.width = width;\n this.height = height;\n this.staticTimeRanges = new StaticTimeRanges(staticTimeRanges);\n if (UHD_RESOLUTION < width || UHD_RESOLUTION < height) {\n this.disablePlaybackRate = true;\n }\n if (!isWorker) {\n this.linkPlayer(PAGModule.currentPlayer);\n }\n }\n\n public async prepare(targetFrame: number, playbackRate: number) {\n this.setError(null); // reset error\n this.isSought = false; // reset seek status\n const { currentTime } = this.videoEl!;\n const targetTime = targetFrame / this.frameRate;\n if (currentTime === 0 && targetTime === 0) {\n if (!this.canplay && !SAFARI_OR_IOS_WEBVIEW) {\n await waitVideoCanPlay(this.videoEl!);\n } else {\n try {\n await this.play();\n } catch (e) {\n this.setError(e);\n }\n await new Promise<void>((resolve) => {\n requestAnimationFrame(() => {\n this.pause();\n resolve();\n });\n });\n }\n } else {\n if (Math.round(targetTime * this.frameRate) === Math.round(currentTime * this.frameRate)) {\n // Current frame\n } else if (this.staticTimeRanges?.contains(targetFrame)) {\n // Static frame\n await this.seek(targetTime, false);\n return;\n } else if (Math.abs(currentTime - targetTime) < (1 / this.frameRate) * VIDEO_DECODE_WAIT_FRAME) {\n // Within tolerable frame rate deviation\n } else {\n // Seek and play\n this.isSought = true;\n await this.seek(targetTime);\n return;\n }\n }\n\n const targetPlaybackRate = Math.min(Math.max(playbackRate, VIDEO_PLAYBACK_RATE_MIN), VIDEO_PLAYBACK_RATE_MAX);\n if (!this.disablePlaybackRate && this.videoEl!.playbackRate !== targetPlaybackRate) {\n this.videoEl!.playbackRate = targetPlaybackRate;\n }\n\n if (this.isPlaying && this.videoEl!.paused) {\n try {\n await this.play();\n } catch (e) {\n this.setError(e);\n }\n }\n }\n\n public getVideo() {\n return this.videoEl;\n }\n\n // Only work in web worker version\n public async generateBitmap() {\n // Batter than createImageBitmap from video element in benchmark\n if (!this.bitmapCanvas) {\n this.bitmapCanvas = new OffscreenCanvas(this.width, this.height);\n this.bitmapCanvas!.width = this.width;\n this.bitmapCanvas!.height = this.height;\n this.bitmapCtx = this.bitmapCanvas.getContext('2d') as OffscreenCanvasRenderingContext2D | null;\n }\n this.bitmapCtx?.fillRect(0, 0, this.width, this.height);\n this.bitmapCtx?.drawImage(this.videoEl as HTMLVideoElement, 0, 0, this.width, this.height);\n this.bitmap = await createImageBitmap(this.bitmapCanvas);\n return this.bitmap;\n }\n\n public async play() {\n if (!this.videoEl!.paused) return;\n if (WECHAT && window.WeixinJSBridge) {\n await getWechatNetwork();\n }\n if (document.visibilityState !== 'visible') {\n const visibilityHandle = () => {\n if (document.visibilityState === 'visible') {\n if (this.videoEl) this.videoEl.play();\n window.removeEventListener('visibilitychange', visibilityHandle);\n }\n };\n window.addEventListener('visibilitychange', visibilityHandle);\n throw new Error('The play() request was interrupted because the document was hidden!');\n }\n await this.videoEl?.play();\n }\n\n public pause() {\n this.isPlaying = false;\n if (this.videoEl!.paused) return;\n this.videoEl?.pause();\n }\n\n public stop() {\n this.isPlaying = false;\n if (!this.videoEl!.paused) {\n this.videoEl?.pause();\n }\n this.videoEl!.currentTime = 0;\n }\n\n public getError() {\n return this.error;\n }\n\n public onDestroy() {\n if (this.player) {\n this.player.unlinkVideoReader(this);\n }\n removeAllListeners(this.videoEl!, 'playing');\n removeAllListeners(this.videoEl!, 'timeupdate');\n this.videoEl = null;\n this.bitmapCanvas = null;\n this.bitmapCtx = null;\n }\n\n private seek(targetTime: number, play = true) {\n return new Promise<void>((resolve, reject) => {\n if (!this.videoEl) {\n reject(new Error('Video element is not initialized.'));\n return;\n }\n\n const onSeeked = () => {\n removeListener(this.videoEl!, 'seeked', onSeeked);\n clearTimeout(seekTimeout);\n if (play) {\n this.videoEl?.play().catch((e) => {\n this.setError(e);\n });\n } else if (!play && !this.videoEl!.paused) {\n this.videoEl?.pause();\n }\n resolve();\n };\n \n const onCanPlay = () => {\n removeListener(this.videoEl!, 'canplay', onCanPlay);\n // Now that we have enough data, perform the seek.\n this.videoEl!.currentTime = targetTime;\n addListener(this.videoEl!, 'seeked', onSeeked);\n };\n \n const seekTimeout = setTimeout(() => {\n removeListener(this.videoEl!, 'canplay', onCanPlay);\n removeListener(this.videoEl!, 'seeked', onSeeked);\n reject(new Error('Seek operation timed out.'));\n }, (1000 / this.frameRate) * VIDEO_DECODE_SEEK_TIMEOUT_FRAME);\n \n // Check if we need to wait for 'canplay' event before seeking.\n if (this.videoEl.readyState < HTMLMediaElement.HAVE_FUTURE_DATA) {\n addListener(this.videoEl, 'canplay', onCanPlay);\n } else {\n // We already have enough data to perform the seek.\n this.videoEl!.currentTime = targetTime;\n addListener(this.videoEl, 'seeked', onSeeked);\n }\n });\n }\n\n private setError(e: any) {\n this.error = e;\n }\n\n private linkPlayer(player: PAGPlayer | null) {\n this.player = player;\n if (player) {\n player.linkVideoReader(this);\n }\n }\n}\n\nexport class StaticTimeRanges {\n private timeRanges: TimeRange[];\n\n public constructor(timeRanges: TimeRange[]) {\n this.timeRanges = timeRanges;\n }\n\n public contains(targetFrame: number) {\n if (this.timeRanges.length === 0) return false;\n for (let timeRange of this.timeRanges) {\n if (timeRange.start <= targetFrame && targetFrame < timeRange.end) {\n return true;\n }\n }\n return false;\n }\n}\n","/**\n * VideoDecode wait frame num.\n */\nexport const VIDEO_DECODE_WAIT_FRAME = 3;\n/**\n * VideoDecode seek timeout frame num.\n */\nexport const VIDEO_DECODE_SEEK_TIMEOUT_FRAME = 12;\n/**\n * NAL unit length. [ 0, 0, 0, 1 ]\n */\nexport const NALU_HEADER_LENGTH = 4;\n/**\n * Web safe font.\n */\nexport const WEB_SAFE_FONT = 'Arial';\n/**\n * Default render canvas size.\n */\nexport const DEFAULT_CANVAS_SIZE = 2560;\n/**\n * Default WebGL ContextAttributes\n */\nexport const WEBGL_CONTEXT_ATTRIBUTES = {\n depth: false,\n stencil: false,\n antialias: false,\n};\n\nexport const VIDEO_PLAYBACK_RATE_MIN = 0.125;\nexport const VIDEO_PLAYBACK_RATE_MAX = 4;\n\nexport const CANVAS_POOL_MAX_SIZE = 10;\n","import { isInstanceOf } from './type-utils';\n\nexport const readFile = (file: File) =>\n new Promise<ArrayBuffer | null>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n resolve(reader.result as ArrayBuffer | null);\n };\n reader.onerror = () => {\n console.error((reader.error as DOMException).message);\n };\n reader.readAsArrayBuffer(file);\n });\n\nexport const transferToArrayBuffer = (data: File | Blob | ArrayBuffer) => {\n if (isInstanceOf(data, globalThis.File)) {\n return readFile(data as File);\n } else if (isInstanceOf(data, globalThis.Blob)) {\n return readFile(new File([data as Blob], ''));\n } else if (isInstanceOf(data, globalThis.ArrayBuffer)) {\n return Promise.resolve(data as ArrayBuffer);\n }\n return Promise.resolve(null);\n};\n\nexport const concatUint8Arrays = (arrays: Array<Uint8Array>) => {\n let totalLength = 0;\n for (const arr of arrays) {\n totalLength += arr.byteLength;\n }\n const result = new Uint8Array(totalLength);\n let offset = 0;\n for (const arr of arrays) {\n result.set(arr, offset);\n offset += arr.byteLength;\n }\n return result;\n};\n","import { PAGModule } from '../pag-module';\n\nexport function wasmAwaitRewind(constructor: any) {\n const ignoreStaticFunctions = ['length', 'name', 'prototype', 'wasmAsyncMethods'];\n let staticFunctions = Object.getOwnPropertyNames(constructor).filter(\n (name) => ignoreStaticFunctions.indexOf(name) === -1,\n );\n if (constructor.wasmAsyncMethods && constructor.wasmAsyncMethods.length > 0) {\n staticFunctions = staticFunctions.filter((name) => constructor.wasmAsyncMethods.indexOf(name) === -1);\n }\n\n let functions = Object.getOwnPropertyNames(constructor.prototype).filter(\n (name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',\n );\n if (constructor.prototype.wasmAsyncMethods && constructor.prototype.wasmAsyncMethods.length > 0) {\n functions = functions.filter((name) => constructor.prototype.wasmAsyncMethods.indexOf(name) === -1);\n }\n\n const proxyFn = (target: { [prop: string]: (...args: any[]) => any }, methodName: string) => {\n const fn = target[methodName];\n target[methodName] = function (...args) {\n if (PAGModule.Asyncify.currData !== null) {\n const currData = PAGModule.Asyncify.currData;\n PAGModule.Asyncify.currData = null;\n const ret = fn.call(this, ...args);\n PAGModule.Asyncify.currData = currData;\n return ret;\n } else {\n return fn.call(this, ...args);\n }\n };\n };\n\n staticFunctions.forEach((name) => proxyFn(constructor, name));\n functions.forEach((name) => proxyFn(constructor.prototype, name));\n}\n\nexport function wasmAsyncMethod(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n if (!target.wasmAsyncMethods) {\n target.wasmAsyncMethods = [];\n }\n target.wasmAsyncMethods.push(propertyKey);\n}\n\nexport function destroyVerify(constructor: any) {\n let functions = Object.getOwnPropertyNames(constructor.prototype).filter(\n (name) => name !== 'constructor' && typeof constructor.prototype[name] === 'function',\n );\n\n const proxyFn = (target: { [prop: string]: any }, methodName: string) => {\n const fn = target[methodName];\n target[methodName] = function (...args: any[]) {\n if (this['isDestroyed']) {\n console.error(`Don't call ${methodName} of the ${constructor.name} that is destroyed.`);\n return;\n }\n return fn.call(this, ...args);\n };\n };\n functions.forEach((name) => proxyFn(constructor.prototype, name));\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { transferToArrayBuffer } from '../utils/common';\nimport { destroyVerify } from '../utils/decorators';\n\nimport type { WorkerPAGImage } from './pag-image';\nimport type { TextDocument } from '../types';\n\n@destroyVerify\nexport class WorkerPAGFile {\n /**\n * Load pag file from file.\n */\n public static async load(worker: Worker, data: File | Blob | ArrayBuffer) {\n const buffer = await transferToArrayBuffer(data);\n if (!buffer)\n throw new Error(\n 'Initialize PAGFile data type error, please put check data type must to be File | Blob | ArrayBuffer!',\n );\n return await postMessage(\n worker,\n { name: WorkerMessageType.PAGFile_load, args: [data] },\n (key) => new WorkerPAGFile(worker, key),\n );\n }\n\n public key: number;\n public worker: Worker;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n /**\n * Get a text data of the specified index. The index ranges from 0 to numTexts - 1.\n * Note: It always returns the default text data.\n */\n public getTextData(editableTextIndex: number) {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_getTextData, args: [this.key, editableTextIndex] },\n (res: TextDocument & { key: number }) => {\n res.delete = () => {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.TextDocument_delete, args: [res.key] },\n () => undefined,\n );\n };\n return res;\n },\n );\n }\n /**\n * Replace the text data of the specified index. The index ranges from 0 to PAGFile.numTexts - 1.\n * Passing in null for the textData parameter will reset it to default text data.\n */\n public replaceText(editableTextIndex: number, textData: TextDocument & { [prop: string]: any }): Promise<void> {\n const textDocument: { [prop: string]: any } = {};\n for (const key in textData) {\n if (key !== 'delete') {\n textDocument[key] = textData[key];\n }\n }\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_replaceText, args: [this.key, editableTextIndex, textDocument] },\n () => undefined,\n );\n }\n /**\n * Replace the image content of the specified index with a PAGImage object. The index ranges from\n * 0 to PAGFile.numImages - 1. Passing in null for the image parameter will reset it to default\n * image content.\n */\n public replaceImage(editableImageIndex: number, pagImage: WorkerPAGImage) {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGFile_replaceImage, args: [this.key, editableImageIndex, pagImage.key] },\n () => undefined,\n );\n }\n\n public destroy(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGFile_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { destroyVerify } from '../utils/decorators';\nimport { calculateDisplaySize } from '../utils/canvas';\n\nimport type { WorkerPAGFile } from './pag-file';\nimport type { PAGViewOptions } from '../pag-view';\nimport type { DebugData, PAGScaleMode } from '../types';\n\n@destroyVerify\nexport class WorkerPAGView {\n /**\n * Create pag view.\n * @param file pag file.\n * @param canvas target render canvas.\n * @param initOptions pag view options\n * @returns\n */\n public static init(file: WorkerPAGFile, canvas: HTMLCanvasElement, initOptions?: PAGViewOptions) {\n const options = {\n ...{\n useScale: true,\n useCanvas2D: false,\n firstFrame: true,\n },\n ...initOptions,\n };\n if (options.useScale) {\n resizeCanvas(canvas);\n }\n const offscreen = canvas.transferControlToOffscreen();\n return postMessage(\n file.worker,\n { name: WorkerMessageType.PAGView_init, args: [file.key, offscreen, initOptions] },\n (key: number) => new WorkerPAGView(file.worker, key),\n [offscreen],\n );\n }\n\n public key: number;\n public worker: Worker;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n /**\n * The duration of current composition in microseconds.\n */\n public duration() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_duration, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Start the animation.\n */\n public play() {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_play, args: [this.key] }, () => undefined);\n }\n /**\n * Pause the animation.\n */\n public pause(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_pause, args: [this.key] }, () => undefined);\n }\n /**\n * Stop the animation.\n */\n public stop(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_stop, args: [this.key] }, () => undefined);\n }\n /**\n * Set the number of times the animation will repeat. The default is 1, which means the animation\n * will play only once. 0 means the animation will play infinity times.\n */\n public setRepeatCount(repeatCount: number): Promise<void> {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_setRepeatCount, args: [this.key, repeatCount] },\n () => undefined,\n );\n }\n /**\n * Returns the current progress of play position, the value is from 0.0 to 1.0. It is applied only\n * when the composition is not null.\n */\n public getProgress() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_getProgress, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Returns the current frame.\n */\n public currentFrame() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_currentFrame, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Set the progress of play position, the value is from 0.0 to 1.0.\n */\n public setProgress(progress: number) {\n return postMessage(\n this.worker,\n {\n name: WorkerMessageType.PAGView_setProgress,\n args: [this.key, progress],\n },\n () => undefined,\n );\n }\n /**\n * Returns the current scale mode.\n */\n public scaleMode() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_scaleMode, args: [this.key] },\n (res: number) => res,\n );\n }\n /**\n * Specifies the rule of how to scale the pag content to fit the surface size. The matrix\n * changes when this method is called.\n */\n public setScaleMode(value: PAGScaleMode): Promise<void> {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_setScaleMode, args: [this.key, value] },\n () => undefined,\n );\n }\n /**\n * Call this method to render current position immediately. If the play() method is already\n * called, there is no need to call it. Returns true if the content has changed.\n */\n public flush() {\n return postMessage(this.worker, { name: WorkerMessageType.PAGView_flush, args: [this.key] }, (res: boolean) => res);\n }\n\n public getDebugData() {\n return postMessage(\n this.worker,\n { name: WorkerMessageType.PAGView_getDebugData, args: [this.key] },\n (res: DebugData) => res,\n );\n }\n\n public destroy() {\n postMessage(this.worker, { name: WorkerMessageType.PAGView_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n\nconst resizeCanvas = (canvas: HTMLCanvasElement) => {\n const displaySize = calculateDisplaySize(canvas);\n canvas.style.width = `${displaySize.width}px`;\n canvas.style.height = `${displaySize.height}px`;\n canvas.width = displaySize.width * globalThis.devicePixelRatio;\n canvas.height = displaySize.height * globalThis.devicePixelRatio;\n};\n","export const calculateDisplaySize = (canvas: HTMLCanvasElement) => {\n const styleDeclaration = globalThis.getComputedStyle(canvas, null);\n const computedSize = {\n width: Number(styleDeclaration.width.replace('px', '')),\n height: Number(styleDeclaration.height.replace('px', '')),\n };\n if (computedSize.width > 0 && computedSize.height > 0) {\n return computedSize;\n } else {\n const styleSize = {\n width: Number(canvas.style.width.replace('px', '')),\n height: Number(canvas.style.height.replace('px', '')),\n };\n if (styleSize.width > 0 && styleSize.height > 0) {\n return styleSize;\n } else {\n return {\n width: canvas.width,\n height: canvas.height,\n };\n }\n }\n};\n","import { destroyVerify } from '../utils/decorators';\nimport { isInstanceOf } from '../utils/type-utils';\nimport { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\n\n@destroyVerify\nexport class WorkerPAGImage {\n public static async fromSource(worker: Worker, source: TexImageSource) {\n const width = isInstanceOf(source, globalThis.HTMLVideoElement)\n ? (source as HTMLVideoElement).videoWidth\n : source.width;\n const height = isInstanceOf(source, globalThis.HTMLVideoElement)\n ? (source as HTMLVideoElement).videoHeight\n : source.height;\n const canvas = new OffscreenCanvas(width, height);\n canvas.width = source.width;\n canvas.height = source.height;\n const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;\n ctx.drawImage(source as CanvasImageSource, 0, 0, source.width, source.height);\n const bitmap = await createImageBitmap(canvas);\n return postMessage(\n worker,\n { name: WorkerMessageType.PAGImage_fromSource, args: [bitmap] },\n (key: number) => new WorkerPAGImage(worker, key),\n [bitmap],\n );\n }\n\n public worker: Worker;\n public key: number;\n public isDestroyed = false;\n\n public constructor(worker: Worker, key: number) {\n this.worker = worker;\n this.key = key;\n }\n\n public destroy(): Promise<void> {\n return postMessage(this.worker, { name: WorkerMessageType.PAGImage_destroy, args: [this.key] }, () => {\n this.isDestroyed = true;\n });\n }\n}\n","import { WorkerMessageType } from './events';\nimport { postMessage } from './utils';\nimport { VideoReader } from '../core/video-reader';\nimport { WorkerPAGFile } from './pag-file';\nimport { WorkerPAGView } from './pag-view';\nimport { WorkerPAGImage } from './pag-image';\n\nimport type { WorkerMessage } from './worker';\nimport type { ModuleOption } from '../pag';\nimport type { TimeRange } from '../interfaces';\n\nexport const MAX_ACTIVE_WORKER_CONTEXTS = 4;\n\nconst videoReaders: VideoReader[] = [];\n\nexport interface PAGWorkerOptions {\n /**\n * Link to wasm file and libpag core script.\n */\n locateFile?: (file: 'libpag.wasm' | 'libpag.js') => string;\n /**\n * Configure for worker.\n */\n workerOptions?: WorkerOptions;\n}\n\nexport const createPAGWorker = (pagWorkerOptions: PAGWorkerOptions = {}) => {\n let scriptUrl = pagWorkerOptions.locateFile ? pagWorkerOptions.locateFile('libpag.js') : 'libpag.js';\n const option: { fileUrl?: string } & ModuleOption = {};\n if (pagWorkerOptions.locateFile) {\n option.fileUrl = pagWorkerOptions.locateFile('libpag.wasm');\n }\n const workerOptions = pagWorkerOptions.workerOptions || {};\n const worker = new Worker(scriptUrl, {\n ...workerOptions,\n type: 'module'\n });\n return postMessage(worker, { name: WorkerMessageType.PAGInit, args: [option] }, () => {\n addGlobalWorkerListener(worker);\n return worker;\n });\n};\n\nconst addGlobalWorkerListener = (worker: Worker) => {\n const handle = (event: MessageEvent<WorkerMessage>) => {\n if (event.data.name.includes(WorkerMessageType.VideoReader_constructor)) {\n const videoReader = new VideoReader(\n ...(event.data.args as [Uint8Array, number, number, number, TimeRange[], boolean]),\n );\n videoReaders.push(videoReader);\n worker.postMessage({ name: event.data.name, args: [videoReaders.length - 1] });\n return;\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_prepare)) {\n const [proxyId, targetFrame, playbackRate] = event.data.args as [number, number, number];\n videoReaders[proxyId].prepare(targetFrame, playbackRate).then(() => {\n videoReaders[proxyId].generateBitmap().then((bitmap) => {\n worker.postMessage({ name: event.data.name, args: [bitmap] }, [bitmap]);\n });\n });\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_play)) {\n videoReaders[event.data.args[0]].play().then((res) => {\n worker.postMessage({ name: event.data.name, args: [res] });\n });\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_pause)) {\n videoReaders[event.data.args[0]].pause();\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_stop)) {\n videoReaders[event.data.args[0]].stop();\n }\n if (event.data.name.includes(WorkerMessageType.VideoReader_getError)) {\n worker.postMessage({ name: event.data.name, args: [videoReaders[event.data.args[0]].getError()] });\n }\n };\n worker.addEventListener('message', handle);\n};\n\nexport { WorkerPAGFile, WorkerPAGView, WorkerPAGImage };\n"],"names":["WorkerMessageType","messageCount","postMessage","worker","message","callback","transfer","Promise","resolve","name","generateMessageName","handle","event","data","removeEventListener","args","addEventListener","eventHandlers","addListener","node","handler","capture","push","removeListener","targetNode","targetHandler","filter","forEach","removeAllListeners","nav","navigator","userAgent","ANDROID","test","MOBILE","IPHONE","WECHAT","SAFARI_OR_IOS_WEBVIEW","WORKER","globalThis","importScripts","PAGModule","BitmapImage","constructor","bitmap","this","setBitmap","close","WorkerVideoReader","proxyId","isSought","isPlaying","bitmapImage","prepare","targetFrame","playbackRate","self","VideoReader_prepare","res","getVideo","onDestroy","play","VideoReader_play","pause","VideoReader_pause","stop","VideoReader_stop","getError","VideoReader_getError","isInstanceOf","value","type","waitVideoCanPlay","videoElement","canplayHandle","clearTimeout","timer","setTimeout","VideoReader","source","width","height","frameRate","staticTimeRanges","isWorker","videoEl","canplay","disablePlaybackRate","error","player","bitmapCanvas","bitmapCtx","HTMLVideoElement","document","createElement","style","display","muted","playsInline","preload","then","blob","Blob","src","URL","createObjectURL","load","StaticTimeRanges","linkPlayer","currentPlayer","create","uint8Array","buffer","slice","byteOffset","byteLength","VideoReader_constructor","videoReader","linkVideoReader","setError","currentTime","targetTime","e","requestAnimationFrame","Math","round","contains","seek","abs","targetPlaybackRate","min","max","paused","generateBitmap","OffscreenCanvas","getContext","fillRect","drawImage","createImageBitmap","window","WeixinJSBridge","invoke","visibilityState","visibilityHandle","Error","unlinkVideoReader","reject","onSeeked","seekTimeout","catch","onCanPlay","readyState","HTMLMediaElement","HAVE_FUTURE_DATA","timeRanges","length","timeRange","start","end","readFile","file","reader","FileReader","onload","result","onerror","console","readAsArrayBuffer","destroyVerify","functions","Object","getOwnPropertyNames","prototype","proxyFn","target","methodName","fn","call","WorkerPAGFile","key","isDestroyed","File","ArrayBuffer","transferToArrayBuffer","PAGFile_load","getTextData","editableTextIndex","PAGFile_getTextData","delete","TextDocument_delete","replaceText","textData","textDocument","PAGFile_replaceText","replaceImage","editableImageIndex","pagImage","PAGFile_replaceImage","destroy","PAGFile_destroy","exports","__decorateClass","WorkerPAGView","init","canvas","initOptions","useScale","useCanvas2D","firstFrame","resizeCanvas","offscreen","transferControlToOffscreen","PAGView_init","duration","PAGView_duration","PAGView_play","PAGView_pause","PAGView_stop","setRepeatCount","repeatCount","PAGView_setRepeatCount","getProgress","PAGView_getProgress","currentFrame","PAGView_currentFrame","setProgress","progress","PAGView_setProgress","scaleMode","PAGView_scaleMode","setScaleMode","PAGView_setScaleMode","flush","PAGView_flush","getDebugData","PAGView_getDebugData","PAGView_destroy","displaySize","styleDeclaration","getComputedStyle","computedSize","Number","replace","styleSize","calculateDisplaySize","devicePixelRatio","WorkerPAGImage","fromSource","videoWidth","videoHeight","PAGImage_fromSource","PAGImage_destroy","videoReaders","addGlobalWorkerListener","includes","pagWorkerOptions","scriptUrl","locateFile","option","fileUrl","workerOptions","Worker","PAGInit"],"mappings":"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"}
@@ -1,80 +0,0 @@
1
- import { WorkerMessageType } from './events';
2
- import { postMessage } from './utils';
3
- import { VideoReader } from '../core/video-reader';
4
- import { WorkerPAGFile } from './pag-file';
5
- import { WorkerPAGView } from './pag-view';
6
- import { WorkerPAGImage } from './pag-image';
7
-
8
- import type { WorkerMessage } from './worker';
9
- import type { ModuleOption } from '../pag';
10
- import type { TimeRange } from '../interfaces';
11
-
12
- export const MAX_ACTIVE_WORKER_CONTEXTS = 4;
13
-
14
- const videoReaders: VideoReader[] = [];
15
-
16
- export interface PAGWorkerOptions {
17
- /**
18
- * Link to wasm file and libpag core script.
19
- */
20
- locateFile?: (file: 'libpag.wasm' | 'libpag.js') => string;
21
- /**
22
- * Configure for worker.
23
- */
24
- workerOptions?: WorkerOptions;
25
- }
26
-
27
- export const createPAGWorker = (pagWorkerOptions: PAGWorkerOptions = {}) => {
28
- let scriptUrl = pagWorkerOptions.locateFile ? pagWorkerOptions.locateFile('libpag.js') : 'libpag.js';
29
- const option: { fileUrl?: string } & ModuleOption = {};
30
- if (pagWorkerOptions.locateFile) {
31
- option.fileUrl = pagWorkerOptions.locateFile('libpag.wasm');
32
- }
33
- const workerOptions = pagWorkerOptions.workerOptions || {};
34
- const worker = new Worker(scriptUrl, {
35
- ...workerOptions,
36
- type: 'module'
37
- });
38
- return postMessage(worker, { name: WorkerMessageType.PAGInit, args: [option] }, () => {
39
- addGlobalWorkerListener(worker);
40
- return worker;
41
- });
42
- };
43
-
44
- const addGlobalWorkerListener = (worker: Worker) => {
45
- const handle = (event: MessageEvent<WorkerMessage>) => {
46
- if (event.data.name.includes(WorkerMessageType.VideoReader_constructor)) {
47
- const videoReader = new VideoReader(
48
- ...(event.data.args as [Uint8Array, number, number, number, TimeRange[], boolean]),
49
- );
50
- videoReaders.push(videoReader);
51
- worker.postMessage({ name: event.data.name, args: [videoReaders.length - 1] });
52
- return;
53
- }
54
- if (event.data.name.includes(WorkerMessageType.VideoReader_prepare)) {
55
- const [proxyId, targetFrame, playbackRate] = event.data.args as [number, number, number];
56
- videoReaders[proxyId].prepare(targetFrame, playbackRate).then(() => {
57
- videoReaders[proxyId].generateBitmap().then((bitmap) => {
58
- worker.postMessage({ name: event.data.name, args: [bitmap] }, [bitmap]);
59
- });
60
- });
61
- }
62
- if (event.data.name.includes(WorkerMessageType.VideoReader_play)) {
63
- videoReaders[event.data.args[0]].play().then((res) => {
64
- worker.postMessage({ name: event.data.name, args: [res] });
65
- });
66
- }
67
- if (event.data.name.includes(WorkerMessageType.VideoReader_pause)) {
68
- videoReaders[event.data.args[0]].pause();
69
- }
70
- if (event.data.name.includes(WorkerMessageType.VideoReader_stop)) {
71
- videoReaders[event.data.args[0]].stop();
72
- }
73
- if (event.data.name.includes(WorkerMessageType.VideoReader_getError)) {
74
- worker.postMessage({ name: event.data.name, args: [videoReaders[event.data.args[0]].getError()] });
75
- }
76
- };
77
- worker.addEventListener('message', handle);
78
- };
79
-
80
- export { WorkerPAGFile, WorkerPAGView, WorkerPAGImage };
@@ -1,41 +0,0 @@
1
- export enum WorkerMessageType {
2
- PAGInit = 'PAGInit',
3
- // PAGView static methods
4
- PAGView_init = 'PAGView.init',
5
- // PAGView instance methods
6
- PAGView_duration = 'PAGView.duration',
7
- PAGView_play = 'PAGView.play',
8
- PAGView_pause = 'PAGView.pause',
9
- PAGView_stop = 'PAGView.stop',
10
- PAGView_setRepeatCount = 'PAGView.setRepeatCount',
11
- PAGView_getProgress = 'PAGView.getProgress',
12
- PAGView_currentFrame = 'PAGView.currentFrame',
13
- PAGView_setProgress = 'PAGView.setProgress',
14
- PAGView_scaleMode = 'PAGView.scaleMode',
15
- PAGView_setScaleMode = 'PAGView.setScaleMode',
16
- PAGView_flush = 'PAGView.flush',
17
- PAGView_getDebugData = 'PAGView.getDebugData',
18
- PAGView_destroy = 'PAGView.destroy',
19
- // PAGFile static methods
20
- PAGFile_load = 'PAGFile.load',
21
- // PAGFile instance methods
22
- PAGFile_getTextData = 'PAGFile.getTextData',
23
- PAGFile_replaceText = 'PAGFile.replaceText',
24
- PAGFile_replaceImage = 'PAGFile.replaceImage',
25
- PAGFile_destroy = 'PAGFile.destroy',
26
- // PAGImage static methods
27
- PAGImage_fromSource = 'PAGImage.fromSource',
28
- PAGImage_destroy = 'PAGImage.destroy',
29
- // VideoReader static methods
30
- VideoReader_constructor = 'VideoReader.constructor',
31
- // VideoReader instance methods
32
- VideoReader_prepare = 'VideoReader.prepare',
33
- VideoReader_play = 'VideoReader.play',
34
- VideoReader_pause = 'VideoReader.pause',
35
- VideoReader_stop = 'VideoReader.stop',
36
- VideoReader_getError = 'VideoReader.getError',
37
- // Binding video reader
38
- PAGModule_linkVideoReader = 'PAGModule.linkVideoReader',
39
- // TextDocument instance methods
40
- TextDocument_delete = 'TextDocument.delete',
41
- }
@@ -1,90 +0,0 @@
1
- import { WorkerMessageType } from './events';
2
- import { postMessage } from './utils';
3
- import { transferToArrayBuffer } from '../utils/common';
4
- import { destroyVerify } from '../utils/decorators';
5
-
6
- import type { WorkerPAGImage } from './pag-image';
7
- import type { TextDocument } from '../types';
8
-
9
- @destroyVerify
10
- export class WorkerPAGFile {
11
- /**
12
- * Load pag file from file.
13
- */
14
- public static async load(worker: Worker, data: File | Blob | ArrayBuffer) {
15
- const buffer = await transferToArrayBuffer(data);
16
- if (!buffer)
17
- throw new Error(
18
- 'Initialize PAGFile data type error, please put check data type must to be File | Blob | ArrayBuffer!',
19
- );
20
- return await postMessage(
21
- worker,
22
- { name: WorkerMessageType.PAGFile_load, args: [data] },
23
- (key) => new WorkerPAGFile(worker, key),
24
- );
25
- }
26
-
27
- public key: number;
28
- public worker: Worker;
29
- public isDestroyed = false;
30
-
31
- public constructor(worker: Worker, key: number) {
32
- this.worker = worker;
33
- this.key = key;
34
- }
35
- /**
36
- * Get a text data of the specified index. The index ranges from 0 to numTexts - 1.
37
- * Note: It always returns the default text data.
38
- */
39
- public getTextData(editableTextIndex: number) {
40
- return postMessage(
41
- this.worker,
42
- { name: WorkerMessageType.PAGFile_getTextData, args: [this.key, editableTextIndex] },
43
- (res: TextDocument & { key: number }) => {
44
- res.delete = () => {
45
- return postMessage(
46
- this.worker,
47
- { name: WorkerMessageType.TextDocument_delete, args: [res.key] },
48
- () => undefined,
49
- );
50
- };
51
- return res;
52
- },
53
- );
54
- }
55
- /**
56
- * Replace the text data of the specified index. The index ranges from 0 to PAGFile.numTexts - 1.
57
- * Passing in null for the textData parameter will reset it to default text data.
58
- */
59
- public replaceText(editableTextIndex: number, textData: TextDocument & { [prop: string]: any }): Promise<void> {
60
- const textDocument: { [prop: string]: any } = {};
61
- for (const key in textData) {
62
- if (key !== 'delete') {
63
- textDocument[key] = textData[key];
64
- }
65
- }
66
- return postMessage(
67
- this.worker,
68
- { name: WorkerMessageType.PAGFile_replaceText, args: [this.key, editableTextIndex, textDocument] },
69
- () => undefined,
70
- );
71
- }
72
- /**
73
- * Replace the image content of the specified index with a PAGImage object. The index ranges from
74
- * 0 to PAGFile.numImages - 1. Passing in null for the image parameter will reset it to default
75
- * image content.
76
- */
77
- public replaceImage(editableImageIndex: number, pagImage: WorkerPAGImage) {
78
- return postMessage(
79
- this.worker,
80
- { name: WorkerMessageType.PAGFile_replaceImage, args: [this.key, editableImageIndex, pagImage.key] },
81
- () => undefined,
82
- );
83
- }
84
-
85
- public destroy(): Promise<void> {
86
- return postMessage(this.worker, { name: WorkerMessageType.PAGFile_destroy, args: [this.key] }, () => {
87
- this.isDestroyed = true;
88
- });
89
- }
90
- }
@@ -1,43 +0,0 @@
1
- import { destroyVerify } from '../utils/decorators';
2
- import { isInstanceOf } from '../utils/type-utils';
3
- import { WorkerMessageType } from './events';
4
- import { postMessage } from './utils';
5
-
6
- @destroyVerify
7
- export class WorkerPAGImage {
8
- public static async fromSource(worker: Worker, source: TexImageSource) {
9
- const width = isInstanceOf(source, globalThis.HTMLVideoElement)
10
- ? (source as HTMLVideoElement).videoWidth
11
- : source.width;
12
- const height = isInstanceOf(source, globalThis.HTMLVideoElement)
13
- ? (source as HTMLVideoElement).videoHeight
14
- : source.height;
15
- const canvas = new OffscreenCanvas(width, height);
16
- canvas.width = source.width;
17
- canvas.height = source.height;
18
- const ctx = canvas.getContext('2d') as OffscreenCanvasRenderingContext2D;
19
- ctx.drawImage(source as CanvasImageSource, 0, 0, source.width, source.height);
20
- const bitmap = await createImageBitmap(canvas);
21
- return postMessage(
22
- worker,
23
- { name: WorkerMessageType.PAGImage_fromSource, args: [bitmap] },
24
- (key: number) => new WorkerPAGImage(worker, key),
25
- [bitmap],
26
- );
27
- }
28
-
29
- public worker: Worker;
30
- public key: number;
31
- public isDestroyed = false;
32
-
33
- public constructor(worker: Worker, key: number) {
34
- this.worker = worker;
35
- this.key = key;
36
- }
37
-
38
- public destroy(): Promise<void> {
39
- return postMessage(this.worker, { name: WorkerMessageType.PAGImage_destroy, args: [this.key] }, () => {
40
- this.isDestroyed = true;
41
- });
42
- }
43
- }