/*
**    GrabKEY
**
**        © 1996 by Timo C. Nentwig
**        All Rights Reserved !
**
**        Tcn@techbase.in-berlin.de
**
**
*/

/// #include

#include "gk_GST.h"
#include "gk_Protos.h"

///
/// proto

proto  VOID __regargs    SaveClipboard    (Object *Image);
proto  VOID __regargs    SaveImage        (Object *Image, const STRPTR FileName);
proto  VOID __regargs    PrintImage       (Object *Image);

///

static UWORD    Brush_Data [] =
{

		// Plane 0

	0x0000,0x0000,0x0000,0x0400,0x0000,0x0000,0x0000,0x0C00,
	0x0000,0x0000,0x0000,0x0C00,0x0067,0xE7F0,0x0000,0x0C00,
	0x0066,0x0600,0x0000,0x0C00,0x0067,0xC7C0,0x0060,0x0C00,
	0x0066,0x0600,0x0180,0x0C00,0x0066,0x0600,0x0600,0x0C00,
	0x0066,0x0600,0x1800,0x0C00,0x0000,0x0000,0x6000,0x0C00,
	0x0000,0x0003,0x8000,0x0C00,0x0000,0x000E,0x0000,0x0C00,
	0x0000,0x0038,0x0000,0x0C00,0x0000,0x00E0,0x0000,0x0C00,
	0x0000,0x0380,0x0000,0x0C00,0x0000,0x0E00,0x0000,0x0C00,
	0x0000,0x7800,0xAA00,0x0C00,0x0003,0xE0AA,0x8000,0x0C00,
	0x00FE,0xAAA0,0x0000,0x0C00,0x0000,0x0000,0x0000,0x0C00,
	0x0000,0x0000,0x0000,0x0C00,0x7FFF,0xFFFF,0xFFFF,0xFC00,

		// Plane 1

	0xFFFF,0xFFFF,0xFFFF,0xF800,0xD555,0x5555,0x5555,0x5000,
	0xD555,0x5555,0x5555,0x5000,0xD510,0x1005,0x5555,0x5000,
	0xD511,0x5155,0x5555,0x5000,0xD510,0x1015,0x5515,0x5000,
	0xD511,0x5155,0x5455,0x5000,0xD511,0x5155,0x5155,0x5000,
	0xD511,0x5155,0x4555,0x5000,0xD555,0x5555,0x1555,0x5000,
	0xD555,0x5554,0x5555,0x5000,0xD555,0x5551,0x5555,0x5000,
	0xD555,0x5545,0x5555,0x5000,0xD555,0x5515,0x5555,0x5000,
	0xD555,0x5455,0x5555,0x5000,0xD555,0x5155,0x5555,0x5000,
	0xD555,0x7D55,0xFF55,0x5000,0xD557,0xF5FF,0xD555,0x5000,
	0xD5FF,0xFFF5,0x5555,0x5000,0xD555,0x5555,0x5555,0x5000,
	0xD555,0x5555,0x5555,0x5000,0x8000,0x0000,0x0000,0x0000,

};

static struct    Image    Brush =
{

	0, 0,              // Upper left corner
	54, 22, 2,         // Width, Height, Depth
	Brush_Data,        // Image data
	0x0003, 0x0000,    // PlanePick, PlaneOnOff
	NULL               // Next image

};

static STRPTR    Brush_Tools [] =
{

	"FILETYPE=ILBM",
	NULL

};

static struct    DiskObject    Icon =
{

	WB_DISKMAGIC,                          // Magic Number
	WB_DISKVERSION,                        // Version

