1 /***************************************************************************
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 * Copyright (C) 2006 by Antoine Cellerier <dionoea -at- videolan -dot- org>
11 * Copyright (C) 2009 by Andrew Mahone
13 * This program is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU General Public License
15 * as published by the Free Software Foundation; either version 2
16 * of the License, or (at your option) any later version.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
21 ****************************************************************************/
23 #include "pluginlib_bmp.h"
29 #if defined(HAVE_LCD_COLOR)
30 #define LE16(x) (htole16(x))&0xff, ((htole16(x))>>8)&0xff
31 #define LE32(x) (htole32(x))&0xff, ((htole32(x))>>8)&0xff, ((htole32(x))>>16)&0xff, ((htole32(x))>>24)&0xff
33 * Save to 24 bit bitmap.
35 int save_bmp_file( char* filename
, struct bitmap
*bm
)
37 int line_width
= (bm
->width
*3+3) & ~3;
38 int padsize
= line_width
- bm
->width
*3;
40 const unsigned char header
[] =
42 0x42, 0x4d, /* signature - 'BM' */
43 LE32( bm
->height
*line_width
+ 54 + 4*0 ), /* file size in bytes */
44 0x00, 0x00, 0x00, 0x00, /* 0, 0 */
45 LE32( 54 + 4*0 ), /* offset to bitmap */
46 0x28, 0x00, 0x00, 0x00, /* size of this struct (40) */
47 LE32( bm
->width
), /* bmap width in pixels */
48 LE32( bm
->height
), /* bmap height in pixels */
49 0x01, 0x00, /* num planes - always 1 */
50 LE16( 24 ), /* bits per pixel */
51 LE32( 0 ), /* compression flag */
52 LE32( bm
->height
*line_width
), /* image size in bytes */
53 0xc4, 0x0e, 0x00, 0x00, /* horz resolution */
54 0xc4, 0x0e, 0x00, 0x00, /* vert resolution */
55 LE32( 0 ), /* 0 -> color table size */
56 LE32( 0 ) /* important color count */
61 if( bm
->format
!= FORMAT_NATIVE
) return -1;
62 fh
= rb
->creat( filename
, 0666);
63 if( fh
< 0 ) return -1;
65 rb
->write( fh
, header
, sizeof( header
) );
66 for( y
= bm
->height
-1; y
>= 0; y
-- )
68 for( x
= 0; x
< bm
->width
; x
++ )
70 fb_data
*d
= (fb_data
*)( bm
->data
) + (x
+y
*bm
->width
);
73 RGB_UNPACK_BLUE( *d
),
74 RGB_UNPACK_GREEN( *d
),
77 rb
->write( fh
, c
, 3 );
81 unsigned int c
= 0; /* padsize is at most 3. */
82 rb
->write( fh
, &c
, padsize
);
88 #endif /* HAVE_LCD_COLOR */
91 Very simple image scale from src to dst (nearest neighbour).
92 Source and destination dimensions are read from the struct bitmap.
93 FIXME: this doesn't work well for LCD_DEPTH<4
95 void simple_resize_bitmap(struct bitmap
*src
, struct bitmap
*dst
)
97 #if defined(LCD_STRIDEFORMAT) && (LCD_STRIDEFORMAT == VERTICAL_STRIDE)
98 const int srcw
= src
->height
;
99 const int srch
= src
->width
;
100 const int dstw
= dst
->height
;
101 const int dsth
= dst
->width
;
103 const int srcw
= src
->width
;
104 const int srch
= src
->height
;
105 const int dstw
= dst
->width
;
106 const int dsth
= dst
->height
;
108 const fb_data
*srcd
= (fb_data
*)(src
->data
);
109 const fb_data
*dstd
= (fb_data
*)(dst
->data
);
110 const long xrstep
= ((srcw
-1) << 8) / (dstw
-1);
111 const long yrstep
= ((srch
-1) << 8) / (dsth
-1);
112 fb_data
*src_row
, *dst_row
;
114 int src_x
, src_y
, dst_x
, dst_y
;
115 for (dst_y
=0; dst_y
< dsth
; dst_y
++)
118 src_row
= (fb_data
*)&srcd
[src_y
* srcw
];
119 dst_row
= (fb_data
*)&dstd
[dst_y
* dstw
];
120 for (xr
=0,dst_x
=0; dst_x
< dstw
; dst_x
++)
123 dst_row
[dst_x
] = src_row
[src_x
];
132 Same as simple_resize_bitmap except this is for use with greylib.
134 void grey_resize_bitmap(struct bitmap
*src
, struct bitmap
*dst
)
136 const int srcw
= src
->width
;
137 const int srch
= src
->height
;
138 const int dstw
= dst
->width
;
139 const int dsth
= dst
->height
;
140 const long xrstep
= ((srcw
-1) << 8) / (dstw
-1);
141 const long yrstep
= ((srch
-1) << 8) / (dsth
-1);
142 unsigned char *srcd
= src
->data
;
143 unsigned char *dstd
= dst
->data
;
144 unsigned char *src_row
, *dst_row
;
146 int src_x
, src_y
, dst_x
, dst_y
;
147 for (dst_y
=0; dst_y
< dsth
; dst_y
++)
150 src_row
= &srcd
[src_y
* srcw
];
151 dst_row
= &dstd
[dst_y
* dstw
];
152 for (xr
=0,dst_x
=0; dst_x
< dstw
; dst_x
++)
155 dst_row
[dst_x
] = src_row
[src_x
];
164 #include "wrappers.h"
166 /* import the core bmp loader */
167 #include "recorder/bmp.c"