diff options
author | 2013-05-13 14:09:13 +0000 | |
---|---|---|
committer | 2013-05-13 14:09:13 +0000 | |
commit | c7a20e40938ae031368e3a9e4df33ce90a765aba (patch) | |
tree | 4add9484124ec6dd3893593f639575d6a9ccb3b3 /src | |
parent | 28ac96e40d705f7fb08a61ac027e15de8d91823c (diff) |
API modifications needed to upstream Android font changes.
Committed: http://code.google.com/p/skia/source/detail?r=9083
R=reed@google.com
Author: djsollen@google.com
Review URL: https://chromiumcodereview.appspot.com/14761003
git-svn-id: http://skia.googlecode.com/svn/trunk@9107 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkPaint.cpp | 30 | ||||
-rw-r--r-- | src/core/SkPaintOptionsAndroid.cpp | 42 | ||||
-rw-r--r-- | src/core/SkScalerContext.cpp | 12 | ||||
-rw-r--r-- | src/core/SkScalerContext.h | 11 | ||||
-rw-r--r-- | src/ports/SkFontHost_android.cpp | 9 |
5 files changed, 96 insertions, 8 deletions
diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 6c16428d81..193568effb 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -83,6 +83,7 @@ SkPaint::SkPaint() { fHinting = SkPaintDefaults_Hinting; fPrivFlags = 0; #ifdef SK_BUILD_FOR_ANDROID + new (&fPaintOptionsAndroid) SkPaintOptionsAndroid; fGenerationID = 0; #endif } @@ -141,11 +142,15 @@ SkPaint& SkPaint::operator=(const SkPaint& src) { SkSafeUnref(fAnnotation); #ifdef SK_BUILD_FOR_ANDROID + fPaintOptionsAndroid.~SkPaintOptionsAndroid(); + uint32_t oldGenerationID = fGenerationID; #endif memcpy(this, &src, sizeof(src)); #ifdef SK_BUILD_FOR_ANDROID fGenerationID = oldGenerationID + 1; + + new (&fPaintOptionsAndroid) SkPaintOptionsAndroid(src.fPaintOptionsAndroid); #endif return *this; @@ -180,14 +185,19 @@ uint32_t SkPaint::getGenerationID() const { void SkPaint::setGenerationID(uint32_t generationID) { fGenerationID = generationID; } -#endif -#ifdef SK_BUILD_FOR_ANDROID unsigned SkPaint::getBaseGlyphCount(SkUnichar text) const { SkAutoGlyphCache autoCache(*this, NULL, NULL); SkGlyphCache* cache = autoCache.getCache(); return cache->getBaseGlyphCount(text); } + +void SkPaint::setPaintOptionsAndroid(const SkPaintOptionsAndroid& options) { + if (options != fPaintOptionsAndroid) { + fPaintOptionsAndroid = options; + GEN_ID_INC; + } +} #endif void SkPaint::setHinting(Hinting hintingLevel) { @@ -1806,6 +1816,13 @@ void SkPaint::descriptorProc(const SkDeviceProperties* deviceProperties, rec.fMaskFormat = SkMask::kA8_Format; // force antialiasing when we do the scan conversion } +#ifdef SK_BUILD_FOR_ANDROID + SkOrderedWriteBuffer androidBuffer(128); + fPaintOptionsAndroid.flatten(androidBuffer); + descSize += androidBuffer.size(); + entryCount += 1; +#endif + /////////////////////////////////////////////////////////////////////////// // Now that we're done tweaking the rec, call the PostMakeRec cleanup SkScalerContext::PostMakeRec(*this, &rec); @@ -1818,6 +1835,10 @@ 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); } @@ -1852,6 +1873,11 @@ 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); diff --git a/src/core/SkPaintOptionsAndroid.cpp b/src/core/SkPaintOptionsAndroid.cpp new file mode 100644 index 0000000000..7bf6fc44cd --- /dev/null +++ b/src/core/SkPaintOptionsAndroid.cpp @@ -0,0 +1,42 @@ + +/* + * 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. + */ + +#ifdef SK_BUILD_FOR_ANDROID + +#include "SkPaintOptionsAndroid.h" +#include "SkFlattenableBuffers.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 "-.*" + char* parentTagEnd = strrchr(tag, '-'); + if (parentTagEnd == NULL) { + return SkLanguage(); + } + size_t parentTagLen = parentTagEnd - tag; + return SkLanguage(tag, parentTagLen); +} + +void SkPaintOptionsAndroid::flatten(SkFlattenableWriteBuffer& buffer) const { + buffer.writeUInt(fFontVariant); + buffer.writeString(fLanguage.getTag().c_str()); +} + +void SkPaintOptionsAndroid::unflatten(SkFlattenableReadBuffer& buffer) { + fFontVariant = (FontVariant)buffer.readUInt(); + char* tag = buffer.readString(); + fLanguage = SkLanguage(tag); + sk_free(tag); +} + +#endif diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index ba14908c2e..1f71bf0885 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -110,6 +110,15 @@ 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) { + SkOrderedReadBuffer buffer(data, len); + fPaintOptionsAndroid.unflatten(buffer); + SkASSERT(buffer.offset() == buffer.size()); + } +#endif } SkScalerContext::~SkScalerContext() { @@ -125,7 +134,8 @@ SkScalerContext::~SkScalerContext() { SkScalerContext* SkScalerContext::allocNextContext() const { #ifdef SK_BUILD_FOR_ANDROID SkTypeface* newFace = SkAndroidNextLogicalTypeface(fRec.fFontID, - fRec.fOrigFontID); + fRec.fOrigFontID, + fPaintOptionsAndroid); if (0 == newFace) { return NULL; } diff --git a/src/core/SkScalerContext.h b/src/core/SkScalerContext.h index d17b423496..06f5f94e17 100644 --- a/src/core/SkScalerContext.h +++ b/src/core/SkScalerContext.h @@ -14,6 +14,10 @@ #include "SkPaint.h" #include "SkTypeface.h" +#ifdef SK_BUILD_FOR_ANDROID + #include "SkPaintOptionsAndroid.h" +#endif + struct SkGlyph; class SkDescriptor; class SkMaskFilter; @@ -217,6 +221,10 @@ private: // never null SkAutoTUnref<SkTypeface> fTypeface; +#ifdef SK_BUILD_FOR_ANDROID + SkPaintOptionsAndroid fPaintOptionsAndroid; +#endif + // optional object, which may be null SkPathEffect* fPathEffect; SkMaskFilter* fMaskFilter; @@ -262,6 +270,9 @@ 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 /////////////////////////////////////////////////////////////////////////////// diff --git a/src/ports/SkFontHost_android.cpp b/src/ports/SkFontHost_android.cpp index ce478def6b..aeeec953d3 100644 --- a/src/ports/SkFontHost_android.cpp +++ b/src/ports/SkFontHost_android.cpp @@ -801,15 +801,15 @@ SkTypeface* SkFontHost::CreateTypeface(const SkTypeface* familyFace, return tf; } -SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, - SkFontID origFontID) { -#if defined(SK_BUILD_FOR_ANDROID) && !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) +SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, SkFontID origFontID, + const SkPaintOptionsAndroid& options) { +#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) // Skia does not support font fallback for ndk applications in order to // enable clients such as WebKit to customize their font selection. // Clients can use GetFallbackFamilyNameForChar() to get the fallback // font for individual characters. return NULL; -#else +#endif SkAutoMutexAcquire ac(gFamilyHeadAndNameListMutex); load_system_fonts(); @@ -845,7 +845,6 @@ SkTypeface* SkAndroidNextLogicalTypeface(SkFontID currFontID, // i.e. gFallbackFonts[0] != 0. const SkTypeface* firstTypeface = find_from_uniqueID(list[0]); return SkRef(find_typeface(firstTypeface, origTypeface->style())); -#endif } /////////////////////////////////////////////////////////////////////////////// |