#ifndef _WINDOWS_H_
#define _WINDOWS_H_

#include <dos/dos.h>

//#include <intuition/IntuitionBase.h>
#include <intuition/intuition.h>
#include <intuition/icclass.h>
#include <intuition/imageclass.h>

#include <datatypes/datatypesclass.h>
#include <datatypes/pictureclass.h>

#include <libraries/amigaguide.h>
#include <libraries/gadtools.h>

#include <graphics/gfxmacros.h>

#include <workbench/icon.h>

#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/intuition_protos.h>
#include <clib/asl_protos.h>
#include <clib/graphics_protos.h>
#include <clib/gadtools_protos.h>
#include <clib/layers_protos.h>
#include <clib/amigaguide_protos.h>
#include <clib/datatypes_protos.h>
#include <clib/utility_protos.h>
#include <clib/alib_protos.h>
#include <clib/icon_protos.h>

#include <proto/Warp3D.h>

#include <cybergraphx/cybergraphics.h>
#include <clib/cybergraphics_protos.h>
#ifndef __PPC__
#include <pragma/cybergraphics_lib.h>
#endif

typedef int DDCAPS;
typedef float FLOAT;
typedef unsigned int DWORD;
typedef long LONG;
typedef void *LPVOID;
typedef short SHORT;
typedef int HRESULT;
typedef char TCHAR;
typedef char D3DDEVICEDESC7;
typedef struct BitMap *HBITMAP;
typedef struct RastPort DC;
typedef DC *HDC;
typedef char HBRUSH;
typedef char HFONT;
typedef Screen * HINSTANCE;
typedef char LPDIRECT3D7;
typedef char LPDIRECTDRAWSURFACE7;
typedef char LPDDSURFACEDESC;
typedef short HANDLE;
typedef char GUID;
typedef Window * HWND;
typedef char LRESULT;
typedef unsigned int UINT;
typedef short WPARAM;
typedef long LPARAM;
typedef char *LPSTR;
typedef int MSG;
typedef char *HKEY;
typedef int HPEN;
typedef int HMENU;
typedef Point POINT;
typedef char *LPCTSTR;
typedef void *DLGPROC;
typedef Object GDIOBJ;
typedef GDIOBJ *HGDIOBJ;

#define inline
#define FAILED(a) (a)

#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
#define S_OK 0
#define E_FAIL 1
#define CALLBACK
#define TRUE 1
#define FALSE 0
#define APIENTRY
#define WINAPI
#define DDPF_ZBUFFER 0
#include <string.h>
#define ZeroMemory(a,b) memset(a,0, b)
#define _T(a) a
#define HKEY_LOCAL_MACHINE "sk.ini"
#define KEY_READ 1
LONG RegOpenKeyEx(char *s, char *, int, int, char **);
LONG RegQueryValueEx(HKEY, char *, int, DWORD *, char *, DWORD *);
VOID RegCloseKey(HKEY);
#define lstrcat strcat
#define ERROR_SUCCESS 0
#define FLT_MAX 1.0e10f
#define E_INVALIDARG 1
#define cosf cos
#define sinf sin
#define acosf acos
#define sqrtf sqrt
#define wsprintf sprintf
#define OutputDebugString printf
#define DDENUMRET_CANCEL 1
#define DDENUMRET_OK 0
#define SUCCEEDED(a) (a)

#define WM_CREATE	        1
#define WM_MOVE	            2
#define WM_PAINT	        3
#define WM_SIZE	            4
#define WM_CHAR	            5
#define WM_GETMINMAXINFO	6
#define WM_CLOSE	        7
#define WM_DESTROY	        8
#define WM_LBUTTONDOWN	    9
#define WM_MOUSEMOVE	    10
#define WM_LBUTTONDBLCLK	11
#define WM_COMMAND	        12
#define WM_LBUTTONUP        13
#define MK_BUTTON	        14
#define MK_SHIFT            15
#define MK_CONTROL          16
#define MK_RBUTTON          17
#define MK_MBUTTON          18
#define WM_DISPLAYCHANGE    19
#define WM_SETTEXT          20
#define WM_NCLBUTTONDBLCLK  21
#define WM_USER             1024

