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