Remove SkPaintOptionsAndroid
authorDerek Sollenberger <djsollen@google.com>
Wed, 6 Aug 2014 20:30:51 +0000 (16:30 -0400)
committerDerek Sollenberger <djsollen@google.com>
Wed, 6 Aug 2014 20:30:51 +0000 (16:30 -0400)
Review URL: https://codereview.chromium.org/447873003

15 files changed:
gyp/core.gypi
gyp/tests.gypi
include/core/SkPaint.h
include/core/SkPaintOptionsAndroid.h [deleted file]
include/core/SkPicture.h
include/core/SkReadBuffer.h
src/core/SkPaint.cpp
src/core/SkPaintOptionsAndroid.cpp [deleted file]
src/core/SkScalerContext.cpp
src/core/SkScalerContext.h
src/ports/SkFontConfigInterface_android.cpp
src/ports/SkFontConfigParser_android.cpp
src/ports/SkFontConfigParser_android.h
src/ports/SkFontMgr_android.cpp
tests/AndroidPaintTest.cpp [deleted file]

index da43a05ff137fd6e66c3da30c12400d632493115..0e86ea096c159bf64f67f921faebb171ce2a40a7 100644 (file)
         '<(skia_src_path)/core/SkMipMap.cpp',
         '<(skia_src_path)/core/SkPackBits.cpp',
         '<(skia_src_path)/core/SkPaint.cpp',
-        '<(skia_src_path)/core/SkPaintOptionsAndroid.cpp',
         '<(skia_src_path)/core/SkPaintPriv.cpp',
         '<(skia_src_path)/core/SkPaintPriv.h',
         '<(skia_src_path)/core/SkPatch.cpp',
index 035d4181b5b3524eebc3a2a04458b0a4ffa67907..544485feedbe42a19a6110174a7d493cac42badf 100644 (file)
@@ -46,7 +46,6 @@
 
     '../tests/AAClipTest.cpp',
     '../tests/ARGBImageEncoderTest.cpp',
-    '../tests/AndroidPaintTest.cpp',
     '../tests/AnnotationTest.cpp',
     '../tests/AsADashTest.cpp',
     '../tests/AtomicTest.cpp',
index 58cb160adaff7e0e11ed5cd0068f41edac4cceaa..1814cae29dba5b646b9d0a80364e64b3499ce033 100644 (file)
@@ -15,9 +15,6 @@
 #include "SkDrawLooper.h"
 #include "SkMatrix.h"
 #include "SkXfermode.h"
-#ifdef SK_BUILD_FOR_ANDROID
-#include "SkPaintOptionsAndroid.h"
-#endif
 
 class SkAnnotation;
 class SkAutoGlyphCache;
@@ -941,11 +938,6 @@ public:
 #ifdef SK_BUILD_FOR_ANDROID
     uint32_t getGenerationID() const;
     void setGenerationID(uint32_t generationID);
-
-    const SkPaintOptionsAndroid& getPaintOptionsAndroid() const {
-        return fPaintOptionsAndroid;
-    }
-    void setPaintOptionsAndroid(const SkPaintOptionsAndroid& options);
 #endif
 
     // returns true if the paint's settings (e.g. xfermode + alpha) resolve to
@@ -1138,8 +1130,6 @@ private:
     friend class SkCanonicalizePaint;
 
 #ifdef SK_BUILD_FOR_ANDROID
-    SkPaintOptionsAndroid fPaintOptionsAndroid;
-
     // In order for the == operator to work properly this must be the last field
     // in the struct so that we can do a memcmp to this field's offset.
     uint32_t        fGenerationID;
