DO NOT MERGE Han Preference
Cherry-pick Ib5dd86950156c5a438f25c289acb839206bb455a from master. Data: label MTLmr3m with "ja" locale attribute, fallback_fonts-ja.xml removed, as we only need a single fallback font file Code: Add locale and variant to TextLayoutCache. Paint.java sets textLocale as the language (for example, "ja") rather than the language/locale concatenated (for example "ja_JP") This checkin, along with Change-Id: Id8c91ae0be6cad8a7ef77a0cd5803676290986c1, allows text view objects to set their locale dynamically and skia will use the correct font for the locale. Change-Id: Ieb60b0d7a39fcfef4f8ce90cd4f6065d33673710
This commit is contained in:
committed by
Victoria Lease
parent
bf5740e75e
commit
ac1cbaf2e5
@ -22,6 +22,7 @@
|
||||
#include "jni.h"
|
||||
#include "GraphicsJNI.h"
|
||||
#include <android_runtime/AndroidRuntime.h>
|
||||
#include <ScopedUtfChars.h>
|
||||
|
||||
#include "SkBlurDrawLooper.h"
|
||||
#include "SkColorFilter.h"
|
||||
@ -30,6 +31,7 @@
|
||||
#include "SkShader.h"
|
||||
#include "SkTypeface.h"
|
||||
#include "SkXfermode.h"
|
||||
#include "unicode/uloc.h"
|
||||
#include "unicode/ushape.h"
|
||||
#include "TextLayout.h"
|
||||
|
||||
@ -254,11 +256,51 @@ public:
|
||||
obj->setTextAlign(align);
|
||||
}
|
||||
|
||||
// generate bcp47 identifier for the supplied locale
|
||||
static void toLanguageTag(char* output, size_t outSize,
|
||||
const char* locale) {
|
||||
if (output == NULL || outSize <= 0) {
|
||||
return;
|
||||
}
|
||||
if (locale == NULL) {
|
||||
output[0] = '\0';
|
||||
return;
|
||||
}
|
||||
char canonicalChars[ULOC_FULLNAME_CAPACITY];
|
||||
UErrorCode uErr = U_ZERO_ERROR;
|
||||
uloc_canonicalize(locale, canonicalChars, ULOC_FULLNAME_CAPACITY,
|
||||
&uErr);
|
||||
if (U_SUCCESS(uErr)) {
|
||||
char likelyChars[ULOC_FULLNAME_CAPACITY];
|
||||
uErr = U_ZERO_ERROR;
|
||||
uloc_addLikelySubtags(canonicalChars, likelyChars,
|
||||
ULOC_FULLNAME_CAPACITY, &uErr);
|
||||
if (U_SUCCESS(uErr)) {
|
||||
uErr = U_ZERO_ERROR;
|
||||
uloc_toLanguageTag(likelyChars, output, outSize, FALSE, &uErr);
|
||||
if (U_SUCCESS(uErr)) {
|
||||
return;
|
||||
} else {
|
||||
ALOGD("uloc_toLanguageTag(\"%s\") failed: %s", likelyChars,
|
||||
u_errorName(uErr));
|
||||
}
|
||||
} else {
|
||||
ALOGD("uloc_addLikelySubtags(\"%s\") failed: %s",
|
||||
canonicalChars, u_errorName(uErr));
|
||||
}
|
||||
} else {
|
||||
ALOGD("uloc_canonicalize(\"%s\") failed: %s", locale,
|
||||
u_errorName(uErr));
|
||||
}
|
||||
// unable to build a proper language identifier
|
||||
output[0] = '\0';
|
||||
}
|
||||
|
||||
static void setTextLocale(JNIEnv* env, jobject clazz, SkPaint* obj, jstring locale) {
|
||||
const char* localeArray = env->GetStringUTFChars(locale, NULL);
|
||||
SkString skLocale(localeArray);
|
||||
obj->setTextLocale(skLocale);
|
||||
env->ReleaseStringUTFChars(locale, localeArray);
|
||||
ScopedUtfChars localeChars(env, locale);
|
||||
char langTag[ULOC_FULLNAME_CAPACITY];
|
||||
toLanguageTag(langTag, ULOC_FULLNAME_CAPACITY, localeChars.c_str());
|
||||
obj->setLanguage(SkLanguage(langTag));
|
||||
}
|
||||
|
||||
static jfloat getTextSize(JNIEnv* env, jobject paint) {
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "TextLayoutCache.h"
|
||||
#include "TextLayout.h"
|
||||
#include "SkFontHost.h"
|
||||
#include "SkTypeface_android.h"
|
||||
#include <unicode/unistr.h>
|
||||
#include <unicode/normlzr.h>
|
||||
#include <unicode/uchar.h>
|
||||
@ -224,7 +225,7 @@ void TextLayoutCache::dumpCacheStats() {
|
||||
*/
|
||||
TextLayoutCacheKey::TextLayoutCacheKey(): text(NULL), start(0), count(0), contextCount(0),
|
||||
dirFlags(0), typeface(NULL), textSize(0), textSkewX(0), textScaleX(0), flags(0),
|
||||
hinting(SkPaint::kNo_Hinting) {
|
||||
hinting(SkPaint::kNo_Hinting), variant(SkPaint::kDefault_Variant), language() {
|
||||
}
|
||||
|
||||
TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, const UChar* text,
|
||||
@ -237,6 +238,8 @@ TextLayoutCacheKey::TextLayoutCacheKey(const SkPaint* paint, const UChar* text,
|
||||
textScaleX = paint->getTextScaleX();
|
||||
flags = paint->getFlags();
|
||||
hinting = paint->getHinting();
|
||||
variant = paint->getFontVariant();
|
||||
language = paint->getLanguage();
|
||||
}
|
||||
|
||||
TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) :
|
||||
@ -251,7 +254,9 @@ TextLayoutCacheKey::TextLayoutCacheKey(const TextLayoutCacheKey& other) :
|
||||
textSkewX(other.textSkewX),
|
||||
textScaleX(other.textScaleX),
|
||||
flags(other.flags),
|
||||
hinting(other.hinting) {
|
||||
hinting(other.hinting),
|
||||
variant(other.variant),
|
||||
language(other.language) {
|
||||
if (other.text) {
|
||||
textCopy.setTo(other.text, other.contextCount);
|
||||
}
|
||||
@ -288,6 +293,12 @@ int TextLayoutCacheKey::compare(const TextLayoutCacheKey& lhs, const TextLayoutC
|
||||
deltaInt = lhs.dirFlags - rhs.dirFlags;
|
||||
if (deltaInt) return (deltaInt);
|
||||
|
||||
deltaInt = lhs.variant - rhs.variant;
|
||||
if (deltaInt) return (deltaInt);
|
||||
|
||||
if (lhs.language < rhs.language) return -1;
|
||||
if (lhs.language > rhs.language) return +1;
|
||||
|
||||
return memcmp(lhs.getText(), rhs.getText(), lhs.contextCount * sizeof(UChar));
|
||||
}
|
||||
|
||||
@ -615,6 +626,8 @@ void TextLayoutShaper::computeRunValues(const SkPaint* paint, const UChar* chars
|
||||
mShapingPaint.setTextScaleX(paint->getTextScaleX());
|
||||
mShapingPaint.setFlags(paint->getFlags());
|
||||
mShapingPaint.setHinting(paint->getHinting());
|
||||
mShapingPaint.setFontVariant(paint->getFontVariant());
|
||||
mShapingPaint.setLanguage(paint->getLanguage());
|
||||
|
||||
// Split the BiDi run into Script runs. Harfbuzz will populate the pos, length and script
|
||||
// into the shaperItem
|
||||
|
@ -32,7 +32,7 @@
|
||||
#include <SkTemplates.h>
|
||||
#include <SkUtils.h>
|
||||
#include <SkAutoKern.h>
|
||||
#include "SkTypeface_android.h"
|
||||
#include <SkLanguage.h>
|
||||
|
||||
#include <unicode/ubidi.h>
|
||||
#include <unicode/ushape.h>
|
||||
@ -102,6 +102,8 @@ private:
|
||||
SkScalar textScaleX;
|
||||
uint32_t flags;
|
||||
SkPaint::Hinting hinting;
|
||||
SkPaint::FontVariant variant;
|
||||
SkLanguage language;
|
||||
|
||||
inline const UChar* getText() const { return text ? text : textCopy.string(); }
|
||||
|
||||
|
@ -76,14 +76,6 @@ LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := fallback_fonts-ja.xml
|
||||
LOCAL_SRC_FILES := $(LOCAL_MODULE)
|
||||
LOCAL_MODULE_CLASS := ETC
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)
|
||||
include $(BUILD_PREBUILT)
|
||||
|
||||
droidsans_fallback_src := DroidSansFallbackFull.ttf
|
||||
extra_font_files := \
|
||||
DroidSans.ttf \
|
||||
@ -91,8 +83,7 @@ extra_font_files := \
|
||||
DroidSansEthiopic-Regular.ttf \
|
||||
DroidSansTamil-Regular.ttf \
|
||||
DroidSansTamil-Bold.ttf \
|
||||
MTLmr3m.ttf \
|
||||
fallback_fonts-ja.xml
|
||||
MTLmr3m.ttf
|
||||
endif # SMALLER_FONT_FOOTPRINT
|
||||
|
||||
################################
|
||||
|
@ -1,121 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--
|
||||
Fallback Fonts
|
||||
|
||||
This file specifies the fonts, and the priority order, that will be searched for any
|
||||
glyphs not handled by the default fonts specified in /system/etc/system_fonts.xml.
|
||||
Each entry consists of a family tag and a list of files (file names) which support that
|
||||
family. The fonts for each family are listed in the order of the styles that they
|
||||
handle (the order is: regular, bold, italic, and bold-italic). The order in which the
|
||||
families are listed in this file represents the order in which these fallback fonts
|
||||
will be searched for glyphs that are not supported by the default system fonts (which are
|
||||
found in /system/etc/system_fonts.xml).
|
||||
|
||||
Note that there is not nameset for fallback fonts, unlike the fonts specified in
|
||||
system_fonts.xml. The ability to support specific names in fallback fonts may be supported
|
||||
in the future. For now, the lack of files entries here is an indicator to the system that
|
||||
these are fallback fonts, instead of default named system fonts.
|
||||
|
||||
There is another optional file in /vendor/etc/fallback_fonts.xml. That file can be used to
|
||||
provide references to other font families that should be used in addition to the default
|
||||
fallback fonts. That file can also specify the order in which the fallback fonts should be
|
||||
searched, to ensure that a vendor-provided font will be used before another fallback font
|
||||
which happens to handle the same glyph.
|
||||
|
||||
Han languages (Chinese, Japanese, and Korean) share a common range of unicode characters;
|
||||
their ordering in the fallback or vendor files gives priority to the first in the list.
|
||||
Locale-specific ordering can be configured by adding language and region codes to the end
|
||||
of the filename (e.g. /system/etc/fallback_fonts-ja.xml). When no region code is used,
|
||||
as with this example, all regions are matched. Use separate files for each supported locale.
|
||||
The standard fallback file (fallback_fonts.xml) is used when a locale does not have its own
|
||||
file. All fallback files must contain the same complete set of fonts; only their ordering
|
||||
can differ.
|
||||
-->
|
||||
<familyset>
|
||||
<family>
|
||||
<fileset>
|
||||
<file variant="elegant">DroidNaskh-Regular.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file variant="compact">DroidNaskh-Regular-SystemUI.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansEthiopic-Regular.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansHebrew-Regular.ttf</file>
|
||||
<file>DroidSansHebrew-Bold.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansThai.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansArmenian.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansGeorgian.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansDevanagari-Regular.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansTamil-Regular.ttf</file>
|
||||
<file>DroidSansTamil-Bold.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>AnjaliNewLipi-light.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>Lohit-Bengali.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>Lohit-Kannada.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>AndroidEmoji.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>MTLmr3m.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansFallback.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<!--
|
||||
Fonts below this point have problematic glyphs and should not be moved
|
||||
higher in the fallback list until those glyphs have been fixed.
|
||||
-->
|
||||
<family>
|
||||
<fileset>
|
||||
<file>Lohit-Telugu.ttf</file> <!-- masks U+FFBC-10007 -->
|
||||
</fileset>
|
||||
</family>
|
||||
</familyset>
|
@ -24,12 +24,9 @@
|
||||
|
||||
Han languages (Chinese, Japanese, and Korean) share a common range of unicode characters;
|
||||
their ordering in the fallback or vendor files gives priority to the first in the list.
|
||||
Locale-specific ordering can be configured by adding language and region codes to the end
|
||||
of the filename (e.g. /system/etc/fallback_fonts-ja.xml). When no region code is used,
|
||||
as with this example, all regions are matched. Use separate files for each supported locale.
|
||||
The standard fallback file (fallback_fonts.xml) is used when a locale does not have its own
|
||||
file. All fallback files must contain the same complete set of fonts; only their ordering
|
||||
can differ.
|
||||
Language-specific ordering can be configured by adding a BCP 47-style "lang" attribute to
|
||||
a "file" element; fonts matching the language of text being drawn will be prioritised over
|
||||
all others.
|
||||
-->
|
||||
<familyset>
|
||||
<family>
|
||||
@ -106,7 +103,7 @@
|
||||
</family>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>MTLmr3m.ttf</file>
|
||||
<file lang="ja">MTLmr3m.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
<!--
|
||||
|
@ -7,8 +7,7 @@
|
||||
that in your makefile, this directory should be referenced as $(TARGET_COPY_OUT_VENDOR)/etc/:
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
frameworks/base/data/fonts/vendor_fonts.xml:$(TARGET_COPY_OUT_VENDOR)/etc/fallback_fonts.xml \
|
||||
frameworks/base/data/fonts/vendor_fonts-ja.xml:$(TARGET_COPY_OUT_VENDOR)/etc/fallback_fonts-ja.xml
|
||||
frameworks/base/data/fonts/vendor_fonts.xml:$(TARGET_COPY_OUT_VENDOR)/etc/fallback_fonts.xml
|
||||
|
||||
For example, vendors might want to build configurations for locales that are
|
||||
better served by fonts which either handle glyphs not supported in the default fonts or which
|
||||
@ -32,32 +31,9 @@
|
||||
|
||||
Han languages (Chinese, Japanese, and Korean) share a common range of unicode characters;
|
||||
their ordering in the fallback or vendor files gives priority to the first in the list.
|
||||
Locale-specific ordering can be configured by adding language and region codes to the end
|
||||
of the filename (e.g. /vendor/etc/fallback_fonts-ja.xml). When no region code is used,
|
||||
as with this example, all regions are matched. Use separate files for each supported locale.
|
||||
The standard fallback file (fallback_fonts.xml) is used when a locale does not have its own
|
||||
file. All fallback files must contain the same complete set of fonts; only their ordering
|
||||
can differ. For example, on a device supporting Japanese, but with English as the default,
|
||||
/vendor/etc/fallback_fonts.xml might contain:
|
||||
|
||||
<familyset>
|
||||
<family>
|
||||
<fileset>
|
||||
<file>DroidSansJapanese.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
</familyset>
|
||||
|
||||
placing the Japanese font at the end of the fallback sequence for English, with a corresponding
|
||||
/system/vendor/etc/fallback_fonts-ja.xml, placing it at the front of the list.
|
||||
|
||||
<familyset>
|
||||
<family order="0">
|
||||
<fileset>
|
||||
<file>DroidSansJapanese.ttf</file>
|
||||
</fileset>
|
||||
</family>
|
||||
</familyset>
|
||||
Language-specific ordering can be configured by adding a BCP 47-style "lang" attribute to
|
||||
a "file" element; fonts matching the language of text being drawn will be prioritised over
|
||||
all others.
|
||||
|
||||
The sample configuration below is an example of how one might provide two families of fonts
|
||||
that get inserted at the first and second (0 and 1) position in the overall fallback fonts.
|
||||
@ -82,4 +58,4 @@
|
||||
</fileset>
|
||||
</family>
|
||||
</familyset>
|
||||
-->
|
||||
--->
|
||||
|
Reference in New Issue
Block a user