Skip to content

Commit b07deab

Browse files
authored
fix: wrong baseline calculation (#49)
1 parent 15fda01 commit b07deab

File tree

2 files changed

+34
-26
lines changed

2 files changed

+34
-26
lines changed

native/src/context2d.cpp

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -380,10 +380,10 @@ extern "C" {
380380
SkScalar baselineOffset = 0;
381381
switch (cssBaseline) {
382382
case CssBaseline::Top:
383-
baselineOffset = -alphaBaseline - font_metrics.fAscent;
383+
baselineOffset = -alphaBaseline - font_metrics.fAscent - font_metrics.fUnderlinePosition - font_metrics.fUnderlineThickness;
384384
break;
385385
case CssBaseline::Hanging:
386-
baselineOffset = -alphaBaseline - (font_metrics.fAscent - font_metrics.fDescent) * 80 / 100.0;
386+
baselineOffset = -alphaBaseline - font_metrics.fAscent * 80 / 100.0;
387387
break;
388388
case CssBaseline::Middle:
389389
baselineOffset = -paragraph->getHeight() / 2;
@@ -395,46 +395,48 @@ extern "C" {
395395
baselineOffset = -paragraph->getIdeographicBaseline();
396396
break;
397397
case CssBaseline::Bottom:
398-
baselineOffset = -font_metrics.fStrikeoutPosition;
398+
baselineOffset = font_metrics.fStrikeoutThickness + font_metrics.fStrikeoutPosition - alphaBaseline;
399+
break;
400+
}
401+
402+
auto line_center = lineWidth / 2.0f;
403+
float paintX;
404+
switch (context->state->textAlign) {
405+
case TextAlign::kLeft:
406+
paintX = x;
407+
break;
408+
case TextAlign::kCenter:
409+
paintX = x - line_center;
410+
break;
411+
case TextAlign::kRight:
412+
paintX = x - lineWidth;
413+
break;
414+
case TextAlign::kStart:
415+
paintX = context->state->direction == TextDirection::kRTL ? x - lineWidth : x;
416+
break;
417+
case TextAlign::kEnd:
418+
paintX = context->state->direction == TextDirection::kRTL ? x : x - lineWidth;
399419
break;
400420
}
401421

402422
if (out_metrics != nullptr) {
403423
auto offset = -baselineOffset - alphaBaseline;
404424
out_metrics->ascent = -ascent + offset;
405425
out_metrics->descent = descent + offset;
406-
out_metrics->left = line_metrics.fLeft - firstCharBounds.fLeft;
407-
out_metrics->right = lastCharPosX + lastCharBounds.fRight - line_metrics.fLeft;
426+
out_metrics->left = -paintX + line_metrics.fLeft - firstCharBounds.fLeft;
427+
out_metrics->right = paintX + lastCharPosX + lastCharBounds.fRight - line_metrics.fLeft;
408428
out_metrics->width = lineWidth;
409429
out_metrics->font_ascent = -font_metrics.fAscent + offset;
410430
out_metrics->font_descent = font_metrics.fDescent + offset;
411431
} else {
412-
auto line_center = lineWidth / 2.0f;
413-
float paintX;
414-
switch (context->state->textAlign) {
415-
case TextAlign::kLeft:
416-
paintX = x;
417-
break;
418-
case TextAlign::kCenter:
419-
paintX = x - line_center;
420-
break;
421-
case TextAlign::kRight:
422-
paintX = x - lineWidth;
423-
break;
424-
case TextAlign::kStart:
425-
paintX = context->state->direction == TextDirection::kRTL ? x - lineWidth : x;
426-
break;
427-
case TextAlign::kEnd:
428-
paintX = context->state->direction == TextDirection::kRTL ? x : x - lineWidth;
429-
break;
430-
}
431432
auto needScale = lineWidth > maxWidth;
433+
auto ratio = needScale ? maxWidth / lineWidth : 1.0;
432434
if (needScale) {
433435
context->canvas->save();
434-
context->canvas->scale(maxWidth / lineWidth, 1.0);
436+
context->canvas->scale(ratio, 1.0);
435437
}
436438
auto paintY = y + baselineOffset;
437-
paragraph.get()->paint(context->canvas, paintX, paintY);
439+
paragraph.get()->paint(context->canvas, paintX / ratio, paintY);
438440
if (needScale) {
439441
context->canvas->restore();
440442
}

src/context2d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,9 @@ export class CanvasRenderingContext2D {
326326
actualBoundingBoxDescent: 0,
327327
fontBoundingBoxAscent: 0,
328328
fontBoundingBoxDescent: 0,
329+
alphabeticBaseline: 0,
330+
emHeightAscent: 0,
331+
emHeightDescent: 0,
329332
};
330333
}
331334
const encoded = new TextEncoder().encode(text);
@@ -351,6 +354,9 @@ export class CanvasRenderingContext2D {
351354
actualBoundingBoxDescent: METRICS[1],
352355
fontBoundingBoxAscent: METRICS[5],
353356
fontBoundingBoxDescent: METRICS[6],
357+
alphabeticBaseline: METRICS[5],
358+
emHeightAscent: METRICS[5],
359+
emHeightDescent: METRICS[6],
354360
};
355361
}
356362

0 commit comments

Comments
 (0)