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