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