Improve the SkAdvancedTypefaceMetrics interface w.r.t. vertical advances.
authorvandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 30 Mar 2011 18:36:29 +0000 (18:36 +0000)
committervandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 30 Mar 2011 18:36:29 +0000 (18:36 +0000)
Add a template function to type safe-combine bits of a bit field.

Review URL: http://codereview.appspot.com/4313053

git-svn-id: http://skia.googlecode.com/svn/trunk@1020 2bbb7eff-a529-9590-31e7-b0007b416f81

13 files changed:
include/core/SkAdvancedTypefaceMetrics.h
include/core/SkFontHost.h
include/core/SkTypeface.h
include/core/SkTypes.h
src/core/SkTypeface.cpp
src/pdf/SkPDFFont.cpp
src/ports/SkFontHost_FONTPATH.cpp
src/ports/SkFontHost_FreeType.cpp
src/ports/SkFontHost_mac_atsui.cpp
src/ports/SkFontHost_mac_coretext.cpp
src/ports/SkFontHost_none.cpp
src/ports/SkFontHost_simple.cpp
src/ports/SkFontHost_win.cpp

index 033e738c8a82440e0d42769a7d7e88cd530d91c3..f536a5603f1e1049bc26116c952b144948de3b50 100644 (file)
@@ -76,6 +76,14 @@ public:
 
     SkIRect fBBox;  // The bounding box of all glyphs (in font units).
 
+    // The type of advance data wanted.
+    enum PerGlyphInfo {
+      kNo_PerGlyphInfo         = 0x0, // Don't populate any per glyph info.
+      kHAdvance_PerGlyphInfo   = 0x1, // Populate horizontal advance data.
+      kVAdvance_PerGlyphInfo   = 0x2, // Populate vertical advance data.
+      kGlyphNames_PerGlyphInfo = 0x4, // Populate glyph names (Type 1 only).
+    };
+
     template <typename Data>
     struct AdvanceMetric {
         enum MetricType {
index 3c6925130b2468e450f4c4fd1736f4b2698af6c9..72faed76c7cda64437f15ccaf1ae5a02d1bc59e7 100644 (file)
@@ -177,14 +177,14 @@ public:
     ///////////////////////////////////////////////////////////////////////////
 
     /** Retrieve detailed typeface metrics.  Used by the PDF backend.
-        @param perGlyphInfo Indicate if the glyph specific information.
-        @param perGlyphInfo Indicate if the glyph specific information (advances
-                            and names) should be populated.
+        @param perGlyphInfo Indicate what glyph specific information (advances,
+                            names, etc.) should be populated.
         @return The returned object has already been referenced.  NULL is
                 returned if the font is not found.
      */
     static SkAdvancedTypefaceMetrics* GetAdvancedTypefaceMetrics(
-            SkFontID fontID, bool perGlyphInfo);
+            SkFontID fontID,
+            SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo);
 
     /** Return the number of tables in the font
      */
index c3b0f50d18b62782e14a0cff7a6eeb71decb640e..abbde04a17283c6f4749dea477d947a7c94add49 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef SkTypeface_DEFINED
 #define SkTypeface_DEFINED
 
+#include "SkAdvancedTypefaceMetrics.h"
 #include "SkRefCnt.h"
 
 class SkStream;
@@ -136,10 +137,14 @@ public:
     static SkTypeface* Deserialize(SkStream*);
 
     /** Retrieve detailed typeface metrics.  Used by the PDF backend.
-        @param perGlyphInfo Indicate if the glyph specific information (advances
-                            and names) should be populated.
+        @param perGlyphInfo Indicate what glyph specific information (advances,
+                            names, etc.) should be populated.
         @return The returned object has already been referenced.
      */
+    SkAdvancedTypefaceMetrics* getAdvancedTypefaceMetrics(
+            SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) const;
+
+    // Temporary: for transition purposes.
     SkAdvancedTypefaceMetrics* getAdvancedTypefaceMetrics(
             bool perGlyphInfo) const;
 
index 1290935dee05c53921136fb3aa71b2a4749d2d71..1a3a2e50996ddbf3be4806fb622c384cae42544a 100644 (file)
@@ -318,6 +318,13 @@ static inline uint32_t SkSetClearMask(uint32_t bits, bool cond,
 
 ///////////////////////////////////////////////////////////////////////////////
 
+/** Use to combine multiple bits in a bitmask in a type safe way.
+ */
+template <typename T>
+T SkTBitOr(T a, T b) {
+    return (T)(a | b);
+}
+
 /**
  *  Use to cast a pointer to a different type, and maintaining strict-aliasing
  */
index 7eeaf19fc7e92cae6919adf521a624f3ccf08a9d..dc7ff891b78f5459713ba2703e138fa48fd09be1 100644 (file)
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include "SkAdvancedTypefaceMetrics.h"
 #include "SkTypeface.h"
 #include "SkFontHost.h"
 
@@ -76,6 +77,15 @@ SkTypeface* SkTypeface::Deserialize(SkStream* stream) {
 }
 
 SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
-        bool perGlyphInfo) const {
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) const {
     return SkFontHost::GetAdvancedTypefaceMetrics(fUniqueID, perGlyphInfo);
 }
+
+// Temporary: for transitions purposes only.
+SkAdvancedTypefaceMetrics* SkTypeface::getAdvancedTypefaceMetrics(
+        bool perGlyphInfo) const {
+    SkASSERT(!perGlyphInfo);
+    return SkFontHost::GetAdvancedTypefaceMetrics(
+            fUniqueID,
+            SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo);
+}
index 83caea57092db824927a71cca0ee196fc21f4724..9a2180d8c156fd32d40ac6f4457bc9dccf179db5 100644 (file)
@@ -28,6 +28,7 @@
 #include "SkScalar.h"
 #include "SkStream.h"
 #include "SkTypeface.h"
+#include "SkTypes.h"
 #include "SkUtils.h"
 
 namespace {
@@ -411,7 +412,9 @@ SkPDFFont* SkPDFFont::getFontResource(SkTypeface* typeface, uint16_t glyphID) {
         fontInfo = relatedFont->fFontInfo;
         fontDescriptor = relatedFont->fDescriptor.get();
     } else {
-        fontInfo = SkFontHost::GetAdvancedTypefaceMetrics(fontID, true);
+        fontInfo = SkFontHost::GetAdvancedTypefaceMetrics(fontID, SkTBitOr(
+                SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo,
+                SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo));
         SkSafeUnref(fontInfo.get());  // SkRefPtr and Get both took a reference.
     }
 
index 98f4ba5dc70fb6a1bb8c9ef9dc04663974d82a3a..afab8749f704b000b554d8ab6397ec1134d82ed9 100644 (file)
@@ -271,7 +271,8 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace,
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     sk_throw();  // not implemented
     return NULL;
 }
index 1c0b269fa75f06e19587c334f1490b5a4e6136d5..e058a362bb16bc1ee1bf39671a877fad57c10b19 100644 (file)
@@ -344,7 +344,8 @@ static bool getWidthAdvance(FT_Face face, int gId, int16_t* data) {
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
 #if defined(SK_BUILD_FOR_MAC) || defined(ANDROID)
     return NULL;
 #else
@@ -386,12 +387,6 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
         }
     }
 
