summaryrefslogtreecommitdiff
path: root/frontends/atari/bitmap.h
blob: 72bad555e768d0a4773256a0f61ac1d0166375f1 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Copyright 2010 Ole Loots <ole@monochrom.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
 * Atari bitmap handling implementation.
 */

#ifndef NS_ATARI_BITMAP_H
#define NS_ATARI_BITMAP_H

#include <gem.h>
#include <Hermes/Hermes.h>

#define NS_BMP_DEFAULT_BPP 4

/* Flags for init_mfdb function: */
#define MFDB_FLAG_STAND	  0x01
#define MFDB_FLAG_ZEROMEM 0x02
#define MFDB_FLAG_NOALLOC 0x04

#define BITMAP_SHRINK	  0
#define BITMAP_GROW	  1024 /* Don't realloc when bitmap size shrinks */
#define BITMAP_CLEAR	  2048 /* Zero bitmap memory                     */


/**
 * Calculates MFDB compatible rowstride (in number of bits)
 */
#define MFDB_STRIDE( w ) (((w & 15) != 0) ? (w | 15)+1 : w)


/**
 * Calculate size of an mfdb,
 *
 * \param bpp Bits per pixel.
 * \param stride Word aligned rowstride (width) as returned by MFDB_STRIDE,
 * \param h Height in pixels.
*/
#define MFDB_SIZE( bpp, stride, h ) ( ((stride >> 3) * h) * bpp )

extern struct gui_bitmap_table *atari_bitmap_table;

struct bitmap {
	int width;
	int height;
	uint8_t *pixdata;
	bool opaque;
	short bpp;				/* number of BYTES! per pixel */
	size_t rowstride;
	struct bitmap * resized;
	MFDB native;
	bool converted;
};



/**
 * setup an MFDB struct and allocate memory for it when it is needed.
 *
 * If bpp == 0, this function assumes that the MFDB shall point to the
 *       screen and will not allocate any memory (mfdb.fd_addr == 0).
 *
 * \return 0 when the memory allocation fails (out of memory),
 *         otherwise it returns the size of the mfdb.fd_addr as number
 *         of bytes.
 */
int init_mfdb(int bpp, int w, int h, uint32_t flags, MFDB * out );

/**
 * Create a bitmap.
 *
 * \param  w  width of image in pixels
 * \param  h  width of image in pixels
 * \param  state   a flag word indicating the initial state
 * \return an opaque struct bitmap, or NULL on memory exhaustion
 */
void *atari_bitmap_create(int w, int h, unsigned int state);

/**
 * Find the width of a pixel row in bytes.
 *
 * \param  bitmap  a bitmap, as returned by bitmap_create()
 * \return width of a pixel row in the bitmap
 */
size_t atari_bitmap_get_rowstride(void *bitmap);

/**
 * Free a bitmap.
 *
 * \param  bitmap a bitmap, as returned by bitmap_create()
 */
void atari_bitmap_destroy(void *bitmap);

/**
 * Get bitmap width
 *
 * \param  bitmap a bitmap, as returned by bitmap_create()
 */
int atari_bitmap_get_width(void *bitmap);

/**
 * Get bitmap height
 *
 * \param  bitmap a bitmap, as returned by bitmap_create()
 */
int atari_bitmap_get_height(void *bitmap);

/**
 * Gets whether a bitmap should be plotted opaque
 *
 * \param  bitmap  a bitmap, as returned by bitmap_create()
 */
bool atari_bitmap_get_opaque(void *bitmap);

size_t atari_bitmap_buffer_size(void *bitmap);

bool atari_bitmap_resize(struct bitmap *img, HermesHandle hermes_h, HermesFormat *fmt, int nw, int nh);

void *atari_bitmap_realloc( int w, int h, short bpp, int rowstride, unsigned int state, void * bmp );

#endif