Coverage Report

Created: 2018-09-25 14:53

/work/obj-fuzz/dist/include/mozilla/gfx/2D.h
Line
Count
Source (jump to first uncovered line)
1
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
3
/* This Source Code Form is subject to the terms of the Mozilla Public
4
 * License, v. 2.0. If a copy of the MPL was not distributed with this
5
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6
7
#ifndef _MOZILLA_GFX_2D_H
8
#define _MOZILLA_GFX_2D_H
9
10
#include "Types.h"
11
#include "Point.h"
12
#include "Rect.h"
13
#include "Matrix.h"
14
#include "Quaternion.h"
15
#include "UserData.h"
16
#include "FontVariation.h"
17
#include <vector>
18
19
// GenericRefCountedBase allows us to hold on to refcounted objects of any type
20
// (contrary to RefCounted<T> which requires knowing the type T) and, in particular,
21
// without having a dependency on that type. This is used for DrawTargetSkia
22
// to be able to hold on to a GLContext.
23
#include "mozilla/GenericRefCounted.h"
24
#include "mozilla/MemoryReporting.h"
25
#include "mozilla/Path.h"
26
27
// This RefPtr class isn't ideal for usage in Azure, as it doesn't allow T**
28
// outparams using the &-operator. But it will have to do as there's no easy
29
// solution.
30
#include "mozilla/RefPtr.h"
31
#include "mozilla/StaticMutex.h"
32
#include "mozilla/StaticPtr.h"
33
#include "mozilla/ThreadSafeWeakPtr.h"
34
35
#include "mozilla/DebugOnly.h"
36
37
#include "nsRegionFwd.h"
38
39
#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GTK)
40
  #ifndef MOZ_ENABLE_FREETYPE
41
  #define MOZ_ENABLE_FREETYPE
42
  #endif
43
#endif
44
45
struct _cairo_surface;
46
typedef _cairo_surface cairo_surface_t;
47
48
struct _cairo_scaled_font;
49
typedef _cairo_scaled_font cairo_scaled_font_t;
50
51
struct FT_LibraryRec_;
52
typedef FT_LibraryRec_* FT_Library;
53
54
struct FT_FaceRec_;
55
typedef FT_FaceRec_* FT_Face;
56
57
typedef int FT_Error;
58
59
struct ID3D11Texture2D;
60
struct ID3D11Device;
61
struct ID2D1Device;
62
struct IDWriteFactory;
63
struct IDWriteRenderingParams;
64
struct IDWriteFontFace;
65
66
class GrContext;
67
class SkCanvas;
68
struct gfxFontStyle;
69
70
struct CGContext;
71
typedef struct CGContext *CGContextRef;
72
73
struct CGFont;
74
typedef CGFont* CGFontRef;
75
76
namespace mozilla {
77
78
class Mutex;
79
80
namespace wr {
81
struct FontInstanceOptions;
82
struct FontInstancePlatformOptions;
83
}
84
85
namespace gfx {
86
class UnscaledFont;
87
class ScaledFont;
88
}
89
90
namespace gfx {
91
92
class AlphaBoxBlur;
93
class ScaledFont;
94
class SourceSurface;
95
class DataSourceSurface;
96
class DrawTarget;
97
class DrawEventRecorder;
98
class FilterNode;
99
class LogForwarder;
100
101
struct NativeSurface {
102
  NativeSurfaceType mType;
103
  SurfaceFormat mFormat;
104
  gfx::IntSize mSize;
105
  void *mSurface;
106
};
107
108
struct NativeFont {
109
  NativeFontType mType;
110
  void *mFont;
111
};
112
113
/**
114
 * This structure is used to send draw options that are universal to all drawing
115
 * operations.
116
 */
117
struct DrawOptions {
118
  /// For constructor parameter description, see member data documentation.
119
  explicit DrawOptions(Float aAlpha = 1.0f,
120
                       CompositionOp aCompositionOp = CompositionOp::OP_OVER,
121
                       AntialiasMode aAntialiasMode = AntialiasMode::DEFAULT)
122
    : mAlpha(aAlpha)
123
    , mCompositionOp(aCompositionOp)
124
    , mAntialiasMode(aAntialiasMode)
125
  {}
126
127
  Float mAlpha;                 /**< Alpha value by which the mask generated by this
128
                                     operation is multiplied. */
129
  CompositionOp mCompositionOp; /**< The operator that indicates how the source and
130
                                     destination patterns are blended. */
131
  AntialiasMode mAntialiasMode; /**< The AntiAlias mode used for this drawing
132
                                     operation. */
133
};
134
135
/**
136
 * This structure is used to send stroke options that are used in stroking
137
 * operations.
138
 */
139
struct StrokeOptions {
140
  /// For constructor parameter description, see member data documentation.
141
  explicit StrokeOptions(Float aLineWidth = 1.0f,
142
                         JoinStyle aLineJoin = JoinStyle::MITER_OR_BEVEL,
143
                         CapStyle aLineCap = CapStyle::BUTT,
144
                         Float aMiterLimit = 10.0f,
145
                         size_t aDashLength = 0,
146
                         const Float* aDashPattern = 0,
147
                         Float aDashOffset = 0.f)
148
    : mLineWidth(aLineWidth)
149
    , mMiterLimit(aMiterLimit)
150
    , mDashPattern(aDashLength > 0 ? aDashPattern : 0)
151
    , mDashLength(aDashLength)
152
    , mDashOffset(aDashOffset)
153
    , mLineJoin(aLineJoin)
154
    , mLineCap(aLineCap)
155
  {
156
    MOZ_ASSERT(aDashLength == 0 || aDashPattern);
157
  }
158
159
  Float mLineWidth;          //!< Width of the stroke in userspace.
160
  Float mMiterLimit;         //!< Miter limit in units of linewidth
161
  const Float* mDashPattern; /**< Series of on/off userspace lengths defining dash.
162
                                  Owned by the caller; must live at least as long as
163
                                  this StrokeOptions.
164
                                  mDashPattern != null <=> mDashLength > 0. */
165
  size_t mDashLength;        //!< Number of on/off lengths in mDashPattern.
166
  Float mDashOffset;         /**< Userspace offset within mDashPattern at which
167
                                  stroking begins. */
168
  JoinStyle mLineJoin;       //!< Join style used for joining lines.
169
  CapStyle mLineCap;         //!< Cap style used for capping lines.
170
};
171
172
/**
173
 * This structure supplies additional options for calls to DrawSurface.
174
 */
175
struct DrawSurfaceOptions {
176
  /// For constructor parameter description, see member data documentation.
177
  explicit DrawSurfaceOptions(SamplingFilter aSamplingFilter = SamplingFilter::LINEAR,
178
                              SamplingBounds aSamplingBounds = SamplingBounds::UNBOUNDED)
179
    : mSamplingFilter(aSamplingFilter)
180
    , mSamplingBounds(aSamplingBounds)
181
  { }
182
183
  SamplingFilter mSamplingFilter; /**< SamplingFilter used when resampling source surface
184
                                       region to the destination region. */
185
  SamplingBounds mSamplingBounds; /**< This indicates whether the implementation is
186
                                       allowed to sample pixels outside the source
187
                                       rectangle as specified in DrawSurface on
188
                                       the surface. */
189
190
};
191
192
/**
193
 * This class is used to store gradient stops, it can only be used with a
194
 * matching DrawTarget. Not adhering to this condition will make a draw call
195
 * fail.
196
 */
197
class GradientStops : public external::AtomicRefCounted<GradientStops>
198
{
199
public:
200
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(GradientStops)
201
  virtual ~GradientStops() {}
202
203
  virtual BackendType GetBackendType() const = 0;
204
  virtual bool IsValid() const { return true; }
205
206
protected:
207
  GradientStops() {}
208
};
209
210
/**
211
 * This is the base class for 'patterns'. Patterns describe the pixels used as
212
 * the source for a masked composition operation that is done by the different
213
 * drawing commands. These objects are not backend specific, however for
214
 * example the gradient stops on a gradient pattern can be backend specific.
215
 */
216
class Pattern
217
{
218
public:
219
  virtual ~Pattern() {}
220
221
  virtual PatternType GetType() const = 0;
222
223
protected:
224
  Pattern() {}
225
};
226
227
class ColorPattern : public Pattern
228
{
229
public:
230
  // Explicit because consumers should generally use ToDeviceColor when
231
  // creating a ColorPattern.
232
  explicit ColorPattern(const Color &aColor)
233
    : mColor(aColor)
234
  {}
235
236
  virtual PatternType GetType() const override
237
  {
238
    return PatternType::COLOR;
239
  }
240
241
  Color mColor;
242
};
243
244
/**
245
 * This class is used for Linear Gradient Patterns, the gradient stops are
246
 * stored in a separate object and are backend dependent. This class itself
247
 * may be used on the stack.
248
 */
249
class LinearGradientPattern : public Pattern
250
{
251
public:
252
  /// For constructor parameter description, see member data documentation.
253
  LinearGradientPattern(const Point &aBegin,
254
                        const Point &aEnd,
255
                        GradientStops *aStops,
256
                        const Matrix &aMatrix = Matrix())
257
    : mBegin(aBegin)
258
    , mEnd(aEnd)
259
    , mStops(aStops)
260
    , mMatrix(aMatrix)
261
  {
262
  }
263
264
  virtual PatternType GetType() const override
265
  {
266
    return PatternType::LINEAR_GRADIENT;
267
  }
268
269
  Point mBegin;                 //!< Start of the linear gradient
270
  Point mEnd;                   /**< End of the linear gradient - NOTE: In the case
271
                                     of a zero length gradient it will act as the
272
                                     color of the last stop. */
273
  RefPtr<GradientStops> mStops; /**< GradientStops object for this gradient, this
274
                                     should match the backend type of the draw
275
                                     target this pattern will be used with. */
276
  Matrix mMatrix;               /**< A matrix that transforms the pattern into
277
                                     user space */
278
};
279
280
/**
281
 * This class is used for Radial Gradient Patterns, the gradient stops are
282
 * stored in a separate object and are backend dependent. This class itself
283
 * may be used on the stack.
284
 */
285
class RadialGradientPattern : public Pattern
286
{
287
public:
288
  /// For constructor parameter description, see member data documentation.
289
  RadialGradientPattern(const Point &aCenter1,
290
                        const Point &aCenter2,
291
                        Float aRadius1,
292
                        Float aRadius2,
293
                        GradientStops *aStops,
294
                        const Matrix &aMatrix = Matrix())
295
    : mCenter1(aCenter1)
296
    , mCenter2(aCenter2)
297
    , mRadius1(aRadius1)
298
    , mRadius2(aRadius2)
299
    , mStops(aStops)
300
    , mMatrix(aMatrix)
301
  {
302
  }
303
304
  virtual PatternType GetType() const override
305
  {
306
    return PatternType::RADIAL_GRADIENT;
307
  }
308
309
  Point mCenter1; //!< Center of the inner (focal) circle.
310
  Point mCenter2; //!< Center of the outer circle.
311
  Float mRadius1; //!< Radius of the inner (focal) circle.
312
  Float mRadius2; //!< Radius of the outer circle.
313
  RefPtr<GradientStops> mStops; /**< GradientStops object for this gradient, this
314
                                     should match the backend type of the draw target
315
                                     this pattern will be used with. */
316
  Matrix mMatrix; //!< A matrix that transforms the pattern into user space
317
};
318
319
/**
320
 * This class is used for Surface Patterns, they wrap a surface and a
321
 * repetition mode for the surface. This may be used on the stack.
322
 */
