| ------------------------------------------------------------------------------ |
| ot-sanitise - TTF/OTF font transcoder |
| |
| Description: |
| ot-sanitise is a program which validates and transcodes a truetype or |
| opentype font file using the OTS library: |
| |
| transcoded_font = ValidateAndTranscode(original_font); |
| if (validation_error) |
| PrintErrorAndExit; |
| OutputToStdout(transcoded_font); |
| |
| Usage: |
| $ ./ot-sanitise ttf_or_otf_file > transcoded_file |
| |
| Example: |
| $ ./ot-sanitise sample.otf > transcoded_sample.otf |
| $ ./ot-sanitise malformed.ttf > transcoded_malformed.ttf |
| WARNING at ots/src/ots.cc:158: bad range shift |
| ERROR at ots/src/ots.cc:199 (bool<unnamed>::do_ots_process(ots::OpenTypeFile*, ots::OTSStream*, const uint8_t*, size_t)) |
| Failed to sanitise file! |
| $ |
| |
| ------------------------------------------------------------------------------ |
| idempotent - TTF/OTF font transcoder (for OTS debugging) |
| |
| Description: |
| idempotent is a program which validates and transcodes a truetype or opentype |
| font file using OTS. This tool transcodes the original font twice and then |
| verifies that the two transcoded fonts are identical: |
| |
| t1 = ValidateAndTranscode(original_font); |
| if (validation_error) |
| PrintErrorAndExit; |
| t2 = ValidateAndTranscode(t1); |
| if (validation_error) |
| PrintErrorAndExit; |
| if (t1 != t2) |
| PrintErrorAndExit; |
| |
| This tool is basically for OTS developers. |
| |
| Usage: |
| $ ./idempotent ttf_or_otf_file |
| |
| Example: |
| $ ./idempotent sample.otf |
| $ ./idempotent malformed.ttf |
| WARNING at ots/src/ots.cc:158: bad range shift |
| ERROR at ots/src/ots.cc:199 (bool<unnamed>::do_ots_process(ots::OpenTypeFile*, ots::OTSStream*, const uint8_t*, size_t)) |
| Failed to sanitise file! |
| $ |
| |
| ------------------------------------------------------------------------------ |
| validator_checker - font validation checker |
| |
| Description: |
| validator_checker is a program which is intended to validate malformed fonts. |
| If the program detects that the font is invalid, it prints "OK" and returns |
| with 0 (success). If it coulndn't detect any errors, the program then opens |
| the transcoded font and renders some characters using FreeType2: |
| |
| transcoded_font = ValidateAndTranscode(malicious_font); |
| if (validation_error) |
| Print("OK"); |
| OpenAndRenderSomeCharacters(transcoded_font); # may cause SIGSEGV |
| Print("OK"); |
| |
| If SEGV doesn't raise inside FreeType2 library, the program prints "OK" and |
| returns with 0 as well. You should run this tool under the catchsegv or |
| valgrind command so that you can easily verify that all transformed fonts |
| don't crash the library (see the example below). |
| |
| Usage: |
| $ catchsegv ./validator_checker malicous_ttf_or_otf_file |
| |
| Example: |
| $ for f in malformed/*.ttf ; do catchsegv ./validator-checker "$f" ; done |
| OK: the malicious font was filtered: malformed/1.ttf |
| OK: the malicious font was filtered: malformed/2.ttf |
| OK: FreeType2 didn't crash: malformed/3.ttf |
| OK: the malicious font was filtered: malformed/4.ttf |
| $ |
| |
| ------------------------------------------------------------------------------ |
| perf - performance checker |
| |
| Description: |
| perf is a program which validates and transcodes a truetype or opentype font |
| file N times using OTS, then prints the elapsed time: |
| |
| for (N times) |
| ValidateAndTranscode(original_font); |
| Print(elapsed_time_in_us / N); |
| |
| Usage: |
| $ ./perf ttf_or_otf_file |
| |
| Example: |
| $ ./perf sample.ttf |
| 903 [us] sample.ttf (139332 bytes, 154 [byte/us]) |
| $ ./perf sample-bold.otf |
| 291 [us] sample-bold.otf (150652 bytes, 517 [byte/us]) |
| |
| ------------------------------------------------------------------------------ |
| side-by-side - font quality checker |
| |
| Description: |
| side-by-side is a program which renders some characters (ASCII, Latin-1, CJK) |
| using both original font and transcoded font and checks that the two rendering |
| results are exactly equal. |
| |
| The following Unicode characters are used during the test: |
| 0x0020 - 0x007E // Basic Latin |
| 0x00A1 - 0x017F // Latin-1 |
| 0x1100 - 0x11FF // Hangul |
| 0x3040 - 0x309F // Japanese HIRAGANA letters |
| 0x3130 - 0x318F // Hangul |
| 0x4E00 - 0x4F00 // CJK Kanji/Hanja |
| 0xAC00 - 0xAD00 // Hangul |
| |
| This tool uses FreeType2 library. |
| Note: This tool doesn't check kerning (GPOS/kern) nor font substitution |
| (GSUB). These should be tested in Layout tests if necessary. |
| |
| Usage: |
| $ ./side-by-side ttf_or_otf_file |
| |
| Example: |
| $ ./side-by-side linux/kochi-gothic.ttf # no problem |
| $ ./side-by-side free/kredit1.ttf # this is known issue of OTS. |
| bitmap metrics doesn't match! (14, 57), (37, 45) |
| EXPECTED: |
| |
| +#######*. |
| +##########+ |
| .###+.#. .#. |
| *#* # #* |
| ##. # ## |
| ## # ## |
| ## # ## |
| ## #. ## |
| ##. #. .## |
| ##. #. .## |
| *#+ *+ +#* |
| *#+ *+ +#* |
| *#+ *+ +#* |
| *#+ *+ +#* |
| *#+ *+ *#* |
| *#+ ++ *#+ |
| +#* +* *#+ |
| +#* +* *#+ |
| +#* +* *#+ |
| +#* +* ##. |
| +#* +* ##. |
| .## .# ## |
| .## .# ## |
| .## .# ## |
| ## # ## |
| ## # ## |
| ## # .## |
| ## # .## |
| ## .#+ +#* |
| ## +######* |
| ##.+#######* |
| *##########* |
| +##########+ |
| #########* |
| .######## |
| +####+ |
| |
| |
| |
| |
| |
| |
| .*######* |
| +##*.*##### |
| .##+.#+ +# |
| *#* ## #+ |
| ##*### ## |
| ###### ## |
| ##+.##+ +## |
| ## ########## |
| ## +######### |
| ## +######## |
| *#. .########* |
| .#* #########. |
| +##########+ |
| +*######* |
| |
| ACTUAL: |
| |
| .*##*+ |
| +##+.##*. |
| .#* .##.+#* |
| *# ### *#+ |
| #*######+ .*#+ |
| #########*. +#*. |
| ###########* +#* |
| *############+ *#+ |
| +##############. .##. |
| *##############* +#* |
| +###############+ *#+ |
| *###############+ .*#+ |
| .###############*. +#*. |
| +###############* +#* |
| *###############+ *#+ |
| .*###############+ .*#+ |
| +###############*. +#* |
| +###############* ** |
| *###############+ #+ |
| .###############* ## |
| +############+ ## |
| +########* .## |
| .######. +### |
| +#####+ .*#..# |
| +#####* *###..# |
| *#####. +#######* |
| +#####+ .*########. |
| +#####* +#########* |
| *#####. +##########+ |
| +#####+ *#########*. |
| .#####* +##########+ |
| *#####. +##########* |
| +#####+ *#########*. |
| .#####* +##########+ |
| *#####+ +##########* |
| .#*++#+ *#########*. |
| .#+ ## +##########+ |
| ****###+.##########* |
| ##################. |
| ###+ *#########+ |
| ## +########* |
| *#+ *########. |
| ##.#######+ |
| +#######* |
| *###*. |
| |
| |
| Glyph mismatch! (file: free/kredit1.ttf, U+0021, 100pt)! |
| $ |
| ------------------------------------------------------------------------------ |