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 "tga.h" |
||
3 | |||
4 | int TGAFile::LoadTGAFile(Byte* filebuff, Dword filesize) |
||
5 | { |
||
6 | |||
7 | memcpy((Byte*)&Tga_head,(Byte*)filebuff,sizeof(sTGAHeader)); |
||
8 | width=Tga_head.Width; |
||
9 | height=Tga_head.Height; |
||
10 | |||
11 | Byte* pImg=filebuff+sizeof(sTGAHeader)+Tga_head.BytesInIdentField+Tga_head.ColorMapOrigin+(Tga_head.ColorMapLength*Tga_head.ColorMapEntrySize/8); |
||
12 | Byte* pPal=filebuff+sizeof(sTGAHeader)+Tga_head.BytesInIdentField+Tga_head.ColorMapOrigin; |
||
13 | Byte* cBuffer; |
||
14 | int x,y; |
||
15 | Byte r; |
||
16 | int sm; |
||
17 | |||
18 | int state=1; |
||
19 | |||
20 | if (Tga_head.ImageDescByte >= 32) sm=height-1; else sm=0; |
||
21 | // Изображение с палитрой (палитра 24 или 32-битная) |
||
22 | if (Tga_head.ImageTypeCode==1) |
||
23 | { |
||
24 | if (Tga_head.ColorMapEntrySize>=24) |
||
25 | { |
||
26 | buffer=kos_GetMemory(width*height*3); |
||
27 | int bpp=Tga_head.ColorMapEntrySize/8; |
||
28 | for(y=height-1;y!=-1;y--) |
||
29 | { |
||
30 | for(x=0;x |
||
31 | { |
||
32 | r=*(pImg); pImg++; |
||
33 | cBuffer=buffer+(abs(sm-y)*width*3)+x*3; |
||
34 | *(cBuffer+0)=(Byte)(pPal[r*bpp+1]); |
||
35 | *(cBuffer+1)=(Byte)(pPal[r*bpp+2]); |
||
36 | *(cBuffer+2)=(Byte)(pPal[r*bpp+3]); |
||
37 | } |
||
38 | } |
||
39 | state=0; |
||
40 | } |
||
41 | } |
||
42 | // ЦВетное изображение без сжатия и палитры |
||
43 | else if (Tga_head.ImageTypeCode==2) |
||
44 | { |
||
45 | switch (Tga_head.ImagePixelSize) |
||
46 | { |
||
47 | case 32: |
||
48 | case 24: |
||
49 | buffer=kos_GetMemory(width*height*3); |
||
50 | for(y=height-1;y!=-1;y--) |
||
51 | { |
||
52 | for(x=0;x |
||
53 | { |
||
54 | cBuffer=buffer+(abs(sm-y)*width*3)+x*3; |
||
55 | *(cBuffer+0)=*(pImg+0); |
||
56 | *(cBuffer+1)=*(pImg+1); |
||
57 | *(cBuffer+2)=*(pImg+2); |
||
58 | pImg=pImg+Tga_head.ImagePixelSize/8; |
||
59 | } |
||
60 | } |
||
61 | state=0; |
||
62 | break; |
||
63 | case 16: |
||
64 | buffer=kos_GetMemory(width*height*3); |
||
65 | for(y=height-1;y!=-1;y--) |
||
66 | { |
||
67 | for(x=0;x |
||
68 | { |
||
69 | cBuffer=buffer+(abs(sm-y)*width*3)+x*3; |
||
70 | *(cBuffer+0)=(Byte)((*(Word*)(pImg)) & 31)<<3; |
||
71 | *(cBuffer+1)=(Byte)((*(Word*)(pImg)>>5) & 31)<<3; |
||
72 | *(cBuffer+2)=(Byte)((*(Word*)(pImg)>>10) & 31)<<3; |
||
73 | pImg=pImg+2; |
||
74 | } |
||
75 | } |
||
76 | state=0; |
||
77 | break; |
||
78 | } |
||
79 | } |
||
80 | // Монохромное изображение |
||
81 | else if (Tga_head.ImageTypeCode==3) |
||
82 | { |
||
83 | switch (Tga_head.ImagePixelSize) |
||
84 | { |
||
85 | case 8: |
||
86 | buffer=kos_GetMemory(width*height*3); |
||
87 | for(y=height-1;y!=-1;y--) |
||
88 | { |
||
89 | for(x=0;x |
||
90 | { |
||
91 | cBuffer=buffer+(abs(sm-y)*width*3)+x*3; |
||
92 | *(cBuffer+0)=*(pImg); |
||
93 | *(cBuffer+1)=*(pImg); |
||
94 | *(cBuffer+2)=*(pImg); |
||
95 | pImg++; |
||
96 | } |
||
97 | } |
||
98 | state=0; |
||
99 | break; |
||
100 | } |
||
101 | } |
||
102 | return state; |
||
103 | } |