This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module TTFunk
|
||||
class Table
|
||||
# Compact Font Format (`CFF `) table
|
||||
class Cff < TTFunk::Table
|
||||
autoload :Charset, 'ttfunk/table/cff/charset'
|
||||
autoload :Charsets, 'ttfunk/table/cff/charsets'
|
||||
autoload :Charstring, 'ttfunk/table/cff/charstring'
|
||||
autoload :CharstringsIndex, 'ttfunk/table/cff/charstrings_index'
|
||||
autoload :Dict, 'ttfunk/table/cff/dict'
|
||||
autoload :Encoding, 'ttfunk/table/cff/encoding'
|
||||
autoload :Encodings, 'ttfunk/table/cff/encodings'
|
||||
autoload :FdSelector, 'ttfunk/table/cff/fd_selector'
|
||||
autoload :FontDict, 'ttfunk/table/cff/font_dict'
|
||||
autoload :FontIndex, 'ttfunk/table/cff/font_index'
|
||||
autoload :Header, 'ttfunk/table/cff/header'
|
||||
autoload :Index, 'ttfunk/table/cff/index'
|
||||
autoload :OneBasedIndex, 'ttfunk/table/cff/one_based_index'
|
||||
autoload :Path, 'ttfunk/table/cff/path'
|
||||
autoload :PrivateDict, 'ttfunk/table/cff/private_dict'
|
||||
autoload :SubrIndex, 'ttfunk/table/cff/subr_index'
|
||||
autoload :TopDict, 'ttfunk/table/cff/top_dict'
|
||||
autoload :TopIndex, 'ttfunk/table/cff/top_index'
|
||||
|
||||
# Table tag. The extra space is important.
|
||||
TAG = 'CFF '
|
||||
|
||||
# Table header.
|
||||
# @return [TTFunk::Table::Cff::Header]
|
||||
attr_reader :header
|
||||
|
||||
# Name index.
|
||||
# @return [TTFunk::Table::Cff::Index]
|
||||
attr_reader :name_index
|
||||
|
||||
# Top dict index.
|
||||
# @return [TTFunk::Table::Cff::TopIndex]
|
||||
attr_reader :top_index
|
||||
|
||||
# Strings index.
|
||||
# @return [TTFunk::Table::Cff::OneBasedIndex]
|
||||
attr_reader :string_index
|
||||
|
||||
# Global subroutine index.
|
||||
# @return [TTFunk::Table::Cff::SubrIndex]
|
||||
attr_reader :global_subr_index
|
||||
|
||||
# Table tag.
|
||||
# @return [String]
|
||||
def tag
|
||||
TAG
|
||||
end
|
||||
|
||||
# Encode table.
|
||||
#
|
||||
# @param subset [TTFunk::Subset::MacRoman, TTFunk::Subset::Windows1252,
|
||||
# TTFunk::Subset::Unicode, TTFunk::Subset::Unicode8Bit]
|
||||
# @return [TTFunk::EncodedString]
|
||||
def encode(subset)
|
||||
# Make sure TopDict has an entry for encoding so it could be properly replaced
|
||||
top_index[0][TopDict::OPERATORS[:encoding]] = 0
|
||||
|
||||
EncodedString.new do |result|
|
||||
result.concat(
|
||||
header.encode,
|
||||
name_index.encode,
|
||||
top_index.encode,
|
||||
string_index.encode,
|
||||
global_subr_index.encode,
|
||||
)
|
||||
|
||||
charmap = subset.new_cmap_table[:charmap]
|
||||
top_index[0].finalize(result, charmap)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def parse!
|
||||
@header = Header.new(file, offset)
|
||||
@name_index = Index.new(file, @header.table_offset + @header.length)
|
||||
@top_index = TopIndex.new(file, @name_index.table_offset + @name_index.length)
|
||||
@string_index = OneBasedIndex.new(file, @top_index.table_offset + @top_index.length)
|
||||
@global_subr_index = SubrIndex.new(file, @string_index.table_offset + @string_index.length)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user