Tizen 2.1 base
[platform/upstream/hplip.git] / prnt / hpcups / LJFastRaster.cpp
1 /*****************************************************************************\
2   LJFastRaster.cpp : Implementation of LJFastRaster class
3
4   Copyright (c) 1996 - 2009, Hewlett-Packard Co.
5   All rights reserved.
6
7   Redistribution and use in source and binary forms, with or without
8   modification, are permitted provided that the following conditions
9   are met:
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.
18
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 \*****************************************************************************/
30
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"
39
40 LJFastRaster::LJFastRaster() : Encapsulator()
41 {
42     memset(&m_PM, 0, sizeof(m_PM));
43     strcpy(m_szLanguage, "PCLXL");
44     m_pModeDeltaPlus = NULL;
45 }
46
47 LJFastRaster::~LJFastRaster()
48 {
49 }
50
51 DRIVER_ERROR LJFastRaster::addJobSettings()
52 {
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)
58     {
59         cur_pcl_buffer_ptr += sprintf((char *) cur_pcl_buffer_ptr,
60         "@PJL SET RET=OFF\012@PJL SET ECONOMODE=ON\012");
61     }
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));
67     return NO_ERROR;
68 }
69
70 DRIVER_ERROR LJFastRaster::Configure(Pipeline **pipeline)
71 {
72     DRIVER_ERROR    err = NO_ERROR;
73     Pipeline    *p = NULL;
74     Pipeline    *head;
75     unsigned int width;
76     ColorMatcher *pColorMatcher;
77     Halftoner    *pHalftoner;
78     int          iRows[MAXCOLORPLANES];
79     unsigned int uiResBoost;
80     head = *pipeline;
81
82 /*
83  *  I need a flag in the printmode structure to whether create a CMYGraymap
84  *  and set the ulMap1 to it.
85  */
86
87     m_PM.dyeCount = 1;
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;
92     m_PM.eHT = FED;
93     m_PM.BlackFEDTable = HTBinary_open;
94     m_PM.ColorFEDTable = HTBinary_open;
95     m_PM.MixedRes = false;
96
97     for (int i = 0; i < MAXCOLORPLANES; i++)
98     {
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;
102     }
103     uiResBoost = m_PM.BaseResX / m_PM.BaseResY;
104     if (uiResBoost == 0)
105         uiResBoost = 1;
106
107     width = m_pMA->printable_width;
108
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);
113     head->AddPhase(p);
114     m_pModeDeltaPlus = new ModeDeltaPlus(width);
115     p = new Pipeline(m_pModeDeltaPlus);
116     head->AddPhase(p);
117     m_pModeDeltaPlus->myplane = COLORTYPE_COLOR;
118     err = m_pModeDeltaPlus->Init();
119
120     *pipeline = head;
121     return err;
122 }
123
124 DRIVER_ERROR LJFastRaster::StartPage(JobAttributes *pJA)
125 {
126     DRIVER_ERROR    err = NO_ERROR;
127     page_number++;
128
129     m_pJA = pJA;
130     m_pMA = &pJA->media_attributes;
131     m_pQA = &pJA->quality_attributes;
132
133     m_pModeDeltaPlus->NewPage();
134
135 /*     Orienatation: is FrFeedOrientationSeq[1]. Can take the following values:
136  *      Portrait                : 0x00
137  *      Landscape:              : 0x01
138  *      Reversed    Portrait    : 0x02
139  *      Reversed    Landscape   : 0x03
140  *      Image       Orientataion: 0x04
141  */
142
143     addToHeader(FRFeedOrientation, sizeof(FRFeedOrientation));
144
145 //  Set media source, type, size and quality modes.
146
147     if (m_pMA->pcl_id == 96)    // custom paper size
148     {
149         BYTE    szCustomSize[16];
150         union
151         {
152             float       fValue;
153             uint32_t    uiValue;
154         } LJFUnion;
155         uint32_t    uiXsize;
156         uint32_t    uiYsize;
157         int         k = 0;
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));
175     }
176     else
177     {
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);
181     }
182
183     addToHeader(FRBeginPage, sizeof(FRBeginPage));
184     err = Cleanup();
185     return err;
186 }
187
188 DRIVER_ERROR LJFastRaster::SendCAPy(int iOffset)
189 {
190     return NO_ERROR;
191 }
192
193 DRIVER_ERROR LJFastRaster::FormFeed()
194 {
195     return sendBuffer(FREndPage, sizeof(FREndPage));
196 }
197
198 DRIVER_ERROR LJFastRaster::EndJob()
199 {
200     DRIVER_ERROR    err;
201     addToHeader(FRCloseDataSource, sizeof(FRCloseDataSource));
202     addToHeader(FREndSession, sizeof(FREndSession));
203     addToHeader((const BYTE *) PJLExit, strlen(PJLExit));
204     err = Cleanup();
205     return err;
206 }
207
208 #define        FAST_RASTER_HEADERSIZE    25
209
210 typedef enum
211 {
212     eDelta32,
213     eDeltaPlus = 24,
214     eFX = 18,
215     eRAW = 2
216 } CompressionMethod;
217
218 //** Faster Raster Path Header address values
219
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
228 #define        PRODUCT_ID                       8
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
242
243 #define eK 3
244 DRIVER_ERROR LJFastRaster::Encapsulate (RASTERDATA *InputRaster, bool bLastPlane)
245 {
246     BYTE    res[64];
247     DRIVER_ERROR    err = NO_ERROR;
248
249     //** form FR header
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;
254     long lBitDepth = 1;
255     long lBlockHeight = m_pModeDeltaPlus->GetCurrentBlockHeight();
256
257     unsigned short wTemp = LOWORD (lBlockOffset);
258     BYTE byHIByte = 0;
259     BYTE byLOByte = 0;
260
261     memset (pucHeader, 0, FAST_RASTER_HEADERSIZE);
262
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);
267
268     pucHeader[BASE_ADDRESS] = 0;
269     pucHeader[PAGE_NUM_ADDRESS] = 1;
270
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;
276     
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;
282
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;
290     
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;
296
297     wTemp = LOWORD (lImageWidth * 8);
298     byHIByte = HIBYTE (wTemp);
299     byLOByte = LOBYTE (wTemp);
300
301     pucHeader[IMAGE_WIDTH_ADDRESS_HI] = byHIByte;
302     pucHeader[IMAGE_WIDTH_ADDRESS_LO] = byLOByte;
303     
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;
309                 
310     wTemp = LOWORD (lBitDepth);
311     pucHeader[BIT_DEPTH_ADDRESS] = LOBYTE (wTemp);
312
313     unsigned int   ulVUDataLength = (int)(InputRaster->rastersize[COLORTYPE_COLOR] + FAST_RASTER_HEADERSIZE);
314
315     err = this->Send (FREnterFRMode, sizeof(FREnterFRMode));
316     ERRCHECK;
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);
321     res[4] = 0xF8;
322     res[5] = 0x92;
323     res[6] = 0x46;
324     err = this->Send (res, 7);
325     ERRCHECK;
326
327     //** now embed raster data, header and all     
328     err = this->Send (pucHeader, FAST_RASTER_HEADERSIZE);
329     err = Cleanup();
330     if (err == NO_ERROR)
331         err = sendBuffer ((const BYTE *) InputRaster->rasterdata[COLORTYPE_COLOR],
332                           InputRaster->rastersize[COLORTYPE_COLOR]);
333     return err;
334 }
335