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