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