blob: 27f1b5bfe3c35e169b1be72d2fca30516f32460d [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
commit-bot@chromium.orge3beb6b2014-04-07 19:34:38 +000024class SkPDFGlyphSet : SkNoncopyable {
vandebo@chromium.org98594282011-07-25 22:34:12 +000025public:
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
commit-bot@chromium.orge3beb6b2014-04-07 19:34:38 +000037class SkPDFGlyphSetMap : SkNoncopyable {
vandebo@chromium.org98594282011-07-25 22:34:12 +000038public:
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
vandebo0f9bad02014-06-19 11:05:39 -0700102 /** Returns true if the machine readable licensing bits allow embedding.
103 */
104 bool canEmbed() const;
105
106 /** Returns true if the machine readable licensing bits allow subsetting.
107 */
108 bool canSubset() const;
109
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000110 /** Return true if this font has an encoding for the passed glyph id.
111 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000112 bool hasGlyph(uint16_t glyphID);
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000113
vandebo@chromium.org01294102011-02-28 19:52:18 +0000114 /** Convert (in place) the input glyph IDs into the font encoding. If the
115 * font has more glyphs than can be encoded (like a type 1 font with more
116 * than 255 glyphs) this method only converts up to the first out of range
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000117 * glyph ID.
118 * @param glyphIDs The input text as glyph IDs.
119 * @param numGlyphs The number of input glyphs.
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000120 * @return Returns the number of glyphs consumed.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000121 */
reed@google.comaec40662014-04-18 19:29:07 +0000122 int glyphsToPDFFontEncoding(uint16_t* glyphIDs, int numGlyphs);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000123
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +0000124 /** Get the font resource for the passed typeface and glyphID. The
vandebo@chromium.org2a22e102011-01-25 21:01:34 +0000125 * reference count of the object is incremented and it is the caller's
126 * responsibility to unreference it when done. This is needed to
127 * accommodate the weak reference pattern used when the returned object
128 * is new and has no other references.
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +0000129 * @param typeface The typeface to find.
130 * @param glyphID Specify which section of a large font is of interest.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000131 */
vandebo0f9bad02014-06-19 11:05:39 -0700132 static SkPDFFont* GetFontResource(SkTypeface* typeface, uint16_t glyphID);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000133
vandebo@chromium.org98594282011-07-25 22:34:12 +0000134 /** Subset the font based on usage set. Returns a SkPDFFont instance with
135 * subset.
136 * @param usage Glyph subset requested.
137 * @return NULL if font does not support subsetting, a new instance
138 * of SkPDFFont otherwise.
139 */
vandebo@chromium.org7d6c8f92012-03-22 20:45:15 +0000140 virtual SkPDFFont* getFontSubset(const SkPDFGlyphSet* usage);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000141
142protected:
143 // Common constructor to handle common members.
halcanaryfb747e22014-07-11 19:45:23 -0700144 SkPDFFont(const SkAdvancedTypefaceMetrics* fontInfo, SkTypeface* typeface,
sugoi@google.come2e81132013-03-05 18:35:55 +0000145 SkPDFDict* relatedFontDescriptor);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000146
147 // Accessors for subclass.
halcanaryfb747e22014-07-11 19:45:23 -0700148 const SkAdvancedTypefaceMetrics* fontInfo();
149 void setFontInfo(const SkAdvancedTypefaceMetrics* info);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000150 uint16_t firstGlyphID() const;
151 uint16_t lastGlyphID() const;
152 void setLastGlyphID(uint16_t glyphID);
153
154 // Add object to resource list.
155 void addResource(SkPDFObject* object);
156
157 // Accessors for FontDescriptor associated with this object.
158 SkPDFDict* getFontDescriptor();
159 void setFontDescriptor(SkPDFDict* descriptor);
160
161 // Add common entries to FontDescriptor.
162 bool addCommonFontDescriptorEntries(int16_t defaultWidth);
163
164 /** Set fFirstGlyphID and fLastGlyphID to span at most 255 glyphs,
165 * including the passed glyphID.
166 */
bungeman22edc832014-10-03 07:55:58 -0700167 void adjustGlyphRangeForSingleByteEncoding(uint16_t glyphID);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000168
169 // Generate ToUnicode table according to glyph usage subset.
170 // If subset is NULL, all available glyph ids will be used.
171 void populateToUnicodeTable(const SkPDFGlyphSet* subset);
172
173 // Create instances of derived types based on fontInfo.
halcanaryfb747e22014-07-11 19:45:23 -0700174 static SkPDFFont* Create(const SkAdvancedTypefaceMetrics* fontInfo,
vandebo@chromium.org98594282011-07-25 22:34:12 +0000175 SkTypeface* typeface, uint16_t glyphID,
sugoi@google.come2e81132013-03-05 18:35:55 +0000176 SkPDFDict* relatedFontDescriptor);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000177
178 static bool Find(uint32_t fontID, uint16_t glyphID, int* index);
179
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000180private:
vandebo@chromium.org31dcee72011-07-23 21:13:30 +0000181 class FontRec {
182 public:
183 SkPDFFont* fFont;
184 uint32_t fFontID;
185 uint16_t fGlyphID;
186
187 // A fGlyphID of 0 with no fFont always matches.
188 bool operator==(const FontRec& b) const;
189 FontRec(SkPDFFont* font, uint32_t fontID, uint16_t fGlyphID);
190 };
vandebo@chromium.org6504cfd2011-07-23 20:22:53 +0000191
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +0000192 SkAutoTUnref<SkTypeface> fTypeface;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000193
194 // The glyph IDs accessible with this font. For Type1 (non CID) fonts,
195 // this will be a subset if the font has more than 255 glyphs.
196 uint16_t fFirstGlyphID;
197 uint16_t fLastGlyphID;
halcanaryfb747e22014-07-11 19:45:23 -0700198 SkAutoTUnref<const SkAdvancedTypefaceMetrics> fFontInfo;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000199 SkTDArray<SkPDFObject*> fResources;
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +0000200 SkAutoTUnref<SkPDFDict> fDescriptor;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000201
202 SkAdvancedTypefaceMetrics::FontType fFontType;
203
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000204 // This should be made a hash table if performance is a problem.
reed@google.comf6c3ebd2011-07-20 17:20:28 +0000205 static SkTDArray<FontRec>& CanonicalFonts();
digit@google.com1771cbf2012-01-26 21:26:40 +0000206 static SkBaseMutex& CanonicalFontsMutex();
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +0000207 typedef SkPDFDict INHERITED;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000208};
209
210#endif