/*
 * Copyright 2004 Christian Costa
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

import "unknwn.idl";
import "mmstream.idl";

cpp_quote("#ifndef __DDRAW_INCLUDED__")
typedef void * LPDDSURFACEDESC;
typedef struct tDDSURFACEDESC DDSURFACEDESC;
interface IDirectDraw;
interface IDirectDrawSurface;
interface IDirectDrawPalette;
cpp_quote("#endif")
cpp_quote("#include <ddraw.h>")

enum {
	DDSFF_PROGRESSIVERENDER = 0x00000001
};

interface IDirectDrawMediaStream;
interface IDirectDrawStreamSample;

[
object,
local,
uuid(F4104FCE-9A70-11d0-8FDE-00C04FD9189D),
pointer_default(unique)
]
interface IDirectDrawMediaStream : IMediaStream
{
	HRESULT GetFormat(
		[out] DDSURFACEDESC *pDDSDCurrent,
		[out] IDirectDrawPalette **ppDirectDrawPalette,
		[out] DDSURFACEDESC *pDDSDDesired,
		[out] DWORD *pdwFlags);

	HRESULT SetFormat(
		[in] const DDSURFACEDESC *pDDSurfaceDesc,
		[in] IDirectDrawPalette *pDirectDrawPalette);

	HRESULT GetDirectDraw(
		[out] IDirectDraw **ppDirectDraw);

	HRESULT SetDirectDraw(
		[in] IDirectDraw *pDirectDraw);

	HRESULT CreateSample(
		[in] IDirectDrawSurface *pSurface,
		[in] const RECT *pRect,
		[in] DWORD dwFlags,
		[out] IDirectDrawStreamSample **ppSample);

	HRESULT GetTimePerFrame(
		[out] STREAM_TIME *pFrameTime);
}


[
object,
local,
uuid(F4104FCF-9A70-11d0-8FDE-00C04FD9189D),
pointer_default(unique)
]
interface IDirectDrawStreamSample : IStreamSample
{
	HRESULT GetSurface(
		[out] IDirectDrawSurface ** ppDirectDrawSurface,
		[out] RECT * pRect);

	HRESULT SetRect(
		[in] const RECT * pRect);

}
