view lib64gfx.h @ 510:43ea59887c69

Start work on making C64 formats encoding possible by changing DMDecodeOps to DMEncDecOps and adding fields and op enums for custom encode functions, renaming, etc. Split generic op sanity checking into a separate function in preparation for its use in generic encoding function.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 19 Nov 2012 15:06:01 +0200
parents 272e64259fde
children 4cdcaeb68b54
line wrap: on
line source

/*
 * Functions for reading and converting various restricted
 * C64/etc and/or indexed/paletted graphics formats.
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2012 Tecnic Software productions (TNSP)
 *
 * Please read file 'COPYING' for information on license and distribution.
 */
#ifndef LIB64GFX_H
#define LIB64GFX_H 1

#include "libgfx.h"

#ifdef __cplusplus
extern "C" {
#endif


// Bitmap constants
#define C64_SCR_WIDTH          320
#define C64_SCR_HEIGHT         200
#define C64_SCR_CH_WIDTH       (C64_SCR_WIDTH/8)
#define C64_SCR_CH_HEIGHT      (C64_SCR_HEIGHT/8)
#define C64_SCR_COLOR_SIZE     (C64_SCR_CH_WIDTH * C64_SCR_CH_HEIGHT)
#define C64_SCR_SCREEN_SIZE    (C64_SCR_CH_WIDTH * C64_SCR_CH_HEIGHT)
#define C64_SCR_BITMAP_SIZE    (C64_SCR_WIDTH * C64_SCR_HEIGHT/8)
#define C64_SCR_EXTRADATA      1024
#define C64_SCR_MAX_BANK       8

// C64 video screen pixel aspect ratio on PAL
#define C64_SCR_PAR_XY         (0.9365f)

// Sprite constants
#define C64_SPR_WIDTH          3 // bytes
#define C64_SPR_HEIGHT         21 // lines
#define C64_SPR_WIDTH_PX       (8 * C64_SPR_WIDTH)
#define C64_SPR_SIZE           ((C64_SPR_WIDTH * C64_SPR_HEIGHT) + 1)

// Character constants
#define C64_CHR_WIDTH          1 // bytes
#define C64_CHR_HEIGHT         8 // lines
#define C64_CHR_WIDTH_PX       (8 * C64_CHR_WIDTH)
#define C64_CHR_SIZE           (C64_CHR_WIDTH * C64_CHR_HEIGHT)

// Etc.
#define C64_RAM_SIZE           (64*1024)
#define C64_NCOLORS            16
#define C64_MAX_COLORS         16
#define C64_VIDBANK_SIZE       (16*1024)
#define C64_MAX_SPRITES        (C64_VIDBANK_SIZE / C64_SPR_SIZE)
#define C64_MAX_CHARS          256

// Different supported C64 bitmap "modes"
enum
{
    DM_C64IFMT_HIRES,
    DM_C64IFMT_MC,
    DM_C64IFMT_HIRES_ILACE,
    DM_C64IFMT_MC_ILACE,
    DM_C64IFMT_HIRES_FLI,
    DM_C64IFMT_MC_FLI,

    DM_C64IFMT_LAST_TYPE
};


enum
{
    DM_C64ILACE_COLOR,
    DM_C64ILACE_RES,
};

typedef struct
{
    BOOL multicolor, xexpand, yexpand;
    int color, xc, yc;
    Uint8 data[C64_SPR_HEIGHT][C64_SPR_WIDTH];
} DMC64Sprite;


typedef struct
{
    int type,     // Image type (DM_C64IFMT_*)
        laceType, // Interlace type (DM_C64ILACE_*)
        fliType,  // FLI type (if FLI used)
        fliLines, // FLI on every # line
        laceBank2;

    Uint8 color[C64_SCR_MAX_BANK][C64_SCR_COLOR_SIZE],
            bitmap[C64_SCR_MAX_BANK][C64_SCR_BITMAP_SIZE],
            screen[C64_SCR_MAX_BANK][C64_SCR_SCREEN_SIZE],
            extradata[C64_SCR_EXTRADATA],
            d020, bgcolor, d022, d023, d024;

    Uint8 charset[C64_MAX_CHARS][C64_CHR_HEIGHT * C64_CHR_WIDTH];
    DMC64Sprite sprites[C64_MAX_SPRITES];
} DMC64Image;


enum
{
    DT_COLOR_RAM,
    DT_BITMAP,
    DT_SCREEN_RAM,
    DT_BGCOLOR,
    DT_EXTRADATA,
    
    DT_DEC_FUNCTION,
    DT_ENC_FUNCTION,
    
    DT_LAST,
};


typedef struct _DMC64EncDecOp
{
    int    type;
    size_t offs;
    int    bank;
    size_t size;
    BOOL   (*decfunction)(DMC64Image *img, const struct _DMC64EncDecOp *op, const Uint8 *buf, const size_t len);
    BOOL   (*encfunction)(const struct _DMC64EncDecOp *op, Uint8 **buf, size_t *len, const DMC64Image *img);
} DMC64EncDecOp;


typedef struct _DMC64ImageFormat
{
    int  type;
    char *extension;
    char *name;
    int  (*probe)(const Uint8 *buf, const size_t len);
    int  (*decode)(DMC64Image *img, const Uint8 *buf, const size_t len, const struct _DMC64ImageFormat *fmt);
    int  (*encode)(DMC64Image *img, Uint8 **buf, size_t *len, const struct _DMC64ImageFormat *fmt);
    int  (*convertFrom)(DMImage *, DMC64Image *);
    int  (*convertTo)(DMImage *, DMC64Image *);

    int ndecencOps;
    DMC64EncDecOp decencOps[16];
} DMC64ImageFormat;


extern const size_t      dmC64DefaultSizes[DT_LAST];
extern DMColor           dmC64Palette[C64_NCOLORS];
extern DMC64ImageFormat  dmC64ImageFormats[];
extern const int         ndmC64ImageFormats;
extern const char *      dmC64ImageTypeNames[];


int       dmC64ConvertCSData(DMImage *img, int xoffs, int yoffs, const Uint8 *inBuf, int width, int height, BOOL multicolor, int *colors);
int       dmC64ProbeGeneric(const Uint8 *buf, const size_t len, DMC64ImageFormat **fmt);
int       dmC64DecodeGenericBMP(DMC64Image *img, const Uint8 *buf, const size_t len, const DMC64ImageFormat *fmt);
int       dmC64ConvertGenericBMP2Image(DMImage *screen, const DMC64Image *img);
int       dmC64DecodeBMP(DMC64Image *img, const Uint8 *buf, const size_t len, const size_t probeOffs, const size_t loadOffs, DMC64ImageFormat **fmt, DMC64ImageFormat *forced);

int       dmReadDataFile(FILE *inFile, const char *filename, Uint8 **buf, size_t *size);


#ifdef __cplusplus
}
#endif

#endif // LIB64GFX_H