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