diff --git a/include/core/SkPaintOptionsAndroid.h b/include/core/SkPaintOptionsAndroid.h
deleted file mode 100644 (file)
index 4d0bae3..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-
-/*
- * Copyright 2012 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-
-#ifndef SkPaintOptionsAndroid_DEFINED
-#define SkPaintOptionsAndroid_DEFINED
-
-#include "SkTypes.h"
-#include "SkString.h"
-
-class SkReadBuffer;
-class SkWriteBuffer;
-
-/** \class SkLanguage
-
-    The SkLanguage class represents a human written language, and is used by
-    text draw operations to determine which glyph to draw when drawing
-    characters with variants (ie Han-derived characters).
-*/
-class SkLanguage {
-public:
-    SkLanguage() { }
-    SkLanguage(const SkString& tag) : fTag(tag) { }
-    SkLanguage(const char* tag) : fTag(tag) { }
-    SkLanguage(const char* tag, size_t len) : fTag(tag, len) { }
-    SkLanguage(const SkLanguage& b) : fTag(b.fTag) { }
-
-    /** Gets a BCP 47 language identifier for this SkLanguage.
-        @return a BCP 47 language identifier representing this language
-    */
-    const SkString& getTag() const { return fTag; }
-
-    /** Performs BCP 47 fallback to return an SkLanguage one step more general.
-        @return an SkLanguage one step more general
-    */
-    SkLanguage getParent() const;
-
-    bool operator==(const SkLanguage& b) const {
-        return fTag == b.fTag;
-    }
-    bool operator!=(const SkLanguage& b) const {
-        return fTag != b.fTag;
-    }
-    SkLanguage& operator=(const SkLanguage& b) {
-        fTag = b.fTag;
-        return *this;
-    }
-
-private:
-    //! BCP 47 language identifier
-    SkString fTag;
-};
-
-class SkPaintOptionsAndroid {
-public:
-    SkPaintOptionsAndroid() {
-        fFontVariant = kDefault_Variant;
-    }
-
-    SkPaintOptionsAndroid& operator=(const SkPaintOptionsAndroid& b) {
-        fLanguage = b.fLanguage;
-        fFontVariant = b.fFontVariant;
-        return *this;
-    }
-
-    bool operator==(const SkPaintOptionsAndroid& b) const {
-        return !(*this != b);
-    }
-
-    bool operator!=(const SkPaintOptionsAndroid& b) const {
-        return fLanguage != b.fLanguage ||
-               fFontVariant != b.fFontVariant;
-    }
-
-    void flatten(SkWriteBuffer&) const;
-    void unflatten(SkReadBuffer&);
-
-    /** Return the paint's language value used for drawing text.
-        @return the paint's language value used for drawing text.
-    */
-    const SkLanguage& getLanguage() const { return fLanguage; }
-
-    /** Set the paint's language value used for drawing text.
-        @param language set the paint's language value for drawing text.
-    */
-    void setLanguage(const SkLanguage& language) { fLanguage = language; }
-    void setLanguage(const char* languageTag) { fLanguage = SkLanguage(languageTag); }
-
-
-    enum FontVariant {
-       kDefault_Variant = 0x01,
-       kCompact_Variant = 0x02,
-       kElegant_Variant = 0x04,
-       kLast_Variant = kElegant_Variant,
-    };
-
-    /** Return the font variant
-        @return the font variant used by this paint object
-    */
-    FontVariant getFontVariant() const { return fFontVariant; }
-
-    /** Set the font variant
-      @param fontVariant set the paint's font variant for choosing fonts
-    */
-    void setFontVariant(FontVariant fontVariant) {
-        SkASSERT((unsigned)fontVariant <= kLast_Variant);
-        fFontVariant = fontVariant;
-    }
-
-private:
-    SkLanguage fLanguage;
-    FontVariant fFontVariant;
-};
-
-#endif // #ifndef SkPaintOptionsAndroid_DEFINED
index c733e532c291bb64bb5eb52c42991d4ae57e56d1..e0a425f8073d4beba56789f29cf3276e16c2a314 100644 (file)
@@ -231,13 +231,14 @@ private:
     // V29: Removed SaveFlags parameter from save().
     // V30: Remove redundant SkMatrix from SkLocalMatrixShader.
     // V31: Add a serialized UniqueID to SkImageFilter.
+    // V32: Removed SkPaintOptionsAndroid from SkPaint
 
     // Note: If the picture version needs to be increased then please follow the
     // steps to generate new SKPs in (only accessible to Googlers): http://goo.gl/qATVcw
 
     // Only SKPs within the min/current picture version range (inclusive) can be read.
     static const uint32_t MIN_PICTURE_VERSION = 19;
-    static const uint32_t CURRENT_PICTURE_VERSION = 31;
+    static const uint32_t CURRENT_PICTURE_VERSION = 32;
 
     mutable uint32_t      fUniqueID;
 
index 2beb7ac738de19edd0564b15b9b542deebb302b9..a7606145853494b951214d380f83411f9a43fca2 100644 (file)
@@ -47,6 +47,7 @@ public:
         kNoMoreBitmapFlatten_Version       = 28,
         kSimplifyLocalMatrix_Version       = 30,
         kImageFilterUniqueID_Version       = 31,
