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