Index: src/pdf/SkPDFFont.cpp |
diff --git a/src/pdf/SkPDFFont.cpp b/src/pdf/SkPDFFont.cpp |
index 08c1289ce361b8f3fa1b3bbf34c0f66badf28547..a093f620cae62007d184453d363b69308d87204b 100644 |
--- a/src/pdf/SkPDFFont.cpp |
+++ b/src/pdf/SkPDFFont.cpp |
@@ -11,6 +11,7 @@ |
#include "SkGlyphCache.h" |
#include "SkPaint.h" |
#include "SkPDFCatalog.h" |
+#include "SkPDFCanon.h" |
#include "SkPDFDevice.h" |
#include "SkPDFFont.h" |
#include "SkPDFFontImpl.h" |
@@ -741,22 +742,9 @@ SkPDFGlyphSet* SkPDFGlyphSetMap::getGlyphSetForFont(SkPDFFont* font) { |
*/ |
SkPDFFont::~SkPDFFont() { |
- SkAutoMutexAcquire lock(CanonicalFontsMutex()); |
- int index = -1; |
- for (int i = 0 ; i < CanonicalFonts().count() ; i++) { |
- if (CanonicalFonts()[i].fFont == this) { |
- index = i; |
- } |
- } |
- |
- SkDEBUGCODE(int indexFound;) |
- SkASSERT(index == -1 || |
- (Find(fTypeface->uniqueID(), |
- fFirstGlyphID, |
- &indexFound) && |
- index == indexFound)); |
- if (index >= 0) { |
- CanonicalFonts().removeShuffle(index); |
+ { |
+ SkAutoMutexAcquire lock(SkPDFCanon::GetFontMutex()); |
+ SkPDFCanon::GetCanon().removeFont(this); |
} |
fResources.unrefAll(); |
} |
@@ -817,24 +805,22 @@ int SkPDFFont::glyphsToPDFFontEncoding(uint16_t* glyphIDs, int numGlyphs) { |
// static |
SkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) { |
- SkAutoMutexAcquire lock(CanonicalFontsMutex()); |
- |
SkAutoResolveDefaultTypeface autoResolve(typeface); |
typeface = autoResolve.get(); |
- |
const uint32_t fontID = typeface->uniqueID(); |
- int relatedFontIndex; |
- if (Find(fontID, glyphID, &relatedFontIndex)) { |
- CanonicalFonts()[relatedFontIndex].fFont->ref(); |
- return CanonicalFonts()[relatedFontIndex].fFont; |
+ |
+ SkAutoMutexAcquire lock(SkPDFCanon::GetFontMutex()); |
+ SkPDFFont* relatedFont; |
+ SkPDFFont* pdfFont = |
+ SkPDFCanon::GetCanon().findFont(fontID, glyphID, &relatedFont); |
+ if (pdfFont) { |
+ return SkRef(pdfFont); |
} |
SkAutoTUnref<const SkAdvancedTypefaceMetrics> fontMetrics; |
SkPDFDict* relatedFontDescriptor = NULL; |
- if (relatedFontIndex >= 0) { |
- SkPDFFont* relatedFont = CanonicalFonts()[relatedFontIndex].fFont; |
- fontMetrics.reset(relatedFont->fontInfo()); |
- SkSafeRef(fontMetrics.get()); |
+ if (relatedFont) { |
+ fontMetrics.reset(SkSafeRef(relatedFont->fontInfo())); |
relatedFontDescriptor = relatedFont->getFontDescriptor(); |
// This only is to catch callers who pass invalid glyph ids. |
@@ -846,8 +832,7 @@ SkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) { |
if (fontType == SkAdvancedTypefaceMetrics::kType1CID_Font || |
fontType == SkAdvancedTypefaceMetrics::kTrueType_Font) { |
- CanonicalFonts()[relatedFontIndex].fFont->ref(); |
- return CanonicalFonts()[relatedFontIndex].fFont; |
+ return SkRef(relatedFont); |
} |
} else { |
SkAdvancedTypefaceMetrics::PerGlyphInfo info; |
@@ -874,8 +859,7 @@ SkPDFFont* SkPDFFont::GetFontResource(SkTypeface* typeface, uint16_t glyphID) { |
SkPDFFont* font = Create(fontMetrics.get(), typeface, glyphID, |
relatedFontDescriptor); |
- FontRec newEntry(font, fontID, font->fFirstGlyphID); |
- CanonicalFonts().push(newEntry); |
+ SkPDFCanon::GetCanon().addFont(font, fontID, font->fFirstGlyphID); |
return font; // Return the reference new SkPDFFont() created. |
} |
@@ -883,32 +867,6 @@ SkPDFFont* SkPDFFont::getFontSubset(const SkPDFGlyphSet*) { |
return NULL; // Default: no support. |
} |
-// static |
-SkTDArray<SkPDFFont::FontRec>& SkPDFFont::CanonicalFonts() { |
- SkPDFFont::CanonicalFontsMutex().assertHeld(); |
- static SkTDArray<FontRec> gCanonicalFonts; |
- return gCanonicalFonts; |
-} |
- |
-SK_DECLARE_STATIC_MUTEX(gCanonicalFontsMutex); |
-// static |
-SkBaseMutex& SkPDFFont::CanonicalFontsMutex() { |
- return gCanonicalFontsMutex; |
-} |
- |
-// static |
-bool SkPDFFont::Find(uint32_t fontID, uint16_t glyphID, int* index) { |
- // TODO(vandebo): Optimize this, do only one search? |
- FontRec search(NULL, fontID, glyphID); |
- *index = CanonicalFonts().find(search); |
- if (*index >= 0) { |
- return true; |
- } |
- search.fGlyphID = 0; |
- *index = CanonicalFonts().find(search); |
- return false; |
-} |
- |
SkPDFFont::SkPDFFont(const SkAdvancedTypefaceMetrics* info, |
SkTypeface* typeface, |
SkPDFDict* relatedFontDescriptor) |
@@ -1034,34 +992,6 @@ void SkPDFFont::adjustGlyphRangeForSingleByteEncoding(uint16_t glyphID) { |
} |
} |
-bool SkPDFFont::FontRec::operator==(const SkPDFFont::FontRec& b) const { |
- if (fFontID != b.fFontID) { |
- return false; |
- } |
- if (fFont != NULL && b.fFont != NULL) { |
- return fFont->fFirstGlyphID == b.fFont->fFirstGlyphID && |
- fFont->fLastGlyphID == b.fFont->fLastGlyphID; |
- } |
- if (fGlyphID == 0 || b.fGlyphID == 0) { |
- return true; |
- } |
- |
- if (fFont != NULL) { |
- return fFont->fFirstGlyphID <= b.fGlyphID && |
- b.fGlyphID <= fFont->fLastGlyphID; |
- } else if (b.fFont != NULL) { |
- return b.fFont->fFirstGlyphID <= fGlyphID && |
- fGlyphID <= b.fFont->fLastGlyphID; |
- } |
- return fGlyphID == b.fGlyphID; |
-} |
- |
-SkPDFFont::FontRec::FontRec(SkPDFFont* font, uint32_t fontID, uint16_t glyphID) |
- : fFont(font), |
- fFontID(fontID), |
- fGlyphID(glyphID) { |
-} |
- |
void SkPDFFont::populateToUnicodeTable(const SkPDFGlyphSet* subset) { |
if (fFontInfo == NULL || fFontInfo->fGlyphToUnicode.begin() == NULL) { |
return; |
@@ -1494,3 +1424,24 @@ bool SkPDFType3Font::populate(uint16_t glyphID) { |
populateToUnicodeTable(NULL); |
return true; |
} |
+ |
+SkPDFFont::Match SkPDFFont::IsMatch(SkPDFFont* existingFont, |
+ uint32_t existingFontID, |
+ uint16_t existingGlyphID, |
+ uint32_t searchFontID, |
+ uint16_t searchGlyphID) { |
+ if (existingFontID != searchFontID) { |
+ return SkPDFFont::kNot_Match; |
+ } |
+ if (existingGlyphID == 0 || searchGlyphID == 0) { |
+ return SkPDFFont::kExact_Match; |
+ } |
+ if (existingFont != NULL) { |
+ return (existingFont->fFirstGlyphID <= searchGlyphID && |
+ searchGlyphID <= existingFont->fLastGlyphID) |
+ ? SkPDFFont::kExact_Match |
+ : SkPDFFont::kRelated_Match; |
+ } |
+ return (existingGlyphID == searchGlyphID) ? SkPDFFont::kExact_Match |
+ : SkPDFFont::kRelated_Match; |
+} |