tav-media
Version:
Cross platform media editing framework
92 lines (91 loc) • 3.63 kB
JavaScript
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 = {};