summaryrefslogtreecommitdiffstats
path: root/gfx/thebes/gfxFT2FontList.h
blob: 63187ba2659763fdf85da3266e440d33a21e6622 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef GFX_FT2FONTLIST_H
#define GFX_FT2FONTLIST_H

#include "mozilla/MemoryReporting.h"
#include "gfxPlatformFontList.h"

namespace mozilla {
    namespace dom {
        class FontListEntry;
    };
};
using mozilla::dom::FontListEntry;

class FontNameCache;
typedef struct FT_FaceRec_* FT_Face;
class nsZipArchive;

class FT2FontEntry : public gfxFontEntry
{
public:
    FT2FontEntry(const nsAString& aFaceName) :
        gfxFontEntry(aFaceName),
        mFTFace(nullptr),
        mFontFace(nullptr),
        mFTFontIndex(0)
    {
    }

    ~FT2FontEntry();

    const nsString& GetName() const {
        return Name();
    }

    // create a font entry for a downloaded font
    static FT2FontEntry* 
    CreateFontEntry(const nsAString& aFontName,
                    uint16_t aWeight,
                    int16_t aStretch,
                    uint8_t aStyle,
                    const uint8_t* aFontData,
                    uint32_t aLength);

    // create a font entry representing an installed font, identified by
    // a FontListEntry; the freetype and cairo faces will not be instantiated
    // until actually needed
    static FT2FontEntry*
    CreateFontEntry(const FontListEntry& aFLE);

    // Create a font entry for a given freetype face; if it is an installed font,
    // also record the filename and index.
    // aFontData (if non-nullptr) is NS_Malloc'ed data that aFace depends on,
    // to be freed after the face is destroyed
    static FT2FontEntry* 
    CreateFontEntry(FT_Face aFace,
                    const char *aFilename, uint8_t aIndex,
                    const nsAString& aName,
                    const uint8_t* aFontData = nullptr);

    virtual gfxFont *CreateFontInstance(const gfxFontStyle *aFontStyle,
                                        bool aNeedsBold) override;

    // Create (if necessary) and return the cairo_font_face for this font.
    // This may fail and return null, so caller must be prepared to handle this.
    cairo_font_face_t *CairoFontFace();

    // Create a cairo_scaled_font for this face, with the given style.
    // This may fail and return null, so caller must be prepared to handle this.
    cairo_scaled_font_t *CreateScaledFont(const gfxFontStyle *aStyle);

    nsresult ReadCMAP(FontInfoData *aFontInfoData = nullptr) override;

    virtual hb_blob_t* GetFontTable(uint32_t aTableTag) override;

    virtual nsresult CopyFontTable(uint32_t aTableTag,
                                   nsTArray<uint8_t>& aBuffer) override;

    // Check for various kinds of brokenness, and set flags on the entry
    // accordingly so that we avoid using bad font tables
    void CheckForBrokenFont(gfxFontFamily *aFamily);

    virtual void AddSizeOfExcludingThis(mozilla::MallocSizeOf aMallocSizeOf,
                                        FontListSizes* aSizes) const override;
    virtual void AddSizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf,
                                        FontListSizes* aSizes) const override;

    FT_Face mFTFace;
    cairo_font_face_t *mFontFace;

    nsCString mFilename;
    uint8_t   mFTFontIndex;
};

class FT2FontFamily : public gfxFontFamily
{
public:
    // Flags to indicate whether a font should be "visible" in the global
    // font list (available for use in font-family), or "hidden" (available
    // only to support a matching data: URI used in @font-face).
    typedef enum {
        kVisible,
        kHidden
    } Visibility;

    FT2FontFamily(const nsAString& aName) :
        gfxFontFamily(aName) { }

    // Append this family's faces to the IPC fontlist
    void AddFacesToFontList(InfallibleTArray<FontListEntry>* aFontList,
                            Visibility aVisibility);
};

class gfxFT2FontList : public gfxPlatformFontList
{
public:
    gfxFT2FontList();
    virtual ~gfxFT2FontList();

    virtual gfxFontEntry* LookupLocalFont(const nsAString& aFontName,
                                          uint16_t aWeight,
                                          int16_t aStretch,
                                          uint8_t aStyle);

    virtual gfxFontEntry* MakePlatformFont(const nsAString& aFontName,
                                           uint16_t aWeight,
                                           int16_t aStretch,
                                           uint8_t aStyle,
                                           const uint8_t* aFontData,
                                           uint32_t aLength);

    void GetSystemFontList(InfallibleTArray<FontListEntry>* retValue);

    static gfxFT2FontList* PlatformFontList() {
        return static_cast<gfxFT2FontList*>(gfxPlatformFontList::PlatformFontList());
    }

    virtual void GetFontFamilyList(nsTArray<RefPtr<gfxFontFamily> >& aFamilyArray);

    void WillShutdown();

protected:
    typedef enum {
        kUnknown,
        kStandard
    } StandardFile;

    // initialize font lists
    virtual nsresult InitFontListForPlatform() override;

    void AppendFaceFromFontListEntry(const FontListEntry& aFLE,
                                     StandardFile aStdFile);

    void AppendFacesFromFontFile(const nsCString& aFileName,
                                 FontNameCache *aCache,
                                 StandardFile aStdFile,
                                 FT2FontFamily::Visibility aVisibility);

    void AppendFacesFromOmnijarEntry(nsZipArchive *aReader,
                                     const nsCString& aEntryName,
                                     FontNameCache *aCache,
                                     bool aJarChanged);

    // the defaults here are suitable for reading bundled fonts from omnijar
    void AppendFacesFromCachedFaceList(const nsCString& aFileName,
                                       const nsCString& aFaceList,
                                       StandardFile aStdFile = kStandard,
                                       FT2FontFamily::Visibility aVisibility =
                                           FT2FontFamily::kVisible);

    void AddFaceToList(const nsCString& aEntryName, uint32_t aIndex,
                       StandardFile aStdFile,
                       FT2FontFamily::Visibility aVisibility,
                       FT_Face aFace, nsCString& aFaceList);

    void FindFonts();

    void FindFontsInOmnijar(FontNameCache *aCache);

    void FindFontsInDir(const nsCString& aDir, FontNameCache* aFNC,
                        FT2FontFamily::Visibility aVisibility);

    virtual gfxFontFamily*
    GetDefaultFontForPlatform(const gfxFontStyle* aStyle) override;

    nsTHashtable<nsStringHashKey> mSkipSpaceLookupCheckFamilies;

private:
    FontFamilyTable mHiddenFontFamilies;

    mozilla::UniquePtr<FontNameCache> mFontNameCache;
    int64_t mJarModifiedTime;
    nsCOMPtr<nsIObserver> mObserver;
};

#endif /* GFX_FT2FONTLIST_H */