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