summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine Cellerier <dionoea@videolan.org>2006-07-19 19:44:44 +0000
committerAntoine Cellerier <dionoea@videolan.org>2006-07-19 19:44:44 +0000
commit2da8f69c95cce7726ae4c0a41ce04bf42fff65df (patch)
tree45925bd2a4710194e6649f5842eb06d3a1d4d68e
parent5e306b4c19dfe8732107d255c9c00e7d585c24ca (diff)
downloadrockbox-2da8f69c95cce7726ae4c0a41ce04bf42fff65df.tar.gz
rockbox-2da8f69c95cce7726ae4c0a41ce04bf42fff65df.zip
Lib to save a bitmap struct to a bmp file. Only works/tested with color bitmaps.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10254 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/lib/SOURCES3
-rw-r--r--apps/plugins/lib/bmp.c84
-rw-r--r--apps/plugins/lib/bmp.h30
3 files changed, 117 insertions, 0 deletions
diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES
index f0e9ebce63..dba800938d 100644
--- a/apps/plugins/lib/SOURCES
+++ b/apps/plugins/lib/SOURCES
@@ -21,4 +21,7 @@ profile_plugin.c
21xlcd_core.c 21xlcd_core.c
22xlcd_draw.c 22xlcd_draw.c
23xlcd_scroll.c 23xlcd_scroll.c
24#ifdef HAVE_LCD_COLOR
25bmp.c
26#endif
24#endif 27#endif
diff --git a/apps/plugins/lib/bmp.c b/apps/plugins/lib/bmp.c
new file mode 100644
index 0000000000..18968af7c1
--- /dev/null
+++ b/apps/plugins/lib/bmp.c
@@ -0,0 +1,84 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2006 by Antoine Cellerier <dionoea -at- videolan -dot- org>
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19
20#include "bmp.h"
21
22#include "lcd.h"
23#include "file.h"
24#include "lcd.h"
25#include "system.h"
26
27#define LE16(x) (htole16(x))&0xff, ((htole16(x))>>8)&0xff
28#define LE32(x) (htole32(x))&0xff, ((htole32(x))>>8)&0xff, ((htole32(x))>>16)&0xff, ((htole32(x))>>24)&0xff
29/**
30 * Save to 24 bit bitmap.
31 */
32int save_bmp_file( char* filename, struct bitmap *bm, struct plugin_api* rb )
33{
34 /* I'm not really sure about this one :) */
35 int line_width = bm->width*3+((bm->width*3)%4?4-((bm->width*3)%4):0);
36
37 const unsigned char header[] =
38 {
39 0x42, 0x4d, /* signature - 'BM' */
40 LE32( bm->height*line_width + 54 + 4*0 ), /* file size in bytes */
41 0x00, 0x00, 0x00, 0x00, /* 0, 0 */
42 LE32( 54 + 4*0 ), /* offset to bitmap */
43 0x28, 0x00, 0x00, 0x00, /* size of this struct (40) */
44 LE32( bm->width ), /* bmap width in pixels */
45 LE32( bm->height ), /* bmap height in pixels */
46 0x01, 0x00, /* num planes - always 1 */
47 LE16( 24 ), /* bits per pixel */
48 LE32( 0 ), /* compression flag */
49 LE32( bm->height*line_width ), /* image size in bytes */
50 0xc4, 0x0e, 0x00, 0x00, /* horz resolution */
51 0xc4, 0x0e, 0x00, 0x00, /* vert resolution */
52 LE32( 0 ), /* 0 -> color table size */
53 LE32( 0 ) /* important color count */
54 };
55
56 int fh;
57 int x,y;
58 if( bm->format != FORMAT_NATIVE ) return -1;
59 fh = rb->PREFIX(creat)( filename, O_WRONLY );
60 if( fh < 0 ) return -1;
61
62 rb->write( fh, header, sizeof( header ) );
63 for( y = bm->height-1; y >= 0; y-- )
64 {
65 for( x = 0; x < bm->width; x++ )
66 {
67 fb_data *d = (fb_data*)( bm->data ) + (x+y*bm->width);
68 unsigned char c[] =
69 {
70 RGB_UNPACK_BLUE( *d ),
71 RGB_UNPACK_GREEN( *d ),
72 RGB_UNPACK_RED( *d )
73 };
74 rb->write( fh, c, 3 );
75 }
76 for( x = 0; x < 3*bm->width - line_width; x++ )
77 {
78 unsigned char c = 0;
79 rb->write( fh, &c, 1 );
80 }
81 }
82 rb->close( fh );
83 return 1;
84}
diff --git a/apps/plugins/lib/bmp.h b/apps/plugins/lib/bmp.h
new file mode 100644
index 0000000000..dc26e80114
--- /dev/null
+++ b/apps/plugins/lib/bmp.h
@@ -0,0 +1,30 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2006 by Antoine Cellerier <dionoea -at- videolan -dot- org>
11 *
12 * All files in this archive are subject to the GNU General Public License.
13 * See the file COPYING in the source tree root for full license agreement.
14 *
15 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 * KIND, either express or implied.
17 *
18 ****************************************************************************/
19#ifndef _LIB_BMP_H_
20#define _LIB_BMP_H_
21
22#include "lcd.h"
23#include "plugin.h"
24
25/**
26 * Save bitmap to file
27 */
28int save_bmp_file( char* filename, struct bitmap *bm, struct plugin_api* rb );
29
30#endif