-    SkASSERT(!FT_HAS_VERTICAL(face));
-#ifdef FT_IS_CID_KEYED
-    SkASSERT(FT_IS_CID_KEYED(face) ==
-             (info->fType == SkAdvancedTypefaceMetrics::kType1CID_Font));
-#endif
-
     info->fStyle = 0;
     if (FT_IS_FIXED_WIDTH(face))
         info->fStyle |= SkAdvancedTypefaceMetrics::kFixedPitch_Style;
@@ -463,8 +458,12 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
     info->fBBox = SkIRect::MakeLTRB(face->bbox.xMin, face->bbox.yMax,
                                     face->bbox.xMax, face->bbox.yMin);
 
-    if (perGlyphInfo && canEmbed(face) && FT_IS_SCALABLE(face) &&
-            info->fType != SkAdvancedTypefaceMetrics::kOther_Font) {
+    if (!canEmbed(face) || !FT_IS_SCALABLE(face) || 
+            info->fType == SkAdvancedTypefaceMetrics::kOther_Font) {
+        perGlyphInfo = SkAdvancedTypefaceMetrics::kNo_PerGlyphInfo;
+    }
+
+    if (perGlyphInfo & SkAdvancedTypefaceMetrics::kHAdvance_PerGlyphInfo) {
         if (FT_IS_FIXED_WIDTH(face)) {
             appendRange(&info->fGlyphWidths, 0);
             int16_t advance = face->max_advance_width;
@@ -492,18 +491,24 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
             info->fGlyphWidths.reset(
                 getAdvanceData(face, face->num_glyphs, &getWidthAdvance));
         }
+    }
 
-        if (info->fType == SkAdvancedTypefaceMetrics::kType1_Font) {
-            // Postscript fonts may contain more than 255 glyphs, so we end up
-            // using multiple font descriptions with a glyph ordering.  Record
-            // the name of each glyph.
-            info->fGlyphNames.reset(
-                    new SkAutoTArray<SkString>(face->num_glyphs));
-            for (int gID = 0; gID < face->num_glyphs; gID++) {
-                char glyphName[128];  // PS limit for names is 127 bytes.
-                FT_Get_Glyph_Name(face, gID, glyphName, 128);
-                info->fGlyphNames->get()[gID].set(glyphName);
-            }
+    if (perGlyphInfo & SkAdvancedTypefaceMetrics::kVAdvance_PerGlyphInfo &&
+            FT_HAS_VERTICAL(face)) {
+        SkASSERT(false);  // Not implemented yet.
+    }
+
+    if (perGlyphInfo & SkAdvancedTypefaceMetrics::kGlyphNames_PerGlyphInfo &&
+            info->fType == SkAdvancedTypefaceMetrics::kType1_Font) {
+        // Postscript fonts may contain more than 255 glyphs, so we end up
+        // using multiple font descriptions with a glyph ordering.  Record
+        // the name of each glyph.
+        info->fGlyphNames.reset(
+                new SkAutoTArray<SkString>(face->num_glyphs));
+        for (int gID = 0; gID < face->num_glyphs; gID++) {
+            char glyphName[128];  // PS limit for names is 127 bytes.
+            FT_Get_Glyph_Name(face, gID, glyphName, 128);
+            info->fGlyphNames->get()[gID].set(glyphName);
         }
     }
 
index 1d40a42a94ed3bf99951a36b5d88f62079a25436..5bc438a4b6e63e2993b52393bc74d8e477e91f7e 100644 (file)
@@ -481,7 +481,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[]) {
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
     return NULL;
 }
index 6ffe17b4034f0100241c93fbb8d32f8cd3032b94..5f75d19fc2b66a503f59464a06e232103c974c81 100644 (file)
@@ -676,7 +676,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(const char path[])
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
     return NULL;
 }
