1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 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
|
require 'ttfunk/table'
module TTFunk
class Table
class Post < Table
attr_reader :format
attr_reader :italic_angle
attr_reader :underline_position
attr_reader :underline_thickness
attr_reader :fixed_pitch
attr_reader :min_mem_type42
attr_reader :max_mem_type42
attr_reader :min_mem_type1
attr_reader :max_mem_type1
attr_reader :subtable
def self.encode(post, mapping)
return nil unless post.exists?
post.recode(mapping)
end
def fixed_pitch?
@fixed_pitch != 0
end
def glyph_for(code)
".notdef"
end
def recode(mapping)
return raw if format == 0x00030000
table = raw[0,32]
table[0,4] = [0x00020000].pack("N")
index = []
strings = []
mapping.keys.sort.each do |new_id|
post_glyph = glyph_for(mapping[new_id])
position = Format10::POSTSCRIPT_GLYPHS.index(post_glyph)
if position
index << position
else
index << 257 + strings.length
strings << post_glyph
end
end
table << [mapping.length, *index].pack("n*")
strings.each do |string|
table << [string.length, string].pack("CA*")
end
return table
end
private
def parse!
@format, @italic_angle, @underline_position, @underline_thickness,
@fixed_pitch, @min_mem_type42, @max_mem_type42,
@min_mem_type1, @max_mem_type1 = read(32, "N2n2N*")
end_of_table = offset + length
@subtable = case @format
when 0x00010000 then extend(Post::Format10)
when 0x00020000 then extend(Post::Format20)
when 0x00025000 then extend(Post::Format25)
when 0x00030000 then extend(Post::Format30)
when 0x00040000 then extend(Post::Format40)
end
parse_format!
end
def parse_format!
warn "postscript table format 0x%08X is not supported" % @format
end
end
end
end
require 'ttfunk/table/post/format10'
require 'ttfunk/table/post/format20'
require 'ttfunk/table/post/format25'
require 'ttfunk/table/post/format30'
require 'ttfunk/table/post/format40'
|