view tools/libgfx.h @ 1545:3b613fcbf3ff

Improve how format read/write capabilities are marked and shown.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 12 May 2018 21:01:46 +0300
parents 48823642c4fb
children c29adf5ce240
line wrap: on
line source

/*
 * Functions for loading and saving bitmap images
 * 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 LIBMGFX_H
#define LIBMGFX_H 1

#include "dmlib.h"


#ifdef __cplusplus
extern "C" {
#endif


enum
{
    DM_IMGFMT_PNG,
    DM_IMGFMT_PPM,
    DM_IMGFMT_PCX,
    DM_IMGFMT_ILBM,
    DM_IMGFMT_RAW,
    DM_IMGFMT_ARAW,

    DM_IMGFMT_LAST
};


enum
{
    DM_IFMT_PALETTE,
    DM_IFMT_RGB,
    DM_IFMT_RGBA,
};


// Error handling modes
enum
{
    DM_ERRMODE_FAIL        = 0,
    DM_ERRMODE_RECOV_1,
    DM_ERRMODE_RECOV_2,
};


// Probe scores
enum
{
    DM_PROBE_SCORE_FALSE   = 0,
    DM_PROBE_SCORE_MAYBE   = 250,
    DM_PROBE_SCORE_AVG     = 500,
    DM_PROBE_SCORE_GOOD    = 750,
    DM_PROBE_SCORE_MAX     = 1000,
};


// Flags for readability/writeability of formats
enum
{
    DM_FMT_WR              = 0x0001,
    DM_FMT_RD              = 0x0002,
    DM_FMT_RDWR            = (DM_FMT_RD | DM_FMT_WR),
};


// Bitmapped image struct 
typedef struct
{
    int format;     // one of types specified by DM_IFMT_*
    int width, height;
    int pitch;      // bytes per scanline
    int bpp;        // bits per pixel

    int ncolors;    // number of colors in palette, if any
    int ctransp;    // transparency color index
    BOOL constpal;  // is the palette a const?
    DMColor *pal;   // pointer to palette struct, NULL if no palette

    size_t size;
    Uint8 *data;
} DMImage;


typedef struct
{
    int format;
    int scaleX, scaleY;
    int nplanes, bpp;
    BOOL planar, paletted;
} DMImageConvSpec;


typedef struct
{
    char *fext;
    char *desc;
    int  (*probe)(const Uint8 *buf, const size_t len);
    int  (*read)(const char *filename, DMImage **pimg);
    int  (*readFILE)(FILE *fp, DMImage **pimg);
    int  (*write)(const char *filename, const DMImage *pimg, const DMImageConvSpec *spec);
    int  (*writeFILE)(FILE *fp, const DMImage *pimg, const DMImageConvSpec *spec);
} DMImageFormat;


extern DMImageFormat dmImageFormatList[DM_IMGFMT_LAST];
extern int dmGFXErrorMode;


DMImage * dmImageAlloc(const int width, const int height, const int format, const int bpp);
void      dmImageFree(DMImage *img);
int       dmImageGetBytesPerPixel(const int format);
int       dmImageProbeGeneric(const Uint8 *buf, const size_t len, DMImageFormat **fmt, int *index);

BOOL dmCompareColor(const DMColor *c1, const DMColor *c2, BOOL alpha);


int dmWriteImageData(const DMImage *img, void *cbdata, int (*writeRowCB)(void *, const Uint8 *, const size_t), const DMImageConvSpec *spec);

int dmWriteIFFMasterRAWPalette(FILE *fp, const DMImage *img, int ncolors, const char *indent, const char *type);
int dmWriteRAWImageFILE(FILE *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmWriteRAWImage(const char *filename, const DMImage *img, const DMImageConvSpec *spec);

int dmWritePPMImageFILE(FILE *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmWritePPMImage(const char *filename, const DMImage *img, const DMImageConvSpec *spec);

#ifdef DM_USE_LIBPNG
int dmWritePNGImageFILE(FILE *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmWritePNGImage(const char *filename, const DMImage *img, const DMImageConvSpec *spec);
#endif

int dmReadILBMImageFILE(FILE *fp, DMImage **pimg);
int dmReadILBMImage(const char *filename, DMImage **pimg);

int dmWritePCXImageFILE(FILE *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmWritePCXImage(const char *filename, const DMImage *img, const DMImageConvSpec *spec);
int dmReadPCXImageFILE(FILE *fp, DMImage **pimg);
int dmReadPCXImage(const char *filename, DMImage **pimg);


typedef struct _DMBitStreamContext
{
    void *handle;

    BOOL (*putByte)(struct _DMBitStreamContext *ctx, Uint8 val);

    int outBuf, outBitCount, outByteCount;
} DMBitStreamContext;


void  dmInitBitStreamContext(DMBitStreamContext *ctx);
int   dmFlushBitStream(DMBitStreamContext *ctx);
BOOL  dmPutBits(DMBitStreamContext *ctx, const int val, const int n);
int   dmInitBitStreamFILE(DMBitStreamContext *ctx, FILE *fp);



#ifdef __cplusplus
}
#endif

#endif // LIBMGFX_H