10019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch/* 20019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 30019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 40019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved. 50019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * 60019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * This library is free software; you can redistribute it and/or 70019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * modify it under the terms of the GNU Library General Public 80019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * License as published by the Free Software Foundation; either 90019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * version 2 of the License, or (at your option) any later version. 100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * 110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * This library is distributed in the hope that it will be useful, 120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of 130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Library General Public License for more details. 150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * 160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * You should have received a copy of the GNU Library General Public License 170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * along with this library; see the file COPYING.LIB. If not, write to 180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * Boston, MA 02110-1301, USA. 200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch * 210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch */ 220019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "config.h" 240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/css/resolver/FontBuilder.h" 250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 260019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/css/CSSCalculationValue.h" 27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/css/CSSToLengthConversionData.h" 28d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/rendering/RenderTheme.h" 310019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch#include "core/rendering/RenderView.h" 32e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/rendering/TextAutosizer.h" 33f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "platform/fonts/FontDescription.h" 341e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/LocaleToScriptMapping.h" 350019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 36c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 380019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// FIXME: This scoping class is a short-term fix to minimize the changes in 390019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// Font-constructing logic. 400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochclass FontDescriptionChangeScope { 41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) STACK_ALLOCATED(); 420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochpublic: 430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope(FontBuilder* fontBuilder) 440019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch : m_fontBuilder(fontBuilder) 450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch , m_fontDescription(fontBuilder->m_style->fontDescription()) 460019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch { 470019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch void reset() { m_fontDescription = FontDescription(); } 500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch void set(const FontDescription& fontDescription) { m_fontDescription = fontDescription; } 510019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescription& fontDescription() { return m_fontDescription; } 520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch ~FontDescriptionChangeScope() 540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch { 550019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch m_fontBuilder->didChangeFontParameters(m_fontBuilder->m_style->setFontDescription(m_fontDescription)); 560019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochprivate: 59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RawPtrWillBeMember<FontBuilder> m_fontBuilder; 600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescription m_fontDescription; 610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch}; 620019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 630019e4eead4d990e4304c54a9028aca9122fb256Ben MurdochFontBuilder::FontBuilder() 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) : m_document(nullptr) 6543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) , m_style(0) 660019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch , m_fontDirty(false) 670019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 680019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 70f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)void FontBuilder::initForStyleResolve(const Document& document, RenderStyle* style) 710019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 72f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu ASSERT(document.frame()); 738abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) m_document = &document; 740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch m_style = style; 750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch m_fontDirty = false; 760019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 770019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 7843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)inline static void setFontFamilyToStandard(FontDescription& fontDescription, const Document* document) 7943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 8043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (!document || !document->settings()) 8143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) return; 8243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 8343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) fontDescription.setGenericFamily(FontDescription::StandardFamily); 8443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) const AtomicString& standardFontFamily = document->settings()->genericFontFamilySettings().standard(); 8543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (standardFontFamily.isEmpty()) 8643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) return; 8743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 8843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) fontDescription.firstFamily().setFamily(standardFontFamily); 8943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) // FIXME: Why is this needed here? 9043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) fontDescription.firstFamily().appendFamily(nullptr); 9143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)} 9243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 930019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::setInitial(float effectiveZoom) 940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 95f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) ASSERT(m_document && m_document->settings()); 96f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) if (!m_document || !m_document->settings()) 97f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) return; 98f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles) 990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.reset(); 10243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) setFontFamilyToStandard(scope.fontDescription(), m_document); 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setSize(scope.fontDescription(), FontBuilder::initialSize()); 1040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1050019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::inheritFrom(const FontDescription& fontDescription) 1070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1080019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.set(fontDescription); 1110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::didChangeFontParameters(bool changed) 1140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch m_fontDirty |= changed; 1160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::fromSystemFont(CSSValueID valueId, float effectiveZoom) 1190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1220019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescription fontDescription; 123c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) RenderTheme::theme().systemFont(valueId, fontDescription); 1240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // Double-check and see if the theme did anything. If not, don't bother updating the font. 1260019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!fontDescription.isAbsoluteSize()) 1270019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 1280019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1290019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // Make sure the rendering mode and printer font settings are updated. 1300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch const Settings* settings = m_document->settings(); 1310019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch ASSERT(settings); // If we're doing style resolution, this document should always be in a frame and thus have settings 1320019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!settings) 1330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 1340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1350019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // Handle the zoom factor. 1360019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontDescription.setComputedSize(getComputedSizeFromSpecifiedSize(fontDescription, effectiveZoom, fontDescription.specifiedSize())); 1370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.set(fontDescription); 1380019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1390019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::setFontFamilyInitial() 1410019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 14443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) setFontFamilyToStandard(scope.fontDescription(), m_document); 1450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1460019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1470019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::setFontFamilyInherit(const FontDescription& parentFontDescription) 1480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1510019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(parentFontDescription.genericFamily()); 1520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setFamily(parentFontDescription.family()); 1530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 1540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1550019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// FIXME: I am not convinced FontBuilder needs to know anything about CSSValues. 156d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::setFontFamilyValue(CSSValue* value) 1570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 1580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 1590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!value->isValueList()) 1610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 1620019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1630019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontFamily& firstFamily = scope.fontDescription().firstFamily(); 1640019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontFamily* currFamily = 0; 1650019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1660019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // Before mapping in a new font-family property, we should reset the generic family. 167197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch FixedPitchFontType oldFixedPitchFontType = scope.fontDescription().fixedPitchFontType(); 1680019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::NoFamily); 1690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 1700019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch for (CSSValueListIterator i = value; i.hasMore(); i.advance()) { 1710019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch CSSValue* item = i.value(); 1720019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!item->isPrimitiveValue()) 1730019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch continue; 1740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch CSSPrimitiveValue* contentValue = toCSSPrimitiveValue(item); 1750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch AtomicString face; 1760019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Settings* settings = m_document->settings(); 1770019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (contentValue->isString()) { 178a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) face = AtomicString(contentValue->getStringValue()); 1790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } else if (settings) { 1800019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch switch (contentValue->getValueID()) { 1810019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueWebkitBody: 182a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) face = settings->genericFontFamilySettings().standard(); 1830019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 1840019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueSerif: 185f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_serif; 1860019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::SerifFamily); 1870019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 1880019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueSansSerif: 189f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_sans_serif; 1900019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::SansSerifFamily); 1910019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 1920019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueCursive: 193f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_cursive; 1940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::CursiveFamily); 1950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 1960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueFantasy: 197f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_fantasy; 1980019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::FantasyFamily); 1990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 2000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueMonospace: 201f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_monospace; 2020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::MonospaceFamily); 2030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 2040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case CSSValueWebkitPictograph: 205f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) face = FontFamilyNames::webkit_pictograph; 2060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setGenericFamily(FontDescription::PictographFamily); 2070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 2080019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch default: 2090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch break; 2100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 2110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 2120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!face.isEmpty()) { 2140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!currFamily) { 2150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // Filling in the first family. 2160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch firstFamily.setFamily(face); 217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) firstFamily.appendFamily(nullptr); // Remove any inherited family-fallback list. 2180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch currFamily = &firstFamily; 2190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } else { 2200019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch RefPtr<SharedFontFamily> newFamily = SharedFontFamily::create(); 2210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch newFamily->setFamily(face); 2220019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch currFamily->appendFamily(newFamily); 2230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch currFamily = newFamily.get(); 2240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 2250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 2260019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 2270019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2280019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // We can't call useFixedDefaultSize() until all new font families have been added 2290019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // If currFamily is non-zero then we set at least one family on this description. 2300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!currFamily) 2310019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 2320019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (scope.fontDescription().keywordSize() && scope.fontDescription().fixedPitchFontType() != oldFixedPitchFontType) 2347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setSize(scope.fontDescription(), FontDescription::Size(scope.fontDescription().keywordSize(), 0.0f, false)); 2350019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2360019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontBuilder::setWeight(FontWeight fontWeight) 2380019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2390019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scope.fontDescription().setWeight(fontWeight); 2420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontBuilder::setSize(const FontDescription::Size& size) 2450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2460019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2470019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setSize(scope.fontDescription(), size); 2490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FontBuilder::setStretch(FontStretch fontStretch) 2520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 255c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) scope.fontDescription().setStretch(fontStretch); 2560019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::setScript(const String& locale) 2590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 262f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) scope.fontDescription().setLocale(locale); 2630019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setScript(localeToScriptCodeForFontSelection(locale)); 2640019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2650019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 266d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::setStyle(FontStyle italic) 2670019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2680019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scope.fontDescription().setStyle(italic); 2710019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2720019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 273d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::setVariant(FontVariant smallCaps) 2740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2760019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 277d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scope.fontDescription().setVariant(smallCaps); 2780019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 280c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FontBuilder::setVariantLigatures(const FontDescription::VariantLigatures& ligatures) 281c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 282c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) FontDescriptionChangeScope scope(this); 283c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 284c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) scope.fontDescription().setVariantLigatures(ligatures); 285c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 286c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 287d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::setTextRendering(TextRenderingMode textRenderingMode) 2880019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2890019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2900019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 291d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scope.fontDescription().setTextRendering(textRenderingMode); 2920019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 2930019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::setKerning(FontDescription::Kerning kerning) 2950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 2960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 2970019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 2980019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setKerning(kerning); 2990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::setFontSmoothing(FontSmoothingMode foontSmoothingMode) 3020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 3030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 3040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3050019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setFontSmoothing(foontSmoothingMode); 3060019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 308e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void FontBuilder::setFeatureSettings(PassRefPtr<FontFeatureSettings> settings) 3090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 3100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 3110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 312e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) scope.fontDescription().setFeatureSettings(settings); 3130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontBuilder::setSize(FontDescription& fontDescription, const FontDescription::Size& size) 3160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 3177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci float specifiedSize = size.value; 3187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!specifiedSize && size.keyword) 3207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci specifiedSize = FontSize::fontSizeForKeyword(m_document, size.keyword, fontDescription.fixedPitchFontType()); 3217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (specifiedSize < 0) 3237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return; 3247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Overly large font sizes will cause crashes on some platforms (such as Windows). 3267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Cap font size here to make sure that doesn't happen. 3277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci specifiedSize = std::min(maximumAllowedFontSize, specifiedSize); 3287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 3297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fontDescription.setKeywordSize(size.keyword); 3307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fontDescription.setSpecifiedSize(specifiedSize); 3317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fontDescription.setIsAbsoluteSize(size.isAbsolute); 3320019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochfloat FontBuilder::getComputedSizeFromSpecifiedSize(FontDescription& fontDescription, float effectiveZoom, float specifiedSize) 3350019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 336f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) float zoomFactor = effectiveZoom; 337f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) // FIXME: Why is this here!!!!?! 338f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) if (LocalFrame* frame = m_document->frame()) 339f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) zoomFactor *= frame->textZoomFactor(); 3400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3410019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return FontSize::getComputedSizeFromSpecifiedSize(m_document, zoomFactor, fontDescription.isAbsoluteSize(), specifiedSize); 3420019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3430019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3440019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochstatic void getFontAndGlyphOrientation(const RenderStyle* style, FontOrientation& fontOrientation, NonCJKGlyphOrientation& glyphOrientation) 3450019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 3460019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (style->isHorizontalWritingMode()) { 3470019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Horizontal; 3480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 3510019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch switch (style->textOrientation()) { 3530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case TextOrientationVerticalRight: 3540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Vertical; 3550019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3560019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case TextOrientationUpright: 3580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Vertical; 3590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationUpright; 3600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case TextOrientationSideways: 3620019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (style->writingMode() == LeftToRightWritingMode) { 3630019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // FIXME: This should map to sideways-left, which is not supported yet. 3640019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Vertical; 3650019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3660019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3670019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 3680019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Horizontal; 3690019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3700019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3710019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch case TextOrientationSidewaysRight: 3720019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Horizontal; 3730019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch default: 3760019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch ASSERT_NOT_REACHED(); 3770019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontOrientation = Horizontal; 3780019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch glyphOrientation = NonCJKGlyphOrientationVerticalRight; 3790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3800019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 3810019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3820019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3830019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::checkForOrientationChange(RenderStyle* style) 3840019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 3850019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontOrientation fontOrientation; 3860019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch NonCJKGlyphOrientation glyphOrientation; 3870019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch getFontAndGlyphOrientation(style, fontOrientation, glyphOrientation); 3880019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3890019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 3900019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3910019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (scope.fontDescription().orientation() == fontOrientation && scope.fontDescription().nonCJKGlyphOrientation() == glyphOrientation) 3920019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 3930019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3940019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setNonCJKGlyphOrientation(glyphOrientation); 3950019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().setOrientation(fontOrientation); 3960019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 3970019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 3980019e4eead4d990e4304c54a9028aca9122fb256Ben Murdochvoid FontBuilder::checkForGenericFamilyChange(RenderStyle* style, const RenderStyle* parentStyle) 3990019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 4000019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 4010019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4020019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (scope.fontDescription().isAbsoluteSize() || !parentStyle) 4030019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 4040019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4050019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch const FontDescription& parentFontDescription = parentStyle->fontDescription(); 406197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch if (scope.fontDescription().fixedPitchFontType() == parentFontDescription.fixedPitchFontType()) 4070019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 4080019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4090019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // For now, lump all families but monospace together. 4100019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (scope.fontDescription().genericFamily() != FontDescription::MonospaceFamily 4110019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch && parentFontDescription.genericFamily() != FontDescription::MonospaceFamily) 4120019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 4130019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4140019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // We know the parent is monospace or the child is monospace, and that font 4150019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // size was unspecified. We want to scale our font size as appropriate. 4160019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // If the font uses a keyword size, then we refetch from the table rather than 4170019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch // multiplying by our scale factor. 4180019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch float size; 4190019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (scope.fontDescription().keywordSize()) { 4207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci size = FontSize::fontSizeForKeyword(m_document, scope.fontDescription().keywordSize(), scope.fontDescription().fixedPitchFontType()); 4210019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } else { 4220019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch Settings* settings = m_document->settings(); 4230019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch float fixedScaleFactor = (settings && settings->defaultFixedFontSize() && settings->defaultFontSize()) 4240019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch ? static_cast<float>(settings->defaultFixedFontSize()) / settings->defaultFontSize() 4250019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch : 1; 426197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch size = parentFontDescription.fixedPitchFontType() == FixedPitchFont ? 4270019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().specifiedSize() / fixedScaleFactor : 4280019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch scope.fontDescription().specifiedSize() * fixedScaleFactor; 4290019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch } 4300019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci scope.fontDescription().setSpecifiedSize(size); 4327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateComputedSize(scope.fontDescription(), style); 4330019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 4340019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 435d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontBuilder::updateComputedSize(RenderStyle* style, const RenderStyle* parentStyle) 4360019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 4370019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescriptionChangeScope scope(this); 4387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateComputedSize(scope.fontDescription(), style); 4397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 4400019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontBuilder::updateComputedSize(FontDescription& fontDescription, RenderStyle* style) 4427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci float computedSize = getComputedSizeFromSpecifiedSize(fontDescription, style->effectiveZoom(), fontDescription.specifiedSize()); 444e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) float multiplier = style->textAutosizingMultiplier(); 445e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (multiplier > 1) 446e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) computedSize = TextAutosizer::computeAutosizedFontSize(computedSize, multiplier); 4477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fontDescription.setComputedSize(computedSize); 4480019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 4490019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4500019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch// FIXME: style param should come first 4516f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid FontBuilder::createFont(PassRefPtrWillBeRawPtr<FontSelector> fontSelector, const RenderStyle* parentStyle, RenderStyle* style) 4520019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 4530019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch if (!m_fontDirty) 4540019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch return; 4550019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 456d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) updateComputedSize(style, parentStyle); 4570019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch checkForGenericFamilyChange(style, parentStyle); 4580019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch checkForOrientationChange(style); 4590019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch style->font().update(fontSelector); 4600019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch m_fontDirty = false; 4610019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 4620019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid FontBuilder::createFontForDocument(PassRefPtrWillBeRawPtr<FontSelector> fontSelector, RenderStyle* documentStyle) 4640019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch{ 4650019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontDescription fontDescription = FontDescription(); 4667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci fontDescription.setLocale(documentStyle->locale()); 4670019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontDescription.setScript(localeToScriptCodeForFontSelection(documentStyle->locale())); 46843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 46943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) setFontFamilyToStandard(fontDescription, m_document); 4707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 4717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setSize(fontDescription, FontDescription::Size(FontSize::initialKeywordSize(), 0.0f, false)); 4727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci updateComputedSize(fontDescription, documentStyle); 4730019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4740019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch FontOrientation fontOrientation; 4750019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch NonCJKGlyphOrientation glyphOrientation; 4760019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch getFontAndGlyphOrientation(documentStyle, fontOrientation, glyphOrientation); 4770019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontDescription.setOrientation(fontOrientation); 4780019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch fontDescription.setNonCJKGlyphOrientation(glyphOrientation); 4790019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch documentStyle->setFontDescription(fontDescription); 4800019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch documentStyle->font().update(fontSelector); 4810019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 4820019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch 4830019e4eead4d990e4304c54a9028aca9122fb256Ben Murdoch} 484