323
class SurfacePattern : public Pattern
324
{
325
public:
326
  /// For constructor parameter description, see member data documentation.
327
  SurfacePattern(SourceSurface *aSourceSurface, ExtendMode aExtendMode,
328
                 const Matrix &aMatrix = Matrix(),
329
                 SamplingFilter aSamplingFilter = SamplingFilter::GOOD,
330
                 const IntRect &aSamplingRect = IntRect())
331
    : mSurface(aSourceSurface)
332
    , mExtendMode(aExtendMode)
333
    , mSamplingFilter(aSamplingFilter)
334
    , mMatrix(aMatrix)
335
    , mSamplingRect(aSamplingRect)
336
  {}
337
338
  virtual PatternType GetType() const override
339
  {
340
    return PatternType::SURFACE;
341
  }
342
343
  RefPtr<SourceSurface> mSurface; //!< Surface to use for drawing
344
  ExtendMode mExtendMode;         /**< This determines how the image is extended
345
                                       outside the bounds of the image */
346
  SamplingFilter mSamplingFilter; //!< Resampling filter for resampling the image.
347
  Matrix mMatrix;                 //!< Transforms the pattern into user space
348
349
  IntRect mSamplingRect;          /**< Rect that must not be sampled outside of,
350
                                       or an empty rect if none has been specified. */
351
};
352
353
class StoredPattern;
354
class DrawTargetCaptureImpl;
355
356
/**
357
 * This is the base class for source surfaces. These objects are surfaces
358
 * which may be used as a source in a SurfacePattern or a DrawSurface call.
359
 * They cannot be drawn to directly.
360
 *
361
 * Although SourceSurface has thread-safe refcount, some SourceSurface cannot
362
 * be used on random threads at the same time. Only DataSourceSurface can be
363
 * used on random threads now. This will be fixed in the future. Eventually
364
 * all SourceSurface should be thread-safe.
365
 */
366
class SourceSurface : public external::AtomicRefCounted<SourceSurface>
367
{
368
public:
369
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(SourceSurface)
370
  virtual ~SourceSurface() {}
371
372
  virtual SurfaceType GetType() const = 0;
373
  virtual IntSize GetSize() const = 0;
374
  virtual IntRect GetRect() const {
375
    return IntRect(IntPoint(0, 0), GetSize());
376
  }
377
  virtual SurfaceFormat GetFormat() const = 0;
378
379
  /** This returns false if some event has made this source surface invalid for
380
   * usage with current DrawTargets. For example in the case of Direct2D this
381
   * could return false if we have switched devices since this surface was
382
   * created.
383
   */
384
  virtual bool IsValid() const { return true; }
385
386
  /**
387
   * This returns true if it is the same underlying surface data, even if
388
   * the objects are different (e.g. indirection due to
389
   * DataSourceSurfaceWrapper).
390
   */
391
  virtual bool Equals(SourceSurface* aOther, bool aSymmetric = true)
392
  {
393
    return this == aOther ||
394
           (aSymmetric && aOther && aOther->Equals(this, false));
395
  }
396
397
  /**
398
   * This function will return true if the surface type matches that of a
399
   * DataSourceSurface and if GetDataSurface will return the same object.
400
   */
401
  bool IsDataSourceSurface() const {
402
    SurfaceType type = GetType();
403
    return type == SurfaceType::DATA ||
404
           type == SurfaceType::DATA_SHARED;
405
  }
406
407
  /**
408
   * This function will get a DataSourceSurface for this surface, a
409
   * DataSourceSurface's data can be accessed directly.
410
   */
411
  virtual already_AddRefed<DataSourceSurface> GetDataSurface() = 0;
412
413
  /** Tries to get this SourceSurface's native surface.  This will fail if aType
414
   * is not the type of this SourceSurface's native surface.
415
   */
416
  virtual void *GetNativeSurface(NativeSurfaceType aType) {
417
    return nullptr;
418
  }
419
420
  void AddUserData(UserDataKey *key, void *userData, void (*destroy)(void*)) {
421
    mUserData.Add(key, userData, destroy);
422
  }
423
0
  void *GetUserData(UserDataKey *key) {
424
0
    return mUserData.Get(key);
425
0
  }
426
  void RemoveUserData(UserDataKey *key) {
427
    mUserData.RemoveAndDestroy(key);
428
  }
429
430
protected:
431
  friend class DrawTargetCaptureImpl;
432
  friend class StoredPattern;
433
434
  // This is for internal use, it ensures the SourceSurface's data remains
435
  // valid during the lifetime of the SourceSurface.
436
  // @todo XXX - We need something better here :(. But we may be able to get rid
437
  // of CreateWrappingDataSourceSurface in the future.
438
  virtual void GuaranteePersistance() {}
439
440
  UserData mUserData;
441
};
442
443
class DataSourceSurface : public SourceSurface
444
{
445
public:
446
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DataSourceSurface, override)
447
  DataSourceSurface()
448
    : mIsMapped(false)
449
  {
450
  }
451
452
#ifdef DEBUG
453
  virtual ~DataSourceSurface()
454
  {
455
    MOZ_ASSERT(!mIsMapped, "Someone forgot to call Unmap()");
456
  }
457
#endif
458
459
  struct MappedSurface {
460
    uint8_t *mData;
461
    int32_t mStride;
462
  };
463
464
  enum MapType {
465
    READ,
466
    WRITE,
467
    READ_WRITE
468
  };
469
470
  /**
471
   * This is a scoped version of Map(). Map() is called in the constructor and
472
   * Unmap() in the destructor. Use this for automatic unmapping of your data
473
   * surfaces.
474
   *
475
   * Use IsMapped() to verify whether Map() succeeded or not.
476
   */
477
  class ScopedMap final {
478
  public:
479
    explicit ScopedMap(DataSourceSurface* aSurface, MapType aType)
480
      : mSurface(aSurface)
481
      , mIsMapped(aSurface->Map(aType, &mMap)) {}
482
483
    ScopedMap(ScopedMap&& aOther)
484
      : mSurface(std::move(aOther.mSurface))
485
      , mMap(aOther.mMap)
486
      , mIsMapped(aOther.mIsMapped)
487
0
    {
488
0
      aOther.mMap.mData = nullptr;
489
0
      aOther.mIsMapped = false;
490
0
    }
491
492
    ScopedMap& operator=(ScopedMap&& aOther)
493
0
    {
494
0
      if (mIsMapped) {
495
0
        mSurface->Unmap();
496
0
      }
497
0
      mSurface = std::move(aOther.mSurface);
498
0
      mMap = aOther.mMap;
499
0
      mIsMapped = aOther.mIsMapped;
500
0
      aOther.mMap.mData = nullptr;
501
0
      aOther.mIsMapped = false;
502
0
      return *this;
503
0
    }
504
505
    ~ScopedMap()
506
    {
507
      if (mIsMapped) {
508
        mSurface->Unmap();
509
      }
510
    }
511
512
    uint8_t* GetData() const
513
    {
514
      MOZ_ASSERT(mIsMapped);
515
      return mMap.mData;
516
    }
517
518
    int32_t GetStride() const
519
    {
520
      MOZ_ASSERT(mIsMapped);
521
      return mMap.mStride;
522
    }
523
524
    const MappedSurface* GetMappedSurface() const
525
    {
526
      MOZ_ASSERT(mIsMapped);
527
      return &mMap;
528
    }
529
530
    bool IsMapped() const { return mIsMapped; }
531
532
  private:
533
    ScopedMap(const ScopedMap& aOther) = delete;
534
    ScopedMap& operator=(const ScopedMap& aOther) = delete;
535
536
    RefPtr<DataSourceSurface> mSurface;
537
    MappedSurface mMap;
538
    bool mIsMapped;
539
  };
540
541
  virtual SurfaceType GetType() const override { return SurfaceType::DATA; }
542
  /** @deprecated
543
   * Get the raw bitmap data of the surface.
544
   * Can return null if there was OOM allocating surface data.
545
   *
546
   * Deprecated means you shouldn't be using this!! Use Map instead.
547
   * Please deny any reviews which add calls to this!
548
   */
549
  virtual uint8_t *GetData() = 0;
550
551
  /** @deprecated
552
   * Stride of the surface, distance in bytes between the start of the image
553
   * data belonging to row y and row y+1. This may be negative.
554
   * Can return 0 if there was OOM allocating surface data.
555
   */
556
  virtual int32_t Stride() = 0;
557
558
  /**
559
   * The caller is responsible for ensuring aMappedSurface is not null.
560
   */
561
  virtual bool Map(MapType, MappedSurface *aMappedSurface)
562
  {
563
    aMappedSurface->mData = GetData();
564
    aMappedSurface->mStride = Stride();
565
    mIsMapped = !!aMappedSurface->mData;
566
    return mIsMapped;
567
  }
568
569
  virtual void Unmap()
570
  {
571
    MOZ_ASSERT(mIsMapped);
572
    mIsMapped = false;
573
  }
574
575
  /**
576
   * Returns a DataSourceSurface with the same data as this one, but
577
   * guaranteed to have surface->GetType() == SurfaceType::DATA.
578
   *
579
   * The returning surface might be null, because of OOM or gfx device reset.
580
   * The caller needs to do null-check before using it.
581
   */
582
  virtual already_AddRefed<DataSourceSurface> GetDataSurface() override;
583
584
  /**
585
   * Add the size of the underlying data buffer to the aggregate.
586
   */
587
  virtual void AddSizeOfExcludingThis(MallocSizeOf aMallocSizeOf,
588
                                      size_t& aHeapSizeOut,
589
                                      size_t& aNonHeapSizeOut,
590
                                      size_t& aExtHandlesOut) const
591
  {
592
  }
593
594
  /**
595
   * Returns whether or not the data was allocated on the heap. This should
596
   * be used to determine if the memory needs to be cleared to 0.
597
   */
598
  virtual bool OnHeap() const
599
  {
600
    return true;
601
  }
602
603
  /**
604
   * Yields a dirty rect of what has changed since it was last called.
605
   */
606
  virtual Maybe<IntRect> TakeDirtyRect() {
607
    return Nothing();
608
  }
609
610
  /**
611
   * Indicate a region which has changed in the surface.
612
   */
613
  virtual void Invalidate(const IntRect& aDirtyRect) { }
614
615
protected:
616
  bool mIsMapped;
617
};
618
619
/** This is an abstract object that accepts path segments. */
620
class PathSink : public RefCounted<PathSink>
621
{
622
public:
623
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathSink)
624
  virtual ~PathSink() {}
625
626
  /** Move the current point in the path, any figure currently being drawn will
627
   * be considered closed during fill operations, however when stroking the
628
   * closing line segment will not be drawn.
629
   */
