/* See LICENSE file for copyright and license details. */
#ifdef IN_LIBGAMMA_W32_GDI
/**
* One of the Windows `typedef`:s for unsigned 16-bit integer
* This is the one used in these functions
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#WORD
*/
typedef uint16_t WORD;
/**
* One of the Windows `typedef`:s for unsigned 32-bit integer
* This is the one used in these functions
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#DWORD
*/
typedef uint32_t DWORD;
/**
* One of the Windows `typedef` for booleanic values, the `int` variant
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#BOOL
*/
typedef int BOOL;
/**
* Windows `typedef` for a device context (the 'h' stands for 'handle')
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#HDC
*/
typedef void *HDC;
/**
* Windows `typedef` for a window (the 'h' stands for 'handle')
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#HWND
*/
typedef void *HWND;
/**
* One of the Windows `typedef`:s for `void *`, a generic pointer
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPVOID
*/
typedef void *LPVOID;
/**
* A silly Windows `typedef` for a `const char *`, a constant string
*
* It is also defined as NUL-terminated, but so are all C-strings
* and it makes no difference. However if `UNICODE` were to be defined
* it would be `const wchar_t *`.
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#LPCTSTR
*/
typedef const char *LPCTSTR;
/**
* Even more silly. A Windows `typedef` for either `wchar_t` or
* `char`, depending on whether `UNICODE` is defined (we will
* assume `UNICODE` is not definied because that is just silly)
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#TCHAR
*/
typedef char TCHAR;
/**
* Apperently we need `TRUE` to be defined to understand code,
* at least in Windows...
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#BOOL
*/
#define TRUE 1
/**
* Apperently we need `FALSE` to be defined to understand code,
* at least in Windows...
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx#BOOL
*/
#define FALSE 0
/**
* Get the device context for a window or the entire screen
*
* @param hWnd The window, `NULL` for the entire screen
* @return The device context
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd144871(v=vs.85).aspx
*/
HDC GetDC(HWND);
/**
* Free a device context
*
* @param hWnd The window whose device context is `hDC`, `NULL` for the entire screen
* @param hDC The device context to free
* @return Whether the call was successful
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd162920(v=vs.85).aspx
*/
int ReleaseDC(HWND, HDC);
/**
* Get information (capabilities) for a device context
*
* @param hDC The device context
* @param nIndex The information to retrieve, may be `COLORMGMTCAPS`
* @return The details of the queried information, can return `CM_GAMMA_RAMP`
* if `nIndex` is `COLORMGMTCAPS`
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx
*/
LIBGAMMA_GCC_ONLY__(__attribute__((__const__)))
int GetDeviceCaps(HDC, int);
/**
* Colour management capabilities
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx
*/
#define COLORMGMTCAPS 1
/**
* Colour management capabilities: has gamma ramps
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd144877(v=vs.85).aspx
*/
#define CM_GAMMA_RAMP 1
/**
* Set the gamma ramps for a device
*
* @param hDC The device context
* @param lpRamp The gamma ramps joined in the order: red, green, blue;
* this is a `WORD *` casted to `void *`
* @return Whether the call was successful
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd372194(v=vs.85).aspx
*/
BOOL SetDeviceGammaRamp(HDC, LPVOID restrict);
/**
* Get the current gamma ramps for a device
*
* @param hDC The device context
* @param lpRamp The output for the gamma ramps joined in the order: red, green, blue
* This is a `WORD *` casted to `void *`
* @return Whether the call was successful
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd316946(v=vs.85).aspx
*/
BOOL GetDeviceGammaRamp(HDC, LPVOID restrict);
/**
* Get the context for a device
*
* @param lpszDriver The driver or a display device, use "DISPLAY" if you want a display
* @param lpszDevice The name of the device. If you want a display use can use the member
* name `DeviceName` in the third parameter, an output parameter, of
* `EnumDisplayDevices`.
* @param lpszOutput We will always use `NULL` here
* @param lpInitData We will always use `NULL` here; this should actually by a `const DEVMODE *`
* @return The context for the device
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx
*/
HDC CreateDC(LPCTSTR restrict, LPCTSTR restrict, LPCTSTR restrict, const void *restrict);
/**
* This macro does not seem to have an official documentation that is correct
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183490(v=vs.85).aspx
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd374074(v=vs.85).aspx
*/
#define TEXT(X) ((LPCTSTR)(X))
/**
* Information about a display device
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx
*/
typedef struct {
/**
* Set this to `sizeof(DISPLAY_DEVICE)`
*/
DWORD cb;
/**
* The name of the device
*/
TCHAR DeviceName[32];
/**
* The status of the device, can include `DISPLAY_DEVICE_ACTIVE`
*/
DWORD StateFlags;
} DISPLAY_DEVICE;
/**
* Appearently we are incapable of putting asterisks at the
* end of types names, so istead we preprend them with 'P'
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx
*/
typedef DISPLAY_DEVICE *PDISPLAY_DEVICE;
/**
* The monitor is "on"
*
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd183569(v=vs.85).aspx
*/
#define DISPLAY_DEVICE_ACTIVE 1
/**
* Get a display device by its name or index
*
* @param lpDevice The name of the device, use `NULL` to base the call on `iDevNum` instead
* @param iDevNum The index of the device
* @param lpDisplayDevice Output for the found device
* @param dwFlags Flags, we will always use zero
* @return Whether the call was successful; zero is also returned if `iDevNum`
* is greater than the largest device index on the system
* @see http://msdn.microsoft.com/en-us/library/windows/desktop/dd162609(v=vs.85).aspx
*/
BOOL EnumDisplayDevices(LPCTSTR restrict, DWORD, PDISPLAY_DEVICE restrict, DWORD);
#endif