DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (c3d72d38c09e)

VCS Links

Line Code
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
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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 MOZILLA_GFX_UNSCALEDFONTFREETYPE_H_
#define MOZILLA_GFX_UNSCALEDFONTFREETYPE_H_

#include <cairo-ft.h>

#include "2D.h"

namespace mozilla {
namespace gfx {

class ScaledFontFreeType;
class ScaledFontFontconfig;

class UnscaledFontFreeType : public UnscaledFont {
 public:
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(UnscaledFontFreeType, override)
  explicit UnscaledFontFreeType(FT_Face aFace, bool aOwnsFace = false)
      : mFace(aFace), mOwnsFace(aOwnsFace), mIndex(0) {}
  explicit UnscaledFontFreeType(const char* aFile, uint32_t aIndex = 0)
      : mFace(nullptr), mOwnsFace(false), mFile(aFile), mIndex(aIndex) {}
  explicit UnscaledFontFreeType(std::string&& aFile, uint32_t aIndex = 0)
      : mFace(nullptr),
        mOwnsFace(false),
        mFile(std::move(aFile)),
        mIndex(aIndex) {}
  UnscaledFontFreeType(FT_Face aFace, NativeFontResource* aNativeFontResource)
      : mFace(aFace),
        mOwnsFace(false),
        mIndex(0),
        mNativeFontResource(aNativeFontResource) {}
  virtual ~UnscaledFontFreeType() {
    if (mOwnsFace) {
      Factory::ReleaseFTFace(mFace);
    }
  }

  FontType GetType() const override { return FontType::FREETYPE; }

  FT_Face GetFace() const { return mFace; }
  const char* GetFile() const { return mFile.c_str(); }
  uint32_t GetIndex() const { return mIndex; }
  const RefPtr<NativeFontResource>& GetNativeFontResource() const {
    return mNativeFontResource;
  }

  bool GetFontFileData(FontFileDataOutput aDataCallback, void* aBaton) override;

  bool GetFontDescriptor(FontDescriptorOutput aCb, void* aBaton) override;

  bool GetWRFontDescriptor(WRFontDescriptorOutput aCb, void* aBaton) override;

#ifdef MOZ_WIDGET_ANDROID
  FT_Face InitFace();

  already_AddRefed<ScaledFont> CreateScaledFont(
      Float aGlyphSize, const uint8_t* aInstanceData,
      uint32_t aInstanceDataLength, const FontVariation* aVariations,
      uint32_t aNumVariations) override;
#endif

 protected:
  FT_Face mFace;
  bool mOwnsFace;
  std::string mFile;
  uint32_t mIndex;
  RefPtr<NativeFontResource> mNativeFontResource;

  friend class ScaledFontFreeType;
  friend class ScaledFontFontconfig;

  static void GetVariationSettingsFromFace(
      std::vector<FontVariation>* aVariations, FT_Face aFace);

  static void ApplyVariationsToFace(const FontVariation* aVariations,
                                    uint32_t aNumVariations, FT_Face aFace);
};

#ifdef MOZ_WIDGET_GTK
class UnscaledFontFontconfig : public UnscaledFontFreeType {
 public:
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(UnscaledFontFontconfig, override)
  explicit UnscaledFontFontconfig(FT_Face aFace, bool aOwnsFace = false)
      : UnscaledFontFreeType(aFace, aOwnsFace) {}
  explicit UnscaledFontFontconfig(const char* aFile, uint32_t aIndex = 0)
      : UnscaledFontFreeType(aFile, aIndex) {}
  explicit UnscaledFontFontconfig(std::string&& aFile, uint32_t aIndex = 0)
      : UnscaledFontFreeType(std::move(aFile), aIndex) {}
  UnscaledFontFontconfig(FT_Face aFace, NativeFontResource* aNativeFontResource)
      : UnscaledFontFreeType(aFace, aNativeFontResource) {}

  FontType GetType() const override { return FontType::FONTCONFIG; }

  static already_AddRefed<UnscaledFont> CreateFromFontDescriptor(
      const uint8_t* aData, uint32_t aDataLength, uint32_t aIndex);

  already_AddRefed<ScaledFont> CreateScaledFont(
      Float aGlyphSize, const uint8_t* aInstanceData,
      uint32_t aInstanceDataLength, const FontVariation* aVariations,
      uint32_t aNumVariations) override;

  already_AddRefed<ScaledFont> CreateScaledFontFromWRFont(
      Float aGlyphSize, const wr::FontInstanceOptions* aOptions,
      const wr::FontInstancePlatformOptions* aPlatformOptions,
      const FontVariation* aVariations, uint32_t aNumVariations) override;
};
#endif

}  // namespace gfx
}  // namespace mozilla

#endif /* MOZILLA_GFX_UNSCALEDFONTFREETYPE_H_ */