#define SW_HIDE 0
#define SW_SHOWMAXIMIZED    1
#define SW_SHOWNA   2
#define SW_MAXIMIZE 3

/*
 * Button Control Styles
 */
#define BS_PUSHBUTTON       0x00000000L
#define BS_DEFPUSHBUTTON    0x00000001L
#define BS_CHECKBOX         0x00000002L
#define BS_AUTOCHECKBOX     0x00000003L
#define BS_RADIOBUTTON      0x00000004L
#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L
#define BS_USERBUTTON       0x00000008L
#define BS_AUTORADIOBUTTON  0x00000009L
#define BS_OWNERDRAW        0x0000000BL
#define BS_LEFTTEXT         0x00000020L
#define BS_TEXT             0x00000000L
#define BS_ICON             0x00000040L
#define BS_BITMAP           0x00000080L
#define BS_LEFT             0x00000100L
#define BS_RIGHT            0x00000200L
#define BS_CENTER           0x00000300L
#define BS_TOP              0x00000400L
#define BS_BOTTOM           0x00000800L
#define BS_VCENTER          0x00000C00L
#define BS_PUSHLIKE         0x00001000L
#define BS_MULTILINE        0x00002000L
#define BS_NOTIFY           0x00004000L
#define BS_FLAT             0x00008000L
#define BS_RIGHTBUTTON      BS_LEFTTEXT

#define MAKEINTRESOURCE(a) ((LPCTSTR) a)
#define GWL_USERDATA	2048
#define FW_BOLD 0
#define ANSI_CHARSET 0
#define OUT_DEFAULT_PRECIS 0
#define CLIP_DEFAULT_PRECIS 0
#define DEFAULT_QUALITY 0
#define VARIABLE_PITCH 0
#define TRANSPARENT 0
#define SRCCOPY 0
#define PS_SOLID 0
#define LOWORD(a) (a & 0xFFFF)
#define HIWORD(a) (a >> 16)
#define PAINTSTRUCT char
#define SIZE_MAXHIDE 0
#define SIZE_MINIMIZED 1
#define COLORREF D3DCOLOR
#define HORZRES 1
#define VERTRES 2
#define MF_BYCOMMAND 1
#define MF_CHECKED 2
#define MF_UNCHECKED 3
#define D3DX_DEFAULT 0
#define DDSD_CAPS 1
#define DDSCAPS_PRIMARYSURFACE 1
#define DDSCL_NORMAL 1
#define DDSD_WIDTH 1
#define DDSD_HEIGHT 2
#define DDSCAPS_OFFSCREENPLAIN 3
#define DDSCAPS_3DDEVICE 4
#define DDSD_PIXELFORMAT 5
#define DDSCAPS_ZBUFFER 6
#define DDSCAPS_VIDEOMEMORY 7
#define DDSCAPS_SYSTEMMEMORY 8
#define DS_SETFONT 0x40L

#define DeleteObject    ReleasePen

typedef struct
	{
		LONG left;
		LONG top;
        LONG right;
		LONG bottom;
	} RECT;  // Structure équivalente à Rect32 Amiga

typedef struct
	{
		int x;
		int y;
		POINT ptMinTrackSize;
	} MINMAXINFO;

typedef struct
	{
		DWORD dwCaps;
	} DDSURFACECAPS;

typedef struct
	{
		DWORD dwSize;
	} PIXELFORMAT;
	
typedef struct
	{
		DWORD dwSize;
		DWORD dwFlags;
		DDSURFACECAPS ddsCaps;
		PIXELFORMAT ddpfPixelFormat;
	} DDSURFACEDESC2;
		
typedef struct
	{
		DWORD dwFlags;
        DWORD dwZBufferBitDepth;
} DDPIXELFORMAT;
#define LPDDPIXELFORMAT DDPIXELFORMAT *

typedef struct
	{
		int *SetRenderState(int a, int b);
		int *SetTransform(int a, void *b);
		int *Clear(int a, int b, int c, int d, float e, int f);
		int *BeginScene(void);
		int *SetMaterial(void *a);
		int *DrawPrimitive(int a, int b, void *c, int d, int e);
		int *EndScene(void);
		int *SetLight(int a, void *b);
		int *LightEnable(int a, BOOL b);
        int QueryInterface(int, void *);
	} DIRECT3DDEVICE7;
