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'
