1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * Copyright (C) 2016 Mopria Alliance, Inc. 4 * Copyright (C) 2013 Hewlett-Packard Development Company, L.P. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 19 #ifndef _PCLM_GENERATOR 20 #define _PCLM_GENERATOR 21 #define SUPPORT_WHITE_STRIPS 22 23 #include "common_defines.h" 24 25 /* 26 * Generates a stream of PCLm output. 27 * 28 * Public APIs supply data output data into pOutBuffer with length in iOutBufferSize, to be 29 * delivered to the printer. 30 */ 31 class PCLmGenerator { 32 public: 33 34 PCLmGenerator(); 35 36 ~PCLmGenerator(); 37 38 /* 39 * Started a PCLm job. Initializes buffers. 40 */ 41 int StartJob(void **pOutBuffer, int *iOutBufferSize); 42 43 /* 44 * Ends the PCLm job. Writes trailer, frees buffers and arrays 45 */ 46 int EndJob(void **pOutBuffer, int *iOutBufferSize); 47 48 /* 49 * Starts rendering a page of a PCLm job. 50 */ 51 int StartPage(PCLmPageSetup *PCLmPageContent, void **pOutBuffer, int *iOutBufferSize); 52 53 /* 54 * Ends rendering a page. Frees scratch buffer. 55 */ 56 int EndPage(void **pOutBuffer, int *iOutBufferSize); 57 58 /* 59 * Compresses output buffer in Flate, RLE, or JPEG compression 60 */ 61 int Encapsulate(void *pInBuffer, int inBufferSize, int numLines, void **pOutBuffer, 62 int *iOutBufferSize); 63 64 /* 65 * Returns index of matched media size, else returns index for letter 66 */ 67 int GetPclmMediaDimensions(const char *mediaRequested, PCLmPageSetup *myPageInfo); 68 69 /* 70 * Free the supplied output buffer (after EndJob) 71 */ 72 void FreeBuffer(void *pBuffer); 73 74 private: 75 /* 76 * Convert an image from one color space to another. 77 * Currently, only supports RGB->GRAY 78 */ 79 bool colorConvertSource(colorSpaceDisposition srcCS, colorSpaceDisposition dstCS, ubyte *strip, 80 sint32 stripWidth, sint32 stripHeight); 81 82 /* 83 * Generates the PDF page construct(s), which includes the image information. The /Length 84 * definition is required for PDF, so we write the stream to a RAM buffer first, then calculate 85 * the Buffer size, insert the PDF /Length construct, then write the buffer to the PDF file. 86 */ 87 void writePDFGrammarPage 88 (int imageWidth, int imageHeight, int numStrips, colorSpaceDisposition destColorSpace); 89 90 /* 91 * Writes the PDF and PCLm versions to the output buffer as the header 92 */ 93 void writePDFGrammarHeader(); 94 95 /* 96 * Injects RLE compression strip into the output buffer 97 */ 98 int injectRLEStrip(ubyte *RLEBuffer, int numBytes, int imageWidth, int imageHeight, 99 colorSpaceDisposition destColorSpace, bool); 100 101 /* 102 * Injects zlib compressed strip to the output buffer 103 */ 104 int injectLZStrip(ubyte *LZBuffer, int numBytes, int imageWidth, int imageHeight, 105 colorSpaceDisposition destColorSpace, bool); 106 107 /* 108 * Injects jpeg compressed image to the output buffer 109 */ 110 int injectJPEG(char *jpeg_Buff, int imageWidth, int imageHeight, int numCompBytes, 111 colorSpaceDisposition destColorSpace, bool); 112 113 /* 114 * Initializes the output buffer with buff and size 115 */ 116 void initOutBuff(char *buff, sint32 size); 117 118 /* 119 * Writes str to the outputBuffer 120 */ 121 void writeStr2OutBuff(char *str); 122 123 /* 124 * Writes buff to the outputBuffer 125 */ 126 void write2Buff(ubyte *buff, int buffSize); 127 128 /* 129 * Adds totalBytesWrittenToPCLmFile to the xRefTable for output 130 */ 131 int statOutputFileSize(); 132 133 /* 134 * Writes file information to the outputbuffer as the trailer. 135 */ 136 void writePDFGrammarTrailer(int imageWidth, int imageHeight); 137 138 /* 139 * Injects Adobe RGBCS into the output buffer 140 */ 141 bool injectAdobeRGBCS(); 142 143 /* 144 * Adds kidObj to KidsArray 145 */ 146 bool addKids(sint32 kidObj); 147 148 /* 149 * Adds xRefObj to the xRefTable 150 */ 151 bool addXRef(sint32 xRefObj); 152 153 /* 154 * Warning: take extreme care in modifying this unless you understand what is going on. This 155 * function attempts to fix the xref table, based upon the strips getting inserted in reverse 156 * order (on the backside page). It does the following: 157 * 1) Calculates the new object reference size (using tmpArray) 158 * 2) Adds 2 to the object size to compensate for the offset 159 * 3) Reorders the Image FileBody and the ImageTransformation, as these are 1 PDF object 160 * 4) Frees the tmp array 161 */ 162 void fixXRef(); 163 164 /* 165 * Calls cleanup and returns an error 166 */ 167 int errorOutAndCleanUp(); 168 169 /* 170 * Cleans up allocatedOutputBuffer, leftoverScanlineBuffer, scratchBuffer, xRefTable, and 171 * KidsArray 172 */ 173 void Cleanup(void); 174 175 /* 176 * Writes job information to the output buffer 177 */ 178 void writeJobTicket(void); 179 180 /* 181 * Transforms image for duplexing, writes to output buffer 182 */ 183 void injectImageTransform(); 184 185 #ifdef SUPPORT_WHITE_STRIPS 186 187 /* 188 * Checks if the given buffer is a white strip 189 */ 190 bool isWhiteStrip(void *, int); 191 192 #endif 193 194 /* 195 * Outputs the string associated with the given bin into returnStr 196 */ 197 bool getInputBinString(jobInputBin bin, char *); 198 199 /* 200 * Outputs the string associated with the given bin into returnStr 201 */ 202 bool getOutputBin(jobOutputBin bin, char *); 203 204 /* 205 * compress input by identifying repeating bytes (not sequences) 206 * Compression ratio good for grayscale images, not great on RGB 207 * Output: 208 * 1-127: literal run 209 * 128: end of compression block 210 * 129-256: repeating byte sequence 211 */ 212 int RLEEncodeImage(ubyte *in, ubyte *out, int inLength); 213 214 sint32 currStripHeight; 215 char currMediaName[256]; 216 duplexDispositionEnum currDuplexDisposition; 217 compressionDisposition currCompressionDisposition; 218 mediaOrientationDisposition currMediaOrientationDisposition; 219 renderResolution currRenderResolution; 220 int currRenderResolutionInteger; 221 void *allocatedOutputBuffer; 222 void *leftoverScanlineBuffer; 223 224 int mediaWidth; 225 int mediaHeight; 226 int mediaWidthInPixels; 227 int mediaHeightInPixels; 228 colorSpaceDisposition destColorSpace; 229 colorSpaceDisposition sourceColorSpace; 230 int scaleFactor; 231 jobStateEnum jobOpen; 232 int currSourceWidth; 233 int currSourceHeight; 234 int srcNumComponents; 235 int dstNumComponents; 236 int numLeftoverScanlines; 237 ubyte *scratchBuffer; 238 int pageCount; 239 bool reverseOrder; 240 int outBuffSize; 241 int currOutBuffSize; 242 int totalBytesWrittenToPCLmFile; 243 int totalBytesWrittenToCurrBuff; 244 char *outBuffPtr; 245 char *currBuffPtr; 246 float STANDARD_SCALE; 247 sint32 objCounter; 248 249 sint32 yPosition; 250 sint32 pageOrigin; 251 sint32 *KidsArray; 252 sint32 numKids; 253 254 // XRefTable storage 255 sint32 *xRefTable; 256 sint32 xRefIndex; 257 sint32 xRefStart; 258 char pOutStr[256]; 259 bool adobeRGBCS_firstTime; 260 bool mirrorBackside; 261 sint32 topMarginInPix; 262 sint32 leftMarginInPix; 263 bool firstStrip; 264 sint32 numFullInjectedStrips; 265 sint32 numFullScanlinesToInject; 266 sint32 numPartialScanlinesToInject; 267 268 PCLmSUserSettingsType *m_pPCLmSSettings; 269 }; 270 271 #endif // _PCLM_PARSER_