1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/2d/RadialGradientEffectD2D1.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,100 @@ 1.4 +/* -*- Mode: C++; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#ifndef MOZILLA_GFX_RADIALGRADIENTEFFECTD2D1_H_ 1.10 +#define MOZILLA_GFX_RADIALGRADIENTEFFECTD2D1_H_ 1.11 + 1.12 +#include <d2d1_1.h> 1.13 +#include <d2d1effectauthor.h> 1.14 +#include <d2d1effecthelpers.h> 1.15 + 1.16 +#include "2D.h" 1.17 +#include "mozilla/Attributes.h" 1.18 + 1.19 +// {97143DC6-CBC4-4DD4-A8BA-13342B0BA46D} 1.20 +DEFINE_GUID(CLSID_RadialGradientEffect, 1.21 +0x97143dc6, 0xcbc4, 0x4dd4, 0xa8, 0xba, 0x13, 0x34, 0x2b, 0xb, 0xa4, 0x6d); 1.22 + 1.23 +// Macro to keep our class nice and clean. 1.24 +#define SIMPLE_PROP(type, name) \ 1.25 +public: \ 1.26 + HRESULT Set##name(type a##name) \ 1.27 + { m##name = a##name; return S_OK; } \ 1.28 + type Get##name() const { return m##name; } \ 1.29 +private: \ 1.30 + type m##name; 1.31 + 1.32 +namespace mozilla { 1.33 +namespace gfx { 1.34 + 1.35 +enum { 1.36 + RADIAL_PROP_STOP_COLLECTION = 0, 1.37 + RADIAL_PROP_CENTER_1, 1.38 + RADIAL_PROP_CENTER_2, 1.39 + RADIAL_PROP_RADIUS_1, 1.40 + RADIAL_PROP_RADIUS_2, 1.41 + RADIAL_PROP_TRANSFORM 1.42 +}; 1.43 + 1.44 +class RadialGradientEffectD2D1 MOZ_FINAL : public ID2D1EffectImpl 1.45 + , public ID2D1DrawTransform 1.46 +{ 1.47 +public: 1.48 + // ID2D1EffectImpl 1.49 + IFACEMETHODIMP Initialize(ID2D1EffectContext* pContextInternal, ID2D1TransformGraph* pTransformGraph); 1.50 + IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType); 1.51 + IFACEMETHODIMP SetGraph(ID2D1TransformGraph* pGraph); 1.52 + 1.53 + // IUnknown 1.54 + IFACEMETHODIMP_(ULONG) AddRef(); 1.55 + IFACEMETHODIMP_(ULONG) Release(); 1.56 + IFACEMETHODIMP QueryInterface(REFIID riid, void** ppOutput); 1.57 + 1.58 + // ID2D1Transform 1.59 + IFACEMETHODIMP MapInputRectsToOutputRect(const D2D1_RECT_L* pInputRects, 1.60 + const D2D1_RECT_L* pInputOpaqueSubRects, 1.61 + UINT32 inputRectCount, 1.62 + D2D1_RECT_L* pOutputRect, 1.63 + D2D1_RECT_L* pOutputOpaqueSubRect); 1.64 + IFACEMETHODIMP MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, 1.65 + D2D1_RECT_L* pInputRects, 1.66 + UINT32 inputRectCount) const; 1.67 + IFACEMETHODIMP MapInvalidRect(UINT32 inputIndex, 1.68 + D2D1_RECT_L invalidInputRect, 1.69 + D2D1_RECT_L* pInvalidOutputRect) const; 1.70 + 1.71 + // ID2D1TransformNode 1.72 + IFACEMETHODIMP_(UINT32) GetInputCount() const { return 1; } 1.73 + 1.74 + // ID2D1DrawTransform 1.75 + IFACEMETHODIMP SetDrawInfo(ID2D1DrawInfo *pDrawInfo); 1.76 + 1.77 + static HRESULT Register(ID2D1Factory1* aFactory); 1.78 + static HRESULT __stdcall CreateEffect(IUnknown** aEffectImpl); 1.79 + 1.80 + HRESULT SetStopCollection(IUnknown *aStopCollection); 1.81 + IUnknown *GetStopCollection() const { return mStopCollection; } 1.82 + 1.83 +private: 1.84 + TemporaryRef<ID2D1ResourceTexture> CreateGradientTexture(); 1.85 + 1.86 + RadialGradientEffectD2D1(); 1.87 + 1.88 + uint32_t mRefCount; 1.89 + RefPtr<ID2D1GradientStopCollection> mStopCollection; 1.90 + RefPtr<ID2D1EffectContext> mEffectContext; 1.91 + RefPtr<ID2D1DrawInfo> mDrawInfo; 1.92 + SIMPLE_PROP(D2D1_VECTOR_2F, Center1); 1.93 + SIMPLE_PROP(D2D1_VECTOR_2F, Center2); 1.94 + SIMPLE_PROP(FLOAT, Radius1); 1.95 + SIMPLE_PROP(FLOAT, Radius2); 1.96 + SIMPLE_PROP(D2D_MATRIX_3X2_F, Transform); 1.97 +}; 1.98 + 1.99 +} 1.100 +} 1.101 +#undef SIMPLE_PROP 1.102 + 1.103 +#endif