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_TAG_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TAG_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <cstddef>
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h"
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Font identification tags used for tables, features, etc.
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Tag names are consistent with the OpenType and sfnt specs.
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct Tag {
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t ttcf;
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Table Type Tags
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // required tables
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t cmap;
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t head;
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t hhea;
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t hmtx;
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t maxp;
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t name;
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t OS_2;
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t post;
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // TrueType outline tables
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t cvt;
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t fpgm;
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t glyf;
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t loca;
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t prep;
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // PostScript outline tables
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t CFF;
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t VORG;
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // opentype bitmap glyph outlines
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t EBDT;
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t EBLC;
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t EBSC;
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // advanced typographic features
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t BASE;
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t GDEF;
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t GPOS;
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t GSUB;
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t JSTF;
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // other
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t DSIG;
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t gasp;
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t hdmx;
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t kern;
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t LTSH;
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t PCLT;
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t VDMX;
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t vhea;
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t vmtx;
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // AAT tables
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t bsln;
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t feat;
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t lcar;
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t morx;
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t opbd;
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t prop;
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Graphite tables
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t Feat;
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t Glat;
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t Gloc;
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t Sile;
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t Silf;
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // truetype bitmap font tables
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t bhed;
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t bdat;
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  static const int32_t bloc;
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Create integer tag value for human readable tag name.
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline int32_t GenerateTag(int32_t a, int32_t b, int32_t c, int32_t d) {
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return (a << 24) | (b << 16) | (c << 8) | d;
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Translate tag to human readable string.
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// The Caller must delete[] the returned value.
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruninline char* TagToString(int32_t tag) {
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  char *name = new char[5];
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  name[0] = static_cast<char>((tag & 0xff000000) >> 24);
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  name[1] = static_cast<char>((tag & 0x00ff0000) >> 16);
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  name[2] = static_cast<char>((tag & 0x0000ff00) >> 8);
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  name[3] = static_cast<char>(tag & 0x000000ff);
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  name[4] = 0;
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  return name;
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Note: For Java, these two orderings are in Font class.  Moved here to avoid
11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun//       VC++ bug of not populating correct values.
11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern const int32_t CFF_TABLE_ORDERING[];
11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern const size_t CFF_TABLE_ORDERING_SIZE;
11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern const int32_t TRUE_TYPE_TABLE_ORDERING[];
11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunextern const size_t TRUE_TYPE_TABLE_ORDERING_SIZE;
12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_TAG_H_
124