15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005, 2008, 2010 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Alexey Proskuryakov 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 1002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 1302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * documentation and/or other materials provided with the distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * its contributors may be used to endorse or promote products derived 1602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch * from this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/SimpleFontData.h" 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 337757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/MathExtras.h" 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace std; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const float smallCapsFontSizeMultiplier = 0.7f; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const float emphasisMarkFontSizeMultiplier = 0.5f; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)SimpleFontData::SimpleFontData(const FontPlatformData& platformData, PassRefPtr<CustomFontData> customData, bool isTextOrientationFallback) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_maxCharWidth(-1) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_avgCharWidth(-1) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_platformData(platformData) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_treatAsFixedPitch(false) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isTextOrientationFallback(isTextOrientationFallback) 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isBrokenIdeographFallback(false) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL) 50d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_verticalData(nullptr) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_hasVerticalGlyphs(false) 5351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_customFontData(customData) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformInit(); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformGlyphInit(); 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformCharWidthInit(); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (platformData.orientation() == Vertical && !isTextOrientationFallback) { 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_verticalData = platformData.verticalData(); 61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_hasVerticalGlyphs = m_verticalData.get() && m_verticalData->hasVerticalMetrics(); 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)SimpleFontData::SimpleFontData(PassRefPtr<CustomFontData> customData, float fontSize, bool syntheticBold, bool syntheticItalic) 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_platformData(FontPlatformData(fontSize, syntheticBold, syntheticItalic)) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_treatAsFixedPitch(false) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isTextOrientationFallback(false) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_isBrokenIdeographFallback(false) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL) 72d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) , m_verticalData(nullptr) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_hasVerticalGlyphs(false) 7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) , m_customFontData(customData) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 7751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (m_customFontData) 7851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) m_customFontData->initializeFontData(this, fontSize); 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Estimates of avgCharWidth and maxCharWidth for platforms that don't support accessing these values from the font. 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SimpleFontData::initCharWidths() 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page(); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Treat the width of a '0' as the avgCharWidth. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_avgCharWidth <= 0.f && glyphPageZero) { 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static const UChar32 digitZeroChar = '0'; 89c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) Glyph digitZeroGlyph = glyphPageZero->glyphForCharacter(digitZeroChar); 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (digitZeroGlyph) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_avgCharWidth = widthForGlyph(digitZeroGlyph); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // If we can't retrieve the width of a '0', fall back to the x height. 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_avgCharWidth <= 0.f) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_avgCharWidth = m_fontMetrics.xHeight(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_maxCharWidth <= 0.f) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_maxCharWidth = max(m_avgCharWidth, m_fontMetrics.floatAscent()); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void SimpleFontData::platformGlyphInit() 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page(); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!glyphPageZero) { 106a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("Failed to get glyph page zero."); 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_spaceGlyph = 0; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_spaceWidth = 0; 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_zeroGlyph = 0; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_adjustedSpaceWidth = 0; 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) determinePitch(); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zeroWidthSpaceGlyph = 0; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_missingGlyphData.fontData = this; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_missingGlyphData.glyph = 0; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 118c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_zeroWidthSpaceGlyph = glyphPageZero->glyphForCharacter(0); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Nasty hack to determine if we should round or ceil space widths. 12102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch // If the font is monospace or fake monospace we ceil to ensure that 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // every character and the space are the same width. Otherwise we round. 123c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_spaceGlyph = glyphPageZero->glyphForCharacter(' '); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float width = widthForGlyph(m_spaceGlyph); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_spaceWidth = width; 126c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) m_zeroGlyph = glyphPageZero->glyphForCharacter('0'); 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) m_fontMetrics.setZeroWidth(widthForGlyph(m_zeroGlyph)); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) determinePitch(); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_adjustedSpaceWidth = m_treatAsFixedPitch ? ceilf(width) : roundf(width); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Force the glyph for ZERO WIDTH SPACE to have zero width, unless it is shared with SPACE. 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Helvetica is an example of a non-zero width ZERO WIDTH SPACE glyph. 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // See <http://bugs.webkit.org/show_bug.cgi?id=13178> 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Ask for the glyph for 0 to avoid paging in ZERO WIDTH SPACE. Control characters, including 0, 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // are mapped to the ZERO WIDTH SPACE glyph. 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_zeroWidthSpaceGlyph == m_spaceGlyph) { 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_zeroWidthSpaceGlyph = 0; 138a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) WTF_LOG_ERROR("Font maps SPACE and ZERO WIDTH SPACE to the same glyph. Glyph width will not be overridden."); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_missingGlyphData.fontData = this; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_missingGlyphData.glyph = 0; 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SimpleFontData::~SimpleFontData() 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 14751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (!isSVGFont()) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) platformDestroy(); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isCustomFont()) 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(this); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeFontData(this); 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return this; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Glyph SimpleFontData::glyphForCharacter(UChar32 character) const 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 163a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch // As GlyphPage::size is power of 2 so shifting is valid 164a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch GlyphPageTreeNode* node = GlyphPageTreeNode::getRootChild(this, character >> GlyphPage::sizeBits); 165a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch return node->page() ? node->page()->glyphAt(character & 0xFF) : 0; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SimpleFontData::isSegmented() const 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::verticalRightOrientationFontData() const 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData = DerivedFontData::create(isCustomFont()); 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData->verticalRightOrientation) { 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FontPlatformData verticalRightPlatformData(m_platformData); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) verticalRightPlatformData.setOrientation(Horizontal); 180d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_derivedFontData->verticalRightOrientation = create(verticalRightPlatformData, isCustomFont() ? CustomFontData::create(): nullptr, true); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_derivedFontData->verticalRightOrientation; 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::uprightOrientationFontData() const 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData = DerivedFontData::create(isCustomFont()); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData->uprightOrientation) 190d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_derivedFontData->uprightOrientation = create(m_platformData, isCustomFont() ? CustomFontData::create(): nullptr, true); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_derivedFontData->uprightOrientation; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData = DerivedFontData::create(isCustomFont()); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData->smallCaps) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData->smallCaps = createScaledFontData(fontDescription, smallCapsFontSizeMultiplier); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_derivedFontData->smallCaps; 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::emphasisMarkFontData(const FontDescription& fontDescription) const 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData) 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData = DerivedFontData::create(isCustomFont()); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData->emphasisMark) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData->emphasisMark = createScaledFontData(fontDescription, emphasisMarkFontSizeMultiplier); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_derivedFontData->emphasisMark; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::brokenIdeographFontData() const 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData = DerivedFontData::create(isCustomFont()); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!m_derivedFontData->brokenIdeograph) { 219d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_derivedFontData->brokenIdeograph = create(m_platformData, isCustomFont() ? CustomFontData::create(): nullptr); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_derivedFontData->brokenIdeograph->m_isBrokenIdeographFallback = true; 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_derivedFontData->brokenIdeograph; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String SimpleFontData::description() const 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isSVGFont()) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "[SVG font]"; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isCustomFont()) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return "[custom font]"; 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return platformData().description(); 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassOwnPtr<SimpleFontData::DerivedFontData> SimpleFontData::DerivedFontData::create(bool forCustomFont) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return adoptPtr(new DerivedFontData(forCustomFont)); 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SimpleFontData::DerivedFontData::~DerivedFontData() 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!forCustomFont) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (smallCaps) 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(smallCaps.get()); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (emphasisMark) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(emphasisMark.get()); 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (brokenIdeograph) 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(brokenIdeograph.get()); 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (verticalRightOrientation) 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(verticalRightOrientation.get()); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (uprightOrientation) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) GlyphPageTreeNode::pruneTreeCustomFontData(uprightOrientation.get()); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<SimpleFontData> SimpleFontData::createScaledFontData(const FontDescription& fontDescription, float scaleFactor) const 260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 26151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // FIXME: Support scaled SVG fonts. Given that SVG is scalable in general this should be achievable. 26251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (isSVGFont()) 263d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 265926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return platformCreateScaledFontData(fontDescription, scaleFactor); 266926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 267926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 269