]> Creatis software - clitk.git/blobdiff - utilities/CxImage/ximajbg.cpp
cosmetic
[clitk.git] / utilities / CxImage / ximajbg.cpp
index 25331080da2e39094ce9080665676a1d2b845739..06fb9bfa26bcef3fcd4da6e000d1468c3c5a9e04 100644 (file)
-/*\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
+