/* ***** BEGIN LICENSE BLOCK ***** 
 * Version: RCSL 1.0/RPSL 1.0 
 *  
 * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
 *      
 * The contents of this file, and the files included with this file, are 
 * subject to the current version of the RealNetworks Public Source License 
 * Version 1.0 (the "RPSL") available at 
 * http://www.helixcommunity.org/content/rpsl unless you have licensed 
 * the file under the RealNetworks Community Source License Version 1.0 
 * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
 * in which case the RCSL will apply. You may also obtain the license terms 
 * directly from RealNetworks.  You may not use this file except in 
 * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
 * applicable to this file, the RCSL.  Please see the applicable RPSL or 
 * RCSL for the rights, obligations and limitations governing use of the 
 * contents of the file.  
 *  
 * This file is part of the Helix DNA Technology. RealNetworks is the 
 * developer of the Original Code and owns the copyrights in the portions 
 * it created. 
 *  
 * This file, and the files included with this file, is distributed and made 
 * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
 * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
 * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
 * 
 * Technology Compatibility Kit Test Suite(s) Location: 
 *    http://www.helixcommunity.org/content/tck 
 * 
 * Contributor(s): 
 *  
 * ***** END LICENSE BLOCK ***** */ 

#ifndef _HXWIN_H_
#define _HXWIN_H_

/*
 * Forward declarations of some interfaces defined or used here-in.
 */
typedef _INTERFACE	IHXSite			IHXSite;
typedef _INTERFACE	IHXSiteUser			IHXSiteUser;
typedef _INTERFACE	IHXSiteWindowed		IHXSiteWindowed;
typedef _INTERFACE	IHXSiteEventHandler            IHXSiteEventHandler;
typedef _INTERFACE	IHXSiteWindowless		IHXSiteWindowless;
typedef _INTERFACE	IHXSiteWatcher			IHXSiteWatcher;
typedef _INTERFACE	IHXValues			IHXValues;
typedef _INTERFACE	IHXSiteFullScreen		IHXSiteFullScreen;
typedef _INTERFACE	IHXLayoutSiteGroupManager	IHXLayoutSiteGroupManager;
typedef _INTERFACE	IHXEventHook			IHXEventHook;
typedef _INTERFACE	IHXColorConverter		IHXColorConverter;
typedef _INTERFACE	IHXSubRectVideoSurface		IHXSubRectVideoSurface;

typedef struct _HXBitmapInfoHeader HXBitmapInfoHeader;
typedef struct _HXxWindow   HXxWindow;
typedef struct _HXxRegion  HXxBoxRegion;
typedef struct _HXxSize	    HXxSize;
typedef struct _HXxPoint    HXxPoint;
typedef struct _HXxRect	    HXxRect;
typedef void* HXxRegion;


/*
 * Styles for IHXDrawFocus
 */
#define HX_SOLID_LINE      1
#define HX_DASHED_LINE     HX_SOLID_LINE<<1
#define HX_DOTTED_LINE     HX_SOLID_LINE<<2
#define HX_CUSTOM_LINE     HX_SOLID_LINE<<3

/*
 * Focus Navigation
 */
typedef enum _HXFocusContext
{
    HXFirstFocus,
    HXUpFocus,
    HXDownFocus,
    HXLeftFocus,
    HXRightFocus,
    HXNextFocus,
    HXPrevFocus,
    HXLastFocus
} HXFocusContext;

typedef enum _HXFocusState
{
    HXNoFocus,
    HXFocused
} HXFocusState;