+        kRemoveAndroidPaintOpts_Version    = 32,
     };
 
     /**
index 9e53d19e2a31575a11879d84f3074567fe38e7f6..3dd87b7aa6f84b4f0214d8137061dda115907e34 100644 (file)
@@ -21,7 +21,6 @@
 #include "SkReadBuffer.h"
 #include "SkWriteBuffer.h"
 #include "SkPaintDefaults.h"
-#include "SkPaintOptionsAndroid.h"
 #include "SkPathEffect.h"
 #include "SkRasterizer.h"
 #include "SkScalar.h"
@@ -55,7 +54,6 @@ enum {
     kImageFilter_DirtyBit         = 1 << 13,
     kTypeface_DirtyBit            = 1 << 14,
     kAnnotation_DirtyBit          = 1 << 15,
-    kPaintOptionsAndroid_DirtyBit = 1 << 16,
 };
 
 // define this to get a printf for out-of-range parameter in setters
@@ -101,7 +99,6 @@ SkPaint::SkPaint() {
 
     fDirtyBits    = 0;
 #ifdef SK_BUILD_FOR_ANDROID
-    new (&fPaintOptionsAndroid) SkPaintOptionsAndroid;
     fGenerationID = 0;
 #endif
 }
@@ -131,7 +128,6 @@ SkPaint::SkPaint(const SkPaint& src) {
     COPY(fDirtyBits);
 
 #ifdef SK_BUILD_FOR_ANDROID
-    new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid);
     COPY(fGenerationID);
 #endif
 
@@ -183,8 +179,6 @@ SkPaint& SkPaint::operator=(const SkPaint& src) {
     COPY(fDirtyBits);
 
 #ifdef SK_BUILD_FOR_ANDROID
-    fPaintOptionsAndroid.~SkPaintOptionsAndroid();
-    new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid);
     ++fGenerationID;
 #endif
 
@@ -214,9 +208,6 @@ bool operator==(const SkPaint& a, const SkPaint& b) {
         && EQUAL(fWidth)
         && EQUAL(fMiterLimit)
         && EQUAL(fBitfieldsUInt)
-#ifdef SK_BUILD_FOR_ANDROID
-        && EQUAL(fPaintOptionsAndroid)
-#endif
         ;
 #undef EQUAL
 }
@@ -241,14 +232,6 @@ uint32_t SkPaint::getGenerationID() const {
 void SkPaint::setGenerationID(uint32_t generationID) {
     fGenerationID = generationID;
 }
-
-void SkPaint::setPaintOptionsAndroid(const SkPaintOptionsAndroid& options) {
-    if (options != fPaintOptionsAndroid) {
-        fPaintOptionsAndroid = options;
-        GEN_ID_INC;
-        fDirtyBits |= kPaintOptionsAndroid_DirtyBit;
-    }
-}
 #endif
 
 void SkPaint::setFilterLevel(FilterLevel level) {
@@ -1843,14 +1826,6 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
         rec.fMaskFormat = SkMask::kA8_Format;   // force antialiasing when we do the scan conversion
     }
 
-#ifdef SK_BUILD_FOR_ANDROID
-    char buffer[128];
-    SkWriteBuffer androidBuffer(buffer, sizeof(buffer));
-    fPaintOptionsAndroid.flatten(androidBuffer);
-    descSize += androidBuffer.bytesWritten();
-    entryCount += 1;
-#endif
-
     ///////////////////////////////////////////////////////////////////////////
     // Now that we're done tweaking the rec, call the PostMakeRec cleanup
     SkScalerContext::PostMakeRec(*this, &rec);
@@ -1863,10 +1838,6 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
     desc->init();
     desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
 
-#ifdef SK_BUILD_FOR_ANDROID
-    add_flattenable(desc, kAndroidOpts_SkDescriptorTag, &androidBuffer);
-#endif
-
     if (pe) {
         add_flattenable(desc, kPathEffect_SkDescriptorTag, &peBuffer);
     }
@@ -1901,11 +1872,6 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties,
         desc1->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
         desc2->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
 
-#ifdef SK_BUILD_FOR_ANDROID
-        add_flattenable(desc1, kAndroidOpts_SkDescriptorTag, &androidBuffer);
-        add_flattenable(desc2, kAndroidOpts_SkDescriptorTag, &androidBuffer);
-#endif
-
         if (pe) {
             add_flattenable(desc1, kPathEffect_SkDescriptorTag, &peBuffer);
             add_flattenable(desc2, kPathEffect_SkDescriptorTag, &peBuffer);
@@ -2122,11 +2088,6 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const {
         asint(this->getImageFilter())) {
         flatFlags |= kHasEffects_FlatFlag;
     }
-#ifdef SK_BUILD_FOR_ANDROID
-    if (this->getPaintOptionsAndroid() != SkPaintOptionsAndroid()) {
-        flatFlags |= kHasNonDefaultPaintOptionsAndroid_FlatFlag;
-    }
-#endif
 
     SkASSERT(SkAlign4(kPODPaintSize) == kPODPaintSize);
     uint32_t* ptr = buffer.reserve(kPODPaintSize);
@@ -2165,11 +2126,6 @@ void SkPaint::flatten(SkWriteBuffer& buffer) const {
             buffer.writeBool(false);
         }
     }
-#ifdef SK_BUILD_FOR_ANDROID
-    if (flatFlags & kHasNonDefaultPaintOptionsAndroid_FlatFlag) {
-        this->getPaintOptionsAndroid().flatten(buffer);
-    }
-#endif
 }
 
 void SkPaint::unflatten(SkReadBuffer& buffer) {
@@ -2228,15 +2184,12 @@ void SkPaint::unflatten(SkReadBuffer& buffer) {
         this->setImageFilter(NULL);
     }
 
-#ifdef SK_BUILD_FOR_ANDROID
-    this->setPaintOptionsAndroid(SkPaintOptionsAndroid());
-#endif
-    if (flatFlags & kHasNonDefaultPaintOptionsAndroid_FlatFlag) {
-        SkPaintOptionsAndroid options;
-        options.unflatten(buffer);
-#ifdef SK_BUILD_FOR_ANDROID
-        this->setPaintOptionsAndroid(options);
-#endif
+    if (buffer.isVersionLT(SkReadBuffer::kRemoveAndroidPaintOpts_Version) &&
+            flatFlags & kHasNonDefaultPaintOptionsAndroid_FlatFlag) {
+        SkString tag;
+        buffer.readUInt();
+        buffer.readString(&tag);
+        buffer.readBool();
     }
 }
 
@@ -2695,9 +2648,6 @@ void SkPaint::FlatteningTraits::Flatten(SkWriteBuffer& buffer, const SkPaint& pa
 #undef F
     if (dirty & kTypeface_DirtyBit) buffer.writeTypeface(paint.getTypeface());
     if (dirty & kAnnotation_DirtyBit) paint.getAnnotation()->writeToBuffer(buffer);
-#ifdef SK_BUILD_FOR_ANDROID
-    if (dirty & kPaintOptionsAndroid_DirtyBit) paint.getPaintOptionsAndroid().flatten(buffer);
-#endif
 }
 
 void SkPaint::FlatteningTraits::Unflatten(SkReadBuffer& buffer, SkPaint* paint) {
@@ -2732,12 +2682,5 @@ void SkPaint::FlatteningTraits::Unflatten(SkReadBuffer& buffer, SkPaint* paint)
     if (dirty & kAnnotation_DirtyBit) {
         paint->setAnnotation(SkAnnotation::Create(buffer))->unref();
     }
-#ifdef SK_BUILD_FOR_ANDROID
-    if (dirty & kPaintOptionsAndroid_DirtyBit) {
-        SkPaintOptionsAndroid options;
-        options.unflatten(buffer);
-        paint->setPaintOptionsAndroid(options);
-    }
-#endif
     SkASSERT(dirty == paint->fDirtyBits);
 }
diff --git a/src/core/SkPaintOptionsAndroid.cpp b/src/core/SkPaintOptionsAndroid.cpp
deleted file mode 100644 (file)
index df71ca8..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/*
- * Copyright 2012 The Android Open Source Project
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include "SkPaintOptionsAndroid.h"
-#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
-#include "SkTDict.h"
-#include "SkThread.h"
-#include <cstring>
-
-SkLanguage SkLanguage::getParent() const {
-    SkASSERT(!fTag.isEmpty());
-    const char* tag = fTag.c_str();
-
-    // strip off the rightmost "-.*"
-    const char* parentTagEnd = strrchr(tag, '-');
-    if (parentTagEnd == NULL) {
-        return SkLanguage();
-    }
-    size_t parentTagLen = parentTagEnd - tag;
-    return SkLanguage(tag, parentTagLen);
-}
-
-void SkPaintOptionsAndroid::flatten(SkWriteBuffer& buffer) const {
-    buffer.writeUInt(fFontVariant);
-    buffer.writeString(fLanguage.getTag().c_str());
-    // to maintain picture compatibility for the old fUseFontFallbacks variable
-    buffer.writeBool(false);
-}
-
-void SkPaintOptionsAndroid::unflatten(SkReadBuffer& buffer) {
-    fFontVariant = (FontVariant)buffer.readUInt();
-    SkString tag;
-    buffer.readString(&tag);
-    fLanguage = SkLanguage(tag);
-    // to maintain picture compatibility for the old fUseFontFallbacks variable
-    buffer.readBool();
-}
index 11208fec599bad1ca0dfeef7f3bab9c23f00dc96..db3c0fb2f57e04c4aa490fb95638fd393d4b0d42 100644 (file)
 #include "SkStroke.h"
 #include "SkThread.h"
 
-#ifdef SK_BUILD_FOR_ANDROID
-    #include "SkTypeface_android.h"
-#endif
-
 #define ComputeBWRowBytes(width)        (((unsigned)(width) + 7) >> 3)
 
 void SkGlyph::toMask(SkMask* mask) const {
@@ -111,15 +107,6 @@ SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkDescriptor* desc)
              desc->findEntry(kPathEffect_SkDescriptorTag, NULL),
         desc->findEntry(kMaskFilter_SkDescriptorTag, NULL));
 #endif
-#ifdef SK_BUILD_FOR_ANDROID
-    uint32_t len;
-    const void* data = desc->findEntry(kAndroidOpts_SkDescriptorTag, &len);
-    if (data) {
-        SkReadBuffer buffer(data, len);
-        fPaintOptionsAndroid.unflatten(buffer);
-        SkASSERT(buffer.offset() == buffer.size());
-    }
-#endif
 }
 
 SkScalerContext::~SkScalerContext() {
index 43b5ebfaf6a71f8ad7f18f42f60493674ea15a3f..609e9dd673672950583e032ad2cbd53da93ec7f4 100644 (file)
 #include "SkPaint.h"
 #include "SkTypeface.h"
 
-#ifdef SK_BUILD_FOR_ANDROID
-    #include "SkPaintOptionsAndroid.h"
-#endif
-
 struct SkGlyph;
 class SkDescriptor;
 class SkMaskFilter;
@@ -262,10 +258,6 @@ private:
     // never null
     SkAutoTUnref<SkTypeface> fTypeface;
 
-#ifdef SK_BUILD_FOR_ANDROID
-    SkPaintOptionsAndroid fPaintOptionsAndroid;
-#endif
-
     // optional object, which may be null
     SkPathEffect*   fPathEffect;
     SkMaskFilter*   fMaskFilter;
@@ -297,9 +289,6 @@ private:
 #define kPathEffect_SkDescriptorTag     SkSetFourByteTag('p', 't', 'h', 'e')
 #define kMaskFilter_SkDescriptorTag     SkSetFourByteTag('m', 's', 'k', 'f')
 #define kRasterizer_SkDescriptorTag     SkSetFourByteTag('r', 'a', 's', 't')
-#ifdef SK_BUILD_FOR_ANDROID
-#define kAndroidOpts_SkDescriptorTag    SkSetFourByteTag('a', 'n', 'd', 'r')
-#endif
 
 ///////////////////////////////////////////////////////////////////////////////
 
index 1651ac9c05eaf4694d82686b7148ad1d43212657..af0c0ebdbe1ffd9876723365a2323aa80f95e94b 100644 (file)
@@ -69,7 +69,8 @@ struct FamilyRec {
     FontRecID fFontRecID[FONT_STYLE_COUNT];
     bool fIsFallbackFont;
     SkString fFallbackName;
-    SkPaintOptionsAndroid fPaintOptions;
+    SkLanguage fLanguage;
+    FontVariant fVariant;
 };
 
 
@@ -252,12 +253,8 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily*
                 fontRec.fFamilyRecID = familyRecID;
 
                 familyRec->fIsFallbackFont = family->fIsFallbackFont;
-                familyRec->fPaintOptions = family->fFontFiles[j].fPaintOptions;
-
-            } else if (familyRec->fPaintOptions != family->fFontFiles[j].fPaintOptions) {
-                SkDebugf("Every font file within a family must have identical"
-                         "language and variant attributes");
-                sk_throw();
+                familyRec->fLanguage = family->fLanguage;
+                familyRec->fVariant = family->fVariant;
             }
 
             // add this font to the current familyRec
@@ -305,7 +302,7 @@ SkFontConfigInterfaceAndroid::SkFontConfigInterfaceAndroid(SkTDArray<FontFamily*
     while(fallbackLang != NULL) {
         for (int i = 0; i < fDefaultFallbackList.count(); i++) {
             FamilyRecID familyRecID = fDefaultFallbackList[i];
-            const SkString& fontLang = fFontFamilies[familyRecID].fPaintOptions.getLanguage().getTag();
+            const SkString& fontLang = fFontFamilies[familyRecID].fLanguage.getTag();
             if (strcmp(fallbackLang, fontLang.c_str()) != 0) {
                 fallbackList->push(familyRecID);
             }
@@ -340,7 +337,7 @@ void SkFontConfigInterfaceAndroid::addFallbackFamily(FamilyRecID familyRecID) {
     fDefaultFallbackList.push(familyRecID);
 
     // stop here if it is the default language tag
-    const SkString& languageTag = familyRec.fPaintOptions.getLanguage().getTag();
+    const SkString& languageTag = familyRec.fLanguage.getTag();
     if (languageTag.isEmpty()) {
         return;
     }
@@ -511,9 +508,9 @@ bool SkFontConfigInterfaceAndroid::getFallbackFamilyNameForChar(SkUnichar uni,
         FamilyRecID familyRecID = fallbackFontList->getAt(i);
 
         // if it is not one of the accepted variants then move to the next family
-        int32_t acceptedVariants = SkPaintOptionsAndroid::kDefault_Variant |
-                                   SkPaintOptionsAndroid::kElegant_Variant;
-        if (!(fFontFamilies[familyRecID].fPaintOptions.getFontVariant() & acceptedVariants)) {
+        int32_t acceptedVariants = kDefault_FontVariant |
+                                   kElegant_FontVariant;
+        if (!(fFontFamilies[familyRecID].fVariant & acceptedVariants)) {
             continue;
         }
 
index 10212e8a07e7fdc420da6c51d4fe5c2a2812fffc..58aec2d01f6b1756fa5b7c36c0c9c98a09f818da 100644 (file)
@@ -97,9 +97,9 @@ void familyElementHandler(FontFamily* family, const char** attributes) {
         } else if (nameLen == 7 && !strncmp("variant", name, nameLen)) {
             // Value should be either elegant or compact.
             if (valueLen == 7 && !strncmp("elegant", value, valueLen)) {
-                family->fVariant = SkPaintOptionsAndroid::kElegant_Variant;
+                family->fVariant = kElegant_FontVariant;
             } else if (valueLen == 7 && !strncmp("compact", value, valueLen)) {
-                family->fVariant = SkPaintOptionsAndroid::kCompact_Variant;
+                family->fVariant = kCompact_FontVariant;
             }
         }
     }
@@ -110,13 +110,6 @@ void fontFileNameHandler(void *data, const char *s, int len) {
     familyData->currentFontInfo->fFileName.set(s, len);
 }
 
-void familyElementEndHandler(FontFamily* family) {
-    for (int i = 0; i < family->fFontFiles.count(); i++) {
-        family->fFontFiles[i].fPaintOptions.setLanguage(family->fLanguage);
-        family->fFontFiles[i].fPaintOptions.setFontVariant(family->fVariant);
-    }
-}
-
 void fontElementHandler(XML_Parser* parser, FontFileInfo* file, const char** attributes) {
     // A <font> should have weight (integer) and style (normal, italic) attributes.
     // NOTE: we ignore the style.
@@ -260,7 +253,6 @@ void endElementHandler(void* data, const char* tag) {
     if (len == 9 && strncmp(tag, "familyset", len) == 0) {
         familysetElementEndHandler(familyData);
     } else if (len == 6 && strncmp(tag, "family", len) == 0) {
-        familyElementEndHandler(familyData->currentFamily);
         *familyData->families.append() = familyData->currentFamily;
         familyData->currentFamily = NULL;
     } else if (len == 4 && !strncmp(tag, "font", len)) {
@@ -313,14 +305,27 @@ static void fontFileElementHandler(FamilyData *familyData, const char **attribut
             int nameLength = strlen(attributeName);
             int valueLength = strlen(attributeValue);
             if (nameLength == 7 && strncmp(attributeName, "variant", nameLength) == 0) {
+                const FontVariant prevVariant = familyData->currentFamily->fVariant;
                 if (valueLength == 7 && strncmp(attributeValue, "elegant", valueLength) == 0) {
-                    newFileInfo.fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant);
+                    familyData->currentFamily->fVariant = kElegant_FontVariant;
                 } else if (valueLength == 7 &&
                            strncmp(attributeValue, "compact", valueLength) == 0) {
-                    newFileInfo.fPaintOptions.setFontVariant(SkPaintOptionsAndroid::kCompact_Variant);
+                    familyData->currentFamily->fVariant = kCompact_FontVariant;
+                }
+                if (familyData->currentFamily->fFontFiles.count() > 1 &&
+                        familyData->currentFamily->fVariant != prevVariant) {
+                    SkDebugf("Every font file within a family must have identical variants");
+                    sk_throw();
                 }
+
             } else if (nameLength == 4 && strncmp(attributeName, "lang", nameLength) == 0) {
-                newFileInfo.fPaintOptions.setLanguage(attributeValue);
+                SkLanguage prevLang = familyData->currentFamily->fLanguage;
+                familyData->currentFamily->fLanguage = SkLanguage(attributeValue);
+                if (familyData->currentFamily->fFontFiles.count() > 1 &&
+                        familyData->currentFamily->fLanguage != prevLang) {
+                    SkDebugf("Every font file within a family must have identical languages");
+                    sk_throw();
+                }
             } else if (nameLength == 5 && strncmp(attributeName, "index", nameLength) == 0) {
                 int value;
                 if (parseNonNegativeInteger(attributeValue, &value)) {
@@ -489,9 +494,7 @@ static void getFallbackFontFamiliesForLocale(SkTDArray<FontFamily*> &fallbackFon
 
                 for (int i = 0; i < langSpecificFonts.count(); ++i) {
                     FontFamily* family = langSpecificFonts[i];
-                    for (int j = 0; j < family->fFontFiles.count(); ++j) {
-                        family->fFontFiles[j].fPaintOptions.setLanguage(locale);
-                    }
+                    family->fLanguage = SkLanguage(locale);
                     *fallbackFonts.append() = family;
                 }
             }
@@ -569,3 +572,16 @@ void SkFontConfigParser::GetTestFontFamilies(SkTDArray<FontFamily*> &fontFamilie
         *fontFamilies.append() = fallbackFonts[i];
     }
 }
+
+SkLanguage SkLanguage::getParent() const {
+    SkASSERT(!fTag.isEmpty());
+    const char* tag = fTag.c_str();
+
+    // strip off the rightmost "-.*"
+    const char* parentTagEnd = strrchr(tag, '-');
+    if (parentTagEnd == NULL) {
+        return SkLanguage();
+    }
+    size_t parentTagLen = parentTagEnd - tag;
+    return SkLanguage(tag, parentTagLen);
+}
index 4df8d7e7252eeca9980b82322e669628257a3d01..5f9279f632be532f00b440202b3d999c5bb38a0f 100644 (file)
@@ -8,18 +8,62 @@
 #ifndef SKFONTCONFIGPARSER_ANDROID_H_
 #define SKFONTCONFIGPARSER_ANDROID_H_
 
-#include "SkTypes.h"
-
-#include "SkPaintOptionsAndroid.h"
 #include "SkString.h"
 #include "SkTDArray.h"
 
+/** \class SkLanguage
+
+    The SkLanguage class represents a human written language, and is used by
+    text draw operations to determine which glyph to draw when drawing
+    characters with variants (ie Han-derived characters).
+*/
+class SkLanguage {
+public:
+    SkLanguage() { }
+    SkLanguage(const SkString& tag) : fTag(tag) { }
+    SkLanguage(const char* tag) : fTag(tag) { }
+    SkLanguage(const char* tag, size_t len) : fTag(tag, len) { }
+    SkLanguage(const SkLanguage& b) : fTag(b.fTag) { }
+
+    /** Gets a BCP 47 language identifier for this SkLanguage.
+        @return a BCP 47 language identifier representing this language
+    */
+    const SkString& getTag() const { return fTag; }
+
+    /** Performs BCP 47 fallback to return an SkLanguage one step more general.
+        @return an SkLanguage one step more general
+    */
+    SkLanguage getParent() const;
+
+    bool operator==(const SkLanguage& b) const {
+        return fTag == b.fTag;
+    }
+    bool operator!=(const SkLanguage& b) const {
+        return fTag != b.fTag;
+    }
+    SkLanguage& operator=(const SkLanguage& b) {
+        fTag = b.fTag;
+        return *this;
+    }
+
+private:
+    //! BCP 47 language identifier
+    SkString fTag;
+};
+
+enum FontVariants {
+   kDefault_FontVariant = 0x01,
+   kCompact_FontVariant = 0x02,
+   kElegant_FontVariant = 0x04,
+   kLast_FontVariant = kElegant_FontVariant,
+};
+typedef uint32_t FontVariant;
+
 struct FontFileInfo {
     FontFileInfo() : fIndex(0), fWeight(0) { }
 
     SkString              fFileName;
     int                   fIndex;
-    SkPaintOptionsAndroid fPaintOptions;
     int                   fWeight;
 };
 
