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_