/* Copyright (C) Acorn Computers Ltd 1994 */

/*
 * print.c
 *
 * This file demonstrates how to print using the draw file renderer.
 * It is quite simple and makes a number of assumptions, eg. that
 * the viewer windows extent is (0,0) - (x,-y).
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "swis.h"

#include "toolbox.h"
#include "window.h"
#include "drawfile.h"
#include "wimplib.h"

#include "hyper.h"
#include "draw.h"
#include "utils.h"
#include "print.h"

#define CallSWI(a) (ERS = _kernel_swi(a,&regs,&regs))

int print_it(Viewer *view, int copies,int scale, int dir)
{
   _kernel_oserror *ERS=NULL;
   int features;
   int height;
   int i;
   int job=0,old_job=0;
   Palette pal;
   BBox box;
   int transform [2][2] = {{DM,0},{0,DM}};
   int  trfm[3][2] = {{0,0},{0,0},{0,0}};
   int origin [2] = {0,0};
   _kernel_swi_regs regs;

   _swix(Hourglass_On,0);
   if (CallSWI(PDriver_Info) != NULL) goto end;

   features = regs.r[3];

   regs.r[0] = 0xcf;
   regs.r[1] = (int) "printer:";

   if (CallSWI(OS_Find) != NULL) goto end;

   job = regs.r[0];

   regs.r[1] = (int) "Hyper";

   if (CallSWI(PDriver_SelectJob) != NULL) goto end;

   /* may need to declare fonts, see PRM 3-604, drawfile_declare_fonts calls
      PDriver_DeclareFont on our behalf for all the fonts in the draw object. */

   if (features & DownLoadFont) {
      for (i=0; i<view->num_draw; i++) {
        if (view->drawfile[i]) drawfile_declare_fonts(0,view->drawfile[i],view->draw_size[i]);
      }
      regs.r[0] = 0;
      regs.r[1] = 0;

      regs.r[2] = 0;
      CallSWI (PDriver_DeclareFont);
   }

   wimp_read_palette(&pal);

   window_get_extent(0,view->window,&box);

   height = - box.ymin;
   box.ymin = 0;

   /* print as much as we can */

   box.xmax = 0xffff;
   box.ymax = 0xffff;

   regs.r[0] = 0;
   regs.r[1] = (int) &box;
   regs.r[2] = (int) &transform;
   regs.r[3] = (int) &origin;
   regs.r[4] = pal.colours[view->colour];

   CallSWI (PDriver_GiveRectangle);

   regs.r[0] = copies;
   regs.r[1] = (int) &box;
   regs.r[2] = 0;
   regs.r[3] = 0;

   CallSWI(PDriver_DrawPage);

   if (!dir) {
      trfm[0][0] = (scale * DM) /100;
      trfm[1][1] = (scale * DM) /100;
   } else {
      trfm[0][1] = (scale * DM) /100;
      trfm[1][0] = - (scale * DM) /100;
      trfm[2][0] = (height * scale * DU) /100;
   }

   /* just a standard pdriver loop, we call drawfile_render for each layer.
      This is very similar to the wimp redraw loop */

   while (regs.r[0])
   {
      int i;
      for (i=0; i<view->num_draw; i++) {
        if (view->drawfile[i])
          drawfile_render (0, view->drawfile[i], view->draw_size[i],
            &trfm, &box,0);
      }
      CallSWI(PDriver_GetRectangle);
   }

end:

   if (job) {
      regs.r[0] = job;
      _kernel_swi(PDriver_EndJob, &regs,&regs);
      regs.r[0] = 0;
      regs.r[1] = job;
      _kernel_swi(OS_Find, &regs,&regs);

   }
   if (old_job) {
      regs.r[0] = old_job;
      regs.r[1] = 0;
      _kernel_swi(PDriver_SelectJob, &regs,&regs);
   }
   _swix(Hourglass_Off,0);

   if (ERS) {
      wimp_report_error(ERS,0,0);
      return FAILED;
   }
   return SUCCESS;
}
