From 9838c57c2823818c99abbb3f9b48ccc4e0de9542 Mon Sep 17 00:00:00 2001 From: Benjamin Bloomfield Date: Wed, 25 Dec 2024 01:45:56 -0500 Subject: [PATCH] Fix measuring text when OpenType features are passed in to .text() (#1492) * Update text.js to fix measuring text when opentype features are passed in to .text() * added simple test * Update CHANGELOG.md --------- Co-authored-by: Libor M. --- CHANGELOG.md | 4 ++++ lib/mixins/text.js | 2 +- ...nued-text-with-open-type-features-1-snap.png | Bin 0 -> 16032 bytes tests/visual/text.spec.js | 9 +++++++++ 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 tests/visual/__image_snapshots__/text-spec-js-text-continued-text-with-open-type-features-1-snap.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 46007d17..d12d3414 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ ## pdfkit changelog +### Unreleased + +- Fix measuring text when OpenType features are passed in to .text() + ### [v0.15.2] - 2024-12-15 - Fix index not counting when rendering ordered lists (#1517) diff --git a/lib/mixins/text.js b/lib/mixins/text.js index ad4273d0..1ea320f1 100644 --- a/lib/mixins/text.js +++ b/lib/mixins/text.js @@ -282,7 +282,7 @@ export default { const lineGap = options.lineGap || this._lineGap || 0; if (!wrapper) { - return (this.x += this.widthOfString(text)); + return (this.x += this.widthOfString(text, options)); } else { return (this.y += this.currentLineHeight(true) + lineGap); } diff --git a/tests/visual/__image_snapshots__/text-spec-js-text-continued-text-with-open-type-features-1-snap.png b/tests/visual/__image_snapshots__/text-spec-js-text-continued-text-with-open-type-features-1-snap.png new file mode 100644 index 0000000000000000000000000000000000000000..8eaebda373e667b5e6aded0bd8e6d893515f408d GIT binary patch literal 16032 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 literal 0 HcmV?d00001 diff --git a/tests/visual/text.spec.js b/tests/visual/text.spec.js index b44d2cd2..5e13c649 100644 --- a/tests/visual/text.spec.js +++ b/tests/visual/text.spec.js @@ -92,4 +92,13 @@ describe('text', function() { doc.fillColor('#000').list(['One', ['One.One', 'One.Two'], 'Three'], 100, 150, {listType: 'numbered'}); }) }) + + test('continued text with OpenType features', function() { + return runDocTest(function(doc) { + doc.font('tests/fonts/Roboto-Regular.ttf'); + doc.text('Really simple', 100, 100, {features: ['smcp'], continued: true, lineBreak: false}) + doc.text(' text', {features: [], lineBreak: false}); + }); + }); + });