Module: Fontisan::Ufo::Compile::MathTable

Defined in:
lib/fontisan/ufo/compile/math.rb

Overview

Builds the OpenType MATH table for mathematical formula layout.

The MATH table provides constants and glyph info for rendering equations in math-aware environments (Word, LibreOffice, TeX).

Layout:

Header (10 bytes):
uint16 version (= 1)
Offset32 mathConstantsOffset
Offset32 mathGlyphInfoOffset
Offset32 mathVariantsOffset

MathConstants: 57 layout constants (int16 + bool each)
MathGlyphInfo: italic correction, top accent, extension
MathVariants: glyph assembly for stretched delimiters

Constant Summary collapse

VERSION =
1
HEADER_SIZE =
10

Class Method Summary collapse

Class Method Details

.build(constants: nil, glyph_info: nil, variants: nil) ⇒ String?

Returns MATH table bytes, or nil if no data.

Parameters:

  • constants (Hash, nil) (defaults to: nil)

    math layout constants

  • glyph_info (Hash, nil) (defaults to: nil)

    per-glyph math data

  • variants (Hash, nil) (defaults to: nil)

    stretched delimiter data

Returns:

  • (String, nil)

    MATH table bytes, or nil if no data



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/fontisan/ufo/compile/math.rb', line 31

def self.build(constants: nil, glyph_info: nil, variants: nil)
  return nil unless constants || glyph_info || variants

  constants_bytes = constants ? build_constants(constants) : nil
  glyph_info_bytes = glyph_info ? build_glyph_info(glyph_info) : nil
  variants_bytes = variants ? build_variants(variants) : nil

  constants_off = constants_bytes ? HEADER_SIZE : 0
  gi_off = glyph_info_bytes ? constants_off + (constants_bytes&.bytesize || 0) : 0
  if gi_off.zero? && glyph_info_bytes
    gi_off = HEADER_SIZE + (constants_bytes&.bytesize || 0)
  end
  variants_off = variants_bytes ? gi_off + (glyph_info_bytes&.bytesize || 0) : 0
  if variants_off.zero? && variants_bytes
    variants_off = HEADER_SIZE + (constants_bytes&.bytesize || 0) + (glyph_info_bytes&.bytesize || 0)
  end

  io = +""
  io << [0x00010000, constants_off, gi_off, variants_off].pack("Nnnn")
  io << constants_bytes if constants_bytes
  io << glyph_info_bytes if glyph_info_bytes
  io << variants_bytes if variants_bytes
  io
end