@@ -380,10 +380,10 @@ extern "C" {
380
380
SkScalar baselineOffset = 0 ;
381
381
switch (cssBaseline) {
382
382
case CssBaseline::Top:
383
- baselineOffset = -alphaBaseline - font_metrics.fAscent ;
383
+ baselineOffset = -alphaBaseline - font_metrics.fAscent - font_metrics. fUnderlinePosition - font_metrics. fUnderlineThickness ;
384
384
break ;
385
385
case CssBaseline::Hanging:
386
- baselineOffset = -alphaBaseline - ( font_metrics.fAscent - font_metrics. fDescent ) * 80 / 100.0 ;
386
+ baselineOffset = -alphaBaseline - font_metrics.fAscent * 80 / 100.0 ;
387
387
break ;
388
388
case CssBaseline::Middle:
389
389
baselineOffset = -paragraph->getHeight () / 2 ;
@@ -395,46 +395,48 @@ extern "C" {
395
395
baselineOffset = -paragraph->getIdeographicBaseline ();
396
396
break ;
397
397
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;
399
419
break ;
400
420
}
401
421
402
422
if (out_metrics != nullptr ) {
403
423
auto offset = -baselineOffset - alphaBaseline;
404
424
out_metrics->ascent = -ascent + offset;
405
425
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 ;
408
428
out_metrics->width = lineWidth;
409
429
out_metrics->font_ascent = -font_metrics.fAscent + offset;
410
430
out_metrics->font_descent = font_metrics.fDescent + offset;
411
431
} 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
- }
431
432
auto needScale = lineWidth > maxWidth;
433
+ auto ratio = needScale ? maxWidth / lineWidth : 1.0 ;
432
434
if (needScale) {
433
435
context->canvas ->save ();
434
- context->canvas ->scale (maxWidth / lineWidth , 1.0 );
436
+ context->canvas ->scale (ratio , 1.0 );
435
437
}
436
438
auto paintY = y + baselineOffset;
437
- paragraph.get ()->paint (context->canvas , paintX, paintY);
439
+ paragraph.get ()->paint (context->canvas , paintX / ratio , paintY);
438
440
if (needScale) {
439
441
context->canvas ->restore ();
440
442
}
0 commit comments