18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontFallbackList.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Font.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontCache.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SegmentedFontData.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectFontFallbackList::FontFallbackList() 390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch : m_pageZero(0) 400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_cachedPrimarySimpleFontData(0) 410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch , m_fontSelector(0) 425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , m_familyIndex(0) 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_pitch(UnknownPitch) 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_loadingCustomFonts(false) 45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_generation(fontCache()->generation()) 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontFallbackList::invalidate(PassRefPtr<FontSelector> fontSelector) 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project releaseFontData(); 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_fontList.clear(); 530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_pageZero = 0; 540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_pages.clear(); 550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_cachedPrimarySimpleFontData = 0; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_familyIndex = 0; 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_pitch = UnknownPitch; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadingCustomFonts = false; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_fontSelector = fontSelector; 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_generation = fontCache()->generation(); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontFallbackList::releaseFontData() 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numFonts = m_fontList.size(); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < numFonts; ++i) { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!m_fontList[i].second) { 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!m_fontList[i].first->isSegmented()); 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project fontCache()->releaseFontData(static_cast<const SimpleFontData*>(m_fontList[i].first)); 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontFallbackList::determinePitch(const Font* font) const 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch const FontData* fontData = primaryFontData(font); 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!fontData->isSegmented()) 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_pitch = static_cast<const SimpleFontData*>(fontData)->pitch(); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const SegmentedFontData* segmentedFontData = static_cast<const SegmentedFontData*>(fontData); 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project unsigned numRanges = segmentedFontData->numRanges(); 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (numRanges == 1) 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_pitch = segmentedFontData->rangeAt(0).fontData()->pitch(); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_pitch = VariablePitch; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectconst FontData* FontFallbackList::fontDataAt(const Font* font, unsigned realizedFontIndex) const 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (realizedFontIndex < m_fontList.size()) 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_fontList[realizedFontIndex].first; // This fallback font is already in our list. 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Make sure we're not passing in some crazy value here. 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(realizedFontIndex == m_fontList.size()); 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (m_familyIndex == cAllFamiliesScanned) 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Ask the font cache for the font data. 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We are obtaining this font for the first time. We keep track of the families we've looked at before 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // in |m_familyIndex|, so that we never scan the same spot in the list twice. getFontData will adjust our 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // |m_familyIndex| as it scans for the right font to make. 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(fontCache()->generation() == m_generation); 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const FontData* result = fontCache()->getFontData(*font, m_familyIndex, m_fontSelector.get()); 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result) { 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_fontList.append(pair<const FontData*, bool>(result, result->isCustomFont())); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (result->isLoading()) 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_loadingCustomFonts = true; 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid FontFallbackList::setPlatformFont(const FontPlatformData& platformData) 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_familyIndex = cAllFamiliesScanned; 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(fontCache()->generation() == m_generation); 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project const FontData* fontData = fontCache()->getCachedFontData(&platformData); 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_fontList.append(pair<const FontData*, bool>(fontData, fontData->isCustomFont())); 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 123