1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (c) 2008, 2009, Google Inc. All rights reserved.
3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without
5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions are
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * met:
7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions of source code must retain the above copyright
9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer.
10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Redistributions in binary form must reproduce the above
11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * copyright notice, this list of conditions and the following disclaimer
12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * in the documentation and/or other materials provided with the
13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * distribution.
14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *     * Neither the name of Google Inc. nor the names of its
15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * contributors may be used to endorse or promote products derived from
16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * this software without specific prior written permission.
17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *
18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SimpleFontData.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Font.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontCache.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FloatRect.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "FontDescription.h"
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Logging.h"
395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "VDMXParser.h"
40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SkFontHost.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SkPaint.h"
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "SkTime.h"
445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SkTypeface.h"
455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "SkTypes.h"
46635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore {
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project// Smallcaps versions of fonts are 70% the size of the normal font.
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic const float smallCapsFraction = 0.7f;
51f05b935882198ccf7d81675736e3aeb089c5113aBen Murdochstatic const float emphasisMarkFraction = .5;
525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// This is the largest VDMX table which we'll try to load and parse.
535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianstatic const size_t maxVDMXTableSize = 1024 * 1024;  // 1 MB
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::platformInit()
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
574576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_platformData.size()) {
582fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_fontMetrics.reset();
594576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_avgCharWidth = 0;
604576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        m_maxCharWidth = 0;
614576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return;
624576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    }
634576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPaint paint;
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPaint::FontMetrics metrics;
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_platformData.setupPaint(&paint);
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    paint.getFontMetrics(&metrics);
695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    const SkFontID fontID = m_platformData.uniqueID();
705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    static const uint32_t vdmxTag = SkSetFourByteTag('V', 'D', 'M', 'X');
725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int pixelSize = m_platformData.size() + 0.5;
735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    int vdmxAscent, vdmxDescent;
745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    bool isVDMXValid = false;
755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    size_t vdmxSize = SkFontHost::GetTableSize(fontID, vdmxTag);
775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (vdmxSize && vdmxSize < maxVDMXTableSize) {
785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        uint8_t* vdmxTable = (uint8_t*) fastMalloc(vdmxSize);
795f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        if (vdmxTable
805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            && SkFontHost::GetTableData(fontID, vdmxTag, 0, vdmxSize, vdmxTable) == vdmxSize
815f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            && parseVDMX(&vdmxAscent, &vdmxDescent, vdmxTable, vdmxSize, pixelSize))
825f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            isVDMXValid = true;
835f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        fastFree(vdmxTable);
845f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    }
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float ascent;
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float descent;
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // Beware those who step here: This code is designed to match Win32 font
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // metrics *exactly*.
915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (isVDMXValid) {
922fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ascent = vdmxAscent;
932fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        descent = -vdmxDescent;
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    } else {
955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        SkScalar height = -metrics.fAscent + metrics.fDescent + metrics.fLeading;
962fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ascent = SkScalarRound(-metrics.fAscent);
972fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        descent = SkScalarRound(height) - ascent;
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1002fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setAscent(ascent);
1012fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setDescent(descent);
1022fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
1032fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float xHeight;
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (metrics.fXHeight)
1052fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        xHeight = metrics.fXHeight;
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else {
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // hack taken from the Windows port
1082fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        xHeight = ascent * 0.56f;
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1112fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    float lineGap = SkScalarToFloat(metrics.fLeading);
1122fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setLineGap(lineGap);
1132fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setXHeight(xHeight);
1142fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap));
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1162bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (platformData().orientation() == Vertical && !isTextOrientationFallback()) {
117f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        static const uint32_t vheaTag = SkSetFourByteTag('v', 'h', 'e', 'a');
118f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        static const uint32_t vorgTag = SkSetFourByteTag('V', 'O', 'R', 'G');
119f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        size_t vheaSize = SkFontHost::GetTableSize(fontID, vheaTag);
120f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        size_t vorgSize = SkFontHost::GetTableSize(fontID, vorgTag);
1212bde8e466a4451c7319e3a072d118917957d6554Steve Block        if ((vheaSize > 0) || (vorgSize > 0))
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block            m_hasVerticalGlyphs = true;
123f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    }
124f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // In WebKit/WebCore/platform/graphics/SimpleFontData.cpp, m_spaceWidth is
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // calculated for us, but we need to calculate m_maxCharWidth and
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    // m_avgCharWidth in order for text entry widgets to be sized correctly.
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    SkScalar xRange = metrics.fXMax - metrics.fXMin;
1305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_maxCharWidth = SkScalarRound(xRange * SkScalarRound(m_platformData.size()));
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (metrics.fAvgCharWidth)
133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        m_avgCharWidth = SkScalarRound(metrics.fAvgCharWidth);
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    else {
1352fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        m_avgCharWidth = xHeight;
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (glyphPageZero) {
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            static const UChar32 x_char = 'x';
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            const Glyph xGlyph = glyphPageZero->glyphDataForCharacter(x_char).glyph;
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (xGlyph)
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                m_avgCharWidth = widthForGlyph(xGlyph);
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianvoid SimpleFontData::platformCharWidthInit()
1505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
1515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // charwidths are set in platformInit.
1525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
1535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::platformDestroy()
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
158f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochSimpleFontData* SimpleFontData::scaledFontData(const FontDescription& fontDescription, float scaleFactor) const
159f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
160f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    const float scaledSize = lroundf(fontDescription.computedSize() * scaleFactor);
161f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return new SimpleFontData(FontPlatformData(m_platformData, scaledSize), isCustomFont(), false);
162f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
163f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
164635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectSimpleFontData* SimpleFontData::smallCapsFontData(const FontDescription& fontDescription) const
165635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
166f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData)
167f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData = DerivedFontData::create(isCustomFont());
168f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData->smallCaps)
169f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData->smallCaps = scaledFontData(fontDescription, smallCapsFraction);
170f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
171f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_derivedFontData->smallCaps.get();
172f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch}
173f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch
174f05b935882198ccf7d81675736e3aeb089c5113aBen MurdochSimpleFontData* SimpleFontData::emphasisMarkFontData(const FontDescription& fontDescription) const
175f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch{
176f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData)
177f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData = DerivedFontData::create(isCustomFont());
178f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    if (!m_derivedFontData->emphasisMark)
179f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        m_derivedFontData->emphasisMark = scaledFontData(fontDescription, emphasisMarkFraction);
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
181f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    return m_derivedFontData->emphasisMark.get();
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
183635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool SimpleFontData::containsCharacters(const UChar* characters, int length) const
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
186635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPaint paint;
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    static const unsigned maxBufferCount = 64;
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    uint16_t glyphs[maxBufferCount];
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_platformData.setupPaint(&paint);
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    paint.setTextEncoding(SkPaint::kUTF16_TextEncoding);
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    while (length > 0) {
194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int n = SkMin32(length, SK_ARRAY_COUNT(glyphs));
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // textToGlyphs takes a byte count so we double the character count.
197635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        int count = paint.textToGlyphs(characters, n * 2, glyphs);
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        for (int i = 0; i < count; i++) {
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (0 == glyphs[i])
200635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                return false;       // missing glyph
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
202635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        characters += n;
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        length -= n;
205635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return true;
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid SimpleFontData::determinePitch()
211635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    m_treatAsFixedPitch = platformData().isFixedPitch();
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
21521939df44de1705786c545cd1bf519d47250322dBen MurdochFloatRect SimpleFontData::platformBoundsForGlyph(Glyph) const
21621939df44de1705786c545cd1bf519d47250322dBen Murdoch{
21721939df44de1705786c545cd1bf519d47250322dBen Murdoch    return FloatRect();
21821939df44de1705786c545cd1bf519d47250322dBen Murdoch}
21921939df44de1705786c545cd1bf519d47250322dBen Murdoch
22021939df44de1705786c545cd1bf519d47250322dBen Murdochfloat SimpleFontData::platformWidthForGlyph(Glyph glyph) const
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
2224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    if (!m_platformData.size())
2234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang        return 0;
2244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkASSERT(sizeof(glyph) == 2);   // compile-time assert
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkPaint paint;
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    m_platformData.setupPaint(&paint);
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    paint.setTextEncoding(SkPaint::kGlyphID_TextEncoding);
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SkScalar width = paint.measureText(&glyph, 2);
2335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
234dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // Though WebKit supports non-integral advances, Skia only supports them
235dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // for "subpixel" (distinct from LCD subpixel antialiasing) text, which
236dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    // we don't use.
23721939df44de1705786c545cd1bf519d47250322dBen Murdoch    return round(SkScalarToFloat(width));
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}  // namespace WebCore
241