Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 21 additions & 20 deletions lib/web_ui/lib/src/engine/skwasm/skwasm_impl/paragraph.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,12 @@ const int _kSoftLineBreak = 0;
const int _kHardLineBreak = 100;

final List<String> _testFonts = <String>['FlutterTest', 'Ahem'];
String _computeEffectiveFontFamily(String fontFamily) {
return ui_web.debugEmulateFlutterTesterEnvironment && !_testFonts.contains(fontFamily)
? _testFonts.first
: fontFamily;
List<String> _computeEffectiveFontFamilies(List<String> fontFamilies) {
if (!ui_web.debugEmulateFlutterTesterEnvironment) {
return fontFamilies;
}
final Iterable<String> filteredFonts = fontFamilies.where(_testFonts.contains);
return filteredFonts.isEmpty ? _testFonts : filteredFonts.toList();
}

class SkwasmLineMetrics extends SkwasmObjectWrapper<RawLineMetrics> implements ui.LineMetrics {
Expand Down Expand Up @@ -359,7 +361,7 @@ class SkwasmTextStyle implements ui.TextStyle {
textStyleSetTextBaseline(handle, textBaseline!.index);
}

final List<String> effectiveFontFamilies = fontFamilies;
final List<String> effectiveFontFamilies = _computeEffectiveFontFamilies(fontFamilies);
if (effectiveFontFamilies.isNotEmpty) {
withScopedFontList(effectiveFontFamilies,
(Pointer<SkStringHandle> families, int count) =>
Expand Down Expand Up @@ -438,8 +440,8 @@ class SkwasmTextStyle implements ui.TextStyle {
}

List<String> get fontFamilies => <String>[
if (fontFamily != null) _computeEffectiveFontFamily(fontFamily!),
if (fontFamilyFallback != null) ...fontFamilyFallback!.map(_computeEffectiveFontFamily),
if (fontFamily != null) fontFamily!,
if (fontFamilyFallback != null) ...fontFamilyFallback!,
];

final ui.Color? color;
Expand Down Expand Up @@ -576,16 +578,13 @@ final class SkwasmStrutStyle extends SkwasmObjectWrapper<RawStrutStyle> implemen
ui.TextLeadingDistribution? leadingDistribution,
}) {
final StrutStyleHandle handle = strutStyleCreate();
if (fontFamily != null || fontFamilyFallback != null) {
final List<String> fontFamilies = <String>[
if (fontFamily != null) fontFamily,
if (fontFamilyFallback != null) ...fontFamilyFallback,
];
if (fontFamilies.isNotEmpty) {
withScopedFontList(fontFamilies,
(Pointer<SkStringHandle> families, int count) =>
strutStyleSetFontFamilies(handle, families, count));
}
final List<String> effectiveFontFamilies = _computeEffectiveFontFamilies(<String>[
if (fontFamily != null) fontFamily,
if (fontFamilyFallback != null) ...fontFamilyFallback,
]);
if (effectiveFontFamilies.isNotEmpty) {
withScopedFontList(effectiveFontFamilies, (Pointer<SkStringHandle> families, int count) =>
strutStyleSetFontFamilies(handle, families, count));
}
if (fontSize != null) {
strutStyleSetFontSize(handle, fontSize);
Expand Down Expand Up @@ -728,9 +727,11 @@ class SkwasmParagraphStyle extends SkwasmObjectWrapper<RawParagraphStyle> implem
(renderer.fontCollection as SkwasmFontCollection).defaultTextStyle.copy();
final TextStyleHandle textStyleHandle = textStyle.handle;

if (fontFamily != null) {
withScopedFontList(<String>[fontFamily],
(Pointer<SkStringHandle> families, int count) =>
final List<String> effectiveFontFamilies = _computeEffectiveFontFamilies(<String>[
if (fontFamily != null) fontFamily
]);
if (effectiveFontFamilies.isNotEmpty) {
withScopedFontList(effectiveFontFamilies, (Pointer<SkStringHandle> families, int count) =>
textStyleAddFontFamilies(textStyleHandle, families, count));
}
if (fontSize != null) {
Expand Down
46 changes: 44 additions & 2 deletions lib/web_ui/test/ui/line_metrics_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import 'package:test/bootstrap/browser.dart';
import 'package:test/test.dart';
import 'package:ui/ui.dart' as ui;
import 'package:ui/ui_web/src/ui_web/testing.dart';

import '../common/test_initialization.dart';
import 'utils.dart';
Expand Down Expand Up @@ -117,22 +118,63 @@ Future<void> testMain() async {
}
}, skip: isHtml); // The rounding hack doesn't apply to the html renderer

test('uses flutter test fonts when debugEmulateFlutterTesterEnvironment is enabled', () {
test('overrides with flutter test font when debugEmulateFlutterTesterEnvironment is enabled', () {
final ui.ParagraphBuilder builder = ui.ParagraphBuilder(ui.ParagraphStyle());
builder.pushStyle(ui.TextStyle(
fontSize: 10.0,
fontFamily: 'SomeOtherFontFamily',
fontFamily: 'Roboto',
));
builder.addText('XXXX');
final ui.Paragraph paragraph = builder.build();
paragraph.layout(const ui.ParagraphConstraints(width: 400));

expect(paragraph.numberOfLines, 1);
expect(paragraph.height, 10);

final ui.LineMetrics? metrics = paragraph.getLineMetricsAt(0);
expect(metrics, isNotNull);

// FlutterTest font's 'X' character is a square, so it's the font size (10.0) * 4 characters.
expect(metrics!.width, 40.0);
});

test('uses flutter test font by default when debugEmulateFlutterTesterEnvironment is enabled', () {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be a good idea to add a test where you set debugEmulateFlutterTesterEnvironment to false and make sure the effective font families are the same as the provided ones and not the test ones.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call.

final ui.ParagraphBuilder builder = ui.ParagraphBuilder(ui.ParagraphStyle());
builder.pushStyle(ui.TextStyle(
fontSize: 10.0,
));
builder.addText('XXXX');
final ui.Paragraph paragraph = builder.build();
paragraph.layout(const ui.ParagraphConstraints(width: 400));

expect(paragraph.numberOfLines, 1);
expect(paragraph.height, 10);

final ui.LineMetrics? metrics = paragraph.getLineMetricsAt(0);
expect(metrics, isNotNull);

// FlutterTest font's 'X' character is a square, so it's the font size (10.0) * 4 characters.
expect(metrics!.width, 40.0);
});

test('uses specified font when debugEmulateFlutterTesterEnvironment is disabled', () {
debugEmulateFlutterTesterEnvironment = false;

final ui.ParagraphBuilder builder = ui.ParagraphBuilder(ui.ParagraphStyle());
builder.pushStyle(ui.TextStyle(
fontSize: 16.0,
fontFamily: 'Roboto',
));
builder.addText('O');
final ui.Paragraph paragraph = builder.build();
paragraph.layout(const ui.ParagraphConstraints(width: 400));

expect(paragraph.numberOfLines, 1);

final ui.LineMetrics? metrics = paragraph.getLineMetricsAt(0);
expect(metrics, isNotNull);

// In Roboto, the width should be 11 here. In the test font, it would be square (16 points)
expect(metrics!.width, 11);
}, solo: true);
}