@@ -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 }
0 commit comments