blob: 330521365788349e7d18c44ab64cdac586824b93 [file] [log] [blame]
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00001/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00002 * Copyright 2011 Google Inc.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00003 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00004 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00006 */
7
epoger@google.comec3ed6a2011-07-28 14:26:00 +00008
vandebo@chromium.org28be72b2010-11-11 21:37:00 +00009#ifndef SkPDFFont_DEFINED
10#define SkPDFFont_DEFINED
11
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000012#include "SkAdvancedTypefaceMetrics.h"
vandebo@chromium.org98594282011-07-25 22:34:12 +000013#include "SkBitSet.h"
Herb Derbydce19a72018-04-18 16:02:17 -040014#include "SkStrikeCache.h"
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000015#include "SkPDFTypes.h"
vandebo@chromium.org98594282011-07-25 22:34:12 +000016#include "SkTypeface.h"
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000017
halcanary792c80f2015-02-20 07:21:05 -080018class SkPDFCanon;
vandebo@chromium.org98594282011-07-25 22:34:12 +000019class SkPDFFont;
20
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000021/** \class SkPDFFont
22 A PDF Object class representing a font. The font may have resources
23 attached to it in order to embed the font. SkPDFFonts are canonicalized
24 so that resource deduplication will only include one copy of a font.
25 This class uses the same pattern as SkPDFGraphicState, a static weak
26 reference to each instantiated class.
27*/
28class SkPDFFont : public SkPDFDict {
halcanary9d524f22016-03-29 09:03:52 -070029
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000030public:
Brian Salomond3b65972017-03-22 12:05:03 -040031 ~SkPDFFont() override;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000032
halcanary96fcdcc2015-08-27 07:41:13 -070033 /** Returns the typeface represented by this class. Returns nullptr for the
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000034 * default typeface.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000035 */
halcanarycee13422016-08-18 09:52:48 -070036 SkTypeface* typeface() const { return fTypeface.get(); }
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000037
vandebo@chromium.orgf0ec2662011-05-29 05:55:42 +000038 /** Returns the font type represented in this font. For Type0 fonts,
39 * returns the type of the decendant font.
40 */
halcanarycee13422016-08-18 09:52:48 -070041 SkAdvancedTypefaceMetrics::FontType getType() const { return fFontType; }
42
halcanaryc2f9ec12016-09-12 08:55:29 -070043 static SkAdvancedTypefaceMetrics::FontType FontType(const SkAdvancedTypefaceMetrics&);
Hal Canary5bdc4d52018-04-10 11:13:24 -040044 static void GetType1GlyphNames(const SkTypeface&, SkString*);
halcanaryc2f9ec12016-09-12 08:55:29 -070045
halcanarycee13422016-08-18 09:52:48 -070046 static bool IsMultiByte(SkAdvancedTypefaceMetrics::FontType type) {
47 return type == SkAdvancedTypefaceMetrics::kType1CID_Font ||
48 type == SkAdvancedTypefaceMetrics::kTrueType_Font;
49 }
vandebo@chromium.org98594282011-07-25 22:34:12 +000050
Herb Derby1a605cd2018-03-22 11:16:25 -040051 static SkExclusiveStrikePtr MakeVectorCache(SkTypeface*, int* sizeOut);
Hal Canaryaa3af7b2017-03-06 16:18:49 -050052
vandebo@chromium.org98594282011-07-25 22:34:12 +000053 /** Returns true if this font encoding supports glyph IDs above 255.
54 */
halcanarycee13422016-08-18 09:52:48 -070055 bool multiByteGlyphs() const { return SkPDFFont::IsMultiByte(this->getType()); }
vandebo0f9bad02014-06-19 11:05:39 -070056
vandebo@chromium.org2a22e102011-01-25 21:01:34 +000057 /** Return true if this font has an encoding for the passed glyph id.
58 */
halcanarycee13422016-08-18 09:52:48 -070059 bool hasGlyph(SkGlyphID gid) {
60 return (gid >= fFirstGlyphID && gid <= fLastGlyphID) || gid == 0;
61 }
vandebo@chromium.org2a22e102011-01-25 21:01:34 +000062
halcanary4871f222016-08-26 13:17:44 -070063 /** Convert the input glyph ID into the font encoding. */
64 SkGlyphID glyphToPDFFontEncoding(SkGlyphID gid) const {
65 if (this->multiByteGlyphs() || gid == 0) {
66 return gid;
67 }
68 SkASSERT(gid >= fFirstGlyphID && gid <= fLastGlyphID);
69 SkASSERT(fFirstGlyphID > 0);
70 return gid - fFirstGlyphID + 1;
71 }
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000072
halcanary4871f222016-08-26 13:17:44 -070073 void noteGlyphUsage(SkGlyphID glyph) {
74 SkASSERT(this->hasGlyph(glyph));
75 fGlyphUsage.set(glyph);
halcanary530032a2016-08-18 14:22:52 -070076 }
77
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000078 /** Get the font resource for the passed typeface and glyphID. The
vandebo@chromium.org2a22e102011-01-25 21:01:34 +000079 * reference count of the object is incremented and it is the caller's
80 * responsibility to unreference it when done. This is needed to
81 * accommodate the weak reference pattern used when the returned object
82 * is new and has no other references.
halcanary4871f222016-08-26 13:17:44 -070083 * @param typeface The typeface to find, not nullptr.
ctguil@chromium.org9db86bb2011-03-04 21:43:27 +000084 * @param glyphID Specify which section of a large font is of interest.
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000085 */
Hal Canary5c1b3602017-04-17 16:30:06 -040086 static sk_sp<SkPDFFont> GetFontResource(SkPDFCanon* canon,
87 SkTypeface* typeface,
88 SkGlyphID glyphID);
vandebo@chromium.org28be72b2010-11-11 21:37:00 +000089
Hal Canary209e4b12017-05-04 14:23:55 -040090 /** Gets SkAdvancedTypefaceMetrics, and caches the result.
halcanary4871f222016-08-26 13:17:44 -070091 * @param typeface can not be nullptr.
92 * @return nullptr only when typeface is bad.
93 */
halcanarycee13422016-08-18 09:52:48 -070094 static const SkAdvancedTypefaceMetrics* GetMetrics(SkTypeface* typeface,
95 SkPDFCanon* canon);
halcanary8eccc302016-08-09 13:04:34 -070096
Hal Canary46cc3da2018-05-09 11:50:34 -040097 static const std::vector<SkUnichar>& GetUnicodeMap(const SkTypeface* typeface,
98 SkPDFCanon* canon);
99
halcanary530032a2016-08-18 14:22:52 -0700100 /** Subset the font based on current usage.
101 * Must be called before emitObject().
vandebo@chromium.org98594282011-07-25 22:34:12 +0000102 */
halcanary530032a2016-08-18 14:22:52 -0700103 virtual void getFontSubset(SkPDFCanon*) = 0;
halcanaryfb62b3d2015-01-21 09:59:14 -0800104
halcanary66a82f32015-10-12 13:05:04 -0700105 /**
106 * Return false iff the typeface has its NotEmbeddable flag set.
halcanary4871f222016-08-26 13:17:44 -0700107 * typeface is not nullptr
halcanary66a82f32015-10-12 13:05:04 -0700108 */
109 static bool CanEmbedTypeface(SkTypeface*, SkPDFCanon*);
110
vandebo@chromium.org98594282011-07-25 22:34:12 +0000111protected:
112 // Common constructor to handle common members.
halcanary530032a2016-08-18 14:22:52 -0700113 struct Info {
114 sk_sp<SkTypeface> fTypeface;
115 SkGlyphID fFirstGlyphID;
116 SkGlyphID fLastGlyphID;
117 SkAdvancedTypefaceMetrics::FontType fFontType;
118 };
119 SkPDFFont(Info);
vandebo@chromium.org98594282011-07-25 22:34:12 +0000120
halcanary32875882016-08-16 09:36:23 -0700121 SkGlyphID firstGlyphID() const { return fFirstGlyphID; }
122 SkGlyphID lastGlyphID() const { return fLastGlyphID; }
halcanary530032a2016-08-18 14:22:52 -0700123 const SkBitSet& glyphUsage() const { return fGlyphUsage; }
halcanary32875882016-08-16 09:36:23 -0700124 sk_sp<SkTypeface> refTypeface() const { return fTypeface; }
vandebo@chromium.org98594282011-07-25 22:34:12 +0000125
halcanarybae235e2016-03-21 10:05:23 -0700126 void drop() override;
127
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000128private:
halcanary48810a02016-03-07 14:57:50 -0800129 sk_sp<SkTypeface> fTypeface;
halcanary530032a2016-08-18 14:22:52 -0700130 SkBitSet fGlyphUsage;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000131
halcanary32875882016-08-16 09:36:23 -0700132 // The glyph IDs accessible with this font. For Type1 (non CID) fonts,
133 // this will be a subset if the font has more than 255 glyphs.
halcanary4871f222016-08-26 13:17:44 -0700134 const SkGlyphID fFirstGlyphID;
135 const SkGlyphID fLastGlyphID;
136 const SkAdvancedTypefaceMetrics::FontType fFontType;
vandebo@chromium.org98594282011-07-25 22:34:12 +0000137
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +0000138 typedef SkPDFDict INHERITED;
vandebo@chromium.org28be72b2010-11-11 21:37:00 +0000139};
140
141#endif