tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 */