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