/*
* Copyright (C) 2016 The Android Open Source Project
* Copyright (C) 2016 Mopria Alliance, Inc.
* Copyright (C) 2013 Hewlett-Packard Development Company, L.P.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _PCLM_GENERATOR
#define _PCLM_GENERATOR
#define SUPPORT_WHITE_STRIPS
#include "common_defines.h"
/*
* Generates a stream of PCLm output.
*
* Public APIs supply data output data into pOutBuffer with length in iOutBufferSize, to be
* delivered to the printer.
*/
class PCLmGenerator {
public:
PCLmGenerator();
~PCLmGenerator();
/*
* Started a PCLm job. Initializes buffers.
*/
int StartJob(void **pOutBuffer, int *iOutBufferSize);
/*
* Ends the PCLm job. Writes trailer, frees buffers and arrays
*/
int EndJob(void **pOutBuffer, int *iOutBufferSize);
/*
* Starts rendering a page of a PCLm job.
*/
int StartPage(PCLmPageSetup *PCLmPageContent, void **pOutBuffer, int *iOutBufferSize);
/*
* Ends rendering a page. Frees scratch buffer.
*/
int EndPage(void **pOutBuffer, int *iOutBufferSize);
/*
* Compresses output buffer in Flate, RLE, or JPEG compression
*/
int Encapsulate(void *pInBuffer, int inBufferSize, int numLines, void **pOutBuffer,
int *iOutBufferSize);
/*
* Returns index of matched media size, else returns index for letter
*/
int GetPclmMediaDimensions(const char *mediaRequested, PCLmPageSetup *myPageInfo);
/*
* Free the supplied output buffer (after EndJob)
*/
void FreeBuffer(void *pBuffer);
private:
/*
* Convert an image from one color space to another.
* Currently, only supports RGB->GRAY
*/
bool colorConvertSource(colorSpaceDisposition srcCS, colorSpaceDisposition dstCS, ubyte *strip,
sint32 stripWidth, sint32 stripHeight);
/*
* Generates the PDF page construct(s), which includes the image information. The /Length
* definition is required for PDF, so we write the stream to a RAM buffer first, then calculate
* the Buffer size, insert the PDF /Length construct, then write the buffer to the PDF file.
*/
void writePDFGrammarPage
(int imageWidth, int imageHeight, int numStrips, colorSpaceDisposition destColorSpace);
/*
* Writes the PDF and PCLm versions to the output buffer as the header
*/
void writePDFGrammarHeader();
/*
* Injects RLE compression strip into the output buffer
*/
int injectRLEStrip(ubyte *RLEBuffer, int numBytes, int imageWidth, int imageHeight,
colorSpaceDisposition destColorSpace, bool);
/*
* Injects zlib compressed strip to the output buffer
*/
int injectLZStrip(ubyte *LZBuffer, int numBytes, int imageWidth, int imageHeight,
colorSpaceDisposition destColorSpace, bool);
/*
* Injects jpeg compressed image to the output buffer
*/
int injectJPEG(char *jpeg_Buff, int imageWidth, int imageHeight, int numCompBytes,
colorSpaceDisposition destColorSpace, bool);
/*
* Initializes the output buffer with buff and size
*/
void initOutBuff(char *buff, sint32 size);
/*
* Writes str to the outputBuffer
*/
void writeStr2OutBuff(char *str);
/*
* Writes buff to the outputBuffer
*/
void write2Buff(ubyte *buff, int buffSize);
/*
* Adds totalBytesWrittenToPCLmFile to the xRefTable for output
*/
int statOutputFileSize();
/*
* Writes file information to the outputbuffer as the trailer.
*/
void writePDFGrammarTrailer(int imageWidth, int imageHeight);
/*
* Injects Adobe RGBCS into the output buffer
*/
bool injectAdobeRGBCS();
/*
* Adds kidObj to KidsArray
*/
bool addKids(sint32 kidObj);
/*
* Adds xRefObj to the xRefTable
*/
bool addXRef(sint32 xRefObj);
/*
* Warning: take extreme care in modifying this unless you understand what is going on. This
* function attempts to fix the xref table, based upon the strips getting inserted in reverse
* order (on the backside page). It does the following:
* 1) Calculates the new object reference size (using tmpArray)
* 2) Adds 2 to the object size to compensate for the offset
* 3) Reorders the Image FileBody and the ImageTransformation, as these are 1 PDF object
* 4) Frees the tmp array
*/
void fixXRef();
/*
* Calls cleanup and returns an error
*/
int errorOutAndCleanUp();
/*
* Cleans up allocatedOutputBuffer, leftoverScanlineBuffer, scratchBuffer, xRefTable, and
* KidsArray
*/
void Cleanup(void);
/*
* Writes job information to the output buffer
*/
void writeJobTicket(void);
/*
* Transforms image for duplexing, writes to output buffer
*/
void injectImageTransform();
#ifdef SUPPORT_WHITE_STRIPS
/*
* Checks if the given buffer is a white strip
*/
bool isWhiteStrip(void *, int);
#endif
/*
* Outputs the string associated with the given bin into returnStr
*/
bool getInputBinString(jobInputBin bin, char *);
/*
* Outputs the string associated with the given bin into returnStr
*/
bool getOutputBin(jobOutputBin bin, char *);
/*
* compress input by identifying repeating bytes (not sequences)
* Compression ratio good for grayscale images, not great on RGB
* Output:
* 1-127: literal run
* 128: end of compression block
* 129-256: repeating byte sequence
*/
int RLEEncodeImage(ubyte *in, ubyte *out, int inLength);
sint32 currStripHeight;
char currMediaName[256];
duplexDispositionEnum currDuplexDisposition;
compressionDisposition currCompressionDisposition;
mediaOrientationDisposition currMediaOrientationDisposition;
renderResolution currRenderResolution;
int currRenderResolutionInteger;
void *allocatedOutputBuffer;
void *leftoverScanlineBuffer;
int mediaWidth;
int mediaHeight;
int mediaWidthInPixels;
int mediaHeightInPixels;
colorSpaceDisposition destColorSpace;
colorSpaceDisposition sourceColorSpace;
int scaleFactor;
jobStateEnum jobOpen;
int currSourceWidth;
int currSourceHeight;
int srcNumComponents;
int dstNumComponents;
int numLeftoverScanlines;
ubyte *scratchBuffer;
int pageCount;
bool reverseOrder;
int outBuffSize;
int currOutBuffSize;
int totalBytesWrittenToPCLmFile;
int totalBytesWrittenToCurrBuff;
char *outBuffPtr;
char *currBuffPtr;
float STANDARD_SCALE;
sint32 objCounter;
sint32 yPosition;
sint32 pageOrigin;
sint32 *KidsArray;
sint32 numKids;
// XRefTable storage
sint32 *xRefTable;
sint32 xRefIndex;
sint32 xRefStart;
char pOutStr[256];
bool adobeRGBCS_firstTime;
bool mirrorBackside;
sint32 topMarginInPix;
sint32 leftMarginInPix;
bool firstStrip;
sint32 numFullInjectedStrips;
sint32 numFullScanlinesToInject;
sint32 numPartialScanlinesToInject;
PCLmSUserSettingsType *m_pPCLmSSettings;
};
#endif // _PCLM_PARSER_