From 6cc6e138925a0f001bc92bc091a1cba611ab6d01 Mon Sep 17 00:00:00 2001 From: Daishi Kato Date: Thu, 9 Jul 2020 22:22:10 +0900 Subject: [PATCH] adjust font baseline on resize (#1820) * adjust font baseline on resize * simplify font scaling on resize * fix: resizing text to avoid glitchy behavior * make text resizing deterministic * no TEXT_WIDTH_PADDING hack Co-authored-by: dwelle --- src/element/resizeElements.ts | 41 ++++++++++------------------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/src/element/resizeElements.ts b/src/element/resizeElements.ts index 835591957..e39263e78 100644 --- a/src/element/resizeElements.ts +++ b/src/element/resizeElements.ts @@ -207,45 +207,26 @@ const rescalePointsInElement = ( } : {}; -// This is not computationally ideal, but can't be helped. +const MIN_FONT_SIZE = 1; + const measureFontSizeFromWH = ( element: NonDeleted, nextWidth: number, nextHeight: number, ): { size: number; baseline: number } | null => { - let scale = Math.min(nextWidth / element.width, nextHeight / element.height); - let nextFontSize = element.fontSize * scale; - let metrics = measureText( - element.text, - getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }), - ); - if (metrics.width - nextWidth < 1 && metrics.height - nextHeight < 1) { - return { size: nextFontSize, baseline: metrics.baseline }; - } - // second measurement - scale = Math.min( - Math.min(nextWidth, metrics.width) / element.width, - Math.min(nextHeight, metrics.height) / element.height, - ); - nextFontSize = element.fontSize * scale; - metrics = measureText( - element.text, - getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }), - ); - if (metrics.width - nextWidth < 1 && metrics.height - nextHeight < 1) { - return { size: nextFontSize, baseline: metrics.baseline }; + // We only use width to scale font on resize + const nextFontSize = element.fontSize * (nextWidth / element.width); + if (nextFontSize < MIN_FONT_SIZE) { + return null; } - // third measurement - scale *= 0.99; // just heuristics - nextFontSize = element.fontSize * scale; - metrics = measureText( + const metrics = measureText( element.text, getFontString({ fontSize: nextFontSize, fontFamily: element.fontFamily }), ); - if (metrics.width - nextWidth < 1 && metrics.height - nextHeight < 1) { - return { size: nextFontSize, baseline: metrics.baseline }; - } - return null; + return { + size: nextFontSize, + baseline: metrics.baseline + (nextHeight - metrics.height), + }; }; const getSidesForResizeHandle = (