# -*- encoding: utf-8; frozen_string_literal: true -*- # #-- # This file is part of HexaPDF. # # HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby # Copyright (C) 2014-2020 Thomas Leitner # # HexaPDF is free software: you can redistribute it and/or modify it # under the terms of the GNU Affero General Public License version 3 as # published by the Free Software Foundation with the addition of the # following permission added to Section 15 as permitted in Section 7(a): # FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY # THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON # INFRINGEMENT OF THIRD PARTY RIGHTS. # # HexaPDF is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public # License for more details. # # You should have received a copy of the GNU Affero General Public License # along with HexaPDF. If not, see . # # The interactive user interfaces in modified source and object code # versions of HexaPDF must display Appropriate Legal Notices, as required # under Section 5 of the GNU Affero General Public License version 3. # # In accordance with Section 7(b) of the GNU Affero General Public # License, a covered work must retain the producer line in every PDF that # is created or manipulated using HexaPDF. # # If the GNU Affero General Public License doesn't fit your need, # commercial licenses are available at . #++ require 'hexapdf/font/true_type/table' require 'hexapdf/utils/bit_field' module HexaPDF module Font module TrueType class Table # The 'OS/2' table contains information required by Windows. # # Some attributes may be +nil+ when read from a file depending on the version of the table. # # See: https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6OS2.html class OS2 < Table extend HexaPDF::Utils::BitField # The version of the table. attr_accessor :version # AVerage weighted advance width of lower case letters and space. attr_accessor :x_avg_char_width # Visual weight of stroke in glyphs. attr_accessor :weight_class # Relative change from the normal aspect ratio (width/height). attr_accessor :width_class # Characteristics and properties of this font. attr_accessor :type bit_field(:type, {restricted_license_embedding: 1, preview_and_print_embedding: 2, editable_embedding: 3, no_subsetting: 8, bitmap_embedding_only: 9}) # Recommended horizontal size in pixels for subscripts attr_accessor :subscript_x_size # Recommended vertical size in pixels for subscripts attr_accessor :subscript_y_size # Recommended horizontal offset for subscripts. attr_accessor :subscript_x_offset # Recommended vertical offset from the baseline for subscripts. attr_accessor :subscript_y_offset # Recommended horizontal size in pixels for superscripts attr_accessor :superscript_x_size # Recommended vertical size in pixels for superscripts attr_accessor :superscript_y_size # Recommended horizontal offset for superscripts. attr_accessor :superscript_x_offset # Recommended vertical offset from the baseline for superscripts. attr_accessor :superscript_y_offset # Width of the strikeout stroke. attr_accessor :strikeout_size # Position of the strikeout stroke relative to the baseline. attr_accessor :strikeout_position # Classification of the font-family design. attr_accessor :family_class # Describes the visual characteristics of the given typeface. attr_accessor :panose # Describes the Unicode ranges covered by the font. attr_accessor :unicode_range # The four character identifier of the font vendor. attr_accessor :vendor_id # Information concerning the nature of the font patterns. attr_accessor :selection bit_field(:selection, {italic: 0, underscore: 1, negative: 2, outlined: 3, strikeout: 4, bold: 5, regular: 6, use_typo_metrics: 7, wws: 8, oblique: 9}) # The minimum Unicode index in this font. attr_accessor :first_char_index # The maximum Unicode index in this font. attr_accessor :last_char_index # The typographic ascender. May not be the same as the ascender in the 'hhea' table. attr_accessor :typo_ascender # The typographic descender. May not be the same as the ascender in the 'hhea' table. attr_accessor :typo_descender # The typographic line gap. May not be the same as the ascender in the 'hhea' table. attr_accessor :typo_line_gap # The ascender metric for Windows. attr_accessor :win_ascent # The descender metric for Windows. attr_accessor :win_descent # The code page character range. attr_accessor :code_page_range # The distance between the baseline and the approximate height of non-ascending lowercase # letters. attr_accessor :x_height # The distance between the baseline and the approximate height of uppercase letters. attr_accessor :cap_height # The default character displayed by Windows to represent an unsupported character. attr_accessor :default_char # The break character used by Windows. attr_accessor :break_char # The maximum length of an OpenType context for any feature in this font. attr_accessor :max_context # The lowest size at which the font starts to be used. attr_accessor :lower_point_size # The highest size at which the font starts to be used. attr_accessor :upper_point_size private def parse_table #:nodoc: @version, @x_avg_char_width, @weight_class, @width_class, @type, @subscript_x_size, @subscript_y_size, @subscript_x_offset, @subscript_y_offset, @superscript_x_size, @superscript_y_size, @superscript_x_offset, @superscript_y_offset, @strikeout_size, @strikeout_position, @family_class, @panose = read_formatted(42, 'ns>n2s>12a10') @weight_class *= 100 if @weight_class < 100 # Normalize to standard weights @unicode_range, temp = read_formatted(16, 'Q>2') @unicode_range = @unicode_range << 64 & temp @vendor_id, @selection, @first_char_index, @last_char_index, @typo_ascender, @typo_descender, @typo_line_gap, @win_ascent, @win_descent, @code_page_range, @x_height, @cap_height, @default_char, @break_char, @max_context, @lower_point_size, @upper_point_size = read_formatted(directory_entry.length - 58, 'a4n3s>3n2Q>s>2n5') end end end end end end