@@ -7,6 +7,7 @@ use turbo_tasks::{ResolvedVc, Vc};
7
7
use turbo_tasks_fs:: { FileContent , FileSystemPath } ;
8
8
9
9
use super :: {
10
+ errors:: { FontFileNotFound , FontResult } ,
10
11
options:: { FontDescriptor , FontDescriptors , FontWeight , NextFontLocalOptions } ,
11
12
request:: AdjustFontFallback ,
12
13
} ;
@@ -15,10 +16,15 @@ use crate::next_font::{
15
16
AutomaticFontFallback , DefaultFallbackFont , FontAdjustment , FontFallback , FontFallbacks ,
16
17
DEFAULT_SANS_SERIF_FONT , DEFAULT_SERIF_FONT ,
17
18
} ,
18
- local:: errors:: FontError ,
19
19
util:: { get_scoped_font_family, FontFamilyType } ,
20
20
} ;
21
21
22
+ #[ turbo_tasks:: value( shared) ]
23
+ pub ( crate ) enum FontFallbackResult {
24
+ Ok ( ResolvedVc < FontFallbacks > ) ,
25
+ FontFileNotFound ( FontFileNotFound ) ,
26
+ }
27
+
22
28
// From
23
29
// https://github.com/vercel/next.js/blob/7457be0c74e64b4d0617943ed27f4d557cc916be/packages/font/src/local/get-fallback-metrics-from-font-file.ts#L34
24
30
static AVG_CHARACTERS : & str = "aaabcdeeeefghiijklmnnoopqrrssttuvwxyz " ;
@@ -29,56 +35,76 @@ static BOLD_WEIGHT: f64 = 700.0;
29
35
pub ( super ) async fn get_font_fallbacks (
30
36
lookup_path : Vc < FileSystemPath > ,
31
37
options_vc : Vc < NextFontLocalOptions > ,
32
- ) -> Result < Vc < FontFallbacks > > {
38
+ ) -> Result < Vc < FontFallbackResult > > {
33
39
let options = & * options_vc. await ?;
34
- let mut font_fallbacks = vec ! [ ] ;
35
40
let scoped_font_family =
36
41
get_scoped_font_family ( FontFamilyType :: Fallback . cell ( ) , options_vc. font_family ( ) ) ;
37
42
43
+ let mut font_fallbacks = vec ! [ ] ;
38
44
match options. adjust_font_fallback {
39
- AdjustFontFallback :: Arial => font_fallbacks. push (
40
- FontFallback :: Automatic ( AutomaticFontFallback {
41
- scoped_font_family : scoped_font_family. to_resolved ( ) . await ?,
42
- local_font_family : ResolvedVc :: cell ( "Arial" . into ( ) ) ,
43
- adjustment : Some (
44
- get_font_adjustment ( lookup_path, options_vc, & DEFAULT_SANS_SERIF_FONT ) . await ?,
45
+ AdjustFontFallback :: Arial => {
46
+ let adjustment =
47
+ get_font_adjustment ( lookup_path, options_vc, & DEFAULT_SANS_SERIF_FONT ) . await ?;
48
+
49
+ match adjustment {
50
+ FontResult :: Ok ( adjustment) => font_fallbacks. push (
51
+ FontFallback :: Automatic ( AutomaticFontFallback {
52
+ scoped_font_family : scoped_font_family. to_resolved ( ) . await ?,
53
+ local_font_family : ResolvedVc :: cell ( "Arial" . into ( ) ) ,
54
+ adjustment : Some ( adjustment) ,
55
+ } )
56
+ . resolved_cell ( ) ,
45
57
) ,
46
- } )
47
- . resolved_cell ( ) ,
48
- ) ,
49
- AdjustFontFallback :: TimesNewRoman => font_fallbacks. push (
50
- FontFallback :: Automatic ( AutomaticFontFallback {
51
- scoped_font_family : scoped_font_family. to_resolved ( ) . await ?,
52
- local_font_family : ResolvedVc :: cell ( "Times New Roman" . into ( ) ) ,
53
- adjustment : Some (
54
- get_font_adjustment ( lookup_path, options_vc, & DEFAULT_SERIF_FONT ) . await ?,
58
+ FontResult :: FontFileNotFound ( err) => {
59
+ return Ok ( FontFallbackResult :: FontFileNotFound ( err) . cell ( ) )
60
+ }
61
+ } ;
62
+ }
63
+ AdjustFontFallback :: TimesNewRoman => {
64
+ let adjustment =
65
+ get_font_adjustment ( lookup_path, options_vc, & DEFAULT_SERIF_FONT ) . await ?;
66
+
67
+ match adjustment {
68
+ FontResult :: Ok ( adjustment) => font_fallbacks. push (
69
+ FontFallback :: Automatic ( AutomaticFontFallback {
70
+ scoped_font_family : scoped_font_family. to_resolved ( ) . await ?,
71
+ local_font_family : ResolvedVc :: cell ( "Times New Roman" . into ( ) ) ,
72
+ adjustment : Some ( adjustment) ,
73
+ } )
74
+ . resolved_cell ( ) ,
55
75
) ,
56
- } )
57
- . resolved_cell ( ) ,
58
- ) ,
76
+ FontResult :: FontFileNotFound ( err) => {
77
+ return Ok ( FontFallbackResult :: FontFileNotFound ( err) . cell ( ) )
78
+ }
79
+ } ;
80
+ }
59
81
AdjustFontFallback :: None => ( ) ,
60
82
} ;
61
83
62
84
if let Some ( fallback) = & options. fallback {
63
85
font_fallbacks. push ( FontFallback :: Manual ( fallback. clone ( ) ) . resolved_cell ( ) ) ;
64
86
}
65
87
66
- Ok ( Vc :: cell ( font_fallbacks) )
88
+ Ok ( FontFallbackResult :: Ok ( FontFallbacks ( font_fallbacks) . resolved_cell ( ) ) . cell ( ) )
67
89
}
68
90
69
91
async fn get_font_adjustment (
70
92
lookup_path : Vc < FileSystemPath > ,
71
93
options : Vc < NextFontLocalOptions > ,
72
94
fallback_font : & DefaultFallbackFont ,
73
- ) -> Result < FontAdjustment > {
95
+ ) -> Result < FontResult < FontAdjustment > > {
74
96
let options = & * options. await ?;
75
97
let main_descriptor = pick_font_for_fallback_generation ( & options. fonts ) ?;
76
98
let font_file = & * lookup_path
77
99
. join ( main_descriptor. path . clone ( ) )
78
100
. read ( )
79
101
. await ?;
80
102
let font_file_rope = match font_file {
81
- FileContent :: NotFound => bail ! ( FontError :: FontFileNotFound ( main_descriptor. path. clone( ) ) ) ,
103
+ FileContent :: NotFound => {
104
+ return Ok ( FontResult :: FontFileNotFound ( FontFileNotFound (
105
+ main_descriptor. path . clone ( ) ,
106
+ ) ) ) ;
107
+ }
82
108
FileContent :: Content ( file) => file. content ( ) ,
83
109
} ;
84
110
@@ -106,12 +132,12 @@ async fn get_font_adjustment(
106
132
None => 1.0 ,
107
133
} ;
108
134
109
- Ok ( FontAdjustment {
135
+ Ok ( FontResult :: Ok ( FontAdjustment {
110
136
ascent : font. hhea_table . ascender as f64 / ( units_per_em * size_adjust) ,
111
137
descent : font. hhea_table . descender as f64 / ( units_per_em * size_adjust) ,
112
138
line_gap : font. hhea_table . line_gap as f64 / ( units_per_em * size_adjust) ,
113
139
size_adjust,
114
- } )
140
+ } ) )
115
141
}
116
142
117
143
fn calc_average_width ( font : & mut Font < DynamicFontTableProvider > ) -> Option < f32 > {
0 commit comments