Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
958 | leency | 1 | #include "..\kosSyst.h" |
2 | #include "bmp.h" |
||
3 | |||
4 | int BMPFile::LoadBMPFile(Byte* filebuff, Dword filesize) |
||
5 | { |
||
6 | Dword offset; |
||
7 | |||
8 | memcpy((Byte*)&Bmp_head,(Byte*)filebuff,sizeof(tagBITMAPFILEHEADER)); |
||
9 | memcpy((Byte*)&Info_head,(Byte*)filebuff+14,sizeof(tagBITMAPINFOHEADER)); |
||
10 | |||
11 | width=Info_head.biWidth; |
||
12 | height=Info_head.biHeight; |
||
13 | offset=(Dword)Bmp_head.bfOffbits; |
||
14 | |||
15 | int state=0; |
||
16 | if (Bmp_head.bfType==0x4d42 && !Info_head.biCompression) |
||
17 | { |
||
18 | Byte* cBuffer; |
||
19 | Byte* pImg; |
||
20 | Byte* pPal; |
||
21 | Dword x,y; |
||
22 | Byte r; |
||
23 | Dword s,p; |
||
24 | Dword cWidth; |
||
25 | int i; |
||
26 | |||
27 | buffer=kos_GetMemory(width*height*3); |
||
28 | pImg=filebuff+offset; |
||
29 | pPal=filebuff+53; |
||
30 | |||
31 | int align_bytes = (4 - ((width * 3) % 4)) % 4; |
||
32 | Dword bpp = Info_head.biBitCount; |
||
33 | |||
34 | switch(Info_head.biBitCount) |
||
35 | { |
||
36 | /* 16,24,32-bit decoding */ |
||
37 | case 32: |
||
38 | case 24: |
||
39 | case 16: |
||
40 | for(y=height-1;y!=-1;y--) |
||
41 | { |
||
42 | for(x=0;x |
||
43 | { |
||
44 | cBuffer=buffer+(y*width*3)+x*3; |
||
45 | if (Info_head.biBitCount==16) |
||
46 | { |
||
47 | *(cBuffer+0)=(Byte)((*(Word*)(pImg)) & 31)<<3; |
||
48 | *(cBuffer+1)=(Byte)((*(Word*)(pImg)>>5) & 31)<<3; |
||
49 | *(cBuffer+2)=(Byte)((*(Word*)(pImg)>>10) & 31)<<3; |
||
50 | } else { |
||
51 | *(cBuffer+0)=*(pImg+0); |
||
52 | *(cBuffer+1)=*(pImg+1); |
||
53 | *(cBuffer+2)=*(pImg+2); |
||
54 | } |
||
55 | pImg=pImg+Info_head.biBitCount/8; |
||
56 | } |
||
57 | pImg=pImg+align_bytes; |
||
58 | } |
||
59 | break; |
||
60 | /* 8-bit decoding */ |
||
61 | case 8: |
||
62 | for(y=height-1;y!=-1;y--) |
||
63 | { |
||
64 | for(x=0;x |
||
65 | { |
||
66 | r=*(pImg); pImg++; |
||
67 | cBuffer=buffer+(y*width*3)+x*3; |
||
68 | *(cBuffer+0)=(Byte)(pPal[r*4+1]); |
||
69 | *(cBuffer+1)=(Byte)(pPal[r*4+2]); |
||
70 | *(cBuffer+2)=(Byte)(pPal[r*4+3]); |
||
71 | } |
||
72 | } |
||
73 | break; |
||
74 | /* 1,4-bit decode */ |
||
75 | case 4: |
||
76 | case 1: |
||
77 | for(y=height-1;y!=-1;y--) |
||
78 | { |
||
79 | x=0; |
||
80 | while(x |
||
81 | { |
||
82 | s=*(Dword*)(pImg); |
||
83 | pImg=pImg+4; |
||
84 | __asm |
||
85 | { |
||
86 | mov eax,s |
||
87 | bswap eax |
||
88 | mov s,eax |
||
89 | } |
||
90 | for(i=0;i<32/bpp;i++) |
||
91 | { |
||
92 | if (x>=width) break; |
||
93 | __asm |
||
94 | { |
||
95 | mov eax,s |
||
96 | mov ecx,bpp |
||
97 | rol eax,cl |
||
98 | mov s,eax |
||
99 | mov ebx,1 |
||
100 | shl ebx,cl |
||
101 | dec ebx |
||
102 | and eax,ebx |
||
103 | mov p,eax |
||
104 | } |
||
105 | cBuffer=buffer+(y*width*3)+x*3; |
||
106 | *(cBuffer+0)=(Byte)(pPal[p*4+1]); |
||
107 | *(cBuffer+1)=(Byte)(pPal[p*4+2]); |
||
108 | *(cBuffer+2)=(Byte)(pPal[p*4+3]); |
||
109 | x++; |
||
110 | } |
||
111 | } |
||
112 | } |
||
113 | break; |
||
114 | default: |
||
115 | state=1; |
||
116 | break; |
||
117 | } |
||
118 | } else { |
||
119 | state=1; |
||
120 | } |
||
121 | return state; |
||
122 | }32/bpp;i++) |