271 lines
7.6 KiB
C++
271 lines
7.6 KiB
C++
/*
|
|
* 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_
|