Subversion Repositories Games.Descent

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 pmbaty 1
/*
2
 * Portions of this file are copyright Rebirth contributors and licensed as
3
 * described in COPYING.txt.
4
 * Portions of this file are copyright Parallax Software and licensed
5
 * according to the Parallax license below.
6
 * See COPYING.txt for license details.
7
 
8
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
9
SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
10
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
11
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
12
IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
13
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
14
FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
15
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
16
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
17
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
18
*/
19
 
20
#pragma once
21
 
22
#include <SDL_version.h>
23
#if SDL_MAJOR_VERSION == 2
24
#include <SDL_video.h>
25
#endif
26
#include <cstdint>
27
#include <memory>
28
#include <utility>
29
#include "palette.h"
30
#include "maths.h"
31
#include "u_mem.h"
32
 
33
// some defines for transparency and blending
34
constexpr auto TRANSPARENCY_COLOR = color_palette_index{255};            // palette entry of transparency color -- 255 on the PC
35
#define GR_FADE_LEVELS       34u
36
#define GR_FADE_OFF          GR_FADE_LEVELS // yes, max means OFF - don't screw that up
37
enum class gr_blend {
38
        normal,         // normal blending
39
        additive_a,     // additive alpha blending
40
        additive_c,     // additive color blending
41
};
42
 
43
#define SWIDTH  (grd_curscreen->get_screen_width())
44
#define SHEIGHT (grd_curscreen->get_screen_height())
45
 
46
#if defined(DXX_BUILD_DESCENT_I)
47
namespace dsx {
48
extern int HiresGFXAvailable;
49
}
50
#define HIRESMODE HiresGFXAvailable             // descent.pig either contains hires or lowres graphics, not both
51
#elif defined(DXX_BUILD_DESCENT_II)
52
#define HIRESMODE (SWIDTH >= 640 && SHEIGHT >= 480 && !GameArg.GfxSkipHiresGFX)
53
#endif
54
#define MAX_BMP_SIZE(width, height) (4 + ((width) + 2) * (height))
55
 
56
#define SCRNS_DIR "screenshots/"
57
 
58
//these are control characters that have special meaning in the font code
59
 
60
#define CC_COLOR        1   //next char is new foreground color
61
#define CC_LSPACING     2   //next char specifies line spacing
62
#define CC_UNDERLINE    3   //next char is underlined
63
 
64
//now have string versions of these control characters (can concat inside a string)
65
 
66
#define CC_COLOR_S      "\x1"   //next char is new foreground color
67
#define CC_LSPACING_S   "\x2"   //next char specifies line spacing
68
#define CC_UNDERLINE_S  "\x3"   //next char is underlined
69
 
70
enum bm_mode : uint8_t
71
{
72
        linear,
73
        rgb15 = 3,      //5 bits each r,g,b stored at 16 bits
74
#if DXX_USE_OGL
75
        ogl = 5,
76
#endif /* def OGL */
77
};
78
 
79
#define BM_FLAG_TRANSPARENT         1
80
#define BM_FLAG_SUPER_TRANSPARENT   2
81
#define BM_FLAG_NO_LIGHTING         4
82
#define BM_FLAG_RLE                 8   // A run-length encoded bitmap.
83
#define BM_FLAG_PAGED_OUT           16  // This bitmap's data is paged out.
84
#define BM_FLAG_RLE_BIG             32  // for bitmaps that RLE to > 255 per row (i.e. cockpits)
85
 
86
#ifdef __cplusplus
87
#include "dxxsconf.h"
88
#include "dsx-ns.h"
89
#include <array>
90
 
91
struct grs_bitmap;
92
struct grs_canvas;
93
#define GRS_FONT_SIZE 28    // how much space it takes up on disk
94
struct grs_point;
95
 
96
union screen_mode;
97
 
98
class grs_screen;
99
 
