mirror of https://github.com/nmlgc/ReC98.git
105 lines
3.5 KiB
C
105 lines
3.5 KiB
C
/// Uncompressed, monochrome / 16-color / 16-color + alpha, 32w×h sprite format
|
||
/// ---------------------------------------------------------------------------
|
||
|
||
// Number of planes per image.
|
||
typedef enum {
|
||
#if (GAME >= 4)
|
||
CDG_COLORS = 0, // 4 planes per image
|
||
CDG_COLORS_AND_ALPHA = 1, // 5 planes per image
|
||
CDG_ALPHA = 2, // 1 plane per image
|
||
#else
|
||
CDG_COLORS_AND_ALPHA = 0, // 5 planes per image
|
||
#endif
|
||
} cdg_plane_layout_t;
|
||
|
||
// Doubles as both the file format header (describing all images in a file)
|
||
// and the internal slot structure (describing a single image).
|
||
typedef struct {
|
||
// Size of a single bitplane.
|
||
uint16_t bitplane_size;
|
||
|
||
// Only used by custom functions that apply effects on the image. The core
|
||
// CDG functions mainly use the two pre-calculated values
|
||
// [offset_at_bottom_left] and [vram_dword_w] instead.
|
||
int16_t pixel_w;
|
||
int16_t pixel_h;
|
||
|
||
// vram_byte_amount_t, equal to (ROW_SIZE * ([pixel_h - 1])).
|
||
int16_t offset_at_bottom_left;
|
||
|
||
// vram_dword_amount_t, equal to [pixel_w / 32].
|
||
uint16_t vram_dword_w;
|
||
|
||
// In TH03, this can also be 0 for single-image files.
|
||
uint8_t image_count;
|
||
|
||
// See cdg_plane_layout_t.
|
||
int8_t plane_layout;
|
||
|
||
// Memory segments of the loaded data. Must be 0 in the file header!
|
||
uint16_t seg_alpha;
|
||
uint16_t seg_colors;
|
||
} cdg_t;
|
||
|
||
#if (GAME >= 4)
|
||
static const int CDG_SLOT_COUNT = 64;
|
||
#else
|
||
static const int CDG_SLOT_COUNT = 32;
|
||
#endif
|
||
|
||
extern cdg_t cdg_slots[CDG_SLOT_COUNT];
|
||
|
||
// Loading and freeing
|
||
// -------------------
|
||
// Loads all images of the CDG file [fn], starting at [slot_first] and
|
||
// incrementing the slot number for every further image.
|
||
void pascal cdg_load_all(int slot_first, const char *fn);
|
||
|
||
// Like cdg_load_all(), but not loading any alpha planes.
|
||
void pascal cdg_load_all_noalpha(int slot_first, const char *fn);
|
||
|
||
// Loads the [n]th image of the CDG file [fn] into [slot].
|
||
void pascal cdg_load_single(int slot, const char *fn, int n);
|
||
|
||
// Like cdg_load_single(), but not loading any alpha planes.
|
||
void pascal cdg_load_single_noalpha(int slot, const char *fn, int n);
|
||
|
||
// Frees the CDG image in the given [slot].
|
||
void pascal cdg_free(int slot);
|
||
|
||
// Frees the CDG images in all slots.
|
||
void pascal cdg_free_all(void);
|
||
// -------------------
|
||
|
||
// Blitting
|
||
// --------
|
||
// Displays the CDG image in the given [slot] at (⌊left/8⌋*8, top).
|
||
void pascal cdg_put_8(screen_x_t left, vram_y_t top, int slot);
|
||
|
||
// Displays the CDG image in the given [slot] at (⌊left/8⌋*8, top),
|
||
// disregarding its alpha plane.
|
||
void pascal cdg_put_noalpha_8(screen_x_t left, vram_y_t top, int slot);
|
||
|
||
#if (GAME == 3)
|
||
// Displays the CDG image in the given [slot] at (⌊left/8⌋*8, top),
|
||
// flipped horizontally using the [hflip_lut].
|
||
void pascal cdg_put_hflip_8(screen_x_t left, vram_y_t top, int slot);
|
||
|
||
// Displays the CDG image in the given [slot] centered at
|
||
// (⌊center_x/8⌋*8, center_y), then applies a dissolve effect with the
|
||
// given [strength] (mod 8, 0 = none, 7 = full) on the E bitplane.
|
||
void pascal cdg_put_dissolve_e_8(
|
||
screen_x_t center_x, vram_y_t center_y, int slot, int strength
|
||
);
|
||
|
||
// Assuming that the CDG image in the given [slot] was previously
|
||
// displayed centered at (⌊center_x/8⌋*8, center_y), this function clears
|
||
// the two lines at the bottom of that image, as well as the one line
|
||
// immediately below, from the VRAM's E plane.
|
||
void cdg_unput_for_upwards_motion_e_8(
|
||
screen_x_t center_x, vram_y_t center_y, int slot
|
||
);
|
||
#endif
|
||
// --------
|
||
/// ---------------------------------------------------------------------------
|