blob: d79772f8d017b4b08981918892501c7645cadeb8 [file] [log] [blame]
// Copyright 2019 The Flutter team. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
import 'package:flutter/services.dart';
import 'package:google_fonts/src/google_fonts_family_with_variant.dart';
import 'package:google_fonts/src/google_fonts_variant.dart';
import 'package:path/path.dart' as path;
/// Load fonts to make sure they show up in golden tests.
Future<void> loadFonts() async {
await _load(await loadFontsFromManifest()
..addAll(loadGoogleFonts())
..addAll(loadFontsFromTestingDir()));
}
Future<Map<String, List<Future<ByteData>>>> loadFontsFromManifest() async {
final fontManifest = await rootBundle.loadStructuredData<Iterable<dynamic>>(
'FontManifest.json',
(data) async => json.decode(data) as Iterable<dynamic>,
);
final fontFamilyToData = <String, List<Future<ByteData>>>{};
for (final fontData in fontManifest) {
final fontFamily = fontData['family'] as String;
final fonts = fontData['fonts'] as Iterable<dynamic>;
for (final font in fonts) {
(fontFamilyToData[fontFamily] ??= [])
.add(rootBundle.load(font['asset'] as String));
}
}
return fontFamilyToData;
}
Map<String, List<Future<ByteData>>> loadFontsFromTestingDir() {
final fontFamilyToData = <String, List<Future<ByteData>>>{};
final currentDir = path.dirname(Platform.script.path);
final fontsDirectory = path.join(
currentDir,
'test_goldens',
'testing',
'fonts',
);
for (var file in Directory(fontsDirectory).listSync()) {
if (file is File) {
final fontFamily =
path.basenameWithoutExtension(file.path).split('-').first;
(fontFamilyToData[fontFamily] ??= [])
.add(file.readAsBytes().then((bytes) => ByteData.view(bytes.buffer)));
}
}
return fontFamilyToData;
}
Map<String, List<Future<ByteData>>> loadGoogleFonts() {
final currentDir = path.dirname(Platform.script.path);
final googleFontsDirectory = path.join(currentDir, 'fonts', 'google_fonts');
final fontFamilyToData = <String, List<Future<ByteData>>>{};
final files = Directory(googleFontsDirectory).listSync();
for (final file in files) {
if (file is File) {
final fileName = path.basenameWithoutExtension(file.path);
final googleFontName = GoogleFontsFamilyWithVariant(
family: fileName.split('-').first,
googleFontsVariant: GoogleFontsVariant.fromApiFilenamePart(fileName),
).toString();
fontFamilyToData[googleFontName] = [
file.readAsBytes().then((bytes) => ByteData.view(bytes.buffer))
];
}
}
return fontFamilyToData;
}
Future<void> _load(Map<String, List<Future<ByteData>>> fontFamilyToData) async {
final waitList = <Future<void>>[];
for (final entry in fontFamilyToData.entries) {
final loader = FontLoader(entry.key);
for (final data in entry.value) {
loader.addFont(data);
}
waitList.add(loader.load());
}
await Future.wait(waitList);
}