13bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
23bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 The Android Open Source Project
33bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2016 Mopria Alliance, Inc.
43bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
53bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
63bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Licensed under the Apache License, Version 2.0 (the "License");
73bf66744d61d18c66d46f2608de0467ad3df0268Mopria * you may not use this file except in compliance with the License.
83bf66744d61d18c66d46f2608de0467ad3df0268Mopria * You may obtain a copy of the License at
93bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
103bf66744d61d18c66d46f2608de0467ad3df0268Mopria *      http://www.apache.org/licenses/LICENSE-2.0
113bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
123bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Unless required by applicable law or agreed to in writing, software
133bf66744d61d18c66d46f2608de0467ad3df0268Mopria * distributed under the License is distributed on an "AS IS" BASIS,
143bf66744d61d18c66d46f2608de0467ad3df0268Mopria * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
153bf66744d61d18c66d46f2608de0467ad3df0268Mopria * See the License for the specific language governing permissions and
163bf66744d61d18c66d46f2608de0467ad3df0268Mopria * limitations under the License.
173bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
183bf66744d61d18c66d46f2608de0467ad3df0268Mopria
193bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include "../../media.h"
203bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <PCLmGenerator.h>
213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
223bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <assert.h>
233bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <math.h>
243bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <zlib.h>
253bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <stdio.h>
263bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <string.h>
273bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <stdlib.h>
283bf66744d61d18c66d46f2608de0467ad3df0268Mopria#include <genPCLm.h>
293bf66744d61d18c66d46f2608de0467ad3df0268Mopria
303bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define TAG "genPCLm"
313bf66744d61d18c66d46f2608de0467ad3df0268Mopria
323bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define STRIP_HEIGHT 16
333bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define JPEG_QUALITY 100
343bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define TEMP_BUFF_SIZE 10000000
353bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define DEFAULT_OUTBUFF_SIZE 64*5120*3*10
363bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define STANDARD_SCALE_FOR_PDF 72.0
373bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define KID_STRING_SIZE 1000
383bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define CATALOG_OBJ_NUMBER 1
393bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define PAGES_OBJ_NUMBER   2
403bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define ADOBE_RGB_SIZE 284
413bf66744d61d18c66d46f2608de0467ad3df0268Mopria
423bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define rgb_2_gray(r, g, b) (ubyte)(0.299*(double)r+0.587*(double)g+0.114*(double)b)
433bf66744d61d18c66d46f2608de0467ad3df0268Mopria
443bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic PCLmSUserSettingsType PCLmSSettings;
453bf66744d61d18c66d46f2608de0467ad3df0268Mopria
463bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
473bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Shift the strip image right in the strip buffer by leftMargin pixels.
483bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
493bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Assumptions: The strip buffer was allocated large enough to handle the shift; if not
503bf66744d61d18c66d46f2608de0467ad3df0268Mopria * then the image data on the right will get clipped.
513bf66744d61d18c66d46f2608de0467ad3df0268Mopria *
523bf66744d61d18c66d46f2608de0467ad3df0268Mopria * We allocate a full strip (height and width), but then only copy numLinesThisCall from
533bf66744d61d18c66d46f2608de0467ad3df0268Mopria * the original buffer to the newly allocated buffer.  This pads the strips for JPEG processing.
543bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
553bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic ubyte *shiftStripByLeftMargin(ubyte *ptrToStrip, sint32 currSourceWidth,
563bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 currStripHeight, sint32 numLinesThisCall, sint32 currMediaWidth, sint32 leftMargin,
573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorSpaceDisposition destColorSpace) {
583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *fromPtr, *toPtr, *newStrip;
593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sint32 scanLineWidth;
603bf66744d61d18c66d46f2608de0467ad3df0268Mopria
613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == grayScale) {
623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scanLineWidth = currMediaWidth;
633bf66744d61d18c66d46f2608de0467ad3df0268Mopria
643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Allocate a full strip
653bf66744d61d18c66d46f2608de0467ad3df0268Mopria        newStrip = (ubyte *) malloc(scanLineWidth * currStripHeight);
663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memset(newStrip, 0xff, scanLineWidth * currStripHeight);
673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = 0; i < numLinesThisCall; i++) {
683bf66744d61d18c66d46f2608de0467ad3df0268Mopria            toPtr = newStrip + leftMargin + (i * currMediaWidth);
693bf66744d61d18c66d46f2608de0467ad3df0268Mopria            fromPtr = ptrToStrip + (i * currSourceWidth);
703bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memcpy(toPtr, fromPtr, currSourceWidth);
713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scanLineWidth = currMediaWidth * 3;
743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 srcScanlineWidth = currSourceWidth * 3;
753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 shiftAmount = leftMargin * 3;
763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        newStrip = (ubyte *) malloc(scanLineWidth * currStripHeight);
773bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memset(newStrip, 0xff, scanLineWidth * currStripHeight);
783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = 0; i < numLinesThisCall; i++) {
793bf66744d61d18c66d46f2608de0467ad3df0268Mopria            toPtr = newStrip + shiftAmount + (i * scanLineWidth);
803bf66744d61d18c66d46f2608de0467ad3df0268Mopria            fromPtr = ptrToStrip + (i * srcScanlineWidth);
813bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memcpy(toPtr, fromPtr, srcScanlineWidth);
823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
843bf66744d61d18c66d46f2608de0467ad3df0268Mopria
853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return newStrip;
863bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
873bf66744d61d18c66d46f2608de0467ad3df0268Mopria
883bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifdef SUPPORT_WHITE_STRIPS
893bf66744d61d18c66d46f2608de0467ad3df0268Mopria
903bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::isWhiteStrip(void *pInBuffer, int inBufferSize) {
913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    uint32 *ptr = (uint32 *) pInBuffer;
923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (int i = 0; i < inBufferSize / 4; i++, ptr++) {
933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (*ptr != 0xffffffff) {
943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return false;
953bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
983bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
993bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1003bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
1013bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1023bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::Cleanup(void) {
1033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (allocatedOutputBuffer) {
1043bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(allocatedOutputBuffer);
1053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        allocatedOutputBuffer = NULL;
1063bf66744d61d18c66d46f2608de0467ad3df0268Mopria        currOutBuffSize = 0;
1073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1083bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (leftoverScanlineBuffer) {
1103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(leftoverScanlineBuffer);
1113bf66744d61d18c66d46f2608de0467ad3df0268Mopria        leftoverScanlineBuffer = NULL;
1123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (scratchBuffer) {
1143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(scratchBuffer);
1153bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scratchBuffer = NULL;
1163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (xRefTable) {
1183bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(xRefTable);
1193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefTable = NULL;
1203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (KidsArray) {
1223bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(KidsArray);
1233bf66744d61d18c66d46f2608de0467ad3df0268Mopria        KidsArray = NULL;
1243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1253bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1273bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::errorOutAndCleanUp() {
1283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    Cleanup();
1293bf66744d61d18c66d46f2608de0467ad3df0268Mopria    jobOpen = job_errored;
1303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return genericFailure;
1313bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1323bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1333bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic sint32 startXRef = 0;
1343bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic sint32 endXRef = 0;
1353bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1363bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
1373bf66744d61d18c66d46f2608de0467ad3df0268Mopria * DO NOT EDIT UNTIL YOU READ THE HEADER FILE DESCRIPTION.
1383bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
1393bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::fixXRef() {
1403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!startXRef || !mirrorBackside) {
1413bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return;
1423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1433bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
1453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(startXRef);
1463bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 start = startXRef;
1473bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 end = endXRef - 1;
1483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 aSize = endXRef - startXRef - 1;
1493bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1503bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 *tmpArray = (sint32 *) malloc(aSize * 20);
1513bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 xRefI = startXRef;
1533bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = 0; i < aSize + 1; i++, xRefI++) {
1543bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(tmpArray + i) = xRefTable[xRefI + 1] - xRefTable[xRefI];
1553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1563bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Reorder header and image sizes
1583bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = 0; i < aSize + 1; i += 2, xRefI++) {
1593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 t = *(tmpArray + i);
1603bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(tmpArray + i) = *(tmpArray + i + 1);
1613bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(tmpArray + i + 1) = t;
1623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1633bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefI = aSize;
1653bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = start + 1, j = aSize; i < end + 2; i++, start++, xRefI--, j--) {
1663bf66744d61d18c66d46f2608de0467ad3df0268Mopria            xRefTable[i] = (xRefTable[i - 1] + *(tmpArray + j));
1673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1683bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int i = startXRef + 2; i < endXRef; i++) {
1703bf66744d61d18c66d46f2608de0467ad3df0268Mopria            xRefTable[i] += 2;
1713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1723bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 k = endXRef - 1;
1743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int i;
1753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 lSize = (endXRef - startXRef) / 2;
1763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (i = startXRef; i < startXRef + lSize; i++, k--) {
1773bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 t = xRefTable[i];
1783bf66744d61d18c66d46f2608de0467ad3df0268Mopria            xRefTable[i] = xRefTable[k];
1793bf66744d61d18c66d46f2608de0467ad3df0268Mopria            xRefTable[k] = t;
1803bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
1813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(tmpArray);
1823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1833bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    startXRef = 0;
1853bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1863bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1873bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::addXRef(sint32 xRefObj) {
1883bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define XREF_ARRAY_SIZE 100
1893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!xRefTable) {
1903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefTable = (sint32 *) malloc(XREF_ARRAY_SIZE * sizeof(sint32));
1913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(xRefTable);
1923bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefTable[0] = 0;
1933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefIndex++;
1943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
1953bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefTable[xRefIndex] = xRefObj;
1973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefIndex++;
1983bf66744d61d18c66d46f2608de0467ad3df0268Mopria
1993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!(xRefIndex % XREF_ARRAY_SIZE)) {
2003bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefTable = (sint32 *) realloc(xRefTable, (((xRefIndex + XREF_ARRAY_SIZE) *
2013bf66744d61d18c66d46f2608de0467ad3df0268Mopria                sizeof(sint32))));
2023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
2033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
2043bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2053bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2063bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::addKids(sint32 kidObj) {
2073bf66744d61d18c66d46f2608de0467ad3df0268Mopria#define KID_ARRAY_SIZE 20
2083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!KidsArray) {
2093bf66744d61d18c66d46f2608de0467ad3df0268Mopria        KidsArray = (sint32 *) malloc(KID_ARRAY_SIZE * sizeof(sint32));
2103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(KidsArray);
2113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
2123bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    KidsArray[numKids] = kidObj;
2143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    numKids++;
2153bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!(numKids % KID_ARRAY_SIZE)) {
2173bf66744d61d18c66d46f2608de0467ad3df0268Mopria        KidsArray = (sint32 *) realloc(KidsArray, ((numKids + KID_ARRAY_SIZE) * sizeof(sint32)));
2183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
2193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
2203bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2223bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::initOutBuff(char *buff, sint32 size) {
2233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currBuffPtr = outBuffPtr = buff;
2243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    outBuffSize = size;
2253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToCurrBuff = 0;
2263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    memset(buff, 0, size);
2273bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2283bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2293bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::writeStr2OutBuff(char *str) {
2303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sint32 strSize = strlen(str);
2313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Make sure we have enough room for the copy
2323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char *maxSize = currBuffPtr + strSize;
2333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    assert(maxSize - outBuffPtr < outBuffSize);
2343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    memcpy(currBuffPtr, str, strSize);
2353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currBuffPtr += strSize;
2363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToCurrBuff += strSize;
2373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToPCLmFile += strSize;
2383bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2393bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2403bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::write2Buff(ubyte *buff, int buffSize) {
2413bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char *maxSize = currBuffPtr + buffSize;
2423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (maxSize - outBuffPtr > outBuffSize) {
2433bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
2443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
2453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    memcpy(currBuffPtr, buff, buffSize);
2463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currBuffPtr += buffSize;
2473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToCurrBuff += buffSize;
2483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToPCLmFile += buffSize;
2493bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2503bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2513bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::statOutputFileSize() {
2523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    addXRef(totalBytesWrittenToPCLmFile);
2533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return (1);
2543bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
2553bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2563bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::writePDFGrammarTrailer(int imageWidth, int imageHeight) {
2573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int i;
2583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char KidsString[KID_STRING_SIZE];
2593bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Object 1 - Catalog\n");
2613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
2633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%d 0 obj\n", CATALOG_OBJ_NUMBER);
2643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
2663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /Catalog\n");
2683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Pages %d 0 R\n", PAGES_OBJ_NUMBER);
2703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
2723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
2743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2753bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Object 2 - page tree \n");
2773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2783bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
2793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%d 0 obj\n", PAGES_OBJ_NUMBER);
2803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
2823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Count %ld\n", numKids);
2843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2853bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Define the Kids for this document as an indirect array
2873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(KidsString, "/Kids [ ");
2883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(KidsString);
2893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (i = 0; i < numKids; i++) {
2903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(KidsString, "%ld 0 R ", KidsArray[i]);
2913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(KidsString);
2923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
2933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(KidsString, "]\n");
2953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(KidsString);
2963bf66744d61d18c66d46f2608de0467ad3df0268Mopria
2973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /Pages\n");
2983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
2993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
3003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
3023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3033bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: cross-reference section: object 0, 6 entries\n");
3053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
3073bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Fix up the xref table for backside duplex
3093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    fixXRef();
3103bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefStart = xRefIndex - 1;
3123bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "xref\n");
3143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "0 %d\n", 1);
3163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Note the attempt to write exactly 20 bytes
3193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "0000000000 65535 f \n");
3203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%d %ld\n", PAGES_OBJ_NUMBER + 1, xRefIndex - 4);
3223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (i = 1; i < xRefIndex - 3; i++) {
3243bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%010ld %05d n \n", xRefTable[i], 0);
3253bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
3273bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // sprintf(pOutStr,"<</AIMetaData 32 0 R/AIPDFPrivateData1 33 0 R/AIPDFPrivateData10 34 0\n");
3293bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Now add the catalog and page object
3313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%d 2\n", CATALOG_OBJ_NUMBER);
3323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%010ld %05d n \n", xRefTable[xRefIndex - 3], 0);
3343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%010ld %05d n \n", xRefTable[xRefIndex - 2], 0);
3363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3373bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: File Trailer\n");
3393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "trailer\n");
3413bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
3433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // sprintf(pOutStr,"/Info %d 0\n", infoObj); writeStr2OutBuff(pOutStr);
3453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Size %ld\n", xRefIndex - 1);
3463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Root %d 0 R\n", CATALOG_OBJ_NUMBER);
3483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
3503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3513bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "startxref\n");
3523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%ld\n", xRefTable[xRefStart]);
3543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%%%EOF\n");
3563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
3573bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
3583bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3593bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::injectAdobeRGBCS() {
3603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (adobeRGBCS_firstTime) {
3613bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // We need to inject the ICC object for AdobeRGB
3623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%============= PCLm: ICC Profile\n");
3633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        statOutputFileSize();
3653bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
3663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
3673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3683bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "[/ICCBased %ld 0 R]\n", objCounter);
3693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3703bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "endobj\n");
3723bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        statOutputFileSize();
3743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
3753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
3763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3773bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "<<\n");
3783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/N 3\n");
3803bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Alternate /DeviceRGB\n");
3823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3833bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Length %u\n", ADOBE_RGB_SIZE + 1);
3843bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3853bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Filter /FlateDecode\n");
3863bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, ">>\n");
3883bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3893bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "stream\n");
3903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
3913bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3923bf66744d61d18c66d46f2608de0467ad3df0268Mopria        FILE *inFile;
3933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!(inFile = fopen("flate_colorspace.bin", "rb"))) {
3943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            fprintf(stderr, "can't open %s\n", "flate_colorspace.bin");
3953bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return 0;
3963bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
3973bf66744d61d18c66d46f2608de0467ad3df0268Mopria
3983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *buffIn = (unsigned char *) malloc(ADOBE_RGB_SIZE);
3993bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(buffIn);
4003bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4013bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 bytesRead = fread(buffIn, 1, ADOBE_RGB_SIZE, inFile);
4023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(bytesRead == ADOBE_RGB_SIZE);
4033bf66744d61d18c66d46f2608de0467ad3df0268Mopria        fclose(inFile);
4043bf66744d61d18c66d46f2608de0467ad3df0268Mopria        write2Buff(buffIn, bytesRead);
4053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (buffIn) {
4063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(buffIn);
4073bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
4083bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4093bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "\nendstream\n");
4103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4113bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "endobj\n");
4123bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4143bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    adobeRGBCS_firstTime = false;
4163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
4173bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
4183bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4193bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::colorConvertSource(colorSpaceDisposition srcCS, colorSpaceDisposition dstCS,
4203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *strip, sint32 stripWidth, sint32 stripHeight) {
4213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (srcCS == deviceRGB && dstCS == grayScale) {
4223bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Do an inplace conversion from RGB -> 8 bpp gray
4233bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *srcPtr = strip;
4243bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *dstPtr = strip;
4253bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (int h = 0; h < stripHeight; h++) {
4263bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (int w = 0; w < stripWidth; w++, dstPtr++, srcPtr += 3) {
4273bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *dstPtr = (ubyte) rgb_2_gray(*srcPtr, *(srcPtr + 1), *(srcPtr + 2));
4283bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
4293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
4303bf66744d61d18c66d46f2608de0467ad3df0268Mopria        dstNumComponents = 1;
4313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
4323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
4333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4343bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
4363bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
4373bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4383bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::injectRLEStrip(ubyte *RLEBuffer, int numBytes, int imageWidth, int imageHeight,
4393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorSpaceDisposition destColorSpace, bool whiteStrip) {
4403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    bool printedImageTransform = false;
4413bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
4433bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!startXRef) {
4443bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startXRef = xRefIndex;
4453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
4463bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4473bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
4483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        printedImageTransform = true;
4493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4503bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4513bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == adobeRGB) {
4523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectAdobeRGBCS();
4533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4543bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Inject LZ compressed image into PDF file
4563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Strip Stream: RLE Image \n");
4573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
4593bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
4613bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter - 1);
4623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
4633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
4653bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
4663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
4673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4693bf66744d61d18c66d46f2608de0467ad3df0268Mopria
4703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
4713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Width %d\n", imageWidth);
4733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == deviceRGB) {
4753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceRGB\n");
4763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (destColorSpace == adobeRGB) {
4783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace 5 0 R\n");
4793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
4813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceGray\n");
4823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
4833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
4843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Height %d\n", imageHeight);
4853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Filter /RunLengthDecode\n");
4873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Subtype /Image\n");
4893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4903bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Length %d\n", numBytes);
4913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /XObject\n");
4933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/BitsPerComponent 8\n");
4953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
4963bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifdef SUPPORT_WHITE_STRIPS
4973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (whiteStrip) {
4983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /WhiteStrip\n");
4993bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
5013bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /ColorStrip\n");
5023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5043bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
5053bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
5073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "stream\n");
5093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5103bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Write the zlib compressed strip to the PDF output file
5123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    write2Buff(RLEBuffer, numBytes);
5133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "\nendstream\n");
5143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
5163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!printedImageTransform) {
5193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
5203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    endXRef = xRefIndex;
5233bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return (1);
5253bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
5263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5273bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::injectLZStrip(ubyte *LZBuffer, int numBytes, int imageWidth, int imageHeight,
5283bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorSpaceDisposition destColorSpace, bool whiteStrip) {
5293bf66744d61d18c66d46f2608de0467ad3df0268Mopria    bool printedImageTransform = false;
5303bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
5323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!startXRef) {
5333bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startXRef = xRefIndex;
5343bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
5353bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5363bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
5373bf66744d61d18c66d46f2608de0467ad3df0268Mopria        printedImageTransform = true;
5383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5393bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == adobeRGB) {
5413bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectAdobeRGBCS();
5423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5433bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Inject LZ compressed image into PDF file
5453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Strip Stream: zlib Image \n");
5463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
5483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
5503bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter - 1);
5513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
5523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
5543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
5553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
5563bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5583bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
5603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Width %d\n", imageWidth);
5623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == deviceRGB) {
5643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceRGB\n");
5653bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (destColorSpace == adobeRGB) {
5673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace 5 0 R\n");
5683bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
5703bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceGray\n");
5713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Height %d\n", imageHeight);
5743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Filter /FlateDecode\n");
5763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Subtype /Image\n");
5783bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Length %d\n", numBytes);
5803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /XObject\n");
5823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/BitsPerComponent 8\n");
5843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5853bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifdef SUPPORT_WHITE_STRIPS
5863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (whiteStrip) {
5873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /WhiteStrip\n");
5883bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
5903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /ColorStrip\n");
5913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
5923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
5933bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
5943bf66744d61d18c66d46f2608de0467ad3df0268Mopria
5953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
5963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "stream\n");
5983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
5993bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Write the zlib compressed strip to the PDF output file
6013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    write2Buff(LZBuffer, numBytes);
6023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "\nendstream\n");
6033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
6053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6063bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!printedImageTransform) {
6083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
6093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6103bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    endXRef = xRefIndex;
6123bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return (1);
6143bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
6153bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6163bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::injectImageTransform() {
6173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char str[512];
6183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int strLength;
6193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(str, "q /image Do Q\n");
6203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    strLength = strlen(str);
6213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Output image transformation information
6233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: Object - Image Transformation \n");
6243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
6263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
6273bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter + 1);
6283bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
6293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
6313bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
6323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
6333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
6363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Length %d\n", strLength);
6383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
6403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6413bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "stream\n");
6423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%s", str);
6443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endstream\n");
6463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
6483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6493bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
6503bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6513bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::injectJPEG(char *jpeg_Buff, int imageWidth, int imageHeight, int numCompBytes,
6523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorSpaceDisposition destColorSpace, bool whiteStrip) {
6533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char str[512];
6543bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    bool printedImageTransform = false;
6563bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
6583bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!startXRef) {
6593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startXRef = xRefIndex;
6603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
6613bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
6633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        printedImageTransform = true;
6643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    yPosition += imageHeight;
6673bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == adobeRGB) {
6693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectAdobeRGBCS();
6703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
6723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Inject PDF JPEG into output file
6733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Strip Stream: jpeg Image \n");
6743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
6763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
6773bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter - 1);
6783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
6793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
6813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%ld 0 obj\n", objCounter);
6823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        objCounter++;
6833bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
6863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Width %d\n", imageWidth);
6883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
6893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == deviceRGB) {
6903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceRGB\n");
6913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (destColorSpace == adobeRGB) {
6933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace 5 0 R\n");
6943bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
6963bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/ColorSpace /DeviceGray\n");
6973bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
6983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
6993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Height %d\n", imageHeight);
7003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Filter /DCTDecode\n");
7023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Subtype /Image\n");
7043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Length %d\n", numCompBytes);
7063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /XObject\n");
7083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/BitsPerComponent 8\n");
7103bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7113bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifdef SUPPORT_WHITE_STRIPS
7123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (whiteStrip) {
7133bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /WhiteStrip\n");
7143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
7153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
7163bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/Name /ColorStrip\n");
7173bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
7183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
7193bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
7203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
7213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "stream\n");
7233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7243bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    write2Buff((ubyte *) jpeg_Buff, numCompBytes);
7263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "\nendstream\n");
7273bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
7293bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7303bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(str, "q /image Do Q\n");
7323bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!printedImageTransform) {
7343bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectImageTransform();
7353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
7363bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    endXRef = xRefIndex;
7383bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return (1);
7403bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
7413bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7423bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
7433bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Writes str to buffer if the size of buffer is less than TEMP_BUFF_SIZE
7443bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
7453bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid writeStr2Buff(char *buffer, char *str) {
7463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int buffSize;
7473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char *buffPos;
7483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    buffSize = strlen(buffer) + strlen(str);
7503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (buffSize > TEMP_BUFF_SIZE) {
7513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
7523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
7533bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    buffSize = strlen(buffer);
7553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    buffPos = buffer + buffSize;
7563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(buffPos, "%s", str);
7573bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    buffSize = strlen(buffer);
7593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (buffSize > TEMP_BUFF_SIZE) {
7603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        printf("tempBuff size exceeded: buffSize=%d\n", buffSize);
7613bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
7623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
7633bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
7643bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7653bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::writePDFGrammarPage(int imageWidth, int imageHeight, int numStrips,
7663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorSpaceDisposition destColorSpace) {
7673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int i, imageRef = objCounter + 2, buffSize;
7683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int yAnchor;
7693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char str[512];
7703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char *tempBuffer;
7713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int startImageIndex = 0;
7723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int numLinesLeft = 0;
7733bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == adobeRGB && 1 == pageCount) {
7753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        imageRef += 2; // Add 2 for AdobeRGB
7763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
7773bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7783bf66744d61d18c66d46f2608de0467ad3df0268Mopria    tempBuffer = (char *) malloc(TEMP_BUFF_SIZE);
7793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    assert(tempBuffer);
7803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    memset(tempBuffer, 0x0, TEMP_BUFF_SIZE);
7813bf66744d61d18c66d46f2608de0467ad3df0268Mopria
7823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Object 3 - page object\n");
7833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
7853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%ld 0 obj\n", objCounter);
7863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    addKids(objCounter);
7883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    objCounter++;
7893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
7903bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Type /Page\n");
7923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Parent %d 0 R\n", PAGES_OBJ_NUMBER);
7943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Resources <<\n");
7963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
7973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // sprintf(pOutStr,"/ProcSet [ /PDF /ImageC ]\n"); writeStr2OutBuff(pOutStr);
7983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/XObject <<\n");
7993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8003bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (topMarginInPix) {
8023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (i = 0; i < numFullInjectedStrips; i++, startImageIndex++) {
8033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/Image%d %d 0 R\n", startImageIndex, imageRef);
8043bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(pOutStr, "%s", str);
8053bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2OutBuff(pOutStr);
8063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            imageRef += 2;
8073bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
8083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (numPartialScanlinesToInject) {
8093bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/Image%d %d 0 R\n", startImageIndex, imageRef);
8103bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(pOutStr, "%s", str);
8113bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2OutBuff(pOutStr);
8123bf66744d61d18c66d46f2608de0467ad3df0268Mopria            imageRef += 2;
8133bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startImageIndex++;
8143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
8153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
8163bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (i = startImageIndex; i < numStrips + startImageIndex; i++) {
8183bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(str, "/Image%d %d 0 R\n", i, imageRef);
8193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // sprintf(pOutStr,"/ImageA 4 0 R /ImageB 6 0 R >>\n"); writeStr2OutBuff(pOutStr);
8203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%s", str);
8213bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
8223bf66744d61d18c66d46f2608de0467ad3df0268Mopria        imageRef += 2;
8233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
8243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
8253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
8273bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currMediaOrientationDisposition == landscapeOrientation) {
8293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        pageOrigin = mediaWidth;
8303bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/MediaBox [ 0 0 %d %d ]\n", mediaHeight, mediaWidth);
8313bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
8323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
8333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        pageOrigin = mediaHeight;
8343bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "/MediaBox [ 0 0 %d %d ]\n", mediaWidth, mediaHeight);
8353bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
8363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
8373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Contents [ %ld 0 R ]\n", objCounter);
8383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8393bf66744d61d18c66d46f2608de0467ad3df0268Mopria#ifdef PIECEINFO_SUPPORTED
8403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr,"/PieceInfo <</HPAddition %d 0 R >> \n",9997); writeStr2OutBuff(pOutStr);
8413bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
8423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
8433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
8453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8463bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Create the FileBody stream first, so we know the Length of the stream
8483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (reverseOrder) {
8493bf66744d61d18c66d46f2608de0467ad3df0268Mopria        yAnchor = 0;
8503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
8513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        yAnchor = (int) ((pageOrigin * STANDARD_SCALE) + 0.99); // Round up
8523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
8533bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Setup the CTM so that we can send device-resolution coordinates
8553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr,
8563bf66744d61d18c66d46f2608de0467ad3df0268Mopria            "%%Image Transformation Matrix: width, skewX, skewY, height, xAnchor, yAnchor\n");
8573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
8583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(str, "%f 0 0 %f 0 0 cm\n", STANDARD_SCALE_FOR_PDF / currRenderResolutionInteger,
8593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            STANDARD_SCALE_FOR_PDF / currRenderResolutionInteger);
8603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2Buff(tempBuffer, str);
8613bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    startImageIndex = 0;
8633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (topMarginInPix) {
8643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (i = 0; i < numFullInjectedStrips; i++) {
8653bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (reverseOrder) {
8663bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor += numFullScanlinesToInject;
8673bf66744d61d18c66d46f2608de0467ad3df0268Mopria            } else {
8683bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor -= numFullScanlinesToInject;
8693bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
8703bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8713bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/P <</MCID 0>> BDC q\n");
8723bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
8733bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8743bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%%Image Transformation Matrix: width, skewX, skewY, height, "
8753bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    "xAnchor, yAnchor\n");
8763bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
8773bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8783bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%d 0 0 %ld 0 %d cm\n", imageWidth * scaleFactor,
8793bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    numFullScanlinesToInject * scaleFactor, yAnchor * scaleFactor);
8803bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
8813bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8823bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/Image%d Do Q\n", startImageIndex);
8833bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
8843bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8853bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startImageIndex++;
8863bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
8873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (numPartialScanlinesToInject) {
8883bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (reverseOrder) {
8893bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor += numPartialScanlinesToInject;
8903bf66744d61d18c66d46f2608de0467ad3df0268Mopria            } else {
8913bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor -= numPartialScanlinesToInject;
8923bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
8933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/P <</MCID 0>> BDC q\n");
8953bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
8963bf66744d61d18c66d46f2608de0467ad3df0268Mopria
8973bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%%Image Transformation Matrix: width, skewX, skewY, height, xAnchor, "
8983bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    "yAnchor\n");
8993bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9013bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9023bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%d 0 0 %ld 0 %d cm\n", imageWidth * scaleFactor,
9033bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    numPartialScanlinesToInject * scaleFactor, yAnchor * scaleFactor);
9043bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9053bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "/Image%d Do Q\n", startImageIndex);
9073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9083bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9093bf66744d61d18c66d46f2608de0467ad3df0268Mopria            startImageIndex++;
9103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
9113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
9123bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (i = startImageIndex; i < numStrips + startImageIndex; i++) {
9143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // last strip may have less lines than currStripHeight. Update yAnchor using left over lines
9153bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (i == (numStrips + startImageIndex - 1)) {
9163bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numLinesLeft = currSourceHeight - ((numStrips - 1) * currStripHeight);
9173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9183bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (reverseOrder) {
9193bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor += numLinesLeft;
9203bf66744d61d18c66d46f2608de0467ad3df0268Mopria            } else {
9213bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor -= numLinesLeft;
9223bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
9233bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
9243bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (reverseOrder) {
9253bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor += currStripHeight;
9263bf66744d61d18c66d46f2608de0467ad3df0268Mopria            } else {
9273bf66744d61d18c66d46f2608de0467ad3df0268Mopria                yAnchor -= currStripHeight;
9283bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
9293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
9303bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9313bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(str, "/P <</MCID 0>> BDC q\n");
9323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2Buff(tempBuffer, str);
9333bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9343bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(str,
9353bf66744d61d18c66d46f2608de0467ad3df0268Mopria                "%%Image Transformation Matrix: width, skewX, skewY, height, xAnchor, yAnchor\n");
9363bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2Buff(tempBuffer, str);
9373bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9383bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // last strip may have less lines than currStripHeight
9393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (i == (numStrips + startImageIndex - 1)) {
9403bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%d 0 0 %d 0 %d cm\n", imageWidth * scaleFactor,
9413bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    numLinesLeft * scaleFactor, yAnchor * scaleFactor);
9423bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9433bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else if (yAnchor < 0) {
9443bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 newH = currStripHeight + yAnchor;
9453bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%d 0 0 %ld 0 %d cm\n", imageWidth * scaleFactor, newH * scaleFactor,
9463bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    0 * scaleFactor);
9473bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
9493bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sprintf(str, "%d 0 0 %ld 0 %d cm\n", imageWidth * scaleFactor,
9503bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    currStripHeight * scaleFactor, yAnchor * scaleFactor);
9513bf66744d61d18c66d46f2608de0467ad3df0268Mopria            writeStr2Buff(tempBuffer, str);
9523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
9533bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(str, "/Image%d Do Q\n", i);
9553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2Buff(tempBuffer, str);
9563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
9573bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Resulting buffer size
9593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    buffSize = strlen(tempBuffer);
9603bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= PCLm: FileBody: Page Content Stream object\n");
9623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    statOutputFileSize();
9643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%ld 0 obj\n", objCounter);
9653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "<<\n");
9673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9683bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "/Length %d\n", buffSize);
9703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, ">>\n");
9723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "stream\n");
9743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9753bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Now write the FileBody stream
9773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    write2Buff((ubyte *) tempBuffer, buffSize);
9783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endstream\n");
9803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "endobj\n");
9823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
9833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    objCounter++;
9843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (tempBuffer) {
9853bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(tempBuffer);
9863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
9873bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
9883bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9893bf66744d61d18c66d46f2608de0467ad3df0268Mopria/*
9903bf66744d61d18c66d46f2608de0467ad3df0268Mopria * Mirrors the source image in preparation for backside duplex support
9913bf66744d61d18c66d46f2608de0467ad3df0268Mopria */
9923bf66744d61d18c66d46f2608de0467ad3df0268Mopriastatic bool prepImageForBacksideDuplex(ubyte *imagePtr, sint32 imageHeight, sint32 imageWidth,
9933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 numComponents) {
9943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sint32 numBytes = imageHeight * imageWidth * numComponents;
9953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *head, *tail, t0, t1, t2;
9963bf66744d61d18c66d46f2608de0467ad3df0268Mopria
9973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (numComponents == 3) {
9983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (head = imagePtr, tail = imagePtr + numBytes - 1; tail > head;) {
9993bf66744d61d18c66d46f2608de0467ad3df0268Mopria            t0 = *head;
10003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            t1 = *(head + 1);
10013bf66744d61d18c66d46f2608de0467ad3df0268Mopria            t2 = *(head + 2);
10023bf66744d61d18c66d46f2608de0467ad3df0268Mopria
10033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *head = *(tail - 2);
10043bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(head + 1) = *(tail - 1);
10053bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(head + 2) = *(tail - 0);
10063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *tail = t2;
10073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(tail - 1) = t1;
10083bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *(tail - 2) = t0;
10093bf66744d61d18c66d46f2608de0467ad3df0268Mopria
10103bf66744d61d18c66d46f2608de0467ad3df0268Mopria            head += 3;
10113bf66744d61d18c66d46f2608de0467ad3df0268Mopria            tail -= 3;
10123bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
10133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
10143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        for (head = imagePtr, tail = imagePtr + numBytes; tail > head;) {
10153bf66744d61d18c66d46f2608de0467ad3df0268Mopria            t0 = *head;
10163bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *head = *tail;
10173bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *tail = t0;
10183bf66744d61d18c66d46f2608de0467ad3df0268Mopria            head++;
10193bf66744d61d18c66d46f2608de0467ad3df0268Mopria            tail--;
10203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
10213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
10223bf66744d61d18c66d46f2608de0467ad3df0268Mopria//origTail++;
10233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
10243bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
10253bf66744d61d18c66d46f2608de0467ad3df0268Mopria
10263bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::getInputBinString(jobInputBin bin, char *returnStr) {
10273bf66744d61d18c66d46f2608de0467ad3df0268Mopria    returnStr[0] = '\0';
10283bf66744d61d18c66d46f2608de0467ad3df0268Mopria
10293bf66744d61d18c66d46f2608de0467ad3df0268Mopria    switch (bin) {
10303bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case alternate:
10313bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "alternate");
10323bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case alternate_roll:
10343bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "alternate_roll");
10353bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10363bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case auto_select:
10373bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "auto_select");
10383bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case bottom:
10403bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "bottom");
10413bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10423bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case center:
10433bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "center");
10443bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case disc:
10463bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "disc");
10473bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case envelope:
10493bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "envelope");
10503bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case hagaki:
10523bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "hagaki");
10533bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case large_capacity:
10553bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "large_capacity");
10563bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case left:
10583bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "left");
10593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case main_tray:
10613bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "main_tray");
10623bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case main_roll:
10643bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "main_roll");
10653bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case manual:
10673bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "manual");
10683bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case middle:
10703bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "middle");
10713bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10723bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case photo:
10733bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "photo");
10743bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case rear:
10763bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "rear");
10773bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case right:
10793bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "right");
10803bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case side:
10823bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "side");
10833bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10843bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case top:
10853bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "top");
10863bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_1:
10883bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_1");
10893bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_2:
10913bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_2");
10923bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10933bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_3:
10943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_3");
10953bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10963bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_4:
10973bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_4");
10983bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
10993bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_5:
11003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_5");
11013bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_N:
11033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_N");
11043bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        default:
11063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            assert(0);
11073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
11093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
11103bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
11113bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11123bf66744d61d18c66d46f2608de0467ad3df0268Mopriabool PCLmGenerator::getOutputBin(jobOutputBin bin, char *returnStr) {
11133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (returnStr) {
11143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        returnStr[0] = '\0';
11153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
11163bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    switch (bin) {
11183bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case top_output:
11193bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "top_output");
11203bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11213bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case middle_output:
11223bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "middle_output");
11233bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11243bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case bottom_output:
11253bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "bottom_output");
11263bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11273bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case side_output:
11283bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "side_output");
11293bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11303bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case center_output:
11313bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "center_output");
11323bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case rear_output:
11343bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "rear_output");
11353bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11363bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case face_up:
11373bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "face_up");
11383bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case face_down:
11403bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "face_down");
11413bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11423bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case large_capacity_output:
11433bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "large_capacity_output");
11443bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case stacker_N:
11463bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "stacker_N");
11473bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case mailbox_N:
11493bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "mailbox_N");
11503bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_1_output:
11523bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_1_output");
11533bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_2_output:
11553bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_2_output");
11563bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_3_output:
11583bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_3_output");
11593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        case tray_4_output:
11613bf66744d61d18c66d46f2608de0467ad3df0268Mopria            strcpy(returnStr, "tray_4_output");
11623bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        default:
11643bf66744d61d18c66d46f2608de0467ad3df0268Mopria            assert(0);
11653bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;
11663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
11673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return true;
11683bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
11693bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11703bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::writeJobTicket() {
11713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Write JobTicket
11723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char inputBin[256];
11733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    char outputBin[256];
11743bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!m_pPCLmSSettings) {
11763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return;
11773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
11783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    getInputBinString(m_pPCLmSSettings->userInputBin, &inputBin[0]);
11803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    getOutputBin(m_pPCLmSSettings->userOutputBin, &outputBin[0]);
11813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    strcpy(inputBin, inputBin);
11823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    strcpy(outputBin, outputBin);
11833bf66744d61d18c66d46f2608de0467ad3df0268Mopria
11843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%  genPCLm (Ver: %f)\n", PCLM_Ver);
11853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%============= Job Ticket =============\n");
11873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%  PCLmS-Job-Ticket\n");
11893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11903bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      job-ticket-version: 0.1\n");
11913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      epcl-version: 1.01\n");
11933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%    JobSection\n");
11953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      job-id: xxx\n");
11973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
11983bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%    MediaHandlingSection\n");
11993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      media-size-name: %s\n", currMediaName);
12013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12023bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      media-type: %s\n", m_pPCLmSSettings->userMediaType);
12033bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      media-source: %s\n", inputBin);
12053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      sides: xxx\n");
12073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      output-bin: %s\n", outputBin);
12093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12103bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%    RenderingSection\n");
12113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12123bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currCompressionDisposition == compressDCT) {
12133bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      pclm-compression-method: JPEG\n");
12143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (currCompressionDisposition == compressFlate) {
12163bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      pclm-compression-method: FLATE\n");
12173bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
12193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      pclm-compression-method: RLE\n");
12203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
12223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      strip-height: %ld\n", currStripHeight);
12233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12243bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == deviceRGB) {
12263bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      print-color-mode: deviceRGB\n");
12273bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12283bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (destColorSpace == adobeRGB) {
12293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      print-color-mode: adobeRGB\n");
12303bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (destColorSpace == grayScale) {
12323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      print-color-mode: gray\n");
12333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
12353bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      print-quality: %d\n", m_pPCLmSSettings->userPageQuality);
12373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      printer-resolution: %d\n", currRenderResolutionInteger);
12393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      print-content-optimized: xxx\n");
12413bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      orientation-requested: %d\n", m_pPCLmSSettings->userOrientation);
12433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12443bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (PCLmSSettings.userCopies == 0) {
12463bf66744d61d18c66d46f2608de0467ad3df0268Mopria        PCLmSSettings.userCopies = 1;
12473bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
12483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      copies: %d\n", m_pPCLmSSettings->userCopies);
12503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12513bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%      pclm-raster-back-side: xxx\n");
12523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currRenderResolutionInteger) {
12543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      margins-pre-applied: TRUE\n");
12553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12563bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
12573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sprintf(pOutStr, "%%      margins-pre-applied: FALSE\n");
12583bf66744d61d18c66d46f2608de0467ad3df0268Mopria        writeStr2OutBuff(pOutStr);
12593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
12603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%  PCLmS-Job-Ticket-End\n");
12613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12623bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
12633bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12643bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::writePDFGrammarHeader() {
12653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // sprintf(pOutStr,"%%============= PCLm: File Header \n"); writeStr2OutBuff(pOutStr);
12663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%PDF-1.7\n");
12673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sprintf(pOutStr, "%%PCLm 1.0\n");
12693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeStr2OutBuff(pOutStr);
12703bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
12713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12723bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::RLEEncodeImage(ubyte *in, ubyte *out, int inLength) {
12733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *imgPtr = in;
12743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *endPtr = in + inLength;
12753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *origOut = out;
12763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte c;
12773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sint32 cnt = 0;
12783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    while (imgPtr < endPtr) {
12803bf66744d61d18c66d46f2608de0467ad3df0268Mopria        c = *imgPtr++;
12813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        cnt = 1;
12823bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12833bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Figure out how many repeating bytes are in the image
12843bf66744d61d18c66d46f2608de0467ad3df0268Mopria        while (*imgPtr == c && cnt < inLength) {
12853bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (imgPtr > endPtr) {
12863bf66744d61d18c66d46f2608de0467ad3df0268Mopria                break;
12873bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
12883bf66744d61d18c66d46f2608de0467ad3df0268Mopria            cnt++;
12893bf66744d61d18c66d46f2608de0467ad3df0268Mopria            imgPtr++;
12903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
12913bf66744d61d18c66d46f2608de0467ad3df0268Mopria
12923bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (cnt > 1) {
12933bf66744d61d18c66d46f2608de0467ad3df0268Mopria            /* If cnt > 1, then output repeating byte specification
12943bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * The syntax is "byte-count repeateByte", where byte-count is 257-byte-count.
12953bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * Since the cnt value is a byte, if the repeateCnt is > 128 then we need to put
12963bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * out multiple repeat-blocks (Referred to as method 1) range is 128-256
12973bf66744d61d18c66d46f2608de0467ad3df0268Mopria             */
12983bf66744d61d18c66d46f2608de0467ad3df0268Mopria            while (cnt > 128) {
12993bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = 129; // i.e. 257-129==128
13003bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = c;
13013bf66744d61d18c66d46f2608de0467ad3df0268Mopria                cnt -= 128;
13023bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // Now handle the repeats that are < 128
13043bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (cnt) {
13053bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = (257 - cnt); // i.e. cnt==2: 257-255=2
13063bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = c;
13073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
13093bf66744d61d18c66d46f2608de0467ad3df0268Mopria            /* If cnt==1, then this is a literal run - no repeating bytes found.
13103bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * The syntax is "byte-count literal-run", where byte-count is < 128 and
13113bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * literal-run is the non-repeating bytes of the input stream.
13123bf66744d61d18c66d46f2608de0467ad3df0268Mopria             * Referred to as method 2, range is 0-127
13133bf66744d61d18c66d46f2608de0467ad3df0268Mopria             */
13143bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte *start, *p;
13153bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 i;
13163bf66744d61d18c66d46f2608de0467ad3df0268Mopria            start = (imgPtr - 1);  // The first byte of the literal run
13173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13183bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // Now find the end of the literal run
13193bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (cnt = 1, p = start; *p != *imgPtr; p++, imgPtr++, cnt++) {
13203bf66744d61d18c66d46f2608de0467ad3df0268Mopria                if (imgPtr >= endPtr) break;
13213bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13223bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (!(imgPtr == endPtr)) {
13233bf66744d61d18c66d46f2608de0467ad3df0268Mopria                imgPtr--;
13243bf66744d61d18c66d46f2608de0467ad3df0268Mopria                // imgPtr incremented 1 too many
13253bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13263bf66744d61d18c66d46f2608de0467ad3df0268Mopria            cnt--;
13273bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // Blocks of literal bytes can't exceed 128 bytes, so output multiple
13283bf66744d61d18c66d46f2608de0467ad3df0268Mopria            //    literal-run blocks if > 128
13293bf66744d61d18c66d46f2608de0467ad3df0268Mopria            while (cnt > 128) {
13303bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = 127;
13313bf66744d61d18c66d46f2608de0467ad3df0268Mopria                for (i = 0; i < 128; i++) {
13323bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    *out++ = *start++;
13333bf66744d61d18c66d46f2608de0467ad3df0268Mopria                }
13343bf66744d61d18c66d46f2608de0467ad3df0268Mopria                cnt -= 128;
13353bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13363bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // Now output the leftover literal run
13373bf66744d61d18c66d46f2608de0467ad3df0268Mopria            *out++ = cnt - 1;
13383bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (i = 0; i < cnt; i++) {
13393bf66744d61d18c66d46f2608de0467ad3df0268Mopria                *out++ = *start++;
13403bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
13413bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
13423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
13433bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Now, write the end-of-compression marker (byte 128) into the output stream
13443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *out++ = 128;
13453bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Return the compressed size
13463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return ((int) (out - origOut));
13473bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
13483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13493bf66744d61d18c66d46f2608de0467ad3df0268MopriaPCLmGenerator::PCLmGenerator() {
13503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    strcpy(currMediaName, "LETTER");
13513bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currDuplexDisposition = simplex;
13523bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currCompressionDisposition = compressDCT;
13533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currMediaOrientationDisposition = portraitOrientation;
13543bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currRenderResolution = res600;
13553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currStripHeight = STRIP_HEIGHT;
13563bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Default media h/w to letter specification
13583bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaWidthInPixels = 0;
13593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaHeightInPixels = 0;
13603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaWidth = 612;
13613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaHeight = 792;
13623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    destColorSpace = deviceRGB;
13633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    sourceColorSpace = deviceRGB;
13643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    scaleFactor = 1;
13653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    jobOpen = job_closed;
13663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    scratchBuffer = NULL;
13673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    pageCount = 0;
13683bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currRenderResolutionInteger = 600;
13703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    STANDARD_SCALE = (float) currRenderResolutionInteger / (float) STANDARD_SCALE_FOR_PDF;
13713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    yPosition = 0;
13723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    numKids = 0;
13733bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // XRefTable storage
13753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefIndex = 0;
13763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefStart = 0;
13773bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13783bf66744d61d18c66d46f2608de0467ad3df0268Mopria    objCounter = PAGES_OBJ_NUMBER + 1;
13793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    totalBytesWrittenToPCLmFile = 0;
13803bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Initialize first index in xRefTable
13823bf66744d61d18c66d46f2608de0467ad3df0268Mopria    xRefTable = NULL;
13833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    KidsArray = NULL;
13843bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Initialize the output Buffer
13863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    allocatedOutputBuffer = NULL;
13873bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Initialize the leftover scanline logic
13893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    leftoverScanlineBuffer = 0;
13903bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    adobeRGBCS_firstTime = true;
13923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mirrorBackside = true;
13933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    topMarginInPix = 0;
13953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    leftMarginInPix = 0;
13963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    m_pPCLmSSettings = NULL;
13973bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
13983bf66744d61d18c66d46f2608de0467ad3df0268Mopria
13993bf66744d61d18c66d46f2608de0467ad3df0268MopriaPCLmGenerator::~PCLmGenerator() {
14003bf66744d61d18c66d46f2608de0467ad3df0268Mopria    Cleanup();
14013bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
14023bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14033bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::StartJob(void **pOutBuffer, int *iOutBufferSize) {
14043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    /* Allocate the output buffer; we don't know much at this point, so make the output buffer size
14053bf66744d61d18c66d46f2608de0467ad3df0268Mopria     * the worst case dimensions; when we get a startPage, we will resize it appropriately
14063bf66744d61d18c66d46f2608de0467ad3df0268Mopria     */
14073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    outBuffSize = DEFAULT_OUTBUFF_SIZE;
14083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = outBuffSize;
14093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *pOutBuffer = (ubyte *) malloc(outBuffSize); // This multipliy by 10 needs to be removed...
14103bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (NULL == *pOutBuffer) {
14123bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return (errorOutAndCleanUp());
14133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14143bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currOutBuffSize = outBuffSize;
14163bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (NULL == *pOutBuffer) {
14183bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return (errorOutAndCleanUp());
14193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14203bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14213bf66744d61d18c66d46f2608de0467ad3df0268Mopria    allocatedOutputBuffer = *pOutBuffer;
14223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    initOutBuff((char *) *pOutBuffer, outBuffSize);
14233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writePDFGrammarHeader();
14243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = totalBytesWrittenToCurrBuff;
14253bf66744d61d18c66d46f2608de0467ad3df0268Mopria    jobOpen = job_open;
14263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14273bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return success;
14283bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
14293bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14303bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::EndJob(void **pOutBuffer, int *iOutBufferSize) {
14313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (NULL == allocatedOutputBuffer) {
14323bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return (errorOutAndCleanUp());
14333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14343bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *pOutBuffer = allocatedOutputBuffer;
14363bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    initOutBuff((char *) *pOutBuffer, outBuffSize);
14383bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14393bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Write PDF trailer
14403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writePDFGrammarTrailer(currSourceWidth, currSourceHeight);
14413bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = totalBytesWrittenToCurrBuff;
14433bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    jobOpen = job_closed;
14453bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (xRefTable) {
14473bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(xRefTable);
14483bf66744d61d18c66d46f2608de0467ad3df0268Mopria        xRefTable = NULL;
14493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14503bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (KidsArray) {
14513bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(KidsArray);
14523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        KidsArray = NULL;
14533bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14543bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14553bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return success;
14563bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
14573bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14583bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::StartPage(PCLmPageSetup *PCLmPageContent, void **pOutBuffer,
14593bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int *iOutBufferSize) {
14603bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int numImageStrips;
14613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Save the resolution information
14623bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currRenderResolution = PCLmPageContent->destinationResolution;
14633bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14643bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *pOutBuffer = allocatedOutputBuffer;
14653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14663bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currRenderResolution == res300) {
14673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        currRenderResolutionInteger = 300;
14683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (currRenderResolution == res600) {
14693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        currRenderResolutionInteger = 600;
14703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (currRenderResolution == res1200) {
14713bf66744d61d18c66d46f2608de0467ad3df0268Mopria        currRenderResolutionInteger = 1200;
14723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
14733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
14743bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
14753bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Recalculate STANDARD_SCALE to reflect the job resolution
14773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    STANDARD_SCALE = (float) currRenderResolutionInteger / (float) STANDARD_SCALE_FOR_PDF;
14783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Use the values set by the caller
14803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currSourceWidth = PCLmPageContent->SourceWidthPixels;
14813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currSourceHeight = PCLmPageContent->SourceHeightPixels;
14823bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Save off the media information
14843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaWidth = (int) (PCLmPageContent->mediaWidth);
14853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaHeight = (int) (PCLmPageContent->mediaHeight);
14863bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14873bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Use the values set by the caller
14883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaWidthInPixels = PCLmPageContent->mediaWidthInPixels;
14893bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mediaHeightInPixels = PCLmPageContent->mediaHeightInPixels;
14903bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    topMarginInPix = (int) (((PCLmPageContent->mediaHeightOffset / STANDARD_SCALE_FOR_PDF) *
14923bf66744d61d18c66d46f2608de0467ad3df0268Mopria            currRenderResolutionInteger) + 0.50);
14933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    leftMarginInPix = (int) (((PCLmPageContent->mediaWidthOffset / STANDARD_SCALE_FOR_PDF) *
14943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            currRenderResolutionInteger) + 0.50);
14953bf66744d61d18c66d46f2608de0467ad3df0268Mopria
14963bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (topMarginInPix % 16) {
14973bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Round to nearest 16 scanline boundary to ensure decompressability.
14983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int i = topMarginInPix % 16;
14993bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (i < (16 / 2)) {
15003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            topMarginInPix -= i;
15013bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
15023bf66744d61d18c66d46f2608de0467ad3df0268Mopria            topMarginInPix += (16 - i);
15033bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
15043bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15053bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15063bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (leftMarginInPix % 16) {
15073bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Round to nearest 16 scanline boundary to ensure decompressability.
15083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int i = leftMarginInPix % 16;
15093bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (i < (16 / 2)) {
15103bf66744d61d18c66d46f2608de0467ad3df0268Mopria            leftMarginInPix -= i;
15113bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
15123bf66744d61d18c66d46f2608de0467ad3df0268Mopria            leftMarginInPix += (16 - i);
15133bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
15143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15153bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currCompressionDisposition = PCLmPageContent->compTypeRequested;
15173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (strlen(PCLmPageContent->mediaSizeName)) {
15193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        strcpy(currMediaName, PCLmPageContent->mediaSizeName);
15203bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currStripHeight = PCLmPageContent->stripHeight;
15233bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!currStripHeight) {
15243bf66744d61d18c66d46f2608de0467ad3df0268Mopria        numImageStrips = 1;
15253bf66744d61d18c66d46f2608de0467ad3df0268Mopria        currStripHeight = currSourceHeight;
15263bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
15273bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Need to know how many strips will be inserted into PDF file
15283bf66744d61d18c66d46f2608de0467ad3df0268Mopria        float numImageStripsReal = ceil((float) currSourceHeight / (float) currStripHeight);
15293bf66744d61d18c66d46f2608de0467ad3df0268Mopria        numImageStrips = (int) numImageStripsReal;
15303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15313bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (PCLmPageContent->srcColorSpaceSpefication == grayScale) {
15333bf66744d61d18c66d46f2608de0467ad3df0268Mopria        srcNumComponents = 1;
15343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
15353bf66744d61d18c66d46f2608de0467ad3df0268Mopria        srcNumComponents = 3;
15363bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15373bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15383bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (PCLmPageContent->dstColorSpaceSpefication == grayScale) {
15393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        dstNumComponents = 1;
15403bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
15413bf66744d61d18c66d46f2608de0467ad3df0268Mopria        dstNumComponents = 3;
15423bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15433bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15443bf66744d61d18c66d46f2608de0467ad3df0268Mopria    currDuplexDisposition = PCLmPageContent->duplexDisposition;
15453bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15463bf66744d61d18c66d46f2608de0467ad3df0268Mopria    destColorSpace = PCLmPageContent->dstColorSpaceSpefication;
15473bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15483bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Calculate how large the output buffer needs to be based upon the page specifications
15493bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int tmp_outBuffSize = mediaWidthInPixels * currStripHeight * dstNumComponents;
15503bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15513bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (tmp_outBuffSize > currOutBuffSize) {
15523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Realloc the pOutBuffer to the correct size
15533bf66744d61d18c66d46f2608de0467ad3df0268Mopria        *pOutBuffer = realloc(*pOutBuffer, tmp_outBuffSize);
15543bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (*pOutBuffer == NULL) {
15563bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // realloc failed and prev buffer not freed
15573bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return errorOutAndCleanUp();
15583bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
15593bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        outBuffSize = currOutBuffSize = tmp_outBuffSize;
15613bf66744d61d18c66d46f2608de0467ad3df0268Mopria        allocatedOutputBuffer = *pOutBuffer;
15623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (NULL == allocatedOutputBuffer) {
15633bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return (errorOutAndCleanUp());
15643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
15653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15663bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    initOutBuff((char *) *pOutBuffer, outBuffSize);
15683bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Keep track of the page count
15703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    pageCount++;
15713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // If we are on a backside and doing duplex, prep for reverse strip order
15733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2) && mirrorBackside) {
15743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        reverseOrder = true;
15753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
15763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        reverseOrder = false;
15773bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15783bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15793bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Calculate the number of injected strips, if any
15803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (topMarginInPix) {
15813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (topMarginInPix <= currStripHeight) {
15823bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numFullInjectedStrips = 1;
15833bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numFullScanlinesToInject = topMarginInPix;
15843bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numPartialScanlinesToInject = 0;
15853bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
15863bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numFullInjectedStrips = topMarginInPix / currStripHeight;
15873bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numFullScanlinesToInject = currStripHeight;
15883bf66744d61d18c66d46f2608de0467ad3df0268Mopria            numPartialScanlinesToInject =
15893bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    topMarginInPix - (numFullInjectedStrips * currStripHeight);
15903bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
15913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
15923bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15933bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writeJobTicket();
15943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    writePDFGrammarPage(mediaWidthInPixels, mediaHeightInPixels, numImageStrips, destColorSpace);
15953bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = totalBytesWrittenToCurrBuff;
15963bf66744d61d18c66d46f2608de0467ad3df0268Mopria
15973bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (!scratchBuffer) {
15983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // We need to pad the scratchBuffer size to allow for compression expansion (RLE can create
15993bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // compressed segments that are slightly larger than the source.
16003bf66744d61d18c66d46f2608de0467ad3df0268Mopria        size_t len = (size_t) currStripHeight * mediaWidthInPixels * srcNumComponents * 2;
16013bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scratchBuffer = (ubyte *) malloc(len);
16023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!scratchBuffer) {
16033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return errorOutAndCleanUp();
16043bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
16053bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
16063bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    mirrorBackside = PCLmPageContent->mirrorBackside;
16083bf66744d61d18c66d46f2608de0467ad3df0268Mopria    firstStrip = true;
16093bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16103bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return success;
16113bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
16123bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16133bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::EndPage(void **pOutBuffer, int *iOutBufferSize) {
16143bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *pOutBuffer = allocatedOutputBuffer;
16153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    initOutBuff((char *) *pOutBuffer, outBuffSize);
16163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = totalBytesWrittenToCurrBuff;
16173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    // Free up the scratchbuffer at endpage, to allow the next page to have a different size
16193bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (scratchBuffer) {
16203bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(scratchBuffer);
16213bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scratchBuffer = NULL;
16223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
16233bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return success;
16253bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
16263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16273bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::Encapsulate(void *pInBuffer, int inBufferSize, int thisHeight,
16283bf66744d61d18c66d46f2608de0467ad3df0268Mopria        void **pOutBuffer, int *iOutBufferSize) {
16293bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int numCompBytes;
16303bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int scanlineWidth = mediaWidthInPixels * srcNumComponents;
16313bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int numLinesThisCall = thisHeight;
16323bf66744d61d18c66d46f2608de0467ad3df0268Mopria    void *savedInBufferPtr = NULL;
16333bf66744d61d18c66d46f2608de0467ad3df0268Mopria    void *tmpBuffer = NULL;
16343bf66744d61d18c66d46f2608de0467ad3df0268Mopria    void *localInBuffer;
16353bf66744d61d18c66d46f2608de0467ad3df0268Mopria    ubyte *newStripPtr = NULL;
16363bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16373bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (leftoverScanlineBuffer) {
16383bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *whereAreWe;
16393bf66744d61d18c66d46f2608de0467ad3df0268Mopria        sint32 scanlinesThisTime;
16403bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // The leftover scanlines have already been processed (color-converted and flipped), so
16413bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // just put them into the output buffer.
16423bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16433bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Allocate a temporary buffer to copy leftover and new data into
16443bf66744d61d18c66d46f2608de0467ad3df0268Mopria        tmpBuffer = malloc(scanlineWidth * currStripHeight);
16453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!tmpBuffer) {
16463bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return (errorOutAndCleanUp());
16473bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
16483bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16493bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Copy leftover scanlines into tmpBuffer
16503bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memcpy(tmpBuffer, leftoverScanlineBuffer, scanlineWidth * numLeftoverScanlines);
16513bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        whereAreWe = (ubyte *) tmpBuffer + (scanlineWidth * numLeftoverScanlines);
16533bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scanlinesThisTime = currStripHeight - numLeftoverScanlines;
16553bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16563bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Copy enough scanlines from the real inBuffer to fill out the tmpBuffer
16573bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memcpy(whereAreWe, pInBuffer, scanlinesThisTime * scanlineWidth);
16583bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16593bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Now copy the remaining scanlines from pInBuffer to the leftoverBuffer
16603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        numLeftoverScanlines = thisHeight - scanlinesThisTime;
16613bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(leftoverScanlineBuffer);
16623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        whereAreWe = (ubyte *) pInBuffer + (scanlineWidth * numLeftoverScanlines);
16633bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memcpy(leftoverScanlineBuffer, whereAreWe, scanlineWidth * numLeftoverScanlines);
16643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        numLinesThisCall = thisHeight = currStripHeight;
16653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16663bf66744d61d18c66d46f2608de0467ad3df0268Mopria        savedInBufferPtr = pInBuffer;
16673bf66744d61d18c66d46f2608de0467ad3df0268Mopria        localInBuffer = tmpBuffer;
16683bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
16693bf66744d61d18c66d46f2608de0467ad3df0268Mopria        localInBuffer = pInBuffer;
16703bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
16713bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16723bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (thisHeight > currStripHeight) {
16733bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Copy raw raster into leftoverScanlineBuffer
16743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ubyte *ptr;
16753bf66744d61d18c66d46f2608de0467ad3df0268Mopria        numLeftoverScanlines = thisHeight - currStripHeight;
16763bf66744d61d18c66d46f2608de0467ad3df0268Mopria        leftoverScanlineBuffer = malloc(scanlineWidth * numLeftoverScanlines);
16773bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (!leftoverScanlineBuffer) {
16783bf66744d61d18c66d46f2608de0467ad3df0268Mopria            return (errorOutAndCleanUp());
16793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
16803bf66744d61d18c66d46f2608de0467ad3df0268Mopria        ptr = (ubyte *) localInBuffer + scanlineWidth * numLeftoverScanlines;
16813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        memcpy(leftoverScanlineBuffer, ptr, scanlineWidth * numLeftoverScanlines);
16823bf66744d61d18c66d46f2608de0467ad3df0268Mopria        thisHeight = currStripHeight;
16833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
16843bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16853bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (NULL == allocatedOutputBuffer) {
16863bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (tmpBuffer) {
16873bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(tmpBuffer);
16883bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
16893bf66744d61d18c66d46f2608de0467ad3df0268Mopria        return (errorOutAndCleanUp());
16903bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
16913bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *pOutBuffer = allocatedOutputBuffer;
16923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    initOutBuff((char *) *pOutBuffer, outBuffSize);
16933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
16943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currDuplexDisposition == duplex_longEdge && !(pageCount % 2)) {
16953bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (mirrorBackside) {
16963bf66744d61d18c66d46f2608de0467ad3df0268Mopria            prepImageForBacksideDuplex((ubyte *) localInBuffer, numLinesThisCall, currSourceWidth,
16973bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    srcNumComponents);
16983bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
16993bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
17003bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17013bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (destColorSpace == grayScale &&
17023bf66744d61d18c66d46f2608de0467ad3df0268Mopria            (sourceColorSpace == deviceRGB || sourceColorSpace == adobeRGB)) {
17033bf66744d61d18c66d46f2608de0467ad3df0268Mopria        colorConvertSource(sourceColorSpace, grayScale, (ubyte *) localInBuffer, currSourceWidth,
17043bf66744d61d18c66d46f2608de0467ad3df0268Mopria                numLinesThisCall);
17053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // Adjust the scanline width accordingly
17063bf66744d61d18c66d46f2608de0467ad3df0268Mopria        scanlineWidth = mediaWidthInPixels * dstNumComponents;
17073bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
17083bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (leftMarginInPix) {
17103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        newStripPtr = shiftStripByLeftMargin((ubyte *) localInBuffer, currSourceWidth,
17113bf66744d61d18c66d46f2608de0467ad3df0268Mopria                currStripHeight, numLinesThisCall, mediaWidthInPixels, leftMarginInPix,
17123bf66744d61d18c66d46f2608de0467ad3df0268Mopria                destColorSpace);
17133bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
17143bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17153bf66744d61d18c66d46f2608de0467ad3df0268Mopria    bool whiteStrip = false;
17162e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney#ifdef SUPPORT_WHITE_STRIPS
17172e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney    if (!firstStrip) {
17182e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        // PCLm does not print a blank page if all the strips are marked as "/Name /WhiteStrip"
17192e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        // so only apply /WhiteStrip to strips after the first
17202e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        whiteStrip = isWhiteStrip(pInBuffer, thisHeight * currSourceWidth * srcNumComponents);
17212e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney    }
17223bf66744d61d18c66d46f2608de0467ad3df0268Mopria#endif
17233bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17243bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (currCompressionDisposition == compressDCT) {
17253bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (firstStrip && topMarginInPix) {
17263bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte whitePt = 0xff;
17273bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17283bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte *tmpStrip = (ubyte *) malloc(scanlineWidth * topMarginInPix);
17293bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memset(tmpStrip, whitePt, scanlineWidth * topMarginInPix);
17303bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17313bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (sint32 stripCntr = 0; stripCntr < numFullInjectedStrips; stripCntr++) {
17323bf66744d61d18c66d46f2608de0467ad3df0268Mopria                write_JPEG_Buff(scratchBuffer, JPEG_QUALITY, mediaWidthInPixels,
17333bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        (sint32) numFullScanlinesToInject, tmpStrip, currRenderResolutionInteger,
17343bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        destColorSpace, &numCompBytes);
17353bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectJPEG((char *) scratchBuffer, mediaWidthInPixels,
17363bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        (sint32) numFullScanlinesToInject, numCompBytes, destColorSpace, true);
17373bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
17383bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17393bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (numPartialScanlinesToInject) {
17403bf66744d61d18c66d46f2608de0467ad3df0268Mopria                // Handle the leftover strip
17413bf66744d61d18c66d46f2608de0467ad3df0268Mopria                write_JPEG_Buff(scratchBuffer, JPEG_QUALITY, mediaWidthInPixels,
17423bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numPartialScanlinesToInject, tmpStrip, currRenderResolutionInteger,
17433bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        destColorSpace, &numCompBytes);
17443bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectJPEG((char *) scratchBuffer, mediaWidthInPixels, numPartialScanlinesToInject,
17453bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numCompBytes, destColorSpace, true);
17463bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
17473bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17483bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(tmpStrip);
17493bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
17502e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        firstStrip = false;
17513bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17523bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // We are always going to compress the full strip height, even though the image may be less;
17533bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // this allows the compressed images to be symmetric
17543bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (numLinesThisCall < currStripHeight) {
17553bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 numLeftoverBytes = (currStripHeight - numLinesThisCall) * currSourceWidth * 3;
17563bf66744d61d18c66d46f2608de0467ad3df0268Mopria            sint32 numImagedBytes = numLinesThisCall * currSourceWidth * 3;
17573bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17583bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // End-of-page: we have to white-out the unused section of the source image
17593bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memset((ubyte *) localInBuffer + numImagedBytes, 0xff, numLeftoverBytes);
17603bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
17613bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17623bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (newStripPtr) {
17633bf66744d61d18c66d46f2608de0467ad3df0268Mopria            write_JPEG_Buff(scratchBuffer, JPEG_QUALITY, mediaWidthInPixels, currStripHeight,
17643bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    newStripPtr, currRenderResolutionInteger, destColorSpace, &numCompBytes);
17653bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17663bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(newStripPtr);
17673bf66744d61d18c66d46f2608de0467ad3df0268Mopria            newStripPtr = NULL;
17683bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
17693bf66744d61d18c66d46f2608de0467ad3df0268Mopria            write_JPEG_Buff(scratchBuffer, JPEG_QUALITY, mediaWidthInPixels, currStripHeight,
17703bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    (JSAMPLE *) localInBuffer, currRenderResolutionInteger, destColorSpace,
17713bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    &numCompBytes);
17723bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
17733bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17743bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectJPEG((char *) scratchBuffer, mediaWidthInPixels, currStripHeight, numCompBytes,
17753bf66744d61d18c66d46f2608de0467ad3df0268Mopria                destColorSpace, whiteStrip);
17763bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (currCompressionDisposition == compressFlate) {
17773bf66744d61d18c66d46f2608de0467ad3df0268Mopria        uint32 len = numLinesThisCall * scanlineWidth;
17783bf66744d61d18c66d46f2608de0467ad3df0268Mopria        uLongf destSize = len;
17793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int result;
17803bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17813bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (firstStrip && topMarginInPix) {
17823bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte whitePt = 0xff;
17833bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17843bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // We need to inject a blank image-strip with a height==topMarginInPix
17853bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte *tmpStrip = (ubyte *) malloc(scanlineWidth * topMarginInPix);
17863bf66744d61d18c66d46f2608de0467ad3df0268Mopria            uLongf tmpDestSize = destSize;
17873bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memset(tmpStrip, whitePt, scanlineWidth * topMarginInPix);
17883bf66744d61d18c66d46f2608de0467ad3df0268Mopria
17893bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (sint32 stripCntr = 0; stripCntr < numFullInjectedStrips; stripCntr++) {
17903bf66744d61d18c66d46f2608de0467ad3df0268Mopria                result = compress(scratchBuffer, &tmpDestSize, (const Bytef *) tmpStrip,
17913bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        scanlineWidth * numFullScanlinesToInject);
17923bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectLZStrip(scratchBuffer, tmpDestSize, mediaWidthInPixels,
17933bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numFullScanlinesToInject, destColorSpace, true);
17943bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
17953bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (numPartialScanlinesToInject) {
17963bf66744d61d18c66d46f2608de0467ad3df0268Mopria                result = compress(scratchBuffer, &tmpDestSize, (const Bytef *) tmpStrip,
17973bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        scanlineWidth * numPartialScanlinesToInject);
17983bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectLZStrip(scratchBuffer, tmpDestSize, mediaWidthInPixels,
17993bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numPartialScanlinesToInject, destColorSpace, true);
18003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
18013bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(tmpStrip);
18023bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
18032e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        firstStrip = false;
18043bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18053bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (newStripPtr) {
18063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            result = compress(scratchBuffer, &destSize, (const Bytef *) newStripPtr,
18073bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    scanlineWidth * numLinesThisCall);
18083bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(newStripPtr);
18093bf66744d61d18c66d46f2608de0467ad3df0268Mopria            newStripPtr = NULL;
18103bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
18113bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // Dump the source data
18123bf66744d61d18c66d46f2608de0467ad3df0268Mopria            result = compress(scratchBuffer, &destSize, (const Bytef *) localInBuffer,
18133bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    scanlineWidth * numLinesThisCall);
18143bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
18153bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectLZStrip(scratchBuffer, destSize, mediaWidthInPixels, numLinesThisCall, destColorSpace,
18163bf66744d61d18c66d46f2608de0467ad3df0268Mopria                whiteStrip);
18173bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (currCompressionDisposition == compressRLE) {
18183bf66744d61d18c66d46f2608de0467ad3df0268Mopria        int compSize;
18193bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (firstStrip && topMarginInPix) {
18203bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte whitePt = 0xff;
18213bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18223bf66744d61d18c66d46f2608de0467ad3df0268Mopria            // We need to inject a blank image-strip with a height==topMarginInPix
18233bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18243bf66744d61d18c66d46f2608de0467ad3df0268Mopria            ubyte *tmpStrip = (ubyte *) malloc(scanlineWidth * topMarginInPix);
18253bf66744d61d18c66d46f2608de0467ad3df0268Mopria            memset(tmpStrip, whitePt, scanlineWidth * topMarginInPix);
18263bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18273bf66744d61d18c66d46f2608de0467ad3df0268Mopria            for (sint32 stripCntr = 0; stripCntr < numFullInjectedStrips; stripCntr++) {
18283bf66744d61d18c66d46f2608de0467ad3df0268Mopria                compSize = RLEEncodeImage(tmpStrip, scratchBuffer,
18293bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        scanlineWidth * numFullScanlinesToInject);
18303bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectRLEStrip(scratchBuffer, compSize, mediaWidthInPixels,
18313bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numFullScanlinesToInject, destColorSpace, true);
18323bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
18333bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18343bf66744d61d18c66d46f2608de0467ad3df0268Mopria            if (numPartialScanlinesToInject) {
18353bf66744d61d18c66d46f2608de0467ad3df0268Mopria                compSize = RLEEncodeImage(tmpStrip, scratchBuffer,
18363bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        scanlineWidth * numPartialScanlinesToInject);
18373bf66744d61d18c66d46f2608de0467ad3df0268Mopria                injectRLEStrip(scratchBuffer, compSize, mediaWidthInPixels,
18383bf66744d61d18c66d46f2608de0467ad3df0268Mopria                        numPartialScanlinesToInject, destColorSpace, true);
18393bf66744d61d18c66d46f2608de0467ad3df0268Mopria            }
18403bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18413bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(tmpStrip);
18423bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
18432e2be0f9ea6839e000a98ba83daa57c8c3258b6cGlade Diviney        firstStrip = false;
18443bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18453bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (newStripPtr) {
18463bf66744d61d18c66d46f2608de0467ad3df0268Mopria            compSize = RLEEncodeImage(newStripPtr, scratchBuffer,
18473bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    scanlineWidth * numLinesThisCall);
18483bf66744d61d18c66d46f2608de0467ad3df0268Mopria            free(newStripPtr);
18493bf66744d61d18c66d46f2608de0467ad3df0268Mopria            newStripPtr = NULL;
18503bf66744d61d18c66d46f2608de0467ad3df0268Mopria        } else {
18513bf66744d61d18c66d46f2608de0467ad3df0268Mopria            compSize = RLEEncodeImage((ubyte *) localInBuffer, scratchBuffer,
18523bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    scanlineWidth * numLinesThisCall);
18533bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
18543bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18553bf66744d61d18c66d46f2608de0467ad3df0268Mopria        injectRLEStrip(scratchBuffer, compSize, mediaWidthInPixels, numLinesThisCall,
18563bf66744d61d18c66d46f2608de0467ad3df0268Mopria                destColorSpace, whiteStrip);
18573bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
18583bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
18593bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
18603bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18613bf66744d61d18c66d46f2608de0467ad3df0268Mopria    *iOutBufferSize = totalBytesWrittenToCurrBuff;
18623bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18633bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (savedInBufferPtr) {
18643bf66744d61d18c66d46f2608de0467ad3df0268Mopria        pInBuffer = savedInBufferPtr;
18653bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
18663bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18673bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (tmpBuffer) {
18683bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(tmpBuffer);
18693bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
18703bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18713bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (newStripPtr) {
18723bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(newStripPtr);
18733bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
18743bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18753bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return success;
18763bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
18773bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18783bf66744d61d18c66d46f2608de0467ad3df0268Mopriaint PCLmGenerator::GetPclmMediaDimensions(const char *mediaRequested,
18793bf66744d61d18c66d46f2608de0467ad3df0268Mopria        PCLmPageSetup *myPageInfo) {
18803bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int i = 0;
18813bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int result = 99;
18823bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18833bf66744d61d18c66d46f2608de0467ad3df0268Mopria    int iRenderResolutionInteger = 0;
18843bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (myPageInfo->destinationResolution == res300) {
18853bf66744d61d18c66d46f2608de0467ad3df0268Mopria        iRenderResolutionInteger = 300;
18863bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (myPageInfo->destinationResolution == res600) {
18873bf66744d61d18c66d46f2608de0467ad3df0268Mopria        iRenderResolutionInteger = 600;
18883bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else if (myPageInfo->destinationResolution == res1200) {
18893bf66744d61d18c66d46f2608de0467ad3df0268Mopria        iRenderResolutionInteger = 1200;
18903bf66744d61d18c66d46f2608de0467ad3df0268Mopria    } else {
18913bf66744d61d18c66d46f2608de0467ad3df0268Mopria        assert(0);
18923bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
18933bf66744d61d18c66d46f2608de0467ad3df0268Mopria
18943bf66744d61d18c66d46f2608de0467ad3df0268Mopria    for (i = 0; i < SUPPORTED_MEDIA_SIZE_COUNT; i++) {
18953bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (strcasecmp(mediaRequested, SupportedMediaSizes[i].PCL6Name) == 0) {
18963bf66744d61d18c66d46f2608de0467ad3df0268Mopria            myPageInfo->mediaWidth = floorf(
18973bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    _MI_TO_POINTS(SupportedMediaSizes[i].WidthInInches));
18983bf66744d61d18c66d46f2608de0467ad3df0268Mopria            myPageInfo->mediaHeight = floorf(
18993bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    _MI_TO_POINTS(SupportedMediaSizes[i].HeightInInches));
19003bf66744d61d18c66d46f2608de0467ad3df0268Mopria            myPageInfo->mediaWidthInPixels = floorf(
19013bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    _MI_TO_PIXELS(SupportedMediaSizes[i].WidthInInches,
19023bf66744d61d18c66d46f2608de0467ad3df0268Mopria                            iRenderResolutionInteger));
19033bf66744d61d18c66d46f2608de0467ad3df0268Mopria            myPageInfo->mediaHeightInPixels = floorf(
19043bf66744d61d18c66d46f2608de0467ad3df0268Mopria                    _MI_TO_PIXELS(SupportedMediaSizes[i].HeightInInches,
19053bf66744d61d18c66d46f2608de0467ad3df0268Mopria                            iRenderResolutionInteger));
19063bf66744d61d18c66d46f2608de0467ad3df0268Mopria            result = i;
19073bf66744d61d18c66d46f2608de0467ad3df0268Mopria            break;  // we found a match, so break out of loop
19083bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
19093bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
19103bf66744d61d18c66d46f2608de0467ad3df0268Mopria
19113bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (i == SUPPORTED_MEDIA_SIZE_COUNT) {
19123bf66744d61d18c66d46f2608de0467ad3df0268Mopria        // media size not found, defaulting to letter
19133bf66744d61d18c66d46f2608de0467ad3df0268Mopria        printf("PCLmGenerator get_pclm_media_size(): media size, %s, NOT FOUND, setting to letter",
19143bf66744d61d18c66d46f2608de0467ad3df0268Mopria                mediaRequested);
19153bf66744d61d18c66d46f2608de0467ad3df0268Mopria        result = GetPclmMediaDimensions("LETTER", myPageInfo);
19163bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
19173bf66744d61d18c66d46f2608de0467ad3df0268Mopria
19183bf66744d61d18c66d46f2608de0467ad3df0268Mopria    return result;
19193bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
19203bf66744d61d18c66d46f2608de0467ad3df0268Mopria
19213bf66744d61d18c66d46f2608de0467ad3df0268Mopriavoid PCLmGenerator::FreeBuffer(void *pBuffer) {
19223bf66744d61d18c66d46f2608de0467ad3df0268Mopria    if (jobOpen == job_closed && pBuffer) {
19233bf66744d61d18c66d46f2608de0467ad3df0268Mopria        if (pBuffer == allocatedOutputBuffer) {
19243bf66744d61d18c66d46f2608de0467ad3df0268Mopria            allocatedOutputBuffer = NULL;
19253bf66744d61d18c66d46f2608de0467ad3df0268Mopria        }
19263bf66744d61d18c66d46f2608de0467ad3df0268Mopria        free(pBuffer);
19273bf66744d61d18c66d46f2608de0467ad3df0268Mopria    }
19283bf66744d61d18c66d46f2608de0467ad3df0268Mopria}
1929