Merge pull request #12106 from IQGeo/issue-12101

improve text width calculation
This commit is contained in:
Andreas Hocevar
2022-06-08 15:39:29 +02:00
committed by GitHub
3 changed files with 61 additions and 1 deletions

View File

@@ -104,6 +104,9 @@ export function drawTextOnPath(
return result;
}
// rendering across line segments
text = text.replace(/\n/g, ' '); // ensure rendering in single-line as all calculations below don't handle multi-lines
for (let i = 0, ii = text.length; i < ii; ) {
advance();
let angle = Math.atan2(y2 - y1, x2 - x1);

View File

@@ -362,7 +362,9 @@ export function measureAndCacheTextWidth(font, text, cache) {
if (text in cache) {
return cache[text];
}
const width = measureTextWidth(font, text);
const width = text
.split('\n')
.reduce((prev, curr) => Math.max(prev, measureTextWidth(font, curr)), 0);
cache[text] = width;
return width;
}

View File

@@ -242,4 +242,59 @@ describe('ol/geom/flat/drawTextOnPath.js', function () {
expect(instructions[0][3]).to.be((45 * Math.PI) / 180);
expect(instructions.length).to.be(1);
});
it('renders multi-line in one segment', function () {
const foo = 'foo';
const bar = 'bar';
const text = foo + '\n' + bar;
const pathLength = lineStringLength(angled, 2, angled.length, 2);
const textLength = measureAndCacheTextWidth('', bar);
const textAlign = 0.5;
const startM = (pathLength - textLength) * textAlign;
const instructions = drawTextOnPath(
angled,
0,
angled.length,
2,
text,
startM,
Infinity,
1,
measureAndCacheTextWidth,
'',
{}
);
expect(instructions[0][3]).to.be((45 * Math.PI) / 180);
expect(instructions[0][4]).to.be(text);
expect(instructions.length).to.be(1);
});
it('renders multi-line as single-line across segments', function () {
const foo = 'foo-foo-foo';
const bar = 'bar-bar-bar-bar-bar-bar-bar';
const text = foo + '\n' + bar;
const pathLength = lineStringLength(angled, 2, angled.length, 2);
const textLength = measureAndCacheTextWidth('', bar);
const textAlign = 0.5;
const startM = (pathLength - textLength) * textAlign;
const instructions = drawTextOnPath(
angled,
0,
angled.length,
2,
text,
startM,
Infinity,
1,
measureAndCacheTextWidth,
'',
{}
);
expect(instructions[0][3]).to.be((45 * Math.PI) / 180);
expect(instructions[0][4]).to.be('foo-foo-foo bar-bar-b');
expect(instructions.length).to.be(2);
expect(instructions[1][3]).to.be((-45 * Math.PI) / 180);
expect(instructions[1][4]).to.be('ar-bar-bar-bar-bar');
});
});