summaryrefslogtreecommitdiff
path: root/atari/plot/plotter.h
blob: 973b700587800f07637ac6c530ad3df25c55e660 (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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/*
 * 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/>.
 */
#ifndef _GEM_PLOTTER_API_H_
#define _GEM_PLOTTER_API_H_
#include <windom.h>



#ifndef ceilf
#define ceilf(x) (float)ceil((double)x)
#endif

#ifdef TEST_PLOTTER
#define verbose_log 1
#define LOG(x) do { if (verbose_log) (printf(__FILE__ " %s %i: ", __PRETTY_FUNCTION__, __LINE__), printf x, fputc('\n', stdout)); } while (0)
#endif

#define MAX_FRAMEBUFS 0x010
#define C2P (1<<0)	/* C2P convert buffer 1 to buffer 2 */
/* TODO: implement offscreen buffer switch */
/* Plotter Flags: */
#define PLOT_FLAG_OFFSCREEN 0x01
#define PLOT_FLAG_LOCKED 	0x02
#define PLOT_FLAG_DITHER 	0x04
#define PLOT_FLAG_TRANS		0x08

/* Error codes: */
#define ERR_BUFFERSIZE_EXCEEDS_SCREEN 1
#define ERR_NO_MEM 2
#define ERR_PLOTTER_NOT_AVAILABLE 3

static const char * plot_error_codes[] =
{
	"None",
	"ERR_BUFFERSIZE_EXCEEDS_SCREEN",
	"ERR_NO_MEM",
	"ERR_PLOTTER_NOT_AVAILABLE"
};

/* Grapics & Font Plotter Objects: */
typedef struct s_font_plotter * FONT_PLOTTER;
typedef struct s_gem_plotter * GEM_PLOTTER;
typedef struct s_font_plotter * GEM_FONT_PLOTTER; /* for public use ... */
struct s_font_plotter
{
	char * name;
	int flags;
	int vdi_handle;
	void * priv_data;
	GEM_PLOTTER plotter;
	
	bool (*str_width)(FONT_PLOTTER self, const plot_font_style_t *fstyle,
						const char * str, size_t length, int * width);
	bool (*str_split)(FONT_PLOTTER self, const plot_font_style_t *fstyle,
						const char *string, size_t length,
						int x, size_t *char_offset, int *actual_x);
	bool (*pixel_position)(FONT_PLOTTER self, const plot_font_style_t *fstyle,
						const char *string, size_t length,
						int x, size_t *char_offset, int *actual_x);
	void (*text)(FONT_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle);
	void (*dtor)(FONT_PLOTTER self );
};


struct s_clipping {
	short x0;
	short y0;
	short x1;
	short y1;
};

struct s_vdi_sysinfo {
	short vdi_handle;			/* vdi handle 					*/
	short scr_w;				/* resolution horz. 			*/
	short scr_h;				/* resolution vert. 			*/
	short scr_bpp;				/* bits per pixel 				*/
	int colors;					/* 0=hiclor, 2=mono				*/
	unsigned long hicolors;		/* if colors = 0				*/
	short pixelsize;			/* bytes per pixel 				*/
	unsigned short pitch;		/* row pitch 					*/
	unsigned short vdiformat;	/* pixel format 				*/
	unsigned short clut;		/* type of clut support 		*/
	void * screen;				/* pointer to screen, or NULL	*/
	unsigned long  screensize;	/* size of screen (in bytes)	*/
	unsigned long  mask_r;		/* color masks 					*/
	unsigned long  mask_g;
	unsigned long  mask_b;
	unsigned long  mask_a;
	short maxintin;				/* maximum pxy items 			*/
	short maxpolycoords;		/* max coords for p_line etc.	*/
	unsigned long EdDiVersion;	/* EdDi Version or 0 			*/
	bool rasterscale;			/* raster scaling support		*/
};



struct s_frame_buf
{
	short x;
	short y;
	short w;
	short h;
	short vis_x;	/* visible rectangle of the screen buffer */
	short vis_y;	/* coords are relative to framebuffer location */
	short vis_w;
	short vis_h;
	int size;
	bool swapped;
	void * mem;
};


struct s_gem_plotter
{
	char * name;         /* name that identifies the Plotter */
	unsigned long flags;
	int vdi_handle;
	struct s_vdi_sysinfo * scr;
	void * priv_data;
	int bpp_virt;     	/* bit depth of framebuffer */
	struct s_clipping clipping;
	struct s_frame_buf fbuf[MAX_FRAMEBUFS];
	int cfbi; 			/* current framebuffer index */

	FONT_PLOTTER font_plotter;
	int (*dtor)(GEM_PLOTTER self);
	int (*resize)(GEM_PLOTTER self, int w, int h);
	int (*move)(GEM_PLOTTER self, short x, short y );
	void * (*lock)(GEM_PLOTTER self);
	void * (*create_framebuffer)(GEM_PLOTTER self);
	void * (*switch_to_framebuffer)(GEM_PLOTTER self);
	int (*unlock)(GEM_PLOTTER self);
	int (*update_region)(GEM_PLOTTER self, GRECT region);
	int (*update_screen_region)( GEM_PLOTTER self, GRECT region );
	int (*update_screen)(GEM_PLOTTER self);
	int (*put_pixel)(GEM_PLOTTER self, int x, int y, int color );
	int (*copy_rect)(GEM_PLOTTER self, GRECT src, GRECT dst );
	int (*clip)(GEM_PLOTTER self, int x0, int y0, int x1, int y1);
	int (*arc)(GEM_PLOTTER self, int x, int y, int radius, int angle1, int angle2, const plot_style_t * pstyle);
	int (*disc)(GEM_PLOTTER self, int x, int y, int radius, const plot_style_t * pstyle);
	int (*line)(GEM_PLOTTER self, int x0, int y0, int x1,	int y1, const plot_style_t * pstyle);
	int (*rectangle)(GEM_PLOTTER self, int x0, int y0, int x1, int y1, const plot_style_t * pstyle);
	int (*polygon)(GEM_PLOTTER self, const int *p, unsigned int n,  const plot_style_t * pstyle);
	int (*path)(GEM_PLOTTER self, const float *p, unsigned int n, int fill, float width, int c, const float transform[6]);
	int (*bitmap_resize) ( GEM_PLOTTER self, struct bitmap * bm, int nw, int nh );
	int (*bitmap)(GEM_PLOTTER self, struct bitmap * bmp, int x, int y,
					unsigned long bg, unsigned long flags );
	int (*text)(GEM_PLOTTER self, int x, int y, const char *text, size_t length, const plot_font_style_t *fstyle);
};


struct s_driver_table_entry
{
	char * name;
	int (*ctor)( GEM_PLOTTER self );
	int flags;
	int max_bpp;
};

struct s_font_driver_table_entry
{
	char * name;
	int (*ctor)( FONT_PLOTTER self );
	int flags;
};

typedef struct s_driver_table_entry * PLOTTER_INFO;
typedef struct s_font_driver_table_entry * FONT_PLOTTER_INFO;

/* get index to driver in driver list by name */
static int drvrname_idx( char * name );

/* get s_driver_table_entry from driver table */
struct s_driver_table_entry * get_screen_driver_entry(char * name);

/* get s_font_driver_table_entry from driver table */
struct s_font_driver_table_entry * get_font_driver_entry(char * name);

/* fill screen / sys info */
struct s_vdi_sysinfo * read_vdi_sysinfo(short vdih, struct s_vdi_sysinfo * info );

/*
   Create an new plotter object
   Error Values:
      -1 no mem
      -2 error configuring plotter
      -3 Plotter not available
*/
GEM_PLOTTER new_plotter(int vdihandle, char * name,
	GRECT *, int virt_bpp, unsigned long flags, FONT_PLOTTER font_renderer,
	int * error);

/*
   Create an new font plotter object
   Error Values:
      -1 no mem
      -2 error configuring font plotter
      -3 Font Plotter not available
*/
FONT_PLOTTER new_font_plotter(int vdihandle, char * name, unsigned long flags, int * error );

/* free the plotter resources */
int delete_plotter( GEM_PLOTTER p );
int delete_font_plotter( FONT_PLOTTER p );


/* calculate size of intermediate buffer */
int calc_chunked_buffer_size(int x, int y, int stride, int bpp);

/* calculates the pixel offset from x,y pos */
int get_pixel_offset( int x, int y, int stride, int bpp );

/* Recalculate visible parts of the framebuffer */
void update_visible_rect( GEM_PLOTTER p );

/* resolve possible visible parts of the framebuffer in screen coords */
bool fbrect_to_screen( GEM_PLOTTER self, GRECT box, GRECT * ret );

/* translate an error number */
const char* plotter_err_str(int i) ;

void dump_font_drivers(void);
void dump_plot_drivers(void);
void dump_vdi_info(short);

/* convert an rgb color to vdi1000 color */
void rgb_to_vdi1000( unsigned char * in, unsigned short * out );

/* convert an rgb color to an index into the web palette */
short rgb_to_666_index(unsigned char r, unsigned char g, unsigned char b);

/* shared / static methods ... */
int plotter_get_clip( GEM_PLOTTER self, struct s_clipping * out );
int plotter_std_clip(GEM_PLOTTER self,int x0, int y0, int x1, int y1);
void plotter_vdi_clip( GEM_PLOTTER self, bool set);

#define PLOTTER_IS_LOCKED(plotter) ( plotter->private_flags & PLOTTER_FLAG_LOCKED )
#define FILL_PLOTTER_VTAB( p ) \
   p->dtor = dtor;\
   p->resize= resize;\
   p->move = move;\
   p->lock = lock;\
   p->unlock = unlock;\
   p->update_region = update_region;\
   p->update_screen_region = update_screen_region;\
   p->update_screen = update_screen;\
   p->put_pixel = put_pixel;\
   p->copy_rect = copy_rect; \
   p->clip = clip;\
   p->arc = arc;\
   p->disc = disc;\
   p->line = line;\
   p->rectangle = rectangle;\
   p->polygon = polygon;\
   p->path = path;\
   p->bitmap = bitmap;\
   p->text = text;\


#define FILL_FONT_PLOTTER_VTAB( p ) \
	p->dtor = dtor;\
	p->str_width = str_width;\
	p->str_split = str_split;\
	p->pixel_position = pixel_position;\
	p->text = text;\

#define CURFB( p ) \
	p->fbuf[p->cfbi]

#define FIRSTFB( p ) \
	p->fbuf[0]

#define OFFSET_WEB_PAL 16
#define OFFSET_FONT_PAL 232
#define RGB_TO_VDI(c) rgb_to_666_index( (c&0xFF),(c&0xFF00)>>8,(c&0xFF0000)>>16)+OFFSET_WEB_PAL
#define ABGR_TO_RGB(c)  ( ((c&0xFF)<<16) | (c&0xFF00) | ((c&0xFF0000)>>16) ) << 8 

#endif