CSSFontFaceSource.cpp [plain text]
#include "config.h"
#include "CSSFontFaceSource.h"
#include "CachedFont.h"
#include "CSSFontFace.h"
#include "CSSFontSelector.h"
#include "DocLoader.h"
#include "FontCache.h"
#include "FontDescription.h"
#include "GlyphPageTreeNode.h"
#include "SimpleFontData.h"
#if ENABLE(SVG_FONTS)
#include "FontCustomPlatformData.h"
#include "HTMLNames.h"
#include "SVGFontData.h"
#include "SVGFontElement.h"
#include "SVGURIReference.h"
#endif
namespace WebCore {
CSSFontFaceSource::CSSFontFaceSource(const String& str, CachedFont* font)
: m_string(str)
, m_font(0)
, m_face(0)
{
if (m_font)
m_font->ref(this);
}
CSSFontFaceSource::~CSSFontFaceSource()
{
if (m_font)
m_font->deref(this);
pruneTable();
}
void CSSFontFaceSource::pruneTable()
{
if (m_fontDataTable.isEmpty())
return;
HashMap<int, SimpleFontData*>::iterator end = m_fontDataTable.end();
for (HashMap<int, SimpleFontData*>::iterator it = m_fontDataTable.begin(); it != end; ++it)
GlyphPageTreeNode::pruneTreeCustomFontData(it->second);
deleteAllValues(m_fontDataTable);
m_fontDataTable.clear();
}
bool CSSFontFaceSource::isLoaded() const
{
if (m_font)
return m_font->isLoaded();
return true;
}
bool CSSFontFaceSource::isValid() const
{
if (m_font)
return !m_font->errorOccurred();
return true;
}
void CSSFontFaceSource::fontLoaded(CachedFont*)
{
pruneTable();
if (m_face)
m_face->fontLoaded(this);
}
SimpleFontData* CSSFontFaceSource::getFontData(const FontDescription& fontDescription, bool syntheticBold, bool syntheticItalic, CSSFontSelector* fontSelector)
{
if (!isValid())
return 0;
#if ENABLE(SVG_FONTS)
if (!m_font && !m_svgFontFaceElement) {
#else
if (!m_font) {
#endif
FontPlatformData* data = FontCache::getCachedFontPlatformData(fontDescription, m_string);
SimpleFontData* fontData = FontCache::getCachedFontData(data);
return fontData;
}
if (SimpleFontData* cachedData = m_fontDataTable.get(fontDescription.computedPixelSize()))
return cachedData;
OwnPtr<SimpleFontData> fontData;
if (isLoaded()) {
if (m_font) {
#if ENABLE(SVG_FONTS)
if (m_font->isSVGFont()) {
if (!m_font->ensureSVGFontData())
return 0;
if (!m_externalSVGFontElement)
m_externalSVGFontElement = m_font->getSVGFontById(SVGURIReference::getTarget(m_string));
if (!m_externalSVGFontElement)
return 0;
SVGFontFaceElement* fontFaceElement = 0;
for (Node* fontChild = m_externalSVGFontElement->firstChild(); fontChild; fontChild = fontChild->nextSibling()) {
if (fontChild->hasTagName(SVGNames::font_faceTag)) {
fontFaceElement = static_cast<SVGFontFaceElement*>(fontChild);
break;
}
}
if (fontFaceElement) {
if (!m_svgFontFaceElement) {
m_svgFontFaceElement = fontFaceElement;
}
SVGFontData* svgFontData = new SVGFontData(fontFaceElement);
fontData.set(new SimpleFontData(m_font->platformDataFromCustomData(fontDescription.computedPixelSize(), syntheticBold, syntheticItalic), true, false, svgFontData));
}
} else
#endif
{
if (!m_font->ensureCustomFontData())
return 0;
fontData.set(new SimpleFontData(m_font->platformDataFromCustomData(fontDescription.computedPixelSize(), syntheticBold, syntheticItalic), true, false));
}
} else {
#if ENABLE(SVG_FONTS)
if (m_svgFontFaceElement) {
SVGFontData* svgFontData = new SVGFontData(m_svgFontFaceElement.get());
fontData.set(new SimpleFontData(FontPlatformData(fontDescription.computedPixelSize(), syntheticBold, syntheticItalic), true, false, svgFontData));
}
#endif
}
} else {
m_font->beginLoadIfNeeded(fontSelector->docLoader());
FontPlatformData* tempData = FontCache::getCachedFontPlatformData(fontDescription, m_string);
if (!tempData)
tempData = FontCache::getLastResortFallbackFont(fontDescription);
fontData.set(new SimpleFontData(*tempData, true, true));
}
m_fontDataTable.set(fontDescription.computedPixelSize(), fontData.get());
return fontData.release();
}
}