2019-12-15 19:17:00 +00:00
|
|
|
#include "defconv.h"
|
|
|
|
|
2019-11-27 20:58:11 +00:00
|
|
|
#if GAME == 5
|
2022-07-08 21:18:43 +00:00
|
|
|
#define PI_SLOT_COUNT 8
|
2019-11-27 20:58:11 +00:00
|
|
|
#else
|
2022-07-08 21:18:43 +00:00
|
|
|
#define PI_SLOT_COUNT 6
|
2019-11-27 20:58:11 +00:00
|
|
|
#endif
|
|
|
|
|
2020-12-24 12:53:10 +00:00
|
|
|
#define PI_W RES_X
|
|
|
|
#define PI_H RES_Y
|
|
|
|
|
2022-11-10 01:03:18 +00:00
|
|
|
static const pixel_t PI_QUARTER_W = (PI_W / 2);
|
|
|
|
static const pixel_t PI_QUARTER_H = (PI_H / 2);
|
|
|
|
|
2019-12-15 19:17:00 +00:00
|
|
|
// Global PI file slots.
|
2017-01-11 15:12:39 +00:00
|
|
|
extern PiHeader pi_headers[PI_SLOT_COUNT];
|
|
|
|
extern void far *pi_buffers[PI_SLOT_COUNT];
|
2019-12-15 19:17:00 +00:00
|
|
|
|
|
|
|
// ≥TH03 free any previously loaded PI in the given slot before loading [fn].
|
2017-01-11 15:12:39 +00:00
|
|
|
int DEFCONV pi_load(int slot, const char *fn);
|
2019-12-15 19:17:00 +00:00
|
|
|
|
2017-01-11 15:12:39 +00:00
|
|
|
void DEFCONV pi_palette_apply(int slot);
|
2019-12-15 19:17:00 +00:00
|
|
|
|
2020-10-25 13:02:12 +00:00
|
|
|
#define pi_free(slot) \
|
|
|
|
graph_pi_free(&pi_headers[slot], pi_buffers[slot]);
|
|
|
|
|
2020-10-23 17:27:10 +00:00
|
|
|
// Displays the PI image in slot #[slot] at (⌊left/8⌋*8, top). Horizontally,
|
|
|
|
// the image is cut off at 640 pixels; vertically, it is wrapped if it exceeds
|
|
|
|
// the clipping frame defined via grc_setclip().
|
|
|
|
void DEFCONV pi_put_8(screen_x_t left, vram_y_t top, int slot);
|
2019-12-15 19:17:00 +00:00
|
|
|
|
2020-10-23 17:27:10 +00:00
|
|
|
#define pi_load_put_8_free(slot, fn) \
|
2017-01-11 15:12:39 +00:00
|
|
|
pi_load(slot, (fn)); \
|
|
|
|
pi_palette_apply(slot); \
|
2020-10-23 17:27:10 +00:00
|
|
|
pi_put_8(0, 0, slot); \
|
2020-10-25 13:02:12 +00:00
|
|
|
pi_free(slot); \
|
2020-12-24 12:53:10 +00:00
|
|
|
|
|
|
|
// .PI row pointer arithmetic
|
|
|
|
// --------------------------
|
|
|
|
|
|
|
|
typedef uint8_t far *pi_buffer_p_t;
|
|
|
|
|
|
|
|
#define pi_buffer_p_init(p, slot) \
|
|
|
|
p = reinterpret_cast<pi_buffer_p_t>(pi_buffers[slot]);
|
|
|
|
|
|
|
|
#define pi_buffer_p_offset(p, x, y) \
|
|
|
|
p += (((y * PI_W) + x) / 2);
|
|
|
|
|
|
|
|
#define pi_buffer_p_normalize(p) \
|
|
|
|
p = reinterpret_cast<pi_buffer_p_t>(MK_FP( \
|
|
|
|
(seg_t)(reinterpret_cast<uint32_t>(p) >> 16) + (FP_OFF(p) >> 4), \
|
|
|
|
(FP_OFF(p) & 0xF) \
|
|
|
|
));
|
|
|
|
|
|
|
|
#define pi_buffer_p_next_row(p, slot) \
|
|
|
|
pi_buffer_p_offset(p, pi_headers[slot].xsize, 0);
|
2022-11-10 01:03:18 +00:00
|
|
|
|
|
|
|
#define pi_buffer_p_init_quarter(p, slot, quarter) { \
|
|
|
|
pi_buffer_p_init(p, slot); \
|
|
|
|
if(quarter == 1) { \
|
|
|
|
pi_buffer_p_offset(p, PI_QUARTER_W, 0); \
|
|
|
|
} else if(quarter == 2) { \
|
|
|
|
pi_buffer_p_offset(p, 0, PI_QUARTER_H); \
|
|
|
|
} else if(quarter == 3) { \
|
|
|
|
pi_buffer_p_offset(p, PI_QUARTER_W, PI_QUARTER_H); \
|
|
|
|
} \
|
|
|
|
pi_buffer_p_normalize(p); \
|
|
|
|
}
|
2020-12-24 12:53:10 +00:00
|
|
|
// --------------------------
|