Merge pull request #9307 from ahocevar/line-height
Take line-height into account when measuring text height
This commit is contained in:
@@ -103,6 +103,9 @@ tags: "geojson, vector, openstreetmap, label"
|
|||||||
<label>Size: </label>
|
<label>Size: </label>
|
||||||
<input type="text" value="12px" id="points-size" />
|
<input type="text" value="12px" id="points-size" />
|
||||||
<br />
|
<br />
|
||||||
|
<label>Line height: </label>
|
||||||
|
<input type="text" value="1" id="points-height" />
|
||||||
|
<br />
|
||||||
<label>Offset X:</label>
|
<label>Offset X:</label>
|
||||||
<input type="text" value="0" id="points-offset-x" />
|
<input type="text" value="0" id="points-offset-x" />
|
||||||
<br />
|
<br />
|
||||||
@@ -212,6 +215,9 @@ tags: "geojson, vector, openstreetmap, label"
|
|||||||
<label>Size: </label>
|
<label>Size: </label>
|
||||||
<input type="text" value="12px" id="lines-size" />
|
<input type="text" value="12px" id="lines-size" />
|
||||||
<br />
|
<br />
|
||||||
|
<label>Line height: </label>
|
||||||
|
<input type="text" value="1.2" id="lines-height" />
|
||||||
|
<br />
|
||||||
<label>Offset X:</label>
|
<label>Offset X:</label>
|
||||||
<input type="text" value="0" id="lines-offset-x" />
|
<input type="text" value="0" id="lines-offset-x" />
|
||||||
<br />
|
<br />
|
||||||
@@ -321,6 +327,9 @@ tags: "geojson, vector, openstreetmap, label"
|
|||||||
<label>Size: </label>
|
<label>Size: </label>
|
||||||
<input type="text" value="10px" id="polygons-size" />
|
<input type="text" value="10px" id="polygons-size" />
|
||||||
<br />
|
<br />
|
||||||
|
<label>Line height: </label>
|
||||||
|
<input type="text" value="1" id="polygons-height" />
|
||||||
|
<br />
|
||||||
<label>Offset X:</label>
|
<label>Offset X:</label>
|
||||||
<input type="text" value="0" id="polygons-offset-x" />
|
<input type="text" value="0" id="polygons-offset-x" />
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ const myDom = {
|
|||||||
font: document.getElementById('points-font'),
|
font: document.getElementById('points-font'),
|
||||||
weight: document.getElementById('points-weight'),
|
weight: document.getElementById('points-weight'),
|
||||||
size: document.getElementById('points-size'),
|
size: document.getElementById('points-size'),
|
||||||
|
height: document.getElementById('points-height'),
|
||||||
offsetX: document.getElementById('points-offset-x'),
|
offsetX: document.getElementById('points-offset-x'),
|
||||||
offsetY: document.getElementById('points-offset-y'),
|
offsetY: document.getElementById('points-offset-y'),
|
||||||
color: document.getElementById('points-color'),
|
color: document.getElementById('points-color'),
|
||||||
@@ -34,6 +35,7 @@ const myDom = {
|
|||||||
maxangle: document.getElementById('lines-maxangle'),
|
maxangle: document.getElementById('lines-maxangle'),
|
||||||
overflow: document.getElementById('lines-overflow'),
|
overflow: document.getElementById('lines-overflow'),
|
||||||
size: document.getElementById('lines-size'),
|
size: document.getElementById('lines-size'),
|
||||||
|
height: document.getElementById('lines-height'),
|
||||||
offsetX: document.getElementById('lines-offset-x'),
|
offsetX: document.getElementById('lines-offset-x'),
|
||||||
offsetY: document.getElementById('lines-offset-y'),
|
offsetY: document.getElementById('lines-offset-y'),
|
||||||
color: document.getElementById('lines-color'),
|
color: document.getElementById('lines-color'),
|
||||||
@@ -52,6 +54,7 @@ const myDom = {
|
|||||||
maxangle: document.getElementById('polygons-maxangle'),
|
maxangle: document.getElementById('polygons-maxangle'),
|
||||||
overflow: document.getElementById('polygons-overflow'),
|
overflow: document.getElementById('polygons-overflow'),
|
||||||
size: document.getElementById('polygons-size'),
|
size: document.getElementById('polygons-size'),
|
||||||
|
height: document.getElementById('polygons-height'),
|
||||||
offsetX: document.getElementById('polygons-offset-x'),
|
offsetX: document.getElementById('polygons-offset-x'),
|
||||||
offsetY: document.getElementById('polygons-offset-y'),
|
offsetY: document.getElementById('polygons-offset-y'),
|
||||||
color: document.getElementById('polygons-color'),
|
color: document.getElementById('polygons-color'),
|
||||||
@@ -84,6 +87,7 @@ const createTextStyle = function(feature, resolution, dom) {
|
|||||||
const align = dom.align.value;
|
const align = dom.align.value;
|
||||||
const baseline = dom.baseline.value;
|
const baseline = dom.baseline.value;
|
||||||
const size = dom.size.value;
|
const size = dom.size.value;
|
||||||
|
const height = dom.height.value;
|
||||||
const offsetX = parseInt(dom.offsetX.value, 10);
|
const offsetX = parseInt(dom.offsetX.value, 10);
|
||||||
const offsetY = parseInt(dom.offsetY.value, 10);
|
const offsetY = parseInt(dom.offsetY.value, 10);
|
||||||
const weight = dom.weight.value;
|
const weight = dom.weight.value;
|
||||||
@@ -98,7 +102,7 @@ const createTextStyle = function(feature, resolution, dom) {
|
|||||||
document.getElementsByTagName('head')[0].appendChild(openSans);
|
document.getElementsByTagName('head')[0].appendChild(openSans);
|
||||||
openSansAdded = true;
|
openSansAdded = true;
|
||||||
}
|
}
|
||||||
const font = weight + ' ' + size + ' ' + dom.font.value;
|
const font = weight + ' ' + size + '/' + height + ' ' + dom.font.value;
|
||||||
const fillColor = dom.color.value;
|
const fillColor = dom.color.value;
|
||||||
const outlineColor = dom.outline.value;
|
const outlineColor = dom.outline.value;
|
||||||
const outlineWidth = parseInt(dom.outlineWidth.value, 10);
|
const outlineWidth = parseInt(dom.outlineWidth.value, 10);
|
||||||
|
|||||||
+11
-11
@@ -288,22 +288,22 @@ function getMeasureContext() {
|
|||||||
* @return {import("../size.js").Size} Measurement.
|
* @return {import("../size.js").Size} Measurement.
|
||||||
*/
|
*/
|
||||||
export const measureTextHeight = (function() {
|
export const measureTextHeight = (function() {
|
||||||
let span;
|
let div;
|
||||||
const heights = textHeights;
|
const heights = textHeights;
|
||||||
return function(font) {
|
return function(font) {
|
||||||
let height = heights[font];
|
let height = heights[font];
|
||||||
if (height == undefined) {
|
if (height == undefined) {
|
||||||
if (!span) {
|
if (!div) {
|
||||||
span = document.createElement('span');
|
div = document.createElement('div');
|
||||||
span.textContent = 'M';
|
div.innerHTML = 'M';
|
||||||
span.style.margin = span.style.padding = '0 !important';
|
div.style.margin = div.style.padding = '0 !important';
|
||||||
span.style.position = 'absolute !important';
|
div.style.position = 'absolute !important';
|
||||||
span.style.left = '-99999px !important';
|
div.style.left = '-99999px !important';
|
||||||
}
|
}
|
||||||
span.style.font = font;
|
div.style.font = font;
|
||||||
document.body.appendChild(span);
|
document.body.appendChild(div);
|
||||||
height = heights[font] = span.offsetHeight;
|
height = heights[font] = div.offsetHeight;
|
||||||
document.body.removeChild(span);
|
document.body.removeChild(div);
|
||||||
}
|
}
|
||||||
return height;
|
return height;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -76,6 +76,14 @@ describe('ol.render.canvas', function() {
|
|||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('measureTextHeight', function() {
|
||||||
|
it('respects line-height', function() {
|
||||||
|
const height = render.measureTextHeight('12px/1.2 sans-serif');
|
||||||
|
expect(render.measureTextHeight('12px/2.4 sans-serif')).to.be.greaterThan(height);
|
||||||
|
expect(render.measureTextHeight('12px/0.1 sans-serif')).to.be.lessThan(height);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
describe('rotateAtOffset', function() {
|
describe('rotateAtOffset', function() {
|
||||||
it('rotates a canvas at an offset point', function() {
|
it('rotates a canvas at an offset point', function() {
|
||||||
|
|||||||
Reference in New Issue
Block a user