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_FONT_FACTORY_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_FONT_FACTORY_H_ 1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include <vector> 2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/refcount.h" 2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/port/type.h" 2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/font.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass FontFactory : public RefCounted<FontFactory> { 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~FontFactory(); 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Factory method for the construction of a font factory. 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH FontFactory* GetInstance(); 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash. 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // If a font is fingerprinted then a SHA-1 hash is generated at load time and 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // stored in the font. This is useful for uniquely identifying fonts. By 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // default this is turned on. 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param fingerprint whether fingerprinting should be turned on or off 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void FingerprintFont(bool fingerprint); 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool FingerprintFont(); 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Load the font(s) from the input stream. The current settings on the factory 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // are used during the loading process. One or more fonts are returned if the 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // stream contains valid font data. Some font container formats may have more 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // than one font and in this case multiple font objects will be returned. If 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the data in the stream cannot be parsed or is invalid an array of size zero 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // will be returned. 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadFonts(InputStream* is, FontArray* output); 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // ByteArray font loading 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Load the font(s) from the byte array. The current settings on the factory 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // are used during the loading process. One or more fonts are returned if the 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // stream contains valid font data. Some font container formats may have more 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // than one font and in this case multiple font objects will be returned. If 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the data in the stream cannot be parsed or is invalid an array of size zero 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // will be returned. 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadFonts(ByteVector* b, FontArray* output); 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Load the font(s) from the input stream into font builders. The current 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // settings on the factory are used during the loading process. One or more 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font builders are returned if the stream contains valid font data. Some 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font container formats may have more than one font and in this case 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // multiple font builder objects will be returned. If the data in the stream 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // cannot be parsed or is invalid an array of size zero will be returned. 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadFontsForBuilding(InputStream* is, FontBuilderArray* output); 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Load the font(s) from the byte array into font builders. The current 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // settings on the factory are used during the loading process. One or more 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font builders are returned if the stream contains valid font data. Some 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // font container formats may have more than one font and in this case 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // multiple font builder objects will be returned. If the data in the stream 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // cannot be parsed or is invalid an array of size zero will be returned. 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadFontsForBuilding(ByteVector* b, FontBuilderArray* output); 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Font serialization 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Serialize the font to the output stream. 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // NOTE: in this port we attempted not to implement I/O stream because dealing 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // with cross-platform I/O stream itself is big enough as a project. 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Byte buffer it is. 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SerializeFont(Font* font, OutputStream* os); 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Set the table ordering to be used in serializing a font. The table ordering 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // is an ordered list of table ids and tables will be serialized in the order 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // given. Any tables whose id is not listed in the ordering will be placed in 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // an unspecified order following those listed. 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetSerializationTableOrdering(const IntegerList& table_ordering); 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get an empty font builder for creating a new font from scratch. 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font::Builder* NewFontBuilder(); 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets to specific elements in the underlying data. These offsets are 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // relative to the start of the table or the start of sub-blocks within the 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // table. 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun struct Offset { 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets within the main directory. 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTTCTag = 0, 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kVersion = 4, 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kNumFonts = 8, 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kOffsetTable = 12, 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // TTC Version 2.0 extensions. 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets from end of OffsetTable. 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kulDsigTag = 0, 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kulDsigLength = 4, 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kulDsigOffset = 8 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontFactory(); 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font* LoadSingleOTF(InputStream* is); 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font* LoadSingleOTF(WritableFontData* wfd); 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadCollection(InputStream* is, FontArray* output); 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadCollection(WritableFontData* wfd, FontArray* output); 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font::Builder* LoadSingleOTFForBuilding(InputStream* is); 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font::Builder* 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun LoadSingleOTFForBuilding(WritableFontData* wfd, 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t offset_to_offset_table); 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadCollectionForBuilding(InputStream* is, FontBuilderArray* builders); 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadCollectionForBuilding(WritableFontData* ba, 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontBuilderArray* builders); 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool IsCollection(PushbackInputStream* pbis); 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static bool IsCollection(ReadableFontData* wfd); 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool fingerprint_; 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList table_ordering_; 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<FontFactory> FontFactoryPtr; 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_FONT_FACTORY_H_ 141