~ubuntu-branches/ubuntu/raring/qtwebkit-source/raring-proposed

« back to all changes in this revision

Viewing changes to Source/WebCore/platform/graphics/GlyphMetricsMap.h

  • Committer: Package Import Robot
  • Author(s): Jonathan Riddell
  • Date: 2013-02-18 14:24:18 UTC
  • Revision ID: package-import@ubuntu.com-20130218142418-eon0jmjg3nj438uy
Tags: upstream-2.3
ImportĀ upstreamĀ versionĀ 2.3

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2006, 2009 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
 *
 
8
 * 1.  Redistributions of source code must retain the above copyright
 
9
 *     notice, this list of conditions and the following disclaimer. 
 
10
 * 2.  Redistributions in binary form must reproduce the above copyright
 
11
 *     notice, this list of conditions and the following disclaimer in the
 
12
 *     documentation and/or other materials provided with the distribution. 
 
13
 * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
 
14
 *     its contributors may be used to endorse or promote products derived
 
15
 *     from this software without specific prior written permission. 
 
16
 *
 
17
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 
18
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 
19
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 
20
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 
21
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 
22
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 
23
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 
24
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
27
 */
 
28
 
 
29
#ifndef GlyphMetricsMap_h
 
30
#define GlyphMetricsMap_h
 
31
 
 
32
#include "Glyph.h"
 
33
#include <wtf/FixedArray.h>
 
34
#include <wtf/HashMap.h>
 
35
#include <wtf/OwnPtr.h>
 
36
#include <wtf/unicode/Unicode.h>
 
37
 
 
38
namespace WebCore {
 
39
 
 
40
const float cGlyphSizeUnknown = -1;
 
41
 
 
42
template<class T> class GlyphMetricsMap {
 
43
    WTF_MAKE_NONCOPYABLE(GlyphMetricsMap);
 
44
public:
 
45
    GlyphMetricsMap() : m_filledPrimaryPage(false) { }
 
46
    ~GlyphMetricsMap()
 
47
    { 
 
48
        if (m_pages)
 
49
            deleteAllValues(*m_pages);
 
50
    }
 
51
 
 
52
    T metricsForGlyph(Glyph glyph)
 
53
    {
 
54
        return locatePage(glyph / GlyphMetricsPage::size)->metricsForGlyph(glyph);
 
55
    }
 
56
 
 
57
    void setMetricsForGlyph(Glyph glyph, const T& metrics)
 
58
    {
 
59
        locatePage(glyph / GlyphMetricsPage::size)->setMetricsForGlyph(glyph, metrics);
 
60
    }
 
61
 
 
62
private:
 
63
    struct GlyphMetricsPage {
 
64
        static const size_t size = 256; // Usually covers Latin-1 in a single page.
 
65
        FixedArray<T, size> m_metrics;
 
66
 
 
67
        T metricsForGlyph(Glyph glyph) const { return m_metrics[glyph % size]; }
 
68
        void setMetricsForGlyph(Glyph glyph, const T& metrics)
 
69
        {
 
70
            setMetricsForIndex(glyph % size, metrics);
 
71
        }
 
72
        void setMetricsForIndex(unsigned index, const T& metrics)
 
73
        {
 
74
            m_metrics[index] = metrics;
 
75
        }
 
76
    };
 
77
    
 
78
    GlyphMetricsPage* locatePage(unsigned pageNumber)
 
79
    {
 
80
        if (!pageNumber && m_filledPrimaryPage)
 
81
            return &m_primaryPage;
 
82
        return locatePageSlowCase(pageNumber);
 
83
    }
 
84
 
 
85
    GlyphMetricsPage* locatePageSlowCase(unsigned pageNumber);
 
86
    
 
87
    static T unknownMetrics();
 
88
 
 
89
    bool m_filledPrimaryPage;
 
90
    GlyphMetricsPage m_primaryPage; // We optimize for the page that contains glyph indices 0-255.
 
91
    OwnPtr<HashMap<int, GlyphMetricsPage*> > m_pages;
 
92
};
 
93
 
 
94
template<> inline float GlyphMetricsMap<float>::unknownMetrics()
 
95
{
 
96
    return cGlyphSizeUnknown;
 
97
}
 
98
 
 
99
template<> inline FloatRect GlyphMetricsMap<FloatRect>::unknownMetrics()
 
100
{
 
101
    return FloatRect(0, 0, cGlyphSizeUnknown, cGlyphSizeUnknown);
 
102
}
 
103
 
 
104
template<class T> typename GlyphMetricsMap<T>::GlyphMetricsPage* GlyphMetricsMap<T>::locatePageSlowCase(unsigned pageNumber)
 
105
{
 
106
    GlyphMetricsPage* page;
 
107
    if (!pageNumber) {
 
108
        ASSERT(!m_filledPrimaryPage);
 
109
        page = &m_primaryPage;
 
110
        m_filledPrimaryPage = true;
 
111
    } else {
 
112
        if (m_pages) {
 
113
            if ((page = m_pages->get(pageNumber)))
 
114
                return page;
 
115
        } else
 
116
            m_pages = adoptPtr(new HashMap<int, GlyphMetricsPage*>);
 
117
        page = new GlyphMetricsPage;
 
118
        m_pages->set(pageNumber, page);
 
119
    }
 
120
 
 
121
    // Fill in the whole page with the unknown glyph information.
 
122
    for (unsigned i = 0; i < GlyphMetricsPage::size; i++)
 
123
        page->setMetricsForIndex(i, unknownMetrics());
 
124
 
 
125
    return page;
 
126
}
 
127
    
 
128
} // namespace WebCore
 
129
 
 
130
#endif