630
  virtual void MoveTo(const Point &aPoint) = 0;
631
  /** Add a linesegment to the current figure */
632
  virtual void LineTo(const Point &aPoint) = 0;
633
  /** Add a cubic bezier curve to the current figure */
634
  virtual void BezierTo(const Point &aCP1,
635
                        const Point &aCP2,
636
                        const Point &aCP3) = 0;
637
  /** Add a quadratic bezier curve to the current figure */
638
  virtual void QuadraticBezierTo(const Point &aCP1,
639
                                 const Point &aCP2) = 0;
640
  /** Close the current figure, this will essentially generate a line segment
641
   * from the current point to the starting point for the current figure
642
   */
643
  virtual void Close() = 0;
644
  /** Add an arc to the current figure */
645
  virtual void Arc(const Point &aOrigin, float aRadius, float aStartAngle,
646
                   float aEndAngle, bool aAntiClockwise = false) = 0;
647
  /** Point the current subpath is at - or where the next subpath will start
648
   * if there is no active subpath.
649
   */
650
  virtual Point CurrentPoint() const = 0;
651
};
652
653
class PathBuilder;
654
class FlattenedPath;
655
656
/** The path class is used to create (sets of) figures of any shape that can be
657
 * filled or stroked to a DrawTarget
658
 */
659
class Path : public external::AtomicRefCounted<Path>
660
{
661
public:
662
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(Path)
663
  virtual ~Path();
664
665
  virtual BackendType GetBackendType() const = 0;
666
667
  /** This returns a PathBuilder object that contains a copy of the contents of
668
   * this path and is still writable.
669
   */
670
0
  inline already_AddRefed<PathBuilder> CopyToBuilder() const {
671
0
    return CopyToBuilder(GetFillRule());
672
0
  }
673
0
  inline already_AddRefed<PathBuilder> TransformedCopyToBuilder(const Matrix &aTransform) const {
674
0
    return TransformedCopyToBuilder(aTransform, GetFillRule());
675
0
  }
676
  /** This returns a PathBuilder object that contains a copy of the contents of
677
   * this path, converted to use the specified FillRule, and still writable.
678
   */
679
  virtual already_AddRefed<PathBuilder> CopyToBuilder(FillRule aFillRule) const = 0;
680
  virtual already_AddRefed<PathBuilder> TransformedCopyToBuilder(const Matrix &aTransform,
681
                                                             FillRule aFillRule) const = 0;
682
683
  /** This function checks if a point lies within a path. It allows passing a
684
   * transform that will transform the path to the coordinate space in which
685
   * aPoint is given.
686
   */
687
  virtual bool ContainsPoint(const Point &aPoint, const Matrix &aTransform) const = 0;
688
689
690
  /** This function checks if a point lies within the stroke of a path using the
691
   * specified strokeoptions. It allows passing a transform that will transform
692
   * the path to the coordinate space in which aPoint is given.
693
   */
694
  virtual bool StrokeContainsPoint(const StrokeOptions &aStrokeOptions,
695
                                   const Point &aPoint,
696
                                   const Matrix &aTransform) const = 0;
697
698
  /** This functions gets the bounds of this path. These bounds are not
699
   * guaranteed to be tight. A transform may be specified that gives the bounds
700
   * after application of the transform.
701
   */
702
  virtual Rect GetBounds(const Matrix &aTransform = Matrix()) const = 0;
703
704
  /** This function gets the bounds of the stroke of this path using the
705
   * specified strokeoptions. These bounds are not guaranteed to be tight.
706
   * A transform may be specified that gives the bounds after application of
707
   * the transform.
708
   */
709
  virtual Rect GetStrokedBounds(const StrokeOptions &aStrokeOptions,
710
                                const Matrix &aTransform = Matrix()) const = 0;
711
712
  /** Take the contents of this path and stream it to another sink, this works
713
   * regardless of the backend that might be used for the destination sink.
714
   */
715
  virtual void StreamToSink(PathSink *aSink) const = 0;
716
717
  /** This gets the fillrule this path's builder was created with. This is not
718
   * mutable.
719
   */
720
  virtual FillRule GetFillRule() const = 0;
721
722
  virtual Float ComputeLength();
723
724
  virtual Point ComputePointAtLength(Float aLength,
725
                                     Point* aTangent = nullptr);
726
727
protected:
728
  Path();
729
  void EnsureFlattenedPath();
730
731
  RefPtr<FlattenedPath> mFlattenedPath;
732
};
733
734
/** The PathBuilder class allows path creation. Once finish is called on the
735
 * pathbuilder it may no longer be written to.
736
 */
737
class PathBuilder : public PathSink
738
{
739
public:
740
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(PathBuilder, override)
741
  /** Finish writing to the path and return a Path object that can be used for
742
   * drawing. Future use of the builder results in a crash!
743
   */
744
  virtual already_AddRefed<Path> Finish() = 0;
745
746
  virtual BackendType GetBackendType() const = 0;
747
};
748
749
struct Glyph
750
{
751
  uint32_t mIndex;
752
  Point mPosition;
753
};
754
755
0
static inline bool operator==(const Glyph& aOne, const Glyph& aOther) {
756
0
  return aOne.mIndex == aOther.mIndex && aOne.mPosition == aOther.mPosition;
757
0
}
Unexecuted instantiation: SandboxBroker.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SandboxBrokerPolicyFactory.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SandboxCrash.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SandboxPrefBridge.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SandboxLaunch.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_base1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_base2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_ds1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_io0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_io1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: IdleTaskRunner.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_threads0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_threads1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_threads2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: xptdata.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_chrome0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_build0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_modules_libpref0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: hnjstdio.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_intl_locale0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_intl_strres0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_unicharutil_util0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_intl_l10n0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_base1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_base2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_base3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsCookieService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_cookie0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_dns0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_cache21.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_about0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_data0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_file0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_protocol_ftp0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsHttpChannelAuthProvider.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsHttpHandler.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_http0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_http1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_http2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_protocol_res0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_viewsource0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_websocket0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_protocol_wyciwyg0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DataChannel.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsNetModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ipc_chromium0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ipc_chromium1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ipc_chromium2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BackgroundChildImpl.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BackgroundParentImpl.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: FileDescriptorSetChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: FileDescriptorSetParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ipc_glue0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ipc_glue1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols10.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols12.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols13.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols14.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols15.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols16.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols17.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols18.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols19.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols20.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols21.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols22.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols23.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols24.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols25.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols26.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols27.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols28.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols29.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols30.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols31.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedProtocols9.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: IPCMessageTypeName.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TestShellChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TestShellParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: XPCShellEnvironment.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_js_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Hal.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_hal0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: XrayWrapper.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpconnect_wrappers0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: mozJSComponentLoader.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_js_xpconnect_loader0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_js_xpconnect_src0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_js_xpconnect_src1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_modules_libjar0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_storage0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_extensions_cookie0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_permissions0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_src_media-conduit0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_src_mediapipeline0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_src_peerconnection0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nr_socket_prsock.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_media_mtransport_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_uriloader_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsOSHelperAppService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_uriloader_exthandler0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_uriloader_prefetch0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BasePrincipal.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_caps0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_parser_htmlparser0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_parser_html0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_parser_html1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_parser_html2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: JobScheduler_posix.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ScaledFontFontconfig.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_ycbcr0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsDeviceContext.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_src0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: GLContextProviderGLX.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SharedSurfaceGLX.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: SkiaGLGlue.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_gl0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ImageContainer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PersistentBufferProvider.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BasicImageLayer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TextureClientX11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: X11BasicCompositor.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: X11TextureSourceBasic.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: X11TextureHost.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ShadowLayerUtilsX11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: X11TextureSourceOGL.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: WebRenderTextureHost.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers10.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_layers9.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PrintTarget.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PrintTargetPDF.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PrintTargetPS.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PrintTargetSkPDF.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PrintTargetThebes.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxASurface.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxDrawable.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxFT2FontBase.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxFT2Utils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxFcPlatformFontList.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxFontUtils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxGdkNativeRenderer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxPlatform.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxPlatformGtk.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxPrefs.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxXlibNativeRenderer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxXlibSurface.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_thebes0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_thebes1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: GPUParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VRDisplayHost.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VRDisplayLocal.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxVRExternal.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxVROpenVR.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: gfxVRPuppet.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_vr0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_vr1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_vr_service0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_config0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_webrender_bindings0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsImageModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image_decoders0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsIconChannel.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image_decoders_icon0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsPNGEncoder.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_abort0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_animation0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DOMIntersectionObserver.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsContentUtils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsDOMWindowUtils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsFrameMessageManager.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsGlobalWindowInner.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsGlobalWindowOuter.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsImageLoadingContent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsObjectLoadingContent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsPluginArray.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base9.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RegisterBindings.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RegisterWorkerBindings.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RegisterWorkerDebuggerBindings.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RegisterWorkletBindings.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ResolveSystemBinding.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnionTypes.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings10.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings12.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings13.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings14.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings15.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings16.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings17.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings18.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings19.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings20.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings21.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings22.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings23.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UnifiedBindings9.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: StructuredClone.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_bindings0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BatteryManager.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: BrowserElementParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_cache0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_cache1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ImageUtils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_canvas6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_webgpu0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_webgpu1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_clients_api0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_clients_manager0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_clients_manager1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_commandhandler0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_credentialmanagement0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_crypto0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_encoding0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: EventStateManager.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_events0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_events1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_events2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_events3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_fetch0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_file0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_file_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_file_uri0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_filehandle0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_filesystem0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_filesystem_compat0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_flex0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_gamepad0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PositionError.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsGeolocation.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_grid0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AutoplayPermissionManager.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AutoplayPermissionRequest.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PluginDocument.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_html_input0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_jsurl0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AsmJSCache.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_mathml0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: CubebUtils.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DecoderTraits.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media10.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media11.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media9.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_doctor0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_eme0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_encoder0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_flac0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_gmp0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_gmp1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_gmp2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_media_imagecapture0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RemoteVideoDecoder.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VideoDecoderChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VideoDecoderManagerChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VideoDecoderManagerParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VideoDecoderParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_mediacapabilities0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_mediasink0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_media_mediasource0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_mp30.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_ogg0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_platforms0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_agnostic_eme0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_agnostic_gmp0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_media_platforms_omx0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: FFVPXRuntimeLinker.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_ffvpx0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_platforms_ffmpeg0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_libav530.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_libav540.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_libav550.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_ffmpeg570.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ffmpeg_ffmpeg580.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_systemservices0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_wave0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AudioNodeEngineSSE2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_webaudio0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_webaudio1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_webaudio2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_webaudio_blink0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_webm0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: MediaEngineWebRTC.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_webrtc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_webspeech_synth0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_synth_speechd0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_recognition0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_mp40.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: MediaModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_midi0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_midi1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_notification0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_offline0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_power0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_push0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_quota0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_security0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_storage0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg5.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg6.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg7.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_svg8.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_network0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_permission0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsNPAPIPlugin.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsPluginHost.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_plugins_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: PluginInstanceChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_plugins_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_plugins_ipc1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ActorsParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_indexedDB0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_indexedDB1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_system0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ContentChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ProcessHangMonitor.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_ipc1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_workers0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_workers1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_audiochannel0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_broadcastchannel0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_messagechannel0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_promise0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_smil0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_smil1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_url0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_webauthn0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xbl0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xbl1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xml0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xml0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xpath2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xslt0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xslt_xslt1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xul0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_vr0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_u2f0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_console0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_performance0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_webbrowserpersist0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_xhr0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_worklet0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_script0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_payments0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_payments_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_websocket0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_serviceworkers0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_serviceworkers1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_serviceworkers2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_simpledb0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_prio0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_presentation0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_presentation1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_view0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: WindowSurfaceX11SHM.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsBaseDragService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsBaseWidget.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsShmImage.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget_headless0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsWindow.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget_gtk0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget_gtk1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_widget_gtk2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_editor_libeditor0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_editor_libeditor1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_editor_libeditor2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_editor_spellchecker0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_editor_composer0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsLayoutStylesheetCache.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_style0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_style1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_style2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_style3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_style4.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsRefreshDriver.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_base1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_base2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsPluginFrame.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_generic0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_generic1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_generic2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_generic3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_forms0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_forms1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_tables0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_svg0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_svg1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_svg2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_xul0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_xul1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_xul_tree0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_xul_grid0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VsyncChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: VsyncParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_mathml0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_mathml1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_inspector0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_painting0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_painting1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_printing0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_build0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_docshell_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_base_timeline0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_docshell_shistory0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsDocShellModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpfe_appshell0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AccessibleWrap.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ApplicationAccessibleWrap.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: AtkSocketAccessible.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DOMtoATK.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DocAccessibleWrap.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Platform.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: RootAccessibleWrap.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: UtilInterface.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiHyperlink.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceAction.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceComponent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceDocument.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceEditableText.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceHyperlinkImpl.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceHypertext.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceImage.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceSelection.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceTable.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceTableCell.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceText.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsMaiInterfaceValue.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_aom0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_base0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_base1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_generic0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_html0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DocAccessibleChild.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ProxyAccessible.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_xpcom0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_accessible_xul0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_tools_profiler0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_hunspell_glue0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_spellcheck_src0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_security_manager_ssl0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_security_manager_ssl1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_security_manager_ssl2.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsDBusRemoteService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsGTKRemoteService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsXRemoteService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_components_alerts0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_antitracking0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_ackgroundhangmonitor0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_components_browser0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsWebBrowserModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_clearsitedata0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: DownloadPlatform.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_extensions0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_webrequest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_components_find0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_perfmonitoring0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_components_places0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_reputationservice0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_resistfingerprinting0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_sessionstore0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Telemetry.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryEvent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryHistogram.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryScalar.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryIPC.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryIPCAccumulator.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TelemetryGeckoViewPersistence.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: CombinedStacks.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsTypeAheadFind.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsUrlClassifierStreamUpdater.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_url-classifier0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_windowwatcher0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_autocomplete0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_printingui_ipc0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsFormFillController.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsToolkitCompsModule.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_mozapps_extensions0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_toolkit_recordreplay0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsAppRunner.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsEmbedFunctions.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_toolkit_xre0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_pref_autoconfig_src0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: FileDescriptorOutputStream.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: HeapSnapshot.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: HeapSnapshotTempFileHelperParent.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsAlertsIconListener.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: ProtocolFuzzer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: nsGNOMEShellService.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TestBroker.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_tests_gtest1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_xpcom_tests_gtest3.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_test0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_netwerk_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: mediaconduit_unittests.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: mediapipeline_unittest.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: videoconduit_unittests.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_apz_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_tests_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_gfx_tests_gtest1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TestDownscalingFilterNoSkia.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_image_test_gtest1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: TestDecoders.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_base_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_dom_media_gtest1.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_security_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: csp_fuzzer.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: content_parent_ipc_libfuzz.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_style_test_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_layout_base_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_tests_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_tests0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
Unexecuted instantiation: Unified_cpp_geckoview_gtest0.cpp:mozilla::gfx::operator==(mozilla::gfx::Glyph const&, mozilla::gfx::Glyph const&)
758
759
/** This class functions as a glyph buffer that can be drawn to a DrawTarget.
760
 * @todo XXX - This should probably contain the guts of gfxTextRun in the future as
761
 * roc suggested. But for now it's a simple container for a glyph vector.
762
 */
