ttfunk 1.6.2.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - checksums.yaml.gz.sig +2 -1
 - data.tar.gz.sig +0 -0
 - data/CHANGELOG.md +15 -1
 - data/lib/ttfunk.rb +3 -2
 - data/lib/ttfunk/bit_field.rb +1 -1
 - data/lib/ttfunk/collection.rb +8 -2
 - data/lib/ttfunk/encoded_string.rb +3 -3
 - data/lib/ttfunk/max.rb +1 -0
 - data/lib/ttfunk/min.rb +1 -0
 - data/lib/ttfunk/one_based_array.rb +1 -1
 - data/lib/ttfunk/otf_encoder.rb +1 -1
 - data/lib/ttfunk/reader.rb +3 -3
 - data/lib/ttfunk/sci_form.rb +1 -1
 - data/lib/ttfunk/subset.rb +3 -3
 - data/lib/ttfunk/subset/base.rb +24 -21
 - data/lib/ttfunk/subset/code_page.rb +16 -19
 - data/lib/ttfunk/subset/unicode.rb +8 -6
 - data/lib/ttfunk/subset/unicode_8bit.rb +14 -12
 - data/lib/ttfunk/sum.rb +1 -0
 - data/lib/ttfunk/table/cff.rb +17 -17
 - data/lib/ttfunk/table/cff/charset.rb +31 -30
 - data/lib/ttfunk/table/cff/charsets.rb +3 -3
 - data/lib/ttfunk/table/cff/charstring.rb +54 -55
 - data/lib/ttfunk/table/cff/dict.rb +6 -4
 - data/lib/ttfunk/table/cff/encoding.rb +20 -21
 - data/lib/ttfunk/table/cff/encodings.rb +1 -1
 - data/lib/ttfunk/table/cff/fd_selector.rb +14 -11
 - data/lib/ttfunk/table/cff/font_index.rb +7 -6
 - data/lib/ttfunk/table/cff/index.rb +6 -5
 - data/lib/ttfunk/table/cff/one_based_index.rb +7 -3
 - data/lib/ttfunk/table/cff/path.rb +5 -3
 - data/lib/ttfunk/table/cff/top_dict.rb +7 -6
 - data/lib/ttfunk/table/cff/top_index.rb +5 -4
 - data/lib/ttfunk/table/cmap.rb +8 -6
 - data/lib/ttfunk/table/cmap/format00.rb +7 -6
 - data/lib/ttfunk/table/cmap/format04.rb +16 -15
 - data/lib/ttfunk/table/cmap/format06.rb +6 -5
 - data/lib/ttfunk/table/cmap/format10.rb +6 -5
 - data/lib/ttfunk/table/cmap/format12.rb +13 -12
 - data/lib/ttfunk/table/cmap/subtable.rb +4 -4
 - data/lib/ttfunk/table/dsig.rb +11 -9
 - data/lib/ttfunk/table/glyf.rb +3 -3
 - data/lib/ttfunk/table/glyf/compound.rb +8 -8
 - data/lib/ttfunk/table/hmtx.rb +6 -5
 - data/lib/ttfunk/table/kern.rb +4 -4
 - data/lib/ttfunk/table/kern/format0.rb +1 -1
 - data/lib/ttfunk/table/loca.rb +7 -6
 - data/lib/ttfunk/table/name.rb +6 -5
 - data/lib/ttfunk/table/os2.rb +261 -151
 - data/lib/ttfunk/table/post.rb +1 -1
 - data/lib/ttfunk/table/sbix.rb +15 -13
 - data/lib/ttfunk/table/vorg.rb +1 -1
 - data/lib/ttfunk/ttf_encoder.rb +4 -4
 - metadata +29 -99
 - metadata.gz.sig +0 -0
 
    
        data/lib/ttfunk/table/os2.rb
    CHANGED
    
    | 
         @@ -44,100 +44,209 @@ module TTFunk 
     | 
|
| 
       44 
44 
     | 
    
         
             
                  attr_reader :max_context
         
     | 
| 
       45 
45 
     | 
    
         | 
| 
       46 
46 
     | 
    
         
             
                  CODE_PAGE_BITS = {
         
     | 
| 
       47 
     | 
    
         
            -
                    1252 => 0, 
     | 
| 
       48 
     | 
    
         
            -
                     
     | 
| 
       49 
     | 
    
         
            -
                     
     | 
| 
       50 
     | 
    
         
            -
                     
     | 
| 
       51 
     | 
    
         
            -
                     
     | 
| 
       52 
     | 
    
         
            -
                     
     | 
| 
       53 
     | 
    
         
            -
                     
     | 
| 
      
 47 
     | 
    
         
            +
                    1252 => 0,
         
     | 
| 
      
 48 
     | 
    
         
            +
                    1250 => 1,
         
     | 
| 
      
 49 
     | 
    
         
            +
                    1251 => 2,
         
     | 
| 
      
 50 
     | 
    
         
            +
                    1253 => 3,
         
     | 
| 
      
 51 
     | 
    
         
            +
                    1254 => 4,
         
     | 
| 
      
 52 
     | 
    
         
            +
                    1255 => 5,
         
     | 
| 
      
 53 
     | 
    
         
            +
                    1256 => 6,
         
     | 
| 
      
 54 
     | 
    
         
            +
                    1257 => 7,
         
     | 
| 
      
 55 
     | 
    
         
            +
                    1258 => 8,
         
     | 
| 
      
 56 
     | 
    
         
            +
                    874 => 16,
         
     | 
| 
      
 57 
     | 
    
         
            +
                    932 => 17,
         
     | 
| 
      
 58 
     | 
    
         
            +
                    936 => 18,
         
     | 
| 
      
 59 
     | 
    
         
            +
                    949 => 19,
         
     | 
| 
      
 60 
     | 
    
         
            +
                    950 => 20,
         
     | 
| 
      
 61 
     | 
    
         
            +
                    1361 => 21,
         
     | 
| 
      
 62 
     | 
    
         
            +
                    10_000 => 29,
         
     | 
| 
      
 63 
     | 
    
         
            +
                    869 => 48,
         
     | 
| 
      
 64 
     | 
    
         
            +
                    866 => 49,
         
     | 
| 
      
 65 
     | 
    
         
            +
                    865 => 50,
         
     | 
| 
      
 66 
     | 
    
         
            +
                    864 => 51,
         
     | 
| 
      
 67 
     | 
    
         
            +
                    863 => 52,
         
     | 
| 
      
 68 
     | 
    
         
            +
                    862 => 53,
         
     | 
| 
      
 69 
     | 
    
         
            +
                    861 => 54,
         
     | 
| 
      
 70 
     | 
    
         
            +
                    860 => 55,
         
     | 
| 
      
 71 
     | 
    
         
            +
                    857 => 56,
         
     | 
| 
      
 72 
     | 
    
         
            +
                    855 => 57,
         
     | 
| 
      
 73 
     | 
    
         
            +
                    852 => 58,
         
     | 
| 
      
 74 
     | 
    
         
            +
                    775 => 59,
         
     | 
| 
      
 75 
     | 
    
         
            +
                    737 => 60,
         
     | 
| 
      
 76 
     | 
    
         
            +
                    708 => 61,
         
     | 
| 
      
 77 
     | 
    
         
            +
                    850 => 62,
         
     | 
| 
      
 78 
     | 
    
         
            +
                    437 => 63
         
     | 
| 
       54 
79 
     | 
    
         
             
                  }.freeze
         
     | 
