FontCairoHarfbuzzNG.cpp [plain text]
#include "config.h"
#include "FontCascade.h"
#if USE(CAIRO)
#include "FontCache.h"
#include "SurrogatePairAwareTextIterator.h"
#include <unicode/normlzr.h>
namespace WebCore {
bool FontCascade::canReturnFallbackFontsForComplexText()
{
return false;
}
bool FontCascade::canExpandAroundIdeographsInComplexText()
{
return false;
}
const Font* FontCascade::fontForCombiningCharacterSequence(const UChar* characters, size_t length) const
{
UErrorCode error = U_ZERO_ERROR;
Vector<UChar, 4> normalizedCharacters(length);
#if COMPILER(GCC_OR_CLANG)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#endif
int32_t normalizedLength = unorm_normalize(characters, length, UNORM_NFC, UNORM_UNICODE_3_2, normalizedCharacters.data(), length, &error);
#if COMPILER(GCC_OR_CLANG)
#pragma GCC diagnostic pop
#endif
if (U_FAILURE(error))
return nullptr;
UChar32 character;
unsigned clusterLength = 0;
SurrogatePairAwareTextIterator iterator(normalizedCharacters.data(), 0, normalizedLength, normalizedLength);
if (!iterator.consume(character, clusterLength))
return nullptr;
const Font* baseFont = glyphDataForCharacter(character, false, NormalVariant).font;
if (baseFont && (static_cast<int32_t>(clusterLength) == normalizedLength || baseFont->canRenderCombiningCharacterSequence(characters, length)))
return baseFont;
for (unsigned i = 0; !fallbackRangesAt(i).isNull(); ++i) {
const Font* fallbackFont = fallbackRangesAt(i).fontForCharacter(character);
if (!fallbackFont || fallbackFont == baseFont)
continue;
if (fallbackFont->canRenderCombiningCharacterSequence(characters, length))
return fallbackFont;
}
if (auto systemFallback = FontCache::singleton().systemFallbackForCharacters(m_fontDescription, baseFont, false, characters, length)) {
if (systemFallback->canRenderCombiningCharacterSequence(characters, length))
return systemFallback.get();
}
return baseFont;
}
}
#endif // USE(CAIRO)