• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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