@@ -354,44 +354,51 @@ public void DrawText(
354354 var x = this . Convert ( p . X ) ;
355355 var y = this . Convert ( p . Y ) ;
356356
357- var metrics = paint . FontMetrics ;
357+ var lines = StringHelper . SplitLines ( text ) ;
358+ var lineHeight = paint . GetFontMetrics ( out var metrics ) ;
359+
358360 var deltaY = verticalAlignment switch
359361 {
360362 VerticalAlignment . Top => - metrics . Ascent ,
361- VerticalAlignment . Middle => - ( metrics . Ascent + metrics . Descent ) / 2 ,
362- VerticalAlignment . Bottom => - metrics . Descent ,
363+ VerticalAlignment . Middle => - ( metrics . Ascent + metrics . Descent + lineHeight * ( lines . Length - 1 ) ) / 2 ,
364+ VerticalAlignment . Bottom => - metrics . Descent - lineHeight * ( lines . Length - 1 ) ,
363365 _ => throw new ArgumentOutOfRangeException ( nameof ( verticalAlignment ) )
364366 } ;
365367
366368 using var _ = new SKAutoCanvasRestore ( this . SkCanvas ) ;
367369 this . SkCanvas . Translate ( x , y ) ;
368370 this . SkCanvas . RotateDegrees ( ( float ) rotation ) ;
369371
370- if ( this . UseTextShaping )
372+ foreach ( var line in lines )
371373 {
372- var width = this . MeasureText ( text , shaper , paint ) ;
373- var deltaX = horizontalAlignment switch
374+ if ( this . UseTextShaping )
374375 {
375- HorizontalAlignment . Left => 0 ,
376- HorizontalAlignment . Center => - width / 2 ,
377- HorizontalAlignment . Right => - width ,
378- _ => throw new ArgumentOutOfRangeException ( nameof ( horizontalAlignment ) )
379- } ;
380-
381- this . paint . TextAlign = SKTextAlign . Left ;
382- this . SkCanvas . DrawShapedText ( shaper , text , deltaX , deltaY , paint ) ;
383- }
384- else
385- {
386- paint . TextAlign = horizontalAlignment switch
376+ var width = this . MeasureText ( line , shaper , paint ) ;
377+ var deltaX = horizontalAlignment switch
378+ {
379+ HorizontalAlignment . Left => 0 ,
380+ HorizontalAlignment . Center => - width / 2 ,
381+ HorizontalAlignment . Right => - width ,
382+ _ => throw new ArgumentOutOfRangeException ( nameof ( horizontalAlignment ) )
383+ } ;
384+
385+ this . paint . TextAlign = SKTextAlign . Left ;
386+ this . SkCanvas . DrawShapedText ( shaper , line , deltaX , deltaY , paint ) ;
387+ }
388+ else
387389 {
388- HorizontalAlignment . Left => SKTextAlign . Left ,
389- HorizontalAlignment . Center => SKTextAlign . Center ,
390- HorizontalAlignment . Right => SKTextAlign . Right ,
391- _ => throw new ArgumentOutOfRangeException ( nameof ( horizontalAlignment ) )
392- } ;
390+ paint . TextAlign = horizontalAlignment switch
391+ {
392+ HorizontalAlignment . Left => SKTextAlign . Left ,
393+ HorizontalAlignment . Center => SKTextAlign . Center ,
394+ HorizontalAlignment . Right => SKTextAlign . Right ,
395+ _ => throw new ArgumentOutOfRangeException ( nameof ( horizontalAlignment ) )
396+ } ;
393397
394- this . SkCanvas . DrawText ( text , 0 , deltaY , paint ) ;
398+ this . SkCanvas . DrawText ( line , 0 , deltaY , paint ) ;
399+ }
400+
401+ deltaY += lineHeight ;
395402 }
396403 }
397404
@@ -403,9 +410,11 @@ public OxySize MeasureText(string text, string fontFamily = null, double fontSiz
403410 return new OxySize ( 0 , 0 ) ;
404411 }
405412
413+ var lines = StringHelper . SplitLines ( text ) ;
406414 var paint = this . GetTextPaint ( fontFamily , fontSize , fontWeight , out var shaper ) ;
407- var width = this . MeasureText ( text , shaper , paint ) ;
408- var height = paint . GetFontMetrics ( out _ ) ;
415+ var height = paint . GetFontMetrics ( out _ ) * lines . Length ;
416+ var width = lines . Max ( line => this . MeasureText ( line , shaper , paint ) ) ;
417+
409418 return new OxySize ( this . ConvertBack ( width ) , this . ConvertBack ( height ) ) ;
410419 }
411420
0 commit comments