mirror of https://github.com/mpv-player/mpv
116 lines
2.4 KiB
C
116 lines
2.4 KiB
C
|
|
#ifndef __MY_BMP
|
|
#define __MY_BMP
|
|
|
|
/*
|
|
0.1 : BMP type.
|
|
2.5 : File size.
|
|
6.7 : Res.
|
|
8.9 : Res.
|
|
10.13 : Offset of bitmap.
|
|
14.17 : Header size.
|
|
18.21 : X size.
|
|
22.25 : Y size.
|
|
26.27 : Number of planes.
|
|
28.29 : Number of bits per pixel.
|
|
30.33 : Compression flag.
|
|
34.37 : Image data size in bytes.
|
|
38.41 : Res
|
|
42.45 : Res
|
|
46.49 : Res
|
|
50.53 : Res
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include "bmp.h"
|
|
#include "../bitmap.h"
|
|
#include "../../error.h"
|
|
|
|
int bmpRead( unsigned char * fname,txSample * bF )
|
|
{
|
|
unsigned char bmpHeader[54];
|
|
FILE * BMP;
|
|
unsigned long i;
|
|
unsigned char * line;
|
|
int linesize;
|
|
|
|
|
|
if ( (BMP=fopen( fname,"rt" )) == NULL )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] File not found ( %s ).\n",fname );
|
|
#endif
|
|
return 1;
|
|
}
|
|
if ( (i=fread( bmpHeader,54,1,BMP )) != 1 )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] Header read error ( %s ).\n",fname );
|
|
#endif
|
|
return 2;
|
|
}
|
|
// memcpy( &bF->Size,&bmpHeader[2],4 );
|
|
memcpy( &bF->Width,&bmpHeader[18],4 );
|
|
memcpy( &bF->Height,&bmpHeader[22],4 );
|
|
memcpy( &bF->BPP,&bmpHeader[28],2 );
|
|
// memcpy( &bF->ImageSize,&bmpHeader[34],4 );
|
|
bF->ImageSize=( bF->Width * bF->Height ) * ( bF->BPP / 8 );
|
|
|
|
if ( bF->BPP < 24 )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] Sorry, this loader not supported 16 bit or less ...\n" );
|
|
#endif
|
|
return 3;
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] filename: %s\n",fname );
|
|
dbprintf( 4,"[bmp] size: %dx%d bits: %d\n",bF->Width,bF->Height,bF->BPP );
|
|
dbprintf( 4,"[bmp] imagesize: %lu\n",bF->ImageSize );
|
|
#endif
|
|
|
|
if ( ( bF->Image=malloc( bF->ImageSize ) ) == NULL )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] Not enough memory for image buffer.\n" );
|
|
#endif
|
|
return 4;
|
|
}
|
|
|
|
if ( (i=fread( bF->Image,bF->ImageSize,1,BMP )) != 1 )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] Image read error.\n" );
|
|
#endif
|
|
return 5;
|
|
}
|
|
|
|
fclose( BMP );
|
|
|
|
linesize=bF->Width * ( bF->BPP / 8 );
|
|
if ( (line=malloc( linesize )) == NULL )
|
|
{
|
|
#ifdef DEBUG
|
|
dbprintf( 4,"[bmp] Not enough memory for flipping.\n" );
|
|
#endif
|
|
return 6;
|
|
}
|
|
|
|
for ( i=0;i < bF->Height / 2;i++ )
|
|
{
|
|
memcpy( line,&bF->Image[ i * linesize ],linesize );
|
|
memcpy( &bF->Image[ i * linesize ],&bF->Image[ ( bF->Height - i - 1 ) * linesize ],linesize );
|
|
memcpy( &bF->Image[ ( bF->Height - i - 1 ) * linesize ],line,linesize );
|
|
}
|
|
free( line );
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
|