/* prf_gfx.c */
/* V091 */

#include "prf.h"

long __regargs PrintRaster(struct prf_info *);

long __regargs PrintIconGfx(struct prf_info *info, UBYTE *name)
{
 struct DiskObject *dobj;
 struct Image      *NormalImage;
 struct Image      *SelectImage;
 struct ViewPort   *vp;
 FILE              *printer;
 UBYTE             filename[STR_SIZE];
 ULONG             ModeID;
 long rc = CMD_NEUTRAL;
 if(!stricmp(name + (strlen(name) - 5), ".info"))
   stccpy(filename,name,strlen(name) - 4);
 else strcpy(filename,name);
 if(dobj = GetDiskObject(filename))
 {
  if(printer = fopen("prt:","w"))
  {
   PrintSettings(info,printer);
   BuildStatusline(info,name);
   if(*(info->Statusline)) fprintf(printer,"%s\n",info->Statusline);
   if(*(info->Headline)) fprintf(printer,"%s\n",info->Headline);
   fprintf(printer,"\n" T_ICONGFX_HEADER "%s\n",filename);
   fclose(printer);
  }
  if(OpenPrinter(info))
  {
   NormalImage = (struct Image *)dobj->do_Gadget.GadgetRender;
   SelectImage = (struct Image *)dobj->do_Gadget.SelectRender;
   vp = &info->PubScr->ViewPort;
   if((ModeID = GetVPModeID(vp)) != INVALID_ID)
   {
    InitRastPort(&info->ilbm.rp);
    if(SelectImage)
    InitBitMap(&info->ilbm.bmap,NormalImage->Depth,info->PubScr->Width,NormalImage->Height + SelectImage->Height + 15);
     else
    InitBitMap(&info->ilbm.bmap,NormalImage->Depth,info->PubScr->Width,NormalImage->Height + 10);
    info->ilbm.rp.BitMap = &info->ilbm.bmap;
    if(get_planes(info))
    {
     DrawImage(&info->ilbm.rp,NormalImage,0,5);
     if(SelectImage) DrawImage(&info->ilbm.rp,SelectImage,0,NormalImage->Height + 10 );
     info->PIO->iodrp.io_Command = PRD_DUMPRPORT;
     info->PIO->iodrp.io_RastPort = &info->ilbm.rp;
     info->PIO->iodrp.io_ColorMap = vp->ColorMap;
     info->PIO->iodrp.io_Modes = ModeID;
     info->PIO->iodrp.io_SrcX  = 0;
     info->PIO->iodrp.io_SrcY  = 0;
     info->PIO->iodrp.io_SrcWidth  = info->PubScr->Width ;
     info->PIO->iodrp.io_SrcHeight = info->ilbm.bmap.Rows;
     info->PIO->iodrp.io_Special = SPECIAL_NOFORMFEED | SPECIAL_CENTER | SPECIAL_ASPECT;
     if(PrintRaster(info) == CMD_QUIT)rc = CMD_QUIT;
     free_planes(info);
    }
   }
   ClosePrinter(info);
  }
  if(printer = fopen("prt:","w"))
  {
   PrintSettings(info,printer);
   if(*(info->Footline))fprintf(printer,"%s\n",info->Footline);
   fprintf(printer,"\n" T_ICONGFX_FOOT );
   fprintf(printer,"%s\n",filename);
   if(info->flags.ff) fprintf(printer,"\f");
   fclose(printer);
  }
  FreeDiskObject(dobj);
 }
 return rc;
}


long __regargs PrintRaster(struct prf_info *info)
{
 long end = FALSE;
 long rc  = CMD_NEUTRAL;
 SetPrfSignals(info);
 SendIO((struct IORequest *)info->PIO);
 while(!end)
 {
  SetPrfSignals(info);
  Wait(info->signals);
  switch(DoCommand(info,HandleMsgs(info)))
  {
   case CMD_QUIT         : rc = CMD_QUIT;
                           end = TRUE;
                           break;
   case CMD_CLOSEPRINTER : end = TRUE;
                           break;
   default               : break;
  }
 }
 return rc;
}

long __regargs OpenPrinter(struct prf_info *info)
{
 int rc = FALSE;
 if(info->prtPort = CreateMsgPort())
 {
  if(info->PIO = (union PrinterIO *)CreateExtIO(info->prtPort,sizeof(union PrinterIO)))
  {
   if(!(OpenDevice("printer.device",0,(struct IORequest *)info->PIO,0)))
   {
    info->device = TRUE;
    rc = TRUE;
   }
  }
 }
 return rc;
}

void __regargs ClosePrinter(struct prf_info *info)
{
 AbortIO((struct IORequest *)info->PIO);
 WaitIO((struct IORequest *)info->PIO);
 if(info->device == TRUE)
 {
  CloseDevice((struct IORequest *)info->PIO);
  info->device = FALSE;
 }
 if(info->PIO)
 {
  DeleteExtIO((struct IORequest *)info->PIO);
  info->PIO = NULL;
 }
 if(info->prtPort)
 {
  DeletePort(info->prtPort);
  info->prtPort = NULL;
 }
}


void __regargs free_planes(struct prf_info *info)
{
 long i;
 for (i=0;i < info->ilbm.bmap.Depth;i++)
 {
  if(info->ilbm.bmap.Planes[i])FreeRaster(info->ilbm.bmap.Planes[i],info->ilbm.bmap.BytesPerRow * 8,info->ilbm.bmap.Rows);
 }
}

long __regargs get_planes(struct prf_info *info)
{
 long rc = TRUE;
 long i;
 for (i=0;i < info->ilbm.bmap.Depth;i++)
 {
  info->ilbm.bmap.Planes[i] = (PLANEPTR)AllocRaster(info->ilbm.bmap.BytesPerRow * 8,info->ilbm.bmap.Rows);
  if(info->ilbm.bmap.Planes[i] == NULL)rc = FALSE;
  else memset(info->ilbm.bmap.Planes[i],'\0',info->ilbm.bmap.BytesPerRow * info->ilbm.bmap.Rows);
 }
 return rc;
}




