100b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com// Copyright (c) 2011 The Chromium Authors. All rights reserved.
200b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com// Use of this source code is governed by a BSD-style license that can be
300b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com// found in the LICENSE file.
400b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
500b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com#ifndef OTS_LAYOUT_H_
600b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com#define OTS_LAYOUT_H_
700b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
800b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com#include "ots.h"
900b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
1000b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com// Utility functions for OpenType layout common table formats.
1100b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com// http://www.microsoft.com/typography/otspec/chapter2.htm
1200b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
1300b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.comnamespace ots {
1400b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
15ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org
16ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.orgstruct LookupSubtableParser {
17ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  struct TypeParser {
18ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org    uint16_t type;
19ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org    bool (*parse)(const OpenTypeFile *file, const uint8_t *data,
20ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                  const size_t length);
21ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  };
22ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  size_t num_types;
23ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  uint16_t extension_type;
24ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  const TypeParser *parsers;
25ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org
26ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org  bool Parse(const OpenTypeFile *file, const uint8_t *data,
27ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org             const size_t length, const uint16_t lookup_type) const;
2878a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com};
2978a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com
3078a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.combool ParseScriptListTable(const uint8_t *data, const size_t length,
3178a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com                          const uint16_t num_features);
3278a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com
3378a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.combool ParseFeatureListTable(const uint8_t *data, const size_t length,
3478a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com                           const uint16_t num_lookups,
35a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org                           uint16_t *num_features);
3678a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com
3778a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.combool ParseLookupListTable(OpenTypeFile *file, const uint8_t *data,
38ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                          const size_t length,
39ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                          const LookupSubtableParser* parser,
40ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                          uint16_t* num_lookups);
4178a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com
4200b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.combool ParseClassDefTable(const uint8_t *data, size_t length,
4300b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com                        const uint16_t num_glyphs,
4400b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com                        const uint16_t num_classes);
4500b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
4600b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.combool ParseCoverageTable(const uint8_t *data, size_t length,
4700b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com                        const uint16_t num_glyphs);
4800b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
4978a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.combool ParseDeviceTable(const uint8_t *data, size_t length);
5078a8baafff49244c7f9427ad72115ff1ad28e310bashi@google.com
51ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org// Parser for 'Contextual' subtable shared by GSUB/GPOS tables.
52ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.orgbool ParseContextSubtable(const uint8_t *data, const size_t length,
53ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                          const uint16_t num_glyphs,
54ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                          const uint16_t num_lookups);
55ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org
56ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org// Parser for 'Chaining Contextual' subtable shared by GSUB/GPOS tables.
57ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.orgbool ParseChainingContextSubtable(const uint8_t *data, const size_t length,
58ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                                  const uint16_t num_glyphs,
59ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                                  const uint16_t num_lookups);
60ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org
61ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.orgbool ParseExtensionSubtable(const OpenTypeFile *file,
62ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                            const uint8_t *data, const size_t length,
63ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org                            const LookupSubtableParser* parser);
64ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org
6500b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com}  // namespace ots
6600b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
6700b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com#endif  // OTS_LAYOUT_H_
6800b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com
69