Annotation of ntddk/src/print/pscript/page.c, revision 1.1

1.1     ! root        1: //--------------------------------------------------------------------------
        !             2: //
        !             3: // Module Name:  PAGE.C
        !             4: //
        !             5: // Brief Description:  DrvStartPage and DrvSendPage routines.  Also,
        !             6: //                     DrvStartDoc, DrvEndDoc and DrvAbortDoc.
        !             7: //
        !             8: // Author:  Kent Settle (kentse)
        !             9: // Created: 01-May-1991
        !            10: //
        !            11: // Copyright (C) 1991 - 1992 Microsoft Corporation.
        !            12: //
        !            13: // A little history on how DrvStartDoc and DrvEndDoc bracket a document
        !            14: // in different cases.
        !            15: //
        !            16: // Case 1 - Not raw data.  In this case, the application will issue
        !            17: //          an ESCAPE(STARTDOC) command.  It will get to the driver as
        !            18: //          DrvStartDoc.  At this point the driver will set a flag, saying
        !            19: //          DrvStartDoc has been called.  As soon as any drawing command
        !            20: //          comes in, and we are about to output something to the printer
        !            21: //          the driver checks to see if DrvStartDoc has been called.  If
        !            22: //          it has, it then checks to see if the header has been sent.
        !            23: //          if the header has been sent, the driver just continues normal
        !            24: //          output.  If the header has not yet been output, the driver
        !            25: //          outputs it, then continues with normal output.  If DrvStartDoc
        !            26: //          has not been called when any drawing begins, no output is
        !            27: //          sent to the printer.  This is done to force applications to
        !            28: //          call start doc and end doc.
        !            29: //
        !            30: // Case 2 - Raw data.  In this case, the application will issue an
        !            31: //          ESCAPE(STARTDOC) command.  It will get to the driver as
        !            32: //          DrvStartDoc.  At this point the driver will set a flag, saying
        !            33: //          DrvStartDoc has been called.  The difference here is that
        !            34: //          the application will now issue ESCAPE(PASSTHROUGH) commands.
        !            35: //          which, in the driver, will not call the normal printing
        !            36: //          routine.  Therefore, it will not check to see if DrvStartDoc
        !            37: //          has been called, and will not output the header.  This will
        !            38: //          prevent the driver from outputting two headers in the raw
        !            39: //          data case.  At EndDoc time, the driver checks to see if
        !            40: //          we have sent the header to the printer.  If we have not, ie
        !            41: //          we are sending raw data, then DrvEndDoc will simply send
        !            42: //          the end of job command, and not close down dictionaries and
        !            43: //          anything else dependent on the header.
        !            44: //
        !            45: // History:
        !            46: //   01-May-1991    -by-    Kent Settle       (kentse)
        !            47: // Created.
        !            48: //--------------------------------------------------------------------------
        !            49: 
        !            50: #include "pscript.h"
        !            51: #include "enable.h"
        !            52: #include <string.h>
        !            53: 
        !            54: extern BOOL bSendDeviceSetup(PDEVDATA);
        !            55: 
        !            56: //--------------------------------------------------------------------------
        !            57: // VOID DrvStartDoc(pso, pwszDocName, dwJobId)
        !            58: // SURFOBJ    *pso;
        !            59: // PWSTR      pwszDocName;
        !            60: // DWORD      dwJobId;
        !            61: //
        !            62: // This function is called to begin a print job.  The title of the
        !            63: // document is pointed to by pvIn.
        !            64: //
        !            65: // History:
        !            66: //   13-Sep-1991    -by-    Kent Settle     [kentse]
        !            67: //  Wrote it.
        !            68: //--------------------------------------------------------------------------
        !            69: 
        !            70: BOOL DrvStartDoc(pso, pwszDocName, dwJobId)
        !            71: SURFOBJ    *pso;
        !            72: PWSTR      pwszDocName;
        !            73: DWORD      dwJobId;
        !            74: {
        !            75:     PDEVDATA    pdev;
        !            76: 
        !            77:     // get the pointer to our DEVDATA structure and make sure it is ours.
        !            78: 
        !            79:     pdev = (PDEVDATA) pso->dhpdev;
        !            80: 
        !            81:     if (!bValidatePDEV(pdev))
        !            82:     {
        !            83:        RIP("PSCRIPT!DrvStartDoc: invalid pdev.\n");
        !            84:        SetLastError(ERROR_INVALID_PARAMETER);
        !            85:        return(FALSE);
        !            86:     }
        !            87: 
        !            88:     // set a flag saying that startdoc has been called.
        !            89: 
        !            90:     pdev->dwFlags |= PDEV_STARTDOC;
        !            91:     pdev->iPageNumber = 1;
        !            92: 
        !            93:     // copy document name into pdev, if we have been passed one.
        !            94: 
        !            95:     if (pdev->pwstrDocName)
        !            96:        HeapFree(pdev->hheap, 0, (LPSTR)pdev->pwstrDocName);
        !            97: 
        !            98:     if (pwszDocName)
        !            99:     {
        !           100:        if (!(pdev->pwstrDocName = (PWSTR)HeapAlloc(pdev->hheap, 0,
        !           101:                                       (wcslen(pwszDocName)+1)*sizeof(WCHAR))))
        !           102:        {
        !           103:            RIP("PSCRIPT!DrvStartDoc: HeapAlloc failed.\n");
        !           104:            return(FALSE);
        !           105:        }
        !           106: 
        !           107:         wcscpy(pdev->pwstrDocName, pwszDocName);
        !           108:     }
        !           109: 
        !           110:     return(TRUE);
        !           111: }
        !           112: 
        !           113: 
        !           114: 
        !           115: //--------------------------------------------------------------------------
        !           116: // VOID DrvStartPage(pso)
        !           117: // SURFOBJ    *pso;
        !           118: //
        !           119: // Asks the driver to send any control information needed at the start of
        !           120: // a page.  The control codes should be sent via WritePrinter.
        !           121: //
        !           122: // History:
        !           123: //   02-May-1991    -by-    Kent Settle     [kentse]
        !           124: //  Wrote it.
        !           125: //--------------------------------------------------------------------------
        !           126: 
        !           127: BOOL DrvStartPage(pso)
        !           128: SURFOBJ    *pso;
        !           129: {
        !           130:     PDEVDATA    pdev;
        !           131:     DWORD       pbgr;
        !           132: 
        !           133:     // get the pointer to our DEVDATA structure and make sure it is ours.
        !           134: 
        !           135:     pdev = (PDEVDATA) pso->dhpdev;
        !           136: 
        !           137:     if (!bValidatePDEV(pdev))
        !           138:     {
        !           139:        RIP("PSCRIPT!DrvStartPage: invalid pdev.\n");
        !           140:        SetLastError(ERROR_INVALID_PARAMETER);
        !           141:        return(FALSE);
        !           142:     }
        !           143: 
        !           144:     // bracket each page with a save/restore.  however, to get around
        !           145:     // sending out two headers when dealing with raw data, do not
        !           146:     // send out the save if the header has not been sent.  the header
        !           147:     // will do the save for the first page.
        !           148: 
        !           149: //!!! there must be a cleaner way of doing all this!!! - kentse.
        !           150: 
        !           151:     if (pdev->dwFlags & PDEV_COMPLETEHEADER)
        !           152:     {
        !           153:         // output the page number to the printer and update the page count.
        !           154: 
        !           155:         pdev->iPageNumber++;
        !           156: 
        !           157:         PrintString(pdev, "%%Page: ");
        !           158:         PrintDecimal(pdev, 2, pdev->iPageNumber, pdev->iPageNumber);
        !           159:         PrintString(pdev, "\n%%BeginPageSetup\n");
        !           160: 
        !           161:         // showpage wipes out graphics state and transforms, etc.
        !           162:        // so we need to reset some information each page.
        !           163: 
        !           164:         bSendDeviceSetup(pdev);
        !           165:         PrintString(pdev, "%%EndPageSetup\n");
        !           166: 
        !           167:        // FALSE means to perform a save command, not a gsave.
        !           168: 
        !           169:        ps_save(pdev, FALSE);
        !           170:         pdev->dwFlags |= PDEV_WITHINPAGE;
        !           171: 
        !           172:         if (pdev->psdm.dwFlags & PSDEVMODE_NEG)
        !           173:         {
        !           174:             // fill the entire imageable area with white, which will get
        !           175:             // transformed to black.  then restore the color to black.
        !           176: 
        !           177:             pbgr = RGB_WHITE;
        !           178:             ps_setrgbcolor(pdev, (BGR_PAL_ENTRY *)&pbgr);
        !           179: 
        !           180:             PrintDecimal(pdev, 4, 0,
        !           181:                          (pdev->CurForm.imagearea.left * pdev->psdm.dm.dmScale) / 100,
        !           182:                          (pdev->CurForm.sizlPaper.cy -
        !           183:                          ((pdev->CurForm.imagearea.top * pdev->psdm.dm.dmScale) / 100)),
        !           184:                          (pdev->CurForm.imagearea.right * pdev->psdm.dm.dmScale) / 100,
        !           185:                          (pdev->CurForm.sizlPaper.cy -
        !           186:                          ((pdev->CurForm.imagearea.bottom * pdev->psdm.dm.dmScale) / 100)));
        !           187: 
        !           188:             PrintString(pdev, " box\n");
        !           189:             pdev->cgs.dwFlags |= CGS_PATHEXISTS;
        !           190: 
        !           191:             ps_fill(pdev, (FLONG)FP_WINDINGMODE);
        !           192:             pbgr = RGB_BLACK;
        !           193:             ps_setrgbcolor(pdev, (BGR_PAL_ENTRY *)&pbgr);
        !           194:         }
        !           195:     }
        !           196: 
        !           197:     return(TRUE);
        !           198: }
        !           199: 
        !           200: 
        !           201: //--------------------------------------------------------------------------
        !           202: // VOID DrvEndDoc(pso)
        !           203: // SURFOBJ    *pso;
        !           204: //
        !           205: // Informs the driver that the document is ending.
        !           206: //
        !           207: // History:
        !           208: //   13-Sep-1991    -by-    Kent Settle     [kentse]
        !           209: //  Wrote it.
        !           210: //--------------------------------------------------------------------------
        !           211: 
        !           212: BOOL DrvEndDoc(pso, fl)
        !           213: SURFOBJ    *pso;
        !           214: FLONG       fl;
        !           215: {
        !           216:     PDEVDATA    pdev;
        !           217: 
        !           218:     UNREFERENCED_PARAMETER(fl);
        !           219: 
        !           220:     // get the pointer to our DEVDATA structure and make sure it is ours.
        !           221: 
        !           222:     pdev = (PDEVDATA) pso->dhpdev;
        !           223: 
        !           224:     if (!bValidatePDEV(pdev))
        !           225:     {
        !           226:        RIP("PSCRIPT!DrvEndDoc: invalid pdev.\n");
        !           227:        SetLastError(ERROR_INVALID_PARAMETER);
        !           228:        return(FALSE);
        !           229:     }
        !           230: 
        !           231:     // if RAWDATA has been sent, then we want to do nothing here.
        !           232: 
        !           233:     if (pdev->dwFlags & PDEV_RAWDATASENT)
        !           234:     {
        !           235:         // reset some flags.
        !           236: 
        !           237:         pdev->dwFlags &= ~(PDEV_STARTDOC | PDEV_COMPLETEHEADER |
        !           238:                            PDEV_PROCSET | PDEV_RAWDATASENT);
        !           239:         return(TRUE);
        !           240:     }
        !           241: 
        !           242:     // output the PostScript trailer code if our header was sent out.
        !           243: 
        !           244:     if ((pdev->dwFlags & PDEV_STARTDOC) &&
        !           245:         (pdev->dwFlags & PDEV_COMPLETEHEADER))
        !           246:     {
        !           247:         // turn off manual feed if it was on.
        !           248: 
        !           249:         if (pdev->dwFlags & PDEV_MANUALFEED)
        !           250:         {
        !           251:             PrintString(pdev, "%%BeginFeature: *ManualFeed False\n");
        !           252:             PrintString(pdev, (CHAR *)pdev->pntpd +
        !           253:                         pdev->pntpd->loszManualFeedFALSE);
        !           254:             PrintString(pdev, "\n%%EndFeature\n");
        !           255:         }
        !           256: 
        !           257:         // output the Adobe Trailer seperator, and end the dictionary
        !           258:         // started at the beginning of the print job.
        !           259: 
        !           260:         PrintString(pdev, "%%Trailer\nend\n");
        !           261:     }
        !           262: 
        !           263:     // terminate the print job if this is not eps output.
        !           264: 
        !           265:     if (!(pdev->psdm.dwFlags & PSDEVMODE_EPS))
        !           266:     {
        !           267:         // set the header sent flag.  this will prevent the following
        !           268:         // from happening:  if we have been sending out raw data, we
        !           269:         // will not have sent the header at this point.  when we make
        !           270:        // the next Print call, it will check to see if we have
        !           271:         // sent out the header, and send it if we have not.  so lie to
        !           272:         // it and tell it we have sent the header.
        !           273: 
        !           274:         pdev->dwFlags |= PDEV_PROCSET;
        !           275: 
        !           276:         if (pdev->pntpd->flFlags & PJL_PROTOCOL)
        !           277:         {
        !           278:             // if the printer supports PJL job switching, send out the universal
        !           279:             // end of language code.
        !           280: 
        !           281:             PrintString(pdev, "\033%-12345X");
        !           282:         }
        !           283:         else if (pdev->pntpd->flFlags & SIC_PROTOCOL)
        !           284:         {
        !           285:             // if the printer supports the Lexmark SIC protocol, send out the
        !           286:             // end PostScript code.
        !           287: 
        !           288:             bPSWrite(pdev, "\033\133\113\001\000\006", 7);
        !           289:         }
        !           290:         else
        !           291:         {
        !           292:             // end the print job.  The character '\4' is
        !           293:             // the end of job character for PostScript.
        !           294: 
        !           295:             if (!(pdev->pntpd->flFlags & NO_ENDOFFILE))
        !           296:                 PrintString(pdev, "\004");
        !           297:         }
        !           298: 
        !           299:     }
        !           300: 
        !           301:     // flush the buffer.
        !           302: 
        !           303:     bPSFlush(pdev);
        !           304: 
        !           305:     // reset some flags.
        !           306: 
        !           307:     pdev->dwFlags &= ~(PDEV_STARTDOC | PDEV_COMPLETEHEADER | PDEV_PROCSET);
        !           308: 
        !           309:     return(TRUE);
        !           310: }
        !           311: 
        !           312: 
        !           313: 
        !           314: //--------------------------------------------------------------------------
        !           315: // BOOL DrvSendPage(pso)
        !           316: // SURFOBJ    *pso;
        !           317: //
        !           318: // Requests that the printer send the raw bits from the indicated surface
        !           319: // to the printer via WritePrinter.  (WritePrinter does not have to be used when
        !           320: // the hardcopy device is accessed via I/O ports.
        !           321: //
        !           322: // If the surface is a bitmap on which the drawing has been accumulated,
        !           323: // the driver should access the bits via SURFOBJ service functions.  If
        !           324: // the surface is a journal, the driver should request that the journal
        !           325: // be played back to a bitmap or device surface, and get the bits
        !           326: // accordingly.  Some drivers may have used a device managed surface and
        !           327: // sent the bits to the printer as the drawing orders came in.  In that
        !           328: // case, this call does not send out the drawing.
        !           329: //
        !           330: // The control code which causes a page to be ejected from the printer
        !           331: // should be sent as a result of this call.
        !           332: //
        !           333: // If this function is slow, we have to worry about the user wanting to
        !           334: // abort the print job while in this call.  Therefore, the driver should
        !           335: // call EngCheckAbort at least once every ten seconds to see if printing
        !           336: // should be terminated.  If EngCheckAbort returns TRUE, then processing
        !           337: // of the page should be stopped and this function should return.  Note
        !           338: // that EngPlayJournal will take care of querying for the abort itself.
        !           339: // The driver need only be concerned if its own code will run continuously
        !           340: // for more than ten seconds.
        !           341: //
        !           342: // Parameters:
        !           343: //   pso:
        !           344: //     The surface object on which the drawing has been accumulated.  The
        !           345: //     object can be queried to find its type and what PDEV it is
        !           346: //     associated with.
        !           347: //
        !           348: // Returns:
        !           349: //   This function returns no value.
        !           350: //
        !           351: // History:
        !           352: //   01-May-1991    -by-    Kent Settle     [kentse]
        !           353: //  Wrote it.
        !           354: //--------------------------------------------------------------------------
        !           355: 
        !           356: BOOL DrvSendPage(pso)
        !           357: SURFOBJ    *pso;
        !           358: {
        !           359:     PDEVDATA    pdev;
        !           360: 
        !           361:     // get the pointer to our DEVDATA structure and make sure it is ours.
        !           362: 
        !           363:     pdev = (PDEVDATA) pso->dhpdev;
        !           364: 
        !           365:     if (!bValidatePDEV(pdev))
        !           366:     {
        !           367:        RIP("PSCRIPT!DrvSendPage: invalid pdev.\n");
        !           368:        SetLastError(ERROR_INVALID_PARAMETER);
        !           369:        return(FALSE);
        !           370:     }
        !           371: 
        !           372:     if (pdev->psdm.dwFlags & PSDEVMODE_EPS)
        !           373:     {
        !           374:         // EPS files consist of one page only, so terminate the
        !           375:         // document.
        !           376: 
        !           377:         if (pdev->dwFlags & PDEV_COMPLETEHEADER)
        !           378:         {
        !           379:            // output the Adobe Trailer seperator, then end the dictionary
        !           380:            // started at the beginning of the print job.
        !           381: 
        !           382:            PrintString(pdev, "%%Trailer\nend\n");
        !           383: 
        !           384:             pdev->dwFlags &= ~PDEV_COMPLETEHEADER;
        !           385:         }
        !           386: 
        !           387:        // close the page with a restore.  FALSE means restore, not grestore.
        !           388: 
        !           389:        ps_restore(pdev, FALSE);
        !           390:         pdev->dwFlags &= ~PDEV_WITHINPAGE;
        !           391:     }
        !           392:     else
        !           393:     {
        !           394:         // if the header has not been sent, nothing will have been sent, so
        !           395:         // we have no page to end.
        !           396: 
        !           397:         if (pdev->dwFlags & PDEV_PROCSET)
        !           398:         {
        !           399:             // reset PDEV flags concerned with per page information.
        !           400: 
        !           401:             pdev->dwFlags &= ~(PDEV_FONTREDEFINED | PDEV_LATINENCODED |
        !           402:                               PDEV_SYMENCODED | PDEV_DINGENCODED);
        !           403: 
        !           404:             // close the page with a restore.  FALSE means restore, not grestore.
        !           405: 
        !           406:             ps_restore(pdev, FALSE);
        !           407:             pdev->dwFlags &= ~PDEV_WITHINPAGE;
        !           408: 
        !           409:             // generate a PostScript page eject command.
        !           410: 
        !           411:             ps_showpage(pdev);
        !           412: 
        !           413:             // flush the output buffer.
        !           414: 
        !           415:             bPSFlush(pdev);
        !           416:         }
        !           417:     }
        !           418: 
        !           419:     return(TRUE);
        !           420: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.