------------------------------------------------------------------------------
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)!
  $
------------------------------------------------------------------------------