1 /*****************************************************************************\
2 LJJetReady.cpp : Implementation of LJJetReady class
4 Copyright (c) 1996 - 2009, Hewlett-Packard Co.
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions
10 1. Redistributions of source code must retain the above copyright
11 notice, this list of conditions and the following disclaimer.
12 2. Redistributions in binary form must reproduce the above copyright
13 notice, this list of conditions and the following disclaimer in the
14 documentation and/or other materials provided with the distribution.
15 3. Neither the name of Hewlett-Packard nor the names of its
16 contributors may be used to endorse or promote products derived
17 from this software without specific prior written permission.
19 THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
20 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
22 NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
24 TO, PATENT INFRINGEMENT; PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
25 OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 \*****************************************************************************/
31 #include "Encapsulator.h"
33 #include "LJJetReady.h"
34 #include "PrinterCommands.h"
36 #define MOJAVE_STRIP_HEIGHT 128
38 LJJetReady::LJJetReady() : Encapsulator()
40 m_eCompressMode = COMPRESS_MODE_JPEG;
41 memset(&m_QTableInfo, 0, sizeof(m_QTableInfo));
44 LJJetReady::~LJJetReady()
48 DRIVER_ERROR LJJetReady::addJobSettings()
51 addToHeader("@PJL SET STRINGCODESET=UTF8\012");
52 addToHeader("@PJL SET COPIES=1\012");
53 if (m_pJA->color_mode != 0)
55 addToHeader("@PJL SET PLANESINUSE=1\012");
57 if (m_pJA->e_duplex_mode != DUPLEXMODE_NONE)
59 addToHeader("@PJL SET DUPLEX=ON\012@PJL SET BINDING=%s\012",
60 m_pJA->e_duplex_mode == DUPLEXMODE_BOOK ? "LONGEDGE" : "SHORTEDGE");
62 addToHeader("@PJL SET RESOLUTION=600\012");
63 addToHeader("@PJL SET TIMEOUT=90\012");
64 addToHeader("@PJL ENTER LANGUAGE=PCLXL\012");
65 addToHeader(") HP-PCL XL;3;0;Comment, PCL-XL JetReady generator\012");
66 addToHeader(JRBeginSessionSeq, (int) sizeof(JRBeginSessionSeq));
71 DRIVER_ERROR LJJetReady::Configure(Pipeline **pipeline)
75 pModeJpeg = new ModeJpeg(((m_pMA->printable_width + 31) / 32) * 32);
76 if (pModeJpeg == NULL)
78 return ALLOCMEM_ERROR;
81 m_eCompressMode = m_pQA->print_quality == 1 ? COMPRESS_MODE_LJ : COMPRESS_MODE_JPEG;
82 pModeJpeg->myplane = COLORTYPE_COLOR;
83 m_QTableInfo.qFactor = 6;
84 pModeJpeg->Init(m_pJA->color_mode, MOJAVE_STRIP_HEIGHT, &m_eCompressMode, &m_QTableInfo);
85 head = new Pipeline(pModeJpeg);
90 DRIVER_ERROR LJJetReady::StartPage(JobAttributes *pJA)
93 BYTE JRPaperSizeSeq[] = {0xC0, 0x00, 0xF8, 0x25};
94 BYTE szCustomSize[16];
96 if (m_eCompressMode != COMPRESS_MODE_LJ)
98 addToHeader((const BYTE *) JRFeedOrientationSeq, sizeof(JRFeedOrientationSeq));
99 if (pJA->media_attributes.pcl_id == 96) // Custom paper size
111 // Physical width and height in inches
112 JRCustomPaperSize.fValue = (float) pJA->media_attributes.physical_width / (float) pJA->quality_attributes.horizontal_resolution;
113 uiXsize = JRCustomPaperSize.uiValue;
114 JRCustomPaperSize.fValue = (float) pJA->media_attributes.physical_height / (float) pJA->quality_attributes.vertical_resolution;;
115 uiYsize = JRCustomPaperSize.uiValue;
116 szCustomSize[k++] = 0xD5;
117 szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
118 szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
119 szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
120 szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
121 szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
122 szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
123 szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
124 szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
125 addToHeader((const BYTE *) szCustomSize, k);
126 addToHeader(JRCustomPaperSizeSeq, sizeof(JRCustomPaperSizeSeq));
130 JRPaperSizeSeq[1] = pJA->media_attributes.pcl_id;
131 addToHeader((const BYTE *) JRPaperSizeSeq, sizeof(JRPaperSizeSeq));
133 BYTE szPrintableAreaSeq[] = {0xD1, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x74};
134 int iWidth = pJA->media_attributes.printable_width;
135 int iHeight = pJA->media_attributes.printable_height;
137 // The minimum printable width is 1600 pixels (3 inch * 600 - 200 for margins)
142 // The source width must be a mutiple of 32
143 iWidth = ((iWidth + 31) / 32) * 32;
144 iHeight = ((iHeight + (MOJAVE_STRIP_HEIGHT - 1)) / MOJAVE_STRIP_HEIGHT) * MOJAVE_STRIP_HEIGHT;
145 szPrintableAreaSeq[1] = (BYTE) (iWidth & 0xFF);
146 szPrintableAreaSeq[2] = (BYTE) ((iWidth >> 8) & 0xFF);
147 szPrintableAreaSeq[3] = (BYTE) (iHeight & 0xFF);
148 szPrintableAreaSeq[4] = (BYTE) ((iHeight >> 8) & 0xFF);
149 addToHeader((const BYTE *) szPrintableAreaSeq, sizeof(szPrintableAreaSeq));
151 addToHeader(JRBeginPageSeq, sizeof(JRBeginPageSeq));
153 // Colormode must be 0 - color and 1 - grayscale
154 BYTE szColorModeSeq[] = {0xC0, 0x06, 0xF8, 0x03, 0x6A};
155 szColorModeSeq[1] += pJA->color_mode;
156 addToHeader((const BYTE *) szColorModeSeq, sizeof(szColorModeSeq));
160 addToHeader(JRBeginImageSeq, sizeof(JRBeginImageSeq));
161 szStr[0] = (BYTE) (iWidth & 0xFF);
162 szStr[1] = (BYTE) ((iWidth & 0xFF00) >> 8);
166 szStr[5] = (BYTE) (iHeight & 0xFF);
167 szStr[6] = (BYTE) ((iHeight & 0xFF00) >> 8);
171 addToHeader((const BYTE *) szStr, 10);
172 unsigned int uiStripCount = iHeight / MOJAVE_STRIP_HEIGHT;
173 szStr[0] = (BYTE) (uiStripCount & 0xFF);
174 szStr[1] = (BYTE) ((uiStripCount & 0xFF00) >> 8);
178 addToHeader((const BYTE *) szStr, 5);
179 const BYTE szStripHeightSeq[] = {0x80, 0x00, 0xF8, 0x94};
180 addToHeader(szStripHeightSeq, sizeof(szStripHeightSeq));
185 if (m_pJA->color_mode == 0)
189 addToHeader((const BYTE *) szStr, 4);
190 // Interleaved Color Enumeration sequence
191 addToHeader(JRICESeq, sizeof(JRICESeq));
192 addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
193 BYTE szDataLengthSeq[] = {0xC2, 0x38, 0x03, 0x00, 0x00, 0xF8, 0x92, 0x46};
194 if (m_eCompressMode == COMPRESS_MODE_LJ)
196 szDataLengthSeq[1] = 0;
197 szDataLengthSeq[2] = 0;
199 addToHeader(szDataLengthSeq, sizeof(szDataLengthSeq));
204 DRIVER_ERROR LJJetReady::FormFeed()
207 addToHeader(JRVueExtn3Seq, sizeof(JRVueExtn3Seq));
208 addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
209 addToHeader(JRVendorUniqueSeq, sizeof(JRVendorUniqueSeq));
210 addToHeader(JREndPageSeq, sizeof(JREndPageSeq));
215 DRIVER_ERROR LJJetReady::EndJob()
218 addToHeader(JREndSessionSeq, sizeof(JREndSessionSeq));
219 addToHeader((const BYTE *) PJLExit, strlen(PJLExit));
224 DRIVER_ERROR LJJetReady::Encapsulate(RASTERDATA *InputRaster, bool bLastPlane)
227 int iJpegHeaderSize = 623;
228 unsigned int ulVuDataLength;
231 if (m_eCompressMode != COMPRESS_MODE_LJ)
233 err = sendJPEGHeaderInfo(InputRaster);
236 if (m_pJA->color_mode != 0 || m_eCompressMode == COMPRESS_MODE_LJ)
239 if (InputRaster->rasterdata[COLORTYPE_COLOR] == NULL)
244 ulVuDataLength = InputRaster->rastersize[COLORTYPE_COLOR] - iJpegHeaderSize;
245 pDataPtr = InputRaster->rasterdata[COLORTYPE_COLOR] + iJpegHeaderSize;
247 szStr[0] = m_iStripHeight & 0xFF;
248 szStr[1] = (m_iStripHeight & 0xFF00) >> 8;
249 m_iStripHeight += MOJAVE_STRIP_HEIGHT;
250 addToHeader(JRReadImageSeq, sizeof(JRReadImageSeq));
251 addToHeader(szStr, 2);
252 addToHeader(JRStripHeightSeq, sizeof(JRStripHeightSeq));
253 addToHeader(JRTextObjectTypeSeq, sizeof(JRTextObjectTypeSeq));
254 addToHeader(JRVueVersionTagSeq, sizeof(JRVueVersionTagSeq));
258 szStr[i++] = (BYTE) (ulVuDataLength & 0xFF);
259 szStr[i++] = (BYTE) ((ulVuDataLength & 0x0000FF00) >> 8);
260 szStr[i++] = (BYTE) ((ulVuDataLength & 0x00FF0000) >> 16);
261 szStr[i++] = (BYTE) ((ulVuDataLength & 0xFF000000) >> 24);
265 if (m_eCompressMode == COMPRESS_MODE_LJ)
271 szStr[i++] = (BYTE) (ulVuDataLength & 0xFF);
272 szStr[i++] = (BYTE) ((ulVuDataLength & 0x0000FF00) >> 8);
273 szStr[i++] = (BYTE) ((ulVuDataLength & 0x00FF0000) >> 16);
274 szStr[i++] = (BYTE) ((ulVuDataLength & 0xFF000000) >> 24);
275 addToHeader((const BYTE *) szStr, i);
278 err = sendBuffer((const BYTE *) pDataPtr, ulVuDataLength);
282 void LJJetReady::addQTable(DWORD *qtable)
284 for (int i = 0; i < QTABLE_SIZE; i++)
286 *cur_pcl_buffer_ptr++ = (BYTE) (qtable[i] & 0xFF);
287 *cur_pcl_buffer_ptr++ = (BYTE) ((qtable[i] >> 8) & 0xFF);
288 *cur_pcl_buffer_ptr++ = 0;
289 *cur_pcl_buffer_ptr++ = 0;
293 DRIVER_ERROR LJJetReady::sendJPEGHeaderInfo(RASTERDATA *InputRaster)
305 endianness.s = 0x0A0B;
306 err = sendBuffer(JRQTSeq, sizeof(JRQTSeq));
307 if (endianness.c[0] == 0x0B)
309 err = sendBuffer((const BYTE *) &m_QTableInfo, sizeof(DWORD) * QTABLE_SIZE * 3);
313 addQTable(m_QTableInfo.qtable0);
314 addQTable(m_QTableInfo.qtable1);
315 addQTable(m_QTableInfo.qtable2);
318 m_bSendQTable = false;
319 addToHeader(JRCRSeq, sizeof(JRCRSeq));
320 BYTE szCR3Seq[] = {0x00, 0x00, 0x00, 0x00};
321 if (m_pJA->color_mode != 0)
323 addToHeader(JRCR1GSeq, sizeof(JRCR1GSeq));
327 addToHeader(JRCR1CSeq, sizeof(JRCR1CSeq));
330 addToHeader(szCR3Seq, sizeof(szCR3Seq));
331 for (int i = 0; i < 9; i++)
333 addToHeader(JRSCSeq[i], 4);