-/*\r
- * File: ximajbg.cpp\r
- * Purpose: Platform Independent JBG Image Class Loader and Writer\r
- * 18/Aug/2002 Davide Pizzolato - www.xdp.it\r
- * CxImage version 6.0.0 02/Feb/2008\r
- */\r
-\r
-#include "ximajbg.h"\r
-\r
-#if CXIMAGE_SUPPORT_JBG\r
-\r
-#include "ximaiter.h"\r
-\r
-#define JBIG_BUFSIZE 8192\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-#if CXIMAGE_SUPPORT_DECODE\r
-////////////////////////////////////////////////////////////////////////////////\r
-bool CxImageJBG::Decode(CxFile *hFile)\r
-{\r
- if (hFile == NULL) return false;\r
-\r
- struct jbg_dec_state jbig_state;\r
- unsigned long xmax = 4294967295UL, ymax = 4294967295UL;\r
- unsigned int len, cnt;\r
- BYTE *buffer,*p;\r
- int result;\r
-\r
- cx_try\r
- {\r
- jbg_dec_init(&jbig_state);\r
- jbg_dec_maxsize(&jbig_state, xmax, ymax);\r
-\r
- buffer = (BYTE*)malloc(JBIG_BUFSIZE);\r
- if (!buffer) cx_throw("Sorry, not enough memory available!");\r
-\r
- result = JBG_EAGAIN;\r
- do {\r
- len = hFile->Read(buffer, 1, JBIG_BUFSIZE);\r
- if (!len) break;\r
- cnt = 0;\r
- p = buffer;\r
- while (len > 0 && (result == JBG_EAGAIN || result == JBG_EOK)) {\r
- result = jbg_dec_in(&jbig_state, p, len, &cnt);\r
- p += cnt;\r
- len -= cnt;\r
- }\r
- } while (result == JBG_EAGAIN || result == JBG_EOK);\r
-\r
- if (hFile->Error())\r
- cx_throw("Problem while reading input file");\r
- if (result != JBG_EOK && result != JBG_EOK_INTR)\r
- cx_throw("Problem with input file"); \r
-\r
- int w, h, bpp, planes, ew;\r
-\r
- w = jbg_dec_getwidth(&jbig_state);\r
- h = jbg_dec_getheight(&jbig_state);\r
- planes = jbg_dec_getplanes(&jbig_state);\r
- bpp = (planes+7)>>3;\r
- ew = (w + 7)>>3;\r
-\r
- if (info.nEscape == -1){\r
- head.biWidth = w;\r
- head.biHeight= h;\r
- info.dwType = CXIMAGE_FORMAT_JBG;\r
- cx_throw("output dimensions returned");\r
- }\r
-\r
- switch (planes){\r
- case 1:\r
- {\r
- BYTE* binary_image = jbg_dec_getimage(&jbig_state, 0);\r
-\r
- if (!Create(w,h,1,CXIMAGE_FORMAT_JBG))\r
- cx_throw("");\r
-\r
- SetPaletteColor(0,255,255,255);\r
- SetPaletteColor(1,0,0,0);\r
-\r
- CImageIterator iter(this);\r
- iter.Upset();\r
- for (int i=0;i<h;i++){\r
- iter.SetRow(binary_image+i*ew,ew);\r
- iter.PrevRow();\r
- }\r
-\r
- break;\r
- }\r
- default:\r
- cx_throw("cannot decode images with more than 1 plane");\r
- }\r
-\r
- jbg_dec_free(&jbig_state);\r
- free(buffer);\r
-\r
- } cx_catch {\r
- jbg_dec_free(&jbig_state);\r
- if (buffer) free(buffer);\r
- if (strcmp(message,"")) strncpy(info.szLastError,message,255);\r
- if (info.nEscape == -1 && info.dwType == CXIMAGE_FORMAT_JBG) return true;\r
- return false;\r
- }\r
- return true;\r
-}\r
-////////////////////////////////////////////////////////////////////////////////\r
-#endif //CXIMAGE_SUPPORT_DECODE\r
-////////////////////////////////////////////////////////////////////////////////\r
-bool CxImageJBG::Encode(CxFile * hFile)\r
-{\r
- if (EncodeSafeCheck(hFile)) return false;\r
-\r
- if (head.biBitCount != 1){\r
- strcpy(info.szLastError,"JBG can save only 1-bpp images");\r
- return false;\r
- }\r
-\r
- int w, h, bpp, planes, ew, i, j, x, y;\r
-\r
- w = head.biWidth;\r
- h = head.biHeight;\r
- planes = 1;\r
- bpp = (planes+7)>>3;\r
- ew = (w + 7)>>3;\r
-\r
- BYTE mask;\r
- RGBQUAD *rgb = GetPalette();\r
- if (CompareColors(&rgb[0],&rgb[1])<0) mask=255; else mask=0;\r
-\r
- BYTE *buffer = (BYTE*)malloc(ew*h*2);\r
- if (!buffer) {\r
- strcpy(info.szLastError,"Sorry, not enough memory available!");\r
- return false;\r
- }\r
-\r
- for (y=0; y<h; y++){\r
- i= y*ew;\r
- j= (h-y-1)*info.dwEffWidth;\r
- for (x=0; x<ew; x++){\r
- buffer[i + x]=info.pImage[j + x]^mask;\r
- }\r
- }\r
-\r
- struct jbg_enc_state jbig_state;\r
- jbg_enc_init(&jbig_state, w, h, planes, &buffer, jbig_data_out, hFile);\r
-\r
- //jbg_enc_layers(&jbig_state, 2);\r
- //jbg_enc_lrlmax(&jbig_state, 800, 600);\r
-\r
- // Specify a few other options (each is ignored if negative)\r
- int dl = -1, dh = -1, d = -1, l0 = -1, mx = -1;\r
- int options = JBG_TPDON | JBG_TPBON | JBG_DPON;\r
- int order = JBG_ILEAVE | JBG_SMID;\r
- jbg_enc_lrange(&jbig_state, dl, dh);\r
- jbg_enc_options(&jbig_state, order, options, l0, mx, -1);\r
-\r
- // now encode everything and send it to data_out()\r
- jbg_enc_out(&jbig_state);\r
-\r
- // give encoder a chance to free its temporary data structures\r
- jbg_enc_free(&jbig_state);\r
-\r
- free(buffer);\r
-\r
- if (hFile->Error()){\r
- strcpy(info.szLastError,"Problem while writing JBG file");\r
- return false;\r
- }\r
-\r
- return true;\r
-}\r
-////////////////////////////////////////////////////////////////////////////////\r
-#endif // CXIMAGE_SUPPORT_JBG\r
-\r
+/*
+ * File: ximajbg.cpp
+ * Purpose: Platform Independent JBG Image Class Loader and Writer
+ * 18/Aug/2002 Davide Pizzolato - www.xdp.it
+ * CxImage version 6.0.0 02/Feb/2008
+ */
+
+#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;
+ unsigned long xmax = 4294967295UL, ymax = 4294967295UL;
+ unsigned int len, cnt;
+ BYTE *buffer,*p;
+ int result;
+
+ cx_try
+ {
+ jbg_dec_init(&jbig_state);
+ jbg_dec_maxsize(&jbig_state, xmax, ymax);
+
+ buffer = (BYTE*)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");
+
+ int 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:
+ {
+ BYTE* 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 (int i=0;i<h;i++){
+ iter.SetRow(binary_image+i*ew,ew);
+ iter.PrevRow();
+ }
+
+ break;
+ }
+ default:
+ cx_throw("cannot decode images with more than 1 plane");
+ }
+
+ jbg_dec_free(&jbig_state);
+ free(buffer);
+
+ } cx_catch {
+ jbg_dec_free(&jbig_state);
+ if (buffer) free(buffer);
+ if (strcmp(message,"")) strncpy(info.szLastError,message,255);
+ if (info.nEscape == -1 && info.dwType == CXIMAGE_FORMAT_JBG) return true;
+ return false;
+ }
+ return true;
+}
+////////////////////////////////////////////////////////////////////////////////
+#endif //CXIMAGE_SUPPORT_DECODE
+////////////////////////////////////////////////////////////////////////////////
+bool CxImageJBG::Encode(CxFile * hFile)
+{
+ if (EncodeSafeCheck(hFile)) return false;
+
+ if (head.biBitCount != 1){
+ strcpy(info.szLastError,"JBG can save only 1-bpp images");
+ return false;
+ }
+
+ int w, h, bpp, planes, ew, i, j, x, y;
+
+ w = head.biWidth;
+ h = head.biHeight;
+ planes = 1;
+ bpp = (planes+7)>>3;
+ ew = (w + 7)>>3;
+
+ BYTE mask;
+ RGBQUAD *rgb = GetPalette();
+ if (CompareColors(&rgb[0],&rgb[1])<0) mask=255; else mask=0;
+
+ BYTE *buffer = (BYTE*)malloc(ew*h*2);
+ if (!buffer) {
+ strcpy(info.szLastError,"Sorry, not enough memory available!");
+ return false;
+ }
+
+ for (y=0; y<h; y++){
+ i= y*ew;
+ j= (h-y-1)*info.dwEffWidth;
+ for (x=0; x<ew; x++){
+ buffer[i + x]=info.pImage[j + x]^mask;
+ }
+ }
+
+ struct jbg_enc_state jbig_state;
+ jbg_enc_init(&jbig_state, w, h, planes, &buffer, jbig_data_out, hFile);
+
+ //jbg_enc_layers(&jbig_state, 2);
+ //jbg_enc_lrlmax(&jbig_state, 800, 600);
+
+ // Specify a few other options (each is ignored if negative)
+ int dl = -1, dh = -1, d = -1, l0 = -1, mx = -1;
+ int options = JBG_TPDON | JBG_TPBON | JBG_DPON;
+ int order = JBG_ILEAVE | JBG_SMID;
+ jbg_enc_lrange(&jbig_state, dl, dh);
+ jbg_enc_options(&jbig_state, order, options, l0, mx, -1);
+
+ // now encode everything and send it to data_out()
+ jbg_enc_out(&jbig_state);
+
+ // give encoder a chance to free its temporary data structures
+ jbg_enc_free(&jbig_state);
+
+ free(buffer);
+
+ if (hFile->Error()){
+ strcpy(info.szLastError,"Problem while writing JBG file");
+ return false;
+ }
+
+ return true;
+}
+////////////////////////////////////////////////////////////////////////////////
+#endif // CXIMAGE_SUPPORT_JBG
+