js-draw
Version:
Draw pictures using a pen, touchscreen, or mouse! JS-draw is a drawing library for JavaScript and TypeScript.
88 lines (87 loc) • 3.74 kB
TypeScript
import { Color4, Mat33, Point2, Vec2, Rect2 } from '@js-draw/math';
import { LoadSaveDataTable } from '../../components/AbstractComponent';
import Viewport from '../../Viewport';
import RenderingStyle from '../RenderingStyle';
import TextRenderingStyle from '../TextRenderingStyle';
import RenderablePathSpec from '../RenderablePathSpec';
export interface RenderableImage {
transform: Mat33;
image: HTMLImageElement | HTMLCanvasElement;
base64Url: string;
label?: string;
}
/**
* Abstract base class for renderers.
*
* @see {@link EditorImage.render}
*/
export default abstract class AbstractRenderer {
private viewport;
private selfTransform;
private transformStack;
protected constructor(viewport: Viewport);
/**
* this.canvasToScreen, etc. should be used instead of the corresponding
* methods on `Viewport`, because the viewport may not accurately reflect
* what is rendered.
*/
protected getViewport(): Viewport;
abstract displaySize(): Vec2;
abstract clear(): void;
protected abstract beginPath(startPoint: Point2): void;
protected abstract endPath(style: RenderingStyle): void;
protected abstract lineTo(point: Point2): void;
protected abstract moveTo(point: Point2): void;
protected abstract traceCubicBezierCurve(p1: Point2, p2: Point2, p3: Point2): void;
protected abstract traceQuadraticBezierCurve(controlPoint: Point2, endPoint: Point2): void;
abstract drawText(text: string, transform: Mat33, style: TextRenderingStyle): void;
abstract drawImage(image: RenderableImage): void;
abstract isTooSmallToRender(rect: Rect2): boolean;
setDraftMode(_draftMode: boolean): void;
protected objectLevel: number;
private currentPaths;
private flushPath;
/**
* Draws a styled path. If within an object started by {@link startObject},
* the resultant path may not be visible until {@link endObject} is called.
*/
drawPath(path: RenderablePathSpec): void;
drawRect(rect: Rect2, lineWidth: number, lineFill: RenderingStyle): void;
/** Draws a filled rectangle. */
fillRect(rect: Rect2, fill: Color4): void;
/**
* This should be called whenever a new object is being drawn.
*
* @param _boundingBox The bounding box of the object to be drawn.
* @param _clip Whether content outside `_boundingBox` should be drawn. Renderers
* that override this method are not required to support `_clip`.
*/
startObject(_boundingBox: Rect2, _clip?: boolean): void;
/**
* Notes the end of an object.
* @param _loaderData - a map from strings to JSON-ifyable objects
* and contains properties attached to the object by whatever loader loaded the image. This
* is used to preserve attributes not supported by js-draw when loading/saving an image.
* Renderers may ignore this.
*
* @param _objectTags - a list of labels (e.g. `className`s) to be attached to the object.
* Renderers may ignore this.
*/
endObject(_loaderData?: LoadSaveDataTable, _objectTags?: string[]): void;
protected getNestingLevel(): number;
abstract drawPoints(...points: Point2[]): void;
canRenderFromWithoutDataLoss(_other: AbstractRenderer): boolean;
renderFromOtherOfSameType(_renderTo: Mat33, other: AbstractRenderer): void;
setTransform(transform: Mat33 | null): void;
pushTransform(transform: Mat33): void;
popTransform(): void;
getCanvasToScreenTransform(): Mat33;
canvasToScreen(vec: Vec2): Vec2;
getSizeOfCanvasPixelOnScreen(): number;
private visibleRectOverride;
/**
* @internal
*/
overrideVisibleRect(rect: Rect2 | null): void;
getVisibleRect(): Rect2;
}