summaryrefslogtreecommitdiff
path: root/apps/web/src/services/renderer/nodes
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2026-02-08 16:50:31 +0100
committerMaze Winther <mazewinther@gmail.com>2026-02-08 16:50:31 +0100
commitc6666fd385588f11d6ec887455a115d525e2e6c2 (patch)
tree08a142946f27eb70854a791165cd00ad9693678c /apps/web/src/services/renderer/nodes
parent9b5fd6eb077a3fb2380f42414b65405030a01fcd (diff)
downloadopencut-c6666fd385588f11d6ec887455a115d525e2e6c2.tar.gz
feat: update text properties to use dynamic font size limits and scaling
Diffstat (limited to 'apps/web/src/services/renderer/nodes')
-rw-r--r--apps/web/src/services/renderer/nodes/text-node.ts22
1 files changed, 19 insertions, 3 deletions
diff --git a/apps/web/src/services/renderer/nodes/text-node.ts b/apps/web/src/services/renderer/nodes/text-node.ts
index 2cbf3d2a..bb79e086 100644
--- a/apps/web/src/services/renderer/nodes/text-node.ts
+++ b/apps/web/src/services/renderer/nodes/text-node.ts
@@ -1,9 +1,21 @@
import type { CanvasRenderer } from "../canvas-renderer";
import { BaseNode } from "./base-node";
import type { TextElement } from "@/types/timeline";
+import { FONT_SIZE_SCALE_REFERENCE } from "@/constants/text-constants";
+
+function scaleFontSize({
+ fontSize,
+ canvasHeight,
+}: {
+ fontSize: number;
+ canvasHeight: number;
+}): number {
+ return fontSize * (canvasHeight / FONT_SIZE_SCALE_REFERENCE);
+}
export type TextNodeParams = TextElement & {
canvasCenter: { x: number; y: number };
+ canvasHeight: number;
textBaseline?: CanvasTextBaseline;
};
@@ -32,7 +44,11 @@ export class TextNode extends BaseNode<TextNodeParams> {
const fontWeight = this.params.fontWeight === "bold" ? "bold" : "normal";
const fontStyle = this.params.fontStyle === "italic" ? "italic" : "normal";
- renderer.context.font = `${fontStyle} ${fontWeight} ${this.params.fontSize}px ${this.params.fontFamily}`;
+ const scaledFontSize = scaleFontSize({
+ fontSize: this.params.fontSize,
+ canvasHeight: this.params.canvasHeight,
+ });
+ renderer.context.font = `${fontStyle} ${fontWeight} ${scaledFontSize}px ${this.params.fontFamily}`;
renderer.context.textAlign = this.params.textAlign;
renderer.context.textBaseline = this.params.textBaseline || "middle";
renderer.context.fillStyle = this.params.color;
@@ -43,9 +59,9 @@ export class TextNode extends BaseNode<TextNodeParams> {
if (this.params.backgroundColor) {
const metrics = renderer.context.measureText(this.params.content);
const ascent =
- metrics.actualBoundingBoxAscent ?? this.params.fontSize * 0.8;
+ metrics.actualBoundingBoxAscent ?? scaledFontSize * 0.8;
const descent =
- metrics.actualBoundingBoxDescent ?? this.params.fontSize * 0.2;
+ metrics.actualBoundingBoxDescent ?? scaledFontSize * 0.2;
const textW = metrics.width;
const textH = ascent + descent;
const padX = 8;