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