PageRenderTime 24ms CodeModel.GetById 12ms app.highlight 10ms RepoModel.GetById 1ms app.codeStats 0ms

/platform/external/webkit/WebCore/css/CSSSegmentedFontFace.cpp

https://github.com/aharish/totoro-gb-opensource-update2
C++ | 135 lines | 93 code | 17 blank | 25 comment | 19 complexity | 4ee23eef81c85b50e8b29a83254adb33 MD5 | raw file
  1/*
  2 * Copyright (C) 2008 Apple Inc. All rights reserved.
  3 *
  4 * Redistribution and use in source and binary forms, with or without
  5 * modification, are permitted provided that the following conditions
  6 * are met:
  7 * 1. Redistributions of source code must retain the above copyright
  8 *    notice, this list of conditions and the following disclaimer.
  9 * 2. Redistributions in binary form must reproduce the above copyright
 10 *    notice, this list of conditions and the following disclaimer in the
 11 *    documentation and/or other materials provided with the distribution.
 12 *
 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 24 */
 25
 26#include "config.h"
 27#include "CSSSegmentedFontFace.h"
 28
 29#include "CSSFontFace.h"
 30#include "CSSFontSelector.h"
 31#include "FontDescription.h"
 32#include "SegmentedFontData.h"
 33#include "SimpleFontData.h"
 34
 35namespace WebCore {
 36
 37CSSSegmentedFontFace::CSSSegmentedFontFace(CSSFontSelector* fontSelector)
 38    : m_fontSelector(fontSelector)
 39{
 40}
 41
 42CSSSegmentedFontFace::~CSSSegmentedFontFace()
 43{
 44    pruneTable();
 45    unsigned size = m_fontFaces.size();
 46    for (unsigned i = 0; i < size; i++)
 47        m_fontFaces[i]->removedFromSegmentedFontFace(this);
 48}
 49
 50void CSSSegmentedFontFace::pruneTable()
 51{
 52    // Make sure the glyph page tree prunes out all uses of this custom font.
 53    if (m_fontDataTable.isEmpty())
 54        return;
 55    HashMap<unsigned, SegmentedFontData*>::iterator end = m_fontDataTable.end();
 56    for (HashMap<unsigned, SegmentedFontData*>::iterator it = m_fontDataTable.begin(); it != end; ++it)
 57        GlyphPageTreeNode::pruneTreeCustomFontData(it->second);
 58    deleteAllValues(m_fontDataTable);
 59    m_fontDataTable.clear();
 60}
 61
 62bool CSSSegmentedFontFace::isLoaded() const
 63{
 64    unsigned size = m_fontFaces.size();
 65    for (unsigned i = 0; i < size; i++) {
 66        if (!m_fontFaces[i]->isLoaded())
 67            return false;
 68    }
 69    return true;
 70}
 71
 72bool CSSSegmentedFontFace::isValid() const
 73{
 74    unsigned size = m_fontFaces.size();
 75    for (unsigned i = 0; i < size; i++) {
 76        if (!m_fontFaces[i]->isValid())
 77            return false;
 78    }
 79    return true;
 80}
 81
 82void CSSSegmentedFontFace::fontLoaded(CSSFontFace*)
 83{
 84    pruneTable();
 85}
 86
 87void CSSSegmentedFontFace::appendFontFace(PassRefPtr<CSSFontFace> fontFace)
 88{
 89    pruneTable();
 90    fontFace->addedToSegmentedFontFace(this);
 91    m_fontFaces.append(fontFace);
 92}
 93
 94FontData* CSSSegmentedFontFace::getFontData(const FontDescription& fontDescription)
 95{
 96    if (!isValid())
 97        return 0;
 98
 99    FontTraitsMask desiredTraitsMask = fontDescription.traitsMask();
100    unsigned hashKey = fontDescription.computedPixelSize() << FontTraitsMaskWidth | desiredTraitsMask;
101
102    SegmentedFontData* fontData = m_fontDataTable.get(hashKey);
103    if (fontData)
104        return fontData;
105
106    fontData = new SegmentedFontData();
107
108    unsigned size = m_fontFaces.size();
109    for (unsigned i = 0; i < size; i++) {
110        FontTraitsMask traitsMask = m_fontFaces[i]->traitsMask();
111        bool syntheticBold = !(traitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask)) && (desiredTraitsMask & (FontWeight600Mask | FontWeight700Mask | FontWeight800Mask | FontWeight900Mask));
112        bool syntheticItalic = !(traitsMask & FontStyleItalicMask) && (desiredTraitsMask & FontStyleItalicMask);
113        if (const FontData* faceFontData = m_fontFaces[i]->getFontData(fontDescription, syntheticBold, syntheticItalic)) {
114            ASSERT(!faceFontData->isSegmented());
115            const Vector<CSSFontFace::UnicodeRange>& ranges = m_fontFaces[i]->ranges();
116            unsigned numRanges = ranges.size();
117            if (!numRanges)
118                fontData->appendRange(FontDataRange(0, 0x7FFFFFFF, static_cast<const SimpleFontData*>(faceFontData)));
119            else {
120                for (unsigned j = 0; j < numRanges; ++j)
121                    fontData->appendRange(FontDataRange(ranges[j].from(), ranges[j].to(), static_cast<const SimpleFontData*>(faceFontData)));
122            }
123        }
124    }
125    if (fontData->numRanges())
126        m_fontDataTable.set(hashKey, fontData);
127    else {
128        delete fontData;
129        fontData = 0;
130    }
131
132    return fontData;
133}
134
135}