// cDDPicture.h: interface for the cDDPicture class.
//
//////////////////////////////////////////////////////////////////////
/*
	한장의 그림을 가진다.
	그림은 다이렉트 드로우 표면의 일부분이 될 수 있다.
*/
#ifndef cPicture_H 
#define cPicture_H

#include <ddraw.h>
#include "cMedium.h"
#include "cRecorder.h"

class cDisplay;

class cPicture : public cRecorder{
protected:
	enum eSurfaceType{
		ST_NONE = 0, // 표면이 준비되어 있지 않다.
		ST_MEMORY_SURFACE, // 오프스크린 표면
		ST_PICTURE_SURFACE, // 그림이 바인딩 된 표면
		ST_PIECE_SURFACE // 표면의 조각
	};

// 정적 디스플레이
private:
	static LPDIRECTDRAW pDD;
protected:
	static cDisplay *pDisplay;

public:
	static void SetDisplay(cDisplay *_pDisplay);
	static cDisplay *GetDisplay(){ return pDisplay; }

// 표면 정보
protected:
	LPDIRECTDRAWSURFACE pDDS; // 그림을 실제로 저장하는 표면
	eSurfaceType SurfaceType; // 그림의 종류

	RECT Rect; // 표면의 사각 영역이 그림이 된다.
	cMedium *pMedium; // 그림 매체


// 표면 복구
	BOOL Restore();

public:
	cPicture();
	virtual ~cPicture();

	// 그림 생성 인터페이스
	BOOL Create(int BackBufferCount = 0);
	BOOL Create(cPicture &Src);
	BOOL Create(DWORD Width, DWORD Height);
	BOOL CreateReference(cPicture &Src, int Left, int Top, int Right, int Bottom);
	void Destroy();

	// 그림 파일로 부터 표면을 생성해 낸다.
	BOOL Create(cMedium *_pMedium);

	// 그림 속성 접근
	BOOL GetSize(LPSIZE psz);
	int GetWidth();
	int GetHeight();
	LPDIRECTDRAWSURFACE GetBackPic(int Index = 0);
	cMedium *GetMedium(){ return pMedium; }
	void DeleteMedium(){ if(pMedium) delete pMedium; pMedium = NULL; }
	void SetArea(LPDIRECTDRAWSURFACE _pDDS, RECT *pRect);
	BOOL SetClipWindow(HWND hWnd);
	BOOL SetColorKey(DWORD dwFlags, DDCOLORKEY *pddck){ return pDDS->SetColorKey(dwFlags, pddck) == DD_OK; }

	// 그리기
	BOOL Blt(LPRECT lpDestRect, cPicture *pSrc, LPRECT lpSrcRect, DWORD dwFlags, LPDDBLTFX lpDDBltFx);
	BOOL BltFast(DWORD x, DWORD y, cPicture *pSrc, LPRECT lpSrcRect, DWORD dwFlags);
	BOOL GetDC(HDC *phdc){ return pDDS->GetDC(phdc) == DD_OK; }
	BOOL ReleaseDC(HDC hdc){ return pDDS->ReleaseDC(hdc) == DD_OK; }

	// 그림을 바인딩한다.
	void operator =(LPDIRECTDRAWSURFACE _pDDS);
	// 다이렉트 드로우 표면을 제공
	operator LPDIRECTDRAWSURFACE(){ return pDDS; }
	LPDIRECTDRAWSURFACE GetDDS(){ return pDDS; }
};

#endif 
