lib/ttfunk/table/sbix.rb in ttfunk-1.7.0 vs lib/ttfunk/table/sbix.rb in ttfunk-1.8.0

- old
+ new

@@ -2,66 +2,102 @@ require_relative '../table' module TTFunk class Table + # Standard Bitmap Graphics (`sbix`) table. class Sbix < Table + # Table version. + # @return [Integer] attr_reader :version + + # Flags. + # @return [Integer] attr_reader :flags + + # Number of bitmap strikes. + # @return [Integer] attr_reader :num_strikes + + # Strikes. + # @return [Array<Hash>] attr_reader :strikes + # Bitmap Data. + # + # @!attribute [rw] x + # The horizontal (x-axis) position of the left edge of the bitmap + # graphic in relation to the glyph design space origin. + # @!attribute [rw] y + # The vertical (y-axis) position of the bottom edge of the bitmap + # graphic in relation to the glyph design space origin. + # @!attribute [rw] type + # Indicates the format of the embedded graphic data: one of `jpg `, + # `png `, `tiff`, or the special format `dupe`. + # @!attribute [rw] data + # The actual embedded graphic data. + # @!attribute [rw] ppem + # The PPEM size for which this strike was designed. + # @!attribute [rw] resolution + # The device pixel density (in PPI) for which this strike was designed. BitmapData = Struct.new(:x, :y, :type, :data, :ppem, :resolution) + # Get bitmap for glyph strike. + # + # @param glyph_id [Integer] + # @param strike_index [Integer] + # @return [BitmapData] def bitmap_data_for(glyph_id, strike_index) strike = strikes[strike_index] return if strike.nil? glyph_offset = strike[:glyph_data_offset][glyph_id] next_glyph_offset = strike[:glyph_data_offset][glyph_id + 1] if glyph_offset && next_glyph_offset bytes = next_glyph_offset - glyph_offset if bytes.positive? - parse_from(offset + strike[:offset] + glyph_offset) do + parse_from(offset + strike[:offset] + glyph_offset) { x, y, type = read(8, 's2A4') data = StringIO.new(io.read(bytes - 8)) - BitmapData.new( - x, y, type, data, strike[:ppem], strike[:resolution] - ) - end + BitmapData.new(x, y, type, data, strike[:ppem], strike[:resolution]) + } end end end + # Get all bitmaps for glyph. + # + # @param glyph_id [Integer] + # @return [Array<BitmapData>] def all_bitmap_data_for(glyph_id) - strikes.each_index.map do |strike_index| + strikes.each_index.filter_map { |strike_index| bitmap_data_for(glyph_id, strike_index) - end.compact + } end private def parse! @version, @flags, @num_strikes = read(8, 'n2N') strike_offsets = Array.new(num_strikes) { read(4, 'N').first } @strikes = - strike_offsets.map do |strike_offset| - parse_from(offset + strike_offset) do + strike_offsets.map { |strike_offset| + parse_from(offset + strike_offset) { ppem, resolution = read(4, 'n2') data_offsets = - Array.new(file.maximum_profile.num_glyphs + 1) do + Array.new(file.maximum_profile.num_glyphs + 1) { read(4, 'N').first - end + } { ppem: ppem, resolution: resolution, offset: strike_offset, - glyph_data_offset: data_offsets + glyph_data_offset: data_offsets, } - end - end + } + } end end end end