5 Commits

Author SHA1 Message Date
95afbf9bd3 drawWithAlpha 2023-10-25 17:40:39 -06:00
c58861bc93 deferred drawing 2023-10-24 01:11:15 -06:00
7d6b54825d oops 2023-10-24 00:55:01 -06:00
f1bd085384 text align 2023-10-24 00:49:49 -06:00
6661936188 clearing 2023-10-23 14:09:18 -06:00

View File

@@ -81,6 +81,7 @@ export class Doodler {
}
protected draw() {
this.ctx.clearRect(0, 0, this.width, this.height);
this.ctx.fillStyle = this.bg;
this.ctx.fillRect(0, 0, this.width, this.height);
// for (const d of this.draggables.filter(d => d.beingDragged)) {
@@ -88,6 +89,7 @@ export class Doodler {
// }
for (const [i, l] of (this.layers || []).entries()) {
l(this.ctx, i);
this.drawDeferred();
}
this.drawUI();
}
@@ -197,6 +199,13 @@ export class Doodler {
this.ctx.restore();
}
drawWithAlpha(alpha: number, cb: () => void) {
this.ctx.save();
this.ctx.globalAlpha = Math.min(Math.max(alpha, 0), 1);
cb();
this.ctx.restore();
}
drawImage(img: HTMLImageElement, at: Vector): void;
drawImage(img: HTMLImageElement, at: Vector, w: number, h: number): void;
drawImage(img: HTMLImageElement, at: Vector, w?: number, h?: number) {
@@ -226,12 +235,27 @@ export class Doodler {
);
}
private deferredDrawings: (() => void)[] = [];
deferDrawing(cb: () => void) {
this.deferredDrawings.push(cb);
}
drawDeferred() {
while (this.deferredDrawings.length) {
this.deferredDrawings.pop()?.();
}
}
setStyle(style?: IStyle) {
const ctx = this.ctx;
ctx.fillStyle = style?.color || style?.fillColor || "black";
ctx.strokeStyle = style?.color || style?.strokeColor || "black";
ctx.lineWidth = style?.weight || 1;
ctx.textAlign = style?.textAlign || ctx.textAlign;
ctx.textBaseline = style?.textBaseline || ctx.textBaseline;
}
fillText(text: string, pos: Vector, maxWidth: number, style?: IStyle) {
@@ -245,6 +269,10 @@ export class Doodler {
this.ctx.strokeText(text, pos.x, pos.y, maxWidth);
}
clearRect(at: Vector, width: number, height: number) {
this.ctx.clearRect(at.x, at.y, width, height);
}
// Interaction
mouseX = 0;
@@ -409,6 +437,15 @@ interface IStyle {
noStroke?: boolean;
noFill?: boolean;
textAlign?: "center" | "end" | "left" | "right" | "start";
textBaseline?:
| "alphabetic"
| "top"
| "hanging"
| "middle"
| "ideographic"
| "bottom";
}
interface IDrawable {