]> Creatis software - clitk.git/blob - utilities/CxImage/ximaska.cpp
1ecdf7f5a0b62ee33eee1d24ae35655039c77fdc
[clitk.git] / utilities / CxImage / ximaska.cpp
1 /*\r
2  * File:        ximaska.cpp\r
3  * Purpose:     Platform Independent SKA Image Class Loader and Writer\r
4  * 25/Sep/2007 Davide Pizzolato - www.xdp.it\r
5  * CxImage version 6.0.0 02/Feb/2008\r
6  */\r
7 \r
8 #include "ximaska.h"\r
9 \r
10 #if CXIMAGE_SUPPORT_SKA\r
11 \r
12 ////////////////////////////////////////////////////////////////////////////////\r
13 #if CXIMAGE_SUPPORT_DECODE\r
14 ////////////////////////////////////////////////////////////////////////////////\r
15 bool CxImageSKA::Decode(CxFile *hFile)\r
16 {\r
17         if (hFile==NULL)\r
18                 return false;\r
19 \r
20         // read the  header\r
21         SKAHEADER ska_header;\r
22         hFile->Read(&ska_header,sizeof(SKAHEADER),1);\r
23 \r
24     ska_header.Width = ntohs(ska_header.Width);\r
25     ska_header.Height = ntohs(ska_header.Height);\r
26     ska_header.dwUnknown = ntohl(ska_header.dwUnknown);\r
27 \r
28         // check header\r
29         if (ska_header.dwUnknown != 0x01000000 ||\r
30                 ska_header.Width > 0x7FFF || ska_header.Height > 0x7FFF ||\r
31                 ska_header.BppExp != 3)\r
32                 return false;\r
33 \r
34         if (info.nEscape == -1){\r
35                 head.biWidth = ska_header.Width ;\r
36                 head.biHeight= ska_header.Height;\r
37                 info.dwType = CXIMAGE_FORMAT_SKA;\r
38                 return true;\r
39         }\r
40 \r
41         int bpp = 1<<ska_header.BppExp;\r
42 \r
43         Create(ska_header.Width,ska_header.Height,bpp,CXIMAGE_FORMAT_SKA);\r
44         if (!IsValid())\r
45                 return false;\r
46 \r
47         // read the palette\r
48         int nColors = 1<<bpp;\r
49         rgb_color* ppal = (rgb_color*)malloc(nColors*sizeof(rgb_color));\r
50         if (!ppal) return false;\r
51         hFile->Read(ppal,nColors*sizeof(rgb_color),1);\r
52         SetPalette(ppal,nColors);\r
53         free(ppal);\r
54 \r
55         //read the image\r
56         hFile->Read(GetBits(),ska_header.Width*ska_header.Height,1);\r
57 \r
58         //reorder rows\r
59         if (GetEffWidth() != ska_header.Width){\r
60                 BYTE *src,*dst;\r
61                 src = GetBits() + ska_header.Width*(ska_header.Height-1);\r
62                 dst = GetBits(ska_header.Height-1);\r
63                 for(int y=0;y<ska_header.Height;y++){\r
64                         memcpy(dst,src,ska_header.Width);\r
65                         src -= ska_header.Width;\r
66                         dst -= GetEffWidth();\r
67                 }\r
68         }\r
69 \r
70         Flip();\r
71 \r
72         return true;\r
73 }\r
74 ////////////////////////////////////////////////////////////////////////////////\r
75 #endif //CXIMAGE_SUPPORT_DECODE\r
76 ////////////////////////////////////////////////////////////////////////////////\r
77 #if CXIMAGE_SUPPORT_ENCODE\r
78 ////////////////////////////////////////////////////////////////////////////////\r
79 bool CxImageSKA::Encode(CxFile * hFile)\r
80 {\r
81         if (EncodeSafeCheck(hFile)) return false;\r
82 \r
83         if(head.biBitCount > 8) {\r
84                 strcpy(info.szLastError,"SKA Images must be 8 bit or less");\r
85                 return false;\r
86         }\r
87 \r
88         SKAHEADER ska_header;\r
89 \r
90         ska_header.Width = (unsigned short)GetWidth();\r
91         ska_header.Height = (unsigned short)GetHeight();\r
92         ska_header.BppExp = 3;\r
93         ska_header.dwUnknown = 0x01000000;\r
94 \r
95     ska_header.Width = ntohs(ska_header.Width);\r
96     ska_header.Height = ntohs(ska_header.Height);\r
97     ska_header.dwUnknown = ntohl(ska_header.dwUnknown);\r
98 \r
99         hFile->Write(&ska_header,sizeof(SKAHEADER),1);\r
100 \r
101     ska_header.Width = ntohs(ska_header.Width);\r
102     ska_header.Height = ntohs(ska_header.Height);\r
103     ska_header.dwUnknown = ntohl(ska_header.dwUnknown);\r
104 \r
105         if (head.biBitCount<8) IncreaseBpp(8);\r
106 \r
107         rgb_color pal[256];\r
108         for(int idx=0; idx<256; idx++){\r
109                 GetPaletteColor(idx,&(pal[idx].r),&(pal[idx].g),&(pal[idx].b));\r
110         }\r
111 \r
112         hFile->Write(pal,256*sizeof(rgb_color),1);\r
113 \r
114         BYTE* src = GetBits(ska_header.Height-1);\r
115         for(int y=0;y<ska_header.Height;y++){\r
116                 hFile->Write(src,ska_header.Width,1);\r
117                 src -= GetEffWidth();\r
118         }\r
119 \r
120         return true;\r
121 }\r
122 ////////////////////////////////////////////////////////////////////////////////\r
123 #endif // CXIMAGE_SUPPORT_ENCODE\r
124 ////////////////////////////////////////////////////////////////////////////////\r
125 #endif // CXIMAGE_SUPPORT_SKA\r
126 \r