15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef CSSFontFace_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define CSSFontFace_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSFontFaceSource.h"
30f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "core/css/CSSSegmentedFontFace.h"
319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/FontFace.h"
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "wtf/Deque.h"
33591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Forward.h"
34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassRefPtr.h"
35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FontDescription;
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class RemoteFontFaceSource;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class SimpleFontData;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuclass CSSFontFace FINAL : public NoBaseWillBeGarbageCollectedFinalized<CSSFontFace> {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    struct UnicodeRange;
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    class UnicodeRangeSet;
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    CSSFontFace(FontFace* fontFace, Vector<UnicodeRange>& ranges)
49d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : m_ranges(ranges)
50f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        , m_segmentedFontFace(nullptr)
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        , m_fontFace(fontFace)
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT(m_fontFace);
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
55a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    FontFace* fontFace() const { return m_fontFace; }
579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
581e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    UnicodeRangeSet& ranges() { return m_ranges; }
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
60e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void setSegmentedFontFace(CSSSegmentedFontFace*);
61f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void clearSegmentedFontFace() { m_segmentedFontFace = nullptr; }
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    bool isValid() const { return !m_sources.isEmpty(); }
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void addSource(PassOwnPtrWillBeRawPtr<CSSFontFaceSource>);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
67d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void didBeginLoad();
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void fontLoaded(RemoteFontFaceSource*);
69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    void fontLoadWaitLimitExceeded(RemoteFontFaceSource*);
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    PassRefPtr<SimpleFontData> getFontData(const FontDescription&);
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct UnicodeRange {
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UnicodeRange(UChar32 from, UChar32 to)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            : m_from(from)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            , m_to(to)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar32 from() const { return m_from; }
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar32 to() const { return m_to; }
821e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        bool contains(UChar32 c) const { return m_from <= c && c <= m_to; }
83d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool operator<(const UnicodeRange& other) const { return m_from < other.m_from; }
84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        bool operator<(UChar32 c) const { return m_to < c; }
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    private:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar32 m_from;
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UChar32 m_to;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
911e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    class UnicodeRangeSet {
921e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    public:
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        explicit UnicodeRangeSet(const Vector<UnicodeRange>&);
94f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        bool contains(UChar32) const;
951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        bool intersectsWith(const String&) const;
9651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        bool isEntireRange() const { return m_ranges.isEmpty(); }
971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        size_t size() const { return m_ranges.size(); }
981e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        const UnicodeRange& rangeAt(size_t i) const { return m_ranges[i]; }
991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    private:
10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        Vector<UnicodeRange> m_ranges; // If empty, represents the whole code space.
1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    };
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    FontFace::LoadStatus loadStatus() const { return m_fontFace->loadStatus(); }
104f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    bool maybeScheduleFontLoad(const FontDescription&, UChar32);
105d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void load();
106d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    void load(const FontDescription&);
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
108d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    bool hadBlankText() { return isValid() && m_sources.first()->hadBlankText(); }
109d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
110f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    void trace(Visitor*);
111f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    void setLoadStatus(FontFace::LoadStatus);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    UnicodeRangeSet m_ranges;
116f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RawPtrWillBeMember<CSSSegmentedFontFace> m_segmentedFontFace;
117d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    WillBeHeapDeque<OwnPtrWillBeMember<CSSFontFaceSource> > m_sources;
118f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    RawPtrWillBeMember<FontFace> m_fontFace;
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
124