Home | History | Annotate | Download | only in pdf
      1 /*
      2  * Copyright (C) 2011 Google Inc.
      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 SkPDFFont_DEFINED
     18 #define SkPDFFont_DEFINED
     19 
     20 #include "SkAdvancedTypefaceMetrics.h"
     21 #include "SkPDFTypes.h"
     22 #include "SkTDArray.h"
     23 #include "SkThread.h"
     24 
     25 class SkPaint;
     26 
     27 /** \class SkPDFFont
     28     A PDF Object class representing a font.  The font may have resources
     29     attached to it in order to embed the font.  SkPDFFonts are canonicalized
     30     so that resource deduplication will only include one copy of a font.
     31     This class uses the same pattern as SkPDFGraphicState, a static weak
     32     reference to each instantiated class.
     33 */
     34 class SkPDFFont : public SkPDFDict {
     35 public:
     36     SK_API virtual ~SkPDFFont();
     37 
     38     SK_API virtual void getResources(SkTDArray<SkPDFObject*>* resourceList);
     39 
     40     /** Returns the typeface represented by this class. Returns NULL for the
     41      *  default typeface.
     42      */
     43     SK_API SkTypeface* typeface();
     44 
     45     /** Returns the font type represented in this font.  For Type0 fonts,
     46      *  returns the type of the decendant font.
     47      */
     48     SK_API SkAdvancedTypefaceMetrics::FontType getType();
     49 
     50     /** Return true if this font has an encoding for the passed glyph id.
     51      */
     52     SK_API bool hasGlyph(uint16_t glyphID);
     53 
     54     /** Returns true if this font encoding supports glyph IDs above 255.
     55      */
     56     SK_API bool multiByteGlyphs();
     57 
     58     /** Convert (in place) the input glyph IDs into the font encoding.  If the
     59      *  font has more glyphs than can be encoded (like a type 1 font with more
     60      *  than 255 glyphs) this method only converts up to the first out of range
     61      *  glyph ID.
     62      *  @param glyphIDs       The input text as glyph IDs.
     63      *  @param numGlyphs      The number of input glyphs.
     64      *  @return               Returns the number of glyphs consumed.
     65      */
     66     SK_API size_t glyphsToPDFFontEncoding(uint16_t* glyphIDs, size_t numGlyphs);
     67 
     68     /** Get the font resource for the passed typeface and glyphID. The
     69      *  reference count of the object is incremented and it is the caller's
     70      *  responsibility to unreference it when done.  This is needed to
     71      *  accommodate the weak reference pattern used when the returned object
     72      *  is new and has no other references.
     73      *  @param typeface  The typeface to find.
     74      *  @param glyphID   Specify which section of a large font is of interest.
     75      */
     76     SK_API static SkPDFFont* getFontResource(SkTypeface* typeface,
     77                                              uint16_t glyphID);
     78 
     79 private:
     80     SkRefPtr<SkTypeface> fTypeface;
     81     SkAdvancedTypefaceMetrics::FontType fType;
     82 #ifdef SK_DEBUG
     83     bool fDescendant;
     84 #endif
     85     bool fMultiByteGlyphs;
     86 
     87     // The glyph IDs accessible with this font.  For Type1 (non CID) fonts,
     88     // this will be a subset if the font has more than 255 glyphs.
     89     uint16_t fFirstGlyphID;
     90     uint16_t fLastGlyphID;
     91     // The font info is only kept around after construction for large
     92     // Type1 (non CID) fonts that need multiple "fonts" to access all glyphs.
     93     SkRefPtr<SkAdvancedTypefaceMetrics> fFontInfo;
     94     SkTDArray<SkPDFObject*> fResources;
     95     SkRefPtr<SkPDFDict> fDescriptor;
     96 
     97     class FontRec {
     98     public:
     99         SkPDFFont* fFont;
    100         uint32_t fFontID;
    101         uint16_t fGlyphID;
    102 
    103         // A fGlyphID of 0 with no fFont always matches.
    104         bool operator==(const FontRec& b) const;
    105         FontRec(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID);
    106     };
    107 
    108     // This should be made a hash table if performance is a problem.
    109     static SkTDArray<FontRec>& canonicalFonts();
    110     static SkMutex& canonicalFontsMutex();
    111 
    112     /** Construct a new font dictionary and support objects.
    113      *  @param fontInfo       Information about the to create.
    114      *  @param typeface       The typeface for the font.
    115      *  @param glyphID        The glyph ID the caller is interested in. This
    116      *                        is important only for Type1 fonts, which have
    117      *                        more than 255 glyphs.
    118      *  @param descendantFont If this is the descendant (true) or root
    119      *                        (Type 0 font - false) font dictionary.  Only True
    120      *                        Type and CID encoded fonts will use a true value.
    121      *  @param fontDescriptor If the font descriptor has already have generated
    122      *                        for this font, pass it in here, otherwise pass
    123      *                        NULL.
    124      */
    125     SkPDFFont(class SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface,
    126               uint16_t glyphID, bool descendantFont, SkPDFDict* fontDescriptor);
    127 
    128     void populateType0Font();
    129     void populateCIDFont();
    130     bool populateType1Font(int16_t glyphID);
    131 
    132     /** Populate the PDF font dictionary as Type3 font which includes glyph
    133      *  descriptions with instructions for painting the glyphs. This function
    134      *  doesn't use any fields from SkAdvancedTypefaceMetrics (fFontInfo). Font
    135      *  information including glyph paths are queried from the platform
    136      *  dependent SkGlyphCache.
    137     */
    138     void populateType3Font(int16_t glyphID);
    139     bool addFontDescriptor(int16_t defaultWidth);
    140     void populateToUnicodeTable();
    141     void addWidthInfoFromRange(int16_t defaultWidth,
    142         const SkAdvancedTypefaceMetrics::WidthRange* widthRangeEntry);
    143     /** Set fFirstGlyphID and fLastGlyphID to span at most 255 glyphs,
    144      *  including the passed glyphID.
    145      */
    146     void adjustGlyphRangeForSingleByteEncoding(int16_t glyphID);
    147 
    148     static bool find(uint32_t fontID, uint16_t glyphID, int* index);
    149 };
    150 
    151 #endif
    152