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