763
struct GlyphBuffer
764
{
765
  const Glyph *mGlyphs; //!< A pointer to a buffer of glyphs. Managed by the caller.
766
  uint32_t mNumGlyphs;  //!< Number of glyphs mGlyphs points to.
767
};
768
769
struct GlyphMetrics
770
{
771
  // Horizontal distance from the origin to the leftmost side of the bounding
772
  // box of the drawn glyph. This can be negative!
773
  Float mXBearing;
774
  // Horizontal distance from the origin of this glyph to the origin of the
775
  // next glyph.
776
  Float mXAdvance;
777
  // Vertical distance from the origin to the topmost side of the bounding box
778
  // of the drawn glyph.
779
  Float mYBearing;
780
  // Vertical distance from the origin of this glyph to the origin of the next
781
  // glyph, this is used when drawing vertically and will typically be 0.
782
  Float mYAdvance;
783
  // Width of the glyph's black box.
784
  Float mWidth;
785
  // Height of the glyph's black box.
786
  Float mHeight;
787
};
788
789
class UnscaledFont : public SupportsThreadSafeWeakPtr<UnscaledFont>
790
{
791
public:
792
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(UnscaledFont)
793
  MOZ_DECLARE_THREADSAFEWEAKREFERENCE_TYPENAME(UnscaledFont)
794
795
  virtual ~UnscaledFont();
796
797
  virtual FontType GetType() const = 0;
798
799
0
  static uint32_t DeletionCounter() { return sDeletionCounter; }
800
801
  typedef void (*FontFileDataOutput)(const uint8_t *aData, uint32_t aLength, uint32_t aIndex,
802
                                     void *aBaton);
803
  typedef void (*WRFontDescriptorOutput)(const uint8_t *aData, uint32_t aLength, uint32_t aIndex,
804
                                         void *aBaton);
805
  typedef void (*FontInstanceDataOutput)(const uint8_t* aData, uint32_t aLength, void* aBaton);
806
  typedef void (*FontDescriptorOutput)(const uint8_t* aData, uint32_t aLength, uint32_t aIndex,
807
                                       void* aBaton);
808
809
  virtual bool GetFontFileData(FontFileDataOutput, void *) { return false; }
810
811
  virtual bool GetWRFontDescriptor(WRFontDescriptorOutput, void *) { return false; }
812
813
0
  virtual bool GetFontInstanceData(FontInstanceDataOutput, void *) { return false; }
814
815
  virtual bool GetFontDescriptor(FontDescriptorOutput, void *) { return false; }
816
817
  virtual already_AddRefed<ScaledFont>
818
    CreateScaledFont(Float aGlyphSize,
819
                     const uint8_t* aInstanceData,
820
                     uint32_t aInstanceDataLength,
821
                     const FontVariation* aVariations,
822
                     uint32_t aNumVariations)
823
  {
824
    return nullptr;
825
  }
826
827
  virtual already_AddRefed<ScaledFont>
828
    CreateScaledFontFromWRFont(Float aGlyphSize,
829
                               const wr::FontInstanceOptions* aOptions,
830
                               const wr::FontInstancePlatformOptions* aPlatformOptions,
831
                               const FontVariation* aVariations,
832
                               uint32_t aNumVariations)
833
  {
834
    return CreateScaledFont(aGlyphSize, nullptr, 0, aVariations, aNumVariations);
835
  }
836
837
protected:
838
  UnscaledFont() {}
839
840
private:
841
  static Atomic<uint32_t> sDeletionCounter;
842
};
843
844
/** This class is an abstraction of a backend/platform specific font object
845
 * at a particular size. It is passed into text drawing calls to describe
846
 * the font used for the drawing call.
847
 */
848
class ScaledFont : public SupportsThreadSafeWeakPtr<ScaledFont>
849
{
850
public:
851
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(ScaledFont)
852
  MOZ_DECLARE_THREADSAFEWEAKREFERENCE_TYPENAME(ScaledFont)
853
854
  virtual ~ScaledFont();
855
856
  virtual FontType GetType() const = 0;
857
  virtual Float GetSize() const = 0;
858
  virtual AntialiasMode GetDefaultAAMode();
859
860
0
  static uint32_t DeletionCounter() { return sDeletionCounter; }
861
862
  /** This allows getting a path that describes the outline of a set of glyphs.
863
   * A target is passed in so that the guarantee is made the returned path
864
   * can be used with any DrawTarget that has the same backend as the one
865
   * passed in.
866
   */
867
  virtual already_AddRefed<Path> GetPathForGlyphs(const GlyphBuffer &aBuffer, const DrawTarget *aTarget) = 0;
868
869
  /** This copies the path describing the glyphs into a PathBuilder. We use this
870
   * API rather than a generic API to append paths because it allows easier
871
   * implementation in some backends, and more efficient implementation in
872
   * others.
873
   */
874
  virtual void CopyGlyphsToBuilder(const GlyphBuffer &aBuffer, PathBuilder *aBuilder, const Matrix *aTransformHint = nullptr) = 0;
875
876
  /* This gets the metrics of a set of glyphs for the current font face.
877
   */
878
  virtual void GetGlyphDesignMetrics(const uint16_t* aGlyphIndices, uint32_t aNumGlyphs, GlyphMetrics* aGlyphMetrics) = 0;
879
880
  typedef void (*FontInstanceDataOutput)(const uint8_t* aData, uint32_t aLength,
881
                                         const FontVariation* aVariations, uint32_t aNumVariations,
882
                                         void* aBaton);
883
884
  virtual bool GetFontInstanceData(FontInstanceDataOutput, void *) { return false; }
885
886
  virtual bool GetWRFontInstanceOptions(Maybe<wr::FontInstanceOptions>* aOutOptions,
887
                                        Maybe<wr::FontInstancePlatformOptions>* aOutPlatformOptions,
888
                                        std::vector<FontVariation>* aOutVariations)
889
  {
890
    return false;
891
  }
892
893
  virtual bool CanSerialize() { return false; }
894
895
  virtual bool HasVariationSettings() { return false; }
896
897
  void AddUserData(UserDataKey *key, void *userData, void (*destroy)(void*)) {
898
    mUserData.Add(key, userData, destroy);
899
  }
900
  void *GetUserData(UserDataKey *key) {
901
    return mUserData.Get(key);
902
  }
903
904
  void RemoveUserData(UserDataKey *key) {
905
    mUserData.RemoveAndDestroy(key);
906
  }
907
908
  const RefPtr<UnscaledFont>& GetUnscaledFont() const { return mUnscaledFont; }
909
910
  virtual cairo_scaled_font_t* GetCairoScaledFont() { return nullptr; }
911
  virtual void SetCairoScaledFont(cairo_scaled_font_t* font) {}
912
913
0
  Float GetSyntheticObliqueAngle() const { return mSyntheticObliqueAngle; }
914
0
  void SetSyntheticObliqueAngle(Float aAngle) { mSyntheticObliqueAngle = aAngle; }
915
916
protected:
917
  explicit ScaledFont(const RefPtr<UnscaledFont>& aUnscaledFont)
918
    : mUnscaledFont(aUnscaledFont)
919
    , mSyntheticObliqueAngle(0.0f)
920
  {}
921
922
  UserData mUserData;
923
  RefPtr<UnscaledFont> mUnscaledFont;
924
  Float mSyntheticObliqueAngle;
925
926
private:
927
  static Atomic<uint32_t> sDeletionCounter;
928
};
929
930
/**
931
 * Derived classes hold a native font resource from which to create
932
 * ScaledFonts.
933
 */
