15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This file is part of the internal font implementation.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2008, 2010 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007-2008 Torch Mobile, Inc.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef SimpleFontData_h
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define SimpleFontData_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/PlatformExport.h"
28a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/CustomFontData.h"
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/fonts/FontBaseline.h"
301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/fonts/FontData.h"
31f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/FontMetrics.h"
32a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontPlatformData.h"
3319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#include "platform/fonts/GlyphMetricsMap.h"
34a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/GlyphPageTreeNode.h"
35f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/fonts/TypesettingFeatures.h"
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/opentype/OpenTypeVerticalData.h"
371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h"
387757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/OwnPtr.h"
397757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/PassOwnPtr.h"
407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/text/StringHash.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
428abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
437757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/RetainPtr.h"
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FontDescription;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum FontDataVariant { AutoVariant, NormalVariant, SmallCapsVariant, EmphasisMarkVariant, BrokenIdeographVariant };
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum Pitch { UnknownPitch, FixedPitch, VariablePitch };
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)class PLATFORM_EXPORT SimpleFontData : public FontData {
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to create platform fonts.
56d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    static PassRefPtr<SimpleFontData> create(const FontPlatformData& platformData, PassRefPtr<CustomFontData> customData = nullptr, bool isTextOrientationFallback = false)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return adoptRef(new SimpleFontData(platformData, customData, isTextOrientationFallback));
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Used to create SVG Fonts.
6251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    static PassRefPtr<SimpleFontData> create(PassRefPtr<CustomFontData> customData, float fontSize, bool syntheticBold, bool syntheticItalic)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return adoptRef(new SimpleFontData(customData, fontSize, syntheticBold, syntheticItalic));
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~SimpleFontData();
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const SimpleFontData* systemFallback() { return reinterpret_cast<const SimpleFontData*>(-1); }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const FontPlatformData& platformData() const { return m_platformData; }
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const OpenTypeVerticalData* verticalData() const { return m_verticalData.get(); }
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> smallCapsFontData(const FontDescription&) const;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> emphasisMarkFontData(const FontDescription&) const;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> brokenIdeographFontData() const;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> variantFontData(const FontDescription& description, FontDataVariant variant) const
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        switch (variant) {
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case SmallCapsVariant:
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return smallCapsFontData(description);
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case EmphasisMarkVariant:
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return emphasisMarkFontData(description);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case BrokenIdeographVariant:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return brokenIdeographFontData();
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case AutoVariant:
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        case NormalVariant:
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return const_cast<SimpleFontData*>(this);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> verticalRightOrientationFontData() const;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> uprightOrientationFontData() const;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasVerticalGlyphs() const { return m_hasVerticalGlyphs; }
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isTextOrientationFallback() const { return m_isTextOrientationFallback; }
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontMetrics& fontMetrics() { return m_fontMetrics; }
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const FontMetrics& fontMetrics() const { return m_fontMetrics; }
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float sizePerUnit() const { return platformData().size() / (fontMetrics().unitsPerEm() ? fontMetrics().unitsPerEm() : 1); }
10602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float maxCharWidth() const { return m_maxCharWidth; }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMaxCharWidth(float maxCharWidth) { m_maxCharWidth = maxCharWidth; }
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float avgCharWidth() const { return m_avgCharWidth; }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setAvgCharWidth(float avgCharWidth) { m_avgCharWidth = avgCharWidth; }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect boundsForGlyph(Glyph) const;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float widthForGlyph(Glyph glyph) const;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect platformBoundsForGlyph(Glyph) const;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float platformWidthForGlyph(Glyph) const;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float spaceWidth() const { return m_spaceWidth; }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSpaceWidth(float spaceWidth) { m_spaceWidth = spaceWidth; }
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1218abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float syntheticBoldOffset() const { return m_syntheticBoldOffset; }
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Glyph spaceGlyph() const { return m_spaceGlyph; }
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSpaceGlyph(Glyph spaceGlyph) { m_spaceGlyph = spaceGlyph; }
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Glyph zeroWidthSpaceGlyph() const { return m_zeroWidthSpaceGlyph; }
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setZeroWidthSpaceGlyph(Glyph spaceGlyph) { m_zeroWidthSpaceGlyph = spaceGlyph; }
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isZeroWidthSpaceGlyph(Glyph glyph) const { return glyph == m_zeroWidthSpaceGlyph && glyph; }
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Glyph zeroGlyph() const { return m_zeroGlyph; }
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void setZeroGlyph(Glyph zeroGlyph) { m_zeroGlyph = zeroGlyph; }
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1331e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual const SimpleFontData* fontDataForCharacter(UChar32) const OVERRIDE;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Glyph glyphForCharacter(UChar32) const;
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void determinePitch();
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Pitch pitch() const { return m_treatAsFixedPitch ? FixedPitch : VariablePitch; }
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool isSVGFont() const { return m_customFontData && m_customFontData->isSVGFont(); }
14151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    virtual bool isCustomFont() const OVERRIDE { return m_customFontData; }
14251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    virtual bool isLoading() const OVERRIDE { return m_customFontData ? m_customFontData->isLoading() : false; }
14351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    virtual bool isLoadingFallback() const OVERRIDE { return m_customFontData ? m_customFontData->isLoadingFallback() : false; }
1441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual bool isSegmented() const OVERRIDE;
145d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    virtual bool shouldSkipDrawing() const OVERRIDE { return m_customFontData && m_customFontData->shouldSkipDrawing(); }
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const GlyphData& missingGlyphData() const { return m_missingGlyphData; }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMissingGlyphData(const GlyphData& glyphData) { m_missingGlyphData = glyphData; }
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1508abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const SimpleFontData* getCompositeFontReferenceFontData(NSFont *key) const;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    NSFont* getNSFont() const { return m_platformData.font(); }
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CFDictionaryRef getCFStringAttributes(TypesettingFeatures, FontOrientation) const;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canRenderCombiningCharacterSequence(const UChar*, size_t) const;
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    PassRefPtr<CustomFontData> customFontData() const { return m_customFontData; }
1629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
16310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    // Implemented by the platform.
16410f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    virtual bool fillGlyphPage(GlyphPage* pageToFill, unsigned offset, unsigned length, UChar* buffer, unsigned bufferLength) const;
16510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch
16610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochprotected:
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SimpleFontData(const FontPlatformData&, PassRefPtr<CustomFontData> customData, bool isTextOrientationFallback = false);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    SimpleFontData(PassRefPtr<CustomFontData> customData, float fontSize, bool syntheticBold, bool syntheticItalic);
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17110f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdochprivate:
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void platformInit();
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void platformGlyphInit();
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void platformCharWidthInit();
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void platformDestroy();
17602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void initCharWidths();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<SimpleFontData> createScaledFontData(const FontDescription&, float scaleFactor) const;
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    PassRefPtr<SimpleFontData> platformCreateScaledFontData(const FontDescription&, float scaleFactor) const;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontMetrics m_fontMetrics;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_maxCharWidth;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_avgCharWidth;
18502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FontPlatformData m_platformData;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable OwnPtr<GlyphMetricsMap<FloatRect> > m_glyphToBoundsMap;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable GlyphMetricsMap<float> m_glyphToWidthMap;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_treatAsFixedPitch;
19202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isTextOrientationFallback;
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isBrokenIdeographFallback;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL)
196926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RefPtr<OpenTypeVerticalData> m_verticalData;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasVerticalGlyphs;
19902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Glyph m_spaceGlyph;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_spaceWidth;
202926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    Glyph m_zeroGlyph;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Glyph m_zeroWidthSpaceGlyph;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GlyphData m_missingGlyphData;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct DerivedFontData {
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        static PassOwnPtr<DerivedFontData> create(bool forCustomFont);
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ~DerivedFontData();
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool forCustomFont;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<SimpleFontData> smallCaps;
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<SimpleFontData> emphasisMark;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<SimpleFontData> brokenIdeograph;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<SimpleFontData> verticalRightOrientation;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<SimpleFontData> uprightOrientation;
2188abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        mutable RetainPtr<CFMutableDictionaryRef> compositeFontReferences;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
22102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DerivedFontData(bool custom)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : forCustomFont(custom)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable OwnPtr<DerivedFontData> m_derivedFontData;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    RefPtr<CustomFontData> m_customFontData;
2329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float m_syntheticBoldOffset;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable HashMap<unsigned, RetainPtr<CFDictionaryRef> > m_CFStringAttributes;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable OwnPtr<HashMap<String, bool> > m_combiningCharacterSequenceSupport;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE FloatRect SimpleFontData::boundsForGlyph(Glyph glyph) const
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isZeroWidthSpaceGlyph(glyph))
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return FloatRect();
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FloatRect bounds;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_glyphToBoundsMap) {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bounds = m_glyphToBoundsMap->metricsForGlyph(glyph);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bounds.width() != cGlyphSizeUnknown)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return bounds;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bounds = platformBoundsForGlyph(glyph);
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_glyphToBoundsMap)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_glyphToBoundsMap = adoptPtr(new GlyphMetricsMap<FloatRect>);
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_glyphToBoundsMap->setMetricsForGlyph(glyph, bounds);
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return bounds;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ALWAYS_INLINE float SimpleFontData::widthForGlyph(Glyph glyph) const
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isZeroWidthSpaceGlyph(glyph))
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float width = m_glyphToWidthMap.metricsForGlyph(glyph);
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (width != cGlyphSizeUnknown)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return width;
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (isSVGFont())
27151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        width = m_customFontData->widthForSVGGlyph(glyph, m_platformData.size());
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(OPENTYPE_VERTICAL)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (m_verticalData)
2748abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        width = m_verticalData->advanceHeight(this, glyph) + m_syntheticBoldOffset;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        width = m_verticalData->advanceHeight(this, glyph);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        width = platformWidthForGlyph(glyph);
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_glyphToWidthMap.setMetricsForGlyph(glyph, width);
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return width;
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
287197021e6b966cfb06891637935ef33fff06433d1Ben MurdochDEFINE_FONT_DATA_TYPE_CASTS(SimpleFontData, false);
288197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
289c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // SimpleFontData_h
291