Force embedding full font when serializing pictures.
authormtklein <mtklein@chromium.org>
Thu, 11 Dec 2014 19:06:00 +0000 (11:06 -0800)
committerCommit bot <commit-bot@chromium.org>
Thu, 11 Dec 2014 19:06:00 +0000 (11:06 -0800)
We can't do this unconditionally or pipe will become stupidly slow.

DM's serialize mode fails subtly on Mac when we force embedding, so I've
#ifdef'd that away.  Other platforms look fine.

BUG=skia:

Review URL: https://codereview.chromium.org/796523002

include/core/SkTypeface.h
src/core/SkPictureData.cpp
src/core/SkTypeface.cpp

index c3ff3641b71b4a49561dee69861361ed54d1eca4..c2aa543ab2748003f018e7f5fe4ea5019da44b38 100644 (file)
@@ -137,6 +137,10 @@ public:
      */
     void serialize(SkWStream*) const;
 
+    /** Like serialize, but write the whole font (not just a signature) if possible.
+     */
+    void serializeForcingEmbedding(SkWStream*) const;
+
     /** Given the data previously written by serialize(), return a new instance
         to a typeface referring to the same font. If that font is not available,
         return null. If an instance is returned, the caller is responsible for
index 938274aceb4045b69d770974fc214f6a4693d349..7fc165d219d2962ffebce0ad2f677a5e7e5415ee 100644 (file)
@@ -180,7 +180,12 @@ void SkPictureData::WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec) {
     rec.copyToArray((SkRefCnt**)array);
 
     for (int i = 0; i < count; i++) {
+#ifdef SK_BUILD_FOR_UNIX
+        array[i]->serializeForcingEmbedding(stream);
+#else
+        // FIXME: Macs and Windows don't draw pixel-perfect if we embed fonts in the SKP.
         array[i]->serialize(stream);
+#endif
     }
 }
 
index c537d4aa2d8c46e9d78de06c346f1e0e89094a16..02d2bc89c01ecdebe8a01ccd4a93f3ae3ab2f4b1 100644 (file)
@@ -155,12 +155,26 @@ void SkTypeface::serialize(SkWStream* wstream) const {
     SkFontDescriptor desc(this->style());
     this->onGetFontDescriptor(&desc, &isLocal);
 
+    // Embed font data if it's a local font.
     if (isLocal && NULL == desc.getFontData()) {
         int ttcIndex;
         desc.setFontData(this->onOpenStream(&ttcIndex));
         desc.setFontIndex(ttcIndex);
     }
+    desc.serialize(wstream);
+}
+
+void SkTypeface::serializeForcingEmbedding(SkWStream* wstream) const {
+    bool ignoredIsLocal;
+    SkFontDescriptor desc(this->style());
+    this->onGetFontDescriptor(&desc, &ignoredIsLocal);
 
+    // Always embed font data.
+    if (NULL == desc.getFontData()) {
+        int ttcIndex;
+        desc.setFontData(this->onOpenStream(&ttcIndex));
+        desc.setFontIndex(ttcIndex);
+    }
     desc.serialize(wstream);
 }