@@ -429,6 +429,94 @@ enum TextDecorationStyle {
429
429
wavy
430
430
}
431
431
432
+ /// {@template flutter.dart:ui.textHeightBehavior}
433
+ /// Defines how the paragraph will apply [TextStyle.height] to the ascent of the
434
+ /// first line and descent of the last line.
435
+ ///
436
+ /// Each boolean value represents whether the [TextStyle.height] modifier will
437
+ /// be applied to the corresponding metric. By default, all properties are true,
438
+ /// and [TextStyle.height] is applied as normal. When set to false, the font's
439
+ /// default ascent will be used.
440
+ /// {@endtemplate}
441
+ class TextHeightBehavior {
442
+
443
+ /// Creates a new TextHeightBehavior object.
444
+ ///
445
+ /// * applyHeightToFirstAscent: When true, the [TextStyle.height] modifier
446
+ /// will be applied to the ascent of the first line. When false, the font's
447
+ /// default ascent will be used.
448
+ /// * applyHeightToLastDescent: When true, the [TextStyle.height] modifier
449
+ /// will be applied to the descent of the last line. When false, the font's
450
+ /// default descent will be used.
451
+ ///
452
+ /// All properties default to true (height modifications applied as normal).
453
+ const TextHeightBehavior ({
454
+ this .applyHeightToFirstAscent = true ,
455
+ this .applyHeightToLastDescent = true ,
456
+ });
457
+
458
+ /// Creates a new TextHeightBehavior object from an encoded form.
459
+ ///
460
+ /// See [encode] for the creation of the encoded form.
461
+ const TextHeightBehavior .fromEncoded (int encoded) : applyHeightToFirstAscent = (encoded & 0x1 ) == 0 ,
462
+ applyHeightToLastDescent = (encoded & 0x2 ) == 0 ;
463
+
464
+
465
+ /// Whether to apply the [TextStyle.height] modifier to the ascent of the first
466
+ /// line in the paragraph.
467
+ ///
468
+ /// When true, the [TextStyle.height] modifier will be applied to to the ascent
469
+ /// of the first line. When false, the font's default ascent will be used and
470
+ /// the [TextStyle.height] will have no effect on the ascent of the first line.
471
+ ///
472
+ /// This property only has effect if a non-null [TextStyle.height] is specified.
473
+ ///
474
+ /// Defaults to true (height modifications applied as normal).
475
+ final bool applyHeightToFirstAscent;
476
+
477
+ /// Whether to apply the [TextStyle.height] modifier to the descent of the last
478
+ /// line in the paragraph.
479
+ ///
480
+ /// When true, the [TextStyle.height] modifier will be applied to to the descent
481
+ /// of the last line. When false, the font's default descent will be used and
482
+ /// the [TextStyle.height] will have no effect on the descent of the last line.
483
+ ///
484
+ /// This property only has effect if a non-null [TextStyle.height] is specified.
485
+ ///
486
+ /// Defaults to true (height modifications applied as normal).
487
+ final bool applyHeightToLastDescent;
488
+
489
+ /// Returns an encoded int representation of this object.
490
+ int encode () {
491
+ return (applyHeightToFirstAscent ? 0 : 1 << 0 ) | (applyHeightToLastDescent ? 0 : 1 << 1 );
492
+ }
493
+
494
+ @override
495
+ bool operator == (dynamic other) {
496
+ if (other.runtimeType != runtimeType)
497
+ return false ;
498
+ return other is TextHeightBehavior
499
+ && other.applyHeightToFirstAscent == applyHeightToFirstAscent
500
+ && other.applyHeightToLastDescent == applyHeightToLastDescent;
501
+ }
502
+
503
+ @override
504
+ int get hashCode {
505
+ return hashValues (
506
+ applyHeightToFirstAscent,
507
+ applyHeightToLastDescent,
508
+ );
509
+ }
510
+
511
+ @override
512
+ String toString () {
513
+ return 'TextHeightBehavior('
514
+ 'applyHeightToFirstAscent: $applyHeightToFirstAscent , '
515
+ 'applyHeightToLastDescent: $applyHeightToLastDescent '
516
+ ')' ;
517
+ }
518
+ }
519
+
432
520
/// Determines if lists [a] and [b] are deep equivalent.
433
521
///
434
522
/// Returns true if the lists are both null, or if they are both non-null, have
@@ -746,20 +834,23 @@ class TextStyle {
746
834
//
747
835
// - Element 5: The value of |maxLines|.
748
836
//
837
+ // - Element 6: The encoded value of |textHeightBehavior|.
838
+ //
749
839
Int32List _encodeParagraphStyle (
750
840
TextAlign textAlign,
751
841
TextDirection textDirection,
752
842
int maxLines,
753
843
String fontFamily,
754
844
double fontSize,
755
845
double height,
846
+ TextHeightBehavior textHeightBehavior,
756
847
FontWeight fontWeight,
757
848
FontStyle fontStyle,
758
849
StrutStyle strutStyle,
759
850
String ellipsis,
760
851
Locale locale,
761
852
) {
762
- final Int32List result = Int32List (6 ); // also update paragraph_builder.cc
853
+ final Int32List result = Int32List (7 ); // also update paragraph_builder.cc
763
854
if (textAlign != null ) {
764
855
result[0 ] | = 1 << 1 ;
765
856
result[1 ] = textAlign.index;
@@ -780,28 +871,32 @@ Int32List _encodeParagraphStyle(
780
871
result[0 ] | = 1 << 5 ;
781
872
result[5 ] = maxLines;
782
873
}
783
- if (fontFamily != null ) {
874
+ if (textHeightBehavior != null ) {
784
875
result[0 ] | = 1 << 6 ;
876
+ result[6 ] = textHeightBehavior.encode ();
877
+ }
878
+ if (fontFamily != null ) {
879
+ result[0 ] | = 1 << 7 ;
785
880
// Passed separately to native.
786
881
}
787
882
if (fontSize != null ) {
788
- result[0 ] | = 1 << 7 ;
883
+ result[0 ] | = 1 << 8 ;
789
884
// Passed separately to native.
790
885
}
791
886
if (height != null ) {
792
- result[0 ] | = 1 << 8 ;
887
+ result[0 ] | = 1 << 9 ;
793
888
// Passed separately to native.
794
889
}
795
890
if (strutStyle != null ) {
796
- result[0 ] | = 1 << 9 ;
891
+ result[0 ] | = 1 << 10 ;
797
892
// Passed separately to native.
798
893
}
799
894
if (ellipsis != null ) {
800
- result[0 ] | = 1 << 10 ;
895
+ result[0 ] | = 1 << 11 ;
801
896
// Passed separately to native.
802
897
}
803
898
if (locale != null ) {
804
- result[0 ] | = 1 << 11 ;
899
+ result[0 ] | = 1 << 12 ;
805
900
// Passed separately to native.
806
901
}
807
902
return result;
@@ -842,6 +937,9 @@ class ParagraphStyle {
842
937
/// the line height to take the height as defined by the font, which may not
843
938
/// be exactly the height of the `fontSize` .
844
939
///
940
+ /// * `textHeightBehavior` : Specifies how the `height` multiplier is
941
+ /// applied to ascent of the first line and the descent of the last line.
942
+ ///
845
943
/// * `fontWeight` : The typeface thickness to use when painting the text
846
944
/// (e.g., bold).
847
945
///
@@ -869,6 +967,7 @@ class ParagraphStyle {
869
967
String fontFamily,
870
968
double fontSize,
871
969
double height,
970
+ TextHeightBehavior textHeightBehavior,
872
971
FontWeight fontWeight,
873
972
FontStyle fontStyle,
874
973
StrutStyle strutStyle,
@@ -881,6 +980,7 @@ class ParagraphStyle {
881
980
fontFamily,
882
981
fontSize,
883
982
height,
983
+ textHeightBehavior,
884
984
fontWeight,
885
985
fontStyle,
886
986
strutStyle,
@@ -929,11 +1029,14 @@ class ParagraphStyle {
929
1029
'fontWeight: ${ _encoded [0 ] & 0x008 == 0x008 ? FontWeight .values [_encoded [3 ]] : "unspecified" }, '
930
1030
'fontStyle: ${ _encoded [0 ] & 0x010 == 0x010 ? FontStyle .values [_encoded [4 ]] : "unspecified" }, '
931
1031
'maxLines: ${ _encoded [0 ] & 0x020 == 0x020 ? _encoded [5 ] : "unspecified" }, '
932
- 'fontFamily: ${ _encoded [0 ] & 0x040 == 0x040 ? _fontFamily : "unspecified" }, '
933
- 'fontSize: ${ _encoded [0 ] & 0x080 == 0x080 ? _fontSize : "unspecified" }, '
934
- 'height: ${ _encoded [0 ] & 0x100 == 0x100 ? "${_height }x" : "unspecified" }, '
935
- 'ellipsis: ${ _encoded [0 ] & 0x200 == 0x200 ? "\" $_ellipsis \" " : "unspecified" }, '
936
- 'locale: ${ _encoded [0 ] & 0x400 == 0x400 ? _locale : "unspecified" }'
1032
+ 'textHeightBehavior: ${
1033
+ _encoded [0 ] & 0x040 == 0x040 ?
1034
+ TextHeightBehavior .fromEncoded (_encoded [6 ]).toString () : "unspecified" }, '
1035
+ 'fontFamily: ${ _encoded [0 ] & 0x080 == 0x080 ? _fontFamily : "unspecified" }, '
1036
+ 'fontSize: ${ _encoded [0 ] & 0x100 == 0x100 ? _fontSize : "unspecified" }, '
1037
+ 'height: ${ _encoded [0 ] & 0x200 == 0x200 ? "${_height }x" : "unspecified" }, '
1038
+ 'ellipsis: ${ _encoded [0 ] & 0x400 == 0x400 ? "\" $_ellipsis \" " : "unspecified" }, '
1039
+ 'locale: ${ _encoded [0 ] & 0x800 == 0x800 ? _locale : "unspecified" }'
937
1040
')' ;
938
1041
}
939
1042
}
0 commit comments