view lib64gfx.h @ 435:e4a3f183e463

Modularize some more.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 03 Nov 2012 16:08:30 +0200
parents 936bc27a79d6
children 272e64259fde
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_FUNCTION,
    
    DT_LAST,
};


typedef struct _DMDecodeOp
{
    int    type;
    size_t offs;
    int    bank;
    size_t size;
    BOOL   (*function)(DMC64Image *img, const struct _DMDecodeOp *op, const Uint8 *buf, const size_t len);
} DMDecodeOp;


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  (*convert)(DMImage *, DMC64Image *);

    int ndecodeOps;
    DMDecodeOp decodeOps[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