dropflow
Version:
A small CSS2 document renderer built from specifications
58 lines (57 loc) • 2.43 kB
TypeScript
import type { Color } from './style.js';
import type { PaintBackend } from './paint.js';
import type { ShapedItem } from './layout-text.js';
import type { LoadedFontFace } from './text-font.js';
import type { Image } from './layout-image.js';
export interface CanvasRenderingContext2D {
moveTo(x: number, y: number): void;
lineTo(x: number, y: number): void;
quadraticCurveTo(cpx: number, cpy: number, x: number, y: number): void;
bezierCurveTo(cp1x: number, cp1y: number, cp2x: number, cp2y: number, x: number, y: number): void;
fillRect(x: number, y: number, w: number, h: number): void;
fillText(text: string, x: number, y: number, maxWidth?: number): void;
translate(x: number, y: number): void;
scale(x: number, y: number): void;
stroke(): void;
fill(): void;
beginPath(): void;
closePath(): void;
save(): void;
restore(): void;
set strokeStyle(value: string);
get strokeStyle(): unknown;
set fillStyle(value: string);
get fillStyle(): unknown;
lineWidth: number;
font: string;
set direction(value: 'ltr' | 'rtl');
get direction(): unknown;
set textAlign(value: 'left');
get textAlign(): unknown;
rect(x: number, y: number, w: number, h: number): void;
clip(): void;
drawImage(image: unknown, x: number, y: number, w?: number, h?: number): void;
}
export interface Canvas {
getContext(ctx: '2d'): CanvasRenderingContext2D;
width: number;
height: number;
}
export default class CanvasPaintBackend implements PaintBackend {
fillColor: Color;
strokeColor: Color;
lineWidth: number;
direction: 'ltr' | 'rtl';
font: LoadedFontFace | undefined;
fontSize: number;
ctx: CanvasRenderingContext2D;
constructor(ctx: CanvasRenderingContext2D);
edge(x: number, y: number, length: number, side: 'top' | 'right' | 'bottom' | 'left'): void;
fastText(x: number, y: number, item: ShapedItem, textStart: number, textEnd: number): void;
correctText(x: number, y: number, item: ShapedItem, glyphStart: number, glyphEnd: number): void;
text(x: number, y: number, item: ShapedItem, totalTextStart: number, totalTextEnd: number, isColorBoundary: boolean): void;
rect(x: number, y: number, w: number, h: number): void;
pushClip(x: number, y: number, w: number, h: number): void;
popClip(): void;
image(x: number, y: number, w: number, h: number, image: Image): void;
}