@@ -33,14 +77,14 @@ struct FontFileInfo {
  */
 struct FontFamily {
     FontFamily()
-        : fVariant(SkPaintOptionsAndroid::kDefault_Variant)
+        : fVariant(kDefault_FontVariant)
         , order(-1)
         , fIsFallbackFont(false) { }
 
     SkTArray<SkString>                 fNames;
     SkTArray<FontFileInfo>             fFontFiles;
     SkLanguage                         fLanguage;
-    SkPaintOptionsAndroid::FontVariant fVariant;
+    FontVariant                        fVariant;
     int                                order; // only used internally by SkFontConfigParser
     bool                               fIsFallbackFont;
 };
index 1ab2f29642a1147be1bc0404e43faf951f3af113..7ce7cb09b6363cd967c5b132fe382399054d5d28 100644 (file)
@@ -61,7 +61,7 @@ public:
                              bool isFixedPitch,
                              const SkString familyName,
                              const SkLanguage& lang,
-                             uint32_t variantStyle)
+                             FontVariant variantStyle)
         : INHERITED(index, style, isFixedPitch, familyName)
         , fPathName(pathName)
         , fLang(lang)
@@ -82,7 +82,7 @@ public:
 
     const SkString fPathName;
     const SkLanguage fLang;
-    const uint32_t fVariantStyle;
+    const FontVariant fVariantStyle;
 
     typedef SkTypeface_Android INHERITED;
 };
