/* * File: ximajbg.cpp * Purpose: Platform Independent JBG Image Class Loader and Writer * 18/Aug/2002 Davide Pizzolato - www.xdp.it * CxImage version 7.0.0 31/Dec/2010 */ #include "ximajbg.h" #if CXIMAGE_SUPPORT_JBG #include "ximaiter.h" #define JBIG_BUFSIZE 8192 //////////////////////////////////////////////////////////////////////////////// #if CXIMAGE_SUPPORT_DECODE //////////////////////////////////////////////////////////////////////////////// bool CxImageJBG::Decode(CxFile *hFile) { if (hFile == NULL) return false; struct jbg_dec_state jbig_state; uint32_t xmax = 4294967295UL, ymax = 4294967295UL; uint32_t len, cnt; uint8_t *buffer=0,*p; int32_t result; cx_try { jbg_dec_init(&jbig_state); jbg_dec_maxsize(&jbig_state, xmax, ymax); buffer = (uint8_t*)malloc(JBIG_BUFSIZE); if (!buffer) cx_throw("Sorry, not enough memory available!"); result = JBG_EAGAIN; do { len = hFile->Read(buffer, 1, JBIG_BUFSIZE); if (!len) break; cnt = 0; p = buffer; while (len > 0 && (result == JBG_EAGAIN || result == JBG_EOK)) { result = jbg_dec_in(&jbig_state, p, len, &cnt); p += cnt; len -= cnt; } } while (result == JBG_EAGAIN || result == JBG_EOK); if (hFile->Error()) cx_throw("Problem while reading input file"); if (result != JBG_EOK && result != JBG_EOK_INTR) cx_throw("Problem with input file"); int32_t w, h, bpp, planes, ew; w = jbg_dec_getwidth(&jbig_state); h = jbg_dec_getheight(&jbig_state); planes = jbg_dec_getplanes(&jbig_state); bpp = (planes+7)>>3; ew = (w + 7)>>3; if (info.nEscape == -1){ head.biWidth = w; head.biHeight= h; info.dwType = CXIMAGE_FORMAT_JBG; cx_throw("output dimensions returned"); } switch (planes){ case 1: { uint8_t* binary_image = jbg_dec_getimage(&jbig_state, 0); if (!Create(w,h,1,CXIMAGE_FORMAT_JBG)) cx_throw(""); SetPaletteColor(0,255,255,255); SetPaletteColor(1,0,0,0); CImageIterator iter(this); iter.Upset(); for (int32_t i=0;i>3; ew = (w + 7)>>3; uint8_t mask; RGBQUAD *rgb = GetPalette(); if (CompareColors(&rgb[0],&rgb[1])<0) mask=255; else mask=0; uint8_t *buffer = (uint8_t*)malloc(ew*h*2); if (!buffer) { strcpy(info.szLastError,"Sorry, not enough memory available!"); return false; } for (y=0; yError()){ strcpy(info.szLastError,"Problem while writing JBG file"); return false; } return true; } //////////////////////////////////////////////////////////////////////////////// #endif // CXIMAGE_SUPPORT_JBG