18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2005, 2008, 2010 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Alexey Proskuryakov 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SimpleFontData.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Font.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h" 355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS) 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontData.h" 385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGFontElement.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontFaceElement.h" 405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SVGGlyphElement.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/MathExtras.h> 445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include <wtf/UnusedParam.h> 455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianusing namespace std; 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 502bde8e466a4451c7319e3a072d118917957d6554Steve BlockSimpleFontData::SimpleFontData(const FontPlatformData& platformData, bool isCustomFont, bool isLoading, bool isTextOrientationFallback) 51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block : m_maxCharWidth(-1) 52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block , m_avgCharWidth(-1) 53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_platformData(platformData) 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_treatAsFixedPitch(false) 55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_isCustomFont(isCustomFont) 56dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_isLoading(isLoading) 572bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_isTextOrientationFallback(isTextOrientationFallback) 582bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_isBrokenIdeographFallback(false) 592bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_hasVerticalGlyphs(false) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project platformInit(); 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project platformGlyphInit(); 635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian platformCharWidthInit(); 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 66dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(SVG_FONTS) 67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochSimpleFontData::SimpleFontData(PassOwnPtr<SVGFontData> svgFontData, int size, bool syntheticBold, bool syntheticItalic) 682bde8e466a4451c7319e3a072d118917957d6554Steve Block : m_platformData(FontPlatformData(size, syntheticBold, syntheticItalic)) 69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_treatAsFixedPitch(false) 70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_svgFontData(svgFontData) 71dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_isCustomFont(true) 72dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch , m_isLoading(false) 732bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_isTextOrientationFallback(false) 742bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_isBrokenIdeographFallback(false) 752bde8e466a4451c7319e3a072d118917957d6554Steve Block , m_hasVerticalGlyphs(false) 76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch SVGFontFaceElement* svgFontFaceElement = m_svgFontData->svgFontFaceElement(); 782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block unsigned unitsPerEm = svgFontFaceElement->unitsPerEm(); 792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 802fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float scale = size; 812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block if (unitsPerEm) 822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block scale /= unitsPerEm; 832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block 842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float xHeight = svgFontFaceElement->xHeight() * scale; 852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float ascent = svgFontFaceElement->ascent() * scale; 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float descent = svgFontFaceElement->descent() * scale; 872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block float lineGap = 0.1f * size; 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch SVGFontElement* associatedFontElement = svgFontFaceElement->associatedFontElement(); 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!xHeight) { 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // Fallback if x_heightAttr is not specified for the font element. 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch Vector<SVGGlyphIdentifier> letterXGlyphs; 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch associatedFontElement->getGlyphIdentifiersForString(String("x", 1), letterXGlyphs); 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch xHeight = letterXGlyphs.isEmpty() ? 2 * ascent / 3 : letterXGlyphs.first().horizontalAdvanceX * scale; 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch } 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setUnitsPerEm(unitsPerEm); 982fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setAscent(ascent); 992fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setDescent(descent); 1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setLineGap(lineGap); 1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setLineSpacing(roundf(ascent) + roundf(descent) + roundf(lineGap)); 1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_fontMetrics.setXHeight(xHeight); 103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 104dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Vector<SVGGlyphIdentifier> spaceGlyphs; 105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch associatedFontElement->getGlyphIdentifiersForString(String(" ", 1), spaceGlyphs); 1062fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_spaceWidth = spaceGlyphs.isEmpty() ? xHeight : spaceGlyphs.first().horizontalAdvanceX * scale; 107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Vector<SVGGlyphIdentifier> numeralZeroGlyphs; 109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch associatedFontElement->getGlyphIdentifiersForString(String("0", 1), numeralZeroGlyphs); 1102fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_avgCharWidth = numeralZeroGlyphs.isEmpty() ? m_spaceWidth : numeralZeroGlyphs.first().horizontalAdvanceX * scale; 111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch Vector<SVGGlyphIdentifier> letterWGlyphs; 113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch associatedFontElement->getGlyphIdentifiersForString(String("W", 1), letterWGlyphs); 1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_maxCharWidth = letterWGlyphs.isEmpty() ? ascent : letterWGlyphs.first().horizontalAdvanceX * scale; 115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 116dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // FIXME: is there a way we can get the space glyph from the SVGGlyphIdentifier above? 117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_spaceGlyph = 0; 118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_zeroWidthSpaceGlyph = 0; 119dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch determinePitch(); 120dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_missingGlyphData.fontData = this; 121dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch m_missingGlyphData.glyph = 0; 122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif 124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if !PLATFORM(QT) 1265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// Estimates of avgCharWidth and maxCharWidth for platforms that don't support accessing these values from the font. 1275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SimpleFontData::initCharWidths() 1285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{ 1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page(); 1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Treat the width of a '0' as the avgCharWidth. 1325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_avgCharWidth <= 0.f && glyphPageZero) { 1335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian static const UChar32 digitZeroChar = '0'; 1345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Glyph digitZeroGlyph = glyphPageZero->glyphDataForCharacter(digitZeroChar).glyph; 1355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (digitZeroGlyph) 1365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian m_avgCharWidth = widthForGlyph(digitZeroGlyph); 1375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // If we can't retrieve the width of a '0', fall back to the x height. 1405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_avgCharWidth <= 0.f) 1412fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_avgCharWidth = m_fontMetrics.xHeight(); 1425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian if (m_maxCharWidth <= 0.f) 1442fc2651226baac27029e38c9d6ef883fa32084dbSteve Block m_maxCharWidth = max(m_avgCharWidth, m_fontMetrics.floatAscent()); 1455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian} 1465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::platformGlyphInit() 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page(); 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!glyphPageZero) { 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("Failed to get glyph page zero."); 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_spaceGlyph = 0; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_spaceWidth = 0; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project determinePitch(); 15521939df44de1705786c545cd1bf519d47250322dBen Murdoch m_zeroWidthSpaceGlyph = 0; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_missingGlyphData.fontData = this; 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_missingGlyphData.glyph = 0; 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 16121939df44de1705786c545cd1bf519d47250322dBen Murdoch m_zeroWidthSpaceGlyph = glyphPageZero->glyphDataForCharacter(0).glyph; 16221939df44de1705786c545cd1bf519d47250322dBen Murdoch 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Nasty hack to determine if we should round or ceil space widths. 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // If the font is monospace or fake monospace we ceil to ensure that 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // every character and the space are the same width. Otherwise we round. 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_spaceGlyph = glyphPageZero->glyphDataForCharacter(' ').glyph; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project float width = widthForGlyph(m_spaceGlyph); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_spaceWidth = width; 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project determinePitch(); 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Force the glyph for ZERO WIDTH SPACE to have zero width, unless it is shared with SPACE. 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Helvetica is an example of a non-zero width ZERO WIDTH SPACE glyph. 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // See <http://bugs.webkit.org/show_bug.cgi?id=13178> 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ask for the glyph for 0 to avoid paging in ZERO WIDTH SPACE. Control characters, including 0, 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // are mapped to the ZERO WIDTH SPACE glyph. 17621939df44de1705786c545cd1bf519d47250322dBen Murdoch if (m_zeroWidthSpaceGlyph == m_spaceGlyph) { 17721939df44de1705786c545cd1bf519d47250322dBen Murdoch m_zeroWidthSpaceGlyph = 0; 17821939df44de1705786c545cd1bf519d47250322dBen Murdoch LOG_ERROR("Font maps SPACE and ZERO WIDTH SPACE to the same glyph. Glyph width will not be overridden."); 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_missingGlyphData.fontData = this; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_missingGlyphData.glyph = 0; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSimpleFontData::~SimpleFontData() 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(SVG_FONTS) 189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_svgFontData || !m_svgFontData->svgFontFaceElement()) 190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project platformDestroy(); 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1936b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner if (!isCustomFont()) 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GlyphPageTreeNode::pruneTreeFontData(this); 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst SimpleFontData* SimpleFontData::fontDataForCharacter(UChar32) const 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return this; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool SimpleFontData::isSegmented() const 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return false; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2072bde8e466a4451c7319e3a072d118917957d6554Steve BlockSimpleFontData* SimpleFontData::verticalRightOrientationFontData() const 2082bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 2092bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_derivedFontData) 2102bde8e466a4451c7319e3a072d118917957d6554Steve Block m_derivedFontData = DerivedFontData::create(isCustomFont()); 2112bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_derivedFontData->verticalRightOrientation) { 2122bde8e466a4451c7319e3a072d118917957d6554Steve Block FontPlatformData verticalRightPlatformData(m_platformData); 2132bde8e466a4451c7319e3a072d118917957d6554Steve Block verticalRightPlatformData.setOrientation(Horizontal); 2142bde8e466a4451c7319e3a072d118917957d6554Steve Block m_derivedFontData->verticalRightOrientation = new SimpleFontData(verticalRightPlatformData, isCustomFont(), false, true); 2152bde8e466a4451c7319e3a072d118917957d6554Steve Block } 2162bde8e466a4451c7319e3a072d118917957d6554Steve Block return m_derivedFontData->verticalRightOrientation.get(); 2172bde8e466a4451c7319e3a072d118917957d6554Steve Block} 2182bde8e466a4451c7319e3a072d118917957d6554Steve Block 2192bde8e466a4451c7319e3a072d118917957d6554Steve BlockSimpleFontData* SimpleFontData::uprightOrientationFontData() const 2202bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 2212bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_derivedFontData) 2222bde8e466a4451c7319e3a072d118917957d6554Steve Block m_derivedFontData = DerivedFontData::create(isCustomFont()); 2232bde8e466a4451c7319e3a072d118917957d6554Steve Block if (!m_derivedFontData->uprightOrientation) 2242bde8e466a4451c7319e3a072d118917957d6554Steve Block m_derivedFontData->uprightOrientation = new SimpleFontData(m_platformData, isCustomFont(), false, true); 2252bde8e466a4451c7319e3a072d118917957d6554Steve Block return m_derivedFontData->uprightOrientation.get(); 2262bde8e466a4451c7319e3a072d118917957d6554Steve Block} 2272bde8e466a4451c7319e3a072d118917957d6554Steve Block 2286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerSimpleFontData* SimpleFontData::brokenIdeographFontData() const 2296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{ 230f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_derivedFontData) 231f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_derivedFontData = DerivedFontData::create(isCustomFont()); 232f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!m_derivedFontData->brokenIdeograph) { 233f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch m_derivedFontData->brokenIdeograph = new SimpleFontData(m_platformData, isCustomFont(), false); 2342bde8e466a4451c7319e3a072d118917957d6554Steve Block m_derivedFontData->brokenIdeograph->m_isBrokenIdeographFallback = true; 2356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner } 236f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return m_derivedFontData->brokenIdeograph.get(); 2376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner} 2386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner 2390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#ifndef NDEBUG 2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString SimpleFontData::description() const 2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (isSVGFont()) 2430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return "[SVG font]"; 2440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (isCustomFont()) 2450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return "[custom font]"; 2460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return platformData().description(); 2480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 2490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 2500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 251f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochPassOwnPtr<SimpleFontData::DerivedFontData> SimpleFontData::DerivedFontData::create(bool forCustomFont) 252f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 253f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return adoptPtr(new DerivedFontData(forCustomFont)); 254f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 255f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 256f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochSimpleFontData::DerivedFontData::~DerivedFontData() 257f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{ 258f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (!forCustomFont) 259f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return; 260f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 261f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (smallCaps) 262f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GlyphPageTreeNode::pruneTreeCustomFontData(smallCaps.get()); 263f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (emphasisMark) 264f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GlyphPageTreeNode::pruneTreeCustomFontData(emphasisMark.get()); 265f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch if (brokenIdeograph) 266f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch GlyphPageTreeNode::pruneTreeCustomFontData(brokenIdeograph.get()); 2672bde8e466a4451c7319e3a072d118917957d6554Steve Block if (verticalRightOrientation) 2682bde8e466a4451c7319e3a072d118917957d6554Steve Block GlyphPageTreeNode::pruneTreeCustomFontData(verticalRightOrientation.get()); 2692bde8e466a4451c7319e3a072d118917957d6554Steve Block if (uprightOrientation) 2702bde8e466a4451c7319e3a072d118917957d6554Steve Block GlyphPageTreeNode::pruneTreeCustomFontData(uprightOrientation.get()); 271f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch} 272f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 274