934
class NativeFontResource : public external::AtomicRefCounted<NativeFontResource>
935
{
936
public:
937
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(NativeFontResource)
938
939
  /**
940
   * Creates a UnscaledFont using the font corresponding to the index.
941
   *
942
   * @param aIndex index for the font within the resource.
943
   * @param aInstanceData pointer to read-only buffer of any available instance data.
944
   * @param aInstanceDataLength the size of the instance data.
945
   * @return an already_addrefed UnscaledFont, containing nullptr if failed.
946
   */
947
  virtual already_AddRefed<UnscaledFont>
948
    CreateUnscaledFont(uint32_t aIndex,
949
                       const uint8_t* aInstanceData,
950
                       uint32_t aInstanceDataLength) = 0;
951
952
  virtual ~NativeFontResource() {}
953
};
954
955
class DrawTargetCapture;
956
957
/** This is the main class used for all the drawing. It is created through the
958
 * factory and accepts drawing commands. The results of drawing to a target
959
 * may be used either through a Snapshot or by flushing the target and directly
960
 * accessing the backing store a DrawTarget was created with.
961
 */
962
class DrawTarget : public external::AtomicRefCounted<DrawTarget>
963
{
964
public:
965
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawTarget)
966
  DrawTarget()
967
    : mTransformDirty(false)
968
    , mPermitSubpixelAA(false)
969
    , mFormat(SurfaceFormat::UNKNOWN)
970
  {}
971
  virtual ~DrawTarget() {}
972
973
  virtual bool IsValid() const { return true; };
974
  virtual DrawTargetType GetType() const = 0;
975
976
  virtual BackendType GetBackendType() const = 0;
977
978
  virtual bool IsRecording() const { return false; }
979
  virtual bool IsCaptureDT() const { return false; }
980
981
  /**
982
   * Returns a SourceSurface which is a snapshot of the current contents of the DrawTarget.
983
   * Multiple calls to Snapshot() without any drawing operations in between will
984
   * normally return the same SourceSurface object.
985
   */
986
  virtual already_AddRefed<SourceSurface> Snapshot() = 0;
987
988
  // Snapshots the contents and returns an alpha mask
989
  // based on the RGB values.
990
  virtual already_AddRefed<SourceSurface> IntoLuminanceSource(LuminanceType aLuminanceType,
991
                                                              float aOpacity);
992
  virtual IntSize GetSize() const = 0;
993
  virtual IntRect GetRect() const {
994
    return IntRect(IntPoint(0, 0), GetSize());
995
  }
996
997
  /**
998
   * If possible returns the bits to this DrawTarget for direct manipulation. While
999
   * the bits is locked any modifications to this DrawTarget is forbidden.
1000
   * Release takes the original data pointer for safety.
1001
   */
1002
  virtual bool LockBits(uint8_t** aData, IntSize* aSize,
1003
                        int32_t* aStride, SurfaceFormat* aFormat,
1004
                        IntPoint* aOrigin = nullptr) { return false; }
1005
  virtual void ReleaseBits(uint8_t* aData) {}
1006
1007
  /** Ensure that the DrawTarget backend has flushed all drawing operations to
1008
   * this draw target. This must be called before using the backing surface of
1009
   * this draw target outside of GFX 2D code.
1010
   */
1011
  virtual void Flush() = 0;
1012
1013
  /**
1014
   * Realize a DrawTargetCapture onto the draw target.
1015
   *
1016
   * @param aSource Capture DrawTarget to draw
1017
   * @param aTransform Transform to apply when replaying commands
1018
   */
1019
  virtual void DrawCapturedDT(DrawTargetCapture *aCaptureDT,
1020
                              const Matrix& aTransform);
1021
1022
  /**
1023
   * Draw a surface to the draw target. Possibly doing partial drawing or
1024
   * applying scaling. No sampling happens outside the source.
1025
   *
1026
   * @param aSurface Source surface to draw
1027
   * @param aDest Destination rectangle that this drawing operation should draw to
1028
   * @param aSource Source rectangle in aSurface coordinates, this area of aSurface
1029
   *                will be stretched to the size of aDest.
1030
   * @param aOptions General draw options that are applied to the operation
1031
   * @param aSurfOptions DrawSurface options that are applied
1032
   */
1033
  virtual void DrawSurface(SourceSurface *aSurface,
1034
                           const Rect &aDest,
1035
                           const Rect &aSource,
1036
                           const DrawSurfaceOptions &aSurfOptions = DrawSurfaceOptions(),
1037
                           const DrawOptions &aOptions = DrawOptions()) = 0;
1038
1039
  /**
1040
   * Draw the output of a FilterNode to the DrawTarget.
1041
   *
1042
   * @param aNode FilterNode to draw
1043
   * @param aSourceRect Source rectangle in FilterNode space to draw
1044
   * @param aDestPoint Destination point on the DrawTarget to draw the
1045
   *                   SourceRectangle of the filter output to
1046
   */
1047
  virtual void DrawFilter(FilterNode *aNode,
1048
                          const Rect &aSourceRect,
1049
                          const Point &aDestPoint,
1050
                          const DrawOptions &aOptions = DrawOptions()) = 0;
1051
1052
  /**
1053
   * Blend a surface to the draw target with a shadow. The shadow is drawn as a
1054
   * gaussian blur using a specified sigma. The shadow is clipped to the size
1055
   * of the input surface, so the input surface should contain a transparent
1056
   * border the size of the approximate coverage of the blur (3 * aSigma).
1057
   * NOTE: This function works in device space!
1058
   *
1059
   * @param aSurface Source surface to draw.
1060
   * @param aDest Destination point that this drawing operation should draw to.
1061
   * @param aColor Color of the drawn shadow
1062
   * @param aOffset Offset of the shadow
1063
   * @param aSigma Sigma used for the guassian filter kernel
1064
   * @param aOperator Composition operator used
1065
   */
1066
  virtual void DrawSurfaceWithShadow(SourceSurface *aSurface,
1067
                                     const Point &aDest,
1068
                                     const Color &aColor,
1069
                                     const Point &aOffset,
1070
                                     Float aSigma,
1071
                                     CompositionOp aOperator) = 0;
1072
1073
  /**
1074
   * Clear a rectangle on the draw target to transparent black. This will
1075
   * respect the clipping region and transform.
1076
   *
1077
   * @param aRect Rectangle to clear
1078
   */
1079
  virtual void ClearRect(const Rect &aRect) = 0;
1080
1081
  /**
1082
   * This is essentially a 'memcpy' between two surfaces. It moves a pixel
1083
   * aligned area from the source surface unscaled directly onto the
1084
   * drawtarget. This ignores both transform and clip.
1085
   *
1086
   * @param aSurface Surface to copy from
1087
   * @param aSourceRect Source rectangle to be copied
1088
   * @param aDest Destination point to copy the surface to
1089
   */
1090
  virtual void CopySurface(SourceSurface *aSurface,
1091
                           const IntRect &aSourceRect,
1092
                           const IntPoint &aDestination) = 0;
1093
1094
  /** @see CopySurface
1095
   * Same as CopySurface, except uses itself as the source.
1096
   *
1097
   * Some backends may be able to optimize this better
1098
   * than just taking a snapshot and using CopySurface.
1099
   */
1100
  virtual void CopyRect(const IntRect &aSourceRect,
1101
                        const IntPoint &aDestination)
1102
  {
1103
    RefPtr<SourceSurface> source = Snapshot();
1104
    CopySurface(source, aSourceRect, aDestination);
1105
  }
1106
1107
  /**
1108
   * Fill a rectangle on the DrawTarget with a certain source pattern.
1109
   *
1110
   * @param aRect Rectangle that forms the mask of this filling operation
1111
   * @param aPattern Pattern that forms the source of this filling operation
1112
   * @param aOptions Options that are applied to this operation
1113
   */
1114
  virtual void FillRect(const Rect &aRect,
1115
                        const Pattern &aPattern,
1116
                        const DrawOptions &aOptions = DrawOptions()) = 0;
1117
1118
  /**
1119
   * Stroke a rectangle on the DrawTarget with a certain source pattern.
1120
   *
1121
   * @param aRect Rectangle that forms the mask of this stroking operation
1122
   * @param aPattern Pattern that forms the source of this stroking operation
1123
   * @param aOptions Options that are applied to this operation
1124
   */
1125
  virtual void StrokeRect(const Rect &aRect,
1126
                          const Pattern &aPattern,
1127
                          const StrokeOptions &aStrokeOptions = StrokeOptions(),
1128
                          const DrawOptions &aOptions = DrawOptions()) = 0;
1129
1130
  /**
1131
   * Stroke a line on the DrawTarget with a certain source pattern.
1132
   *
1133
   * @param aStart Starting point of the line
1134
   * @param aEnd End point of the line
1135
   * @param aPattern Pattern that forms the source of this stroking operation
1136
   * @param aOptions Options that are applied to this operation
1137
   */
1138
  virtual void StrokeLine(const Point &aStart,
1139
                          const Point &aEnd,
1140
                          const Pattern &aPattern,
1141
                          const StrokeOptions &aStrokeOptions = StrokeOptions(),
1142
                          const DrawOptions &aOptions = DrawOptions()) = 0;
1143
1144
  /**
1145
   * Stroke a path on the draw target with a certain source pattern.
1146
   *
1147
   * @param aPath Path that is to be stroked
1148
   * @param aPattern Pattern that should be used for the stroke
1149
   * @param aStrokeOptions Stroke options used for this operation
1150
   * @param aOptions Draw options used for this operation
1151
   */
1152
  virtual void Stroke(const Path *aPath,
1153
                      const Pattern &aPattern,
1154
                      const StrokeOptions &aStrokeOptions = StrokeOptions(),
1155
                      const DrawOptions &aOptions = DrawOptions()) = 0;
1156
1157
  /**
1158
   * Fill a path on the draw target with a certain source pattern.
1159
   *
1160
   * @param aPath Path that is to be filled
1161
   * @param aPattern Pattern that should be used for the fill
1162
   * @param aOptions Draw options used for this operation
1163
   */
1164
  virtual void Fill(const Path *aPath,
1165
                    const Pattern &aPattern,
1166
                    const DrawOptions &aOptions = DrawOptions()) = 0;
1167
1168
  /**
1169
   * Fill a series of glyphs on the draw target with a certain source pattern.
1170
   */
