1 /*
2 * in_bmp.cpp -- read a Windows(?) BMP bitmap file
3 * by pts@fazekas.hu at Sat Mar 2 00:46:54 CET 2002
4 *
5 */
6
7 #ifdef __GNUC__
8 #ifndef __clang__
9 #pragma implementation
10 #endif
11 #endif
12
13 #include "image.hpp"
14 #include "error.hpp"
15
16 #if USE_IN_BMP
17
18 #include "gensio.hpp"
19 #include "input-bmp.ci"
20
in_bmp_reader(Image::Loader::UFD * ufd,SimBuffer::Flat const &)21 static Image::Sampled *in_bmp_reader(Image::Loader::UFD *ufd, SimBuffer::Flat const&) {
22 Image::Sampled *ret=0;
23 bitmap_type bitmap=bmp_load_image(((Filter::UngetFILED*)ufd)->getFILE(/*seekable:*/false));
24 /* Imp: Work without duplicated memory allocation */
25 if (BITMAP_PLANES(bitmap)==1) {
26 Image::Gray *img=new Image::Gray(BITMAP_WIDTH(bitmap), BITMAP_HEIGHT(bitmap), 8);
27 memcpy(img->getRowbeg(), BITMAP_BITS(bitmap), (slen_t)BITMAP_WIDTH(bitmap)*BITMAP_HEIGHT(bitmap));
28 ret=img;
29 } else if (BITMAP_PLANES(bitmap)==3) {
30 Image::RGB *img=new Image::RGB(BITMAP_WIDTH(bitmap), BITMAP_HEIGHT(bitmap), 8);
31 memcpy(img->getRowbeg(), BITMAP_BITS(bitmap), (slen_t)3*BITMAP_WIDTH(bitmap)*BITMAP_HEIGHT(bitmap));
32 ret=img;
33 } else assert(0 && "invalid BMP depth");
34 delete [] BITMAP_BITS(bitmap);
35 return ret;
36 }
37
in_bmp_checker(char buf[Image::Loader::MAGIC_LEN],char[Image::Loader::MAGIC_LEN],SimBuffer::Flat const &,Image::Loader::UFD *)38 static Image::Loader::reader_t in_bmp_checker(char buf[Image::Loader::MAGIC_LEN], char [Image::Loader::MAGIC_LEN], SimBuffer::Flat const&, Image::Loader::UFD*) {
39 return (buf[0]=='B' && buf[1]=='M'
40 && buf[6]==0 && buf[7]==0 && buf[8]==0 && buf[9]==0
41 && (unsigned char)(buf[14])<=64 && buf[15]==0 && buf[16]==0 && buf[17]==0)
42 ? in_bmp_reader : 0;
43 }
44
45 #else
46 #define in_bmp_checker NULLP
47 #endif /* USE_IN_BMP */
48
49 Image::Loader in_bmp_loader = { "BMP", in_bmp_checker, 0 };
50