Mercurial > mplayer.hg
view Gui/bitmap.c @ 4513:2e3800da1ceb
Switched from libmp1e to libavcodec, at least for me it runs helluva lot faster than libmp1e
(high quality divx movies that before ran very poor now plays perfectly). Also includes some
minor fixes to the osd support. Since libmp1e has issues with non-mmx system I think this move
is a smart one...
author | mswitch |
---|---|
date | Sun, 03 Feb 2002 14:55:27 +0000 |
parents | 5fa8c079ee3c |
children | 3473ca9ef158 |
line wrap: on
line source
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "bitmap.h" #include "../error.h" #define BMP 1 #define TGA 2 #define PNG 3 #define TGAPACKED 4 extern char * strcat( char * dest,const char * src ); int conv24to32( txSample * bf ) { unsigned char * tmpImage; int i,c; if ( bf->BPP == 24 ) { tmpImage=bf->Image; bf->ImageSize=bf->Width * bf->Height * 4; bf->BPP=32; if ( ( bf->Image=malloc( bf->ImageSize ) ) == NULL ) { #ifdef DEBUG dbprintf( 4,"[bitmap] Not enough memory for image.\n" ); #endif return 1; } memset( bf->Image,0,bf->ImageSize ); for ( c=0,i=0;i < bf->Width * bf->Height * 3; ) { bf->Image[c++]=tmpImage[i++]; bf->Image[c++]=tmpImage[i++]; bf->Image[c++]=tmpImage[i++]; c++; } free( tmpImage ); } return 0; } void bgr2rgb( txSample * bf ) { unsigned char c; int i; for ( i=0;i < bf->ImageSize;i+=4 ) { c=bf->Image[i]; bf->Image[i]=bf->Image[i+2]; bf->Image[i+2]=c; } } void Normalize( txSample * bf ) { int i; for ( i=0;i < bf->ImageSize;i+=4 ) bf->Image[i+3]=0; } unsigned char tmp[512]; unsigned char * fExist( unsigned char * fname ) { FILE * fl; unsigned char ext[][6] = { ".tga\0",".TGA\0",".png\0",".PNG\0",".bmp\0",".BMP\0" }; int i; fl=fopen( fname,"rb" ); if ( fl != NULL ) { fclose( fl ); return fname; } for ( i=0;i<10;i++ ) { strcpy( tmp,fname ); strcat( tmp,ext[i] ); fl=fopen( tmp,"rb" ); if ( fl != NULL ) { fclose( fl ); return tmp; } } return NULL; } int aComp( unsigned char * b1,unsigned char * b2,int size ) { int i; for( i=0;i<size;i++ ) if ( b1[i] != b2[i] ) return 0; return 1; } int GetFileType( char * fname ) { FILE * fl; unsigned char buffer[10]; unsigned char bmp[2] = { 0x42,0x4d }; unsigned char tga[7] = { 0x00,0x02,0x00,0x00,0x00,0x00,0x00 }; unsigned char ptga[7] = { 0x00,0x0a,0x00,0x00,0x00,0x00,0x00 }; unsigned char png[8] = { 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a }; if ( ( fl=fopen( fname,"rb" ) ) == NULL ) return -1; fread( buffer,1,10,fl ); fclose( fl ); if ( aComp( buffer,bmp,2 ) ) return BMP; // --- bmp if ( aComp( &buffer[1],tga,8 ) ) return TGA; // --- tga if ( aComp( &buffer[1],ptga,7 ) ) return TGAPACKED; // --- tga if ( aComp( buffer,png,8 ) ) return PNG; // --- png return 0; // --- others } int bpRead( char * fname, txSample * bf ) { int bgr = 0; int i; fname=fExist( fname ); if ( fname == NULL ) return -2; switch ( GetFileType( fname ) ) { case BMP: i=bmpRead( fname,bf ); switch ( i ) { case 0: break; case 3: return -1; default: return -3; } break; case TGA: i=tgaRead( fname,bf ); switch ( i ) { case 0: break; case 3: return -1; default: return -4; } break; case PNG: if ( pngRead( fname,bf ) ) return -5; bgr=1; break; case TGAPACKED: #ifdef DEBUG dbprintf( 4,"[bitmap] sorry, packed TGA not supported.\n" ); #endif return -6; default: { #ifdef DEBUG dbprintf( 4,"[bitmap] Unknown file type ( %s ).\n",fname ); #endif return -7; } } if ( bf->BPP < 24 ) { #ifdef DEBUG dbprintf( 4,"[bitmap] sorry, 16 or less bitmaps not supported.\n" ); #endif return -1; } if ( conv24to32( bf ) ) return -8; if ( bgr ) bgr2rgb( bf ); Normalize( bf ); return 0; } void Convert32to1( txSample * in,txSample * out,int adaptivlimit ) { out->Width=in->Width; out->Height=in->Height; out->BPP=1; out->ImageSize=out->Width * out->Height / 8; dbprintf( 4,"[c1to32] imagesize: %d\n",out->ImageSize ); out->Image=(char *)calloc( 1,out->ImageSize ); if ( out->Image == NULL ) dbprintf( 4,"nem van ram baze\n" ); { int i,b,c=0; unsigned long * buf = NULL; unsigned char tmp = 0; int nothaveshape = 1; buf=(unsigned long *)in->Image; for ( b=0,i=0;i < out->Width * out->Height;i++ ) { if ( buf[i] != adaptivlimit ) tmp=( tmp >> 1 )|128; else { tmp=tmp >> 1; buf[i]=nothaveshape=0; } if ( b++ == 7 ) { out->Image[c++]=tmp; tmp=b=0; } } if ( b ) out->Image[c]=tmp; if ( nothaveshape ) { free( out->Image ); out->Image=NULL; } } } void Convert1to32( txSample * in,txSample * out ) { if ( in->Image == NULL ) return; out->Width=in->Width; out->Height=in->Height; out->BPP=32; out->ImageSize=out->Width * out->Height * 4; out->Image=(char *)calloc( 1,out->ImageSize ); dbprintf( 4,"[c32to1] imagesize: %d\n",out->ImageSize ); if ( out->Image == NULL ) dbprintf( 4,"nem van ram baze\n" ); { int i,b,c=0; unsigned long * buf = NULL; unsigned char tmp = 0; buf=(unsigned long *)out->Image; for ( c=0,i=0;i < in->Width * in->Height / 8;i++ ) { tmp=in->Image[i]; for ( b=0;b<8;b++ ) { buf[c]=0; if ( tmp&0x1 ) buf[c]=0xffffffff; c++; tmp=tmp>>1; } } } }