UNPKG

tav-media

Version:

Cross platform media editing framework

92 lines (91 loc) 3.63 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { Http } from '../io/http'; import { tav } from '../tav'; export class WxImageReader { constructor(path, rect) { // Used on WeChat this.type = 1; this.contentTime = 0; this.renderRequest = false; this.released = false; this.width = rect.right - rect.left; this.height = rect.bottom - rect.top; this.path = path; const canvas = WxImageReader.sharedCanvas; this.canvas = canvas; WxImageReader.preload(path); this.imageEl = WxImageReader.images[path]; this.width = this.imageEl.width || this.width; this.height = this.imageEl.height || this.height; } static preload(path) { return __awaiter(this, void 0, void 0, function* () { if (this.images[path]) { return this.images[path]; } if (!this.sharedCanvas) { this.sharedCanvas = yield new Promise(((res) => { wx.createSelectorQuery().select('#tavImageReaderCanvas') .node((r) => { const canvas = r.node; canvas.width = 2048; canvas.height = 2048; res(canvas); }) .exec(); })); } const imageEl = this.sharedCanvas.createImage(); imageEl.src = Http.getUrl(path); ; this.images[path] = imageEl; return new Promise((res, rej) => { imageEl.onload = _e => res(imageEl); imageEl.onerror = _e => rej(imageEl); }); }); } readSample() { let { width, height } = this; width = Math.min(width, this.canvas.width); height = Math.min(height, this.canvas.height); const context2D = this.canvas.getContext('2d'); context2D.clearRect(0, 0, this.width, this.height); context2D.drawImage(this.imageEl, 0, 0, width, height); const imageData = context2D.getImageData(0, 0, width, height); const dataUint8Array = imageData.data; const module = tav; const numBytes = dataUint8Array.byteLength * dataUint8Array.BYTES_PER_ELEMENT; const dataPtr = module._malloc(numBytes); this.lastSampleData = dataPtr; const dataOnHeap = new Uint8ClampedArray(module.HEAPU8.buffer, dataPtr, numBytes); dataOnHeap.set(dataUint8Array); return { bytes: dataOnHeap.byteOffset, length: dataOnHeap.length, width, height, }; } freeBuffer() { if (!this.lastSampleData) { return; } const module = tav; module._free(this.lastSampleData); this.lastSampleData = null; } release() { this.freeBuffer(); this.released = true; } } WxImageReader.images = {};