@@ -153,11 +153,10 @@ public:
                 continue;
             }
 
-            const SkLanguage& lang = fontFile.fPaintOptions.getLanguage();
-            uint32_t variant = fontFile.fPaintOptions.getFontVariant();
-            if (SkPaintOptionsAndroid::kDefault_Variant == variant) {
-                variant = SkPaintOptionsAndroid::kCompact_Variant |
-                          SkPaintOptionsAndroid::kElegant_Variant;
+            const SkLanguage& lang = family.fLanguage;
+            uint32_t variant = family.fVariant;
+            if (kDefault_FontVariant == variant) {
+                variant = kCompact_FontVariant | kElegant_FontVariant;
             }
 
             // The first specified family name overrides the family name found in the font.
@@ -335,7 +334,7 @@ protected:
         // TODO: add 'is_elegant' and 'is_compact' bits to 'style' request.
 
         // For compatibility, try 'elegant' fonts first in fallback.
-        uint32_t variantMask = SkPaintOptionsAndroid::kElegant_Variant;
+        uint32_t variantMask = kElegant_FontVariant;
 
         // The first time match anything in the mask, second time anything not in the mask.
         for (bool maskMatches = true; maskMatches != false; maskMatches = false) {
diff --git a/tests/AndroidPaintTest.cpp b/tests/AndroidPaintTest.cpp
deleted file mode 100644 (file)
index f5cf84f..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-// SkPaints only have an SkPaintOptionsAndroid if SK_BUILD_FOR_ANDROID is true.
-#ifdef SK_BUILD_FOR_ANDROID
-
-#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
-#include "SkPaint.h"
-#include "SkPaintOptionsAndroid.h"
-#include "Test.h"
-
-static size_t Reconstruct(const SkPaint& src, SkPaint* dst) {
-    SkWriteBuffer writer;
-    src.flatten(writer);
-
-    const size_t size = writer.bytesWritten();
-    SkAutoMalloc bytes(size);
-    writer.writeToMemory(bytes.get());
-
-    SkReadBuffer reader(bytes.get(), size);
-    dst->unflatten(reader);
-
-    return size;
-}
-
-DEF_TEST(AndroidOptionsSerialization, reporter) {
-    // We want to make sure that Android's paint options survive a flatten/unflatten round trip.
-    // These are all non-default options.
-    SkPaintOptionsAndroid options;
-    options.setLanguage("ja-JP");
-    options.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant);
-
-    SkPaint paint;
-    paint.setPaintOptionsAndroid(options);
-
-    SkPaint reconstructed;
-    Reconstruct(paint, &reconstructed);
-
-    REPORTER_ASSERT(reporter, options == reconstructed.getPaintOptionsAndroid());
-}
-
-DEF_TEST(AndroidOptionsSerializationReverse, reporter) {
-    // Opposite test of above: make sure the serialized default values of a paint overwrite
-    // non-default values on the paint we're unflattening into.
-    const SkPaint defaultOptions;
-
-    SkPaintOptionsAndroid options;
-    options.setLanguage("ja-JP");
-    options.setFontVariant(SkPaintOptionsAndroid::kElegant_Variant);
-    SkPaint nonDefaultOptions;
-    nonDefaultOptions.setPaintOptionsAndroid(options);
-
-    Reconstruct(defaultOptions, &nonDefaultOptions);
-
-    REPORTER_ASSERT(reporter,
-            defaultOptions.getPaintOptionsAndroid() ==
-            nonDefaultOptions.getPaintOptionsAndroid());
-}
-
-DEF_TEST(AndroidOptionsSize, reporter) {
-    // A paint with default android options should serialize to something smaller than
-    // a paint with non-default android options.
-
-    SkPaint defaultOptions;
-
-    SkPaintOptionsAndroid options;
-    options.setLanguage("ja-JP");
-    SkPaint nonDefaultOptions;
-    nonDefaultOptions.setPaintOptionsAndroid(options);
-
-    SkPaint dummy;
-
-    REPORTER_ASSERT(reporter,
-                    Reconstruct(defaultOptions, &dummy) < Reconstruct(nonDefaultOptions, &dummy));
-}
-
-#endif  // SK_BUILD_FOR_ANDROID