Class: Fontisan::Collection::Writer
- Inherits:
-
Object
- Object
- Fontisan::Collection::Writer
- Defined in:
- lib/fontisan/collection/writer.rb
Overview
CollectionWriter writes binary TTC/OTC files
Single responsibility: Write complete TTC/OTC binary structure to disk including header, offset table, font directories, and table data. Handles checksums and proper binary formatting.
Constant Summary collapse
- TTC_TAG =
TTC signature
"ttcf"- VERSION_1_0_MAJOR =
TTC version 1.0 (major=1, minor=0)
1- VERSION_1_0_MINOR =
0
Instance Method Summary collapse
-
#initialize(fonts, sharing_map, offsets, format: :ttc) ⇒ Writer
constructor
Initialize writer.
-
#write_collection ⇒ String
Write collection to binary string.
-
#write_to_file(path) ⇒ Integer
Write collection to file.
Constructor Details
#initialize(fonts, sharing_map, offsets, format: :ttc) ⇒ Writer
Initialize writer
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'lib/fontisan/collection/writer.rb', line 29 def initialize(fonts, sharing_map, offsets, format: :ttc) if fonts.nil? || fonts.empty? raise ArgumentError, "fonts cannot be nil or empty" end raise ArgumentError, "sharing_map cannot be nil" if sharing_map.nil? raise ArgumentError, "offsets cannot be nil" if offsets.nil? raise ArgumentError, "format must be :ttc or :otc" unless %i[ttc otc].include?(format) @fonts = fonts @sharing_map = sharing_map @offsets = offsets @format = format end |
Instance Method Details
#write_collection ⇒ String
Write collection to binary string
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/fontisan/collection/writer.rb', line 58 def write_collection binary = String.new(encoding: Encoding::BINARY) # Write TTC header binary << write_ttc_header # Write offset table (offsets to each font's directory) binary << write_offset_table # Write each font's table directory @fonts.each_with_index do |font, font_index| # Pad to expected offset pad_to_offset(binary, @offsets[:font_directory_offsets][font_index]) # Write font directory binary << write_font_directory(font, font_index) end # Write table data (shared tables first, then unique tables) write_table_data(binary) binary end |
#write_to_file(path) ⇒ Integer
Write collection to file
49 50 51 52 53 |
# File 'lib/fontisan/collection/writer.rb', line 49 def write_to_file(path) binary = write_collection File.binwrite(path, binary) binary.bytesize end |