fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
78 lines (71 loc) • 2.44 kB
text/typescript
import { getFabricDocument } from '../../env';
import type { ImageFormat, TSize } from '../../typedefs';
import { FabricError } from '../internals/console';
/**
* Creates canvas element
* @return {CanvasElement} initialized canvas element
*/
export const createCanvasElement = (): HTMLCanvasElement => {
const element = getFabricDocument().createElement('canvas');
if (!element || typeof element.getContext === 'undefined') {
throw new FabricError('Failed to create `canvas` element');
}
return element;
};
/**
* Creates image element (works on client and node)
* @return {HTMLImageElement} HTML image element
*/
export const createImage = (): HTMLImageElement =>
getFabricDocument().createElement('img');
/**
* Creates a canvas element that is a copy of another and is also painted
* @param {CanvasElement} canvas to copy size and content of
* @return {CanvasElement} initialized canvas element
*/
export const copyCanvasElement = (
canvas: HTMLCanvasElement,
): HTMLCanvasElement => {
const newCanvas = createCanvasElementFor(canvas);
newCanvas.getContext('2d')?.drawImage(canvas, 0, 0);
return newCanvas;
};
/**
* Creates a canvas element as big as another
* @param {CanvasElement} canvas to copy size and content of
* @return {CanvasElement} initialized canvas element
*/
export const createCanvasElementFor = (
canvas: HTMLCanvasElement | ImageData | HTMLImageElement | TSize,
): HTMLCanvasElement => {
const newCanvas = createCanvasElement();
newCanvas.width = canvas.width;
newCanvas.height = canvas.height;
return newCanvas;
};
/**
* since 2.6.0 moved from canvas instance to utility.
* possibly useless
* @param {CanvasElement} canvasEl to copy size and content of
* @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too
* @param {number} quality <= 1 and > 0
* @return {String} data url
*/
export const toDataURL = (
canvasEl: HTMLCanvasElement,
format: ImageFormat,
quality: number,
) => canvasEl.toDataURL(`image/${format}`, quality);
export const isHTMLCanvas = (
canvas?: HTMLCanvasElement | string,
): canvas is HTMLCanvasElement => {
return !!canvas && (canvas as HTMLCanvasElement).getContext !== undefined;
};
export const toBlob = (
canvasEl: HTMLCanvasElement,
format?: ImageFormat,
quality?: number,
) =>
new Promise((resolve, _) => {
canvasEl.toBlob(resolve, `image/${format}`, quality);
}) as Promise<Blob | null>;