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_HEADER_H_
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_TABLE_HEADER_H_
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/refcount.h"
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly {
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass Header : public RefCounted<Header> {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Make a partial header with only the basic info for an empty new table.
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  explicit Header(int32_t tag);
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Make a partial header with only the basic info for a new table.
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Header(int32_t tag, int32_t length);
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Make a full header as read from an existing font.
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  Header(int32_t tag, int64_t checksum, int32_t offset, int32_t length);
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~Header();
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get the table tag.
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t tag() { return tag_; }
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get the table offset. The offset is from the start of the font file.  This
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // offset value is what was read from the font file during construction of the
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // font. It may not be meaningful if the font was maninpulated through the
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // builders.
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t offset() { return offset_; }
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Is the offset in the header valid. The offset will not be valid if the
4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // table was constructed during building and has no physical location in a
4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // font file.
4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool offset_valid() { return offset_valid_; }
4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get the length of the table as recorded in the table record header.  During
5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // building the header length will reflect the length that was initially read
5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // from the font file. This may not be consistent with the current state of
5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // the data.
5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t length() { return length_; }
5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Is the length in the header valid. The length will not be valid if the
5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // table was constructed during building and has no physical location in a
5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // font file until the table is built from the builder.
5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool length_valid() { return length_valid_; }
6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Get the checksum for the table as recorded in the table record header.
6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int64_t checksum() { return checksum_; }
6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Is the checksum valid. The checksum will not be valid if the table was
6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // constructed during building and has no physical location in a font file.
6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // Note that this does *NOT* check the validity of the checksum against
6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // the calculated checksum for the table data.
6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool checksum_valid() { return checksum_valid_; }
6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  // UNIMPLEMENTED: boolean equals(Object obj)
7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  //                int hashCode()
7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  //                string toString()
7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private:
7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t tag_;
7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t offset_;
7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool offset_valid_;
7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int32_t length_;
7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool length_valid_;
8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  int64_t checksum_;
8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  bool checksum_valid_;
8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  friend class HeaderComparatorByOffset;
8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  friend class HeaderComparatorByTag;
8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<Header> HeaderPtr;
8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass HeaderComparator {
8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~HeaderComparator() {}
9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual bool operator()(const HeaderPtr h1,
9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                          const HeaderPtr h2) = 0;
9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass HeaderComparatorByOffset : public HeaderComparator {
9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~HeaderComparatorByOffset() {}
9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual bool operator()(const HeaderPtr h1,
9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                          const HeaderPtr h2);
10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass HeaderComparatorByTag : public HeaderComparator {
10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public:
10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual ~HeaderComparatorByTag() {}
10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun  virtual bool operator()(const HeaderPtr h1,
10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun                          const HeaderPtr h2);
10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun};
10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::set<HeaderPtr, HeaderComparatorByOffset> HeaderOffsetSortedSet;
11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::set<HeaderPtr, HeaderComparatorByTag> HeaderTagSortedSet;
11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}  // namespace sfntly
11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif  // SFNTLY_CPP_SRC_SFNTLY_TABLE_HEADER_H_
115