Skip to content

Commit 8022d14

Browse files
committed
feat: text-metrics:actual|default
1 parent 5e7fa77 commit 8022d14

4 files changed

Lines changed: 23 additions & 7 deletions

File tree

index.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5590,6 +5590,13 @@ declare namespace cytoscape {
55905590
* height of a line of text.
55915591
*/
55925592
"line-height": PropertyValue<SingularType, number>;
5593+
/**
5594+
* The vertical alignment of text relative to its baseline. This affects how text
5595+
* dimensions are calculated and displayed.
5596+
* - `default`: Calculate using font size.
5597+
* - `actual`: Calculate using actual label text metrics (for ascending/descending character size).
5598+
*/
5599+
"text-metrics": PropertyValue<SingularType, "default" | "actual">;
55935600

55945601
/**
55955602
* Node label alignment:

src/extensions/renderer/base/coord-ele-math/labels.mjs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,7 @@ BRp.calculateLabelDimensions = function( ele, text ){
488488
let size = ele.pstyle('font-size').pfValue;
489489
let family = ele.pstyle('font-family').strValue;
490490
let weight = ele.pstyle('font-weight').strValue;
491+
let textMetrics = ele.pstyle('text-metrics').strValue || 'default';
491492

492493
let canvas = this.labelCalcCanvas;
493494
let c2d = this.labelCalcCanvasContext;
@@ -519,17 +520,21 @@ BRp.calculateLabelDimensions = function( ele, text ){
519520
let metrics = c2d.measureText(line);
520521
let w = Math.ceil(metrics.width);
521522
let h = size;
522-
if (i === 0) {
523-
labelActualAscent = Number.isFinite(metrics.actualBoundingBoxAscent) ? metrics.actualBoundingBoxAscent : size;
524-
}
525-
if (i === lineCount - 1) {
526-
labelActualDescent = Number.isFinite(metrics.actualBoundingBoxDescent) ? metrics.actualBoundingBoxDescent : 0;
523+
if ( textMetrics === 'actual' ){
524+
if (i === 0) {
525+
labelActualAscent = metrics.actualBoundingBoxAscent;
526+
}
527+
if (i === lineCount - 1) {
528+
labelActualDescent = metrics.actualBoundingBoxDescent;
529+
}
527530
}
528531

529532
width = Math.max(w, width);
530533
height += h;
531534
}
532-
height -= size - labelActualAscent - labelActualDescent;
535+
if ( textMetrics === 'actual' ){
536+
height -= size - labelActualAscent - labelActualDescent;
537+
}
533538
width += padding;
534539
height += padding;
535540

src/extensions/renderer/canvas/drawing-label-text.mjs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@ CRp.drawElementText = function( context, ele, shiftToOriginWithBb, force, prefix
3737
if( !label || !label.value ){ return; }
3838

3939
let justification = r.getLabelJustification(ele);
40+
let isTextMetricsActual = ele.pstyle('text-metrics').strValue === 'actual';
4041

4142
context.textAlign = justification;
42-
context.textBaseline = 'alphabetic';
43+
context.textBaseline = isTextMetricsActual ? 'alphabetic' : 'bottom';
4344
} else {
4445
let badLine = ele.element()._private.rscratch.badLine;
4546
let label = ele.pstyle( 'label' );

src/style/properties.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ const styfn = {};
9191
valign: { enums: [ 'top', 'center', 'bottom' ] },
9292
halign: { enums: [ 'left', 'center', 'right' ] },
9393
justification: { enums: [ 'left', 'center', 'right', 'auto' ] },
94+
textMetrics: { enums: [ 'default', 'actual' ] },
9495
text: { string: true },
9596
data: { mapping: true, regex: data( 'data' ) },
9697
layoutData: { mapping: true, regex: data( 'layoutData' ) },
@@ -235,6 +236,7 @@ const styfn = {};
235236
{ name: 'text-border-style', type: t.borderStyle, triggersBounds: diff.any },
236237
{ name: 'text-background-shape', type: t.textBackgroundShape, triggersBounds: diff.any },
237238
{ name: 'text-justification', type: t.justification },
239+
{ name: 'text-metrics', type: t.textMetrics },
238240
{ name: 'box-select-labels', type: t.bool, triggersBounds: diff.any },
239241
];
240242

@@ -671,6 +673,7 @@ styfn.getDefaultProperties = function(){
671673
'underlay-padding': 10,
672674
'underlay-shape': 'round-rectangle',
673675
'underlay-corner-radius': 'auto',
676+
'text-metrics': 'default',
674677
'transition-property': 'none',
675678
'transition-duration': 0,
676679
'transition-delay': 0,

0 commit comments

Comments
 (0)