New: Reading 32bit and 16bit bitmaps, with and without bitfields.
Fixed: Reading 8-bit compressed bitmaps. New: Reading bitmaps with v4 header. git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@723 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
parent
cf16b72ae0
commit
6c0637f65e
@ -11,7 +11,7 @@
|
||||
|
||||
;Name and file
|
||||
Name "Grafx2"
|
||||
OutFile "grafx2-2.00b98.0-svn482-win32.exe"
|
||||
OutFile "grafx2-2.00b99.0-svn722-win32.exe"
|
||||
|
||||
;Default installation folder
|
||||
InstallDir "$PROGRAMFILES\Grafx2"
|
||||
@ -60,11 +60,9 @@ Section "Grafx2" SecProgram
|
||||
SetOutPath "$INSTDIR"
|
||||
;ADD YOUR OWN FILES HERE...
|
||||
File ..\grafx2.exe
|
||||
File ..\gfxcfg.exe
|
||||
File ..\src-svn482.tgz
|
||||
File ..\gfx2.dat
|
||||
File ..\src-svn722.tgz
|
||||
File ..\skins\base.gif
|
||||
File ..\gfx2.gif
|
||||
File ..\gfx2cfg.gif
|
||||
File ..\SDL_image.dll
|
||||
File ..\SDL.dll
|
||||
File ..\libfreetype-6.dll
|
||||
@ -138,11 +136,8 @@ Section "un.SecProgram"
|
||||
|
||||
;ADD YOUR OWN FILES HERE...
|
||||
Delete "$INSTDIR\grafx2.exe"
|
||||
Delete "$INSTDIR\gfxcfg.exe"
|
||||
Delete "$INSTDIR\src-svn482.tgz"
|
||||
Delete "$INSTDIR\gfx2.dat"
|
||||
Delete "$INSTDIR\src-svn722.tgz"
|
||||
Delete "$INSTDIR\gfx2.gif"
|
||||
Delete "$INSTDIR\gfx2cfg.gif"
|
||||
Delete "$INSTDIR\SDL_image.dll"
|
||||
Delete "$INSTDIR\SDL.dll"
|
||||
Delete "$INSTDIR\libfreetype-6.dll"
|
||||
@ -159,6 +154,8 @@ Section "un.SecProgram"
|
||||
Delete "$INSTDIR\fonts\8pxfont.png"
|
||||
Delete "$INSTDIR\fonts\Tuffy.ttf"
|
||||
RMDir "$INSTDIR\fonts"
|
||||
Delete "$INSTDIR\skins\base.gif"
|
||||
RMDir "$INSTDIR\skins
|
||||
|
||||
Delete "$INSTDIR\Uninstall.exe"
|
||||
MessageBox MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION "Do you wish to keep your configuration settings ?" IDYES keepconfig IDNO deleteconfig
|
||||
|
||||
161
loadsave.c
161
loadsave.c
@ -2270,6 +2270,46 @@ void Test_BMP(void)
|
||||
}
|
||||
}
|
||||
|
||||
// Find the 8 important bits in a dword
|
||||
byte Bitmap_mask(dword pixel, dword mask)
|
||||
{
|
||||
byte result;
|
||||
int i;
|
||||
int bits_found;
|
||||
|
||||
switch(mask)
|
||||
{
|
||||
// Shortcuts to quickly handle the common 24/32bit cases
|
||||
case 0x000000FF:
|
||||
return (pixel & 0x000000FF);
|
||||
case 0x0000FF00:
|
||||
return (pixel & 0x0000FF00)>>8;
|
||||
case 0x00FF0000:
|
||||
return (pixel & 0x00FF0000)>>16;
|
||||
case 0xFF000000:
|
||||
return (pixel & 0xFF000000)>>24;
|
||||
}
|
||||
// Uncommon : do it bit by bit.
|
||||
bits_found=0;
|
||||
result=0;
|
||||
// Process the mask from low to high bit
|
||||
for (i=0;i<32;i++)
|
||||
{
|
||||
// Found a bit in the mask
|
||||
if (mask & (1<<i))
|
||||
{
|
||||
if (pixel & 1<<i)
|
||||
result |= 1<<bits_found;
|
||||
|
||||
bits_found++;
|
||||
|
||||
if (bits_found>=8)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// Less than 8 bits in the mask: scale the result to 8 bits
|
||||
return result << (8-bits_found);
|
||||
}
|
||||
|
||||
// -- Charger un fichier au format BMP --------------------------------------
|
||||
void Load_BMP(void)
|
||||
@ -2334,9 +2374,6 @@ void Load_BMP(void)
|
||||
{
|
||||
if (Read_bytes(file,local_palette,nb_colors<<2))
|
||||
{
|
||||
// On commence par passer la palette en 256 comme ça, si la nouvelle
|
||||
// palette a moins de 256 coul, la précédente ne souffrira pas d'un
|
||||
// assombrissement préjudiciable.
|
||||
if (Config.Clear_palette)
|
||||
memset(Main_palette,0,sizeof(T_Palette));
|
||||
// On peut maintenant transférer la nouvelle palette
|
||||
@ -2396,7 +2433,7 @@ void Load_BMP(void)
|
||||
/*Init_lecture();*/
|
||||
Read_one_byte(file, &a);
|
||||
Read_one_byte(file, &b);
|
||||
while ( (!File_error) && ((a)||(b!=1)) )
|
||||
while (!File_error)
|
||||
{
|
||||
if (a) // Encoded mode
|
||||
for (index=1; index<=a; index++)
|
||||
@ -2420,15 +2457,19 @@ void Load_BMP(void)
|
||||
while (b)
|
||||
{
|
||||
Read_one_byte(file, &a);
|
||||
Read_one_byte(file, &c);
|
||||
//Read_one_byte(file, &c);
|
||||
Pixel_load_function(x_pos++,y_pos,a);
|
||||
if (--c)
|
||||
{
|
||||
Pixel_load_function(x_pos++,y_pos,c);
|
||||
b--;
|
||||
}
|
||||
//if (--c)
|
||||
//{
|
||||
// Pixel_load_function(x_pos++,y_pos,c);
|
||||
// b--;
|
||||
//}
|
||||
b--;
|
||||
}
|
||||
if (ftell(file) & 1) fseek(file, 1, SEEK_CUR);
|
||||
}
|
||||
if (a==0 && b==1)
|
||||
break;
|
||||
Read_one_byte(file, &a);
|
||||
Read_one_byte(file, &b);
|
||||
}
|
||||
@ -2503,28 +2544,100 @@ void Load_BMP(void)
|
||||
}
|
||||
else
|
||||
{
|
||||
// Image 24 bits!!!
|
||||
// Image 16/24/32 bits
|
||||
dword red_mask;
|
||||
dword green_mask;
|
||||
dword blue_mask;
|
||||
if (header.Nb_bits == 16)
|
||||
{
|
||||
red_mask = 0x00007C00;
|
||||
green_mask = 0x000003E0;
|
||||
blue_mask = 0x0000001F;
|
||||
}
|
||||
else
|
||||
{
|
||||
red_mask = 0x00FF0000;
|
||||
green_mask = 0x0000FF00;
|
||||
blue_mask = 0x000000FF;
|
||||
}
|
||||
File_error=0;
|
||||
|
||||
Main_image_width=header.Width;
|
||||
Main_image_height=header.Height;
|
||||
Init_preview(header.Width,header.Height,file_size,FORMAT_BMP | FORMAT_24B);
|
||||
|
||||
if (File_error==0)
|
||||
{
|
||||
line_size=Main_image_width*3;
|
||||
x_pos=(line_size % 4); // x_pos sert de variable temporaire
|
||||
if (x_pos>0)
|
||||
line_size+=(4-x_pos);
|
||||
|
||||
buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=Main_image_height-1; ((y_pos>=0) && (!File_error)); y_pos--)
|
||||
switch (header.Compression)
|
||||
{
|
||||
if (Read_bytes(file,buffer,line_size))
|
||||
for (x_pos=0,index=0; x_pos<Main_image_width; x_pos++,index+=3)
|
||||
Pixel_load_24b(x_pos,y_pos,buffer[index+2],buffer[index+1],buffer[index+0]);
|
||||
else
|
||||
File_error=2;
|
||||
case 3: // BI_BITFIELDS
|
||||
if (!Read_dword_le(file,&red_mask) ||
|
||||
!Read_dword_le(file,&green_mask) ||
|
||||
!Read_dword_le(file,&blue_mask))
|
||||
File_error=2;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (fseek(file, header.Offset, SEEK_SET))
|
||||
File_error=2;
|
||||
}
|
||||
if (File_error==0)
|
||||
{
|
||||
switch (header.Nb_bits)
|
||||
{
|
||||
// 24bit bitmap
|
||||
default:
|
||||
case 24:
|
||||
line_size=Main_image_width*3;
|
||||
x_pos=(line_size % 4); // x_pos sert de variable temporaire
|
||||
if (x_pos>0)
|
||||
line_size+=(4-x_pos);
|
||||
|
||||
buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=Main_image_height-1; ((y_pos>=0) && (!File_error)); y_pos--)
|
||||
{
|
||||
if (Read_bytes(file,buffer,line_size))
|
||||
for (x_pos=0,index=0; x_pos<Main_image_width; x_pos++,index+=3)
|
||||
Pixel_load_24b(x_pos,y_pos,buffer[index+2],buffer[index+1],buffer[index+0]);
|
||||
else
|
||||
File_error=2;
|
||||
}
|
||||
break;
|
||||
|
||||
// 32bit bitmap
|
||||
case 32:
|
||||
line_size=Main_image_width*4;
|
||||
buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=Main_image_height-1; ((y_pos>=0) && (!File_error)); y_pos--)
|
||||
{
|
||||
if (Read_bytes(file,buffer,line_size))
|
||||
for (x_pos=0; x_pos<Main_image_width; x_pos++)
|
||||
{
|
||||
dword pixel=*(((dword *)buffer)+x_pos);
|
||||
Pixel_load_24b(x_pos,y_pos,Bitmap_mask(pixel,red_mask),Bitmap_mask(pixel,green_mask),Bitmap_mask(pixel,blue_mask));
|
||||
}
|
||||
else
|
||||
File_error=2;
|
||||
}
|
||||
break;
|
||||
|
||||
// 16bit bitmap
|
||||
case 16:
|
||||
line_size=(Main_image_width*2) + (Main_image_width&1)*2;
|
||||
buffer=(byte *)malloc(line_size);
|
||||
for (y_pos=Main_image_height-1; ((y_pos>=0) && (!File_error)); y_pos--)
|
||||
{
|
||||
if (Read_bytes(file,buffer,line_size))
|
||||
for (x_pos=0; x_pos<Main_image_width; x_pos++)
|
||||
{
|
||||
word pixel=*(((word *)buffer)+x_pos);
|
||||
Pixel_load_24b(x_pos,y_pos,Bitmap_mask(pixel,red_mask),Bitmap_mask(pixel,green_mask),Bitmap_mask(pixel,blue_mask));
|
||||
}
|
||||
else
|
||||
File_error=2;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
free(buffer);
|
||||
fclose(file);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user