ERR PKImageEncode_WritePixels_BMP( PKImageEncode* pIE, U32 cLine, U8* pbPixel, U32 cbStride) { ERR err = WMP_errSuccess; struct WMPStream* pS = pIE->pStream; size_t cbLineM = 0, cbLineS = 0; I32 i = 0; static U8 pPadding[4] = {0}; // header if (!pIE->fHeaderDone) { // WriteBMPHeader() also inits this object Call(WriteBMPHeader(pIE)); } // body // calculate line size in memory and in stream cbLineM = pIE->cbPixel * pIE->uWidth; cbLineS = (cbLineM + 3) / 4 * 4; //FailIf(pRect->X < 0 || pID->uWidth <= pRect->X, WMP_errInvalidParameter); //FailIf(pRect->Y < 0 || pID->uHeight <= pRect->Y, WMP_errInvalidParameter); //FailIf(pRect->Width < 0 || pID->uWidth < pRect->X + pRect->Width, WMP_errInvalidParameter); //FailIf(pRect->Height < 0 || pID->uHeight < pRect->Y + pRect->Height, WMP_errInvalidParameter); FailIf(cbStride < cbLineM, WMP_errInvalidParameter); for (i = cLine - 1; 0 <= i; --i) { size_t offM = cbStride * i; size_t offS = cbLineS * (pIE->uHeight - (pIE->idxCurrentLine + i + 1)); Call(pS->SetPos(pS, pIE->offPixel + offS)); Call(pS->Write(pS, pbPixel + offM, cbLineM)); } Call(pS->Write(pS, pPadding, (cbLineS - cbLineM))); pIE->idxCurrentLine += cLine; Cleanup: return err; }
uint8_t GetImageIfAvailiable(FIL *File, uint8_t CameraID) { if( ((CameraID == 0) && (VSYNC_0_Count == 3)) || ((CameraID == 1) && (VSYNC_1_Count == 3)) ) { //Write Bitmap Headers WriteBMPHeader(File); WriteDIBHeader(File); if (CameraID == 0) { //Enable output of Camera 0 FIFO_nOE_0_CLR; //Reset Read Pointer FIFO_nRRST_0_CLR; FIFO_RCLK_0_SET; FIFO_RCLK_0_CLR; FIFO_nRRST_0_SET; } else { //Enable output of Camera 0 FIFO_nOE_1_CLR; //Reset Read Pointer FIFO_nRRST_1_CLR; FIFO_RCLK_1_SET; FIFO_RCLK_1_CLR; FIFO_nRRST_1_SET; } int i, j; uint32_t pointer; uint16_t Temp; uint32_t p; FRESULT fr; //for(j = HEIGHT; j>0; j--) for(j = 0; j < HEIGHT; j++) { pointer = 0; for(i = 0; i < WIDTH; i++) { Temp = FIFO_TO_AVR(CameraID); //USART0_Senduint16(Temp); Buff[pointer++] = (uint8_t)(Temp >> 8); Buff[pointer++] = (uint8_t)Temp; } pointer = (uint32_t)j * (uint32_t)WIDTH * 2 + BMPHEADERSIZE + DIBHEADERSIZE; f_lseek(File, pointer); fr = f_write(File, Buff, WIDTH * 2, &p); if(fr != FR_OK) { //printf("Write Fail.\n"); VSYNC_0_Count = 0; VSYNC_1_Count = 0; FIFO_Reset(CameraID); FIFO_nOE_0_SET; FIFO_nOE_1_SET; return 1; } } FIFO_Reset(CameraID); //fr = f_close(File); FIFO_nOE_0_SET; FIFO_nOE_1_SET; return 0; }
int HPCupsFilter::processRasterData(cups_raster_t *cups_raster) { FILE *kfp = NULL; FILE *cfp = NULL; BYTE *kRaster = NULL; BYTE *rgbRaster = NULL; int current_page_number = 0; cups_page_header2_t cups_header; DRIVER_ERROR err; int ret_status = 0; char hpPreProcessedRasterFile[MAX_FILE_PATH_LEN]; //temp file needed to store raster data with swaped pages. sprintf(hpPreProcessedRasterFile, "%s/hp_%s_cups_SwapedPagesXXXXXX",CUPS_TMP_DIR, m_JA.user_name); while (cupsRasterReadHeader2(cups_raster, &cups_header)) { current_page_number++; if (current_page_number == 1) { if (startPage(&cups_header) != NO_ERROR) { return JOB_CANCELED; } if (m_JA.pre_process_raster) { // CC ToDo: Why pSwapedPagesFileName should be sent as a parameter? // Remove if not required to send it as parameter err = m_Job.preProcessRasterData(&cups_raster, &cups_header, hpPreProcessedRasterFile); if (err != NO_ERROR) { if (m_iLogLevel & BASIC_LOG) { dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err); } ret_status = JOB_CANCELED; break; } } if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) { rgbRaster = new BYTE[cups_header.cupsWidth * 3]; if (rgbRaster == NULL) { return ALLOCMEM_ERROR; } kRaster = new BYTE[cups_header.cupsWidth]; if (kRaster == NULL) { delete [] rgbRaster; return ALLOCMEM_ERROR; } memset (kRaster, 0, cups_header.cupsWidth); memset (rgbRaster, 0xFF, cups_header.cupsWidth * 3); } } // end of if(current_page_number == 1) if (cups_header.cupsColorSpace == CUPS_CSPACE_K) { kRaster = m_pPrinterBuffer; rgbRaster = NULL; } else if (cups_header.cupsColorSpace != CUPS_CSPACE_RGBW) { rgbRaster = m_pPrinterBuffer; kRaster = NULL; } BYTE *color_raster = NULL; BYTE *black_raster = NULL; err = m_Job.StartPage(&m_JA); if (err != NO_ERROR) { if (m_iLogLevel & BASIC_LOG) { dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err); } ret_status = JOB_CANCELED; break; } // Save Raster file for Debugging if (m_iLogLevel & SAVE_INPUT_RASTERS) { char szFileName[MAX_FILE_PATH_LEN]; memset(szFileName, 0, sizeof(szFileName)); if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW || cups_header.cupsColorSpace == CUPS_CSPACE_RGB) { snprintf (szFileName, sizeof(szFileName), "%s/hpcups_%s_c_bmp_%d_XXXXXX", CUPS_TMP_DIR, m_JA.user_name, current_page_number); createTempFile(szFileName, &cfp); if (cfp) { chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); } } if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW || cups_header.cupsColorSpace == CUPS_CSPACE_K) { snprintf (szFileName, sizeof(szFileName), "%s/hpcups_%s_k_bmp_%d_XXXXXX", CUPS_TMP_DIR, m_JA.user_name, current_page_number); createTempFile(szFileName, &kfp); if (kfp) { chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); } } WriteBMPHeader (cfp, cups_header.cupsWidth, cups_header.cupsHeight, COLOR_RASTER); WriteBMPHeader (kfp, cups_header.cupsWidth, cups_header.cupsHeight, BLACK_RASTER); } fprintf(stderr, "PAGE: %d %s\r\n", current_page_number, m_argv[4]); // Iterating through the raster per page bool is_ljmono = strcmp(m_JA.printer_language, "ljmono"); for (int y = 0; y < (int) cups_header.cupsHeight; y++) { cupsRasterReadPixels (cups_raster, m_pPrinterBuffer, cups_header.cupsBytesPerLine); color_raster = rgbRaster; black_raster = kRaster; if ((y == 0) && !is_ljmono) { //For ljmono, make sure that first line is not a blankRaster line.Otherwise printer //may not skip blank lines before actual data //Need to revisit to cross check if it is a firmware issue. *m_pPrinterBuffer = 0x01; dbglog("First raster data plane..\n" ); } if (this->isBlankRaster((BYTE *) m_pPrinterBuffer, &cups_header)) { color_raster = NULL; black_raster = NULL; } extractBlackPixels(&cups_header, black_raster, color_raster); //! Sending Raster bits off to encapsulation err = m_Job.SendRasters (black_raster, color_raster); if (err != NO_ERROR) { break; } if (m_iLogLevel & SAVE_INPUT_RASTERS) { WriteBMPRaster (cfp, color_raster, cups_header.cupsWidth, COLOR_RASTER); WriteBMPRaster (kfp, black_raster, cups_header.cupsWidth/8, BLACK_RASTER); } } // for() loop end m_Job.NewPage(); if (err != NO_ERROR) { break; } } // while() loop end //! Remove the old processing band data... if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) { delete [] kRaster; delete [] rgbRaster; kRaster = NULL; rgbRaster = NULL; } unlink(hpPreProcessedRasterFile); return ret_status; }
int HPCupsFilter::processRasterData(cups_raster_t *cups_raster) { FILE *kfp = NULL; FILE *cfp = NULL; BYTE *kRaster = NULL; BYTE *rgbRaster = NULL; int current_page_number = 0; cups_page_header2_t cups_header; DRIVER_ERROR err; int ret_status = 0; char hpPreProcessedRasterFile[] = "/tmp/hplipSwapedPagesXXXXXX"; //temp file needed to store raster data with swaped pages. while (cupsRasterReadHeader2(cups_raster, &cups_header)) { current_page_number++; if (current_page_number == 1) { if (startPage(&cups_header) != NO_ERROR) { return JOB_CANCELED; } if(m_JA.pre_process_raster) { err = m_Job.preProcessRasterData(&cups_raster, &cups_header, hpPreProcessedRasterFile); if (err != NO_ERROR) { if (m_iLogLevel & BASIC_LOG) { dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err); } ret_status = JOB_CANCELED; break; } } if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) { rgbRaster = new BYTE[cups_header.cupsWidth * 3]; if (rgbRaster == NULL) { return ALLOCMEM_ERROR; } kRaster = new BYTE[cups_header.cupsWidth]; if (kRaster == NULL) { delete [] rgbRaster; return ALLOCMEM_ERROR; } memset (kRaster, 0, cups_header.cupsWidth); memset (rgbRaster, 0xFF, cups_header.cupsWidth * 3); } } // current_page_number == 1 if (cups_header.cupsColorSpace == CUPS_CSPACE_K) { kRaster = m_pPrinterBuffer; rgbRaster = NULL; } else if (cups_header.cupsColorSpace != CUPS_CSPACE_RGBW) { rgbRaster = m_pPrinterBuffer; kRaster = NULL; } BYTE *color_raster = NULL; BYTE *black_raster = NULL; err = m_Job.StartPage(&m_JA); if (err != NO_ERROR) { if (m_iLogLevel & BASIC_LOG) { dbglog ("DEBUG: Job::StartPage failed with err = %d\n", err); } ret_status = JOB_CANCELED; break; } if (m_iLogLevel & SAVE_INPUT_RASTERS) { char szFileName[32]; memset(szFileName, 0, sizeof(szFileName)); snprintf (szFileName, sizeof(szFileName), "/tmp/hpcupsfilterc_%d.bmp", current_page_number); if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW || cups_header.cupsColorSpace == CUPS_CSPACE_RGB) { cfp = fopen (szFileName, "w"); chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); } if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW || cups_header.cupsColorSpace == CUPS_CSPACE_K) { szFileName[17] = 'k'; kfp = fopen (szFileName, "w"); chmod (szFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); } WriteBMPHeader (cfp, cups_header.cupsWidth, cups_header.cupsHeight, COLOR_RASTER); WriteBMPHeader (kfp, cups_header.cupsWidth, cups_header.cupsHeight, BLACK_RASTER); } fprintf(stderr, "PAGE: %d %s\r\n", current_page_number, m_argv[4]); // Iterating through the raster per page for (int y = 0; y < (int) cups_header.cupsHeight; y++) { cupsRasterReadPixels (cups_raster, m_pPrinterBuffer, cups_header.cupsBytesPerLine); color_raster = rgbRaster; black_raster = kRaster; if(y == 0 && (0 == strcmp(m_JA.printer_language, "ljmono")) ) { //For ljmono, make sure that first line is not a blankRaster line.Otherwise printer //may not skip blank lines before actual data //Need to revisit to crosscheck if it is a firmware issue. *m_pPrinterBuffer = 0x01; dbglog("First raster data plane.." ); } if (this->isBlankRaster((BYTE *) m_pPrinterBuffer, &cups_header)) { color_raster = NULL; black_raster = NULL; } extractBlackPixels(&cups_header, black_raster, color_raster); //! Sending Raster bits off to encapsulation err = m_Job.SendRasters (black_raster, color_raster); if (err != NO_ERROR) { break; } WriteBMPRaster (cfp, color_raster, cups_header.cupsWidth, COLOR_RASTER); WriteBMPRaster (kfp, black_raster, cups_header.cupsWidth/8, BLACK_RASTER); } m_Job.NewPage(); if (err != NO_ERROR) { break; } } //! Remove the old processing band data... if (cups_header.cupsColorSpace == CUPS_CSPACE_RGBW) { delete [] kRaster; delete [] rgbRaster; } unlink(hpPreProcessedRasterFile); return ret_status; }