⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cachedfont.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#include "config.h"#include "CachedFont.h"#include "Cache.h"#include "CachedResourceClient.h"#include "CachedResourceClientWalker.h"#include "DOMImplementation.h"#include "FontPlatformData.h"#if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && PLATFORM(WIN_OS))#include "FontCustomPlatformData.h"#endif#include "TextResourceDecoder.h"#include "loader.h"#include <wtf/Vector.h>#if ENABLE(SVG_FONTS)#include "HTMLNames.h"#include "NodeList.h"#include "SVGElement.h"#include "SVGFontElement.h"#include "SVGGElement.h"#endifnamespace WebCore {CachedFont::CachedFont(const String &url)    : CachedResource(url, FontResource)    , m_fontData(0)    , m_loadInitiated(false)#if ENABLE(SVG_FONTS)    , m_isSVGFont(false)#endif{}CachedFont::~CachedFont(){#if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && PLATFORM(WIN_OS))    delete m_fontData;#endif}void CachedFont::load(DocLoader*){    // Don't load the file yet.  Wait for an access before triggering the load.    m_loading = true;}void CachedFont::addClient(CachedResourceClient* c){    CachedResource::addClient(c);        if (!m_loading)        c->fontLoaded(this);}void CachedFont::data(PassRefPtr<SharedBuffer> data, bool allDataReceived){    if (!allDataReceived)        return;    m_data = data;         setEncodedSize(m_data.get() ? m_data->size() : 0);    m_loading = false;    checkNotify();}void CachedFont::beginLoadIfNeeded(DocLoader* dl){    if (!m_loadInitiated) {        m_loadInitiated = true;        cache()->loader()->load(dl, this, false);    }}bool CachedFont::ensureCustomFontData(){#if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && PLATFORM(WIN_OS))#if ENABLE(SVG_FONTS)    ASSERT(!m_isSVGFont);#endif    if (!m_fontData && !m_errorOccurred && !m_loading && m_data) {        m_fontData = createFontCustomPlatformData(m_data.get());        if (!m_fontData)            m_errorOccurred = true;    }#endif    return m_fontData;}FontPlatformData CachedFont::platformDataFromCustomData(float size, bool bold, bool italic, FontRenderingMode renderingMode){#if ENABLE(SVG_FONTS)    if (m_externalSVGDocument)        return FontPlatformData(size, bold, italic);#endif#if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && PLATFORM(WIN_OS))    ASSERT(m_fontData);    return m_fontData->fontPlatformData(static_cast<int>(size), bold, italic, renderingMode);#else    return FontPlatformData();#endif}#if ENABLE(SVG_FONTS)bool CachedFont::ensureSVGFontData(){    ASSERT(m_isSVGFont);    if (!m_externalSVGDocument && !m_errorOccurred && !m_loading && m_data) {        m_externalSVGDocument = SVGDocument::create(0);        m_externalSVGDocument->open();        RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("application/xml");        m_externalSVGDocument->write(decoder->decode(m_data->data(), m_data->size()));        if (decoder->sawError()) {            m_externalSVGDocument.clear();            return 0;        }        m_externalSVGDocument->finishParsing();        m_externalSVGDocument->close();    }    return m_externalSVGDocument;}SVGFontElement* CachedFont::getSVGFontById(const String& fontName) const{    ASSERT(m_isSVGFont);    RefPtr<NodeList> list = m_externalSVGDocument->getElementsByTagName(SVGNames::fontTag.localName());    if (!list)        return 0;    unsigned fonts = list->length();    for (unsigned i = 0; i < fonts; ++i) {        Node* node = list->item(i);        ASSERT(node);        if (static_cast<Element*>(node)->getAttribute(HTMLNames::idAttr) != fontName)            continue;        ASSERT(node->hasTagName(SVGNames::fontTag));        return static_cast<SVGFontElement*>(node);    }    return 0;}#endifvoid CachedFont::allClientsRemoved(){#if PLATFORM(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && PLATFORM(WIN_OS))    if (m_fontData) {        delete m_fontData;        m_fontData = 0;    }#endif}void CachedFont::checkNotify(){    if (m_loading)        return;        CachedResourceClientWalker w(m_clients);    while (CachedResourceClient *c = w.next())         c->fontLoaded(this);}void CachedFont::error(){    m_loading = false;    m_errorOccurred = true;    checkNotify();}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -