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