//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//
//  Copyright (C) Microsoft Corporation, 1998 - 1998
//
//  File:       ddpaletteobj.cpp
//
//--------------------------------------------------------------------------

// ddPaletteObj.cpp : Implementation of CDirectApp and DLL registration.

#include "stdafx.h"
#include "Direct.h"
#include "dms.h"
#include "ddPaletteObj.h"

CONSTRUCTOR(_dxj_DirectDrawPalette, {m_dd=NULL;});
DESTRUCTOR(_dxj_DirectDrawPalette, {m_dd=NULL;});
GETSET_OBJECT(_dxj_DirectDrawPalette);

PASS_THROUGH_CAST_1_R(_dxj_DirectDrawPalette, getCaps, GetCaps, long*,(DWORD *))

/////////////////////////////////////////////////////////////////////////////

STDMETHODIMP C_dxj_DirectDrawPaletteObject::getEntries( //long flags, 
								long base, long numEntries, SAFEARRAY **ppEntries){
	HRESULT hr;
	if (!ISSAFEARRAY1D(ppEntries,(DWORD)numEntries)) return E_INVALIDARG;
	LPPALETTEENTRY pe=(LPPALETTEENTRY)((SAFEARRAY*)*ppEntries)->pvData;
	hr=m__dxj_DirectDrawPalette->GetEntries((DWORD) 0,(DWORD) base, (DWORD) numEntries, pe);
	return hr;

}
STDMETHODIMP C_dxj_DirectDrawPaletteObject::setEntries(// long flags,
		long base, long numEntries, SAFEARRAY **ppEntries){
	HRESULT hr;
	if (!ISSAFEARRAY1D(ppEntries,(DWORD)numEntries)) return E_INVALIDARG;
	LPPALETTEENTRY pe=(LPPALETTEENTRY)((SAFEARRAY*)*ppEntries)->pvData;
	hr=m__dxj_DirectDrawPalette->SetEntries((DWORD) 0,(DWORD) base, (DWORD) numEntries, pe);
	return hr;
}

/////////////////////////////////////////////////////////////////////////////
//

#if 0
STDMETHODIMP C_dxj_DirectDrawPaletteObject::initialize( I_dxj_DirectDraw2 *val)
{
	DO_GETOBJECT_NOTNULL( LPDIRECTDRAW2, lpdd, val)
	return m__dxj_DirectDrawPalette->Initialize((LPDIRECTDRAW)lpdd, 0, NULL);
}

/////////////////////////////////////////////////////////////////////////////
//

STDMETHODIMP C_dxj_DirectDrawPaletteObject::internalAttachDD(I_dxj_DirectDraw2 *dd)
{
	m_dd = dd;
	return S_OK;
}

#endif

/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP C_dxj_DirectDrawPaletteObject::setEntriesHalftone(long start, long count)
{
	PALETTEENTRY pe[256];

	HDC hdc = GetDC(NULL);
	if (!hdc) return E_OUTOFMEMORY;

	HPALETTE hpal = CreateHalftonePalette(hdc);
	if (!hpal) return E_OUTOFMEMORY;
	

	GetPaletteEntries(hpal, 0, 256, pe );  

	for ( long i = start; i < start+count; i++ )
		pe[i].peFlags  |= PC_NOCOLLAPSE | D3DPAL_READONLY;  

	m__dxj_DirectDrawPalette->SetEntries(0,(DWORD)start,(DWORD)count,pe);

	ReleaseDC(NULL,hdc);
	return S_OK;
}


STDMETHODIMP C_dxj_DirectDrawPaletteObject::setEntriesSystemPalette(long start, long count)
{
	PALETTEENTRY pe[256];
	UINT uiRet;
	HRESULT hr;
	HDC hdc = GetDC(NULL);
	if (!hdc) return E_OUTOFMEMORY;

	uiRet=GetSystemPaletteEntries(hdc,start,count,pe);
        if (uiRet<=0) return E_FAIL; 


	for ( long i = start; i < start+count; i++ )
		pe[i].peFlags  |= /*PC_NOCOLLAPSE |*/ D3DPAL_READONLY;  

	hr=m__dxj_DirectDrawPalette->SetEntries(0,(DWORD)start,(DWORD)count,pe);

	ReleaseDC(NULL,hdc);
	return S_OK;
}