#define LPDIRECT3DDEVICE7 DIRECT3DDEVICE7 *

typedef struct
	{
        int QueryInterface(int, void *);
        int SetCooperativeLevel(HWND, int);
	} DIRECTDRAW7;
#define LPDIRECTDRAW7 DIRECTDRAW7 *

#define DDLOCK_SURFACEMEMORYPTR 0
typedef struct
	{
		int *GetVertexBufferDesc(void *);
		int *Lock(int a, void **b, void *c);
		int *Unlock(void);
        int *Release(void);
	} DIRECT3DVERTEXBUFFER7;
#define LPDIRECT3DVERTEXBUFFER7 DIRECT3DVERTEXBUFFER7 *

typedef struct
	{
		int *Draw(void);
        int *Release(void);
		LPDIRECT3DVERTEXBUFFER7 GetVB(void);
	} ID3DXSimpleShape;
	
int PostMessage(HWND, int, WPARAM, LPARAM);
#define SendMessage PostMessage

struct RastPort *GetDC(HWND);
BOOL ExtTextOut(HDC hdc,int X,int Y, int fuOptions, RECT *lprc, char *lpString, int cbCount, int *lpDx);
BOOL PtInRect(RECT *rRect, POINT pPoint);
void GetClientRect(HWND hWnd, RECT *rRect);
void CopyRect(RECT *rR1, RECT *rR2);
void InflateRect(RECT *rRect, int iX, int iY);
void SetRect(RECT *rRect, int x, int y, int w, int h);

void PostQuitMessage(int);
int DefWindowProc(int, int, WORD, LONG);
void DestroyWindow(HWND);
long GetWindowLong(int, int);
void SetWindowLong(int, int, long);
HPEN CreatePen(int, int, int);
HBRUSH CreateSolidBrush(int);
HFONT CreateFont(int, int, int, int, int, int, int, int, int, int, int, int, int, char *);
HDC CreateCompatibleDC(HDC);
HBITMAP CreateCompatibleBitmap(HDC, int, int);
int SelectObject(HDC, int);
void SetBkMode(HDC, int);
void SetTextColor(HDC, int);
void SetPixel(HDC, int, int, int);
void BeginPaint(HWND, void *);
void FillRect(HDC, RECT *, int);
void Rectangle(HDC, int, int, int, int);
void BitBlt(HDC, ...);
void ReleaseDC(HWND, HDC);
void DeleteDC(HDC);
HMENU GetSubMenu(HMENU, int);
HMENU GetMenu(HWND);
void IntersectClipRect(HDC, int, int, int, int);
void MoveToEx(HDC, int, int, int);
void LineTo(HDC, int, int);
void Ellipse(HDC, int, int, int, int);
void SelectClipRgn(HDC, int);
void ExtTextOut(HDC, int, int, int, int, char *, int, int);
void EndPaint(HWND, PAINTSTRUCT *);
BOOL PtInRect(RECT *, POINT);
void ClientToScreen(HWND, POINT *);
void ClipCursor(RECT *);
void TrackPopupMenu(HMENU, int, int, int, int, HWND, int);
void MoveWindow(HWND, int, int, int, int, int);
int GetDeviceCaps(HDC, int);
void CheckMenuItem(HMENU, int, int);
int DialogBox(HINSTANCE, LPCTSTR, HWND, void *);
int DialogBoxParam(HINSTANCE, LPCTSTR, HWND, void *, LPARAM);
void D3DXCreateBox(LPDIRECT3DDEVICE7, float, float, float, int, void *);
void D3DXCreateCylinder(LPDIRECT3DDEVICE7, float, float, float, int, int, int, void *);
void D3DXCreateTorus(LPDIRECT3DDEVICE7, float, float, int, int, int, void *);
void D3DXCreatePolygon(LPDIRECT3DDEVICE7, float, int, int, void *);
void D3DXCreateSphere(LPDIRECT3DDEVICE7, float, float, float, int, void *);
void D3DXCreateTeapot(LPDIRECT3DDEVICE7, int, void *);
void ShowWindow(HWND, int);
DWORD GetTickCount(void);
#include "d3dtypes.h"
#include <ctype.h>

#endif
