[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

/*
 * screendump.c    - routine to dump rastport (iffparse not required)
 *
 */

#include <exec/types.h>
#include <intuition/screens.h>
#include <devices/printer.h>

#ifndef NO_PROTOS
#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#endif


/* screendump
 *
 * Passed a screen pointer, source x, source y, width, height,
 *   destcols and io_Special flags, will print part or all of a screen.
 *
 * If 0 is passed for BOTH destcols and special, screendump()
 *   assumes you want IT to compute suitable values.
 * In this case:
 *   1. If srcx and srcy are 0, and srcw and srch are same as
 *      screen width and height, screendump will set destcols=0,
 *      and special = SPECIAL_FULLCOLS|SPECIAL_ASPECT
 *      for a full width aspected dump.
 *
 *   2. If srcx or srcy are nonzero, or srcw or srch are different
 *      from screen width or height, screendump will print a
 *      fractional size dump relative to the size whole screendump
 *      would have been.
 *
 * Returns 0 for success or printer io_Error (devices/printer.h)
 */

int screendump(struct Screen *scr,
                UWORD srcx, UWORD srcy, UWORD srcw, UWORD srch,
                LONG destcols, UWORD iospecial)
    {
    struct IODRPReq *iodrp;
    struct MsgPort  *printerPort;
    struct ViewPort *vp;
    ULONG tmpl;
    int error = PDERR_BADDIMENSION;

    if(!scr)    return(error);

    if((!destcols)&&(!iospecial))
        {
        /* Then we compute what they should be */
        if((!srcx)&&(!srcy)&&(srcw==scr->Width)&&(srch==scr->Height))
            {
            iospecial = SPECIAL_FULLCOLS|SPECIAL_ASPECT;
            }
        else
            {
            iospecial = SPECIAL_FRACCOLS|SPECIAL_ASPECT;
            tmpl = srcw;
            tmpl = tmpl << 16;
            destcols = (tmpl / scr->Width) << 16;
            }
        }

    if(printerPort = CreatePort(0,0))
        {
        if(iodrp=
           (struct IODRPReq *)CreateExtIO(printerPort,sizeof(struct IODRPReq)))
            {
            if(!(error=OpenDevice("printer.device",0,iodrp,0)))
                {
                vp = &scr->ViewPort;
                iodrp->io_Command = PRD_DUMPRPORT;
                iodrp->io_RastPort = &scr->RastPort;
                iodrp->io_ColorMap = vp->ColorMap;
                iodrp->io_Modes = (ULONG)vp->Modes;
                iodrp->io_SrcX = srcx;
                iodrp->io_SrcY = srcy;
                iodrp->io_SrcWidth = srcw;
                iodrp->io_SrcHeight = srch;
                iodrp->io_DestCols = destcols;
        /*      iodrp->io_DestRows = 0; cleared by allocation */
                iodrp->io_Special = iospecial;

                error = DoIO(iodrp);

                CloseDevice(iodrp);
                }
            DeleteExtIO(iodrp);
            }
        DeletePort(printerPort);
        }
    return(error);
    }