UNPKG

mdx-m3-viewer

Version:

A browser WebGL model viewer. Mainly focused on models of the games Warcraft 3 and Starcraft 2.

136 lines (97 loc) 3.2 kB
import { powerOfTwo } from './math'; const canvas = document.createElement('canvas'); const ctx = <CanvasRenderingContext2D>canvas.getContext('2d'); const canvas2 = document.createElement('canvas'); const ctx2 = <CanvasRenderingContext2D>canvas2.getContext('2d'); export function blobToImage(blob: Blob) { return new Promise((resolve: (image: HTMLImageElement) => void) => { let url = URL.createObjectURL(blob); let image = new Image(); image.onload = () => { canvas.width = image.width; canvas.height = image.height; ctx.drawImage(image, 0, 0); resolve(image); }; image.onerror = (e) => { resolve(image); }; image.src = url; }); } export function blobToImageData(blob: Blob) { return new Promise((resolve, reject) => { let url = URL.createObjectURL(blob); let image = new Image(); image.onload = () => { URL.revokeObjectURL(url); canvas.width = image.width; canvas.height = image.height; ctx.drawImage(image, 0, 0); resolve(ctx.getImageData(0, 0, image.width, image.height)); }; image.onerror = (e) => { reject(e); }; image.src = url; }); } export function imageDataToBlob(imageData: ImageData) { return new Promise((resolve: BlobCallback) => { canvas.width = imageData.width; canvas.height = imageData.height; ctx.putImageData(imageData, 0, 0); canvas.toBlob((blob) => { resolve(blob); }); }); } export function imageDataToDataUrl(imageData: ImageData) { canvas.width = imageData.width; canvas.height = imageData.height; ctx.putImageData(imageData, 0, 0); return canvas.toDataURL(); } export function imageDataToImage(imageData: ImageData) { let image = new Image(); image.src = imageDataToDataUrl(imageData); return image; } export function imageToImageData(image: TexImageSource) { let width = image.width; let height = image.height; canvas.width = width; canvas.height = height; ctx.drawImage(<CanvasImageSource>image, 0, 0); return ctx.getImageData(0, 0, width, height); } export function scaleNPOT(imageData: ImageData) { let width = imageData.width; let height = imageData.height; let potWidth = powerOfTwo(width); let potHeight = powerOfTwo(height); if (width !== potWidth || height !== potHeight) { return resizeImageData(imageData, potWidth, potHeight); } return imageData; } export function resizeImageData(data: ImageData, width: number, height: number) { let srcWidth = data.width; let srcHeight = data.height; // ImageData if (data instanceof ImageData) { canvas.width = srcWidth; canvas.height = srcHeight; ctx.putImageData(data, 0, 0); canvas2.width = width; canvas2.height = height; ctx2.drawImage(canvas, 0, 0, width, height); return ctx2.getImageData(0, 0, width, height); // Assumed to be Image } else { canvas.width = width; canvas.height = height; ctx.drawImage(data, 0, 0, width, height); return ctx.getImageData(0, 0, width, height); } }