130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/* 230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc. All Rights Reserved. 330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Licensed under the Apache License, Version 2.0 (the "License"); 530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * you may not use this file except in compliance with the License. 630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * You may obtain a copy of the License at 730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * http://www.apache.org/licenses/LICENSE-2.0 930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * 1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Unless required by applicable law or agreed to in writing, software 1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * distributed under the License is distributed on an "AS IS" BASIS, 1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * See the License for the specific language governing permissions and 1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * limitations under the License. 1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */ 1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifndef SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_LOCA_TABLE_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_LOCA_TABLE_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/java_iterator.h" 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table.h" 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/core/font_header_table.h" 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// A Loca table - 'loca'. 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass LocaTable : public Table, public RefCounted<LocaTable> { 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class LocaIterator : public PODIterator<int32_t, LocaTable> { 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun explicit LocaIterator(LocaTable* table); 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~LocaIterator() {} 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool HasNext(); 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t Next(); 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t index_; 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class Builder : public Table::Builder, public RefCounted<Builder> { 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Constructor scope altered to public for base class to instantiate. 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, WritableFontData* data); 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Builder(Header* header, ReadableFontData* data); 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Builder(); 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* CreateBuilder(Header* header, 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* data); 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the format version that will be used when the loca table is 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // generated. 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the loca table format version 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t format_version() { return format_version_; } 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void set_format_version(int32_t value) { format_version_ = value; } 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the List of locas for loca table builder. These may be manipulated 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // in any way by the caller and the changes will be reflected in the final 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // loca table produced as long as no subsequent call is made to the 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // SetLocaList(List) method. 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // If there is no current data for the loca table builder or the loca list 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // have not been previously set then this will return an empty List. 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList* LocaList(); 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Set the list of locas to be used for building this table. If any existing 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // list was already retrieved with the LocaList() method then the 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // connection of that previous list to this builder will be broken. 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetLocaList(IntegerList* list); 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Return the offset for the given glyph id. Valid glyph ids are from 0 to 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // one less than the number of glyphs. The zero entry is the special entry 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // for the notdef glyph. The final entry beyond the last glyph id is used to 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // calculate the size of the last glyph. 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param glyphId the glyph id to get the offset for; must be less than or 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // equal to one more than the number of glyph ids 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the offset in the glyph table to the specified glyph id 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphOffset(int32_t glyph_id); 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the length of the data in the glyph table for the specified glyph id. 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphLength(int32_t glyph_id); 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Set the number of glyphs. 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // This method sets the number of glyphs that the builder will attempt to 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // parse location data for from the raw binary data. This method only needs 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // to be called (and <b>must</b> be) when the raw data for this builder has 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // been changed. It does not by itself reset the data or clear any set loca 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // list. 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetNumGlyphs(int32_t num_glyphs); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the number of glyphs that this builder has support for. 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int NumGlyphs(); 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Revert the loca table builder to the state contained in the last raw data 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // set on the builder. That raw data may be that read from a font file when 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the font builder was created, that set by a user of the loca table 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // builder, or null data if this builder was created as a new empty builder. 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Revert(); 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the number of locations or locas. This will be one more than the 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // number of glyphs for this table since the last loca position is used to 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // indicate the size of the final glyph. 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t NumLocas(); 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the value from the loca table for the index specified. These are the 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // raw values from the table that are used to compute the offset and size of 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // a glyph in the glyph table. Valid index values run from 0 to the number 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // of glyphs in the font. 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t Loca(int32_t index); 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual CALLER_ATTACH FontDataTable* SubBuildTable(ReadableFontData* data); 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void SubDataSet(); 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t SubDataSizeToSerialize(); 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual bool SubReadyToSerialize(); 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t SubSerialize(WritableFontData* new_data); 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Initialize the internal state from the data. Done lazily since in many 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // cases the builder will be just creating a table object with no parsing 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // required. 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param data the data to initialize from 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Initialize(ReadableFontData* data); 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Checks that the glyph id is within the correct range. 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return glyph_id if correct, -1 otherwise. 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t CheckGlyphRange(int32_t glyph_id); 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t LastGlyphIndex(); 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Internal method to get the loca list if already generated and if not to 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // initialize the state of the builder. 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the loca list 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList* GetLocaList(); 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ClearLoca(bool nullify); 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t format_version_; // Note: IndexToLocFormat 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs_; 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList loca_; 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~LocaTable(); 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t format_version() { return format_version_; } 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs() { return num_glyphs_; } 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Return the offset for the given glyph id. Valid glyph ids are from 0 to the 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // one less than the number of glyphs. The zero entry is the special entry for 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the notdef glyph. The final entry beyond the last glyph id is used to 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // calculate the size of the last glyph. 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param glyphId the glyph id to get the offset for; must be less than or 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // equal to one more than the number of glyph ids 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the offset in the glyph table to the specified glyph id 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphOffset(int32_t glyph_id); 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the length of the data in the glyph table for the specified glyph id. 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t GlyphLength(int32_t glyph_id); 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the number of locations or locas. This will be one more than the number 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // of glyphs for this table since the last loca position is used to indicate 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the size of the final glyph. 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t NumLocas(); 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the value from the loca table for the index specified. Valid index 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // values run from 0 to the number of glyphs in the font. 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t Loca(int32_t index); 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun LocaTable(Header* header, 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* data, 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t format_version, 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs); 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t format_version_; // Note: Java's version, renamed to format_version_ 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_glyphs_; 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun friend class LocaIterator; 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<LocaTable> LocaTablePtr; 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<LocaTable::Builder> LocaTableBuilderPtr; 18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_TABLE_TRUETYPE_LOCA_TABLE_H_ 184