Mercurial > mplayer.hg
comparison mpng.c @ 4656:04880518728d
add initial mPNG support
author | pontscho |
---|---|
date | Mon, 11 Feb 2002 09:15:59 +0000 |
parents | |
children | 91a1ce283aa8 |
comparison
equal
deleted
inserted
replaced
4655:364cf7cc77be | 4656:04880518728d |
---|---|
1 | |
2 #include <stdlib.h> | |
3 | |
4 #include "config.h" | |
5 #include "bswap.h" | |
6 #include "postproc/rgb2rgb.h" | |
7 #include "mp_msg.h" | |
8 #include "png.h" | |
9 | |
10 int pngPointer; | |
11 | |
12 void pngReadFN( png_structp pngstr,png_bytep buffer,png_size_t size ) | |
13 { | |
14 char * p = pngstr->io_ptr; | |
15 memcpy( buffer,(char *)&p[pngPointer],size ); | |
16 pngPointer+=size; | |
17 } | |
18 | |
19 void decode_mpng( | |
20 unsigned char *encoded, | |
21 int encoded_size, | |
22 unsigned char *decoded, | |
23 int width, | |
24 int height, | |
25 int bytes_per_pixel) | |
26 { | |
27 png_structp png; | |
28 png_infop info; | |
29 png_infop endinfo; | |
30 png_bytep data; | |
31 png_bytep * row_p; | |
32 png_uint_32 png_width,png_height; | |
33 char * palette = NULL; | |
34 int depth,color; | |
35 png_uint_32 i; | |
36 png=png_create_read_struct( PNG_LIBPNG_VER_STRING,NULL,NULL,NULL ); | |
37 info=png_create_info_struct( png ); | |
38 endinfo=png_create_info_struct( png ); | |
39 | |
40 pngPointer=8; | |
41 png_set_read_fn( png,encoded,pngReadFN ); | |
42 png_set_sig_bytes( png,8 ); | |
43 png_read_info( png,info ); | |
44 png_get_IHDR( png,info,&png_width,&png_height,&depth,&color,NULL,NULL,NULL ); | |
45 | |
46 png_set_bgr( png ); | |
47 | |
48 #if 0 | |
49 switch( info->color_type ) | |
50 { | |
51 case PNG_COLOR_TYPE_GRAY_ALPHA: printf( "[png] used GrayA -> stripping alpha channel\n" ); break; | |
52 case PNG_COLOR_TYPE_GRAY: printf( "[png] used Gray -> rgb\n" ); break; | |
53 case PNG_COLOR_TYPE_PALETTE: printf( "[png] used palette -> rgb\n" ); break; | |
54 case PNG_COLOR_TYPE_RGB_ALPHA: printf( "[png] used RGBA -> stripping alpha channel\n" ); break; | |
55 case PNG_COLOR_TYPE_RGB: printf( "[png] read rgb datas.\n" ); break; | |
56 } | |
57 #endif | |
58 | |
59 if ( info->color_type == PNG_COLOR_TYPE_RGB ) data=decoded; | |
60 else data=(png_bytep)malloc( png_get_rowbytes( png,info ) * height ); | |
61 | |
62 row_p=(png_bytep*)malloc( sizeof( png_bytep ) * png_height ); | |
63 for ( i=0; i < png_height; i++ ) row_p[i]=&data[png_get_rowbytes( png,info ) * i]; | |
64 png_read_image( png,row_p ); | |
65 free( row_p ); | |
66 | |
67 switch( info->color_type ) | |
68 { | |
69 case PNG_COLOR_TYPE_GRAY_ALPHA: | |
70 mp_msg( MSGT_DECVIDEO,MSGL_INFO,"Sorry gray scaled png with alpha channel not supported at moment.\n" ); | |
71 free( data ); | |
72 break; | |
73 case PNG_COLOR_TYPE_GRAY: | |
74 palette=malloc( 1024 ); | |
75 for ( i=0;i < 256;i++ ) palette[(i*4)]=palette[(i*4)+1]=palette[(i*4)+2]=(char)i; | |
76 palette8torgb24( data,decoded,png_width * png_height,palette ); | |
77 free( data ); | |
78 break; | |
79 case PNG_COLOR_TYPE_PALETTE: | |
80 { | |
81 int cols; | |
82 unsigned char * pal; | |
83 png_get_PLTE( png,info,(png_colorp*)&pal,&cols ); | |
84 palette=calloc( 1,1024 ); | |
85 for ( i=0;i < cols;i++ ) | |
86 { | |
87 palette[(i*4) ]=pal[(i*3)+2]; | |
88 palette[(i*4)+1]=pal[(i*3)+1]; | |
89 palette[(i*4)+2]=pal[(i*3) ]; | |
90 } | |
91 } | |
92 palette8torgb24( data,decoded,png_width * png_height,palette ); | |
93 free( data ); | |
94 break; | |
95 case PNG_COLOR_TYPE_RGB_ALPHA: | |
96 rgb32to24( data,decoded,png_width * png_height * 4 ); | |
97 free( data ); | |
98 break; | |
99 } | |
100 | |
101 if ( palette ) free( palette ); | |
102 | |
103 png_read_end( png,endinfo ); | |
104 png_destroy_read_struct( &png,&info,&endinfo ); | |
105 } | |
106 |