Web Font is downloaded even when all the characters in the document are outside its...
[WebKit-https.git] / Source / WebCore / platform / graphics / FontRanges.cpp
1 /*
2  * Copyright (C) 2008, 2009, 2015 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 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 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 "FontRanges.h"
28
29 #include "Font.h"
30 #include "FontSelector.h"
31 #include <wtf/Assertions.h>
32 #include <wtf/text/WTFString.h>
33
34 namespace WebCore {
35
36 const Font* FontRanges::Range::font() const
37 {
38     return m_fontAccessor->font();
39 }
40
41 FontRanges::FontRanges()
42 {
43 }
44
45 class TrivialFontAccessor final : public FontAccessor {
46 public:
47     static Ref<TrivialFontAccessor> create(Ref<Font>&& font)
48     {
49         return adoptRef(*new TrivialFontAccessor(WTFMove(font)));
50     }
51
52 private:
53     TrivialFontAccessor(RefPtr<Font>&& font)
54         : m_font(WTFMove(font))
55     {
56     }
57
58     const Font* font() const final
59     {
60         return m_font.get();
61     }
62
63     bool isLoading() const final
64     {
65         return m_font->isLoading();
66     }
67
68     RefPtr<Font> m_font;
69 };
70
71 FontRanges::FontRanges(RefPtr<Font>&& font)
72 {
73     if (font)
74         m_ranges.append(Range { 0, 0x7FFFFFFF, TrivialFontAccessor::create(font.releaseNonNull()) });
75 }
76
77 FontRanges::~FontRanges()
78 {
79 }
80
81 GlyphData FontRanges::glyphDataForCharacter(UChar32 character) const
82 {
83     for (auto& range : m_ranges) {
84         if (range.from() <= character && character <= range.to()) {
85             if (auto* font = range.font()) {
86                 auto glyphData = font->glyphDataForCharacter(character);
87                 if (glyphData.glyph)
88                     return glyphData;
89             }
90         }
91     }
92     return GlyphData();
93 }
94
95 const Font* FontRanges::fontForCharacter(UChar32 character) const
96 {
97     return glyphDataForCharacter(character).font;
98 }
99
100 const Font& FontRanges::fontForFirstRange() const
101 {
102     auto* font = m_ranges[0].font();
103     ASSERT(font);
104     return *font;
105 }
106
107 bool FontRanges::isLoading() const
108 {
109     for (auto& range : m_ranges) {
110         if (range.fontAccessor().isLoading())
111             return true;
112     }
113     return false;
114 }
115
116 } // namespace WebCore