diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-21 18:22:00 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-03-21 18:22:00 +0000 |
commit | 2cdc6713fb04c46ecbc73a724029a8b266004ddf (patch) | |
tree | 857570266690e36073caca4b41f7c3c1d050d2bc /src | |
parent | 9ae78506bd316683f94ded335be553d5399f742d (diff) |
add virtual SkTypeface::onOpenStream and override that for fontconfig
(other ports to follow)
When this is complete, we will be able to remove from SkFontHost
- OpenStream
- GetFileName
Review URL: https://codereview.chromium.org/12988002
git-svn-id: http://skia.googlecode.com/svn/trunk@8299 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkTypeface.cpp | 19 | ||||
-rw-r--r-- | src/ports/SkFontHost_FreeType.cpp | 23 | ||||
-rw-r--r-- | src/ports/SkFontHost_fontconfig.cpp | 43 |
3 files changed, 36 insertions, 49 deletions
diff --git a/src/core/SkTypeface.cpp b/src/core/SkTypeface.cpp index 9f72faa3de..4a3dd4fe11 100644 --- a/src/core/SkTypeface.cpp +++ b/src/core/SkTypeface.cpp @@ -123,12 +123,12 @@ size_t SkTypeface::getTableData(SkFontTableTag tag, size_t offset, size_t length } SkStream* SkTypeface::openStream(int* ttcIndex) const { - if (ttcIndex) { - int32_t ndx = 0; - (void)SkFontHost::GetFileName(fUniqueID, NULL, 0, &ndx); - *ttcIndex = (int)ndx; + int ttcIndexStorage; + if (NULL == ttcIndex) { + // So our subclasses don't need to check for null param + ttcIndex = &ttcIndexStorage; } - return SkFontHost::OpenStream(fUniqueID); + return this->onOpenStream(ttcIndex); } int SkTypeface::getUnitsPerEm() const { @@ -155,6 +155,15 @@ int SkTypeface::onGetUPEM() const { return upem; } +SkStream* SkTypeface::onOpenStream(int* ttcIndex) const { + if (ttcIndex) { + int32_t ndx = 0; + (void)SkFontHost::GetFileName(fUniqueID, NULL, 0, &ndx); + *ttcIndex = (int)ndx; + } + return SkFontHost::OpenStream(fUniqueID); +} + int SkTypeface::onGetTableTags(SkFontTableTag tags[]) const { return 0; } size_t SkTypeface::onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const { return 0; } diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp index 4aaf31ba0c..e858759e35 100644 --- a/src/ports/SkFontHost_FreeType.cpp +++ b/src/ports/SkFontHost_FreeType.cpp @@ -260,7 +260,8 @@ SkFaceRec::SkFaceRec(SkStream* strm, uint32_t fontID) // Will return 0 on failure // Caller must lock gFTMutex before calling this function. -static SkFaceRec* ref_ft_face(uint32_t fontID) { +static SkFaceRec* ref_ft_face(const SkTypeface* typeface) { + const SkFontID fontID = typeface->uniqueID(); SkFaceRec* rec = gFaceRecHead; while (rec) { if (rec->fFontID == fontID) { @@ -271,10 +272,10 @@ static SkFaceRec* ref_ft_face(uint32_t fontID) { rec = rec->fNext; } - SkStream* strm = SkFontHost::OpenStream(fontID); + int face_index; + SkStream* strm = typeface->openStream(&face_index); if (NULL == strm) { - SkDEBUGF(("SkFontHost::OpenStream failed opening %x\n", fontID)); - return 0; + return NULL; } // this passes ownership of strm to the rec @@ -295,15 +296,11 @@ static SkFaceRec* ref_ft_face(uint32_t fontID) { args.stream = &rec->fFTStream; } - int face_index; - int length = SkFontHost::GetFileName(fontID, NULL, 0, &face_index); - FT_Error err = FT_Open_Face(gFTLibrary, &args, length ? face_index : 0, - &rec->fFace); - + FT_Error err = FT_Open_Face(gFTLibrary, &args, face_index, &rec->fFace); if (err) { // bad filename, try the default font fprintf(stderr, "ERROR: unable to open font '%x'\n", fontID); SkDELETE(rec); - return 0; + return NULL; } else { SkASSERT(rec->fFace); //fprintf(stderr, "Opened font '%s'\n", filename.c_str()); @@ -462,7 +459,7 @@ SkAdvancedTypefaceMetrics* SkTypeface_FreeType::onGetAdvancedTypefaceMetrics( libInit = gFTLibrary; } SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); - SkFaceRec* rec = ref_ft_face(this->uniqueID()); + SkFaceRec* rec = ref_ft_face(this); if (NULL == rec) return NULL; FT_Face face = rec->fFace; @@ -707,7 +704,7 @@ int SkTypeface_FreeType::onGetUPEM() const { libInit = gFTLibrary; } SkAutoTCallIProc<struct FT_LibraryRec_, FT_Done_FreeType> ftLib(libInit); - SkFaceRec *rec = ref_ft_face(this->uniqueID()); + SkFaceRec *rec = ref_ft_face(this); int unitsPerEm = 0; if (rec != NULL && rec->fFace != NULL) { @@ -733,7 +730,7 @@ SkScalerContext_FreeType::SkScalerContext_FreeType(SkTypeface* typeface, // load the font file fFTSize = NULL; fFace = NULL; - fFaceRec = ref_ft_face(fRec.fFontID); + fFaceRec = ref_ft_face(typeface); if (NULL == fFaceRec) { return; } diff --git a/src/ports/SkFontHost_fontconfig.cpp b/src/ports/SkFontHost_fontconfig.cpp index 52ecb316bb..ea0971018a 100644 --- a/src/ports/SkFontHost_fontconfig.cpp +++ b/src/ports/SkFontHost_fontconfig.cpp @@ -90,6 +90,7 @@ protected: virtual size_t onGetTableData(SkFontTableTag, size_t offset, size_t length, void* data) const SK_OVERRIDE; virtual void onGetFontDescriptor(SkFontDescriptor*) const SK_OVERRIDE; + virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE; private: typedef SkTypeface_FreeType INHERITED; @@ -244,8 +245,8 @@ SkTypeface* SkFontHost::Deserialize(SkStream* stream) { /////////////////////////////////////////////////////////////////////////////// -static SkStream* open_stream(const FontConfigTypeface* face, int* ttcIndex) { - SkStream* stream = face->getLocalStream(); +SkStream* FontConfigTypeface::onOpenStream(int* ttcIndex) const { + SkStream* stream = this->getLocalStream(); if (stream) { // TODO: fix issue 1176. // As of now open_stream will return a stream and unwind it, but the @@ -262,48 +263,28 @@ static SkStream* open_stream(const FontConfigTypeface* face, int* ttcIndex) { if (NULL == fci.get()) { return NULL; } - stream = fci->openStream(face->getIdentity()); - *ttcIndex = face->getIdentity().fTTCIndex; + stream = fci->openStream(this->getIdentity()); + *ttcIndex = this->getIdentity().fTTCIndex; } return stream; } -SkStream* SkFontHost::OpenStream(uint32_t id) { - FontConfigTypeface* face = (FontConfigTypeface*)SkTypefaceCache::FindByID(id); - if (NULL == face) { - return NULL; - } - - int ttcIndex; - // We should return ttcIndex from this call. - return open_stream(face, &ttcIndex); +SkStream* SkFontHost::OpenStream(uint32_t) { + SkASSERT(!"SkFontHost::OpenStream is DEPRECATED: call SkTypeface::openStream\n"); + return NULL; } size_t SkFontHost::GetFileName(SkFontID fontID, char path[], size_t length, int32_t* index) { - FontConfigTypeface* face = (FontConfigTypeface*)SkTypefaceCache::FindByID(fontID); - if (NULL == face || face->getLocalStream()) { - return 0; - } - - // Here we cheat, and "know" what is in the identity fields. - - const SkString& filename = face->getIdentity().fString; - if (index) { - *index = face->getIdentity().fTTCIndex; - } - if (path) { - size_t len = SkMin32(length, filename.size()); - memcpy(path, filename.c_str(), len); - } - return filename.size(); + SkASSERT(!"SkFontHost::GetFileName is DEPRECATED: call SkTypeface::openStream\n"); + return 0; } /////////////////////////////////////////////////////////////////////////////// int FontConfigTypeface::onGetTableTags(SkFontTableTag tags[]) const { int ttcIndex; - SkAutoTUnref<SkStream> stream(open_stream(this, &ttcIndex)); + SkAutoTUnref<SkStream> stream(this->openStream(&ttcIndex)); return stream.get() ? SkFontStream::GetTableTags(stream, ttcIndex, tags) : 0; @@ -312,7 +293,7 @@ int FontConfigTypeface::onGetTableTags(SkFontTableTag tags[]) const { size_t FontConfigTypeface::onGetTableData(SkFontTableTag tag, size_t offset, size_t length, void* data) const { int ttcIndex; - SkAutoTUnref<SkStream> stream(open_stream(this, &ttcIndex)); + SkAutoTUnref<SkStream> stream(this->openStream(&ttcIndex)); return stream.get() ? SkFontStream::GetTableData(stream, ttcIndex, tag, offset, length, data) |