#include <assert.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xvlib.h>
#include <X11/extensions/XvMC.h>

Status XvMCCreateSubpicture
(
	Display *display,
	XvMCContext *context,
	XvMCSubpicture *subpicture,
	unsigned short width,
	unsigned short height,
	int xvimage_id
)
{
	assert(display);
	
	if (!context)
		return XvMCBadContext;
	
	assert(subpicture);
	
	if (width > 2048 || height > 2048)
		return BadValue;
	
	if (xvimage_id != 123)
		return BadMatch;
	
	subpicture->subpicture_id = XAllocID(display);
	subpicture->context_id = context->context_id;
	subpicture->xvimage_id = xvimage_id;
	subpicture->width = width;
	subpicture->height = height;
	subpicture->num_palette_entries = 0;
	subpicture->entry_bytes = 0;
	subpicture->component_order[0] = 0;
	subpicture->component_order[1] = 0;
	subpicture->component_order[2] = 0;
	subpicture->component_order[3] = 0;
	/* TODO: subpicture->privData = ;*/
	
	return Success;
}

Status XvMCClearSubpicture
(
	Display *display,
	XvMCSubpicture *subpicture,
	short x,
	short y,
	unsigned short width,
	unsigned short height,
	unsigned int color
)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	/* TODO: Assert clear rect is within bounds? Or clip? */
	
	return Success;
}

Status XvMCCompositeSubpicture
(
	Display *display,
	XvMCSubpicture *subpicture,
	XvImage *image,
	short srcx,
	short srcy,
	unsigned short width,
	unsigned short height,
	short dstx,
	short dsty
)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	assert(image);
	
	if (subpicture->xvimage_id != image->id)
		return BadMatch;
	
	/* TODO: Assert rects are within bounds? Or clip? */
	
	return Success;
}

Status XvMCDestroySubpicture(Display *display, XvMCSubpicture *subpicture)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	return BadImplementation;
}

Status XvMCSetSubpicturePalette(Display *display, XvMCSubpicture *subpicture, unsigned char *palette)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	assert(palette);
	
	/* We don't support paletted subpictures */
	return BadMatch;
}

Status XvMCBlendSubpicture
(
	Display *display,
	XvMCSurface *target_surface,
	XvMCSubpicture *subpicture,
	short subx,
	short suby,
	unsigned short subw,
	unsigned short subh,
	short surfx,
	short surfy,
	unsigned short surfw,
	unsigned short surfh
)
{
	assert(display);
	
	if (!target_surface)
		return XvMCBadSurface;
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	if (target_surface->context_id != subpicture->context_id)
		return BadMatch;
	
	/* TODO: Assert rects are within bounds? Or clip? */
	return Success;
}

Status XvMCBlendSubpicture2
(
	Display *display,
	XvMCSurface *source_surface,
	XvMCSurface *target_surface,
	XvMCSubpicture *subpicture,
	short subx,
	short suby,
	unsigned short subw,
	unsigned short subh,
	short surfx,
	short surfy,
	unsigned short surfw,
	unsigned short surfh
)
{
	assert(display);
	
	if (!source_surface || !target_surface)
		return XvMCBadSurface;
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	if (source_surface->context_id != subpicture->context_id)
		return BadMatch;
		
	if (source_surface->context_id != subpicture->context_id)
		return BadMatch;
	
	/* TODO: Assert rects are within bounds? Or clip? */
	return Success;
}

Status XvMCSyncSubpicture(Display *display, XvMCSubpicture *subpicture)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	return Success;
}

Status XvMCFlushSubpicture(Display *display, XvMCSubpicture *subpicture)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	return Success;
}

Status XvMCGetSubpictureStatus(Display *display, XvMCSubpicture *subpicture, int *status)
{
	assert(display);
	
	if (!subpicture)
		return XvMCBadSubpicture;
	
	assert(status);
	
	/* TODO */
	*status = 0;
	
	return Success;
}