diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/2d/ExtendInputEffectD2D1.h | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/gfx/2d/ExtendInputEffectD2D1.h b/gfx/2d/ExtendInputEffectD2D1.h new file mode 100644 index 0000000000..47a026b940 --- /dev/null +++ b/gfx/2d/ExtendInputEffectD2D1.h @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_GFX_EXTENDINPUTEFFECTD2D1_H_ +#define MOZILLA_GFX_EXTENDINPUTEFFECTD2D1_H_ + +#include <d2d1_1.h> +#include <d2d1effectauthor.h> +#include <d2d1effecthelpers.h> + +#include "2D.h" +#include "mozilla/Attributes.h" + +// {97143DC6-CBC4-4DD4-A8BA-13342B0BA46D} +DEFINE_GUID(CLSID_ExtendInputEffect, 0x5fb55c7c, 0xd795, 0x4ba3, 0xa9, 0x5c, + 0x22, 0x82, 0x5d, 0x0c, 0x4d, 0xf7); + +namespace mozilla { +namespace gfx { + +enum { EXTENDINPUT_PROP_OUTPUT_RECT = 0 }; + +// An effect type that passes through its input unchanged but sets the effect's +// output rect to a specified rect. Unlike the built-in Crop effect, the +// ExtendInput effect can extend the input rect, and not just make it smaller. +// The added margins are filled with transparent black. +// Some effects have different output depending on their input effect's output +// rect, for example the Border effect (which repeats the edges of its input +// effect's output rect) or the component transfer and color matrix effects +// (which can transform transparent pixels into non-transparent ones, but only +// inside their input effect's output rect). +class ExtendInputEffectD2D1 final : public ID2D1EffectImpl, + public ID2D1DrawTransform { + public: + // ID2D1EffectImpl + IFACEMETHODIMP Initialize(ID2D1EffectContext* pContextInternal, + ID2D1TransformGraph* pTransformGraph); + IFACEMETHODIMP PrepareForRender(D2D1_CHANGE_TYPE changeType); + IFACEMETHODIMP SetGraph(ID2D1TransformGraph* pGraph); + + // IUnknown + IFACEMETHODIMP_(ULONG) AddRef(); + IFACEMETHODIMP_(ULONG) Release(); + IFACEMETHODIMP QueryInterface(REFIID riid, void** ppOutput); + + // ID2D1Transform + IFACEMETHODIMP MapInputRectsToOutputRect( + const D2D1_RECT_L* pInputRects, const D2D1_RECT_L* pInputOpaqueSubRects, + UINT32 inputRectCount, D2D1_RECT_L* pOutputRect, + D2D1_RECT_L* pOutputOpaqueSubRect); + IFACEMETHODIMP MapOutputRectToInputRects(const D2D1_RECT_L* pOutputRect, + D2D1_RECT_L* pInputRects, + UINT32 inputRectCount) const; + IFACEMETHODIMP MapInvalidRect(UINT32 inputIndex, D2D1_RECT_L invalidInputRect, + D2D1_RECT_L* pInvalidOutputRect) const; + + // ID2D1TransformNode + IFACEMETHODIMP_(UINT32) GetInputCount() const { return 1; } + + // ID2D1DrawTransform + IFACEMETHODIMP SetDrawInfo(ID2D1DrawInfo* pDrawInfo) { return S_OK; } + + static HRESULT Register(ID2D1Factory1* aFactory); + static void Unregister(ID2D1Factory1* aFactory); + static HRESULT __stdcall CreateEffect(IUnknown** aEffectImpl); + + HRESULT SetOutputRect(D2D1_VECTOR_4F aOutputRect) { + mOutputRect = aOutputRect; + return S_OK; + } + D2D1_VECTOR_4F GetOutputRect() const { return mOutputRect; } + + private: + ExtendInputEffectD2D1(); + + uint32_t mRefCount; + D2D1_VECTOR_4F mOutputRect; +}; + +} // namespace gfx +} // namespace mozilla +#undef SIMPLE_PROP + +#endif |