Class: Fontisan::Hints::PostScriptHintExtractor

Inherits:
Object
  • Object
show all
Defined in:
lib/fontisan/hints/postscript_hint_extractor.rb

Overview

Extracts rendering hints from PostScript/CFF CharString data

PostScript Type 1 and CFF fonts embed hints directly in the CharString data as operators. This extractor parses CharString sequences to identify and extract hint operators.

**Supported PostScript Hint Operators:**

  • hstem/vstem - Horizontal/vertical stem hints

  • hstem3/vstem3 - Multiple stem hints

  • hintmask - Hint replacement masks

  • cntrmask - Counter control masks

Examples:

Extract hints from a CharString

extractor = PostScriptHintExtractor.new
hints = extractor.extract(charstring)

Constant Summary collapse

HSTEM =

CFF CharString operators

1
VSTEM =
3
HINTMASK =
19
CNTRMASK =
20
HSTEM3 =
12 << 8 | 2
VSTEM3 =
12 << 8 | 1

Instance Method Summary collapse

Instance Method Details

#extract(charstring) ⇒ Array<Hint>

Extract hints from CFF CharString

Parameters:

  • charstring (CharString, String)

    CFF CharString object or bytes

Returns:

  • (Array<Hint>)

    Extracted hints



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/fontisan/hints/postscript_hint_extractor.rb', line 58

def extract(charstring)
  return [] if charstring.nil?

  # Get CharString bytes
  bytes = if charstring.respond_to?(:data)
            charstring.data
          elsif charstring.respond_to?(:bytes)
            charstring.bytes
          elsif charstring.is_a?(String)
            charstring.bytes
          else
            return []
          end

  return [] if bytes.empty?

  parse_charstring(bytes)
end

#extract_from_font(font) ⇒ Models::HintSet

Extract complete hint data from OpenType/CFF font

This extracts both font-level hints (CFF Private dict) and per-glyph hints from CharStrings.

Parameters:

Returns:



39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/fontisan/hints/postscript_hint_extractor.rb', line 39

def extract_from_font(font)
  hint_set = Models::HintSet.new(format: "postscript")

  # Extract font-level Private dict hints
  hint_set.private_dict_hints = extract_private_dict_hints(font).to_json

  # Extract per-glyph CharString hints
  extract_charstring_hints(font, hint_set)

  # Update metadata
  hint_set.has_hints = !hint_set.empty?

  hint_set
end