Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33014
Нанёс повреждений: 392 ед.
Рейтинг
|
C++ Source Code:
1 | qboolean Image_SaveBMP( const char *name, rgbdata_t *pix ) |
6 | RGBQUAD rgrgbPalette[256]; |
9 | byte *pb, *pbPal = NULL; |
14 | if( FS_FileExists( name, false ) && !(image.cmd_flags & IL_ALLOW_OVERWRITE )) |
15 | return false; // already existed |
17 | // bogus parameter check |
18 | if( !pix->palette || !pix->buffer ) |
27 | MsgDev( D_WARN, "Image_SaveBMP: unsupported image type %s\n", PFDesc[pix->type].name ); |
31 | pfile = FS_Open( name, "wb", false ); |
32 | if( !pfile ) return false; |
34 | // NOTE: align transparency column will sucessfully removed |
35 | // after create sprite or lump image, it's just standard requiriments |
36 | biTrueWidth = ((pix->width + 3) & ~3); |
37 | cbBmpBits = biTrueWidth * pix->height; |
38 | cbPalBytes = 256 * sizeof( RGBQUAD ); |
40 | // Bogus file header check |
41 | bmfh.bfType = MAKEWORD( 'B', 'M' ); |
42 | bmfh.bfSize = sizeof(bmfh) + sizeof(bmih) + cbBmpBits + cbPalBytes; |
45 | bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + cbPalBytes; |
48 | FS_Write( pfile, &bmfh, sizeof(bmfh)); |
51 | bmih.biSize = sizeof(bmih); |
52 | bmih.biWidth = biTrueWidth; |
53 | bmih.biHeight = pix->height; |
56 | bmih.biCompression = BI_RGB; |
58 | bmih.biXPelsPerMeter = 0; |
59 | bmih.biYPelsPerMeter = 0; |
61 | bmih.biClrImportant = 0; |
64 | FS_Write( pfile, &bmih, sizeof(bmih)); |
67 | // copy over used entries |
68 | for( i = 0; i < (int)bmih.biClrUsed; i++ ) |
70 | rgrgbPalette[i].rgbRed = *pb++; |
71 | rgrgbPalette[i].rgbGreen = *pb++; |
72 | rgrgbPalette[i].rgbBlue = *pb++; |
74 | // bmp feature - can store 32-bit palette if present |
75 | // some viewers e.g. fimg.exe can show alpha-chanell for it |
76 | if( pix->type == PF_INDEXED_32 ) |
77 | rgrgbPalette[i].rgbReserved = *pb++; |
78 | else rgrgbPalette[i].rgbReserved = 0; |
81 | // make last color is 0 0 255, xwad expect this (but ignore decals) |
82 | if( com.strrchr( name, '{' ) && pix->flags & IMAGE_HAS_ALPHA && !( pix->flags & IMAGE_COLORINDEX )) |
84 | rgrgbPalette[255].rgbRed = 0x00; |
85 | rgrgbPalette[255].rgbGreen = 0x00; |
86 | rgrgbPalette[255].rgbBlue = 0xFF; |
87 | rgrgbPalette[255].rgbReserved = 0x00; |
90 | // write palette( bmih.biClrUsed entries ) |
91 | cbPalBytes = bmih.biClrUsed * sizeof( RGBQUAD ); |
92 | FS_Write( pfile, rgrgbPalette, cbPalBytes ); |
93 | pbBmpBits = Mem_Alloc( Sys.imagepool, cbBmpBits ); |
94 | Mem_Set( pbBmpBits, 0xFF, cbBmpBits ); // fill buffer with last palette color |
97 | pb += (pix->height - 1) * pix->width; |
99 | for( i = 0; i < bmih.biHeight; i++ ) |
101 | Mem_Copy( &pbBmpBits[biTrueWidth * i], pb, pix->width ); |
105 | // write bitmap bits (remainder of file) |
106 | FS_Write( pfile, pbBmpBits, cbBmpBits ); |
108 | Mem_Free( pbBmpBits ); |
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Сообщить модератору | IP: Записан
Сообщение: 70215
|