tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

font.h (3509B)


      1 /* Copyright 2013 Google Inc. All Rights Reserved.
      2 
      3   Distributed under MIT license.
      4   See file LICENSE for detail or copy at https://opensource.org/licenses/MIT
      5 */
      6 
      7 /* Data model for a font file in sfnt format, reading and writing functions and
      8   accessors for the glyph data. */
      9 
     10 #ifndef WOFF2_FONT_H_
     11 #define WOFF2_FONT_H_
     12 
     13 #include <stddef.h>
     14 #include <inttypes.h>
     15 #include <map>
     16 #include <vector>
     17 
     18 namespace woff2 {
     19 
     20 // Represents an sfnt font file. Only the table directory is parsed, for the
     21 // table data we only store a raw pointer, therefore a font object is valid only
     22 // as long the data from which it was parsed is around.
     23 struct Font {
     24  uint32_t flavor;
     25  uint16_t num_tables;
     26 
     27  struct Table {
     28    uint32_t tag;
     29    uint32_t checksum;
     30    uint32_t offset;
     31    uint32_t length;
     32    const uint8_t* data;
     33 
     34    // Buffer used to mutate the data before writing out.
     35    std::vector<uint8_t> buffer;
     36 
     37    // If we've seen this tag/offset before, pointer to the first time we saw it
     38    // If this is the first time we've seen this table, NULL
     39    // Intended use is to bypass re-processing tables
     40    Font::Table* reuse_of;
     41 
     42    uint8_t flag_byte;
     43 
     44    // Is this table reused by a TTC
     45    bool IsReused() const;
     46  };
     47  std::map<uint32_t, Table> tables;
     48  std::vector<uint32_t> OutputOrderedTags() const;
     49 
     50  Table* FindTable(uint32_t tag);
     51  const Table* FindTable(uint32_t tag) const;
     52 };
     53 
     54 // Accomodates both singular (OTF, TTF) and collection (TTC) fonts
     55 struct FontCollection {
     56  uint32_t flavor;
     57  uint32_t header_version;
     58  // (offset, first use of table*) pairs
     59  std::map<uint32_t, Font::Table*> tables;
     60  std::vector<Font> fonts;
     61 };
     62 
     63 // Parses the font from the given data. Returns false on parsing failure or
     64 // buffer overflow. The font is valid only so long the input data pointer is
     65 // valid. Does NOT support collections.
     66 bool ReadFont(const uint8_t* data, size_t len, Font* font);
     67 
     68 // Parses the font from the given data. Returns false on parsing failure or
     69 // buffer overflow. The font is valid only so long the input data pointer is
     70 // valid. Supports collections.
     71 bool ReadFontCollection(const uint8_t* data, size_t len, FontCollection* fonts);
     72 
     73 // Returns the file size of the font.
     74 size_t FontFileSize(const Font& font);
     75 size_t FontCollectionFileSize(const FontCollection& font);
     76 
     77 // Writes the font into the specified dst buffer. The dst_size should be the
     78 // same as returned by FontFileSize(). Returns false upon buffer overflow (which
     79 // should not happen if dst_size was computed by FontFileSize()).
     80 bool WriteFont(const Font& font, uint8_t* dst, size_t dst_size);
     81 // Write the font at a specific offset
     82 bool WriteFont(const Font& font, size_t* offset, uint8_t* dst, size_t dst_size);
     83 
     84 bool WriteFontCollection(const FontCollection& font_collection, uint8_t* dst,
     85                         size_t dst_size);
     86 
     87 // Returns the number of glyphs in the font.
     88 // NOTE: Currently this works only for TrueType-flavored fonts, will return
     89 // zero for CFF-flavored fonts.
     90 int NumGlyphs(const Font& font);
     91 
     92 // Returns the index format of the font
     93 int IndexFormat(const Font& font);
     94 
     95 // Sets *glyph_data and *glyph_size to point to the location of the glyph data
     96 // with the given index. Returns false if the glyph is not found.
     97 bool GetGlyphData(const Font& font, int glyph_index,
     98                  const uint8_t** glyph_data, size_t* glyph_size);
     99 
    100 // Removes the digital signature (DSIG) table
    101 bool RemoveDigitalSignature(Font* font);
    102 
    103 } // namespace woff2
    104 
    105 #endif  // WOFF2_FONT_H_