// Copyright (c) 2011-2017 The OTS 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_GDEF_H_
#define OTS_GDEF_H_

#include "ots.h"

namespace ots {

class OpenTypeGDEF : public Table {
 public:
  explicit OpenTypeGDEF(Font *font, uint32_t tag)
      : Table(font, tag, tag),
        num_mark_glyph_sets(0),
        m_data(NULL),
        m_length(0),
        m_num_glyphs(0) {
  }

  bool Parse(const uint8_t *data, size_t length);
  bool Serialize(OTSStream *out);

  uint16_t num_mark_glyph_sets;

 private:
  bool ParseAttachListTable(const uint8_t *data, size_t length);
  bool ParseLigCaretListTable(const uint8_t *data, size_t length);
  bool ParseMarkGlyphSetsDefTable(const uint8_t *data, size_t length);

  const uint8_t *m_data;
  size_t m_length;
  uint16_t m_num_glyphs;
};

}  // namespace ots

#endif

