1 /*****************************************************************************\
2 HPCupsFilter.cpp : Interface for HPCupsFilter 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.
30 Author: Naga Samrat Chowdary Narla, Sanjay Kumar, Amarnath Chitumalla
31 \*****************************************************************************/
33 #include "HPCupsFilter.h"
36 #include <sys/utsname.h>
38 #include <sys/timeb.h>
40 #define HP_FILE_VERSION_STR "03.09.08.0"
42 static HPCupsFilter filter;
43 int main (int argc, char *argv[])
45 openlog("hpcups", LOG_PID, LOG_DAEMON);
47 if (argc < 6 || argc > 7) {
48 dbglog("ERROR: %s job-id user title copies options [file]\n", *argv);
52 return filter.StartPrintJob(argc, argv);
55 void HPCancelJob(int sig)
61 void HPCupsFilter::CreateBMPHeader (int width, int height, int planes, int bpp)
63 memset (&this->bmfh, 0, 14);
64 memset (&this->bmih, 0, 40);
69 bmih.biSize = DBITMAPINFOHEADER;
71 bmih.biHeight = -height;
73 bmih.biBitCount = planes * bpp;
74 bmih.biCompression = 0;
75 bmih.biSizeImage = width * height * planes * bpp / 8;
76 bmih.biClrImportant = 0;
77 bmih.biClrUsed = (planes == 3) ? 0 : 2;
78 bmih.biXPelsPerMeter = 0;
79 bmih.biYPelsPerMeter = 0;
81 bmfh.bfOffBits += bmih.biClrUsed * 4;
82 bmfh.bfSize = bmih.biSizeImage + bmfh.bfOffBits;
85 void HPCupsFilter::WriteBMPHeader (FILE *fp, int width, int height, eRasterType raster_type)
91 if (raster_type == BLACK_RASTER)
93 WriteKBMPHeader (fp, width, height);
97 WriteCBMPHeader (fp, width, height);
101 void HPCupsFilter::WriteCBMPHeader (FILE *fp, int width, int height)
108 adj_c_width = (width / 4 + 1) * 4;
110 color_raster = new BYTE[adj_c_width * 3];
111 memset (color_raster, 0xFF, adj_c_width * 3);
112 CreateBMPHeader(adj_c_width, height, 3, 8);
113 fwrite (&this->bmfh.bfType, 1, sizeof (short), fp);
114 fwrite (&this->bmfh.bfSize, 1, sizeof (int), fp);
115 fwrite (&this->bmfh.bfReserved1, 1, sizeof (short), fp);
116 fwrite (&this->bmfh.bfReserved2, 1, sizeof (short), fp);
117 fwrite (&this->bmfh.bfOffBits, 1, sizeof (int), fp);
118 fwrite (&this->bmih, 1, DBITMAPINFOHEADER, fp);
121 void HPCupsFilter::WriteKBMPHeader(FILE *fp, int width, int height)
129 adj_k_width = (width / 32 + 1) * 32;
131 CreateBMPHeader(adj_k_width, height, 1, 1);
133 black_raster = new BYTE[adj_k_width];
134 memset (black_raster, 0, adj_k_width);
136 fwrite (&this->bmfh.bfType, 1, sizeof (short), fp);
137 fwrite (&this->bmfh.bfSize, 1, sizeof (int), fp);
138 fwrite (&this->bmfh.bfReserved1, 1, sizeof (short), fp);
139 fwrite (&this->bmfh.bfReserved2, 1, sizeof (short), fp);
140 fwrite (&this->bmfh.bfOffBits, 1, sizeof (int), fp);
141 fwrite (&this->bmih, 1, DBITMAPINFOHEADER, fp);
142 memset(cmap, 0, sizeof(cmap));
143 cmap[0] = cmap[1] = cmap[2] = cmap[3] = 255;
144 fwrite(cmap, 1, sizeof(cmap), fp);
147 void HPCupsFilter::WriteBMPRaster (FILE *fp, BYTE *raster, int width, eRasterType raster_type)
149 if (raster_type == BLACK_RASTER)
150 return WriteKBMPRaster (fp, raster, width);
152 return WriteCBMPRaster (fp, raster, width);
155 void HPCupsFilter::WriteCBMPRaster (FILE *fp, BYTE *pbyrgb, int width)
162 BYTE *q = color_raster;
165 memset (color_raster, 0xFF, adj_c_width * 3);
169 for (i = 0; i < width; i++) {
177 fwrite (color_raster, 1, adj_c_width * 3, fp);
180 void HPCupsFilter::WriteKBMPRaster (FILE *fp, BYTE *pbyk, int width)
186 memset (black_raster, 0, adj_k_width);
190 memcpy (black_raster, pbyk, width);
192 fwrite (black_raster, 1, adj_k_width, fp);
195 HPCupsFilter::HPCupsFilter() : m_pPrinterBuffer(NULL)
197 setbuf (stderr, NULL);
205 HPCupsFilter::~HPCupsFilter()
210 void HPCupsFilter::closeFilter ()
212 //! If we printed any pages, end the current job instance.
217 void HPCupsFilter::cleanup()
219 if (m_pPrinterBuffer) {
220 delete [] m_pPrinterBuffer;
229 void HPCupsFilter::CancelJob()
235 DRIVER_ERROR HPCupsFilter::startPage (cups_page_header2_t *cups_header)
237 DRIVER_ERROR err = NO_ERROR;
239 int xoverspray = 120;
243 * Check for invalid data
245 if (cups_header->HWResolution[0] == 100 && cups_header->HWResolution[1] == 100)
249 * Something went wrong, cups is defaulting to 100 dpi.
250 * Some inkjet printers do not support 100 dpi. Return error.
253 dbglog("ERROR: Unsupported resolution\n");
257 // XOverSpray and YOverSpray are entered as fractional value * 1000
259 if (((attr = ppdFindAttr(m_ppd, "HPXOverSpray", NULL)) != NULL) &&
260 (attr && attr->value != NULL)) {
261 xoverspray = atoi(attr->value);
263 if (((attr = ppdFindAttr(m_ppd, "HPYOverSpray", NULL)) != NULL) &&
264 (attr && attr->value != NULL)) {
265 yoverspray = atoi(attr->value);
268 if (m_iLogLevel & BASIC_LOG) {
269 printCupsHeaderInfo(cups_header);
272 m_JA.quality_attributes.media_type = cups_header->cupsMediaType;
273 m_JA.quality_attributes.print_quality = atoi(cups_header->OutputType);
274 m_JA.quality_attributes.horizontal_resolution = cups_header->HWResolution[0];
275 m_JA.quality_attributes.vertical_resolution = cups_header->HWResolution[1];
276 m_JA.quality_attributes.actual_vertical_resolution = cups_header->HWResolution[1];
278 // Get the printer's actual resolution, may be different than what is reported
280 if ((p = strstr (cups_header->OutputType, "_"))) {
284 while (*p && *p != 'x')
286 if (*p && *p == 'x') {
290 // Currently, there is one printer with one printmode that supports lower y-resolution
292 m_JA.quality_attributes.actual_vertical_resolution = y;
295 m_JA.color_mode = cups_header->cupsRowStep;
296 m_JA.media_source = cups_header->MediaPosition;
298 m_JA.print_borderless = (cups_header->ImagingBoundingBox[0] == 0) ? true : false;
299 if (cups_header->Duplex) {
300 m_JA.e_duplex_mode = (cups_header->Tumble == 0) ? DUPLEXMODE_BOOK : DUPLEXMODE_TABLET;
303 m_JA.e_duplex_mode = DUPLEXMODE_NONE;
305 m_JA.krgb_mode = (cups_header->cupsColorSpace == CUPS_CSPACE_RGBW) ? true : false;
308 * Cups PageSize dimensions are in PostScript units, which are 72 units to an inch
309 * and is stored as <width, height>
310 * The ImagingBoundingBox is in PostScript units and are stored as <lower_left> <upper_right>
311 * and <0, 0> is at the bottom left
312 * lower_left_x = ImagingBoundingBox[0]
313 * lower_left_y = ImagingBoundingBox[1]
314 * upper_right_x = ImagingBoundingBox[2]
315 * upper_right_y = ImagingBoundingBox[3]
316 * We require <top_left> <bottom_right> values and <0, 0> is top left
318 * PrintableStartX = lower_left_x
319 * PrintableStartY = PhysicalPageHeight - upper_right_y
322 int horz_res = cups_header->HWResolution[0];
323 int vert_res = cups_header->HWResolution[1];
324 m_JA.media_attributes.pcl_id = cups_header->cupsInteger[0];
325 m_JA.media_attributes.physical_width = (cups_header->PageSize[0] * horz_res) / 72;
326 m_JA.media_attributes.physical_height = (cups_header->PageSize[1] * vert_res) / 72;
327 m_JA.media_attributes.printable_width = cups_header->cupsWidth;
328 m_JA.media_attributes.printable_height = cups_header->cupsHeight;
330 m_JA.media_attributes.printable_start_x = (cups_header->Margins[0] * horz_res) / 72;
331 m_JA.media_attributes.printable_start_y = ((cups_header->PageSize[1] - cups_header->ImagingBoundingBox[3]) * vert_res) / 72;
333 m_JA.media_attributes.horizontal_overspray = (xoverspray * horz_res) / 1000;
334 m_JA.media_attributes.vertical_overspray = (yoverspray * vert_res) / 1000;
337 * Left and top overspray in dots. We haven't defined ovespray for all classes in the drv.
338 * Hence using default values in the case of older classes.
340 m_JA.media_attributes.left_overspray = cups_header->cupsReal[0] ? (cups_header->cupsReal[0] * horz_res) : m_JA.media_attributes.horizontal_overspray / 2;
341 m_JA.media_attributes.top_overspray = cups_header->cupsReal[1] ? (cups_header->cupsReal[1] * vert_res) : m_JA.media_attributes.vertical_overspray / 2;
343 if (((attr = ppdFindAttr(m_ppd, "HPMechOffset", NULL)) != NULL) &&
344 (attr && attr->value != NULL)) {
345 m_JA.mech_offset = atoi(attr->value);
348 // Get printer platform name
349 if (((attr = ppdFindAttr(m_ppd, "hpPrinterPlatform", NULL)) != NULL) && (attr->value != NULL)) {
351 strncpy(m_JA.printer_platform, attr->value, sizeof(m_JA.printer_platform)-1);
353 if (m_iLogLevel & BASIC_LOG) {
354 dbglog("HPCUPS: found Printer Platform, it is - %s\n", attr->value);
357 if(strcmp(m_JA.printer_platform, "ljzjscolor") == 0){
358 if(((attr = ppdFindAttr(m_ppd, "hpLJZjsColorVersion", NULL)) != NULL) && (attr->value != NULL)){
359 m_JA.printer_platform_version = atoi(attr->value);
364 //Get Raster Preprocessing status
365 if(((attr = ppdFindAttr(m_ppd, "hpReverseRasterPages", NULL)) != NULL) && (attr->value != NULL)){
366 m_JA.pre_process_raster = atoi(attr->value);
370 // Get the encapsulation technology from ppd
372 if (((attr = ppdFindAttr(m_ppd, "hpPrinterLanguage", NULL)) == NULL) ||
373 (attr && attr->value == NULL)) {
374 dbglog("DEBUG: Bad PPD - hpPrinterLanguage not found\n");
379 strncpy(m_JA.printer_language, attr->value, sizeof(m_JA.printer_language)-1);
380 if (m_iLogLevel & BASIC_LOG) {
381 dbglog("HPCUPS: found Printer Language, it is - %s\n", attr->value);
384 // Fill in the other PCL header info
386 struct utsname uts_name;
388 strncpy(m_JA.job_title, m_argv[3], sizeof(m_JA.job_title)-1);
389 strncpy(m_JA.user_name, m_argv[2], sizeof(m_JA.user_name)-1);
390 strncpy(m_JA.host_name, uts_name.nodename, sizeof(m_JA.host_name)-1);
391 strncpy(m_JA.os_name, uts_name.sysname, sizeof(m_JA.os_name)-1);
392 getdomainname(m_JA.domain_name, sizeof(m_JA.domain_name) - 1);
393 int i = strlen(m_argv[0]) - 1;
394 while (i >= 0 && m_argv[0][i] != '/') {
397 snprintf(m_JA.driver_name, sizeof(m_JA.driver_name), "%s; %s", &m_argv[0][i+1], HP_FILE_VERSION_STR);
398 char *ptr = getenv("DEVICE_URI");
404 m_JA.printer_name[i++] = ' ';
406 m_JA.printer_name[i++] = *ptr++;
410 string strPrinterURI="" ,strPrinterName= "";
411 m_DBusComm.initDBusComm(DBUS_PATH,DBUS_INTERFACE, getenv("DEVICE_URI"), m_JA.printer_name);
413 ptr = strstr(m_argv[5], "job-uuid");
415 strncpy(m_JA.uuid, ptr + strlen("job-uuid=urn:uuid:"), sizeof(m_JA.uuid)-1);
418 for (i = 0; i < 16; i++)
419 m_JA.integer_values[i] = cups_header->cupsInteger[i];
421 if (cups_header->cupsString[0]) {
422 strncpy(m_JA.quality_attributes.print_mode_name, &cups_header->cupsString[0][0],
423 sizeof(m_JA.quality_attributes.print_mode_name)-1);
425 Encapsulator *encap_interface = EncapsulatorFactory::GetEncapsulator(attr->value);
426 if ((err = m_Job.Init(m_pSys, &m_JA, encap_interface)) != NO_ERROR)
428 if (err == PLUGIN_LIBRARY_MISSING)
430 fputs ("STATE: +hplip.plugin-error\n", stderr);
432 m_DBusComm.sendEvent(EVENT_PRINT_FAILED_MISSING_PLUGIN, "Plugin missing", m_JA.job_id, m_JA.user_name);
435 dbglog ("m_Job initialization failed with error = %d", err);
441 if (m_iLogLevel & BASIC_LOG) {
442 dbglog("HPCUPS: returning NO_ERROR from startPage\n");
445 m_pPrinterBuffer = new BYTE[cups_header->cupsWidth * 4 + 32];
451 int HPCupsFilter::StartPrintJob(int argc, char *argv[])
454 cups_raster_t *cups_raster;
457 memset(&m_JA, 0, sizeof(JobAttributes));
462 t = localtime(&long_time);
464 strncpy(m_JA.job_start_time, asctime(t), sizeof(m_JA.job_start_time)-1); // returns Fri Jun 5 08:12:16 2009
465 snprintf(m_JA.job_start_time+19, sizeof(m_JA.job_start_time) - 20, ":%d %d", tb.millitm, t->tm_year + 1900); // add milliseconds
468 m_JA.job_id = atoi(argv[1]);
471 memset(dFileName, 0, sizeof(dFileName));
472 m_JA.job_id = atoi(argv[1]);
473 snprintf (dFileName, sizeof(dFileName), "/var/spool/cups/d%05d-001", m_JA.job_id);
474 if ((fp = fopen (dFileName, "r")))
477 for (int i = 0; i < 10; i++)
479 fgets (line, 256, fp);
480 if (!strncmp (line, "%%Pages:", 8))
482 sscanf (line+9, "%d", &m_JA.total_pages);
489 m_ppd = ppdOpenFile(getenv("PPD"));
491 dbglog("DEBUG: ppdOpenFile failed for %s\n", getenv("PPD"));
496 if (m_iLogLevel & BASIC_LOG) {
497 for (int i = 0; i < argc; i++) {
498 dbglog("argv[%d] = %s\n", i, argv[i]);
504 if (m_iLogLevel & BASIC_LOG)
506 dbglog("Page Stream Data Name: %s\n", argv[6] );
508 if ((fd = open (argv[6], O_RDONLY)) == -1)
510 perror("ERROR: Unable to open raster file - ");
515 m_pSys = new SystemServices(m_iLogLevel, m_JA.job_id);
518 * When user cancels a print job, the spooler sends SIGTERM signal
519 * to the filter. Must catch this signal to send end job sequence
523 signal(SIGTERM, HPCancelJob);
526 cups_raster = cupsRasterOpen(fd, CUPS_RASTER_READ);
528 if (cups_raster == NULL) {
529 dbglog("cupsRasterOpen failed, fd = %d\n", fd);
537 if ((err = processRasterData(cups_raster))) {
541 if (m_iLogLevel & BASIC_LOG)
542 dbglog("HPCUPS: processRasterData returned %d, calling closeFilter()", err);
544 cupsRasterClose(cups_raster);
551 if (m_iLogLevel & BASIC_LOG)
552 dbglog("HPCUPS: StartPrintJob end of job, calling closeFilter()");
554 cupsRasterClose(cups_raster);
558 bool HPCupsFilter::isBlankRaster(BYTE *input_raster, cups_page_header2_t *header)
560 int length_in_bytes = (int)header->cupsBytesPerLine;
561 if (input_raster == NULL) {
565 if(header->cupsColorSpace == CUPS_CSPACE_K){
566 if (*input_raster == 0x00 &&
567 !(memcmp(input_raster + 1, input_raster, length_in_bytes - 1))) {
572 if (*input_raster == 0xFF &&
573 !(memcmp(input_raster + 1, input_raster, length_in_bytes - 1))) {
581 int HPCupsFilter::processRasterData(cups_raster_t *cups_raster)
585 BYTE *kRaster = NULL;
586 BYTE *rgbRaster = NULL;
587 int current_page_number = 0;
588 cups_page_header2_t cups_header;
591 char hpPreProcessedRasterFile[] = "/tmp/hplipSwapedPagesXXXXXX"; //temp file needed to store raster data with swaped pages.
593 while (cupsRasterReadHeader2(cups_raster, &cups_header))
595 current_page_number++;
597 if (current_page_number == 1) {
599 if (startPage(&cups_header) != NO_ERROR) {
603 if(m_JA.pre_process_raster) {
604 err = m_Job.preProcessRasterData(&cups_raster, &cups_header, hpPreProcessedRasterFile);
605 if (err != NO_ERROR) {
606 if (m_iLogLevel & BASIC_LOG) {
607 dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err);
609 ret_status = JOB_CANCELED;
614 if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) {
615 rgbRaster = new BYTE[cups_header.cupsWidth * 3];
616 if (rgbRaster == NULL) {
617 return ALLOCMEM_ERROR;
619 kRaster = new BYTE[cups_header.cupsWidth];
620 if (kRaster == NULL) {
622 return ALLOCMEM_ERROR;
624 memset (kRaster, 0, cups_header.cupsWidth);
625 memset (rgbRaster, 0xFF, cups_header.cupsWidth * 3);
627 } // current_page_number == 1
629 if (cups_header.cupsColorSpace == CUPS_CSPACE_K) {
630 kRaster = m_pPrinterBuffer;
633 else if (cups_header.cupsColorSpace != CUPS_CSPACE_RGBW) {
634 rgbRaster = m_pPrinterBuffer;
638 BYTE *color_raster = NULL;
639 BYTE *black_raster = NULL;
641 err = m_Job.StartPage(&m_JA);
642 if (err != NO_ERROR) {
643 if (m_iLogLevel & BASIC_LOG) {
644 dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err);
646 ret_status = JOB_CANCELED;
650 if (m_iLogLevel & SAVE_INPUT_RASTERS)
653 memset(szFileName, 0, sizeof(szFileName));
654 snprintf (szFileName, sizeof(szFileName), "/tmp/hpcupsfilterc_%d.bmp", current_page_number);
655 if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW ||
656 cups_header.cupsColorSpace == CUPS_CSPACE_RGB)
658 cfp = fopen (szFileName, "w");
659 chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
661 if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW ||
662 cups_header.cupsColorSpace == CUPS_CSPACE_K)
664 szFileName[17] = 'k';
665 kfp = fopen (szFileName, "w");
666 chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
669 WriteBMPHeader (cfp, cups_header.cupsWidth, cups_header.cupsHeight, COLOR_RASTER);
670 WriteBMPHeader (kfp, cups_header.cupsWidth, cups_header.cupsHeight, BLACK_RASTER);
673 fprintf(stderr, "PAGE: %d %s\r\n", current_page_number, m_argv[4]);
674 // Iterating through the raster per page
675 for (int y = 0; y < (int) cups_header.cupsHeight; y++) {
676 cupsRasterReadPixels (cups_raster, m_pPrinterBuffer, cups_header.cupsBytesPerLine);
677 color_raster = rgbRaster;
678 black_raster = kRaster;
680 if(y == 0 && (0 == strcmp(m_JA.printer_language, "ljmono")) )
682 //For ljmono, make sure that first line is not a blankRaster line.Otherwise printer
683 //may not skip blank lines before actual data
684 //Need to revisit to crosscheck if it is a firmware issue.
686 *m_pPrinterBuffer = 0x01;
687 dbglog("First raster data plane.." );
690 if (this->isBlankRaster((BYTE *) m_pPrinterBuffer, &cups_header)) {
695 extractBlackPixels(&cups_header, black_raster, color_raster);
696 //! Sending Raster bits off to encapsulation
697 err = m_Job.SendRasters (black_raster, color_raster);
698 if (err != NO_ERROR) {
701 WriteBMPRaster (cfp, color_raster, cups_header.cupsWidth, COLOR_RASTER);
702 WriteBMPRaster (kfp, black_raster, cups_header.cupsWidth/8, BLACK_RASTER);
705 if (err != NO_ERROR) {
710 //! Remove the old processing band data...
711 if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) {
716 unlink(hpPreProcessedRasterFile);
720 void HPCupsFilter::extractBlackPixels(cups_page_header2_t *cups_header, BYTE *kRaster, BYTE *rgbRaster)
723 * DON'T DO BITPACKING HERE, DO IT IN HALFTONER FOR CMYK PRINTES
724 * AND IN MODE9 FOR RGB PRINTERS
727 static BYTE pixel_value[8] = {
728 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
731 if (rgbRaster == NULL) {
735 if (cups_header->cupsColorSpace == CUPS_CSPACE_RGBW) {
737 BYTE *pIn = m_pPrinterBuffer;
740 BYTE *rgb = rgbRaster;
741 BYTE *black = kRaster;
742 memset (kRaster, 0, cups_header->cupsWidth);
745 for (unsigned int i = 0; i < cups_header->cupsWidth; i++) {
753 //If W component is 0 (means black is 1) then no need of having RGB for that pixel.
754 //ghostscript >= 8.71 sends both W and RGB for black pixel(i.e RGBW=(0,0,0,0)).
755 kVal |= pixel_value[k];
760 else if(white == 0xFF)
767 cr = rgb[0] - (int)(255 - white);
768 rgb[0] = cr >= 0 ? cr : 0;
770 cg = rgb[1] - (int)(255 - white);
771 rgb[1] = cg >= 0 ? cg : 0;
773 cb = rgb[2] - (int)(255 - white);
774 rgb[2] = cb >= 0 ? cb : 0;
789 } // end of if condition
792 void HPCupsFilter::printCupsHeaderInfo(cups_page_header2_t *header)
795 dbglog ("DEBUG: startPage...\n");
796 dbglog ("DEBUG: MediaClass = \"%s\"\n", header->MediaClass);
797 dbglog ("DEBUG: MediaColor = \"%s\"\n", header->MediaColor);
798 dbglog ("DEBUG: MediaType = \"%s\"\n", header->MediaType);
799 dbglog ("DEBUG: OutputType = \"%s\"\n", header->OutputType);
800 dbglog ("DEBUG: AdvanceDistance = %d\n", header->AdvanceDistance);
801 dbglog ("DEBUG: AdvanceMedia = %d\n", header->AdvanceMedia);
802 dbglog ("DEBUG: Collate = %d\n", header->Collate);
803 dbglog ("DEBUG: CutMedia = %d\n", header->CutMedia);
804 dbglog ("DEBUG: Duplex = %d\n", header->Duplex);
805 dbglog ("DEBUG: HWResolution = [ %d %d ]\n", header->HWResolution[0], header->HWResolution[1]);
806 dbglog ("DEBUG: ImagingBoundingBox = [ %d %d %d %d ]\n",
807 header->ImagingBoundingBox[0], header->ImagingBoundingBox[1],
808 header->ImagingBoundingBox[2], header->ImagingBoundingBox[3]);
809 dbglog ("DEBUG: InsertSheet = %d\n", header->InsertSheet);
810 dbglog ("DEBUG: Jog = %d\n", header->Jog);
811 dbglog ("DEBUG: LeadingEdge = %d\n", header->LeadingEdge);
812 dbglog ("DEBUG: Margins = [ %d %d ]\n", header->Margins[0], header->Margins[1]);
813 dbglog ("DEBUG: ManualFeed = %d\n", header->ManualFeed);
814 dbglog ("DEBUG: MediaPosition = %d\n", header->MediaPosition);
815 dbglog ("DEBUG: MediaWeight = %d\n", header->MediaWeight);
816 dbglog ("DEBUG: MirrorPrint = %d\n", header->MirrorPrint);
817 dbglog ("DEBUG: NegativePrint = %d\n", header->NegativePrint);
818 dbglog ("DEBUG: NumCopies = %d\n", header->NumCopies);
819 dbglog ("DEBUG: Orientation = %d\n", header->Orientation);
820 dbglog ("DEBUG: OutputFaceUp = %d\n", header->OutputFaceUp);
821 dbglog ("DEBUG: PageSize = [ %d %d ]\n", header->PageSize[0], header->PageSize[1]);
822 dbglog ("DEBUG: Separations = %d\n", header->Separations);
823 dbglog ("DEBUG: TraySwitch = %d\n", header->TraySwitch);
824 dbglog ("DEBUG: Tumble = %d\n", header->Tumble);
825 dbglog ("DEBUG: cupsWidth = %d\n", header->cupsWidth);
826 dbglog ("DEBUG: cupsHeight = %d\n", header->cupsHeight);
827 dbglog ("DEBUG: cupsMediaType = %d\n", header->cupsMediaType);
828 dbglog ("DEBUG: cupsRowStep = %d\n", header->cupsRowStep);
829 dbglog ("DEBUG: cupsBitsPerColor = %d\n", header->cupsBitsPerColor);
830 dbglog ("DEBUG: cupsBitsPerPixel = %d\n", header->cupsBitsPerPixel);
831 dbglog ("DEBUG: cupsBytesPerLine = %d\n", header->cupsBytesPerLine);
832 dbglog ("DEBUG: cupsColorOrder = %d\n", header->cupsColorOrder);
833 dbglog ("DEBUG: cupsColorSpace = %d\n", header->cupsColorSpace);
834 dbglog ("DEBUG: cupsCompression = %d\n", header->cupsCompression);
835 dbglog ("DEBUG: cupsPageSizeName = %s\n", header->cupsPageSizeName);
836 dbglog ("DEBUG: cupsInteger0 = %d\n", header->cupsInteger[0]); // max jpeg filesize
837 dbglog ("DEBUG: cupsInteger1 = %d\n", header->cupsInteger[1]); // Red eye removal
838 dbglog ("DEBUG: cupsInteger2 = %d\n", header->cupsInteger[2]); // Photo fix (RLT)
839 dbglog ("DEBUG: cupsString0 = %s\n", header->cupsString[0]); // print_mode_name
840 dbglog ("DEBUG: cupsReal0 = %f\n", header->cupsReal[0]); // Left overspray
841 dbglog ("DEBUG: cupsReal1 = %f\n", header->cupsReal[1]); // Top overspray
844 void HPCupsFilter::getLogLevel ()
849 fp = fopen ("/etc/cups/cupsd.conf", "r");
854 if (!fgets (str, 256, fp))
858 if ((p = strstr (str, "hpLogLevel")))
860 p += strlen ("hpLogLevel") + 1;
861 m_iLogLevel = atoi (p);