1 /*****************************************************************************\
2 LJFastRaster.cpp : Implementation of LJFastRaster 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 "CommonDefinitions.h"
32 #include "LJFastRaster.h"
33 #include "ColorMatcher.h"
34 #include "Halftoner.h"
35 #include "ModeDeltaPlus.h"
36 #include "resources.h"
37 #include "ColorMaps.h"
38 #include "PrinterCommands.h"
40 LJFastRaster::LJFastRaster() : Encapsulator()
42 memset(&m_PM, 0, sizeof(m_PM));
43 strcpy(m_szLanguage, "PCLXL");
44 m_pModeDeltaPlus = NULL;
47 LJFastRaster::~LJFastRaster()
51 DRIVER_ERROR LJFastRaster::addJobSettings()
53 cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
54 "@PJL SET RESOLUTION=600\012@PJL SET BITSPERPIXEL=1\012@PJL SET TIMEOUT=900\012");
55 cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
56 "@PJL SET PAGEPROTECT=AUTO\012@PJL SET DENSITY=5\012");
57 if (m_pQA->print_quality == -1)
59 cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
60 "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
62 addToHeader("%s", "@PJL ENTER LANGUAGE=PCLXL\012) HP-PCL XL;2;0;Comment\012");
63 addToHeader(FRBeginSession, sizeof(FRBeginSession));
64 addToHeader(FRVUExtn3, sizeof(FRVUExtn3));
65 addToHeader(FRVendorUniq, sizeof(FRVendorUniq));
66 addToHeader(FROpenDataSource, sizeof(FROpenDataSource));
70 DRIVER_ERROR LJFastRaster::Configure(Pipeline **pipeline)
72 DRIVER_ERROR err = NO_ERROR;
76 ColorMatcher *pColorMatcher;
77 Halftoner *pHalftoner;
78 int iRows[MAXCOLORPLANES];
79 unsigned int uiResBoost;
83 * I need a flag in the printmode structure to whether create a CMYGraymap
84 * and set the ulMap1 to it.
88 m_PM.ColorDepth[0] = 1;
89 m_PM.cmap.ulMap1 = ulMapDJ600_CCM_K;
90 m_PM.BaseResX = m_pQA->horizontal_resolution;
91 m_PM.BaseResY = m_pQA->vertical_resolution;
93 m_PM.BlackFEDTable = HTBinary_open;
94 m_PM.ColorFEDTable = HTBinary_open;
95 m_PM.MixedRes = false;
97 for (int i = 0; i < MAXCOLORPLANES; i++)
99 m_PM.ResolutionX[i] = m_pQA->horizontal_resolution;
100 m_PM.ResolutionY[i] = m_pQA->vertical_resolution;
101 iRows[i] = m_PM.ResolutionX[i] / m_PM.BaseResX;
103 uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
107 width = m_pMA->printable_width;
109 pColorMatcher = new ColorMatcher(m_PM.cmap, m_PM.dyeCount, width);
110 head = new Pipeline(pColorMatcher);
111 pHalftoner = new Halftoner (&m_PM, width, iRows, uiResBoost, m_PM.eHT == MATRIX);
112 p = new Pipeline(pHalftoner);
114 m_pModeDeltaPlus = new ModeDeltaPlus(width);
115 p = new Pipeline(m_pModeDeltaPlus);
117 m_pModeDeltaPlus->myplane = COLORTYPE_COLOR;
118 err = m_pModeDeltaPlus->Init();
124 DRIVER_ERROR LJFastRaster::StartPage(JobAttributes *pJA)
126 DRIVER_ERROR err = NO_ERROR;
130 m_pMA = &pJA->media_attributes;
131 m_pQA = &pJA->quality_attributes;
133 m_pModeDeltaPlus->NewPage();
135 /* Orienatation: is FrFeedOrientationSeq[1]. Can take the following values:
138 * Reversed Portrait : 0x02
139 * Reversed Landscape : 0x03
140 * Image Orientataion: 0x04
143 addToHeader(FRFeedOrientation, sizeof(FRFeedOrientation));
145 // Set media source, type, size and quality modes.
147 if (m_pMA->pcl_id == 96) // custom paper size
149 BYTE szCustomSize[16];
158 LJFUnion.fValue = (float) m_pMA->physical_width / m_pQA->horizontal_resolution;
159 uiXsize = LJFUnion.uiValue;
160 LJFUnion.fValue = (float) m_pMA->physical_height / m_pQA->horizontal_resolution;
161 uiYsize = LJFUnion.uiValue;
162 szCustomSize[k++] = 0xD5;
163 szCustomSize[k++] = (BYTE) (uiXsize & 0x000000FF);
164 szCustomSize[k++] = (BYTE) ((uiXsize & 0x0000FF00) >> 8);
165 szCustomSize[k++] = (BYTE) ((uiXsize & 0x00FF0000) >> 16);
166 szCustomSize[k++] = (BYTE) ((uiXsize & 0xFF000000) >> 24);
167 szCustomSize[k++] = (BYTE) (uiYsize & 0x000000FF);
168 szCustomSize[k++] = (BYTE) ((uiYsize & 0x0000FF00) >> 8);
169 szCustomSize[k++] = (BYTE) ((uiYsize & 0x00FF0000) >> 16);
170 szCustomSize[k++] = (BYTE) ((uiYsize & 0xFF000000) >> 24);
171 szCustomSize[k++] = 0xF8;
172 szCustomSize[k++] = 0x2F;
173 addToHeader(szCustomSize, k);
174 addToHeader(FRCustomMediaSize, sizeof(FRCustomMediaSize));
178 memcpy(cur_pcl_buffer_ptr, FRPaperSize, sizeof(FRPaperSize));
179 cur_pcl_buffer_ptr[1] = (BYTE) m_pMA->pcl_id;
180 cur_pcl_buffer_ptr += sizeof(FRPaperSize);
183 addToHeader(FRBeginPage, sizeof(FRBeginPage));
188 DRIVER_ERROR LJFastRaster::SendCAPy(int iOffset)
193 DRIVER_ERROR LJFastRaster::FormFeed()
195 return sendBuffer(FREndPage, sizeof(FREndPage));
198 DRIVER_ERROR LJFastRaster::EndJob()
201 addToHeader(FRCloseDataSource, sizeof(FRCloseDataSource));
202 addToHeader(FREndSession, sizeof(FREndSession));
203 addToHeader((const BYTE *) PJLExit, strlen(PJLExit));
208 #define FAST_RASTER_HEADERSIZE 25
218 //** Faster Raster Path Header address values
220 #define BASE_ADDRESS 0
221 #define PAGE_NUM_ADDRESS 1
222 #define RESOLUTION_ADDRESS_HI 2
223 #define RESOLUTION_ADDRESS_LO 3
224 #define COMPRESSION_ADDRESS_HI 4
225 #define COMPRESSION_ADDRESS_LO 5
226 #define COLOR_PLANE_SPECIFIER_ADDRESS 6
227 #define COMPRESSION_RATIO 7
229 #define IMAGE_SIZE_ADDRESS_HIWORD_HI 12
230 #define IMAGE_SIZE_ADDRESS_HIWORD_LO 13
231 #define IMAGE_SIZE_ADDRESS_LOWORD_HI 14
232 #define IMAGE_SIZE_ADDRESS_LOWORD_LO 15
233 #define IMAGE_WIDTH_ADDRESS_HI 16
234 #define IMAGE_WIDTH_ADDRESS_LO 17
235 #define IMAGE_HEIGTH_ADDRESS_HI 18
236 #define IMAGE_HEIGTH_ADDRESS_LO 19
237 #define ABS_X_ADDRESS_HI 20
238 #define ABS_X_ADDRESS_LO 21
239 #define ABS_Y_ADDRESS_HI 22
240 #define ABS_Y_ADDRESS_LO 23
241 #define BIT_DEPTH_ADDRESS 24
244 DRIVER_ERROR LJFastRaster::Encapsulate (RASTERDATA *InputRaster, bool bLastPlane)
247 DRIVER_ERROR err = NO_ERROR;
250 unsigned char pucHeader[FAST_RASTER_HEADERSIZE];
251 long lImageWidth = ((m_pMA->printable_width + 7) / 8) * 8;
252 long lResolution = 600;
253 long lBlockOffset = ((m_pModeDeltaPlus->GetCurrentRasterRow() + 127) / 128) * 128 - 128;
255 long lBlockHeight = m_pModeDeltaPlus->GetCurrentBlockHeight();
257 unsigned short wTemp = LOWORD (lBlockOffset);
261 memset (pucHeader, 0, FAST_RASTER_HEADERSIZE);
263 pucHeader[ABS_X_ADDRESS_HI] = 0;
264 pucHeader[ABS_X_ADDRESS_LO] = 0;
265 pucHeader[ABS_Y_ADDRESS_HI] = HIBYTE (wTemp);
266 pucHeader[ABS_Y_ADDRESS_LO] = LOBYTE (wTemp);
268 pucHeader[BASE_ADDRESS] = 0;
269 pucHeader[PAGE_NUM_ADDRESS] = 1;
271 wTemp = (unsigned short) (lResolution );
272 byHIByte = HIBYTE (wTemp);
273 byLOByte = LOBYTE (wTemp);
274 pucHeader[RESOLUTION_ADDRESS_HI] = byHIByte;
275 pucHeader[RESOLUTION_ADDRESS_LO] = byLOByte;
277 wTemp = m_pModeDeltaPlus->IsCompressed() ? (unsigned short) eDeltaPlus : (unsigned short) eRAW;
278 byHIByte = HIBYTE (wTemp);
279 byLOByte = LOBYTE (wTemp);
280 pucHeader[COMPRESSION_ADDRESS_HI] = byHIByte;
281 pucHeader[COMPRESSION_ADDRESS_LO] = byLOByte;
283 pucHeader[COLOR_PLANE_SPECIFIER_ADDRESS] = (BYTE) eK;
284 pucHeader[COMPRESSION_RATIO] = (BYTE) m_pModeDeltaPlus->GetFRatio();
285 wTemp = HIWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
286 byHIByte = HIBYTE (wTemp);
287 byLOByte = LOBYTE (wTemp);
288 pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_HI] = byHIByte;
289 pucHeader[IMAGE_SIZE_ADDRESS_HIWORD_LO] = byLOByte;
291 wTemp = LOWORD (InputRaster->rastersize[COLORTYPE_COLOR]);
292 byHIByte = HIBYTE (wTemp);
293 byLOByte = LOBYTE (wTemp);
294 pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_HI] = byHIByte;
295 pucHeader[IMAGE_SIZE_ADDRESS_LOWORD_LO] = byLOByte;
297 wTemp = LOWORD (lImageWidth * 8);
298 byHIByte = HIBYTE (wTemp);
299 byLOByte = LOBYTE (wTemp);
301 pucHeader[IMAGE_WIDTH_ADDRESS_HI] = byHIByte;
302 pucHeader[IMAGE_WIDTH_ADDRESS_LO] = byLOByte;
304 wTemp = LOWORD (lBlockHeight);
305 byHIByte = HIBYTE (wTemp);
306 byLOByte = LOBYTE (wTemp);
307 pucHeader[IMAGE_HEIGTH_ADDRESS_HI] = byHIByte;
308 pucHeader[IMAGE_HEIGTH_ADDRESS_LO] = byLOByte;
310 wTemp = LOWORD (lBitDepth);
311 pucHeader[BIT_DEPTH_ADDRESS] = LOBYTE (wTemp);
313 unsigned int ulVUDataLength = (int)(InputRaster->rastersize[COLORTYPE_COLOR] + FAST_RASTER_HEADERSIZE);
315 err = this->Send (FREnterFRMode, sizeof(FREnterFRMode));
317 res[0] = (BYTE) (ulVUDataLength & 0xFF);
318 res[1] = (BYTE) ((ulVUDataLength & 0x0000FF00) >> 8);
319 res[2] = (BYTE) ((ulVUDataLength & 0x00FF0000) >> 16);
320 res[3] = (BYTE) ((ulVUDataLength & 0xFF000000) >> 24);
324 err = this->Send (res, 7);
327 //** now embed raster data, header and all
328 err = this->Send (pucHeader, FAST_RASTER_HEADERSIZE);
331 err = sendBuffer ((const BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR],
332 InputRaster->rastersize[COLORTYPE_COLOR]);