100
namespace dcx {
101
 
102
struct grs_main_canvas;
103
typedef std::unique_ptr<grs_main_canvas> grs_canvas_ptr;
104
 
105
struct grs_subcanvas;
106
typedef std::unique_ptr<grs_subcanvas> grs_subcanvas_ptr;
107
 
108
// Free the bitmap and its pixel data
109
class grs_main_bitmap;
110
typedef std::unique_ptr<grs_main_bitmap> grs_bitmap_ptr;
111
 
112
struct grs_font;
113
 
114
#if SDL_MAJOR_VERSION == 1
115
uint_fast32_t gr_list_modes(std::array<screen_mode, 50> &modes);
116
#elif SDL_MAJOR_VERSION == 2
117
extern SDL_Window *g_pRebirthSDLMainWindow;
118
#endif
119
 
120
}
121
 
122
#ifdef dsx
123
namespace dsx {
124
int gr_set_mode(screen_mode mode);
125
void gr_set_mode_from_window_size();
126
 
127
int gr_init();
128
#if DXX_USE_OGL
129
void gr_set_attributes();
130
#endif
131
void gr_close();
132
}
133
#endif
134
 
135
namespace dcx {
136
 
137
grs_canvas_ptr gr_create_canvas(uint16_t w, uint16_t h);
138
 
139
grs_subcanvas_ptr gr_create_sub_canvas(grs_canvas &canv,uint16_t x,uint16_t y,uint16_t w, uint16_t h);
140
 
141
// Initialize the specified canvas. the raw pixel data buffer is passed as
142
// a parameter. no memory allocation is performed.
143
 
144
void gr_init_canvas(grs_canvas &canv,unsigned char *pixdata, bm_mode pixtype, uint16_t w, uint16_t h);
145
 
146
// Initialize the specified sub canvas. no memory allocation is performed.
147
 
148
void gr_init_sub_canvas(grs_canvas &n, grs_canvas &src, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
149
 
150
// Clear the current canvas to the specified color
151
void gr_clear_canvas(grs_canvas &, color_t color);
152
 
153
//=========================================================================
154
// Bitmap functions:
155
 
156
// these are the two workhorses, the others just use these
157
void gr_init_bitmap(grs_bitmap &bm, bm_mode mode, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bytesperline, const uint8_t *data) noexcept;
158
void gr_init_main_bitmap(grs_main_bitmap &bm, bm_mode mode, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bytesperline, RAIIdmem<uint8_t[]> data);
159
void gr_init_sub_bitmap (grs_bitmap &bm, grs_bitmap &bmParent, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
160
 
161
void gr_init_bitmap_alloc(grs_main_bitmap &bm, bm_mode mode, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bytesperline);
162
void gr_free_bitmap_data(grs_bitmap &bm);
163
 
164
// Allocate a bitmap and its pixel data buffer.
165
grs_bitmap_ptr gr_create_bitmap(uint16_t w,uint16_t h);
166
 
167
// Free the bitmap, but not the pixel data buffer
168
class grs_subbitmap;
169
typedef std::unique_ptr<grs_subbitmap> grs_subbitmap_ptr;
170
 
171
// Creates a bitmap which is part of another bitmap
172
grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap &bm, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
173
 
174
// Free the bitmap's data
175
 
176
#if !DXX_USE_OGL
177
void gr_bm_ubitblt(grs_canvas &dest, unsigned w, unsigned h, int dx, int dy, int sx, int sy, const grs_bitmap &src);
178
void gr_bm_ubitbltm(grs_canvas &dest, unsigned w, unsigned h, unsigned dx, unsigned dy, unsigned sx, unsigned sy, const grs_bitmap &src);
179
#define gr_bm_pixel(C,B,X,Y,C2) gr_bm_pixel(B,X,Y,C2)
180
#define gr_settransblend(A,B,C) gr_settransblend(A,B)
181
#endif
182
void gr_bm_pixel(grs_canvas &, grs_bitmap &bm, uint_fast32_t x, uint_fast32_t y, uint8_t color);
183
void gr_set_bitmap_data(grs_bitmap &bm, const uint8_t *data);
184
}
185
 
186
#ifdef dsx
187
namespace dsx {
188
 
189
//=========================================================================
190
// Color functions:
191
 
192
// When this function is called, the guns are set to gr_palette, and
193
// the palette stays the same until gr_close is called
194
 
195
void gr_use_palette_table(const char * filename);
196
 
197
}
198
#endif
199
 
200
//=========================================================================
201
// Drawing functions:
202
 
203
namespace dcx {
204
 
205
// Sets transparency and blending function
206
void gr_settransblend(grs_canvas &, int fade_level, gr_blend blend_func);
207
 
208
// Draws a point into the current canvas in the current color and drawmode.
209
void gr_pixel(grs_bitmap &, unsigned x, unsigned y, color_palette_index color);
210
void gr_upixel(grs_bitmap &, unsigned x, unsigned y, color_palette_index color);
211
 
212
// Gets a pixel;
213
color_palette_index gr_gpixel(const grs_bitmap &bitmap, unsigned x, unsigned y);
214
color_palette_index gr_ugpixel(const grs_bitmap &bitmap, int x, int y);
215
 
216
// Draws a line into the current canvas in the current color and drawmode.
217
void gr_line(grs_canvas &, fix x0,fix y0,fix x1,fix y1, color_palette_index color);
218
void gr_uline(grs_canvas &canvas, fix x0,fix y0,fix x1,fix y1, color_palette_index color);
219
 
220
// Draw the bitmap into the current canvas at the specified location.
221
void gr_bitmap(grs_canvas &, unsigned x,unsigned y,grs_bitmap &bm);
222
void gr_ubitmap(grs_canvas &, grs_bitmap &bm);
223
void show_fullscr(grs_canvas &, grs_bitmap &bm);
224
 
225
// Find transparent area in bitmap
226
void gr_bitblt_find_transparent_area(const grs_bitmap &bm, unsigned &minx, unsigned &miny, unsigned &maxx, unsigned &maxy);
227
 
228
// bitmap function with transparency
229
#if !DXX_USE_OGL
230
void gr_bitmapm(grs_canvas &, unsigned x, unsigned y, const grs_bitmap &bm);
231
void gr_ubitmapm(grs_canvas &, unsigned x, unsigned y, grs_bitmap &bm);
232
#endif
233
 
234
// Draw a rectangle into the current canvas.
235
void gr_rect(grs_canvas &, int left,int top,int right,int bot, color_palette_index color);
236
void gr_urect(grs_canvas &, int left,int top,int right,int bot, color_palette_index color);
237
 
238
// Draw a filled circle
239
int gr_disk(grs_canvas &, fix x,fix y,fix r, color_palette_index color);
240
 
241
// Draw an outline circle
242
int gr_ucircle(grs_canvas &, fix x,fix y,fix r, color_palette_index color);
243
 
244
// Draw an unfilled rectangle into the current canvas
245
#if DXX_USE_EDITOR
246
void gr_box(grs_canvas &, uint_fast32_t left,uint_fast32_t top,uint_fast32_t right,uint_fast32_t bot, color_palette_index color);
247
#endif
248
void gr_ubox(grs_canvas &, int left,int top,int right,int bot, color_palette_index color);
249
 
250
void gr_scanline(grs_canvas &canvas, int x1, int x2, unsigned y, color_palette_index color);
251
#if !DXX_USE_OGL
252
void gr_uscanline(grs_canvas &canvas, unsigned x1, unsigned x2, unsigned y, color_palette_index color);
253
#endif
254
void gr_close_font(std::unique_ptr<grs_font> font);
255
 
256
struct font_delete;
257
typedef std::unique_ptr<grs_font, font_delete> grs_font_ptr;
258
 
259
// Reads in a font file... current font set to this one.
260
grs_font_ptr gr_init_font(grs_canvas &canvas, const char * fontfile);
261
 
262
}
263
 
264
#ifdef dsx
265
namespace dsx {
266
 
267
#if defined(DXX_BUILD_DESCENT_I)
268
#define DXX_SDL_WINDOW_CAPTION  "Descent"
269
#define DXX_SDL_WINDOW_ICON_BITMAP      "d1x-rebirth.bmp"
270
#elif defined(DXX_BUILD_DESCENT_II)
271
#define DXX_SDL_WINDOW_CAPTION  "Descent II"
272
#define DXX_SDL_WINDOW_ICON_BITMAP      "d2x-rebirth.bmp"
273
void gr_copy_palette(palette_array_t &gr_palette, const palette_array_t &pal);
274
#endif
275
 
276
}
277
#endif
278
 
279
// Writes a string using current font. Returns the next column after last char.
280
namespace dcx {
281
 
282
//remap (by re-reading) all the color fonts
283
void gr_remap_color_fonts();
284
void gr_set_curfont(grs_canvas &, const grs_font *);
285
void gr_string(grs_canvas &, const grs_font &, int x, int y, const char *s, int w, int h);
286
void gr_string(grs_canvas &, const grs_font &, int x, int y, const char *s);
287
void gr_ustring(grs_canvas &, const grs_font &, int x, int y, const char *s);
288
template <void (&)(grs_canvas &, const grs_font &, int, int, const char *)>
289
void gr_printt(grs_canvas &, const grs_font &, int x, int y, const char *format, ...) __attribute_format_printf(5, 6);
290
#define gr_printfs(...) gr_printt<gr_string>(__VA_ARGS__)
291
#define gr_printfus(...)        gr_printt<gr_ustring>(__VA_ARGS__)
292
#define gr_printf(A1,A2,A3,A4,F,...)    dxx_call_printf_checked(gr_printfs,gr_string,(A1,A2,A3,A4),(F),##__VA_ARGS__)
293
#define gr_uprintf(A1,A2,A3,A4,F,...)   dxx_call_printf_checked(gr_printfus,gr_ustring,(A1,A2,A3,A4),(F),##__VA_ARGS__)
294
std::pair<const char *, unsigned> gr_get_string_wrap(const grs_font &, const char *s, unsigned limit);
295
int gr_get_string_height(const grs_font &cv_font, unsigned lines);
296
void gr_get_string_size(const grs_font &, const char *s, int *string_width, int *string_height, int *average_width);
297
void gr_get_string_size(const grs_font &, const char *s, int *string_width, int *string_height, int *average_width, const unsigned max_chars_per_line);
298
 
299
// From scale.c
300
void scale_bitmap(const grs_bitmap &bp, const std::array<grs_point, 3> &vertbuf, int orientation, grs_bitmap &);
301
 
302
//===========================================================================
303
// Global variables
304
extern grs_canvas *grd_curcanv;             //active canvas
305
extern std::unique_ptr<grs_screen> grd_curscreen;           //active screen
306
 
307
/* Define `DXX_DEBUG_CURRENT_CANVAS_ORIGIN` to a positive integer N to
308
 * save __FILE__+__LINE__ of the N most recent callers.  If
309
 * `DXX_DEBUG_CURRENT_CANVAS_ORIGIN` is not a positive integer, the
310
 * file+line is not passed to the canvas update functions.
311
 *
312
 * Use this to trace which functions update the global canvas pointer
313
 * without requiring a debugger trap on every update.
314
 */
315
#define DXX_DEBUG_CURRENT_CANVAS_ORIGIN 0
316
 
317
#if DXX_DEBUG_CURRENT_CANVAS_ORIGIN > 0
318
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_DECL_VARS    const char *const file, const unsigned line
319
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS    , DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_DECL_VARS
320
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_PASS_VARS    file, line
321
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_PASS_VARS    , DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_PASS_VARS
322
#define gr_set_default_canvas() gr_set_default_canvas(__FILE__, __LINE__)
323
#define gr_set_current_canvas(C)        gr_set_current_canvas(C, __FILE__, __LINE__)
324
#else
325
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_DECL_VARS
326
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS
327
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_PASS_VARS
328
#define DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_PASS_VARS
329
#endif
330
void (gr_set_default_canvas)(DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_DECL_VARS);
331
void (gr_set_current_canvas)(grs_canvas & DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS);
332
void (gr_set_current_canvas)(std::nullptr_t DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS) = delete;
333
void gr_set_current_canvas2(grs_canvas * DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS);
334
 
335
static inline void gr_set_current_canvas_inline(grs_canvas *const canv DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS)
336
{
337
        if (canv)
338
                (gr_set_current_canvas)(*canv DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_PASS_VARS);
339
        else
340
                (gr_set_default_canvas)(DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_N_PASS_VARS);
341
}
342
 
343
static inline void (gr_set_current_canvas)(grs_canvas *const canv DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_DECL_VARS)
344
{
345
#ifdef DXX_HAVE_BUILTIN_CONSTANT_P
346
        if (dxx_builtin_constant_p(!canv))
347
                gr_set_current_canvas_inline(canv DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_PASS_VARS);
348
        else
349
#endif
350
                gr_set_current_canvas2(canv DXX_DEBUG_CURRENT_CANVAS_FILE_LINE_COMMA_L_PASS_VARS);
351
}
352
 
353
//flags for fonts
354
#define FT_COLOR        1
355
#define FT_PROPORTIONAL 2
356
#define FT_KERNED       4
357
 
358
extern palette_array_t gr_palette;
359
using gft_array1 = std::array<std::array<color_t, 256>, GR_FADE_LEVELS>;
360
extern gft_array1 gr_fade_table;
361
}
362
 
363
extern uint16_t gr_palette_selector;
364
extern uint16_t gr_inverse_table_selector;
365
extern uint16_t gr_fade_table_selector;
366
 
367
// Remaps a bitmap into the current palette. If transparent_color is
368
// between 0 and 255 then all occurances of that color are mapped to
369
// whatever color the 2d uses for transparency. This is normally used
370
// right after a call to iff_read_bitmap like this:
371
//              iff_error = iff_read_bitmap(filename,new,bm_mode::linear,newpal);
372
//              if (iff_error != IFF_NO_ERROR) Error("Can't load IFF file <%s>, error=%d",filename,iff_error);
373
//              if (iff_has_transparency)
374
//                      gr_remap_bitmap(new, newpal, iff_transparent_color);
375
//              else
376
//                      gr_remap_bitmap(new, newpal, -1);
377
 
378
// Same as above, but searches using gr_find_closest_color which uses
379
// 18-bit accurracy instead of 15bit when translating colors.
380
namespace dcx {
381
void gr_remap_bitmap_good(grs_bitmap &bmp, palette_array_t &palette, uint_fast32_t transparent_color, uint_fast32_t super_transparent_color);
382
 
383
void gr_palette_step_up(int r, int g, int b);
384
 
385
#define BM_RGB(r,g,b) ((((r)&31)<<10) | (((g)&31)<<5) | ((b)&31))
386
#define BM_XRGB(r,g,b) gr_find_closest_color((r)*2,(g)*2,(b)*2)
387
 
388
// Given: r,g,b, each in range of 0-63, return the color index that
389
// best matches the input.
390
color_palette_index gr_find_closest_color(int r, int g, int b);
391
color_palette_index gr_find_closest_color_15bpp(int rgb);
392
void gr_flip();
393
 
394
/*
395
 * must return 0 if windowed, 1 if fullscreen
396
 */
397
int gr_check_fullscreen();
398
 
399
/*
400
 * returns state after toggling (ie, same as if you had called
401
 * check_fullscreen immediatly after)
402
 */
403
void gr_toggle_fullscreen();
404
 
405
void ogl_do_palfx();
406
void ogl_init_pixel_buffers(unsigned w, unsigned h);
407
void ogl_close_pixel_buffers();
408
}
409
void ogl_cache_polymodel_textures(unsigned model_num);
410
 
411
#endif