1171
  virtual void FillGlyphs(ScaledFont *aFont,
1172
                          const GlyphBuffer &aBuffer,
1173
                          const Pattern &aPattern,
1174
                          const DrawOptions &aOptions = DrawOptions()) = 0;
1175
1176
  /**
1177
   * Stroke a series of glyphs on the draw target with a certain source pattern.
1178
   */
1179
  virtual void StrokeGlyphs(ScaledFont* aFont,
1180
                            const GlyphBuffer& aBuffer,
1181
                            const Pattern& aPattern,
1182
                            const StrokeOptions& aStrokeOptions = StrokeOptions(),
1183
                            const DrawOptions& aOptions = DrawOptions());
1184
1185
  /**
1186
   * This takes a source pattern and a mask, and composites the source pattern
1187
   * onto the destination surface using the alpha channel of the mask pattern
1188
   * as a mask for the operation.
1189
   *
1190
   * @param aSource Source pattern
1191
   * @param aMask Mask pattern
1192
   * @param aOptions Drawing options
1193
   */
1194
  virtual void Mask(const Pattern &aSource,
1195
                    const Pattern &aMask,
1196
                    const DrawOptions &aOptions = DrawOptions()) = 0;
1197
1198
  /**
1199
   * This takes a source pattern and a mask, and composites the source pattern
1200
   * onto the destination surface using the alpha channel of the mask source.
1201
   * The operation is bound by the extents of the mask.
1202
   *
1203
   * @param aSource Source pattern
1204
   * @param aMask Mask surface
1205
   * @param aOffset a transformed offset that the surface is masked at
1206
   * @param aOptions Drawing options
1207
   */
1208
  virtual void MaskSurface(const Pattern &aSource,
1209
                           SourceSurface *aMask,
1210
                           Point aOffset,
1211
                           const DrawOptions &aOptions = DrawOptions()) = 0;
1212
1213
  /**
1214
   * Draw aSurface using the 3D transform aMatrix. The DrawTarget's transform
1215
   * and clip are applied after the 3D transform.
1216
   *
1217
   * If the transform fails (i.e. because aMatrix is singular), false is returned and nothing is drawn.
1218
   */
1219
  virtual bool Draw3DTransformedSurface(SourceSurface* aSurface,
1220
                                        const Matrix4x4& aMatrix);
1221
1222
  /**
1223
   * Push a clip to the DrawTarget.
1224
   *
1225
   * @param aPath The path to clip to
1226
   */
1227
  virtual void PushClip(const Path *aPath) = 0;
1228
1229
  /**
1230
   * Push an axis-aligned rectangular clip to the DrawTarget. This rectangle
1231
   * is specified in user space.
1232
   *
1233
   * @param aRect The rect to clip to
1234
   */
1235
  virtual void PushClipRect(const Rect &aRect) = 0;
1236
1237
  /**
1238
   * Push a clip region specifed by the union of axis-aligned rectangular
1239
   * clips to the DrawTarget. These rectangles are specified in device space.
1240
   * This must be balanced by a corresponding call to PopClip within a layer.
1241
   *
1242
   * @param aRects The rects to clip to
1243
   * @param aCount The number of rectangles
1244
   */
1245
  virtual void PushDeviceSpaceClipRects(const IntRect* aRects, uint32_t aCount);
1246
1247
  /** Pop a clip from the DrawTarget. A pop without a corresponding push will
1248
   * be ignored.
1249
   */
1250
  virtual void PopClip() = 0;
1251
1252
  /**
1253
   * Push a 'layer' to the DrawTarget, a layer is a temporary surface that all
1254
   * drawing will be redirected to, this is used for example to support group
1255
   * opacity or the masking of groups. Clips must be balanced within a layer,
1256
   * i.e. between a matching PushLayer/PopLayer pair there must be as many
1257
   * PushClip(Rect) calls as there are PopClip calls.
1258
   *
1259
   * @param aOpaque Whether the layer will be opaque
1260
   * @param aOpacity Opacity of the layer
1261
   * @param aMask Mask applied to the layer
1262
   * @param aMaskTransform Transform applied to the layer mask
1263
   * @param aBounds Optional bounds in device space to which the layer is
1264
   *                limited in size.
1265
   * @param aCopyBackground Whether to copy the background into the layer, this
1266
   *                        is only supported when aOpaque is true.
1267
   */
1268
  virtual void PushLayer(bool aOpaque, Float aOpacity,
1269
                         SourceSurface* aMask,
1270
                         const Matrix& aMaskTransform,
1271
                         const IntRect& aBounds = IntRect(),
1272
                         bool aCopyBackground = false) { MOZ_CRASH("GFX: PushLayer"); }
1273
1274
  /**
1275
   * Push a 'layer' to the DrawTarget, a layer is a temporary surface that all
1276
   * drawing will be redirected to, this is used for example to support group
1277
   * opacity or the masking of groups. Clips must be balanced within a layer,
1278
   * i.e. between a matching PushLayer/PopLayer pair there must be as many
1279
   * PushClip(Rect) calls as there are PopClip calls.
1280
   *
1281
   * @param aOpaque Whether the layer will be opaque
1282
   * @param aOpacity Opacity of the layer
1283
   * @param aMask Mask applied to the layer
1284
   * @param aMaskTransform Transform applied to the layer mask
1285
   * @param aBounds Optional bounds in device space to which the layer is
1286
   *                limited in size.
1287
   * @param aCopyBackground Whether to copy the background into the layer, this
1288
   *                        is only supported when aOpaque is true.
1289
   */
1290
  virtual void PushLayerWithBlend(bool aOpaque, Float aOpacity,
1291
                         SourceSurface* aMask,
1292
                         const Matrix& aMaskTransform,
1293
                         const IntRect& aBounds = IntRect(),
1294
                         bool aCopyBackground = false,
1295
                         CompositionOp = CompositionOp::OP_OVER) { MOZ_CRASH("GFX: PushLayerWithBlend"); }
1296
1297
1298
  /**
1299
   * This balances a call to PushLayer and proceeds to blend the layer back
1300
   * onto the background. This blend will blend the temporary surface back
1301
   * onto the target in device space using POINT sampling and operator over.
1302
   */
1303
  virtual void PopLayer() { MOZ_CRASH("GFX: PopLayer"); }
1304
1305
  /**
1306
   * Perform an in-place blur operation. This is only supported on data draw
1307
   * targets.
1308
   */
1309
  virtual void Blur(const AlphaBoxBlur& aBlur);
1310
1311
  /**
1312
   * Performs an in-place edge padding operation.
1313
   * aRegion is specified in device space.
1314
   */
1315
  virtual void PadEdges(const IntRegion& aRegion);
1316
1317
  /**
1318
   * Performs an in-place buffer unrotation operation.
1319
   */
1320
  virtual bool Unrotate(IntPoint aRotation);
1321
1322
  /**
1323
   * Create a SourceSurface optimized for use with this DrawTarget from
1324
   * existing bitmap data in memory.
1325
   *
1326
   * The SourceSurface does not take ownership of aData, and may be freed at any time.
1327
   */
1328
  virtual already_AddRefed<SourceSurface> CreateSourceSurfaceFromData(unsigned char *aData,
1329
                                                                      const IntSize &aSize,
1330
                                                                      int32_t aStride,
1331
                                                                      SurfaceFormat aFormat) const = 0;
1332
1333
  /**
1334
   * Create a SourceSurface optimized for use with this DrawTarget from an
1335
   * arbitrary SourceSurface type supported by this backend. This may return
1336
   * aSourceSurface or some other existing surface.
1337
   */
1338
  virtual already_AddRefed<SourceSurface> OptimizeSourceSurface(SourceSurface *aSurface) const = 0;
1339
  virtual already_AddRefed<SourceSurface> OptimizeSourceSurfaceForUnknownAlpha(SourceSurface *aSurface) const {
1340
    return OptimizeSourceSurface(aSurface);
1341
  }
1342
1343
  /**
1344
   * Create a SourceSurface for a type of NativeSurface. This may fail if the
1345
   * draw target does not know how to deal with the type of NativeSurface passed
1346
   * in. If this succeeds, the SourceSurface takes the ownersip of the NativeSurface.
1347
   */
1348
  virtual already_AddRefed<SourceSurface>
1349
    CreateSourceSurfaceFromNativeSurface(const NativeSurface &aSurface) const = 0;
1350
1351
  /**
1352
   * Create a DrawTarget whose snapshot is optimized for use with this DrawTarget.
1353
   */
1354
  virtual already_AddRefed<DrawTarget>
1355
    CreateSimilarDrawTarget(const IntSize &aSize, SurfaceFormat aFormat) const = 0;
1356
1357
  /**
1358
   * Create a draw target optimized for drawing a shadow.
1359
   *
1360
   * Note that aSigma is the blur radius that must be used when we draw the
1361
   * shadow. Also note that this doesn't affect the size of the allocated
1362
   * surface, the caller is still responsible for including the shadow area in
1363
   * its size.
1364
   */
1365
  virtual already_AddRefed<DrawTarget>
1366
    CreateShadowDrawTarget(const IntSize &aSize, SurfaceFormat aFormat,
1367
                           float aSigma) const
1368
  {
1369
    return CreateSimilarDrawTarget(aSize, aFormat);
1370
  }
1371
1372
  /**
1373
   * Create a similar DrawTarget whose requested size may be clipped based
1374
   * on this DrawTarget's rect transformed to the new target's space.
1375
   */
1376
  virtual RefPtr<DrawTarget> CreateClippedDrawTarget(const IntSize& aMaxSize,
1377
                                                     const Matrix& aTransform,
1378
                                                     SurfaceFormat aFormat) const
1379
  {
1380
    return CreateSimilarDrawTarget(aMaxSize, aFormat);
1381
  }
1382
1383
  /**
1384
   * Create a similar draw target, but if the draw target is not backed by a
1385
   * raster backend (for example, it is capturing or recording), force it to
1386
   * create a raster target instead. This is intended for code that wants to
1387
   * cache pixels, and would have no effect if it were caching a recording.
1388
   */
1389
  virtual RefPtr<DrawTarget>
1390
  CreateSimilarRasterTarget(const IntSize& aSize, SurfaceFormat aFormat) const
1391
  {
1392
    return CreateSimilarDrawTarget(aSize, aFormat);
1393
  }
1394
1395
  /**
1396
   * Create a path builder with the specified fillmode.
1397
   *
1398
   * We need the fill mode up front because of Direct2D.
1399
   * ID2D1SimplifiedGeometrySink requires the fill mode
1400
   * to be set before calling BeginFigure().
1401
   */
1402
  virtual already_AddRefed<PathBuilder> CreatePathBuilder(FillRule aFillRule = FillRule::FILL_WINDING) const = 0;
1403
1404
  /**
1405
   * Create a GradientStops object that holds information about a set of
1406
   * gradient stops, this object is required for linear or radial gradient
1407
   * patterns to represent the color stops in the gradient.
1408
   *
1409
   * @param aStops An array of gradient stops
1410
   * @param aNumStops Number of stops in the array aStops
1411
   * @param aExtendNone This describes how to extend the stop color outside of the
1412
   *                    gradient area.
1413
   */
