Try Unicode decomposition for selecting fallback font

This patch finds an appropriate fallback font in the case where no font
directly maps the requested character, but a font does exist for the
character's canonical decomposition. This yields correct rendering of
compatibility characters such as U+FA70.

Bug: 15816880
Bug: 16856221
Change-Id: Idff8ed6b942fec992a0815a32028b95af091d0ee
This commit is contained in:
Raph Levien
2014-08-26 22:08:58 -07:00
parent 11c8920a3f
commit 543c65c80b

View File

@@ -19,6 +19,9 @@
#define LOG_TAG "Minikin"
#include <cutils/log.h>
#include "unicode/unistr.h"
#include "unicode/unorm2.h"
#include "MinikinInternal.h"
#include <minikin/CmapCoverage.h>
#include <minikin/FontCollection.h>
@@ -143,7 +146,18 @@ const FontCollection::FontInstance* FontCollection::getInstanceForChar(uint32_t
}
}
}
if (bestInstance == NULL) {
if (bestInstance == NULL && !mInstanceVec.empty()) {
UErrorCode errorCode = U_ZERO_ERROR;
const UNormalizer2* normalizer = unorm2_getNFDInstance(&errorCode);
if (U_SUCCESS(errorCode)) {
UChar decomposed[4];
int len = unorm2_getRawDecomposition(normalizer, ch, decomposed, 4, &errorCode);
if (U_SUCCESS(errorCode) && len > 0) {
int off = 0;
U16_NEXT_UNSAFE(decomposed, off, ch);
return getInstanceForChar(ch, lang, variant);
}
}
bestInstance = &mInstances[0];
}
return bestInstance;