/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteWindowed
 *
 *  Purpose:
 *
 *	Interface for IHXSite objects which are associated with platform
 *	specific window objects on Microsoft Windows and X-Windows.
 *
 *  IID_IHXSiteWindowed:
 *
 *	{00000D01-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteWindowed, 0x00000D01, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#define CLSID_IHXSiteWindowed	IID_IHXSiteWindowed

// $Private:
DEFINE_GUID(IID_IHXGetImplementation, 0x00000D11, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);
// $EndPrivate.

#undef  INTERFACE
#define INTERFACE   IHXSiteWindowed

DECLARE_INTERFACE_(IHXSiteWindowed, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteWindowed methods called by site suppliers 
     * when they want the site associated with a
     * previously created (and externally managed) window.
     * This method will "sub-class" that window (Win32).
     * On Unix, the site supplier must pass events from 
     * the externally managed window to the core via
     * IHXClientEngine::EventOccurred(). Please note that
     * The HXxWindow ptr must remain in scope for the life
     * of Site.
     * 
     */
    STDMETHOD(AttachWindow)	(THIS_
				HXxWindow* /*IN*/ pWindow) PURE;

    STDMETHOD(DetachWindow)	(THIS) PURE;

    /*
     * IHXSiteWindowed methods called by Owners of the site
     * in the event that want a default top level window created
     * for the site.
     */
    STDMETHOD(Create)		(THIS_
				void* ParentWindow, 
				UINT32 style) PURE;

    STDMETHOD(Destroy)		(THIS) PURE;

    /*
     * IHXSiteWindowed method. Returns actual window of the site.
     */
    STDMETHOD_(HXxWindow*,GetWindow)(THIS) PURE;

#if defined(HELIX_FEATURE_PANDA3D)
	STDMETHOD(SetDstBuffer)(THIS_
				UCHAR* pDstBuffer,
				int pDstWidth,
				int pDstHeight);
#endif
};

// $Private:
/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteEventHandler
 *
 *  Purpose:
 *
 *	Interface for allowing client core engine to pass events to a site imeplementor
 *      which it implemented as a factory plugin. 
 *
 *  IID_IHXSiteEventHandler                      
 *
 *	{00000D12-0901-11d1-8B-6-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXSiteEventHandler, 0x00000D12, 0x901, 0x11d1, 0x8b, 0x6, 
	                0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#define CLSID_IHXSiteEventHandler	IID_IHXSiteEventHandler

#undef  INTERFACE
#define INTERFACE   IHXSiteEventHandler

DECLARE_INTERFACE_(IHXSiteEventHandler, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * This method is called from Site Manager EventOccured().
     * The imeplementation of this interface must pass the events 
     * on to the individual CHXSiteWindowed sites.
     */
    STDMETHOD(EventOccurred) (THIS_ HXxEvent* pEvent) PURE;
};
// $EndPrivate.


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteWindowless
 *
 *  Purpose:
 *
 *	Interface for IHXSite objects which are "windowless" or not 
 *	associated with platform specific window objects.
 *
 *  IID_IHXSiteWindowless:
 *
 *	{00000D02-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteWindowless, 0x00000D02, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteWindowless

#define CLSID_IHXSiteWindowless IID_IHXSiteWindowless

DECLARE_INTERFACE_(IHXSiteWindowless, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteWindowless methods called by owners of the site.
     */
    STDMETHOD(EventOccurred)	(THIS_
				HXxEvent* /*IN*/ pEvent) PURE;

    /*
     * IHXSiteWindowless method. Returns some parent window that
     * owns the windowless site. Useful for right-click menus and
     * dialog box calls.
     */
    STDMETHOD_(HXxWindow*,GetParentWindow)(THIS) PURE;
};


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSite
 *
 *  Purpose:
 *
 *	Interface for IHXSite objects.
 *
 *  IID_IHXSite:
 *
 *	{00000D03-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSite, 0x00000D03, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSite

DECLARE_INTERFACE_(IHXSite, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSite methods usually called by the "context" to 
     * associate users with the site, and to create child sites
     * as appropriate.
     */
    STDMETHOD(AttachUser)	(THIS_
				IHXSiteUser*	/*IN*/	pUser) PURE;

    STDMETHOD(DetachUser)	(THIS) PURE;


    STDMETHOD(GetUser)		(THIS_
				REF(IHXSiteUser*) /*OUT*/ pUser) PURE;

    STDMETHOD(CreateChild)	(THIS_
				REF(IHXSite*)	/*OUT*/ pChildSite) PURE;

    STDMETHOD(DestroyChild)	(THIS_
				IHXSite*	/*IN*/	pChildSite) PURE;

    /*
     * IHXSite methods called by the the "context" in which the site
     * is displayed in order to manage its position. Site users should
     * not generally call these methods.
     */
    STDMETHOD(AttachWatcher)	(THIS_
				IHXSiteWatcher* /*IN*/	pWatcher) PURE;

    STDMETHOD(DetachWatcher)	(THIS) PURE;

    STDMETHOD(SetPosition)	(THIS_
				HXxPoint		position) PURE;

    STDMETHOD(GetPosition)	(THIS_
				REF(HXxPoint)		position) PURE;

    /*
     * IHXSite methods called by the user of the site to get
     * information about the site, and to manipulate the site.
     */
    STDMETHOD(SetSize)		(THIS_
				HXxSize			size) PURE;

    STDMETHOD(GetSize)		(THIS_
				REF(HXxSize)		size) PURE;

    STDMETHOD(DamageRect)	(THIS_
				HXxRect			rect) PURE;

    STDMETHOD(DamageRegion)	(THIS_
				HXxRegion		region) PURE;

    STDMETHOD(ForceRedraw)	(THIS) PURE;
};


// $Private
/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteComposition
 *
 *  Purpose:
 *
 *	Interface for IHXSite objects to let them compose composition
 *      frames and display them on a regular basis rather than many
 *      discrete blts.
 *
 *  IID_IHXSiteComposition:
 *
 *	{00000D03-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteComposition, 0x00000D19, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteComposition

DECLARE_INTERFACE_(IHXSiteComposition, IUnknown)
{
    /* IUnknown methods */
    STDMETHOD(QueryInterface)	(THIS_ REFIID riid, void** ppvObj) PURE;
    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;
    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /* IHXSiteComposition methods. */
    STDMETHOD(LockComposition)            (THIS) PURE;
    STDMETHOD(UnlockComposition)          (THIS) PURE;
    STDMETHOD(BltComposition)             (THIS) PURE;
    STDMETHOD(SetCompositionMode)         (THIS_ BOOL OnOrOff) PURE;
    STDMETHOD_(BOOL, IsCompositionLocked) (THIS) PURE;
    STDMETHOD_(BOOL, IsCompositionMode)   (THIS) PURE;
};
// $EndPrivate.


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteUser
 *
 *  Purpose:
 *
 *	Interface for the user of the IHXSite objects.
 *
 *  IID_IHXSiteUser:
 *
 *	{00000D04-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteUser, 0x00000D04, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteUser

DECLARE_INTERFACE_(IHXSiteUser, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteUser methods usually called by the "context" to 
     * associate users with the site.
     */
    STDMETHOD(AttachSite)	(THIS_
				IHXSite*	/*IN*/ pSite) PURE;

    STDMETHOD(DetachSite)	(THIS) PURE;

    /*
     * IHXSiteUser methods called to inform user of an event.
     */
    STDMETHOD(HandleEvent)	(THIS_
				HXxEvent*	/*IN*/ pEvent) PURE;

    STDMETHOD_(BOOL,NeedsWindowedSites)	(THIS) PURE;
};

/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteWatcher
 *
 *  Purpose:
 *
 *	Interface for IHXSiteWatcher objects.
 *
 *  IID_IHXSite:
 *
 *	{00000D05-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteWatcher, 0x00000D05, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteWatcher

DECLARE_INTERFACE_(IHXSiteWatcher, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteWatcher methods called by the site when a watcher 
     * is attached to or detached from it.
     */
    STDMETHOD(AttachSite)	(THIS_
				IHXSite*	/*IN*/	pSite) PURE;

    STDMETHOD(DetachSite)	(THIS) PURE;

    /*
     * IHXSiteWatcher methods called by the site an attempt is
     * made to change it's position or size. The site watcher must
     * return HXR_OK for the change to occur. If the site watcher
     * returns any value other than HXR_OK then the size or position
     * will not change. The site watcher can also modify the new
     * size of position.
     */
    STDMETHOD(ChangingPosition)	(THIS_
				HXxPoint		posOld,
				REF(HXxPoint)/*IN-OUT*/	posNew) PURE;

    STDMETHOD(ChangingSize)	(THIS_
				HXxSize			sizeOld,
				REF(HXxSize) /*IN-OUT*/	sizeNew) PURE;
};

/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteUserSupplier
 *
 *  Purpose:
 *
 *	Interface implemented by renderers and objects with provide layouts to
 *	the client core. This interface is called by the core when it needs a 
 *	new IHXSiteUser, or when it is done using an IHXSiteUser.
 *
 *  IID_IHXSiteUserSupplier:
 *
 *	{00000D06-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteUserSupplier, 0x00000D06, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteUserSupplier

DECLARE_INTERFACE_(IHXSiteUserSupplier, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteUserSupplier methods usually called by the 
     * "context" to ask for additional or to release previously
     * created site users.
     */
    STDMETHOD(CreateSiteUser)	(THIS_
				REF(IHXSiteUser*)/*OUT*/ pSiteUser) PURE;

    STDMETHOD(DestroySiteUser)	(THIS_
				IHXSiteUser*	  /*IN*/ pSiteUser) PURE;

    STDMETHOD_(BOOL,NeedsWindowedSites)	(THIS) PURE;
};


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteSupplier
 *
 *  Purpose:
 *
 *	Interface implemented by users of the client core. This interface is
 *	called by the core when it needs a new IHXSite, or when it is done
 *	using an IHXSite.
 *
 *  IID_IHXSiteSupplier:
 *
 *	{00000D07-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteSupplier, 0x00000D07, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteSupplier

DECLARE_INTERFACE_(IHXSiteSupplier, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteSupplier methods
     */

    /************************************************************************
     *	Method:
     *	    IHXSiteSupplier::SitesNeeded
     *	Purpose:
     *	  Called to inform the site supplier that a site with a particular
     *	  set of characteristics is needed. If the site supplier can 
     *	  fulfill the request it should call the site manager and add one
     *	  or more new sites.
     *    Note that the request for sites is associated with a Request ID
     *    the client core will inform the site supplier when this requested
     *    site is no longer needed.
     */
    STDMETHOD(SitesNeeded)	(THIS_
				UINT32			uReqestID,
				IHXValues*		pSiteProps) PURE;

    /************************************************************************
     *  Method:
     *    IHXSiteSupplier::SitesNotNeeded
     *  Purpose:
     *    Called to inform the site supplier that all sites from a previos
     *	  site request are no longer needed. If the site supplier had 
     *	  previously created non-persistant sites (like popup windows)
     *    to fulfill a request for sites it should call the site manager 
     *    and remove those sites.
     */
    STDMETHOD(SitesNotNeeded)	(THIS_
				UINT32			uReqestID) PURE;


    /************************************************************************
     *  Method:
     *    IHXSiteSupplier::BeginChangeLayout
     *  Purpose:
     *    Called to inform the site supplier a layout change has beginning
     *	  it can expect to recieve SitesNeeded() and SitesNotNeeded() calls
     *	  while a layout change is in progress,
     */
    STDMETHOD(BeginChangeLayout) (THIS) PURE;

    /************************************************************************
     *  Method:
     *    IHXSiteSupplier::DoneChangeLayout
     *  Purpose:
     *    Called to inform the site supplier the layout change has been
     *	  completed.
     */
    STDMETHOD(DoneChangeLayout) (THIS) PURE;

};


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteManager
 *
 *  Purpose:
 *
 *	Interface implemented by the client core. This interface is called
 *	by users of the client core to inform it of IHXSite's which are
 *	available for layout of renderers
 *
 *  IID_IHXSiteManager:
 *
 *	{00000D08-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteManager, 0x00000D08, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteManager

DECLARE_INTERFACE_(IHXSiteManager, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteManager methods
     */

    /************************************************************************
     *	Method:
     *	    IHXSiteManager::AddSite
     *	Purpose:
     *	  Called to inform the site manager of the existance of a site.
     */
    STDMETHOD(AddSite)		(THIS_
				IHXSite*		pSite) PURE;

    /************************************************************************
     *	Method:
     *	    IHXSiteManager::RemoveSite
     *	Purpose:
     *	  Called to inform the site manager that a site is no longer 
     *	  available.
     */
    STDMETHOD(RemoveSite)	(THIS_
				IHXSite*		pSite) PURE;
};


// $Private:
/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteManager2
 *
 *  Purpose:
 *
 *	Interface implemented by the client core. This interface is called
 *	by users of the client core to iterate over the sites known by this
 *	site manager.
 *
 *  IID_IHXSiteManager:
 *
 *	{00000D20-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteManager2, 0x00000D20, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteManager2

DECLARE_INTERFACE_(IHXSiteManager2, IUnknown)
{
    /*
     * IHXSiteManager2 methods
     */

    /************************************************************************
     *	Method:
     *	    IHXSiteManager2::GetNumberOfSites
     *	Purpose:
     *	  Called to get the number of sites that the site mananger currently 
     *    knows about.
     */
    STDMETHOD(GetNumberOfSites)		(THIS_  REF(UINT32) nNumSites ) PURE;

    /************************************************************************
     *	Method:
     *	    IHXSiteManager2::GetSiteAt
     *	Purpose:
     *	  Used to iterate over the sites.
     *	  
     */
    STDMETHOD(GetSiteAt)	(THIS_ UINT32 nIndex, REF(IHXSite*) pSite) PURE;
};
// $EndPrivate.


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXMultiInstanceSiteUserSupplier
 *
 *  Purpose:
 *
 *	This is the interface for a special default object which is available
 *	from the common class factory. This object will act as a site user 
 *	supplier for any renderer (or other site user object) that wants
 *	default support for multiple instances. The site user must work as
 *	a windowless site for this default implementation to work. The 
 *	default object also implements the IHXSite interfave to allow
 *	the site user object to control all the sites through a single 
 *	interface instance.
 *
 *  IID_IHXMultiInstanceSiteUserSupplier:
 *
 *	{00000D09-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXMultiInstanceSiteUserSupplier, 0x00000D09, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#define CLSID_IHXMultiInstanceSiteUserSupplier	\
		IID_IHXMultiInstanceSiteUserSupplier

#undef  INTERFACE
#define INTERFACE   IHXMultiInstanceSiteUserSupplier

DECLARE_INTERFACE_(IHXMultiInstanceSiteUserSupplier, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXMultiInstanceSiteUserSupplier methods called by site users.
     */
    STDMETHOD(SetSingleSiteUser)		(THIS_ 
						IUnknown*	pUnknown) PURE;

    STDMETHOD(ReleaseSingleSiteUser)		(THIS) PURE;

};


/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteEnumerator
 *
 *  Purpose:
 *
 *      Provides an interface to enumerate sites.  Currently implemented 
 *      in the IHXMultiInstanceSiteUserSupplier supplied by the core player,
 *      it can be used to render to MISUS sites outside of an HX_SURFACE_UPDATE;
 *      this is especially useful when using IHXVideoSurface2.
 *
 *  IID_IHXSiteEnumerator:
 *
 *	{67f8c5bd-4b1d-4c09-8fb7-8ac7c20d29c7}
 *
 */
DEFINE_GUID(IID_IHXSiteEnumerator, 0x67f8c5bd, 0x4b1d,  
            0x4c09, 0x8f, 0xb7, 0x8a, 0xc7, 0xc2, 0x0d, 0x29, 0xc7);

#undef  INTERFACE
#define INTERFACE   IHXSiteEnumerator

DECLARE_INTERFACE_(IHXSiteEnumerator, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    typedef void* SitePosition;

    /*
     * HXSiteEnumerator methods
     */


    /************************************************************************
     *	Method:
     *	    HXSiteEnumerator::GetFirstSite
     *	Purpose:
     *	    Retrieves both the first site in the enumeration and initializes 
     *      sitePosition with the position of the next site (if any).  
     *      Returns HXR_OK if the first site is available, HXR_FAIL if not.
     */
    STDMETHOD(GetFirstSite) (THIS_
                             REF(IHXSite*) /* OUT */ pFirstSite,
                             REF(SitePosition) /* OUT */ nextPosition) PURE;

    /************************************************************************
     *	Method:
     *	    HXSiteEnumerator::GetNextSite
     *	Purpose:
     *	    Retrieves both the next site in the enumeration (as specified by
     *      nextSite) and initializes sitePosition with the position of the 
     *      following site (if any).  
     *      Returns HXR_OK if the first site is available, HXR_FAIL if not.
     */
    STDMETHOD(GetNextSite)  (THIS_
                             REF(IHXSite*) pNextSite,
                             REF(SitePosition) /* IN/OUT */ nextPosition) PURE;
};


/****************************************************************************
 * 
 *  Interface:
 *	IHXSiteFullScreen
 *
 *  Purpose:
 *
 *	This is the interface for turning on/off the full screen mode
 *
 *  IID_IHXSiteFullScreen:
 *
 *	{00000D0B-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteFullScreen, 0x00000D0B, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSiteFullScreen

DECLARE_INTERFACE_(IHXSiteFullScreen, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXSiteFullScreen methods
     */
    STDMETHOD(EnterFullScreen)	(THIS) PURE;

    STDMETHOD(ExitFullScreen)	(THIS) PURE;

    STDMETHOD(TestFullScreen)	(THIS_
				void* hTestBitmap,const char* pszStatusText) PURE;

    STDMETHOD_(BOOL, IsFullScreen) (THIS) PURE;
};


// $Private:
/****************************************************************************
 * 
 *  Interface:
 *	IHXLayoutSiteGroupManager
 *
 *  Purpose:
 *
 *	Allow layout site groups to be added and removed
 *
 *  IID_IHXLayoutSiteGroupManager:
 *
 *	{00000D0C-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXLayoutSiteGroupManager, 0x00000D0C, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXLayoutSiteGroupManager

DECLARE_INTERFACE_(IHXLayoutSiteGroupManager, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXLayoutSiteGroupManager methods
     */
    STDMETHOD(AddLayoutSiteGroup)	(THIS_
					IUnknown* pLSG) PURE;

    STDMETHOD(RemoveLayoutSiteGroup)	(THIS_
					IUnknown* pLSG) PURE;
};
// $EndPrivate.


/****************************************************************************
 * 
 *  Interface:
 *	IHXEventHookMgr
 *
 *  Purpose:
 *
 *	Add ability to hook events from a named region
 *
 *  IID_IHXEventHookMgr:
 *
 *	{00000D0D-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXEventHookMgr, 0x00000D0D, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXEventHookMgr

DECLARE_INTERFACE_(IHXEventHookMgr, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXEventHookMgr methods
     */
    STDMETHOD(AddHook)		(THIS_
				IHXEventHook* pHook,
				const char* pRegionName,
				UINT16 uLayer) PURE;

    STDMETHOD(RemoveHook)	(THIS_
    				IHXEventHook* pHook,
				const char* pRegionName,
				UINT16 uLayer) PURE;
};

/****************************************************************************
 * 
 *  Interface:
 *	IHXEventHook
 *
 *  Purpose:
 *
 *	Object that gets hooked events sent by IHXEventHookMgr
 *
 *  IID_IHXEventHookMgr:
 *
 *	{00000D0E-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXEventHook, 0x00000D0E, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXEventHook

DECLARE_INTERFACE_(IHXEventHook, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXEventHook methods
     */
    STDMETHOD(SiteAdded)	(THIS_
				IHXSite* pSite) PURE;
    STDMETHOD(HandleEvent)	(THIS_
    				IHXSite* pSite,
				HXxEvent* pEvent) PURE;
    STDMETHOD(SiteRemoved)	(THIS_
    				IHXSite* pSite) PURE;
};


/****************************************************************************
 * 
 *  Interface:
 *	IHXStatusMessage
 *
 *  Purpose:
 *
 *	This is the interface for setting the status text. 
 *
 *  IID_IHXStatusMessage:
 *
 *	{00000D10-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXStatusMessage, 0x00000D10, 0x901, 
            0x11d1, 0x8b, 0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXStatusMessage

DECLARE_INTERFACE_(IHXStatusMessage, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    /*
     * IHXStatusMessage methods
     */

    STDMETHOD(SetStatus)		(THIS_ const char* pText) PURE;
};

// $Private:
/****************************************************************************
 * 
 *  Interface:
 *
 *	IHXSiteTransition
 *
 *  Purpose:
 *
 *	Interface for transitioning between IHXSites.
 *
 *  IID_IHXSiteTransition:
 *
 *	{00000D01-0901-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSiteTransition, 0x00000D13, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#define CLSID_IHXSiteTransition IID_IHXSiteTransition

#undef  INTERFACE
#define INTERFACE   IHXSiteTransition

DECLARE_INTERFACE_(IHXSiteTransition, IUnknown)
{
    /*
     * IUnknown methods
     */
    STDMETHOD(QueryInterface)	(THIS_
				REFIID riid,
				void** ppvObj) PURE;

    STDMETHOD_(ULONG32,AddRef)	(THIS) PURE;

    STDMETHOD_(ULONG32,Release)	(THIS) PURE;

    STDMETHOD(Initialize)	(THIS_
				IHXValues* pParams) PURE;

    STDMETHOD(SetPercentage)	(THIS_
				UINT32 nThousandnthsComplete) PURE;

};


/****************************************************************************
 *
 *  Interface:
 *
 *  IHXRegion
 *
 *  Purpose:
 *
 *  Iterface for managing HXRegions.
 *
 *  IHXRegion:
 *
 *  {00002200-0903-11d1-8B06-00A024406D59}
 *
 */


DEFINE_GUID(IID_IHXRegion, 0x00000D14, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#define CLSID_IHXRegion IID_IHXRegion

#undef  INTERFACE
#define INTERFACE   IHXRegion

DECLARE_INTERFACE_(IHXRegion, IUnknown)
{
    /************************************************************************
     *	Method:
     *	    IHXRegion::SetRect
     *	Purpose:
     *	    This function creates a rectangular region.
     *
     */
    STDMETHOD(SetRect)      (THIS_ HXxRect*    pRect) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::SetRect
     *	Purpose:
     *	    This function creates a rectangular region.
     *
     */
    STDMETHOD(SetRect)      (THIS_ int x, int y, int x1, int y1) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::SetPoly
     *	Purpose:
     *	    This function creates a region defined by an arbitary polygon.
     *
     */

    STDMETHOD(SetPoly)      (THIS_ HXxPoint**  pRect, BOOL bUseWinding) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::IsEqual
     *	Purpose:
     *	    This function determines if two regions are equal.
     *
     */

    STDMETHOD_(BOOL,IsEqual)      (THIS_ IHXRegion* pRegion) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetExtents
     *	Purpose:
     *	    This function allows the user to determine the extents of the region
     *
     */

    STDMETHOD(GetExtents)      (THIS_ REF(HXxRect) rExtents) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::Offset
     *	Purpose:
     *	    This function offsets the region by the spectified origin
     *
     */

    STDMETHOD(Offset)      (THIS_ HXxPoint* pOrigin) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::PointHitTest
     *	Purpose:
     *	    This function returns if TRUE if the specified point is in the region
     *
     */

    STDMETHOD_(BOOL,PointHitTest)      (THIS_ HXxPoint* pPoint) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::RectHitTest
     *	Purpose:
     *	This function returns 
     *	    HX_CONTAINED	if the rect is fully contained within the region
     *	    HX_PART		if part of the rect is within the region
     *	    HX_OUT		if no part of the rect is within the region
     *
     */

    STDMETHOD_(INT32,RectHitTest)      (THIS_ HXxRect* pRect) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetNumRects
     *	Purpose:
     *	    This function gets the number of rects which describe the 
     *	    region
     *
     */

    STDMETHOD_(UINT32, GetNumRects)      (THIS) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRectAtIndex
     *	Purpose:
     *	    This function gets the RECT at index nRectIndex
     *
     */

    STDMETHOD(GetRectAtIndex)      (THIS_ UINT32 nRectIndex, REF(HXxRect) rRect) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::UnionRegion
     *	Purpose:
     *		Union Region -- this operator like all of the operators will create an IHXRegion 
     *		if pDest is NULL.
     *
     */

    STDMETHOD(UnionRegion)      (THIS_ REF(IHXRegion*) pDest, IHXRegion* pSrc1) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRectAtIndex
     *	Purpose:
     *	    Copy Region
     *
     */

    STDMETHOD(CopyRegion)      (THIS_ REF(IHXRegion*) pDest) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRectAtIndex
     *	Purpose:
     *	    Diff Region
     *
     */

    STDMETHOD(DiffRegion)      (THIS_ REF(IHXRegion*) pDest, IHXRegion* pSrc1) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRectAtIndex
     *	Purpose:
     *	    And Region
     *
     */

    STDMETHOD(AndRegion)      (THIS_ REF(IHXRegion*) pDest, IHXRegion* pSrc1) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRectAtIndex
     *	Purpose:
     *	    XOR Region
     *
     */

    STDMETHOD(XORRegion)      (THIS_ REF(IHXRegion*) pDest, IHXRegion* pSrc1) PURE;

    /************************************************************************
     *	Method:
     *	    IHXRegion::GetRegion
     *	Purpose:
     *	    Bad hack for the moment to obtain the REGION pointer of an HXRegion.
     *	    Will have to remove this later.
     *
     */

    STDMETHOD_(void*, GetRegion)      (THIS) PURE;

};

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXColorConverterManager
 *
 *  Purpose:
 *
 *  Interface for obtaining IHXColorConverters
 *
 *  IHXColorConverterManager:
 *
 *  {00000D15-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXColorConverterManager, 0x00000D15, 0x901, 0x11d1, 0x8b, 0x6, 0x0, 
			0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXColorConverterManager

DECLARE_INTERFACE_(IHXColorConverterManager, IUnknown)
{
    /*
     * Get ColorConverter is called to obtain a color converter to convert 
     * from a particular bitmap to another bitmap.
     */
    STDMETHOD(GetColorConverter)      (THIS_
                HXBitmapInfoHeader*    /*IN*/  pBitmapInfoIn,
                HXBitmapInfoHeader*    /*IN*/  pBitmapInfoOut,
		REF(IHXColorConverter*) /*OUT*/ pConverter) PURE;

};

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXColorConverter
 *
 *  Purpose:
 *
 *  Interface for converting between two bitmaps of different color formats.
 *
 *  IHXColorConverterManager:
 *
 *  {00000D16-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXColorConverter, 0x00000D16, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXColorConverter

DECLARE_INTERFACE_(IHXColorConverter, IUnknown)
{
    /*
     * ColorConvert converts the pBitsIn from one color format to 
     * the format of pBitsOut
     */
    STDMETHOD(ColorConvert)      (THIS_
                UCHAR*	    pBitsIn,
                UCHAR*	    pBitsOut,
		HXxRect*    pRectIn,
		HXxRect*    pRectOut
                ) PURE;

};

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXOverlayResponse
 *
 *  Purpose:
 *
 *  Interface for reporting/computing the current statistics relevant to 
 *  Video Presentations.
 *
 *  IHXOverlayResponse:
 *
 *  {00000D22-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXOverlayResponse, 0x00000D22, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXOverlayResponse

DECLARE_INTERFACE_(IHXOverlayResponse, IUnknown)
{
    STDMETHOD(OverlayGranted)      (THIS ) PURE;
    STDMETHOD(OverlayRevoked)      (THIS ) PURE;
};


/****************************************************************************
 *
 *  Interface:
 *
 *  IHXOverlayManager
 *
 *  Purpose:
 *
 *  Interface for reporting/computing the current statistics relevant to 
 *  Video Presentations.
 *
 *  IHXOverlayManager:
 *
 *  {00000D21-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXOverlayManager, 0x00000D21, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXOverlayManager

DECLARE_INTERFACE_(IHXOverlayManager, IUnknown)
{
    STDMETHOD(HasOverlay)      (THIS_
                    IHXOverlayResponse* pResp
                    ) PURE;
    
    STDMETHOD(AddStats)      (THIS_
                    IHXOverlayResponse* pResp,
                    UINT32    ulNumPixels
                    ) PURE;

    
    STDMETHOD(RemoveOverlayRequest)(THIS_ IHXOverlayResponse* pResp ) PURE;
};


// $EndPrivate.

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXKeyBoardFocus
 *
 *  Purpose:
 *
 *  Interface for setting/getting the keyboard focus for a particular siteuser
 *
 *  IHXKeyBoardFocus:
 *
 *  {00000D23-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXKeyBoardFocus, 0x00000D23, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXKeyBoardFocus

DECLARE_INTERFACE_(IHXKeyBoardFocus, IUnknown)
{
    STDMETHOD(SetKeyboardFocus)(THIS_ IHXSiteUser* pSiteUser ) PURE;
    STDMETHOD(GetKeyboardFocus)(THIS_ IHXSiteUser* &pSiteUser ) PURE;

};

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXDrawFocus
 *
 *  Purpose:
 *
 *  Interface for displaying the site that has the keyboard focus
 *
 *  IHXDrawFocus:
 *
 *  {00000D24-0902-11d1-8B06-00A024406D59}
 *
 */

DEFINE_GUID(IID_IHXDrawFocus, 0x00000D24, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXDrawFocus

DECLARE_INTERFACE_(IHXDrawFocus, IUnknown)
{
    /************************************************************************
     *  Method:
     *          IHXDrawFocus::SetStyle
     *  Purpose:
     *          Ask the site to set the focus style.
     *
     *  Syles:
     *          ULONG32 Properties:
     *
     *          LINE_STYLE = HX_SOLID_LINE, HX_DASHED_LINE, HX_DOTTED_LINE,
     *                       HX_CUSTOM_LINE
     *          LINE_WIDTH = Width of the line in pixels
     *          RED = 0-255 color of the primary pixel
     *          GREEN = 0-255 color of the primary pixel
     *          BLUE = 0-255 color of the primary pixel
     *          RED_OFF = 0-255 color of the secondary pixel
     *          GREEN_OFF = 0-255 color of the secondary pixel
     *          BLUE_OFF = 0-255 color of the secondary pixel
     *          CUSTOM_LINE_ENTRIES number of ULONG32s in CUSTOM_LINE_PATTERN
     *
     *          IHXBuffer Properties:
     *
     *          CUSTOM_LINE_PATTERN list of ULONG32s describing the number
     *           of primary and secondary pixels (eq 4241 = "----..----." where
     *           - is a primary pixel and . is a secondary pixel) and
     *           CUSTOM_LINE_ENTRIES equals 4.  Secondary pixels are not
     *           drawn if RED_OFF, GREEN_OFF, and BLUE_OFF are not set.
     */
    STDMETHOD(SetStyle) (THIS_ IHXValues* pProperties) PURE;

    /************************************************************************
     *  Method:
     *          IHXDrawFocus::ClearFocus
     *  Purpose:
     *          Ask the site to clear the current focus drawing.
     */
    STDMETHOD(ClearFocus)(THIS) PURE;

    /************************************************************************
     *  Method:
     *          IHXDrawFocus::SetFocusPolygon
     *  Purpose:
     *          Ask the site to draw polygon around focus
     */
    STDMETHOD(SetFocusPolygon)(THIS_  HXxPoint* pPoints, ULONG32 numPoints) PURE;

    /************************************************************************
     *  Method:
     *          IHXDrawFocus::SetFocusRect
     *  Purpose:
     *          Ask the site to draw rectangle around focus
     */
    STDMETHOD(SetFocusRect) (THIS_ HXxRect* pRect) PURE;

    /************************************************************************
     *  Method:
     *          IHXDrawFocus::SetFocusEllipse
     *  Purpose:
     *          Ask the site to draw ellipse around focus
     */
    STDMETHOD(SetFocusEllipse) (THIS_ HXxRect* pRect) PURE;
};

// $Private:

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXSubRectSite
 *
 *  Purpose:
 *
 *  Interface to determine if a site support sub rect BLT'ing via
 *  the HX_SURFACE_UPDATE2 message. If the site does support sub
 *  rect BLT'ing you can tell the site to send you the
 *  HX_SURFACE_UPDATE2 messages via this interface.
 *
 *  IHXSubRectSite:
 *
 *  {00000D25-0902-11d1-8B06-00A024406D59}
 *
 */
DEFINE_GUID(IID_IHXSubRectSite, 0x00000D25, 0x903, 0x11d1, 0x8b,
    0x6, 0x0, 0xa0, 0x24, 0x40, 0x6d, 0x59);

#undef  INTERFACE
#define INTERFACE   IHXSubRectSite

DECLARE_INTERFACE_(IHXSubRectSite, IHXSite)
{
    /*
     * Tells the site to send/not-send HX_SURFACE_UPDATE2 messages.
     * These messages contain actuall dirty rects so that the renderer
     * does not need to BLT the entire frame.
     */
    STDMETHOD(SendSubRectMessages) (THIS_ BOOL bRet ) PURE;
    /*
     * New damage region call that takes the cross platfrom region
     * defined in hxwintyp.h and invalidates the rects in it
     */
    STDMETHOD(SubRectDamageRegion) (THIS_ HXxBoxRegion* pRegion ) PURE;
    /*
     * Method to get the new video surface that comes with the sub
     * rect BLT'ing support.
     */
    STDMETHOD(GetSubRectVideoSurface) (THIS_ 
                                       REF(IHXSubRectVideoSurface*) pSurface
                                       ) PURE;
};

// $EndPrivate.

/****************************************************************************
 *
 *  Interface:
 *
 *  IHXFocusNavigation
 *
 *  Purpose:
 *
 *  Interface for navigating between and within keyboard focus sites
 *
 *  IHXFocusNavigation:
 *
 *  {B42B7677-F605-438e-9002-E2AAB7784B43}
 *
 */

DEFINE_GUID(IID_IHXFocusNavigation, 0xb42b7677, 0xf605, 0x438e, 0x90,
            0x2, 0xe2, 0xaa, 0xb7, 0x78, 0x4b, 0x43);

#undef  INTERFACE
#define INTERFACE   IHXFocusNavigation

DECLARE_INTERFACE_(IHXFocusNavigation, IUnknown)
{
    /************************************************************************
     *  Method:
     *          IHXFocusNavigation::SetFocus
     *  Purpose:
     *          Ask the renderer to set the focus to the given item.
     */
    STDMETHOD(SetFocus) (THIS_ HXFocusContext eFocus) PURE;

    /************************************************************************
     *  Method:
     *          IHXFocusNavigation::ClearFocus
     *  Purpose:
     *          Ask the renderer to clear the current focus.
     */
    STDMETHOD(ClearFocus) (THIS) PURE;

    /************************************************************************
     *  Method:
     *          IHXFocusNavigation::ActivateFocus
     *  Purpose:
     *          Ask the renderer to activate the focused link. Do nothing if 
     *   there is no focus point.
     */
    STDMETHOD(ActivateFocus) (THIS) PURE;

    /************************************************************************
     *  Method:
     *          IHXFocusNavigation::GetFocusState
     *  Purpose:
     *          Obtain the current focus state
     */
    STDMETHOD_(HXFocusState,GetFocusState) (THIS) PURE;
};

#endif /* _HXWIN_H_ */