index d56c94aa5e5a0ae29f5609eb365febee7f33480d..91546f8043d77cc8e8fe2f880251c2019c8dcd39 100644 (file)
@@ -35,7 +35,8 @@ SkTypeface* SkFontHost::CreateTypefaceFromFile(char const*) {
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
     return NULL;
 }
index 60334e7856446eb913a8642ec69c0e0df8e72ca7..54d326efb25b38049ee832772df6d09892d7b976 100644 (file)
@@ -592,7 +592,8 @@ SkStream* SkFontHost::OpenStream(uint32_t fontID) {
 
 #if 0
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     SkASSERT(!"SkFontHost::GetAdvancedTypefaceMetrics unimplemented");
     return NULL;
 }
index e6f83c10e1489d406c80c8734b253bc692a483c3..d95bd80f6ed96fd4df7baa7099db6bbaaabb0356 100644 (file)
@@ -613,7 +613,8 @@ static bool getWidthAdvance(HDC hdc, int gId, int16_t* advance) {
 
 // static
 SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
-        uint32_t fontID, bool perGlyphInfo) {
+        uint32_t fontID,
+        SkAdvancedTypefaceMetrics::PerGlyphInfo perGlyphInfo) {
     SkAutoMutexAcquire ac(gFTMutex);
     LogFontTypeface* rec = LogFontTypeface::FindById(fontID);
     LOGFONT lf = rec->logFont();
@@ -721,7 +722,7 @@ SkAdvancedTypefaceMetrics* SkFontHost::GetAdvancedTypefaceMetrics(
     // If bit 2 is set, the embedding is read-only.
     if (otm.otmfsType & 0x1) {
         info->fType = SkAdvancedTypefaceMetrics::kNotEmbeddable_Font;
-    } else if (perGlyphInfo) {
+    } else if (perGlyphInfo & kHAdvance_PerGlyphInfo) {
         info->fGlyphWidths.reset(
             getAdvanceData(hdc, glyphCount, &getWidthAdvance));
     }