class TTFunk::Table::Cff::TopDict
Constants
- DEFAULT_CHARSTRING_TYPE
- OPERATORS
-
all the operators we currently care about
- OPERATOR_CODES
- PLACEHOLDER_LENGTH
- POINTER_OPERATORS
-
operators whose values are offsets that point to other parts of the file
- POINTER_PLACEHOLDER_LENGTH
Public Instance Methods
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 191 def cff_offset cff.offset end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 119 def charset @charset ||= if (charset_offset_or_id = self[OPERATORS[:charset]]) if charset_offset_or_id.empty? Charset.new(self, file) else Charset.new(self, file, charset_offset_or_id.first) end end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 157 def charstring_type @charstring_type = self[OPERATORS[:charstring_type]] || DEFAULT_CHARSTRING_TYPE end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 148 def charstrings_index @charstrings_index ||= if (charstrings_offset = self[OPERATORS[:charstrings_index]]) CharstringsIndex.new( self, file, cff_offset + charstrings_offset.first ) end end
www.microsoft.com/typography/otspec/cff.htm
“OpenType fonts with TrueType outlines use a glyph index to specify and access glyphs within a font; e.g., to index within the ‘loca’ table and thereby access glyph data in the ‘glyf’ table. This concept is retained in OpenType CFF fonts, except that glyph data is accessed through the CharStrings INDEX of the CFF table.”
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 31 def encode(*) EncodedString.new do |result| each_with_index do |(operator, operands), _idx| if operator == OPERATORS[:private] result << encode_private elsif pointer_operator?(operator) result << Placeholder.new( OPERATOR_CODES[operator], length: POINTER_PLACEHOLDER_LENGTH ) else operands.each { |operand| result << encode_operand(operand) } end result << encode_operator(operator) end end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 130 def encoding @encoding ||= begin # PostScript type 1 fonts, i.e. CID fonts, i.e. some fonts that use # the CFF table, don't specify an encoding, so this can be nil if (encoding_offset_or_id = self[OPERATORS[:encoding]]) Encoding.new(self, file, encoding_offset_or_id.first) end end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 50 def finalize(new_cff_data, new_to_old, old_to_new) if charset finalize_subtable( new_cff_data, :charset, charset.encode(new_to_old) ) end if encoding finalize_subtable( new_cff_data, :encoding, encoding.encode(new_to_old, old_to_new) ) end if charstrings_index finalize_subtable( new_cff_data, :charstrings_index, charstrings_index.encode(new_to_old, &:encode) ) end if font_index finalize_subtable( new_cff_data, :font_index, font_index.encode do |font_dict| font_dict.encode(new_to_old) end ) font_index.finalize(new_cff_data, new_to_old) end if font_dict_selector finalize_subtable( new_cff_data, :font_dict_selector, font_dict_selector.encode(new_to_old) ) end if private_dict encoded_private_dict = private_dict.encode(new_to_old) encoded_offset = encode_integer32(new_cff_data.length) encoded_length = encode_integer32(encoded_private_dict.length) new_cff_data.resolve_placeholder( :"private_length_#{@table_offset}", encoded_length ) new_cff_data.resolve_placeholder( :"private_offset_#{@table_offset}", encoded_offset ) private_dict.finalize(encoded_private_dict) new_cff_data << encoded_private_dict end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 169 def font_dict_selector @font_dict_selector ||= if (fd_select_offset = self[OPERATORS[:font_dict_selector]]) FdSelector.new(self, file, cff_offset + fd_select_offset.first) end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 162 def font_index @font_index ||= if (font_index_offset = self[OPERATORS[:font_index]]) FontIndex.new(self, file, cff_offset + font_index_offset.first) end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 176 def private_dict @private_dict ||= if (info = self[OPERATORS[:private]]) private_dict_length, private_dict_offset = info PrivateDict.new( file, cff_offset + private_dict_offset, private_dict_length ) end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 113 def ros? !ros.nil? end
Also aliased as: is_cid_font?
Private Instance Methods
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 221 def encode_charstring_type(charstring_type) if charstring_type == DEFAULT_CHARSTRING_TYPE '' else encode_operand(charstring_type) end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 197 def encode_private EncodedString.new do |result| result << Placeholder.new( :"private_length_#{@table_offset}", length: PLACEHOLDER_LENGTH ) result << Placeholder.new( :"private_offset_#{@table_offset}", length: PLACEHOLDER_LENGTH ) end end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 211 def finalize_subtable(new_cff_data, name, table_data) encoded = encode_integer32(new_cff_data.length) new_cff_data.resolve_placeholder(name, encoded) new_cff_data << table_data end
Source
# File lib/ttfunk/table/cff/top_dict.rb, line 217 def pointer_operator?(operator) POINTER_OPERATORS.include?(OPERATOR_CODES[operator]) end