author Sebastian Hengst <>
Mon, 22 Oct 2018 16:33:06 +0300
changeset 442291 c44fbdd5173548c9035256dda8fd3512f67118a8
parent 435041 ada6c9fc290cbf335597c6f435eb9e961bda603c
child 448947 6f3709b3878117466168c40affa7bca0b60cf75b
permissions -rw-r--r--
Bug 1496764 - Disable browser_UsageTelemetry_searchbar.js until telemetry probe has been extended to fix permafail on version increase. a=version-increase-fix

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


#include <dwrite.h>
#include "ScaledFontBase.h"

struct ID2D1GeometrySink;
struct gfxFontStyle;

namespace mozilla {
namespace gfx {

class NativeFontResourceDWrite;
class UnscaledFontDWrite;

class ScaledFontDWrite final : public ScaledFontBase
  ScaledFontDWrite(IDWriteFontFace *aFont,
                   const RefPtr<UnscaledFont>& aUnscaledFont,
                   Float aSize)
    : ScaledFontBase(aUnscaledFont, aSize)
    , mFontFace(aFont)
    , mUseEmbeddedBitmap(false)
    , mForceGDIMode(false)
    , mGamma(2.2f)
    , mContrast(1.0f)

  ScaledFontDWrite(IDWriteFontFace *aFontFace,
                   const RefPtr<UnscaledFont>& aUnscaledFont,
                   Float aSize,
                   bool aUseEmbeddedBitmap,
                   bool aForceGDIMode,
                   IDWriteRenderingParams *aParams,
                   Float aGamma,
                   Float aContrast,
                   const gfxFontStyle* aStyle = nullptr);

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

  already_AddRefed<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget) override;
  void CopyGlyphsToBuilder(const GlyphBuffer &aBuffer, PathBuilder *aBuilder, const Matrix *aTransformHint) override;

  void CopyGlyphsToSink(const GlyphBuffer &aBuffer, ID2D1GeometrySink *aSink);

  void GetGlyphDesignMetrics(const uint16_t* aGlyphIndices, uint32_t aNumGlyphs, GlyphMetrics* aGlyphMetrics) override;

  bool CanSerialize() override { return true; }

  bool GetFontInstanceData(FontInstanceDataOutput aCb, void* aBaton) override;

  bool GetWRFontInstanceOptions(Maybe<wr::FontInstanceOptions>* aOutOptions,
                                Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
                                std::vector<FontVariation>* aOutVariations) override;

  AntialiasMode GetDefaultAAMode() override;

  bool UseEmbeddedBitmaps() { return mUseEmbeddedBitmap; }
  bool ForceGDIMode() { return mForceGDIMode; }

#ifdef USE_SKIA
  SkTypeface* CreateSkTypeface() override;
  SkFontStyle mStyle;

  RefPtr<IDWriteFontFace> mFontFace;
  bool mUseEmbeddedBitmap;
  bool mForceGDIMode;
  // DrawTargetD2D1 requires the IDWriteRenderingParams,
  // but we also separately need to store the gamma and contrast
  // since Skia needs to be able to access these without having
  // to use the full set of DWrite parameters (which would be
  // required to recreate an IDWriteRenderingParams) in a
  // DrawTargetRecording playback.
  RefPtr<IDWriteRenderingParams> mParams;
  Float mGamma;
  Float mContrast;

  cairo_font_face_t* GetCairoFontFace() override;

  friend class NativeFontResourceDWrite;
  friend class UnscaledFontDWrite;

  struct InstanceData
    explicit InstanceData(ScaledFontDWrite* aScaledFont)
      : mUseEmbeddedBitmap(aScaledFont->mUseEmbeddedBitmap)
      , mForceGDIMode(aScaledFont->mForceGDIMode)
      , mGamma(aScaledFont->mGamma)
      , mContrast(aScaledFont->mContrast)

    InstanceData(const wr::FontInstanceOptions* aOptions,
                 const wr::FontInstancePlatformOptions* aPlatformOptions);

    bool mUseEmbeddedBitmap;
    bool mForceGDIMode;
    Float mGamma;
    Float mContrast;