@@ -132,42 +132,42 @@ impl BuiltinFont {
132
132
SubsetFont {
133
133
bytes : match self {
134
134
TimesRoman => {
135
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Roman.subset.ttf" ) )
135
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Roman.subset.ttf" ) )
136
136
}
137
137
TimesBold => {
138
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Bold.subset.ttf" ) )
138
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Bold.subset.ttf" ) )
139
139
}
140
140
TimesItalic => {
141
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Italic.subset.ttf" ) )
141
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Times-Italic.subset.ttf" ) )
142
142
}
143
- TimesBoldItalic => crate :: uncompress ( include_bytes ! (
143
+ TimesBoldItalic => crate :: utils :: uncompress ( include_bytes ! (
144
144
"../defaultfonts/Times-BoldItalic.subset.ttf"
145
145
) ) ,
146
146
Helvetica => {
147
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Helvetica.subset.ttf" ) )
147
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Helvetica.subset.ttf" ) )
148
148
}
149
149
HelveticaBold => {
150
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Helvetica-Bold.subset.ttf" ) )
150
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Helvetica-Bold.subset.ttf" ) )
151
151
}
152
- HelveticaOblique => crate :: uncompress ( include_bytes ! (
152
+ HelveticaOblique => crate :: utils :: uncompress ( include_bytes ! (
153
153
"../defaultfonts/Helvetica-Oblique.subset.ttf"
154
154
) ) ,
155
- HelveticaBoldOblique => crate :: uncompress ( include_bytes ! (
155
+ HelveticaBoldOblique => crate :: utils :: uncompress ( include_bytes ! (
156
156
"../defaultfonts/Helvetica-BoldOblique.subset.ttf"
157
157
) ) ,
158
- Courier => crate :: uncompress ( include_bytes ! ( "../defaultfonts/Courier.subset.ttf" ) ) ,
158
+ Courier => crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Courier.subset.ttf" ) ) ,
159
159
CourierOblique => {
160
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Courier-Oblique.subset.ttf" ) )
160
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Courier-Oblique.subset.ttf" ) )
161
161
}
162
162
CourierBold => {
163
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/Courier-Bold.subset.ttf" ) )
163
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Courier-Bold.subset.ttf" ) )
164
164
}
165
- CourierBoldOblique => crate :: uncompress ( include_bytes ! (
165
+ CourierBoldOblique => crate :: utils :: uncompress ( include_bytes ! (
166
166
"../defaultfonts/Courier-BoldOblique.subset.ttf"
167
167
) ) ,
168
- Symbol => crate :: uncompress ( include_bytes ! ( "../defaultfonts/Symbol.subset.ttf" ) ) ,
168
+ Symbol => crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/Symbol.subset.ttf" ) ) ,
169
169
ZapfDingbats => {
170
- crate :: uncompress ( include_bytes ! ( "../defaultfonts/ZapfDingbats.subset.ttf" ) )
170
+ crate :: utils :: uncompress ( include_bytes ! ( "../defaultfonts/ZapfDingbats.subset.ttf" ) )
171
171
}
172
172
} ,
173
173
glyph_mapping : FONTS
@@ -1666,3 +1666,140 @@ impl FontMetrics {
1666
1666
. map ( |s| s as f32 / self . units_per_em as f32 * target_font_size)
1667
1667
}
1668
1668
}
1669
+
1670
+ #[ cfg( test) ]
1671
+ mod test {
1672
+ use std:: collections:: BTreeMap ;
1673
+
1674
+ use crate :: * ;
1675
+
1676
+ const WIN_1252 : & [ char ; 214 ] = & [
1677
+ '!' , '"' , '#' , '$' , '%' , '&' , '\'' , '(' , ')' , '*' , '+' , ',' , '-' , '.' , '/' , '0' , '1' , '2' , '3' ,
1678
+ '4' , '5' , '6' , '7' , '8' , '9' , ':' , ';' , '<' , '=' , '>' , '?' , '@' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' ,
1679
+ 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' , 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' ,
1680
+ 'Z' , '[' , '\\' , ']' , '^' , '_' , '`' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' ,
1681
+ 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' , '{' , '|' , '}' , '~' , '€' ,
1682
+ '‚' , 'ƒ' , '„' , '…' , '†' , '‡' , 'ˆ' , '‰' , 'Š' , '‹' , 'Œ' , 'Ž' , '‘' , '’' , '“' , '•' , '–' , '—' , '˜' ,
1683
+ '™' , 'š' , '›' , 'œ' , 'ž' , 'Ÿ' , '¡' , '¢' , '£' , '¤' , '¥' , '¦' , '§' , '¨' , '©' , 'ª' , '«' , '¬' , '®' ,
1684
+ '¯' , '°' , '±' , '²' , '³' , '´' , 'µ' , '¶' , '·' , '¸' , '¹' , 'º' , '»' , '¼' , '½' , '¾' , '¿' , 'À' , 'Á' ,
1685
+ 'Â' , 'Ã' , 'Ä' , 'Å' , 'Æ' , 'Ç' , 'È' , 'É' , 'Ê' , 'Ë' , 'Ì' , 'Í' , 'Î' , 'Ï' , 'Ð' , 'Ñ' , 'Ò' , 'Ó' , 'Ô' ,
1686
+ 'Õ' , 'Ö' , '×' , 'Ø' , 'Ù' , 'Ú' , 'Û' , 'Ü' , 'Ý' , 'Þ' , 'ß' , 'à' , 'á' , 'â' , 'ã' , 'ä' , 'å' , 'æ' , 'ç' ,
1687
+ 'è' , 'é' , 'ê' , 'ë' , 'ì' , 'í' , 'î' , 'ï' , 'ð' , 'ñ' , 'ò' , 'ó' , 'ô' , 'õ' , 'ö' , '÷' , 'ø' , 'ù' , 'ú' ,
1688
+ 'û' , 'ü' , 'ý' , 'þ' , 'ÿ' ,
1689
+ ] ;
1690
+
1691
+ const FONTS : & [ ( BuiltinFont , & [ u8 ] ) ] = & [
1692
+ (
1693
+ BuiltinFont :: Courier ,
1694
+ include_bytes ! ( "../examples/assets/fonts/Courier.ttf" ) ,
1695
+ ) ,
1696
+ (
1697
+ BuiltinFont :: CourierOblique ,
1698
+ include_bytes ! ( "../examples/assets/fonts/Courier-Oblique.ttf" ) ,
1699
+ ) ,
1700
+ (
1701
+ BuiltinFont :: CourierBold ,
1702
+ include_bytes ! ( "../examples/assets/fonts/Courier-Bold.ttf" ) ,
1703
+ ) ,
1704
+ (
1705
+ BuiltinFont :: CourierBoldOblique ,
1706
+ include_bytes ! ( "../examples/assets/fonts/Courier-BoldOblique.ttf" ) ,
1707
+ ) ,
1708
+ (
1709
+ BuiltinFont :: Helvetica ,
1710
+ include_bytes ! ( "../examples/assets/fonts/Helvetica.ttf" ) ,
1711
+ ) ,
1712
+ (
1713
+ BuiltinFont :: HelveticaBold ,
1714
+ include_bytes ! ( "../examples/assets/fonts/Helvetica-Bold.ttf" ) ,
1715
+ ) ,
1716
+ (
1717
+ BuiltinFont :: HelveticaOblique ,
1718
+ include_bytes ! ( "../examples/assets/fonts/Helvetica-Oblique.ttf" ) ,
1719
+ ) ,
1720
+ (
1721
+ BuiltinFont :: HelveticaBoldOblique ,
1722
+ include_bytes ! ( "../examples/assets/fonts/Helvetica-BoldOblique.ttf" ) ,
1723
+ ) ,
1724
+ (
1725
+ BuiltinFont :: Symbol ,
1726
+ include_bytes ! ( "../examples/assets/fonts/PDFASymbol.woff2" ) ,
1727
+ ) ,
1728
+ (
1729
+ BuiltinFont :: TimesRoman ,
1730
+ include_bytes ! ( "../examples/assets/fonts/Times.ttf" ) ,
1731
+ ) ,
1732
+ (
1733
+ BuiltinFont :: TimesBold ,
1734
+ include_bytes ! ( "../examples/assets/fonts/Times-Bold.ttf" ) ,
1735
+ ) ,
1736
+ (
1737
+ BuiltinFont :: TimesItalic ,
1738
+ include_bytes ! ( "../examples/assets/fonts/Times-Oblique.ttf" ) ,
1739
+ ) ,
1740
+ (
1741
+ BuiltinFont :: TimesBoldItalic ,
1742
+ include_bytes ! ( "../examples/assets/fonts/Times-BoldOblique.ttf" ) ,
1743
+ ) ,
1744
+ (
1745
+ BuiltinFont :: ZapfDingbats ,
1746
+ include_bytes ! ( "../examples/assets/fonts/ZapfDingbats.ttf" ) ,
1747
+ ) ,
1748
+ ] ;
1749
+
1750
+ #[ test]
1751
+ fn subset_test ( ) {
1752
+ let charmap = WIN_1252 . iter ( ) . copied ( ) . collect ( ) ;
1753
+ let mut target_map = vec ! [ ] ;
1754
+
1755
+ let mut tm2 = BTreeMap :: new ( ) ;
1756
+ for ( name, bytes) in FONTS {
1757
+ let font = ParsedFont :: from_bytes ( bytes, 0 , & mut Vec :: new ( ) ) . unwrap ( ) ;
1758
+ let subset = font. subset_simple ( & charmap) . unwrap ( ) ;
1759
+ tm2. insert ( name. clone ( ) , subset. bytes . len ( ) ) ;
1760
+ let _ = std:: fs:: write (
1761
+ format ! (
1762
+ "{}/defaultfonts/{}.subset.ttf" ,
1763
+ env!( "CARGO_MANIFEST_DIR" ) ,
1764
+ name. get_id( )
1765
+ ) ,
1766
+ crate :: utils:: compress ( & subset. bytes ) ,
1767
+ ) ;
1768
+ for ( old_gid, ( new_gid, char) ) in subset. glyph_mapping . iter ( ) {
1769
+ target_map. push ( format ! (
1770
+ " ({}, {old_gid}, {new_gid}, '{c}')," ,
1771
+ name. get_num( ) ,
1772
+ c = if * char == '\'' {
1773
+ "\\ '" . to_string( )
1774
+ } else if * char == '\\' {
1775
+ "\\ \\ " . to_string( )
1776
+ } else {
1777
+ char . to_string( )
1778
+ }
1779
+ ) ) ;
1780
+ }
1781
+ }
1782
+
1783
+ let mut tm = vec ! [ format!(
1784
+ "const FONTS: &[(usize, u16, u16, char);{}] = &[" ,
1785
+ target_map. len( )
1786
+ ) ] ;
1787
+ tm. append ( & mut target_map) ;
1788
+ tm. push ( "];" . to_string ( ) ) ;
1789
+
1790
+ tm. push ( "fn match_len(bytes: &[u8]) -> Option<BuiltinFont> {" . to_string ( ) ) ;
1791
+ tm. push ( "match bytes.len() {" . to_string ( ) ) ;
1792
+ for ( f, b) in tm2. iter ( ) {
1793
+ tm. push ( format ! ( "{b} => Some(BuiltinFont::{f:?})," ) ) ;
1794
+ }
1795
+ tm. push ( "_ => None," . to_string ( ) ) ;
1796
+ tm. push ( "}" . to_string ( ) ) ;
1797
+ tm. push ( "}" . to_string ( ) ) ;
1798
+
1799
+ let _ = std:: fs:: write (
1800
+ format ! ( "{}/defaultfonts/mapping.rs" , env!( "CARGO_MANIFEST_DIR" ) ) ,
1801
+ tm. join ( "\r \n " ) ,
1802
+ ) ;
1803
+ }
1804
+
1805
+ }
0 commit comments