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

📄 cssfontselector.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. *           (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> * * 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 "CSSFontSelector.h"#include "AtomicString.h"#include "CachedFont.h"#include "CSSFontFace.h"#include "CSSFontFaceRule.h"#include "CSSFontFaceSource.h"#include "CSSFontFaceSrcValue.h"#include "CSSMutableStyleDeclaration.h"#include "CSSPrimitiveValue.h"#include "CSSPropertyNames.h"#include "CSSSegmentedFontFace.h"#include "CSSUnicodeRangeValue.h"#include "CSSValueKeywords.h"#include "CSSValueList.h"#include "DocLoader.h"#include "Document.h"#include "FontCache.h"#include "FontFamilyValue.h"#include "Frame.h"#include "NodeList.h"#include "RenderObject.h"#include "Settings.h"#include "SimpleFontData.h"#if ENABLE(SVG)#include "SVGFontFaceElement.h"#include "SVGNames.h"#endifnamespace WebCore {CSSFontSelector::CSSFontSelector(Document* document)    : m_document(document){    // FIXME: An old comment used to say there was no need to hold a reference to m_document    // because "we are guaranteed to be destroyed before the document". But there does not    // seem to be any such guarantee.    ASSERT(m_document);    fontCache()->addClient(this);}CSSFontSelector::~CSSFontSelector(){    fontCache()->removeClient(this);    deleteAllValues(m_fontFaces);    deleteAllValues(m_locallyInstalledFontFaces);    deleteAllValues(m_fonts);}bool CSSFontSelector::isEmpty() const{    return m_fonts.isEmpty();}DocLoader* CSSFontSelector::docLoader() const{    return m_document ? m_document->docLoader() : 0;}void CSSFontSelector::addFontFaceRule(const CSSFontFaceRule* fontFaceRule){    // Obtain the font-family property and the src property.  Both must be defined.    const CSSMutableStyleDeclaration* style = fontFaceRule->style();    RefPtr<CSSValue> fontFamily = style->getPropertyCSSValue(CSSPropertyFontFamily);    RefPtr<CSSValue> src = style->getPropertyCSSValue(CSSPropertySrc);    RefPtr<CSSValue> unicodeRange = style->getPropertyCSSValue(CSSPropertyUnicodeRange);    if (!fontFamily || !src || !fontFamily->isValueList() || !src->isValueList() || unicodeRange && !unicodeRange->isValueList())        return;    CSSValueList* familyList = static_cast<CSSValueList*>(fontFamily.get());    if (!familyList->length())        return;    CSSValueList* srcList = static_cast<CSSValueList*>(src.get());    if (!srcList->length())        return;    CSSValueList* rangeList = static_cast<CSSValueList*>(unicodeRange.get());    unsigned traitsMask = 0;    if (RefPtr<CSSValue> fontStyle = style->getPropertyCSSValue(CSSPropertyFontStyle)) {        if (fontStyle->isPrimitiveValue()) {            RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();            list->append(fontStyle);            fontStyle = list;        } else if (!fontStyle->isValueList())            return;        CSSValueList* styleList = static_cast<CSSValueList*>(fontStyle.get());        unsigned numStyles = styleList->length();        if (!numStyles)            return;        for (unsigned i = 0; i < numStyles; ++i) {            switch (static_cast<CSSPrimitiveValue*>(styleList->itemWithoutBoundsCheck(i))->getIdent()) {                case CSSValueAll:                    traitsMask |= FontStyleMask;                    break;                case CSSValueNormal:                    traitsMask |= FontStyleNormalMask;                    break;                case CSSValueItalic:                case CSSValueOblique:                    traitsMask |= FontStyleItalicMask;                    break;                default:                    break;            }        }    } else        traitsMask |= FontStyleMask;    if (RefPtr<CSSValue> fontWeight = style->getPropertyCSSValue(CSSPropertyFontWeight)) {        if (fontWeight->isPrimitiveValue()) {            RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();            list->append(fontWeight);            fontWeight = list;        } else if (!fontWeight->isValueList())            return;        CSSValueList* weightList = static_cast<CSSValueList*>(fontWeight.get());        unsigned numWeights = weightList->length();        if (!numWeights)            return;        for (unsigned i = 0; i < numWeights; ++i) {            switch (static_cast<CSSPrimitiveValue*>(weightList->itemWithoutBoundsCheck(i))->getIdent()) {                case CSSValueAll:                    traitsMask |= FontWeightMask;                    break;                case CSSValueBolder:                case CSSValueBold:                case CSSValue700:                    traitsMask |= FontWeight700Mask;                    break;                case CSSValueNormal:                case CSSValue400:                    traitsMask |= FontWeight400Mask;                    break;                case CSSValue900:                    traitsMask |= FontWeight900Mask;                    break;                case CSSValue800:                    traitsMask |= FontWeight800Mask;                    break;                case CSSValue600:                    traitsMask |= FontWeight600Mask;                    break;                case CSSValue500:                    traitsMask |= FontWeight500Mask;                    break;                case CSSValue300:                    traitsMask |= FontWeight300Mask;                    break;                case CSSValueLighter:                case CSSValue200:                    traitsMask |= FontWeight200Mask;                    break;                case CSSValue100:                    traitsMask |= FontWeight100Mask;                    break;                default:                    break;            }        }    } else        traitsMask |= FontWeightMask;    if (RefPtr<CSSValue> fontVariant = style->getPropertyCSSValue(CSSPropertyFontVariant)) {        if (fontVariant->isPrimitiveValue()) {            RefPtr<CSSValueList> list = CSSValueList::createCommaSeparated();            list->append(fontVariant);            fontVariant = list;        } else if (!fontVariant->isValueList())            return;        CSSValueList* variantList = static_cast<CSSValueList*>(fontVariant.get());        unsigned numVariants = variantList->length();        if (!numVariants)            return;        for (unsigned i = 0; i < numVariants; ++i) {            switch (static_cast<CSSPrimitiveValue*>(variantList->itemWithoutBoundsCheck(i))->getIdent()) {                case CSSValueAll:                    traitsMask |= FontVariantMask;                    break;                case CSSValueNormal:                    traitsMask |= FontVariantNormalMask;                    break;                case CSSValueSmallCaps:                    traitsMask |= FontVariantSmallCapsMask;                    break;                default:                    break;            }        }    } else        traitsMask |= FontVariantNormalMask;    // Each item in the src property's list is a single CSSFontFaceSource. Put them all into a CSSFontFace.    RefPtr<CSSFontFace> fontFace;    int srcLength = srcList->length();    bool foundLocal = false;#if ENABLE(SVG_FONTS)    bool foundSVGFont = false;#endif    for (int i = 0; i < srcLength; i++) {        // An item in the list either specifies a string (local font name) or a URL (remote font to download).        CSSFontFaceSrcValue* item = static_cast<CSSFontFaceSrcValue*>(srcList->itemWithoutBoundsCheck(i));        CSSFontFaceSource* source = 0;#if ENABLE(SVG_FONTS)        foundSVGFont = item->isSVGFontFaceSrc() || item->svgFontFaceElement();#endif        if (!item->isLocal()) {            if (item->isSupportedFormat() && m_document) {                CachedFont* cachedFont = m_document->docLoader()->requestFont(item->resource());                if (cachedFont) {#if ENABLE(SVG_FONTS)                    if (foundSVGFont)                        cachedFont->setSVGFont(true);#endif                    source = new CSSFontFaceSource(item->resource(), cachedFont);                }            }        } else {            source = new CSSFontFaceSource(item->resource());            foundLocal = true;        }        if (!fontFace)            fontFace = CSSFontFace::create(static_cast<FontTraitsMask>(traitsMask));        if (source) {

⌨️ 快捷键说明

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