/*         ______   ___    ___ 
 *        /\  _  \ /\_ \  /\_ \ 
 *        \ \ \L\ \\//\ \ \//\ \      __     __   _ __   ___ 
 *         \ \  __ \ \ \ \  \ \ \   /'__`\ /'_ `\/\`'__\/ __`\
 *          \ \ \/\ \ \_\ \_ \_\ \_/\  __//\ \L\ \ \ \//\ \L\ \
 *           \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/
 *            \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/
 *                                           /\____/
 *                                           \_/__/
 *
 *      Example program showing how to read and write Allegro format
 *      bitmaps from a GDI device context.
 *
 *      By Shawn Hargreaves.
 *
 *      See readme.txt for copyright information.
 */


#include "allegro5/allegro5.h"
#include "winalleg.h"



#define GRAB_W    64
#define GRAB_H    64


BITMAP *grab_region = NULL;

int captured = FALSE;

POINT location;

PALETTE pal;



LRESULT CALLBACK WndProc(HWND hwnd, UINT message, UINT wParam, LONG lParam)
{
   HWND dwnd;
   HDC hdc, ddc;
   PAINTSTRUCT ps;
   RECT rc, sz;
   OPENFILENAME fn;
   char filename[256];

   switch (message) {

      case WM_PAINT:
	 if (GetUpdateRect(hwnd, &rc, FALSE)) {
	    hdc = BeginPaint(hwnd, &ps);

	    set_palette_to_hdc(hdc, default_palette);

	    if (captured) {
	       dwnd = GetDesktopWindow();
	       ddc = GetDC(dwnd);

	       GetWindowRect(dwnd, &sz);

	       location.x = MIN(location.x, sz.right-GRAB_W);
	       location.y = MIN(location.y, sz.bottom-GRAB_W);

	       blit_from_hdc(ddc, grab_region, location.x, location.y, 0, 0, GRAB_W, GRAB_H);

	       ReleaseDC(dwnd, ddc);

	       GetClientRect(hwnd, &sz);

	       stretch_blit_to_hdc(grab_region, hdc, 0, 0, GRAB_W, GRAB_H, 0, 0, sz.right, sz.bottom);
	    }
	    else {
	       FillRect(hdc, &rc, GetStockObject(WHITE_BRUSH));
	       TextOut(hdc, 8, 8, "Click here, then drag over desktop", 34);
	    }

	    EndPaint(hwnd, &ps);
	 }
	 return 0;

      case WM_LBUTTONDOWN:
	 if (!captured) {
	    SetCapture(hwnd);
	    captured = TRUE;

	    location.x = (short)(lParam & 0xFFFF);
	    location.y = (short)(lParam >> 16);

	    ClientToScreen(hwnd, &location);

	    InvalidateRect(hwnd, NULL, FALSE);
	 }
	 return 0;

      case WM_LBUTTONUP:
	 if (captured) {
	    ReleaseCapture();
	    captured = FALSE;

	    InvalidateRect(hwnd, NULL, FALSE);

	    memset(&fn, 0, sizeof(fn));

	    fn.lStructSize = sizeof(fn);
	    fn.hwndOwner = hwnd;
	    fn.lpstrFilter = "Bitmap Files (*.bmp;*.pcx;*.tga)\0*.bmp;*.pcx;*.tga\0All Files (*.*)\0*.*\0";
	    fn.lpstrFile = filename;
	    fn.nMaxFile = sizeof(filename);
	    fn.Flags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT;

	    filename[0] = 0;

	    if (GetSaveFileName(&fn)) {
	       if (save_bitmap(filename, grab_region, pal) != 0)
		  MessageBox(hwnd, "Error saving bitmap file", NULL, MB_OK);
	    }
	 }
	 return 0;

      case WM_MOUSEMOVE:
	 if (captured) {
	    location.x = (short)(lParam & 0xFFFF);
	    location.y = (short)(lParam >> 16);

	    ClientToScreen(hwnd, &location);

	    InvalidateRect(hwnd, NULL, FALSE);
	 }
	 return 0;

      case WM_DESTROY:
	 PostQuitMessage(0);
	 return 0;
   }

   return DefWindowProc(hwnd, message, wParam, lParam);
}



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
   static char szAppName[] = "Magnificator";
   WNDCLASS wndclass;
   HWND hwnd;
   MSG msg;

   if (!hPrevInstance) {
      wndclass.style = CS_HREDRAW | CS_VREDRAW;
      wndclass.lpfnWndProc = WndProc;
      wndclass.cbClsExtra = 0;
      wndclass.cbWndExtra = 0;
      wndclass.hInstance = hInstance;
      wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
      wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
      wndclass.hbrBackground = NULL;
      wndclass.lpszMenuName = NULL;
      wndclass.lpszClassName = szAppName;

      RegisterClass(&wndclass);
   }

   hwnd = CreateWindow(szAppName, szAppName,
		       WS_OVERLAPPEDWINDOW,
		       CW_USEDEFAULT, CW_USEDEFAULT,
		       256, 256,
		       NULL, NULL,
		       hInstance,
		       NULL);

   if (install_allegro(SYSTEM_NONE, &errno, atexit) != 0)
      exit(0);
   set_gdi_color_format();

   grab_region = create_bitmap_ex(32, GRAB_W, GRAB_H);

   ShowWindow(hwnd, nCmdShow);
   UpdateWindow(hwnd);

   while (GetMessage(&msg, NULL, 0, 0)) {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
   }

   destroy_bitmap(grab_region);

   return msg.wParam;
}

