blob: 694c69ac39823e57120e75d50425cef1daf8e627 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2011 Google Inc.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000010#ifndef SkPDFFont_DEFINED
11#define SkPDFFont_DEFINED
12
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000013#include "SkAdvancedTypefaceMetrics.h"
vandebo@chromium.org98594282011-07-25 22:34:12 +000014#include "SkBitSet.h"
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000015#include "SkPDFTypes.h"
16#include "SkTDArray.h"
17#include "SkThread.h"
vandebo@chromium.org98594282011-07-25 22:34:12 +000018#include "SkTypeface.h"
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000019
20class SkPaint;
vandebo@chromium.org98594282011-07-25 22:34:12 +000021class SkPDFCatalog;
22class SkPDFFont;
23
24class SkPDFGlyphSet : public SkNoncopyable {
25public:
26 SkPDFGlyphSet();
27
28 void set(const uint16_t* glyphIDs, int numGlyphs);
29 bool has(uint16_t glyphID) const;
30 void merge(const SkPDFGlyphSet& usage);
vandebo@chromium.org17e66e22011-07-27 20:59:55 +000031 void exportTo(SkTDArray<uint32_t>* glyphIDs) const;
vandebo@chromium.org98594282011-07-25 22:34:12 +000032
33private:
34 SkBitSet fBitSet;
35};
36
37class SkPDFGlyphSetMap : public SkNoncopyable {
38public:
39 struct FontGlyphSetPair {
40 FontGlyphSetPair(SkPDFFont* font, SkPDFGlyphSet* glyphSet);
41
42 SkPDFFont* fFont;
43 SkPDFGlyphSet* fGlyphSet;
44 };
45
46 SkPDFGlyphSetMap();
47 ~SkPDFGlyphSetMap();
48
49 class F2BIter {
50 public:
ctguil@chromium.orga5c72342011-08-15 23:55:03 +000051 explicit F2BIter(const SkPDFGlyphSetMap& map);
commit-bot@chromium.orgaa537d42013-02-28 19:03:13 +000052 const FontGlyphSetPair* next() const;
vandebo@chromium.org98594282011-07-25 22:34:12 +000053 void reset(const SkPDFGlyphSetMap& map);
54
55 private:
56 const SkTDArray<FontGlyphSetPair>* fMap;
57 mutable int fIndex;
58 };
59
60 void merge(const SkPDFGlyphSetMap& usage);
61 void reset();
62
63 void noteGlyphUsage(SkPDFFont* font, const uint16_t* glyphIDs,
64 int numGlyphs);
65
66private:
67 SkPDFGlyphSet* getGlyphSetForFont(SkPDFFont* font);
68
69 SkTDArray<FontGlyphSetPair> fMap;
70};
71
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000072
73/** \class SkPDFFont
74 A PDF Object class representing a font. The font may have resources
75 attached to it in order to embed the font. SkPDFFonts are canonicalized
76 so that resource deduplication will only include one copy of a font.
77 This class uses the same pattern as SkPDFGraphicState, a static weak
78 reference to each instantiated class.
79*/
80class SkPDFFont : public SkPDFDict {
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +000081 SK_DECLARE_INST_COUNT(SkPDFFont)
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000082public:
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +000083 virtual ~SkPDFFont();
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000084
edisonn@google.com6addb192013-04-02 15:33:08 +000085 virtual void getResources(const SkTSet<SkPDFObject*>& knownResourceObjects,
86 SkTSet<SkPDFObject*>* newResourceObjects);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000087
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000088 /** Returns the typeface represented by this class. Returns NULL for the
89 * default typeface.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000090 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +000091 SkTypeface* typeface();
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000092
vandebo@chromium.orgf0ec2662011-05-29 05:55:42 +000093 /** Returns the font type represented in this font. For Type0 fonts,
94 * returns the type of the decendant font.
95 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +000096 virtual SkAdvancedTypefaceMetrics::FontType getType();
vandebo@chromium.org98594282011-07-25 22:34:12 +000097
98 /** Returns true if this font encoding supports glyph IDs above 255.
99 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000100 virtual bool multiByteGlyphs() const = 0;
vandebo@chromium.orgf0ec2662011-05-29 05:55:42 +0000101
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000102 /** Return true if this font has an encoding for the passed glyph id.
103 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000104 bool hasGlyph(uint16_t glyphID);
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000105
vandebo@chromium.org01294102011-02-28 19:52:18 +0000106 /** Convert (in place) the input glyph IDs into the font encoding. If the
107 * font has more glyphs than can be encoded (like a type 1 font with more
108 * than 255 glyphs) this method only converts up to the first out of range
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000109 * glyph ID.
110 * @param glyphIDs The input text as glyph IDs.
111 * @param numGlyphs The number of input glyphs.
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000112 * @return Returns the number of glyphs consumed.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000113 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000114 size_t glyphsToPDFFontEncoding(uint16_t* glyphIDs, size_t numGlyphs);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000115
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +0000116 /** Get the font resource for the passed typeface and glyphID. The
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000117 * reference count of the object is incremented and it is the caller's
118 * responsibility to unreference it when done. This is needed to
119 * accommodate the weak reference pattern used when the returned object
120 * is new and has no other references.
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +0000121 * @param typeface The typeface to find.
122 * @param glyphID Specify which section of a large font is of interest.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000123 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000124 static SkPDFFont* GetFontResource(SkTypeface* typeface,
vandebo@chromium.org3509f052011-05-30 20:52:33 +0000125 uint16_t glyphID);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000126
vandebo@chromium.org98594282011-07-25 22:34:12 +0000127 /** Subset the font based on usage set. Returns a SkPDFFont instance with
128 * subset.
129 * @param usage Glyph subset requested.
130 * @return NULL if font does not support subsetting, a new instance
131 * of SkPDFFont otherwise.
132 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000133 virtual SkPDFFont* getFontSubset(const SkPDFGlyphSet* usage);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000134
135protected:
136 // Common constructor to handle common members.
137 SkPDFFont(SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface,
sugoi@google.come2e81132013-03-05 18:35:55 +0000138 SkPDFDict* relatedFontDescriptor);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000139
140 // Accessors for subclass.
141 SkAdvancedTypefaceMetrics* fontInfo();
vandebo@chromium.org37ad8fb2011-08-18 02:38:50 +0000142 void setFontInfo(SkAdvancedTypefaceMetrics* info);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000143 uint16_t firstGlyphID() const;
144 uint16_t lastGlyphID() const;
145 void setLastGlyphID(uint16_t glyphID);
146
147 // Add object to resource list.
148 void addResource(SkPDFObject* object);
149
150 // Accessors for FontDescriptor associated with this object.
151 SkPDFDict* getFontDescriptor();
152 void setFontDescriptor(SkPDFDict* descriptor);
153
154 // Add common entries to FontDescriptor.
155 bool addCommonFontDescriptorEntries(int16_t defaultWidth);
156
157 /** Set fFirstGlyphID and fLastGlyphID to span at most 255 glyphs,
158 * including the passed glyphID.
159 */
160 void adjustGlyphRangeForSingleByteEncoding(int16_t glyphID);
161
162 // Generate ToUnicode table according to glyph usage subset.
163 // If subset is NULL, all available glyph ids will be used.
164 void populateToUnicodeTable(const SkPDFGlyphSet* subset);
165
166 // Create instances of derived types based on fontInfo.
167 static SkPDFFont* Create(SkAdvancedTypefaceMetrics* fontInfo,
168 SkTypeface* typeface, uint16_t glyphID,
sugoi@google.come2e81132013-03-05 18:35:55 +0000169 SkPDFDict* relatedFontDescriptor);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000170
171 static bool Find(uint32_t fontID, uint16_t glyphID, int* index);
172
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000173private:
vandebo@chromium.org31dcee72011-07-23 21:13:30 +0000174 class FontRec {
175 public:
176 SkPDFFont* fFont;
177 uint32_t fFontID;
178 uint16_t fGlyphID;
179
180 // A fGlyphID of 0 with no fFont always matches.
181 bool operator==(const FontRec& b) const;
182 FontRec(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID);
183 };
vandebo@chromium.org6504cfd2011-07-23 20:22:53 +0000184
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +0000185 SkAutoTUnref<SkTypeface> fTypeface;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000186
187 // The glyph IDs accessible with this font. For Type1 (non CID) fonts,
188 // this will be a subset if the font has more than 255 glyphs.
189 uint16_t fFirstGlyphID;
190 uint16_t fLastGlyphID;
191 // The font info is only kept around after construction for large
192 // Type1 (non CID) fonts that need multiple "fonts" to access all glyphs.
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +0000193 SkAutoTUnref<SkAdvancedTypefaceMetrics> fFontInfo;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000194 SkTDArray<SkPDFObject*> fResources;
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +0000195 SkAutoTUnref<SkPDFDict> fDescriptor;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000196
197 SkAdvancedTypefaceMetrics::FontType fFontType;
198
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000199 // This should be made a hash table if performance is a problem.
reed@google.comf6c3ebd2011-07-20 17:20:28 +0000200 static SkTDArray<FontRec>& CanonicalFonts();
digit@google.com1771cbf2012-01-26 21:26:40 +0000201 static SkBaseMutex& CanonicalFontsMutex();
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +0000202 typedef SkPDFDict INHERITED;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000203};
204
205#endif