gfxDWriteCommon.h (7389B)
1 /* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #ifndef GFX_DWRITECOMMON_H 7 #define GFX_DWRITECOMMON_H 8 9 // Mozilla includes 10 #include "mozilla/MemoryReporting.h" 11 #include "mozilla/FontPropertyTypes.h" 12 #include "nscore.h" 13 #include "nsCOMPtr.h" 14 #include "gfxFontConstants.h" 15 #include "nsTArray.h" 16 #include "gfxWindowsPlatform.h" 17 18 #include <windows.h> 19 #include <dwrite.h> 20 21 #define GFX_CLEARTYPE_PARAMS "gfx.font_rendering.cleartype_params." 22 #define GFX_CLEARTYPE_PARAMS_GAMMA "gfx.font_rendering.cleartype_params.gamma" 23 #define GFX_CLEARTYPE_PARAMS_CONTRAST \ 24 "gfx.font_rendering.cleartype_params.enhanced_contrast" 25 #define GFX_CLEARTYPE_PARAMS_LEVEL \ 26 "gfx.font_rendering.cleartype_params.cleartype_level" 27 #define GFX_CLEARTYPE_PARAMS_STRUCTURE \ 28 "gfx.font_rendering.cleartype_params.pixel_structure" 29 #define GFX_CLEARTYPE_PARAMS_MODE \ 30 "gfx.font_rendering.cleartype_params.rendering_mode" 31 32 #define DISPLAY1_REGISTRY_KEY \ 33 HKEY_CURRENT_USER, L"Software\\Microsoft\\Avalon.Graphics\\DISPLAY1" 34 35 #define ENHANCED_CONTRAST_VALUE_NAME L"EnhancedContrastLevel" 36 37 // FIXME: This shouldn't look at constants probably. 38 static inline DWRITE_FONT_STRETCH DWriteFontStretchFromStretch( 39 mozilla::FontStretch aStretch) { 40 if (aStretch == mozilla::FontStretch::ULTRA_CONDENSED) { 41 return DWRITE_FONT_STRETCH_ULTRA_CONDENSED; 42 } 43 if (aStretch == mozilla::FontStretch::EXTRA_CONDENSED) { 44 return DWRITE_FONT_STRETCH_EXTRA_CONDENSED; 45 } 46 if (aStretch == mozilla::FontStretch::CONDENSED) { 47 return DWRITE_FONT_STRETCH_CONDENSED; 48 } 49 if (aStretch == mozilla::FontStretch::SEMI_CONDENSED) { 50 return DWRITE_FONT_STRETCH_SEMI_CONDENSED; 51 } 52 if (aStretch == mozilla::FontStretch::NORMAL) { 53 return DWRITE_FONT_STRETCH_NORMAL; 54 } 55 if (aStretch == mozilla::FontStretch::SEMI_EXPANDED) { 56 return DWRITE_FONT_STRETCH_SEMI_EXPANDED; 57 } 58 if (aStretch == mozilla::FontStretch::EXPANDED) { 59 return DWRITE_FONT_STRETCH_EXPANDED; 60 } 61 if (aStretch == mozilla::FontStretch::EXTRA_EXPANDED) { 62 return DWRITE_FONT_STRETCH_EXTRA_EXPANDED; 63 } 64 if (aStretch == mozilla::FontStretch::ULTRA_EXPANDED) { 65 return DWRITE_FONT_STRETCH_ULTRA_EXPANDED; 66 } 67 return DWRITE_FONT_STRETCH_UNDEFINED; 68 } 69 70 static inline mozilla::FontStretch FontStretchFromDWriteStretch( 71 DWRITE_FONT_STRETCH aStretch) { 72 switch (aStretch) { 73 case DWRITE_FONT_STRETCH_ULTRA_CONDENSED: 74 return mozilla::FontStretch::ULTRA_CONDENSED; 75 case DWRITE_FONT_STRETCH_EXTRA_CONDENSED: 76 return mozilla::FontStretch::EXTRA_CONDENSED; 77 case DWRITE_FONT_STRETCH_CONDENSED: 78 return mozilla::FontStretch::CONDENSED; 79 case DWRITE_FONT_STRETCH_SEMI_CONDENSED: 80 return mozilla::FontStretch::SEMI_CONDENSED; 81 case DWRITE_FONT_STRETCH_NORMAL: 82 return mozilla::FontStretch::NORMAL; 83 case DWRITE_FONT_STRETCH_SEMI_EXPANDED: 84 return mozilla::FontStretch::SEMI_EXPANDED; 85 case DWRITE_FONT_STRETCH_EXPANDED: 86 return mozilla::FontStretch::EXPANDED; 87 case DWRITE_FONT_STRETCH_EXTRA_EXPANDED: 88 return mozilla::FontStretch::EXTRA_EXPANDED; 89 case DWRITE_FONT_STRETCH_ULTRA_EXPANDED: 90 return mozilla::FontStretch::ULTRA_EXPANDED; 91 default: 92 return mozilla::FontStretch::NORMAL; 93 } 94 } 95 96 class gfxDWriteFontFileStream final : public IDWriteFontFileStream { 97 public: 98 /** 99 * Used by the FontFileLoader to create a new font stream, 100 * this font stream is created from data in memory. The memory 101 * passed may be released after object creation, it will be 102 * copied internally. 103 * 104 * @param aData Font data 105 */ 106 gfxDWriteFontFileStream(const uint8_t* aData, uint32_t aLength, 107 uint64_t aFontFileKey); 108 ~gfxDWriteFontFileStream(); 109 110 // IUnknown interface 111 IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { 112 if (iid == __uuidof(IDWriteFontFileStream)) { 113 *ppObject = static_cast<IDWriteFontFileStream*>(this); 114 return S_OK; 115 } else if (iid == __uuidof(IUnknown)) { 116 *ppObject = static_cast<IUnknown*>(this); 117 return S_OK; 118 } else { 119 return E_NOINTERFACE; 120 } 121 } 122 123 IFACEMETHOD_(ULONG, AddRef)() { 124 MOZ_ASSERT(int32_t(mRefCnt) >= 0, "illegal refcnt"); 125 return ++mRefCnt; 126 } 127 128 IFACEMETHOD_(ULONG, Release)(); 129 130 // IDWriteFontFileStream methods 131 virtual HRESULT STDMETHODCALLTYPE 132 ReadFileFragment(void const** fragmentStart, UINT64 fileOffset, 133 UINT64 fragmentSize, OUT void** fragmentContext); 134 135 virtual void STDMETHODCALLTYPE ReleaseFileFragment(void* fragmentContext); 136 137 virtual HRESULT STDMETHODCALLTYPE GetFileSize(OUT UINT64* fileSize); 138 139 virtual HRESULT STDMETHODCALLTYPE GetLastWriteTime(OUT UINT64* lastWriteTime); 140 141 size_t SizeOfExcludingThis(mozilla::MallocSizeOf mallocSizeOf) const { 142 return mData.ShallowSizeOfExcludingThis(mallocSizeOf); 143 } 144 145 size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const { 146 return mallocSizeOf(this) + SizeOfExcludingThis(mallocSizeOf); 147 } 148 149 private: 150 FallibleTArray<uint8_t> mData; 151 mozilla::Atomic<uint32_t> mRefCnt; 152 uint64_t mFontFileKey; 153 }; 154 155 class gfxDWriteFontFileLoader : public IDWriteFontFileLoader { 156 public: 157 gfxDWriteFontFileLoader() {} 158 159 // IUnknown interface 160 IFACEMETHOD(QueryInterface)(IID const& iid, OUT void** ppObject) { 161 if (iid == __uuidof(IDWriteFontFileLoader)) { 162 *ppObject = static_cast<IDWriteFontFileLoader*>(this); 163 return S_OK; 164 } else if (iid == __uuidof(IUnknown)) { 165 *ppObject = static_cast<IUnknown*>(this); 166 return S_OK; 167 } else { 168 return E_NOINTERFACE; 169 } 170 } 171 172 IFACEMETHOD_(ULONG, AddRef)() { return 1; } 173 174 IFACEMETHOD_(ULONG, Release)() { return 1; } 175 176 // IDWriteFontFileLoader methods 177 /** 178 * Important! Note the key here -has- to be a pointer to a uint64_t. 179 */ 180 virtual HRESULT STDMETHODCALLTYPE CreateStreamFromKey( 181 void const* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, 182 OUT IDWriteFontFileStream** fontFileStream); 183 184 /** 185 * Gets the singleton loader instance. Note that when using this font 186 * loader, the key must be a pointer to a unint64_t. 187 */ 188 static IDWriteFontFileLoader* Instance() { 189 if (!mInstance) { 190 mInstance = new gfxDWriteFontFileLoader(); 191 mozilla::gfx::Factory::GetDWriteFactory()->RegisterFontFileLoader( 192 mInstance); 193 } 194 return mInstance; 195 } 196 197 /** 198 * Creates a IDWriteFontFile and IDWriteFontFileStream from aFontData. 199 * The data from aFontData will be copied internally, so the caller 200 * is free to dispose of it once this method returns. 201 * 202 * @param aFontData the font data for the custom font file 203 * @param aLength length of the font data 204 * @param aFontFile out param for the created font file 205 * @param aFontFileStream out param for the corresponding stream 206 * @return HRESULT of internal calls 207 */ 208 static HRESULT CreateCustomFontFile( 209 const uint8_t* aFontData, uint32_t aLength, IDWriteFontFile** aFontFile, 210 gfxDWriteFontFileStream** aFontFileStream); 211 212 size_t SizeOfIncludingThis(mozilla::MallocSizeOf mallocSizeOf) const; 213 214 private: 215 static IDWriteFontFileLoader* mInstance; 216 }; 217 218 #endif /* GFX_DWRITECOMMON_H */