File: post.rb

package info (click to toggle)
ruby-ttfunk 1.0.3%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 916 kB
  • sloc: ruby: 1,719; makefile: 16
file content (91 lines) | stat: -rw-r--r-- 2,306 bytes parent folder | download
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'