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
10 #if CXIMAGE_SUPPORT_SKA
\r
12 ////////////////////////////////////////////////////////////////////////////////
\r
13 #if CXIMAGE_SUPPORT_DECODE
\r
14 ////////////////////////////////////////////////////////////////////////////////
\r
15 bool CxImageSKA::Decode(CxFile *hFile)
\r
21 SKAHEADER ska_header;
\r
22 hFile->Read(&ska_header,sizeof(SKAHEADER),1);
\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
29 if (ska_header.dwUnknown != 0x01000000 ||
\r
30 ska_header.Width > 0x7FFF || ska_header.Height > 0x7FFF ||
\r
31 ska_header.BppExp != 3)
\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
41 int bpp = 1<<ska_header.BppExp;
\r
43 Create(ska_header.Width,ska_header.Height,bpp,CXIMAGE_FORMAT_SKA);
\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
56 hFile->Read(GetBits(),ska_header.Width*ska_header.Height,1);
\r
59 if (GetEffWidth() != ska_header.Width){
\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
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
81 if (EncodeSafeCheck(hFile)) return false;
\r
83 if(head.biBitCount > 8) {
\r
84 strcpy(info.szLastError,"SKA Images must be 8 bit or less");
\r
88 SKAHEADER ska_header;
\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
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
99 hFile->Write(&ska_header,sizeof(SKAHEADER),1);
\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
105 if (head.biBitCount<8) IncreaseBpp(8);
\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
112 hFile->Write(pal,256*sizeof(rgb_color),1);
\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
122 ////////////////////////////////////////////////////////////////////////////////
\r
123 #endif // CXIMAGE_SUPPORT_ENCODE
\r
124 ////////////////////////////////////////////////////////////////////////////////
\r
125 #endif // CXIMAGE_SUPPORT_SKA
\r