1414
  virtual already_AddRefed<GradientStops>
1415
    CreateGradientStops(GradientStop *aStops,
1416
                        uint32_t aNumStops,
1417
                        ExtendMode aExtendMode = ExtendMode::CLAMP) const = 0;
1418
1419
  /**
1420
   * Create a FilterNode object that can be used to apply a filter to various
1421
   * inputs.
1422
   *
1423
   * @param aType Type of filter node to be created.
1424
   */
1425
  virtual already_AddRefed<FilterNode> CreateFilter(FilterType aType) = 0;
1426
1427
  Matrix GetTransform() const { return mTransform; }
1428
1429
  /*
1430
   * Get the metrics of a glyph, including any additional spacing that is taken
1431
   * during rasterization to this backends (for example because of antialiasing
1432
   * filters.
1433
   *
1434
   * aScaledFont The scaled font used when drawing.
1435
   * aGlyphIndices An array of indices for the glyphs whose the metrics are wanted
1436
   * aNumGlyphs The amount of elements in aGlyphIndices
1437
   * aGlyphMetrics The glyph metrics
1438
   */
1439
  virtual void GetGlyphRasterizationMetrics(ScaledFont *aScaledFont, const uint16_t* aGlyphIndices,
1440
                                            uint32_t aNumGlyphs, GlyphMetrics* aGlyphMetrics)
1441
  {
1442
    aScaledFont->GetGlyphDesignMetrics(aGlyphIndices, aNumGlyphs, aGlyphMetrics);
1443
  }
1444
1445
  /**
1446
   * Set a transform on the surface, this transform is applied at drawing time
1447
   * to both the mask and source of the operation.
1448
   *
1449
   * Performance note: For some backends it is expensive to change the current
1450
   * transform (because transforms affect a lot of the parts of the pipeline,
1451
   * so new transform change can result in a pipeline flush).  To get around
1452
   * this, DrawTarget implementations buffer transform changes and try to only
1453
   * set the current transform on the backend when required.  That tracking has
1454
   * its own performance impact though, and ideally callers would be smart
1455
   * enough not to require it.  At a future date this method may stop this
1456
   * doing transform buffering so, if you're a consumer, please try to be smart
1457
   * about calling this method as little as possible.  For example, instead of
1458
   * concatenating a translation onto the current transform then calling
1459
   * FillRect, try to integrate the translation into FillRect's aRect
1460
   * argument's x/y offset.
1461
   */
1462
  virtual void SetTransform(const Matrix &aTransform)
1463
    { mTransform = aTransform; mTransformDirty = true; }
1464
1465
  inline void ConcatTransform(const Matrix &aTransform)
1466
0
    { SetTransform(aTransform * Matrix(GetTransform())); }
1467
1468
  SurfaceFormat GetFormat() const { return mFormat; }
1469
1470
  /** Tries to get a native surface for a DrawTarget, this may fail if the
1471
   * draw target cannot convert to this surface type.
1472
   */
1473
  virtual void *GetNativeSurface(NativeSurfaceType aType) { return nullptr; }
1474
1475
  virtual bool IsDualDrawTarget() const { return false; }
1476
  virtual bool IsTiledDrawTarget() const { return false; }
1477
  virtual bool SupportsRegionClipping() const { return true; }
1478
1479
0
  void AddUserData(UserDataKey *key, void *userData, void (*destroy)(void*)) {
1480
0
    mUserData.Add(key, userData, destroy);
1481
0
  }
1482
0
  void *GetUserData(UserDataKey *key) const {
1483
0
    return mUserData.Get(key);
1484
0
  }
1485
0
  void *RemoveUserData(UserDataKey *key) {
1486
0
    return mUserData.Remove(key);
1487
0
  }
1488
1489
  /** Within this rectangle all pixels will be opaque by the time the result of
1490
   * this DrawTarget is first used for drawing. Either by the underlying surface
1491
   * being used as an input to external drawing, or Snapshot() being called.
1492
   * This rectangle is specified in device space.
1493
   */
1494
0
  void SetOpaqueRect(const IntRect &aRect) {
1495
0
    mOpaqueRect = aRect;
1496
0
  }
1497
1498
0
  const IntRect &GetOpaqueRect() const {
1499
0
    return mOpaqueRect;
1500
0
  }
1501
1502
  virtual bool IsCurrentGroupOpaque() {
1503
    return GetFormat() == SurfaceFormat::B8G8R8X8;
1504
  }
1505
1506
  virtual void SetPermitSubpixelAA(bool aPermitSubpixelAA) {
1507
    mPermitSubpixelAA = aPermitSubpixelAA;
1508
  }
1509
1510
  bool GetPermitSubpixelAA() {
1511
    return mPermitSubpixelAA;
1512
  }
1513
1514
  /**
1515
   * Mark the end of an Item in a DrawTargetRecording. These markers
1516
   * are used for merging recordings together.
1517
   *
1518
   * This should only be called on the 'root' DrawTargetRecording.
1519
   * Calling it on a child DrawTargetRecordings will cause confusion.
1520
   *
1521
   * Note: this is a bit of a hack. It might be better to just recreate
1522
   * the DrawTargetRecording.
1523
   */
1524
  virtual void FlushItem(const IntRect &aBounds) {}
1525
1526
  /**
1527
   * Ensures that no snapshot is still pointing to this DrawTarget's surface data.
1528
   *
1529
   * This can be useful if the DrawTarget is wrapped around data that it does not
1530
   * own, and for some reason the owner of the data has to make it temporarily
1531
   * unavailable without the DrawTarget knowing about it.
1532
   * This can cause costly surface copies, so it should not be used without a
1533
   * a good reason.
1534
   */
1535
  virtual void DetachAllSnapshots() = 0;
1536
1537
#ifdef USE_SKIA_GPU
1538
  virtual bool InitWithGrContext(GrContext* aGrContext,
1539
                                 const IntSize &aSize,
1540
                                 SurfaceFormat aFormat)
1541
  {
1542
    MOZ_CRASH("GFX: InitWithGrContext");
1543
  }
1544
#endif
1545
1546
protected:
1547
  UserData mUserData;
1548
  Matrix mTransform;
1549
  IntRect mOpaqueRect;
1550
  bool mTransformDirty : 1;
1551
  bool mPermitSubpixelAA : 1;
1552
1553
  SurfaceFormat mFormat;
