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