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