From c47e1a91b80887de22c01a5e0fac350b4978aa1d Mon Sep 17 00:00:00 2001 From: LuciNyan <22126563+LuciNyan@users.noreply.github.com> Date: Fri, 1 Sep 2023 01:15:03 +0800 Subject: [PATCH] fix: text decoration line (#531) ### Description 1. Default to the current color when `textDecorationColor` is unset. 2. Resolve incorrect positioning of decoration line. 3. Address inaccurate line-through positioning. image image Closes: #530 --- src/builder/text-decoration.ts | 5 +- src/text.ts | 47 +++--- ...xt-decoration-line-line-through-1-snap.png | Bin 0 -> 7446 bytes ...ne-through-and-text-align-right-1-snap.png | Bin 0 -> 8945 bytes ...-underline-and-text-align-right-1-snap.png | Bin 0 -> 8776 bytes ...en-text-decoration-style-dashed-1-snap.png | Bin 0 -> 7933 bytes ...en-text-decoration-style-dotted-1-snap.png | Bin 0 -> 7535 bytes test/text-decoration.test.tsx | 155 ++++++++++++++++++ 8 files changed, 181 insertions(+), 26 deletions(-) create mode 100644 test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-line-line-through-1-snap.png create mode 100644 test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-line-line-through-and-text-align-right-1-snap.png create mode 100644 test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-line-underline-and-text-align-right-1-snap.png create mode 100644 test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-style-dashed-1-snap.png create mode 100644 test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-style-dotted-1-snap.png create mode 100644 test/text-decoration.test.tsx diff --git a/src/builder/text-decoration.ts b/src/builder/text-decoration.ts index 021adcbf..e53e98c7 100644 --- a/src/builder/text-decoration.ts +++ b/src/builder/text-decoration.ts @@ -21,6 +21,7 @@ export default function buildDecoration( textDecorationStyle, textDecorationLine, fontSize, + color, } = style if (!textDecorationLine || textDecorationLine === 'none') return '' @@ -30,7 +31,7 @@ export default function buildDecoration( const y = textDecorationLine === 'line-through' - ? top + ascender * 0.5 + ? top + ascender * 0.7 : textDecorationLine === 'underline' ? top + ascender * 1.1 : top @@ -47,7 +48,7 @@ export default function buildDecoration( y1: y, x2: left + width, y2: y, - stroke: textDecorationColor, + stroke: textDecorationColor || color, 'stroke-width': height, 'stroke-dasharray': dasharray, 'stroke-linecap': textDecorationStyle === 'dotted' ? 'round' : 'square', diff --git a/src/text.ts b/src/text.ts index 72bbfdfb..b82a1c7c 100644 --- a/src/text.ts +++ b/src/text.ts @@ -541,9 +541,16 @@ export default async function* buildTextNodes( } } + const baselineOfLine = baselines[line] + const baselineOfWord = engine.baseline(text) + const heightOfWord = engine.height(text) + const baselineDelta = baselineOfLine - baselineOfWord + if (!decorationLines[line]) { decorationLines[line] = [ leftOffset, + top + topOffset + baselineDelta, + baselineOfWord, extendedWidth ? containerWidth : lineWidths[line], ] } @@ -599,7 +606,7 @@ export default async function* buildTextNodes( text = subset + _blockEllipsis skippedLine = line - decorationLines[line][1] = resolvedWidth + decorationLines[line][2] = resolvedWidth isLastDisplayedBeforeEllipsis = true } else if (nextLayout && nextLayout.line !== line) { if (textAlign === 'center') { @@ -607,7 +614,7 @@ export default async function* buildTextNodes( text = subset + _blockEllipsis skippedLine = line - decorationLines[line][1] = resolvedWidth + decorationLines[line][2] = resolvedWidth isLastDisplayedBeforeEllipsis = true } else { const nextLineText = texts[i + 1] @@ -619,18 +626,13 @@ export default async function* buildTextNodes( text = text + subset + _blockEllipsis skippedLine = line - decorationLines[line][1] = resolvedWidth + decorationLines[line][2] = resolvedWidth isLastDisplayedBeforeEllipsis = true } } } } - const baselineOfLine = baselines[line] - const baselineOfWord = engine.baseline(text) - const heightOfWord = engine.height(text) - const baselineDelta = baselineOfLine - baselineOfWord - if (image) { // For images, we remove the baseline offset. topOffset += 0 @@ -703,22 +705,19 @@ export default async function* buildTextNodes( // Get the decoration shape. if (parentStyle.textDecorationLine) { - // If it's the last word in the current line. - if (line !== nextLayout?.line || skippedLine === line) { - const deco = decorationLines[line] - if (deco && !deco[2]) { - decorationShape += buildDecoration( - { - left: left + deco[0], - top: top + heightOfWord * +line, - width: deco[1], - ascender: engine.baseline(text), - clipPathId, - }, - parentStyle - ) - deco[2] = 1 - } + const deco = decorationLines[line] + if (deco && !deco[4]) { + decorationShape += buildDecoration( + { + left: left + deco[0], + top: deco[1], + width: deco[3], + ascender: deco[2], + clipPathId, + }, + parentStyle + ) + deco[4] = 1 } } diff --git a/test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-line-line-through-1-snap.png b/test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-line-line-through-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..110c83e1185c68c4348c673012dbf221eda51966 GIT binary patch literal 7446 zcmds+=TlSRx9{mix*#h-VS@N>f)8{b8*+DWtEEH|Fx#66 zS%^39Z^on=d)6w}lGHNlS($yZVP_8fl)+6v7Gx>N2$(msw6uhgmn=JFo$n|vB9|K$ z#cqzT^BbC%eakd5B|S9!7Yr}XMNJtbE!7?oe-fequ=l)lMKMlv;998R|1SyzJD{%T zKU}w6zqGMGuDrVr#<)MDq_%A9{4brG?@;@#M@fg1sV9rKUYZFmWD%M3;+`zi<@+W# zYo-I@wR$Ps;QFPO3g2BWFE2L0%{Slk8RCKQMnda~gngdjc)7Xp#efr!*33;Zxw|6c z4cnQUKXS|5a+N?Yr^PXu(jlQ3R*+Xgo_R}n>qn2vlM#lBoe)o;O zeQ+wTZ!YREGT`oZ;TBWAC$?PGxVoP!%!~ZQR0!Imo{%&?uy%;oYpJ0_m76MXPx#O(`2&|IdFN1_- zx=UFNRg6e)7%Z;7y4&pIn2)pu9DEKq{TFa4m=BaX_Stzl;$dp^L(h#uaY?-(84o>i z^)=GUc6)p}Svu!b@tZ;Qw`6suQ$5AJG<3N^c99>4P?}lRB7uu*~h)c|ZUg$Bkowtxnfx;={SOr@ztSZQ#w5$`&b3KFJjv zA=aqNpN=1Gwxa`Y{r*iH8o{4P;s#pET%-q!pdVnYdUnF$x4nat1jMun!HV{!3O8dc zMgFVbF9zeD1Lyn=B^rDn66oN1+PncR7Td22+I<2EP^6Mw{Org{V%ni4F$u(^-C6nK z=0N;Bj|3vCi`-x1;y+Vi>d(=3?V0F)&cr0Ry@{4mt@p+r9qssvSh4YM>C%7H^&yu1 zSLb^xe&nez5*+#d&O2Yqbl`{M-dXE@3O$z(*7oAO3H@oiqYrH2z1hBe7))rzUQp0r z9j$JFwi~9&jh+mB3BsfwB?12ph05MgBM9y=zeX_cXJ!)P1b&CQC1f{BvxZ52)yw{| z6nj{gIrfuvUWWlfmKZ4g+j*i#I4I#Lew(cyH%JEM35D)L=XtR-N`35%DMXIPvsp)H zBbgHqVIY+Rb%9Y8PDN-FUFME#xGq84U6lF=rW4~MSRxiCYOOKGc!ZOS@U72WA@l&v;v3{?Ru z@ulKOglx4x1KxH<2@y$R0n{>0zH7|P!VylF5qkNe6&}HM*wWbSeZ1#(d8BtKMjOd& zy(S3i+PjKLk~U4`OrHH={?2QZmBlw$q-OgnE@l*Q-wSK74KYDc*)5qp!aw@;97ef^txA_JtvCJq1j%<8L-2zWYb%|tUf2-8` z`jBwalKiYN&OqQXMgl2?lo=TLX58A+e0Qimu~UHm{*{9cklksLYA*6wr0kw{^z60 ^OWTjX0`_ot=h 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 literal 0 HcmV?d00001 diff --git a/test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-style-dashed-1-snap.png b/test/__image_snapshots__/text-decoration-test-tsx-test-text-decoration-test-tsx-text-decoration-should-work-correctly-when-text-decoration-style-dashed-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..986a6b34166f164e3b7ef44680abb214987d895e GIT binary patch literal 7933 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

?c_;^E;@sH-XK-L9yA1_|-) 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 JS1DSB{TFrbG1dS8 literal 0 HcmV?d00001 diff --git a/test/text-decoration.test.tsx b/test/text-decoration.test.tsx new file mode 100644 index 00000000..d096765e --- /dev/null +++ b/test/text-decoration.test.tsx @@ -0,0 +1,155 @@ +import { it, describe, expect } from 'vitest' + +import { initFonts, loadDynamicAsset, toImage } from './utils.js' +import satori from '../src/index.js' + +describe('Text Decoration', () => { + let fonts + initFonts((f) => (fonts = f)) + + it('Should work correctly when `text-decoration-line: line-through` and `text-align: right`', async () => { + const svg = await satori( +

+
+ 你好! It doesn’t 안녕! exist, it never has. I’m nostalgic for a place + that never existed. +
+
, + { + width: 200, + height: 200, + fonts, + loadAdditionalAsset: (languageCode: string, segment: string) => { + return loadDynamicAsset(languageCode, segment) as any + }, + } + ) + expect(toImage(svg, 200)).toMatchImageSnapshot() + }) + + it('Should work correctly when `text-decoration-line: underline` and `text-align: right`', async () => { + const svg = await satori( +
+
+ 你好! It doesn’t 안녕! exist, it never has. I’m nostalgic for a place + that never existed. +
+
, + { + width: 200, + height: 200, + fonts, + loadAdditionalAsset: (languageCode: string, segment: string) => { + return loadDynamicAsset(languageCode, segment) as any + }, + } + ) + expect(toImage(svg, 200)).toMatchImageSnapshot() + }) + + it('Should work correctly when `text-decoration-style: dotted`', async () => { + const svg = await satori( +
+
+ It doesn’t exist, it never has. I’m nostalgic for a place that never + existed. +
+
, + { width: 200, height: 200, fonts } + ) + expect(toImage(svg, 200)).toMatchImageSnapshot() + }) + + it('Should work correctly when `text-decoration-style: dashed`', async () => { + const svg = await satori( +
+
+ It doesn’t exist, it never has. I’m nostalgic for a place that never + existed. +
+
, + { width: 200, height: 200, fonts } + ) + expect(toImage(svg, 200)).toMatchImageSnapshot() + }) +})