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_layout_InlineTranslator_h
8 #define mozilla_layout_InlineTranslator_h
9 
10 #include <istream>
11 #include <string>
12 
13 #include "mozilla/gfx/2D.h"
14 #include "mozilla/gfx/Filters.h"
15 #include "mozilla/gfx/RecordedEvent.h"
16 #include "nsRefPtrHashtable.h"
17 
18 namespace mozilla {
19 namespace gfx {
20 
21 using gfx::DrawTarget;
22 using gfx::FilterNode;
23 using gfx::GradientStops;
24 using gfx::NativeFontResource;
25 using gfx::Path;
26 using gfx::ReferencePtr;
27 using gfx::ScaledFont;
28 using gfx::SourceSurface;
29 using gfx::Translator;
30 
31 class InlineTranslator : public Translator {
32  public:
33   InlineTranslator();
34 
35   explicit InlineTranslator(DrawTarget* aDT, void* aFontContext = nullptr);
36 
37   bool TranslateRecording(char*, size_t len);
38 
SetExternalSurfaces(nsRefPtrHashtable<nsUint64HashKey,SourceSurface> * aExternalSurfaces)39   void SetExternalSurfaces(
40       nsRefPtrHashtable<nsUint64HashKey, SourceSurface>* aExternalSurfaces) {
41     mExternalSurfaces = aExternalSurfaces;
42   }
43 
LookupDrawTarget(ReferencePtr aRefPtr)44   DrawTarget* LookupDrawTarget(ReferencePtr aRefPtr) final {
45     DrawTarget* result = mDrawTargets.GetWeak(aRefPtr);
46     MOZ_ASSERT(result);
47     return result;
48   }
49 
LookupPath(ReferencePtr aRefPtr)50   Path* LookupPath(ReferencePtr aRefPtr) final {
51     Path* result = mPaths.GetWeak(aRefPtr);
52     MOZ_ASSERT(result);
53     return result;
54   }
55 
LookupSourceSurface(ReferencePtr aRefPtr)56   SourceSurface* LookupSourceSurface(ReferencePtr aRefPtr) final {
57     SourceSurface* result = mSourceSurfaces.GetWeak(aRefPtr);
58     MOZ_ASSERT(result);
59     return result;
60   }
61 
LookupFilterNode(ReferencePtr aRefPtr)62   FilterNode* LookupFilterNode(ReferencePtr aRefPtr) final {
63     FilterNode* result = mFilterNodes.GetWeak(aRefPtr);
64     MOZ_ASSERT(result);
65     return result;
66   }
67 
LookupGradientStops(ReferencePtr aRefPtr)68   GradientStops* LookupGradientStops(ReferencePtr aRefPtr) final {
69     DebugOnly<bool> found;
70     GradientStops* result = mGradientStops.GetWeak(aRefPtr
71 #if defined(DEBUG)
72                                                    ,
73                                                    &found
74 #endif
75     );
76     // GradientStops can be null in some circumstances.
77     MOZ_ASSERT(found);
78     return result;
79   }
80 
LookupScaledFont(ReferencePtr aRefPtr)81   ScaledFont* LookupScaledFont(ReferencePtr aRefPtr) final {
82     ScaledFont* result = mScaledFonts.GetWeak(aRefPtr);
83     MOZ_ASSERT(result);
84     return result;
85   }
86 
LookupUnscaledFont(ReferencePtr aRefPtr)87   UnscaledFont* LookupUnscaledFont(ReferencePtr aRefPtr) final {
88     UnscaledFont* result = mUnscaledFonts.GetWeak(aRefPtr);
89     MOZ_ASSERT(result);
90     return result;
91   }
92 
LookupNativeFontResource(uint64_t aKey)93   NativeFontResource* LookupNativeFontResource(uint64_t aKey) final {
94     NativeFontResource* result = mNativeFontResources.GetWeak(aKey);
95     MOZ_ASSERT(result);
96     return result;
97   }
98 
LookupExternalSurface(uint64_t aKey)99   already_AddRefed<SourceSurface> LookupExternalSurface(
100       uint64_t aKey) override {
101     return mExternalSurfaces->Get(aKey);
102   }
103 
AddDrawTarget(ReferencePtr aRefPtr,DrawTarget * aDT)104   void AddDrawTarget(ReferencePtr aRefPtr, DrawTarget* aDT) final {
105     mDrawTargets.Put(aRefPtr, RefPtr{aDT});
106   }
107 
AddPath(ReferencePtr aRefPtr,Path * aPath)108   void AddPath(ReferencePtr aRefPtr, Path* aPath) final {
109     mPaths.Put(aRefPtr, RefPtr{aPath});
110   }
111 
AddSourceSurface(ReferencePtr aRefPtr,SourceSurface * aSurface)112   void AddSourceSurface(ReferencePtr aRefPtr, SourceSurface* aSurface) final {
113     mSourceSurfaces.Put(aRefPtr, RefPtr{aSurface});
114   }
115 
AddFilterNode(ReferencePtr aRefPtr,FilterNode * aFilter)116   void AddFilterNode(ReferencePtr aRefPtr, FilterNode* aFilter) final {
117     mFilterNodes.Put(aRefPtr, RefPtr{aFilter});
118   }
119 
AddGradientStops(ReferencePtr aRefPtr,GradientStops * aStops)120   void AddGradientStops(ReferencePtr aRefPtr, GradientStops* aStops) final {
121     mGradientStops.Put(aRefPtr, RefPtr{aStops});
122   }
123 
AddScaledFont(ReferencePtr aRefPtr,ScaledFont * aScaledFont)124   void AddScaledFont(ReferencePtr aRefPtr, ScaledFont* aScaledFont) final {
125     mScaledFonts.Put(aRefPtr, RefPtr{aScaledFont});
126   }
127 
AddUnscaledFont(ReferencePtr aRefPtr,UnscaledFont * aUnscaledFont)128   void AddUnscaledFont(ReferencePtr aRefPtr,
129                        UnscaledFont* aUnscaledFont) final {
130     mUnscaledFonts.Put(aRefPtr, RefPtr{aUnscaledFont});
131   }
132 
AddNativeFontResource(uint64_t aKey,NativeFontResource * aScaledFontResouce)133   void AddNativeFontResource(uint64_t aKey,
134                              NativeFontResource* aScaledFontResouce) final {
135     mNativeFontResources.Put(aKey, RefPtr{aScaledFontResouce});
136   }
137 
RemoveDrawTarget(ReferencePtr aRefPtr)138   void RemoveDrawTarget(ReferencePtr aRefPtr) override {
139     mDrawTargets.Remove(aRefPtr);
140   }
141 
RemovePath(ReferencePtr aRefPtr)142   void RemovePath(ReferencePtr aRefPtr) final { mPaths.Remove(aRefPtr); }
143 
RemoveSourceSurface(ReferencePtr aRefPtr)144   void RemoveSourceSurface(ReferencePtr aRefPtr) override {
145     mSourceSurfaces.Remove(aRefPtr);
146   }
147 
RemoveFilterNode(ReferencePtr aRefPtr)148   void RemoveFilterNode(ReferencePtr aRefPtr) final {
149     mFilterNodes.Remove(aRefPtr);
150   }
151 
RemoveGradientStops(ReferencePtr aRefPtr)152   void RemoveGradientStops(ReferencePtr aRefPtr) final {
153     mGradientStops.Remove(aRefPtr);
154   }
155 
RemoveScaledFont(ReferencePtr aRefPtr)156   void RemoveScaledFont(ReferencePtr aRefPtr) final {
157     mScaledFonts.Remove(aRefPtr);
158   }
159 
RemoveUnscaledFont(ReferencePtr aRefPtr)160   void RemoveUnscaledFont(ReferencePtr aRefPtr) final {
161     mUnscaledFonts.Remove(aRefPtr);
162   }
163 
164   already_AddRefed<DrawTarget> CreateDrawTarget(
165       ReferencePtr aRefPtr, const gfx::IntSize& aSize,
166       gfx::SurfaceFormat aFormat) override;
167 
GetReferenceDrawTarget()168   mozilla::gfx::DrawTarget* GetReferenceDrawTarget() final {
169     MOZ_ASSERT(mBaseDT, "mBaseDT has not been initialized.");
170     return mBaseDT;
171   }
172 
GetFontContext()173   void* GetFontContext() final { return mFontContext; }
GetError()174   std::string GetError() { return mError; }
175 
176  protected:
177   RefPtr<DrawTarget> mBaseDT;
178 
179  private:
180   void* mFontContext;
181   std::string mError;
182 
183   nsRefPtrHashtable<nsPtrHashKey<void>, DrawTarget> mDrawTargets;
184   nsRefPtrHashtable<nsPtrHashKey<void>, Path> mPaths;
185   nsRefPtrHashtable<nsPtrHashKey<void>, SourceSurface> mSourceSurfaces;
186   nsRefPtrHashtable<nsPtrHashKey<void>, FilterNode> mFilterNodes;
187   nsRefPtrHashtable<nsPtrHashKey<void>, GradientStops> mGradientStops;
188   nsRefPtrHashtable<nsPtrHashKey<void>, ScaledFont> mScaledFonts;
189   nsRefPtrHashtable<nsPtrHashKey<void>, UnscaledFont> mUnscaledFonts;
190   nsRefPtrHashtable<nsUint64HashKey, NativeFontResource> mNativeFontResources;
191   nsRefPtrHashtable<nsUint64HashKey, SourceSurface>* mExternalSurfaces;
192 };
193 
194 }  // namespace gfx
195 }  // namespace mozilla
196 
197 #endif  // mozilla_layout_InlineTranslator_h
198