1554
};
1555
1556
class DrawTargetCapture : public DrawTarget
1557
{
1558
public:
1559
  virtual bool IsCaptureDT() const override { return true; }
1560
1561
  virtual bool IsEmpty() const = 0;
1562
  virtual void Dump() = 0;
1563
};
1564
1565
class DrawEventRecorder : public RefCounted<DrawEventRecorder>
1566
{
1567
public:
1568
  MOZ_DECLARE_REFCOUNTED_VIRTUAL_TYPENAME(DrawEventRecorder)
1569
  // returns true if there were any items in the recording
1570
  virtual bool Finish() = 0;
1571
  virtual ~DrawEventRecorder() { }
1572
};
1573
1574
struct Tile
1575
{
1576
  RefPtr<DrawTarget> mDrawTarget;
1577
  IntPoint mTileOrigin;
1578
};
1579
1580
struct TileSet
1581
{
1582
  Tile* mTiles;
1583
  size_t mTileCount;
1584
};
1585
1586
struct Config {
1587
  LogForwarder* mLogForwarder;
1588
  int32_t mMaxTextureSize;
1589
  int32_t mMaxAllocSize;
1590
1591
  Config()
1592
  : mLogForwarder(nullptr)
1593
  , mMaxTextureSize(8192)
1594
  , mMaxAllocSize(52000000)
1595
0
  {}
1596
};
1597
1598
class GFX2D_API Factory
1599
{
1600
  using char_type = filesystem::Path::value_type;
1601
public:
1602
  static void Init(const Config& aConfig);
1603
  static void ShutDown();
1604
1605
  static bool HasSSE2();
1606
  static bool HasSSE4();
1607
1608
  /**
1609
   * Returns false if any of the following are true:
1610
   *
1611
   *   - the width/height of |sz| are less than or equal to zero
1612
   *   - the width/height of |sz| are greater than |limit|
1613
   *   - the number of bytes that need to be allocated for the surface is too
1614
   *     big to fit in an int32_t, or bigger than |allocLimit|, if specifed
1615
   *
1616
   * To calculate the number of bytes that need to be allocated for the surface
1617
   * this function makes the conservative assumption that there need to be
1618
   * 4 bytes-per-pixel, and the stride alignment is 16 bytes.
1619
   *
1620
   * The reason for using int32_t rather than uint32_t is again to be
1621
   * conservative; some code has in the past and may in the future use signed
1622
   * integers to store buffer lengths etc.
1623
   */
1624
  static bool CheckSurfaceSize(const IntSize &sz,
1625
                               int32_t limit = 0,
1626
                               int32_t allocLimit = 0);
1627
1628
  /**
1629
   * Make sure that the given buffer size doesn't exceed the allocation limit.
1630
   */
1631
  static bool CheckBufferSize(int32_t bufSize);
1632
1633
  /** Make sure the given dimension satisfies the CheckSurfaceSize and is
1634
   * within 8k limit.  The 8k value is chosen a bit randomly.
1635
   */
1636
  static bool ReasonableSurfaceSize(const IntSize &aSize);
1637
1638
  static bool AllowedSurfaceSize(const IntSize &aSize);
1639
1640
  static already_AddRefed<DrawTarget> CreateDrawTargetForCairoSurface(cairo_surface_t* aSurface, const IntSize& aSize, SurfaceFormat* aFormat = nullptr);
1641
1642
  static already_AddRefed<SourceSurface> CreateSourceSurfaceForCairoSurface(cairo_surface_t* aSurface, const IntSize& aSize, SurfaceFormat aFormat);
1643
1644
  static already_AddRefed<DrawTarget>
1645
    CreateDrawTarget(BackendType aBackend, const IntSize &aSize, SurfaceFormat aFormat);
1646
1647
  /**
1648
   * Create a DrawTarget that captures the drawing commands to eventually be replayed
1649
   * onto the DrawTarget provided. An optional byte size can be provided as a limit
1650
   * for the CaptureCommandList. When the limit is reached, the CaptureCommandList
1651
   * will be replayed to the target and then cleared.
1652
   *
1653
   * @param aSize Size of the area this DT will capture.
1654
   * @param aFlushBytes The byte limit at which to flush the CaptureCommandList
1655
   */
1656
  static already_AddRefed<DrawTargetCapture>
1657
    CreateCaptureDrawTargetForTarget(gfx::DrawTarget* aTarget, size_t aFlushBytes = 0);
1658
1659
  /**
1660
   * Create a DrawTarget that captures the drawing commands and can be replayed
1661
   * onto a compatible DrawTarget afterwards.
1662
   *
1663
   * @param aSize Size of the area this DT will capture.
1664
   */
1665
  static already_AddRefed<DrawTargetCapture>
1666
    CreateCaptureDrawTarget(BackendType aBackend, const IntSize &aSize, SurfaceFormat aFormat);
1667
1668
  static already_AddRefed<DrawTargetCapture>
1669
    CreateCaptureDrawTargetForData(BackendType aBackend, const IntSize &aSize, SurfaceFormat aFormat,
1670
                                   int32_t aStride, size_t aSurfaceAllocationSize);
1671
1672
  static already_AddRefed<DrawTarget>
1673
    CreateWrapAndRecordDrawTarget(DrawEventRecorder *aRecorder, DrawTarget *aDT);
1674
1675
  static already_AddRefed<DrawTarget>
1676
    CreateRecordingDrawTarget(DrawEventRecorder *aRecorder, DrawTarget *aDT, IntSize aSize);
1677
1678
  static already_AddRefed<DrawTarget>
1679
    CreateDrawTargetForData(BackendType aBackend, unsigned char* aData, const IntSize &aSize, int32_t aStride, SurfaceFormat aFormat, bool aUninitialized = false);
1680
1681
#ifdef XP_DARWIN
1682
  static already_AddRefed<ScaledFont>
1683
    CreateScaledFontForMacFont(CGFontRef aCGFont, const RefPtr<UnscaledFont>& aUnscaledFont, Float aSize,
1684
                               const Color& aFontSmoothingBackgroundColor, bool aUseFontSmoothing = true,
1685
                               bool aApplySyntheticBold = false);
1686
#endif
1687
1688
  /**
1689
   * This creates a NativeFontResource from TrueType data.
1690
   *
1691
   * @param aData Pointer to the data
1692
   * @param aSize Size of the TrueType data
1693
   * @param aBackendType Type of the reference DrawTarget the font should be created for.
1694
   * @param aFontType Type of NativeFontResource that should be created.
1695
   * @param aFontContext Optional native font context to be used to create the NativeFontResource.
1696
   * @return a NativeFontResource of nullptr if failed.
1697
   */
1698
  static already_AddRefed<NativeFontResource>
1699
    CreateNativeFontResource(uint8_t *aData, uint32_t aSize, BackendType aBackendType, FontType aFontType, void* aFontContext = nullptr);
1700
1701
  /**
1702
   * This creates an unscaled font of the given type based on font descriptor
1703
   * data retrieved from ScaledFont::GetFontDescriptor.
1704
   */
1705
  static already_AddRefed<UnscaledFont>
1706
    CreateUnscaledFontFromFontDescriptor(FontType aType, const uint8_t* aData, uint32_t aDataLength, uint32_t aIndex);
1707
1708
  /**
1709
   * Creates a ScaledFont from the supplied NativeFont.
1710
   *
1711
   * If aScaledFont is supplied, this creates a scaled font with an associated
1712
   * cairo_scaled_font_t. The NativeFont and cairo_scaled_font_t* parameters must
1713
   * correspond to the same font.
1714
   */
1715
  static already_AddRefed<ScaledFont>
1716
    CreateScaledFontForNativeFont(const NativeFont &aNativeFont,
1717
                                  const RefPtr<UnscaledFont>& aUnscaledFont,
1718
                                  Float aSize,
1719
                                  cairo_scaled_font_t* aScaledFont = nullptr);
1720
1721
  /**
1722
   * This creates a simple data source surface for a certain size. It allocates
1723
   * new memory for the surface. This memory is freed when the surface is
1724
   * destroyed.  The caller is responsible for handing the case where nullptr
1725
   * is returned. The surface is not zeroed unless requested.
1726
   */
1727
  static already_AddRefed<DataSourceSurface>
1728
    CreateDataSourceSurface(const IntSize &aSize, SurfaceFormat aFormat, bool aZero = false);
1729
1730
  /**
1731
   * This creates a simple data source surface for a certain size with a
1732
   * specific stride, which must be large enough to fit all pixels.
1733
   * It allocates new memory for the surface. This memory is freed when
1734
   * the surface is destroyed.  The caller is responsible for handling the case
1735
   * where nullptr is returned. The surface is not zeroed unless requested.
1736
   */
1737
  static already_AddRefed<DataSourceSurface>
1738
    CreateDataSourceSurfaceWithStride(const IntSize &aSize, SurfaceFormat aFormat, int32_t aStride, bool aZero = false);
1739
1740
  typedef void (*SourceSurfaceDeallocator)(void* aClosure);
1741
1742
  /**
1743
   * This creates a simple data source surface for some existing data. It will
1744
   * wrap this data and the data for this source surface.
1745
   *
1746
   * We can provide a custom destroying function for |aData|. This will be
1747
   * called in the surface dtor using |aDeallocator| and the |aClosure|. If
1748
   * there are errors during construction(return a nullptr surface), the caller
1749
   * is responsible for the deallocation.
1750
   *
1751
   * If there is no destroying function, the caller is responsible for
1752
   * deallocating the aData memory only after destruction of this
1753
   * DataSourceSurface.
1754
   */
1755
  static already_AddRefed<DataSourceSurface>
1756
    CreateWrappingDataSourceSurface(uint8_t *aData,
1757
                                    int32_t aStride,
1758
                                    const IntSize &aSize,
1759
                                    SurfaceFormat aFormat,
1760
                                    SourceSurfaceDeallocator aDeallocator = nullptr,
1761
                                    void* aClosure = nullptr);
1762
1763
  static void
1764
    CopyDataSourceSurface(DataSourceSurface* aSource,
1765
                          DataSourceSurface* aDest);
1766
1767
1768
  static already_AddRefed<DrawEventRecorder>
1769
    CreateEventRecorderForFile(const char_type* aFilename);
1770
1771
  static void SetGlobalEventRecorder(DrawEventRecorder *aRecorder);
1772
1773
  static uint32_t GetMaxSurfaceSize(BackendType aType);
1774
1775
  static LogForwarder* GetLogForwarder() { return sConfig ? sConfig->mLogForwarder : nullptr; }
1776
1777
private:
1778
  static Config* sConfig;
1779
public:
1780
1781
#ifdef USE_SKIA_GPU
1782
  static already_AddRefed<DrawTarget>
1783
    CreateDrawTargetSkiaWithGrContext(GrContext* aGrContext,
1784
                                      const IntSize &aSize,
1785
                                      SurfaceFormat aFormat);
1786
#endif
1787
1788
  static void PurgeAllCaches();
1789
1790
  static already_AddRefed<DrawTarget>
1791
    CreateDualDrawTarget(DrawTarget *targetA, DrawTarget *targetB);
1792
1793
  static already_AddRefed<SourceSurface>
1794
    CreateDualSourceSurface(SourceSurface *sourceA, SourceSurface *sourceB);
1795
1796
  /*
1797
   * This creates a new tiled DrawTarget. When a tiled drawtarget is used the
1798
   * drawing is distributed over number of tiles which may each hold an
1799
   * individual offset. The tiles in the set must each have the same backend
1800
   * and format.
1801
   */
1802
  static already_AddRefed<DrawTarget> CreateTiledDrawTarget(const TileSet& aTileSet);
1803
  static already_AddRefed<DrawTarget> CreateOffsetDrawTarget(DrawTarget *aDrawTarget, IntPoint aTileOrigin);
1804
1805
  static bool DoesBackendSupportDataDrawtarget(BackendType aType);
1806
1807
#ifdef USE_SKIA
1808
  static already_AddRefed<DrawTarget> CreateDrawTargetWithSkCanvas(SkCanvas* aCanvas);
1809
#endif
1810
1811
#ifdef MOZ_ENABLE_FREETYPE
1812
  static void SetFTLibrary(FT_Library aFTLibrary);
1813
  static FT_Library GetFTLibrary();
1814
1815
  static FT_Library NewFTLibrary();
1816
  static void ReleaseFTLibrary(FT_Library aFTLibrary);
1817
  static void LockFTLibrary(FT_Library aFTLibrary);
1818
  static void UnlockFTLibrary(FT_Library aFTLibrary);
1819
1820
  static FT_Face NewFTFace(FT_Library aFTLibrary, const char* aFileName, int aFaceIndex);
1821
  static FT_Face NewFTFaceFromData(FT_Library aFTLibrary, const uint8_t* aData, size_t aDataSize, int aFaceIndex);
1822
  static void ReleaseFTFace(FT_Face aFace);
1823
  static FT_Error LoadFTGlyph(FT_Face aFace, uint32_t aGlyphIndex, int32_t aFlags);
1824
1825
private:
1826
  static FT_Library mFTLibrary;
1827
  static Mutex* mFTLock;
1828
public:
1829
#endif
1830
1831
#ifdef WIN32
1832
  static already_AddRefed<DrawTarget> CreateDrawTargetForD3D11Texture(ID3D11Texture2D *aTexture, SurfaceFormat aFormat);
1833
1834
  /*
1835
   * Attempts to create and install a D2D1 device from the supplied Direct3D11 device.
1836
   * Returns true on success, or false on failure and leaves the D2D1/Direct3D11 devices unset.
1837
   */
1838
  static bool SetDirect3D11Device(ID3D11Device *aDevice);
1839
  static RefPtr<ID3D11Device> GetDirect3D11Device();
1840
  static RefPtr<ID2D1Device> GetD2D1Device(uint32_t* aOutSeqNo = nullptr);
1841
  static bool HasD2D1Device();
1842
  static RefPtr<IDWriteFactory> GetDWriteFactory();
1843
  static bool SetDWriteFactory(IDWriteFactory *aFactory);
1844
  static RefPtr<IDWriteFactory> EnsureDWriteFactory();
1845
  static bool SupportsD2D1();
1846
1847
  static uint64_t GetD2DVRAMUsageDrawTarget();
1848
  static uint64_t GetD2DVRAMUsageSourceSurface();
1849
  static void D2DCleanup();
1850
1851
  static already_AddRefed<ScaledFont>
1852
    CreateScaledFontForDWriteFont(IDWriteFontFace* aFontFace,
1853
                                  const gfxFontStyle* aStyle,
1854
                                  const RefPtr<UnscaledFont>& aUnscaledFont,
1855
                                  Float aSize,
1856
                                  bool aUseEmbeddedBitmap,
1857
                                  bool aForceGDIMode,
1858
                                  IDWriteRenderingParams *aParams,
1859
                                  Float aGamma,
1860
                                  Float aContrast);
1861
1862
  static void SetSystemTextQuality(uint8_t aQuality);
1863
1864
private:
1865
  static StaticRefPtr<ID2D1Device> mD2D1Device;
1866
  static StaticRefPtr<ID3D11Device> mD3D11Device;
1867
  static StaticRefPtr<IDWriteFactory> mDWriteFactory;
1868
  static bool mDWriteFactoryInitialized;
1869
1870
protected:
1871
  // This guards access to the singleton devices above, as well as the
1872
  // singleton devices in DrawTargetD2D1.
1873
  static StaticMutex mDeviceLock;
1874
  // This synchronizes access between different D2D drawtargets and their
1875
  // implied dependency graph.
1876
  static StaticMutex mDTDependencyLock;
1877
1878
  friend class DrawTargetD2D1;
1879
#endif
1880
1881
private:
1882
  static DrawEventRecorder *mRecorder;
1883
};
1884
1885
} // namespace gfx
1886
} // namespace mozilla
1887
1888
#endif // _MOZILLA_GFX_2D_H