summaryrefslogtreecommitdiff
path: root/image/bmpread.h
blob: e1ed6c3d9797517557ce9398833887ec32b9d4c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
/*
 * Copyright 2006 Richard Wilson <info@tinct.net>
 *
 * This file is part of NetSurf, http://www.netsurf-browser.org/
 *
 * NetSurf is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License.
 *
 * NetSurf is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/** \file
 * BMP file decoding (interface).
 */

#ifndef _NETSURF_IMAGE_BMPREAD_H_
#define _NETSURF_IMAGE_BMPREAD_H_

#include <stdbool.h>
#include "image/bitmap.h"

/* error return values */
typedef enum {
	BMP_OK = 0,
	BMP_INSUFFICIENT_MEMORY = 1,
	BMP_INSUFFICIENT_DATA = 2,
	BMP_DATA_ERROR = 3
} bmp_result;

/* encoding types */
typedef enum {
  	BMP_ENCODING_RGB = 0,
  	BMP_ENCODING_RLE8 = 1,
  	BMP_ENCODING_RLE4 = 2,
  	BMP_ENCODING_BITFIELDS = 3
} bmp_encoding;

struct bmp_image {
	unsigned char *bmp_data;	/** pointer to BMP data */
	unsigned int buffer_size;	/** total number of bytes of BMP data available */
	unsigned int width;		/** width of BMP (valid after _analyse) */
	unsigned int height;		/** heigth of BMP (valid after _analyse) */
	bmp_encoding encoding;		/** pixel encoding type */
	unsigned int bitmap_offset;	/** offset of bitmap data */
	unsigned int bpp;		/** bits per pixel */
	unsigned int colours;		/** number of colours */
	unsigned int *colour_table;	/** colour table */
	bool reversed;			/** scanlines are top to bottom */
	bool decoded;			/** whether the image has been decoded */
	bool ico;			/** image is part of an ICO, mask follows */
	unsigned int mask[4];		/** four bitwise mask */
	int shift[4];			/** four bitwise shifts */
	struct bitmap *bitmap;		/** decoded image */
};

struct ico_image {
	struct bmp_image bmp;
	struct ico_image *next;
};

struct ico_collection {
	unsigned char *ico_data;	/** pointer to ICO data */
	unsigned int buffer_size;	/** total number of bytes of ICO data available */
	unsigned int width;		/** width of largest BMP */
	unsigned int height;		/** heigth of largest BMP */
  	struct ico_image *first;
};

bmp_result bmp_analyse(struct bmp_image *bmp);
bmp_result bmp_decode(struct bmp_image *bmp);
void bmp_finalise(struct bmp_image *bmp);

bmp_result ico_analyse(struct ico_collection *ico);
struct bmp_image *ico_find(struct ico_collection *ico, int width, int height);
void ico_finalise(struct ico_collection *ico);

#endif