/*
* (C) 2003-2006 Gabest
* (C) 2006-2012 see Authors.txt
*
* This file is part of MPC-HC.
*
* MPC-HC is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* MPC-HC is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#pragma once
#include "ISubPic.h"
class CSubPicImpl : public CUnknown, public ISubPic
{
protected:
REFERENCE_TIME m_rtStart, m_rtStop;
REFERENCE_TIME m_rtSegmentStart, m_rtSegmentStop;
CRect m_rcDirty;
CSize m_maxsize;
CSize m_size;
CRect m_vidrect;
CSize m_VirtualTextureSize;
CPoint m_VirtualTextureTopLeft;
/*
Texture
+-------+---------------------------------+
| . | .
| . m_maxsize | .
TextureTopLeft .<=============================== |======> . Video
| . . . +-------------------------------- | -----+ +-----------------------------------+
| | . | | | m_vidrect |
| | . | | | |
| | . | | | |
| | +-----------+ . | | | |
| | | m_rcDirty | . | | | |
| | | | . | | | |
| | +-----------+ . | | | |
| +-------------------------------- | -----+ | |
| m_size | | |
| <=========================> | | |
| | | |
| | +-----------------------------------+
| | .
| | .
| | .
+-----------------------------------------+
m_VirtualTextureSize
<=========================================>
*/
public:
CSubPicImpl();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// ISubPic
STDMETHODIMP_(REFERENCE_TIME) GetStart();
STDMETHODIMP_(REFERENCE_TIME) GetStop();
STDMETHODIMP_(void) SetStart(REFERENCE_TIME rtStart);
STDMETHODIMP_(void) SetStop(REFERENCE_TIME rtStop);
STDMETHODIMP GetDesc(SubPicDesc& spd) = 0;
STDMETHODIMP CopyTo(ISubPic* pSubPic);
STDMETHODIMP ClearDirtyRect(DWORD color) = 0;
STDMETHODIMP GetDirtyRect(RECT* pDirtyRect);
STDMETHODIMP SetDirtyRect(RECT* pDirtyRect);
STDMETHODIMP GetMaxSize(SIZE* pMaxSize);
STDMETHODIMP SetSize(SIZE size, RECT vidrect);
STDMETHODIMP Lock(SubPicDesc& spd) = 0;
STDMETHODIMP Unlock(RECT* pDirtyRect) = 0;
STDMETHODIMP AlphaBlt(RECT* pSrc, RECT* pDst, SubPicDesc* pTarget) = 0;
STDMETHODIMP SetVirtualTextureSize(const SIZE pSize, const POINT pTopLeft);
STDMETHODIMP GetSourceAndDest(SIZE* pSize, RECT* pRcSource, RECT* pRcDest);
STDMETHODIMP_(REFERENCE_TIME) GetSegmentStart();
STDMETHODIMP_(REFERENCE_TIME) GetSegmentStop();
STDMETHODIMP_(void) SetSegmentStart(REFERENCE_TIME rtStart);
STDMETHODIMP_(void) SetSegmentStop(REFERENCE_TIME rtStop);
};
class CSubPicAllocatorImpl : public CUnknown, public ISubPicAllocator
{
CComPtr m_pStatic;
private:
CSize m_cursize;
CRect m_curvidrect;
bool m_fDynamicWriteOnly;
virtual bool Alloc(bool fStatic, ISubPic** ppSubPic) = 0;
protected:
bool m_fPow2Textures;
public:
CSubPicAllocatorImpl(SIZE cursize, bool fDynamicWriteOnly, bool fPow2Textures);
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// ISubPicAllocator
STDMETHODIMP SetCurSize(SIZE cursize);
STDMETHODIMP SetCurVidRect(RECT curvidrect);
STDMETHODIMP GetStatic(ISubPic** ppSubPic);
STDMETHODIMP AllocDynamic(ISubPic** ppSubPic);
STDMETHODIMP_(bool) IsDynamicWriteOnly();
STDMETHODIMP ChangeDevice(IUnknown* pDev);
STDMETHODIMP SetMaxTextureSize(SIZE MaxTextureSize) { return E_NOTIMPL; };
};