	{                                      // Embedded Gadget Structure

		NULL,                              // Next Gadget Pointer
		0, 0, 54, 23,                      // Left, Top, Width, Height
		GFLG_GADGIMAGE | GADGBACKFILL,     // Flags
		GACT_RELVERIFY | GACT_IMMEDIATE,   // Activation Flags
		BOOLGADGET,                        // Gadget Type
		(APTR) &Brush,                     // Render Image
		NULL,                              // Select Image
		NULL,                              // Gadget Text
		NULL,                              // Mutual Exclude
		NULL,                              // Special Info
		0,                                 // Gadget ID
		(APTR) 0x0001,                     // User Data (Revision)

	},

	WBPROJECT,                             // Icon Type
	"MultiView",                           // Default Tool
	Brush_Tools,                           // Tool Type Array
	NO_ICON_POSITION,                      // Current X
	NO_ICON_POSITION,                      // Current Y
	NULL,                                  // Drawer Structure
	NULL,                                  // Tool Window
	4096                                   // Stack Size

};

/// SaveClipboard ()

	/*
	 *    FUNCTION    Save an Object * to clipboard.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     SaveClipboard ();
	 *
	 */


VOID __regargs
SaveClipboard (Object *Image)
{

	if ( ! (DoMethod (Image, DTM_COPY, NULL)))
	{

		ErrorRequest ("OK", LocaleString (MSG_ERR_SAVE_CLIPBOARD));

	}

}

///
/// SaveImage ()

	/*
	 *    FUNCTION    Save an Object * to a file.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     SaveImage (ImageObject, "path:file");
	 *
	 */


VOID __regargs
SaveImage (Object *Image, const STRPTR FileName)
{

	BPTR    FileHandle;
	UBYTE   TempName [TT_LEN];

	STRCPY (TempName, FileName);

	if (Set -> File . Count)
	{

		ULONG    n = 0;

		do
		{

			n++;
			sprintf (TempName, "%s_%ld.IFF", FileName, n);

			if (n >= 1000)
				break;

		} while (Exists (TempName));

	}
	else
	{

		sprintf (TempName, "%s.IFF", FileName);

	}

	if (FileHandle = Open (TempName, MODE_NEWFILE))
	{

		if (DoMethod (Image, DTM_WRITE, NULL, FileHandle, DTWM_IFF, NULL))
		{

				// Add an icon for picture

			if (Set -> File . Icon)
			{

				struct    DiskObject   *Default_Icon;

					// Use default if possible

				if (Default_Icon = GetDiskObject ("ENV:sys/def_ilbm"))
				{

					Default_Icon -> do_CurrentX = Default_Icon -> do_CurrentY = NO_ICON_POSITION;

					PutDiskObject (TempName, Default_Icon);

					FreeDiskObject (Default_Icon);

				}
				else
				{

						// Use our icon

					PutDiskObject (TempName, &Icon);

				}

			}

			Close (FileHandle);

		}
		else
		{

			Close      (FileHandle);
			DeleteFile (TempName);
			ErrorRequest ("OK", LocaleString (MSG_ERR_SAVE_FILE), TempName);

		}

	}
	else
	{

		PrintFault (IoErr(), PRG_TITLE);

	}

}

///
/// PrintImage ()

	/*
	 *    FUNCTION    Print an Object *.
	 *
	 *    NOTE
	 *
	 *    EXAMPLE     PrintImage (Image);
	 *
	 */


VOID __regargs
PrintImage (Object *Image)
{

	struct    MsgPort   *PrinterPort;

	if (PrinterPort = CreateMsgPort())
	{

		union    printerIO   *PrinterIO;

		if (PrinterIO =  (union printerIO *) CreateIORequest (PrinterPort, sizeof (union printerIO)))
		{

			if ( ! (OpenDevice ("printer.device", 0, (struct IORequest *) PrinterIO, NULL)))
			{

				DoMethod (Image, DTM_PRINT, NULL, PrinterIO, NULL);
				CloseDevice ((struct IORequest *) PrinterIO);

			}

			DeleteIORequest ((struct IORequest *) PrinterIO);

		}

		DeleteMsgPort (PrinterPort);

	}

}

///
