Index: trunk/src/pdf/SkPDFFont.cpp |
=================================================================== |
--- trunk/src/pdf/SkPDFFont.cpp (revision 8112) |
+++ trunk/src/pdf/SkPDFFont.cpp (working copy) |
@@ -31,6 +31,36 @@ |
#include SK_SFNTLY_SUBSETTER |
#endif |
+class SkAutoDefaultTypeface { |
+public: |
+ SkAutoDefaultTypeface() : fFace(SkTypeface::RefDefault()) { |
+ fCallUnref = true; |
+ } |
+ |
+ SkAutoDefaultTypeface(SkTypeface* face) : fFace(face) { |
+ if (face) { |
+ fFace = SkTypeface::RefDefault(); |
+ fCallUnref = true; |
+ } else { |
+ fCallUnref = false; |
+ } |
+ } |
+ |
+ ~SkAutoDefaultTypeface() { |
+ if (fCallUnref) { |
+ fFace->unref(); |
+ } |
+ } |
+ |
+ SkTypeface* get() const { return fFace; } |
+ SkTypeface* operator->() { return fFace; } |
+ operator SkTypeface*() { return fFace; } |
+ |
+private: |
+ SkTypeface* fFace; |
+ bool fCallUnref; |
+}; |
+ |
namespace { |
/////////////////////////////////////////////////////////////////////////////// |
@@ -541,11 +571,11 @@ |
#endif |
static int get_subset_font_stream(const char* fontName, |
- const SkTypeface* typeface, |
+ SkTypeface* typeface, |
const SkTDArray<uint32_t>& subset, |
SkPDFStream** fontStream) { |
- SkAutoTUnref<SkStream> fontData( |
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface))); |
+ int ttcIndex; |
+ SkAutoTUnref<SkStream> fontData(typeface->openStream(&ttcIndex)); |
int fontSize = fontData->getLength(); |
@@ -709,7 +739,7 @@ |
SkDEBUGCODE(int indexFound;) |
SkASSERT(index == -1 || |
- (Find(SkTypeface::UniqueID(fTypeface.get()), |
+ (Find(fTypeface->uniqueID(), |
fFirstGlyphID, |
&indexFound) && |
index == indexFound)); |
@@ -758,9 +788,12 @@ |
// static |
SkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) { |
SkAutoMutexAcquire lock(CanonicalFontsMutex()); |
- const uint32_t fontID = SkTypeface::UniqueID(typeface); |
+ |
+ SkAutoDefaultTypeface autoFace(typeface); |
bungeman-skia
2013/03/12 21:07:23
Is this less verbose and achieve the same ends?
S
|
+ typeface = autoFace.get(); |
+ |
int relatedFontIndex; |
- if (Find(fontID, glyphID, &relatedFontIndex)) { |
+ if (Find(typeface->uniqueID(), glyphID, &relatedFontIndex)) { |
CanonicalFonts()[relatedFontIndex].fFont->ref(); |
return CanonicalFonts()[relatedFontIndex].fFont; |
} |
@@ -795,7 +828,7 @@ |
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo); |
#endif |
fontMetrics.reset( |
- SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0)); |
+ typeface->getAdvancedTypefaceMetrics(info, NULL, 0)); |
#if defined (SK_SFNTLY_SUBSETTER) |
if (fontMetrics.get() && |
fontMetrics->fType != SkAdvancedTypefaceMetrics::kTrueType_Font) { |
@@ -803,14 +836,14 @@ |
info = SkTBitOr<SkAdvancedTypefaceMetrics::PerGlyphInfo>( |
info, SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo); |
fontMetrics.reset( |
- SkFontHost::GetAdvancedTypefaceMetrics(fontID, info, NULL, 0)); |
+ typeface->getAdvancedTypefaceMetrics(info, NULL, 0)); |
} |
#endif |
} |
SkPDFFont* font = Create(fontMetrics.get(), typeface, glyphID, |
relatedFontDescriptor); |
- FontRec newEntry(font, fontID, font->fFirstGlyphID); |
+ FontRec newEntry(font, typeface->uniqueID(), font->fFirstGlyphID); |
CanonicalFonts().push(newEntry); |
return font; // Return the reference new SkPDFFont() created. |
} |
@@ -855,7 +888,6 @@ |
fLastGlyphID(info ? info->fLastGlyphID : 0), |
fFontInfo(info), |
bungeman-skia
2013/03/12 21:07:23
For the same reason this should have been
fFontIn
|
fDescriptor(relatedFontDescriptor) { |
- SkSafeRef(typeface); |
SkSafeRef(info); |
if (info == NULL) { |
fFontType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font; |
@@ -864,6 +896,14 @@ |
} else { |
fFontType = info->fType; |
} |
+ |
+ // we want fTypeface to always ref a valid typeface, so if the caller |
+ // gave us null, we ref the default. |
+ if (typeface) { |
+ typeface->ref(); |
+ } else { |
+ fTypeface.reset(SkTypeface::RefDefault()); |
+ } |
} |
// static |
@@ -1094,8 +1134,8 @@ |
} |
case SkAdvancedTypefaceMetrics::kCFF_Font: |
case SkAdvancedTypefaceMetrics::kType1CID_Font: { |
- SkAutoTUnref<SkStream> fontData( |
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()))); |
+ int ttcIndex; |
+ SkAutoTUnref<SkStream> fontData(typeface()->openStream(&ttcIndex)); |
SkAutoTUnref<SkPDFStream> fontStream( |
new SkPDFStream(fontData.get())); |
addResource(fontStream.get()); |
@@ -1134,11 +1174,7 @@ |
uint32_t* glyphs = (glyphIDs.count() == 1) ? NULL : glyphIDs.begin(); |
uint32_t glyphsCount = glyphs ? glyphIDs.count() : 0; |
SkAutoTUnref<SkAdvancedTypefaceMetrics> fontMetrics( |
- SkFontHost::GetAdvancedTypefaceMetrics( |
- SkTypeface::UniqueID(typeface()), |
- info, |
- glyphs, |
- glyphsCount)); |
+ typeface()->getAdvancedTypefaceMetrics(info, glyphs, glyphsCount)); |
setFontInfo(fontMetrics.get()); |
addFontDescriptor(0, &glyphIDs); |
} else { |
@@ -1227,8 +1263,8 @@ |
size_t header SK_INIT_TO_AVOID_WARNING; |
size_t data SK_INIT_TO_AVOID_WARNING; |
size_t trailer SK_INIT_TO_AVOID_WARNING; |
- SkAutoTUnref<SkStream> rawFontData( |
- SkFontHost::OpenStream(SkTypeface::UniqueID(typeface()))); |
+ int ttcIndex; |
+ SkAutoTUnref<SkStream> rawFontData(typeface()->openStream(&ttcIndex)); |
SkStream* fontData = handleType1Stream(rawFontData.get(), &header, &data, |
&trailer); |
if (fontData == NULL) { |