Annotate fonts with ruby (pinyin/romaji) and produce modified TTF/WOFF2 outputs.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: build

lem.my 5670a0a3 33e25c3c

verified
-162
-162
src/ttc.rs
··· 104 104 105 105 Ok(out) 106 106 } 107 - 108 - #[cfg(test)] 109 - mod tests { 110 - use fontcull_read_fonts::{FileRef, TableProvider}; 111 - 112 - use super::*; 113 - 114 - #[test] 115 - fn test_ttc_roundtrip() -> Result<()> { 116 - // Include the TTC file 117 - let input_data = 118 - std::fs::read("Sarasa-Regular.ttc").context("Failed to read input TTC file")?; 119 - 120 - // Parse input TTC 121 - let input_file = FileRef::new(&input_data[..]).context("Failed to parse input TTC file")?; 122 - 123 - // Extract fonts from input TTC 124 - let input_fonts: Vec<FontRef> = input_file 125 - .fonts() 126 - .collect::<Result<Vec<_>, _>>() 127 - .context("Failed to collect fonts from input TTC")?; 128 - 129 - eprintln!("Input TTC contains {} fonts", input_fonts.len()); 130 - 131 - // Reconstruct using build_ttc 132 - let output_data = build_collection(&input_fonts).context("Failed to rebuild TTC")?; 133 - 134 - eprintln!( 135 - "Input size: {} bytes, Output size: {} bytes", 136 - input_data.len(), 137 - output_data.len() 138 - ); 139 - 140 - // Parse output TTC 141 - let output_file = 142 - FileRef::new(&output_data[..]).context("Failed to parse output TTC file")?; 143 - 144 - // Extract fonts from output TTC 145 - let output_fonts: Vec<FontRef> = output_file 146 - .fonts() 147 - .collect::<Result<Vec<_>, _>>() 148 - .context("Failed to collect fonts from output TTC")?; 149 - 150 - eprintln!("Output TTC contains {} fonts", output_fonts.len()); 151 - 152 - // Basic checks 153 - assert_eq!(input_fonts.len(), output_fonts.len(), "Font count mismatch"); 154 - 155 - // Compare each font in detail 156 - for (i, (in_font, out_font)) in input_fonts.iter().zip(output_fonts.iter()).enumerate() { 157 - eprintln!("\n=== Comparing Font {} ===", i); 158 - 159 - // Compare key metadata 160 - let in_head = in_font 161 - .head() 162 - .context(format!("Input font {} has no head table", i))?; 163 - let out_head = out_font 164 - .head() 165 - .context(format!("Output font {} has no head table", i))?; 166 - 167 - eprintln!( 168 - "Font {}: Input units_per_em={}, Output units_per_em={}", 169 - i, 170 - in_head.units_per_em(), 171 - out_head.units_per_em() 172 - ); 173 - 174 - // Compare essential table presence 175 - let in_tables: Vec<Tag> = in_font 176 - .table_directory() 177 - .table_records() 178 - .into_iter() 179 - .map(|r| r.tag()) 180 - .collect(); 181 - let out_tables: Vec<Tag> = out_font 182 - .table_directory() 183 - .table_records() 184 - .into_iter() 185 - .map(|r| r.tag()) 186 - .collect(); 187 - 188 - eprintln!( 189 - "Font {}: Input tables: {:?}", 190 - i, 191 - in_tables 192 - .iter() 193 - .map(|t| format!("{}", t)) 194 - .collect::<Vec<_>>() 195 - ); 196 - eprintln!( 197 - "Font {}: Output tables: {:?}", 198 - i, 199 - out_tables 200 - .iter() 201 - .map(|t| format!("{}", t)) 202 - .collect::<Vec<_>>() 203 - ); 204 - 205 - // Check if all essential tables are present 206 - if in_tables != out_tables { 207 - eprintln!("Warning: Font {} has different table lists", i); 208 - let missing: Vec<_> = in_tables 209 - .iter() 210 - .filter(|t| !out_tables.contains(t)) 211 - .collect(); 212 - let extra: Vec<_> = out_tables 213 - .iter() 214 - .filter(|t| !in_tables.contains(t)) 215 - .collect(); 216 - 217 - if !missing.is_empty() { 218 - eprintln!(" Missing in output: {:?}", missing); 219 - } 220 - if !extra.is_empty() { 221 - eprintln!(" Extra in output: {:?}", extra); 222 - } 223 - } 224 - 225 - // Compare table sizes for common tables 226 - for &tag in &in_tables { 227 - if out_tables.contains(&tag) { 228 - let in_size = in_font.table_data(tag).map(|d| d.len()).unwrap_or(0); 229 - let out_size = out_font.table_data(tag).map(|d| d.len()).unwrap_or(0); 230 - 231 - if in_size != out_size { 232 - eprintln!( 233 - "Font {}: Table {} size differs: {} -> {}", 234 - i, tag, in_size, out_size 235 - ); 236 - } 237 - } 238 - } 239 - } 240 - 241 - // Compute checksums for debugging 242 - let input_cksum: u32 = input_data 243 - .iter() 244 - .map(|&b| b as u32) 245 - .fold(0, |a, b| a.wrapping_add(b)); 246 - let output_cksum: u32 = output_data 247 - .iter() 248 - .map(|&b| b as u32) 249 - .fold(0, |a, b| a.wrapping_add(b)); 250 - 251 - eprintln!( 252 - "\nInput checksum: {:08x}, Output checksum: {:08x}", 253 - input_cksum, output_cksum 254 - ); 255 - 256 - // // For now, just ensure the roundtrip produces valid TTCs 257 - // assert!( 258 - // output_fonts.len() > 0, 259 - // "Output TTC should contain at least one font" 260 - // ); 261 - 262 - assert_eq!(input_cksum, output_cksum); 263 - 264 - assert_eq!(input_data.to_vec(), output_data); 265 - 266 - Ok(()) 267 - } 268 - }