summaryrefslogtreecommitdiffstats
path: root/libs
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@google.com>2014-08-08 19:56:55 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-08-08 19:56:55 +0000
commit8e865a08c03bae9bbdae69c5ad1a79b47adb047f (patch)
tree1a20ec2eaf265055c41ccadaf3f43048bdb369b4 /libs
parent143a999611a780f2549887b60702eee1f8c33bdc (diff)
parentf952161b874fd2e9af474b9fd2ebcca1f3bb4555 (diff)
downloadandroid_frameworks_minikin-8e865a08c03bae9bbdae69c5ad1a79b47adb047f.tar.gz
android_frameworks_minikin-8e865a08c03bae9bbdae69c5ad1a79b47adb047f.tar.bz2
android_frameworks_minikin-8e865a08c03bae9bbdae69c5ad1a79b47adb047f.zip
am f952161b: Choose same font for Emoji keycap and its base character
* commit 'f952161b874fd2e9af474b9fd2ebcca1f3bb4555': Choose same font for Emoji keycap and its base character
Diffstat (limited to 'libs')
-rw-r--r--libs/minikin/FontCollection.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/libs/minikin/FontCollection.cpp b/libs/minikin/FontCollection.cpp
index a6977fd..009584e 100644
--- a/libs/minikin/FontCollection.cpp
+++ b/libs/minikin/FontCollection.cpp
@@ -152,9 +152,11 @@ const FontCollection::FontInstance* FontCollection::getInstanceForChar(uint32_t
const uint32_t NBSP = 0xa0;
const uint32_t ZWJ = 0x200c;
const uint32_t ZWNJ = 0x200d;
+const uint32_t KEYCAP = 0x20e3;
+
// Characters where we want to continue using existing font run instead of
// recomputing the best match in the fallback list.
-static const uint32_t stickyWhitelist[] = { '!', ',', '.', ':', ';', '?', NBSP, ZWJ, ZWNJ };
+static const uint32_t stickyWhitelist[] = { '!', ',', '.', ':', ';', '?', NBSP, ZWJ, ZWNJ, KEYCAP };
static bool isStickyWhitelisted(uint32_t c) {
for (size_t i = 0; i < sizeof(stickyWhitelist) / sizeof(stickyWhitelist[0]); i++) {
@@ -185,6 +187,19 @@ void FontCollection::itemize(const uint16_t *string, size_t string_size, FontSty
|| !(isStickyWhitelisted(ch) && lastInstance->mCoverage->get(ch))) {
const FontInstance* instance = getInstanceForChar(ch, lang, variant);
if (i == 0 || instance != lastInstance) {
+ size_t start = i;
+ // Workaround for Emoji keycap until we implement per-cluster font
+ // selection: if keycap is found in a different font that also
+ // supports previous char, attach previous char to the new run.
+ // Only handles non-surrogate characters.
+ // Bug 7557244.
+ if (ch == KEYCAP && i && instance && instance->mCoverage->get(string[i - 1])) {
+ run->end--;
+ if (run->start == run->end) {
+ result->pop_back();
+ }
+ start--;
+ }
Run dummy;
result->push_back(dummy);
run = &result->back();
@@ -194,7 +209,7 @@ void FontCollection::itemize(const uint16_t *string, size_t string_size, FontSty
run->fakedFont = instance->mFamily->getClosestMatch(style);
}
lastInstance = instance;
- run->start = i;
+ run->start = start;
}
}
run->end = i + nShorts;