| 
       55 
80 
     | 
    
         | 
| 
       56 
81 
     | 
    
         
             
                  UNICODE_BLOCKS = {
         
     | 
| 
       57 
     | 
    
         
            -
                    (0x0000..0x007F) => 0, 
     | 
| 
       58 
     | 
    
         
            -
                    ( 
     | 
| 
       59 
     | 
    
         
            -
                    ( 
     | 
| 
       60 
     | 
    
         
            -
                    ( 
     | 
| 
       61 
     | 
    
         
            -
                    ( 
     | 
| 
       62 
     | 
    
         
            -
                    ( 
     | 
| 
       63 
     | 
    
         
            -
                    ( 
     | 
| 
       64 
     | 
    
         
            -
                    ( 
     | 
| 
       65 
     | 
    
         
            -
                    ( 
     | 
| 
       66 
     | 
    
         
            -
                    ( 
     | 
| 
       67 
     | 
    
         
            -
                    ( 
     | 
| 
       68 
     | 
    
         
            -
                    ( 
     | 
| 
       69 
     | 
    
         
            -
                    ( 
     | 
| 
       70 
     | 
    
         
            -
                    ( 
     | 
| 
       71 
     | 
    
         
            -
                    ( 
     | 
| 
       72 
     | 
    
         
            -
                    ( 
     | 
| 
       73 
     | 
    
         
            -
                    ( 
     | 
| 
       74 
     | 
    
         
            -
                    ( 
     | 
| 
       75 
     | 
    
         
            -
                    ( 
     | 
| 
       76 
     | 
    
         
            -
                    ( 
     | 
| 
       77 
     | 
    
         
            -
                    ( 
     | 
| 
       78 
     | 
    
         
            -
                    ( 
     | 
| 
       79 
     | 
    
         
            -
                    ( 
     | 
| 
       80 
     | 
    
         
            -
                    ( 
     | 
| 
       81 
     | 
    
         
            -
                    ( 
     | 
| 
       82 
     | 
    
         
            -
                    ( 
     | 
| 
       83 
     | 
    
         
            -
                    ( 
     | 
| 
       84 
     | 
    
         
            -
                    ( 
     | 
| 
       85 
     | 
    
         
            -
                    ( 
     | 
| 
       86 
     | 
    
         
            -
                    ( 
     | 
| 
       87 
     | 
    
         
            -
                    ( 
     | 
| 
       88 
     | 
    
         
            -
                    ( 
     | 
| 
       89 
     | 
    
         
            -
                    ( 
     | 
| 
       90 
     | 
    
         
            -
                    ( 
     | 
| 
       91 
     | 
    
         
            -
                    ( 
     | 
| 
       92 
     | 
    
         
            -
                    ( 
     | 
| 
       93 
     | 
    
         
            -
                    ( 
     | 
| 
       94 
     | 
    
         
            -
                    ( 
     | 
| 
       95 
     | 
    
         
            -
                    ( 
     | 
| 
       96 
     | 
    
         
            -
                    ( 
     | 
| 
       97 
     | 
    
         
            -
                    ( 
     | 
| 
       98 
     | 
    
         
            -
                    ( 
     | 
| 
       99 
     | 
    
         
            -
                    ( 
     | 
| 
       100 
     | 
    
         
            -
                    ( 
     | 
| 
       101 
     | 
    
         
            -
                    ( 
     | 
| 
       102 
     | 
    
         
            -
                    ( 
     | 
| 
       103 
     | 
    
         
            -
                    ( 
     | 
| 
       104 
     | 
    
         
            -
                    ( 
     | 
| 
       105 
     | 
    
         
            -
                    ( 
     | 
| 
       106 
     | 
    
         
            -
                    ( 
     | 
| 
       107 
     | 
    
         
            -
                    ( 
     | 
| 
       108 
     | 
    
         
            -
                    ( 
     | 
| 
       109 
     | 
    
         
            -
                    ( 
     | 
| 
       110 
     | 
    
         
            -
                    ( 
     | 
| 
       111 
     | 
    
         
            -
                    ( 
     | 
| 
       112 
     | 
    
         
            -
                    ( 
     | 
| 
       113 
     | 
    
         
            -
                    ( 
     | 
| 
       114 
     | 
    
         
            -
                    ( 
     | 
| 
       115 
     | 
    
         
            -
                    ( 
     | 
| 
       116 
     | 
    
         
            -
                    ( 
     | 
| 
       117 
     | 
    
         
            -
                    ( 
     | 
| 
       118 
     | 
    
         
            -
                    ( 
     | 
| 
       119 
     | 
    
         
            -
                    ( 
     | 
| 
       120 
     | 
    
         
            -
                    ( 
     | 
| 
       121 
     | 
    
         
            -
                    ( 
     | 
| 
       122 
     | 
    
         
            -
                    ( 
     | 
| 
       123 
     | 
    
         
            -
                    ( 
     | 
| 
       124 
     | 
    
         
            -
                    ( 
     | 
| 
       125 
     | 
    
         
            -
                    ( 
     | 
| 
       126 
     | 
    
         
            -
                    ( 
     | 
| 
       127 
     | 
    
         
            -
                    ( 
     | 
| 
       128 
     | 
    
         
            -
                    ( 
     | 
| 
       129 
     | 
    
         
            -
                    ( 
     | 
| 
       130 
     | 
    
         
            -
                    ( 
     | 
| 
       131 
     | 
    
         
            -
                    ( 
     | 
| 
       132 
     | 
    
         
            -
                    ( 
     | 
| 
       133 
     | 
    
         
            -
                    ( 
     | 
| 
       134 
     | 
    
         
            -
                    ( 
     | 
| 
       135 
     | 
    
         
            -
                    ( 
     | 
| 
       136 
     | 
    
         
            -
                    ( 
     | 
| 
       137 
     | 
    
         
            -
                    ( 
     | 
| 
       138 
     | 
    
         
            -
                    ( 
     | 
| 
       139 
     | 
    
         
            -
                    ( 
     | 
| 
       140 
     | 
    
         
            -
                    ( 
     | 
| 
      
 82 
     | 
    
         
            +
                    (0x0000..0x007F) => 0,
         
     | 
| 
      
 83 
     | 
    
         
            +
                    (0x0080..0x00FF) => 1,
         
     | 
| 
      
 84 
     | 
    
         
            +
                    (0x0100..0x017F) => 2,
         
     | 
| 
      
 85 
     | 
    
         
            +
                    (0x0180..0x024F) => 3,
         
     | 
| 
      
 86 
     | 
    
         
            +
                    (0x0250..0x02AF) => 4,
         
     | 
| 
      
 87 
     | 
    
         
            +
                    (0x1D00..0x1D7F) => 4,
         
     | 
| 
      
 88 
     | 
    
         
            +
                    (0x1D80..0x1DBF) => 4,
         
     | 
| 
      
 89 
     | 
    
         
            +
                    (0x02B0..0x02FF) => 5,
         
     | 
| 
      
 90 
     | 
    
         
            +
                    (0xA700..0xA71F) => 5,
         
     | 
| 
      
 91 
     | 
    
         
            +
                    (0x0300..0x036F) => 6,
         
     | 
| 
      
 92 
     | 
    
         
            +
                    (0x1DC0..0x1DFF) => 6,
         
     | 
| 
      
 93 
     | 
    
         
            +
                    (0x0370..0x03FF) => 7,
         
     | 
| 
      
 94 
     | 
    
         
            +
                    (0x2C80..0x2CFF) => 8,
         
     | 
| 
      
 95 
     | 
    
         
            +
                    (0x0400..0x04FF) => 9,
         
     | 
| 
      
 96 
     | 
    
         
            +
                    (0x0500..0x052F) => 9,
         
     | 
| 
      
 97 
     | 
    
         
            +
                    (0x2DE0..0x2DFF) => 9,
         
     | 
| 
      
 98 
     | 
    
         
            +
                    (0xA640..0xA69F) => 9,
         
     | 
| 
      
 99 
     | 
    
         
            +
                    (0x0530..0x058F) => 10,
         
     | 
| 
      
 100 
     | 
    
         
            +
                    (0x0590..0x05FF) => 11,
         
     | 
| 
      
 101 
     | 
    
         
            +
                    (0xA500..0xA63F) => 12,
         
     | 
| 
      
 102 
     | 
    
         
            +
                    (0x0600..0x06FF) => 13,
         
     | 
| 
      
 103 
     | 
    
         
            +
                    (0x0750..0x077F) => 13,
         
     | 
| 
      
 104 
     | 
    
         
            +
                    (0x07C0..0x07FF) => 14,
         
     | 
| 
      
 105 
     | 
    
         
            +
                    (0x0900..0x097F) => 15,
         
     | 
| 
      
 106 
     | 
    
         
            +
                    (0x0980..0x09FF) => 16,
         
     | 
| 
      
 107 
     | 
    
         
            +
                    (0x0A00..0x0A7F) => 17,
         
     | 
| 
      
 108 
     | 
    
         
            +
                    (0x0A80..0x0AFF) => 18,
         
     | 
| 
      
 109 
     | 
    
         
            +
                    (0x0B00..0x0B7F) => 19,
         
     | 
| 
      
 110 
     | 
    
         
            +
                    (0x0B80..0x0BFF) => 20,
         
     | 
| 
      
 111 
     | 
    
         
            +
                    (0x0C00..0x0C7F) => 21,
         
     | 
| 
      
 112 
     | 
    
         
            +
                    (0x0C80..0x0CFF) => 22,
         
     | 
| 
      
 113 
     | 
    
         
            +
                    (0x0D00..0x0D7F) => 23,
         
     | 
| 
      
 114 
     | 
    
         
            +
                    (0x0E00..0x0E7F) => 24,
         
     | 
| 
      
 115 
     | 
    
         
            +
                    (0x0E80..0x0EFF) => 25,
         
     | 
| 
      
 116 
     | 
    
         
            +
                    (0x10A0..0x10FF) => 26,
         
     | 
| 
      
 117 
     | 
    
         
            +
                    (0x2D00..0x2D2F) => 26,
         
     | 
| 
      
 118 
     | 
    
         
            +
                    (0x1B00..0x1B7F) => 27,
         
     | 
| 
      
 119 
     | 
    
         
            +
                    (0x1100..0x11FF) => 28,
         
     | 
| 
      
 120 
     | 
    
         
            +
                    (0x1E00..0x1EFF) => 29,
         
     | 
| 
      
 121 
     | 
    
         
            +
                    (0x2C60..0x2C7F) => 29,
         
     | 
| 
      
 122 
     | 
    
         
            +
                    (0xA720..0xA7FF) => 29,
         
     | 
| 
      
 123 
     | 
    
         
            +
                    (0x1F00..0x1FFF) => 30,
         
     | 
| 
      
 124 
     | 
    
         
            +
                    (0x2000..0x206F) => 31,
         
     | 
| 
      
 125 
     | 
    
         
            +
                    (0x2E00..0x2E7F) => 31,
         
     | 
| 
      
 126 
     | 
    
         
            +
                    (0x2070..0x209F) => 32,
         
     | 
| 
      
 127 
     | 
    
         
            +
                    (0x20A0..0x20CF) => 33,
         
     | 
| 
      
 128 
     | 
    
         
            +
                    (0x20D0..0x20FF) => 34,
         
     | 
| 
      
 129 
     | 
    
         
            +
                    (0x2100..0x214F) => 35,
         
     | 
| 
      
 130 
     | 
    
         
            +
                    (0x2150..0x218F) => 36,
         
     | 
| 
      
 131 
     | 
    
         
            +
                    (0x2190..0x21FF) => 37,
         
     | 
| 
      
 132 
     | 
    
         
            +
                    (0x27F0..0x27FF) => 37,
         
     | 
| 
      
 133 
     | 
    
         
            +
                    (0x2900..0x297F) => 37,
         
     | 
| 
      
 134 
     | 
    
         
            +
                    (0x2B00..0x2BFF) => 37,
         
     | 
| 
      
 135 
     | 
    
         
            +
                    (0x2200..0x22FF) => 38,
         
     | 
| 
      
 136 
     | 
    
         
            +
                    (0x2A00..0x2AFF) => 38,
         
     | 
| 
      
 137 
     | 
    
         
            +
                    (0x27C0..0x27EF) => 38,
         
     | 
| 
      
 138 
     | 
    
         
            +
                    (0x2980..0x29FF) => 38,
         
     | 
| 
      
 139 
     | 
    
         
            +
                    (0x2300..0x23FF) => 39,
         
     | 
| 
      
 140 
     | 
    
         
            +
                    (0x2400..0x243F) => 40,
         
     | 
| 
      
 141 
     | 
    
         
            +
                    (0x2440..0x245F) => 41,
         
     | 
| 
      
 142 
     | 
    
         
            +
                    (0x2460..0x24FF) => 42,
         
     | 
| 
      
 143 
     | 
    
         
            +
                    (0x2500..0x257F) => 43,
         
     | 
| 
      
 144 
     | 
    
         
            +
                    (0x2580..0x259F) => 44,
         
     | 
| 
      
 145 
     | 
    
         
            +
                    (0x25A0..0x25FF) => 45,
         
     | 
| 
      
 146 
     | 
    
         
            +
                    (0x2600..0x26FF) => 46,
         
     | 
| 
      
 147 
     | 
    
         
            +
                    (0x2700..0x27BF) => 47,
         
     | 
| 
      
 148 
     | 
    
         
            +
                    (0x3000..0x303F) => 48,
         
     | 
| 
      
 149 
     | 
    
         
            +
                    (0x3040..0x309F) => 49,
         
     | 
| 
      
 150 
     | 
    
         
            +
                    (0x30A0..0x30FF) => 50,
         
     | 
| 
      
 151 
     | 
    
         
            +
                    (0x31F0..0x31FF) => 50,
         
     | 
| 
      
 152 
     | 
    
         
            +
                    (0x3100..0x312F) => 51,
         
     | 
| 
      
 153 
     | 
    
         
            +
                    (0x31A0..0x31BF) => 51,
         
     | 
| 
      
 154 
     | 
    
         
            +
                    (0x3130..0x318F) => 52,
         
     | 
| 
      
 155 
     | 
    
         
            +
                    (0xA840..0xA87F) => 53,
         
     | 
| 
      
 156 
     | 
    
         
            +
                    (0x3200..0x32FF) => 54,
         
     | 
| 
      
 157 
     | 
    
         
            +
                    (0x3300..0x33FF) => 55,
         
     | 
| 
      
 158 
     | 
    
         
            +
                    (0xAC00..0xD7AF) => 56,
         
     | 
| 
      
 159 
     | 
    
         
            +
                    (0xD800..0xDFFF) => 57,
         
     | 
| 
      
 160 
     | 
    
         
            +
                    (0x10900..0x1091F) => 58,
         
     | 
| 
      
 161 
     | 
    
         
            +
                    (0x4E00..0x9FFF) => 59,
         
     | 
| 
      
 162 
     | 
    
         
            +
                    (0x2E80..0x2EFF) => 59,
         
     | 
| 
      
 163 
     | 
    
         
            +
                    (0x2F00..0x2FDF) => 59,
         
     | 
| 
      
 164 
     | 
    
         
            +
                    (0x2FF0..0x2FFF) => 59,
         
     | 
| 
      
 165 
     | 
    
         
            +
                    (0x3400..0x4DBF) => 59,
         
     | 
| 
      
 166 
     | 
    
         
            +
                    (0x20000..0x2A6DF) => 59,
         
     | 
| 
      
 167 
     | 
    
         
            +
                    (0x3190..0x319F) => 59,
         
     | 
| 
      
 168 
     | 
    
         
            +
                    (0xE000..0xF8FF) => 60,
         
     | 
| 
      
 169 
     | 
    
         
            +
                    (0x31C0..0x31EF) => 61,
         
     | 
| 
      
 170 
     | 
    
         
            +
                    (0xF900..0xFAFF) => 61,
         
     | 
| 
      
 171 
     | 
    
         
            +
                    (0x2F800..0x2FA1F) => 61,
         
     | 
| 
      
 172 
     | 
    
         
            +
                    (0xFB00..0xFB4F) => 62,
         
     | 
| 
      
 173 
     | 
    
         
            +
                    (0xFB50..0xFDFF) => 63,
         
     | 
| 
      
 174 
     | 
    
         
            +
                    (0xFE20..0xFE2F) => 64,
         
     | 
| 
      
 175 
     | 
    
         
            +
                    (0xFE10..0xFE1F) => 65,
         
     | 
| 
      
 176 
     | 
    
         
            +
                    (0xFE30..0xFE4F) => 65,
         
     | 
| 
      
 177 
     | 
    
         
            +
                    (0xFE50..0xFE6F) => 66,
         
     | 
| 
      
 178 
     | 
    
         
            +
                    (0xFE70..0xFEFF) => 67,
         
     | 
| 
      
 179 
     | 
    
         
            +
                    (0xFF00..0xFFEF) => 68,
         
     | 
| 
      
 180 
     | 
    
         
            +
                    (0xFFF0..0xFFFF) => 69,
         
     | 
| 
      
 181 
     | 
    
         
            +
                    (0x0F00..0x0FFF) => 70,
         
     | 
| 
      
 182 
     | 
    
         
            +
                    (0x0700..0x074F) => 71,
         
     | 
| 
      
 183 
     | 
    
         
            +
                    (0x0780..0x07BF) => 72,
         
     | 
| 
      
 184 
     | 
    
         
            +
                    (0x0D80..0x0DFF) => 73,
         
     | 
| 
      
 185 
     | 
    
         
            +
                    (0x1000..0x109F) => 74,
         
     | 
| 
      
 186 
     | 
    
         
            +
                    (0x1200..0x137F) => 75,
         
     | 
| 
      
 187 
     | 
    
         
            +
                    (0x1380..0x139F) => 75,
         
     | 
| 
      
 188 
     | 
    
         
            +
                    (0x2D80..0x2DDF) => 75,
         
     | 
| 
      
 189 
     | 
    
         
            +
                    (0x13A0..0x13FF) => 76,
         
     | 
| 
      
 190 
     | 
    
         
            +
                    (0x1400..0x167F) => 77,
         
     | 
| 
      
 191 
     | 
    
         
            +
                    (0x1680..0x169F) => 78,
         
     | 
| 
      
 192 
     | 
    
         
            +
                    (0x16A0..0x16FF) => 79,
         
     | 
| 
      
 193 
     | 
    
         
            +
                    (0x1780..0x17FF) => 80,
         
     | 
| 
      
 194 
     | 
    
         
            +
                    (0x19E0..0x19FF) => 80,
         
     | 
| 
      
 195 
     | 
    
         
            +
                    (0x1800..0x18AF) => 81,
         
     | 
| 
      
 196 
     | 
    
         
            +
                    (0x2800..0x28FF) => 82,
         
     | 
| 
      
 197 
     | 
    
         
            +
                    (0xA000..0xA48F) => 83,
         
     | 
| 
      
 198 
     | 
    
         
            +
                    (0xA490..0xA4CF) => 83,
         
     | 
| 
      
 199 
     | 
    
         
            +
                    (0x1700..0x171F) => 84,
         
     | 
| 
      
 200 
     | 
    
         
            +
                    (0x1720..0x173F) => 84,
         
     | 
| 
      
 201 
     | 
    
         
            +
                    (0x1740..0x175F) => 84,
         
     | 
| 
      
 202 
     | 
    
         
            +
                    (0x1760..0x177F) => 84,
         
     | 
| 
      
 203 
     | 
    
         
            +
                    (0x10300..0x1032F) => 85,
         
     | 
| 
      
 204 
     | 
    
         
            +
                    (0x10330..0x1034F) => 86,
         
     | 
| 
      
 205 
     | 
    
         
            +
                    (0x10400..0x1044F) => 87,
         
     | 
| 
      
 206 
     | 
    
         
            +
                    (0x1D000..0x1D0FF) => 88,
         
     | 
| 
      
 207 
     | 
    
         
            +
                    (0x1D100..0x1D1FF) => 88,
         
     | 
| 
      
 208 
     | 
    
         
            +
                    (0x1D200..0x1D24F) => 88,
         
     | 
| 
      
 209 
     | 
    
         
            +
                    (0x1D400..0x1D7FF) => 89,
         
     | 
| 
      
 210 
     | 
    
         
            +
                    (0xF0000..0xFFFFD) => 90,
         
     | 
| 
      
 211 
     | 
    
         
            +
                    (0x100000..0x10FFFD) => 90,
         
     | 
| 
      
 212 
     | 
    
         
            +
                    (0xFE00..0xFE0F) => 91,
         
     | 
| 
      
 213 
     | 
    
         
            +
                    (0xE0100..0xE01EF) => 91,
         
     | 
| 
      
 214 
     | 
    
         
            +
                    (0xE0000..0xE007F) => 92,
         
     | 
| 
      
 215 
     | 
    
         
            +
                    (0x1900..0x194F) => 93,
         
     | 
| 
      
 216 
     | 
    
         
            +
                    (0x1950..0x197F) => 94,
         
     | 
| 
      
 217 
     | 
    
         
            +
                    (0x1980..0x19DF) => 95,
         
     | 
| 
      
 218 
     | 
    
         
            +
                    (0x1A00..0x1A1F) => 96,
         
     | 
| 
      
 219 
     | 
    
         
            +
                    (0x2C00..0x2C5F) => 97,
         
     | 
| 
      
 220 
     | 
    
         
            +
                    (0x2D30..0x2D7F) => 98,
         
     | 
| 
      
 221 
     | 
    
         
            +
                    (0x4DC0..0x4DFF) => 99,
         
     | 
| 
      
 222 
     | 
    
         
            +
                    (0xA800..0xA82F) => 100,
         
     | 
| 
      
 223 
     | 
    
         
            +
                    (0x10000..0x1007F) => 101,
         
     | 
| 
      
 224 
     | 
    
         
            +
                    (0x10080..0x100FF) => 101,
         
     | 
| 
      
 225 
     | 
    
         
            +
                    (0x10100..0x1013F) => 101,
         
     | 
| 
      
 226 
     | 
    
         
            +
                    (0x10140..0x1018F) => 102,
         
     | 
| 
      
 227 
     | 
    
         
            +
                    (0x10380..0x1039F) => 103,
         
     | 
| 
      
 228 
     | 
    
         
            +
                    (0x103A0..0x103DF) => 104,
         
     | 
| 
      
 229 
     | 
    
         
            +
                    (0x10450..0x1047F) => 105,
         
     | 
| 
      
 230 
     | 
    
         
            +
                    (0x10480..0x104AF) => 106,
         
     | 
| 
      
 231 
     | 
    
         
            +
                    (0x10800..0x1083F) => 107,
         
     | 
| 
      
 232 
     | 
    
         
            +
                    (0x10A00..0x10A5F) => 108,
         
     | 
| 
      
 233 
     | 
    
         
            +
                    (0x1D300..0x1D35F) => 109,
         
     | 
| 
      
 234 
     | 
    
         
            +
                    (0x12000..0x123FF) => 110,
         
     | 
| 
      
 235 
     | 
    
         
            +
                    (0x12400..0x1247F) => 110,
         
     | 
| 
      
 236 
     | 
    
         
            +
                    (0x1D360..0x1D37F) => 111,
         
     | 
| 
      
 237 
     | 
    
         
            +
                    (0x1B80..0x1BBF) => 112,
         
     | 
| 
      
 238 
     | 
    
         
            +
                    (0x1C00..0x1C4F) => 113,
         
     | 
| 
      
 239 
     | 
    
         
            +
                    (0x1C50..0x1C7F) => 114,
         
     | 
| 
      
 240 
     | 
    
         
            +
                    (0xA880..0xA8DF) => 115,
         
     | 
| 
      
 241 
     | 
    
         
            +
                    (0xA900..0xA92F) => 116,
         
     | 
| 
      
 242 
     | 
    
         
            +
                    (0xA930..0xA95F) => 117,
         
     | 
| 
      
 243 
     | 
    
         
            +
                    (0xAA00..0xAA5F) => 118,
         
     | 
| 
      
 244 
     | 
    
         
            +
                    (0x10190..0x101CF) => 119,
         
     | 
| 
      
 245 
     | 
    
         
            +
                    (0x101D0..0x101FF) => 120,
         
     | 
| 
      
 246 
     | 
    
         
            +
                    (0x102A0..0x102DF) => 121,
         
     | 
| 
      
 247 
     | 
    
         
            +
                    (0x10280..0x1029F) => 121,
         
     | 
| 
      
 248 
     | 
    
         
            +
                    (0x10920..0x1093F) => 121,
         
     | 
| 
      
 249 
     | 
    
         
            +
                    (0x1F030..0x1F09F) => 122,
         
     | 
| 
       141 
250 
     | 
    
         
             
                    (0x1F000..0x1F02F) => 122
         
     | 
| 
       142 
251 
     | 
    
         
             
                  }.freeze
         
     | 
| 
       143 
252 
     | 
    
         | 
| 
         @@ -174,70 +283,71 @@ module TTFunk 
     | 
|
| 
       174 
283 
     | 
    
         | 
| 
       175 
284 
     | 
    
         
             
                  class << self
         
     | 
| 
       176 
285 
     | 
    
         
             
                    def encode(os2, subset)
         
     | 
| 
       177 
     | 
    
         
            -
                      ''.b 
     | 
| 
      
 286 
     | 
    
         
            +
                      result = ''.b
         
     | 
| 
      
 287 
     | 
    
         
            +
                      result << [
         
     | 
| 
      
 288 
     | 
    
         
            +
                        os2.version, avg_char_width_for(os2, subset), os2.weight_class,
         
     | 
| 
      
 289 
     | 
    
         
            +
                        os2.width_class, os2.type, os2.y_subscript_x_size,
         
     | 
| 
      
 290 
     | 
    
         
            +
                        os2.y_subscript_y_size, os2.y_subscript_x_offset,
         
     | 
| 
      
 291 
     | 
    
         
            +
                        os2.y_subscript_y_offset, os2.y_superscript_x_size,
         
     | 
| 
      
 292 
     | 
    
         
            +
                        os2.y_superscript_y_size, os2.y_superscript_x_offset,
         
     | 
| 
      
 293 
     | 
    
         
            +
                        os2.y_superscript_y_offset, os2.y_strikeout_size,
         
     | 
| 
      
 294 
     | 
    
         
            +
                        os2.y_strikeout_position, os2.family_class
         
     | 
| 
      
 295 
     | 
    
         
            +
                      ].pack('n*')
         
     | 
| 
      
 296 
     | 
    
         
            +
             
     | 
| 
      
 297 
     | 
    
         
            +
                      result << os2.panose
         
     | 
| 
      
 298 
     | 
    
         
            +
             
     | 
| 
      
 299 
     | 
    
         
            +
                      new_char_range = unicode_blocks_for(os2, os2.char_range, subset)
         
     | 
| 
      
 300 
     | 
    
         
            +
                      result << BinUtils
         
     | 
| 
      
 301 
     | 
    
         
            +
                        .slice_int(
         
     | 
| 
      
 302 
     | 
    
         
            +
                          new_char_range.value,
         
     | 
| 
      
 303 
     | 
    
         
            +
                          bit_width: 32,
         
     | 
| 
      
 304 
     | 
    
         
            +
                          slice_count: 4
         
     | 
| 
      
 305 
     | 
    
         
            +
                        )
         
     | 
| 
      
 306 
     | 
    
         
            +
                        .pack('N*')
         
     | 
| 
      
 307 
     | 
    
         
            +
             
     | 
| 
      
 308 
     | 
    
         
            +
                      result << os2.vendor_id
         
     | 
| 
      
 309 
     | 
    
         
            +
             
     | 
| 
      
 310 
     | 
    
         
            +
                      new_cmap_table = subset.new_cmap_table[:charmap]
         
     | 
| 
      
 311 
     | 
    
         
            +
                      code_points = new_cmap_table
         
     | 
| 
      
 312 
     | 
    
         
            +
                        .keys
         
     | 
| 
      
 313 
     | 
    
         
            +
                        .select { |k| (new_cmap_table[k][:new]).positive? }
         
     | 
| 
      
 314 
     | 
    
         
            +
                        .sort
         
     | 
| 
      
 315 
     | 
    
         
            +
             
     | 
| 
      
 316 
     | 
    
         
            +
                      # "This value depends on which character sets the font supports.
         
     | 
| 
      
 317 
     | 
    
         
            +
                      # This field cannot represent supplementary character values
         
     | 
| 
      
 318 
     | 
    
         
            +
                      # (codepoints greater than 0xFFFF). Fonts that support
         
     | 
| 
      
 319 
     | 
    
         
            +
                      # supplementary characters should set the value in this field
         
     | 
| 
      
 320 
     | 
    
         
            +
                      # to 0xFFFF."
         
     | 
| 
      
 321 
     | 
    
         
            +
                      first_char_index = [code_points.first || 0, UNICODE_MAX].min
         
     | 
| 
      
 322 
     | 
    
         
            +
                      last_char_index = [code_points.last || 0, UNICODE_MAX].min
         
     | 
| 
      
 323 
     | 
    
         
            +
             
     | 
| 
      
 324 
     | 
    
         
            +
                      result << [
         
     | 
| 
      
 325 
     | 
    
         
            +
                        os2.selection, first_char_index, last_char_index
         
     | 
| 
      
 326 
     | 
    
         
            +
                      ].pack('n*')
         
     | 
| 
      
 327 
     | 
    
         
            +
             
     | 
| 
      
 328 
     | 
    
         
            +
                      if os2.version.positive?
         
     | 
| 
       178 
329 
     | 
    
         
             
                        result << [
         
     | 
| 
       179 
     | 
    
         
            -
                          os2. 
     | 
| 
       180 
     | 
    
         
            -
                          os2. 
     | 
| 
       181 
     | 
    
         
            -
                          os2.y_subscript_y_size, os2.y_subscript_x_offset,
         
     | 
| 
       182 
     | 
    
         
            -
                          os2.y_subscript_y_offset, os2.y_superscript_x_size,
         
     | 
| 
       183 
     | 
    
         
            -
                          os2.y_superscript_y_size, os2.y_superscript_x_offset,
         
     | 
| 
       184 
     | 
    
         
            -
                          os2.y_superscript_y_offset, os2.y_strikeout_size,
         
     | 
| 
       185 
     | 
    
         
            -
                          os2.y_strikeout_position, os2.family_class
         
     | 
| 
      
 330 
     | 
    
         
            +
                          os2.ascent, os2.descent, os2.line_gap,
         
     | 
| 
      
 331 
     | 
    
         
            +
                          os2.win_ascent, os2.win_descent
         
     | 
| 
       186 
332 
     | 
    
         
             
                        ].pack('n*')
         
     | 
| 
       187 
333 
     | 
    
         | 
| 
       188 
     | 
    
         
            -
                        result << os2.panose
         
     | 
| 
       189 
     | 
    
         
            -
             
     | 
| 
       190 
     | 
    
         
            -
                        new_char_range = unicode_blocks_for(os2, os2.char_range, subset)
         
     | 
| 
       191 
334 
     | 
    
         
             
                        result << BinUtils
         
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
       194 
     | 
    
         
            -
             
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
       199 
     | 
    
         
            -
                         
     | 
| 
       200 
     | 
    
         
            -
             
     | 
| 
       201 
     | 
    
         
            -
                        new_cmap_table = subset.new_cmap_table[:charmap]
         
     | 
| 
       202 
     | 
    
         
            -
                        code_points = new_cmap_table
         
     | 
| 
       203 
     | 
    
         
            -
                                      .keys
         
     | 
| 
       204 
     | 
    
         
            -
                                      .select { |k| new_cmap_table[k][:new] > 0 }
         
     | 
| 
       205 
     | 
    
         
            -
                                      .sort
         
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
                        # "This value depends on which character sets the font supports.
         
     | 
| 
       208 
     | 
    
         
            -
                        # This field cannot represent supplementary character values
         
     | 
| 
       209 
     | 
    
         
            -
                        # (codepoints greater than 0xFFFF). Fonts that support
         
     | 
| 
       210 
     | 
    
         
            -
                        # supplementary characters should set the value in this field
         
     | 
| 
       211 
     | 
    
         
            -
                        # to 0xFFFF."
         
     | 
| 
       212 
     | 
    
         
            -
                        first_char_index = [code_points.first || 0, UNICODE_MAX].min
         
     | 
| 
       213 
     | 
    
         
            -
                        last_char_index = [code_points.last || 0, UNICODE_MAX].min
         
     | 
| 
       214 
     | 
    
         
            -
             
     | 
| 
       215 
     | 
    
         
            -
                        result << [
         
     | 
| 
       216 
     | 
    
         
            -
                          os2.selection, first_char_index, last_char_index
         
     | 
| 
       217 
     | 
    
         
            -
                        ].pack('n*')
         
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
       219 
     | 
    
         
            -
                        if os2.version > 0
         
     | 
| 
      
 335 
     | 
    
         
            +
                          .slice_int(
         
     | 
| 
      
 336 
     | 
    
         
            +
                            code_pages_for(subset).value,
         
     | 
| 
      
 337 
     | 
    
         
            +
                            bit_width: 32,
         
     | 
| 
      
 338 
     | 
    
         
            +
                            slice_count: 2
         
     | 
| 
      
 339 
     | 
    
         
            +
                          )
         
     | 
| 
      
 340 
     | 
    
         
            +
                          .pack('N*')
         
     | 
| 
      
 341 
     | 
    
         
            +
             
     | 
| 
      
 342 
     | 
    
         
            +
                        if os2.version > 1
         
     | 
| 
       220 
343 
     | 
    
         
             
                          result << [
         
     | 
| 
       221 
     | 
    
         
            -
                            os2. 
     | 
| 
       222 
     | 
    
         
            -
                            os2. 
     | 
| 
      
 344 
     | 
    
         
            +
                            os2.x_height, os2.cap_height, os2.default_char,
         
     | 
| 
      
 345 
     | 
    
         
            +
                            os2.break_char, os2.max_context
         
     | 
| 
       223 
346 
     | 
    
         
             
                          ].pack('n*')
         
     | 
| 
       224 
     | 
    
         
            -
             
     | 
| 
       225 
     | 
    
         
            -
                          result << BinUtils
         
     | 
| 
       226 
     | 
    
         
            -
                                    .slice_int(
         
     | 
| 
       227 
     | 
    
         
            -
                                      code_pages_for(subset).value,
         
     | 
| 
       228 
     | 
    
         
            -
                                      bit_width: 32,
         
     | 
| 
       229 
     | 
    
         
            -
                                      slice_count: 2
         
     | 
| 
       230 
     | 
    
         
            -
                                    )
         
     | 
| 
       231 
     | 
    
         
            -
                                    .pack('N*')
         
     | 
| 
       232 
     | 
    
         
            -
             
     | 
| 
       233 
     | 
    
         
            -
                          if os2.version > 1
         
     | 
| 
       234 
     | 
    
         
            -
                            result << [
         
     | 
| 
       235 
     | 
    
         
            -
                              os2.x_height, os2.cap_height, os2.default_char,
         
     | 
| 
       236 
     | 
    
         
            -
                              os2.break_char, os2.max_context
         
     | 
| 
       237 
     | 
    
         
            -
                            ].pack('n*')
         
     | 
| 
       238 
     | 
    
         
            -
                          end
         
     | 
| 
       239 
347 
     | 
    
         
             
                        end
         
     | 
| 
       240 
348 
     | 
    
         
             
                      end
         
     | 
| 
      
 349 
     | 
    
         
            +
             
     | 
| 
      
 350 
     | 
    
         
            +
                      result
         
     | 
| 
       241 
351 
     | 
    
         
             
                    end
         
     | 
| 
       242 
352 
     | 
    
         | 
| 
       243 
353 
     | 
    
         
             
                    private
         
     | 
| 
         @@ -298,11 +408,11 @@ module TTFunk 
     | 
|
| 
       298 
408 
     | 
    
         
             
                      subset.new_to_old_glyph.each do |_, old_gid|
         
     | 
| 
       299 
409 
     | 
    
         
             
                        if (metric = os2.file.horizontal_metrics.for(old_gid))
         
     | 
| 
       300 
410 
     | 
    
         
             
                          total_width += metric.advance_width
         
     | 
| 
       301 
     | 
    
         
            -
                          num_glyphs += 1 if metric.advance_width 
     | 
| 
      
 411 
     | 
    
         
            +
                          num_glyphs += 1 if metric.advance_width.positive?
         
     | 
| 
       302 
412 
     | 
    
         
             
                        end
         
     | 
| 
       303 
413 
     | 
    
         
             
                      end
         
     | 
| 
       304 
414 
     | 
    
         | 
| 
       305 
     | 
    
         
            -
                      return 0 if num_glyphs 
     | 
| 
      
 415 
     | 
    
         
            +
                      return 0 if num_glyphs.zero?
         
     | 
| 
       306 
416 
     | 
    
         | 
| 
       307 
417 
     | 
    
         
             
                      total_width / num_glyphs # this should be a whole number
         
     | 
| 
       308 
418 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -352,7 +462,7 @@ module TTFunk 
     | 
|
| 
       352 
462 
     | 
    
         
             
                        end
         
     | 
| 
       353 
463 
     | 
    
         
             
                      end
         
     | 
| 
       354 
464 
     | 
    
         | 
| 
       355 
     | 
    
         
            -
                      return 0 if num_glyphs 
     | 
| 
      
 465 
     | 
    
         
            +
                      return 0 if num_glyphs.zero?
         
     | 
| 
       356 
466 
     | 
    
         | 
| 
       357 
467 
     | 
    
         
             
                      total_width / num_glyphs # this should be a whole number
         
     | 
| 
       358 
468 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -378,7 +488,7 @@ module TTFunk 
     | 
|
| 
       378 
488 
     | 
    
         
             
                    @vendor_id = io.read(4)
         
     | 
| 
       379 
489 
     | 
    
         
             
                    @selection, @first_char_index, @last_char_index = read(6, 'n*')
         
     | 
| 
       380 
490 
     | 
    
         | 
| 
       381 
     | 
    
         
            -
                    if @version 
     | 
| 
      
 491 
     | 
    
         
            +
                    if @version.positive?
         
     | 
| 
       382 
492 
     | 
    
         
             
                      @ascent, @descent, @line_gap = read_signed(3)
         
     | 
| 
       383 
493 
     | 
    
         
             
                      @win_ascent, @win_descent = read(4, 'nn')
         
     | 
| 
       384 
494 
     | 
    
         
             
                      @code_page_range = BitField.new(
         
     |