Simplify Load_BMP_Image()
This commit is contained in:
parent
0b45bc5fc6
commit
f35c6007c0
@ -3162,11 +3162,9 @@ static void Load_BMP_Palette(T_IO_Context * context, FILE * file, unsigned int n
|
|||||||
|
|
||||||
static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int compression, unsigned int nbbits, int flags, const dword * mask)
|
static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int compression, unsigned int nbbits, int flags, const dword * mask)
|
||||||
{
|
{
|
||||||
unsigned int row_size;
|
|
||||||
unsigned int index;
|
unsigned int index;
|
||||||
short x_pos;
|
short x_pos;
|
||||||
short y_pos;
|
short y_pos;
|
||||||
byte * buffer;
|
|
||||||
byte value;
|
byte value;
|
||||||
byte a,b;
|
byte a,b;
|
||||||
int bits[4];
|
int bits[4];
|
||||||
@ -3192,53 +3190,75 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
|
|||||||
{
|
{
|
||||||
case 0 : // BI_RGB : No compression
|
case 0 : // BI_RGB : No compression
|
||||||
case 3 : // BI_BITFIELDS
|
case 3 : // BI_BITFIELDS
|
||||||
row_size = ((nbbits*context->Width + 31) >> 3) & ~3;
|
|
||||||
buffer = malloc(row_size);
|
|
||||||
for (y_pos=0; (y_pos < context->Height && !File_error); y_pos++)
|
for (y_pos=0; (y_pos < context->Height && !File_error); y_pos++)
|
||||||
{
|
{
|
||||||
short target_y;
|
short target_y;
|
||||||
target_y = (flags & LOAD_BMP_PIXEL_FLAG_TOP_DOWN) ? y_pos : context->Height-1-y_pos;
|
target_y = (flags & LOAD_BMP_PIXEL_FLAG_TOP_DOWN) ? y_pos : context->Height-1-y_pos;
|
||||||
|
|
||||||
if (Read_bytes(file,buffer,row_size))
|
|
||||||
{
|
|
||||||
for (x_pos=0; x_pos<context->Width; x_pos++)
|
|
||||||
{
|
|
||||||
switch (nbbits)
|
switch (nbbits)
|
||||||
{
|
{
|
||||||
case 8 :
|
case 8 :
|
||||||
value = buffer[x_pos];
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
|
{
|
||||||
|
if (!Read_byte(file, &value))
|
||||||
|
File_error = 2;
|
||||||
Set_pixel(context, x_pos, target_y, value);
|
Set_pixel(context, x_pos, target_y, value);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 4 :
|
case 4 :
|
||||||
value = (x_pos & 1) ? (buffer[x_pos>>1] & 0xF) : (buffer[x_pos>>1] >> 4);
|
for (x_pos = 0; x_pos < context->Width; )
|
||||||
Set_pixel(context, x_pos, target_y, value);
|
{
|
||||||
|
if (!Read_byte(file, &value))
|
||||||
|
File_error = 2;
|
||||||
|
Set_pixel(context, x_pos++, target_y, (value >> 4) & 0x0F);
|
||||||
|
Set_pixel(context, x_pos++, target_y, value & 0x0F);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
value = (buffer[x_pos>>2] >> (((x_pos&3)^3)*2)) & 3;
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
Set_pixel(context, x_pos, target_y, value);
|
{
|
||||||
|
if ((x_pos & 3) == 0)
|
||||||
|
{
|
||||||
|
if (!Read_byte(file, &value))
|
||||||
|
File_error = 2;
|
||||||
|
}
|
||||||
|
Set_pixel(context, x_pos, target_y, (value >> 6) & 3);
|
||||||
|
value <<= 2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 1 :
|
case 1 :
|
||||||
value = ( buffer[x_pos>>3] & (0x80>>(x_pos&7)) ) ? 1 : 0;
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
|
{
|
||||||
|
if ((x_pos & 7) == 0)
|
||||||
|
{
|
||||||
|
if (!Read_byte(file, &value))
|
||||||
|
File_error = 2;
|
||||||
|
}
|
||||||
if (flags & LOAD_BMP_PIXEL_FLAG_TRANSP_PLANE)
|
if (flags & LOAD_BMP_PIXEL_FLAG_TRANSP_PLANE)
|
||||||
{
|
{
|
||||||
if (value) // transparent pixel !
|
if (value & 0x80) // transparent pixel !
|
||||||
Set_pixel(context, x_pos, target_y, context->Transparent_color);
|
Set_pixel(context, x_pos, target_y, context->Transparent_color);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
Set_pixel(context, x_pos, target_y, value);
|
Set_pixel(context, x_pos, target_y, (value >> 7) & 1);
|
||||||
|
value <<= 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 24:
|
case 24:
|
||||||
Set_pixel_24b(context, x_pos,target_y,buffer[x_pos*3+2],buffer[x_pos*3+1],buffer[x_pos*3+0]);
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
|
{
|
||||||
|
byte bgr[3];
|
||||||
|
if (!Read_bytes(file, bgr, 3))
|
||||||
|
File_error = 2;
|
||||||
|
Set_pixel_24b(context, x_pos, target_y, bgr[2], bgr[1], bgr[0]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
{
|
{
|
||||||
#if defined(SDL_BYTEORDER) && (SDL_BYTEORDER != SDL_LIL_ENDIAN)
|
dword pixel;
|
||||||
dword pixel = SDL_Swap32(((dword *)buffer)[x_pos]);
|
if (!Read_dword_le(file, &pixel))
|
||||||
#elif defined(BYTEORDER)
|
File_error = 2;
|
||||||
dword pixel = le32toh(((dword *)buffer)[x_pos]);
|
|
||||||
#else // default to little endian
|
|
||||||
dword pixel = ((dword *)buffer)[x_pos];
|
|
||||||
#endif
|
|
||||||
Set_pixel_24b(context, x_pos, target_y,
|
Set_pixel_24b(context, x_pos, target_y,
|
||||||
Bitmap_mask(pixel,mask[0],bits[0],shift[0]),
|
Bitmap_mask(pixel,mask[0],bits[0],shift[0]),
|
||||||
Bitmap_mask(pixel,mask[1],bits[1],shift[1]),
|
Bitmap_mask(pixel,mask[1],bits[1],shift[1]),
|
||||||
@ -3246,32 +3266,22 @@ static void Load_BMP_Pixels(T_IO_Context * context, FILE * file, unsigned int co
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 16:
|
case 16:
|
||||||
|
for (x_pos = 0; x_pos < context->Width; x_pos++)
|
||||||
{
|
{
|
||||||
#if defined(SDL_BYTEORDER) && (SDL_BYTEORDER != SDL_LIL_ENDIAN)
|
word pixel;
|
||||||
word pixel = SDL_Swap16(((word *)buffer)[x_pos]);
|
if (!Read_word_le(file, &pixel))
|
||||||
#elif defined(BYTEORDER)
|
File_error = 2;
|
||||||
word pixel = le16toh(((word *)buffer)[x_pos]);
|
|
||||||
#else // default to little endian
|
|
||||||
word pixel = ((word *)buffer)[x_pos];
|
|
||||||
#endif
|
|
||||||
Set_pixel_24b(context, x_pos, target_y,
|
Set_pixel_24b(context, x_pos, target_y,
|
||||||
Bitmap_mask(pixel,mask[0],bits[0],shift[0]),
|
Bitmap_mask(pixel,mask[0],bits[0],shift[0]),
|
||||||
Bitmap_mask(pixel,mask[1],bits[1],shift[1]),
|
Bitmap_mask(pixel,mask[1],bits[1],shift[1]),
|
||||||
Bitmap_mask(pixel,mask[2],bits[2],shift[2]));
|
Bitmap_mask(pixel,mask[2],bits[2],shift[2]));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
|
||||||
value = 0;
|
|
||||||
}
|
}
|
||||||
|
// lines are padded to dword sizes
|
||||||
|
if (((context->Width * nbbits + 7) >> 3) & 3)
|
||||||
|
fseek(file, 4 - (((context->Width * nbbits + 7) >> 3) & 3), SEEK_CUR);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
File_error=2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 1 : // BI_RLE8 Compression
|
case 1 : // BI_RLE8 Compression
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user