FontFallbackList.cpp [plain text]
#include "config.h"
#include "FontFallbackList.h"
#include "Font.h"
#include "FontCache.h"
#include "SegmentedFontData.h"
namespace WebCore {
FontFallbackList::FontFallbackList()
: m_familyIndex(0)
, m_pitch(UnknownPitch)
, m_loadingCustomFonts(false)
, m_fontSelector(0)
{
}
void FontFallbackList::invalidate(PassRefPtr<FontSelector> fontSelector)
{
m_fontList.clear();
m_familyIndex = 0;
m_pitch = UnknownPitch;
m_loadingCustomFonts = false;
m_fontSelector = fontSelector;
}
void FontFallbackList::determinePitch(const Font* font) const
{
const FontData* fontData = primaryFont(font);
if (!fontData->isSegmented())
m_pitch = static_cast<const SimpleFontData*>(fontData)->pitch();
else {
const SegmentedFontData* segmentedFontData = static_cast<const SegmentedFontData*>(fontData);
unsigned numRanges = segmentedFontData->numRanges();
if (numRanges == 1)
m_pitch = segmentedFontData->rangeAt(0).fontData()->pitch();
else
m_pitch = VariablePitch;
}
}
const FontData* FontFallbackList::fontDataAt(const Font* font, unsigned realizedFontIndex) const
{
if (realizedFontIndex < m_fontList.size())
return m_fontList[realizedFontIndex];
ASSERT(realizedFontIndex == m_fontList.size());
if (m_familyIndex == cAllFamiliesScanned)
return 0;
const FontData* result = FontCache::getFontData(*font, m_familyIndex, m_fontSelector.get());
if (result) {
m_fontList.append(result);
if (result->isLoading())
m_loadingCustomFonts = true;
}
return result;
}
const FontData* FontFallbackList::fontDataForCharacters(const Font* font, const UChar* characters, int length) const
{
unsigned realizedFontIndex = 1;
const FontData* fontData = fontDataAt(font, realizedFontIndex);
while (fontData && !fontData->containsCharacters(characters, length))
fontData = fontDataAt(font, ++realizedFontIndex);
if (!fontData)
fontData = FontCache::getFontDataForCharacters(*font, characters, length);
return fontData;
}
void FontFallbackList::setPlatformFont(const FontPlatformData& platformData)
{
m_familyIndex = cAllFamiliesScanned;
m_fontList.append(FontCache::getCachedFontData(&platformData));
}
}