/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2010 see AUTHORS
*
* This file is part of mplayerc.
*
* Mplayerc 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.
*
* Mplayerc 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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace DSObjects
{
struct REGION {
REGION() : rects(0), pOSRegion(0) {}
long size;
long numRects;
PNxRect* rects;
PNxRect extents;
void* pOSRegion;
};
void ExtractRects(REGION* pRegion);
REGION* RMACreateRectRegion(int left, int top, int right, int bottom);
void RMASubtractRegion(REGION* regM, REGION* regS, REGION* regD);
void RMAUnionRegion(REGION* reg1, REGION* reg2, REGION* regD);
void RMAIntersectRegion(REGION* reg1, REGION* reg2, REGION* regD);
BOOL RMAEqualRegion(REGION* reg1, REGION* reg2);
void RMADestroyRegion(REGION* reg);
REGION* RMACreateRegion();
class CRealMediaWindowlessSite;
//
// CRealMediaVideoSurface
//
class CRealMediaWindowlessSite;
class CRealMediaVideoSurface
: public CUnknown
, public IRMAVideoSurface
{
void IntersectRect(PNxRect* pRect, PNxRect* pBox, PNxRect* pRetVal);
protected:
CComPtr m_pContext;
CRealMediaWindowlessSite* m_pSiteWindowless;
RMABitmapInfoHeader m_bitmapInfo;
RMABitmapInfoHeader m_lastBitmapInfo;
public:
CRealMediaVideoSurface(IUnknown* pContext, CRealMediaWindowlessSite* pSiteWindowless);
virtual ~CRealMediaVideoSurface();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
// IRMAVideoSurface
STDMETHODIMP Blt(UCHAR* /*IN*/ pImageData, RMABitmapInfoHeader* /*IN*/ pBitmapInfo, REF(PNxRect) /*IN*/ inDestRect, REF(PNxRect) /*IN*/ inSrcRect);
STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* /*IN*/ pBitmapInfo);
STDMETHODIMP OptimizedBlt(UCHAR* /*IN*/ pImageBits, REF(PNxRect) /*IN*/ rDestRect, REF(PNxRect) /*IN*/ rSrcRect);
STDMETHODIMP EndOptimizedBlt();
STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) /*OUT*/ ulType);
STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) /*OUT*/ ulType);
};
//
// CRealMediaWindowlessSite
//
class CRealMediaWindowlessSite
: public CUnknown
, public IRMASite
, public IRMASite2
, public IRMASiteWindowless
, public IRMAVideoSurface
{
CComQIPtr m_pCCF;
CComPtr m_pContext;
CComPtr m_pValues;
CComPtr m_pUser;
CRealMediaWindowlessSite* m_pParentSite;
CInterfaceList m_pChildren;
CComPtr m_pWatcher;
CInterfaceList m_pPassiveWatchers;
PNxSize m_size;
PNxPoint m_position;
bool m_fDamaged, m_fInRedraw, m_fIsVisible;
INT32 m_lZOrder;
//
REGION* m_pRegion;
REGION* m_pRegionWithoutChildren;
void RecomputeRegion();
void InternalRecomputeRegion();
void ComputeRegion();
void SubtractSite(REGION* pRegion);
void UpdateZOrder(CRealMediaWindowlessSite* pUpdatedChildSite, INT32 lOldZOrder, INT32 lNewZOrder);
void SetInternalZOrder(INT32 lZOrder);
public:
CRealMediaWindowlessSite(HRESULT& hr, IUnknown* pContext, CRealMediaWindowlessSite* pParentSite = NULL, IUnknown* pUnkOuter = NULL);
virtual ~CRealMediaWindowlessSite();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
void GetTopLeft(PNxPoint* pPoint);
REGION* GetRegion();
// IRMASiteWindowless
STDMETHODIMP EventOccurred(PNxEvent* /*IN*/ pEvent);
STDMETHODIMP_(PNxWindow*) GetParentWindow();
// IRMASite
STDMETHODIMP AttachUser(IRMASiteUser* /*IN*/ pUser);
STDMETHODIMP DetachUser();
STDMETHODIMP GetUser(REF(IRMASiteUser*) /*OUT*/ pUser);
STDMETHODIMP CreateChild(REF(IRMASite*) /*OUT*/ pChildSite);
STDMETHODIMP DestroyChild(IRMASite* /*IN*/ pChildSite);
STDMETHODIMP AttachWatcher(IRMASiteWatcher* /*IN*/ pWatcher);
STDMETHODIMP DetachWatcher();
STDMETHODIMP SetPosition(PNxPoint position);
STDMETHODIMP GetPosition(REF(PNxPoint) position);
STDMETHODIMP SetSize(PNxSize size);
STDMETHODIMP GetSize(REF(PNxSize) size);
STDMETHODIMP DamageRect(PNxRect rect);
STDMETHODIMP DamageRegion(PNxRegion region);
STDMETHODIMP ForceRedraw();
// IRMASite2
STDMETHODIMP UpdateSiteWindow(PNxWindow* /*IN*/ pWindow);
STDMETHODIMP ShowSite(BOOL bShow);
STDMETHODIMP_(BOOL) IsSiteVisible();
STDMETHODIMP SetZOrder(INT32 lZOrder);
STDMETHODIMP GetZOrder(REF(INT32) lZOrder);
STDMETHODIMP MoveSiteToTop();
STDMETHODIMP GetVideoSurface(REF(IRMAVideoSurface*) pSurface);
STDMETHODIMP_(UINT32) GetNumberOfChildSites();
STDMETHODIMP AddPassiveSiteWatcher(IRMAPassiveSiteWatcher* pWatcher);
STDMETHODIMP RemovePassiveSiteWatcher(IRMAPassiveSiteWatcher* pWatcher);
STDMETHODIMP SetCursor(PNxCursor cursor, REF(PNxCursor) oldCursor);
private:
void IntersectRect(PNxRect* pRect, PNxRect* pBox, PNxRect* pRetVal);
protected:
RMABitmapInfoHeader m_bitmapInfo;
RMABitmapInfoHeader m_lastBitmapInfo;
CComPtr m_pBltService;
public:
bool GetBltService(IRMAVideoSurface** ppBltService);
void SetBltService(IRMAVideoSurface* ppBltService);
// IRMAVideoSurface
STDMETHODIMP Blt(UCHAR* /*IN*/ pImageData, RMABitmapInfoHeader* /*IN*/ pBitmapInfo, REF(PNxRect) /*IN*/ inDestRect, REF(PNxRect) /*IN*/ inSrcRect);
STDMETHODIMP BeginOptimizedBlt(RMABitmapInfoHeader* /*IN*/ pBitmapInfo);
STDMETHODIMP OptimizedBlt(UCHAR* /*IN*/ pImageBits, REF(PNxRect) /*IN*/ rDestRect, REF(PNxRect) /*IN*/ rSrcRect);
STDMETHODIMP EndOptimizedBlt();
STDMETHODIMP GetOptimizedFormat(REF(RMA_COMPRESSION_TYPE) /*OUT*/ ulType);
STDMETHODIMP GetPreferredFormat(REF(RMA_COMPRESSION_TYPE) /*OUT*/ ulType);
};
}