text: // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef OTS_LAYOUT_H_
  #define OTS_LAYOUT_H_
  
  #include "ots.h"
  
  // Utility functions for OpenType layout common table formats.
  // http://www.microsoft.com/typography/otspec/chapter2.htm
  
  namespace ots {
  
  
  struct LookupSubtableParser {
    struct TypeParser {
      uint16_t type;
      bool (*parse)(const Font *font, const uint8_t *data,
                    const size_t length);
    };
    size_t num_types;
    uint16_t extension_type;
    const TypeParser *parsers;
  
    bool Parse(const Font *font, const uint8_t *data,
               const size_t length, const uint16_t lookup_type) const;
  };
  
  bool ParseScriptListTable(const ots::Font *font,
                            const uint8_t *data, const size_t length,
                            const uint16_t num_features);
  
  bool ParseFeatureListTable(const ots::Font *font,
                             const uint8_t *data, const size_t length,
                             const uint16_t num_lookups,
                             uint16_t *num_features);
  
  bool ParseLookupListTable(Font *font, const uint8_t *data,
                            const size_t length,
                            const LookupSubtableParser* parser,
                            uint16_t* num_lookups);
  
  bool ParseClassDefTable(const ots::Font *font,
                          const uint8_t *data, size_t length,
                          const uint16_t num_glyphs,
                          const uint16_t num_classes);
  
  bool ParseCoverageTable(const ots::Font *font,
                          const uint8_t *data, size_t length,
                          const uint16_t num_glyphs,
                          const uint16_t expected_num_glyphs = 0);
  
  bool ParseDeviceTable(const ots::Font *font,
                        const uint8_t *data, size_t length);
  
  // Parser for 'Contextual' subtable shared by GSUB/GPOS tables.
  bool ParseContextSubtable(const ots::Font *font,
                            const uint8_t *data, const size_t length,
                            const uint16_t num_glyphs,
                            const uint16_t num_lookups);
  
  // Parser for 'Chaining Contextual' subtable shared by GSUB/GPOS tables.
  bool ParseChainingContextSubtable(const ots::Font *font,
                                    const uint8_t *data, const size_t length,
                                    const uint16_t num_glyphs,
                                    const uint16_t num_lookups);
  
  bool ParseExtensionSubtable(const Font *font,
                              const uint8_t *data, const size_t length,
                              const LookupSubtableParser* parser);
  
  }  // namespace ots
  
  #endif  // OTS_LAYOUT_H_
  
  