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_H_ 1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#define SFNTLY_CPP_SRC_SFNTLY_FONT_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/port/endian.h" 2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/font_input_stream.h" 2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/font_output_stream.h" 2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/data/writable_font_data.h" 2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "sfntly/table/table.h" 2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunnamespace sfntly { 3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Note: following constants are embedded in Font class in Java. They are 3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// extracted out for easier reference from other classes. Offset is the 3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// one that is kept within class. 3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Platform ids. These are used in a number of places within the font whenever 3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// the platform needs to be specified. 3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct PlatformId { 3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnknown = -1, 4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicode = 0, 4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kMacintosh = 1, 4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kISO = 2, 4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kWindows = 3, 4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kCustom = 4 4530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 4630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 4730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 4830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Unicode encoding ids. These are used in a number of places within the font 4930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// whenever character encodings need to be specified. 5030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct UnicodeEncodingId { 5130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 5230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnknown = -1, 5330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicode1_0 = 0, 5430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicode1_1 = 1, 5530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kISO10646 = 2, 5630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicode2_0_BMP = 3, 5730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicode2_0 = 4, 5830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicodeVariationSequences = 5 5930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 6030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 6130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 6230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Windows encoding ids. These are used in a number of places within the font 6330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// whenever character encodings need to be specified. 6430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct WindowsEncodingId { 6530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 6630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnknown = 0xffffffff, 6730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSymbol = 0, 6830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicodeUCS2 = 1, 6930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kShiftJIS = 2, 7030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kPRC = 3, 7130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kBig5 = 4, 7230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kWansung = 5, 7330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kJohab = 6, 7430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnicodeUCS4 = 10 7530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 7630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 7730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 7830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// Macintosh encoding ids. These are used in a number of places within the 7930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// font whenever character encodings need to be specified. 8030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunstruct MacintoshEncodingId { 8130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Macintosh Platform Encodings 8230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 8330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUnknown = -1, 8430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kRoman = 0, 8530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kJapanese = 1, 8630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kChineseTraditional = 2, 8730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kKorean = 3, 8830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kArabic = 4, 8930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kHebrew = 5, 9030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGreek = 6, 9130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kRussian = 7, 9230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kRSymbol = 8, 9330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kDevanagari = 9, 9430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGurmukhi = 10, 9530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGujarati = 11, 9630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kOriya = 12, 9730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kBengali = 13, 9830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTamil = 14, 9930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTelugu = 15, 10030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kKannada = 16, 10130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kMalayalam = 17, 10230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSinhalese = 18, 10330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kBurmese = 19, 10430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kKhmer = 20, 10530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kThai = 21, 10630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kLaotian = 22, 10730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGeorgian = 23, 10830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kArmenian = 24, 10930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kChineseSimplified = 25, 11030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTibetan = 26, 11130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kMongolian = 27, 11230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kGeez = 28, 11330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSlavic = 29, 11430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kVietnamese = 30, 11530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSindhi = 31, 11630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kUninterpreted = 32 11730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 11830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 11930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass FontFactory; 12130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 12230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// An sfnt container font object. This object is immutable and thread safe. To 12330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// construct one use an instance of Font::Builder. 12430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurunclass Font : public RefCounted<Font> { 12530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 12630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // A builder for a font object. The builder allows the for the creation of 12730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // immutable Font objects. The builder is a one use non-thread safe object and 12830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // once the Font object has been created it is no longer usable. To create a 12930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // further Font object new builder will be required. 13030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun class Builder : public RefCounted<Builder> { 13130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun public: 13230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Builder(); 13330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 13430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* 13530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GetOTFBuilder(FontFactory* factory, InputStream* is); 13630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* 13730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GetOTFBuilder(FontFactory* factory, 13830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* ba, 13930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t offset_to_offset_table); 14030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static CALLER_ATTACH Builder* GetOTFBuilder(FontFactory* factory); 14130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the font factory that created this font builder. 14330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontFactory* GetFontFactory() { return factory_; } 14430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Is the font ready to build? 14630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool ReadyToBuild(); 14730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 14830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Build the Font. After this call this builder will no longer be usable. 14930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Font* Build(); 15030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Set a unique fingerprint for the font object. 15230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SetDigest(ByteVector* digest); 15330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Clear all table builders. 15530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ClearTableBuilders(); 15630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 15730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Does this font builder have the specified table builder. 15830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool HasTableBuilder(int32_t tag); 15930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the table builder for the given tag. If there is no builder for that 16130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // tag then return a null. 16230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Table::Builder* GetTableBuilder(int32_t tag); 16330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 16430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Creates a new table builder for the table type given by the table id tag. 16530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // This new table has been added to the font and will replace any existing 16630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // builder for that table. 16730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return new empty table of the type specified by tag; if tag is not known 16830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // then a generic OpenTypeTable is returned 16930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual Table::Builder* NewTableBuilder(int32_t tag); 17030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Creates a new table builder for the table type given by the table id tag. 17230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // It makes a copy of the data provided and uses that copy for the table. 17330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // This new table has been added to the font and will replace any existing 17430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // builder for that table. 17530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual Table::Builder* NewTableBuilder(int32_t tag, 17630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ReadableFontData* src_data); 17730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 17830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get a map of the table builders in this font builder accessed by table 17930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // tag. 18030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual TableBuilderMap* table_builders() { return &table_builders_; } 18130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Remove the specified table builder from the font builder. 18330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: different from Java: we don't return object in removeTableBuilder 18430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void RemoveTableBuilder(int32_t tag); 18530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 18630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the number of table builders in the font builder. 18730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual int32_t number_of_table_builders() { 18830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun return (int32_t)table_builders_.size(); 18930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun } 19030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 19130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 19230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun explicit Builder(FontFactory* factory); 19330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void LoadFont(InputStream* is); 19430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual void LoadFont(WritableFontData* wfd, 19530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t offset_to_offset_table); 19630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t SfntWrapperSize(); 19730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void BuildAllTableBuilders(DataBlockMap* table_data, 19830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableBuilderMap* builder_map); 19930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun CALLER_ATTACH Table::Builder* 20030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun GetTableBuilder(Header* header, WritableFontData* data); 20130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void BuildTablesFromBuilders(Font* font, 20230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableBuilderMap* builder_map, 20330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableMap* tables); 20430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun static void InterRelateBuilders(TableBuilderMap* builder_map); 20530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ReadHeader(FontInputStream* is, 20730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun HeaderOffsetSortedSet* records); 20830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 20930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void ReadHeader(ReadableFontData* fd, 21030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t offset, 21130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun HeaderOffsetSortedSet* records); 21230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 21330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadTableData(HeaderOffsetSortedSet* headers, 21430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontInputStream* is, 21530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DataBlockMap* table_data); 21630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 21730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void LoadTableData(HeaderOffsetSortedSet* headers, 21830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun WritableFontData* fd, 21930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DataBlockMap* table_data); 22030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 22130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableBuilderMap table_builders_; 22230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun FontFactory* factory_; // dumb pointer, avoid circular refcounting 22330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t sfnt_version_; 22430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_tables_; 22530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t search_range_; 22630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t entry_selector_; 22730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t range_shift_; 22830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun DataBlockMap data_blocks_; 22930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ByteVector digest_; 23030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 23130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun virtual ~Font(); 23330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets the sfnt version set in the sfnt wrapper of the font. 23530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t sfnt_version() { return sfnt_version_; } 23630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 23730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Gets a copy of the fonts digest that was created when the font was read. If 23830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // no digest was set at creation time then the return result will be null. 23930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ByteVector* digest() { return &digest_; } 24030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the checksum for this font. 24230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t checksum() { return checksum_; } 24330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the number of tables in this font. 24530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t num_tables() { return (int32_t)tables_.size(); } 24630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 24730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Whether the font has a particular table. 24830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun bool HasTable(int32_t tag); 24930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // UNIMPLEMENTED: public Iterator<? extends Table> iterator 25130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the table in this font with the specified id. 25330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tag the identifier of the table 25430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return the table specified if it exists; null otherwise 25530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // C++ port: rename table() to GetTable() 25630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Table* GetTable(int32_t tag); 25730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 25830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get a map of the tables in this font accessed by table tag. 25930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return an unmodifiable view of the tables in this font 26030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: renamed tableMap() to GetTableMap() 26130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun const TableMap* GetTableMap(); 26230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // UNIMPLEMENTED: toString() 26430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 26530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Serialize the font to the output stream. 26630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param os the destination for the font serialization 26730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tableOrdering the table ordering to apply 26830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void Serialize(OutputStream* os, IntegerList* table_ordering); 26930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 27030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun private: 27130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets to specific elements in the underlying data. These offsets are 27230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // relative to the start of the table or the start of sub-blocks within the 27330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // table. 27430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun struct Offset { 27530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun enum { 27630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets within the main directory 27730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSfntVersion = 0, 27830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kNumTables = 4, 27930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSearchRange = 6, 28030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kEntrySelector = 8, 28130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kRangeShift = 10, 28230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableRecordBegin = 12, 28330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kSfntHeaderSize = 12, 28430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 28530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Offsets within a specific table record 28630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableTag = 0, 28730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableCheckSum = 4, 28830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableOffset = 8, 28930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableLength = 12, 29030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun kTableRecordSize = 16 29130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 29230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun }; 29330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 29430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: the two constants are moved to tag.h to avoid VC++ bug. 29530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static const int32_t CFF_TABLE_ORDERING[]; 29630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun// static const int32_t TRUE_TYPE_TABLE_ORDERING[]; 29730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 29830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Constructor. 29930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param sfntVersion the sfnt version 30030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param digest the computed digest for the font; null if digest was not 30130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // computed 30230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Note: Current C++ port does not support SHA digest validation. 30330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun Font(int32_t sfnt_version, ByteVector* digest); 30430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 30530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Build the table headers to be used for serialization. These headers will be 30630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // filled out with the data required for serialization. The headers will be 30730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // sorted in the order specified and only those specified will have headers 30830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // generated. 30930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tableOrdering the tables to generate headers for and the order to 31030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // sort them 31130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @return a list of table headers ready for serialization 31230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void BuildTableHeadersForSerialization(IntegerList* table_ordering, 31330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableHeaderList* table_headers); 31430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 31530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Searialize the headers. 31630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param fos the destination stream for the headers 31730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tableHeaders the headers to serialize 31830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @throws IOException 31930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SerializeHeader(FontOutputStream* fos, TableHeaderList* table_headers); 32030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Serialize the tables. 32230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param fos the destination stream for the headers 32330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param tableHeaders the headers for the tables to serialize 32430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @throws IOException 32530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void SerializeTables(FontOutputStream* fos, TableHeaderList* table_headers); 32630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 32730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Generate the full table ordering to used for serialization. The full 32830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // ordering uses the partial ordering as a seed and then adds all remaining 32930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // tables in the font in an undefined order. 33030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param defaultTableOrdering the partial ordering to be used as a seed for 33130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // the full ordering 33230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param (out) table_ordering the full ordering for serialization 33330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void GenerateTableOrdering(IntegerList* default_table_ordering, 33430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun IntegerList* table_ordering); 33530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 33630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // Get the default table ordering based on the type of the font. 33730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun // @param (out) default_table_ordering the default table ordering 33830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun void DefaultTableOrdering(IntegerList* default_table_ordering); 33930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 34030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int32_t sfnt_version_; 34130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun ByteVector digest_; 34230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun int64_t checksum_; 34330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun TableMap tables_; 34430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}; 34530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<Font> FontPtr; 34630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<FontPtr> FontArray; 34730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef Ptr<Font::Builder> FontBuilderPtr; 34830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Guruntypedef std::vector<FontBuilderPtr> FontBuilderArray; 34930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 35030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun} // namespace sfntly 35130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun 35230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif // SFNTLY_CPP_SRC_SFNTLY_FONT_H_ 353