Class: Fontisan::Optimizers::CharstringRewriter
- Inherits:
-
Object
- Object
- Fontisan::Optimizers::CharstringRewriter
- Defined in:
- lib/fontisan/optimizers/charstring_rewriter.rb
Overview
Rewrites CharStrings by replacing repeated patterns with subroutine calls. Uses position-aware replacement to handle multiple patterns per glyph without offset corruption.
Instance Method Summary collapse
-
#initialize(subroutine_map, builder) ⇒ CharstringRewriter
constructor
Initialize rewriter with subroutine map and builder.
-
#rewrite(charstring, patterns) ⇒ String
Rewrite a CharString by replacing patterns with subroutine calls Sorts patterns by position (descending) to avoid offset issues when replacing multiple patterns in the same CharString.
-
#validate(charstring) ⇒ Boolean
Validate rewritten CharString for structural correctness For now, performs basic validation.
Constructor Details
#initialize(subroutine_map, builder) ⇒ CharstringRewriter
Initialize rewriter with subroutine map and builder
22 23 24 25 |
# File 'lib/fontisan/optimizers/charstring_rewriter.rb', line 22 def initialize(subroutine_map, builder) @subroutine_map = subroutine_map @builder = builder end |
Instance Method Details
#rewrite(charstring, patterns) ⇒ String
Rewrite a CharString by replacing patterns with subroutine calls Sorts patterns by position (descending) to avoid offset issues when replacing multiple patterns in the same CharString.
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 |
# File 'lib/fontisan/optimizers/charstring_rewriter.rb', line 34 def rewrite(charstring, patterns) return charstring if patterns.empty? # Build list of all replacements: [position, pattern] replacements = build_replacement_list(charstring, patterns) # Remove overlapping replacements replacements = remove_overlaps(replacements) # Sort by position (descending) to avoid offset corruption replacements.sort_by! { |pos, _pattern| -pos } # Apply each replacement rewritten = charstring.dup replacements.each do |position, pattern| subroutine_id = @subroutine_map[pattern.bytes] next if subroutine_id.nil? call = @builder.create_call(subroutine_id) # Replace pattern with call at position rewritten[position, pattern.length] = call end rewritten end |
#validate(charstring) ⇒ Boolean
Validate rewritten CharString for structural correctness For now, performs basic validation. Future: full CFF parsing.
66 67 68 69 70 71 72 73 74 75 |
# File 'lib/fontisan/optimizers/charstring_rewriter.rb', line 66 def validate(charstring) return false if charstring.nil? || charstring.empty? # Basic validation: check for return operator at end # and reasonable length return false if charstring.empty? # More comprehensive validation can be added later true end |