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