Home | History | Annotate | Download | only in sfntly
      1 /*
      2  * Copyright 2011 Google Inc. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #ifndef SFNTLY_CPP_SRC_SFNTLY_FONT_FACTORY_H_
     18 #define SFNTLY_CPP_SRC_SFNTLY_FONT_FACTORY_H_
     19 
     20 #include <vector>
     21 
     22 #include "sfntly/port/refcount.h"
     23 #include "sfntly/port/type.h"
     24 #include "sfntly/font.h"
     25 
     26 namespace sfntly {
     27 
     28 class FontFactory : public RefCounted<FontFactory> {
     29  public:
     30   virtual ~FontFactory();
     31 
     32   // Factory method for the construction of a font factory.
     33   static CALLER_ATTACH FontFactory* GetInstance();
     34 
     35   // Toggle whether fonts that are loaded are fingerprinted with a SHA-1 hash.
     36   // If a font is fingerprinted then a SHA-1 hash is generated at load time and
     37   // stored in the font. This is useful for uniquely identifying fonts. By
     38   // default this is turned on.
     39   // @param fingerprint whether fingerprinting should be turned on or off
     40   // TODO(arthurhsu): IMPLEMENT: C++ port currently don't do any SHA-1
     41   void FingerprintFont(bool fingerprint);
     42   bool FingerprintFont();
     43 
     44   // Load the font(s) from the input stream. The current settings on the factory
     45   // are used during the loading process. One or more fonts are returned if the
     46   // stream contains valid font data. Some font container formats may have more
     47   // than one font and in this case multiple font objects will be returned. If
     48   // the data in the stream cannot be parsed or is invalid an array of size zero
     49   // will be returned.
     50   void LoadFonts(InputStream* is, FontArray* output);
     51 
     52   // ByteArray font loading
     53   // Load the font(s) from the byte array. The current settings on the factory
     54   // are used during the loading process. One or more fonts are returned if the
     55   // stream contains valid font data. Some font container formats may have more
     56   // than one font and in this case multiple font objects will be returned. If
     57   // the data in the stream cannot be parsed or is invalid an array of size zero
     58   // will be returned.
     59   void LoadFonts(ByteVector* b, FontArray* output);
     60 
     61   // Load the font(s) from the input stream into font builders. The current
     62   // settings on the factory are used during the loading process. One or more
     63   // font builders are returned if the stream contains valid font data. Some
     64   // font container formats may have more than one font and in this case
     65   // multiple font builder objects will be returned. If the data in the stream
     66   // cannot be parsed or is invalid an array of size zero will be returned.
     67   void LoadFontsForBuilding(InputStream* is, FontBuilderArray* output);
     68 
     69   // Load the font(s) from the byte array into font builders. The current
     70   // settings on the factory are used during the loading process. One or more
     71   // font builders are returned if the stream contains valid font data. Some
     72   // font container formats may have more than one font and in this case
     73   // multiple font builder objects will be returned. If the data in the stream
     74   // cannot be parsed or is invalid an array of size zero will be returned.
     75   void LoadFontsForBuilding(ByteVector* b, FontBuilderArray* output);
     76 
     77   // Font serialization
     78   // Serialize the font to the output stream.
     79   // NOTE: in this port we attempted not to implement I/O stream because dealing
     80   //       with cross-platform I/O stream itself is big enough as a project.
     81   //       Byte buffer it is.
     82   void SerializeFont(Font* font, OutputStream* os);
     83 
     84   // Set the table ordering to be used in serializing a font. The table ordering
     85   // is an ordered list of table ids and tables will be serialized in the order
     86   // given. Any tables whose id is not listed in the ordering will be placed in
     87   // an unspecified order following those listed.
     88   void SetSerializationTableOrdering(const IntegerList& table_ordering);
     89 
     90   // Get an empty font builder for creating a new font from scratch.
     91   CALLER_ATTACH Font::Builder* NewFontBuilder();
     92 
     93  private:
     94   // Offsets to specific elements in the underlying data. These offsets are
     95   // relative to the start of the table or the start of sub-blocks within the
     96   // table.
     97   struct Offset {
     98     enum {
     99       // Offsets within the main directory.
    100       kTTCTag = 0,
    101       kVersion = 4,
    102       kNumFonts = 8,
    103       kOffsetTable = 12,
    104 
    105       // TTC Version 2.0 extensions.
    106       // Offsets from end of OffsetTable.
    107       kulDsigTag = 0,
    108       kulDsigLength = 4,
    109       kulDsigOffset = 8
    110     };
    111   };
    112 
    113   FontFactory();
    114 
    115   CALLER_ATTACH Font* LoadSingleOTF(InputStream* is);
    116   CALLER_ATTACH Font* LoadSingleOTF(WritableFontData* wfd);
    117 
    118   void LoadCollection(InputStream* is, FontArray* output);
    119   void LoadCollection(WritableFontData* wfd, FontArray* output);
    120 
    121   CALLER_ATTACH Font::Builder* LoadSingleOTFForBuilding(InputStream* is);
    122   CALLER_ATTACH Font::Builder*
    123       LoadSingleOTFForBuilding(WritableFontData* wfd,
    124                                int32_t offset_to_offset_table);
    125 
    126   void LoadCollectionForBuilding(InputStream* is, FontBuilderArray* builders);
    127   void LoadCollectionForBuilding(WritableFontData* ba,
    128                                  FontBuilderArray* builders);
    129 
    130   static bool IsCollection(PushbackInputStream* pbis);
    131   static bool IsCollection(ReadableFontData* wfd);
    132 
    133   bool fingerprint_;
    134   IntegerList table_ordering_;
    135 };
    136 typedef Ptr<FontFactory> FontFactoryPtr;
    137 
    138 }  // namespace sfntly
    139 
    140 #endif  // SFNTLY_CPP_SRC_SFNTLY_FONT_FACTORY_H_
    141