view tools/libgfx.h @ 1896:f80b2dc77c30

Work begins on IFF ILBM/PBM image writer. It is pretty broken, some things will not work and some things are hardcoded. The ByteRun1 compression implementation is somewhat inefficient. Interleaved files do not work yet.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 26 Jun 2018 03:13:38 +0300
parents cbc911ffd21e
children ee9bbf891352
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"
#include "dmres.h"


#ifdef __cplusplus
extern "C" {
#endif


enum
{
    DM_IMGFMT_PNG,
    DM_IMGFMT_PPM,
    DM_IMGFMT_PCX,
    DM_IMGFMT_IFF,
    DM_IMGFMT_RAW,
    DM_IMGFMT_ARAW,
};


enum
{
    DM_COLFMT_PALETTE,
    DM_COLFMT_RGB,
    DM_COLFMT_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, // Format can be written
    DM_FMT_RD              = 0x0002, // Format can be read
    DM_FMT_RDWR            = (DM_FMT_RD | DM_FMT_WR), // Read and write support
    DM_FMT_BROKEN          = 0x1000, // Support is broken/incomplete
};


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

    float aspect;   // aspect ratio (vert / horiz), <= 0 if not set

    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, mask;
    BOOL planar, paletted;
    int compression;
} DMImageConvSpec;


typedef struct
{
    char *fext;
    char *name;
    int  fmtid;  // DM_IMGFMT_*
    int  flags;  // DM_FMT_* flags
    int  (*probe)(const Uint8 *buf, const size_t len);
    int  (*read)(DMResource *fp, DMImage **pimg);
    int  (*write)(DMResource *fp, const DMImage *pimg, const DMImageConvSpec *spec);
} DMImageFormat;


extern const DMImageFormat dmImageFormatList[];
extern const int ndmImageFormatList;
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, const DMImageFormat **fmt, int *index);

BOOL dmCompareColor(const DMColor *c1, const DMColor *c2, BOOL alpha);
BOOL dmPaletteAlloc(DMColor **ppal, int ncolors, int ctransp);
BOOL dmImagePaletteAlloc(DMImage *img, int ncolors, int ctransp);


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


int dmWriteIFFMasterRAWHeader(DMResource *fp, const char *filename, const char *prefix, const DMImage *img, const DMImageConvSpec *spec, const int fmtid);
int dmWriteRAWImage(DMResource *fp, const DMImage *img, const DMImageConvSpec *spec);

int dmWritePPMImage(DMResource *fp, const DMImage *img, const DMImageConvSpec *spec);

#ifdef DM_USE_LIBPNG
int dmWritePNGImage(DMResource *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmReadPNGImage(DMResource *fp, DMImage **pimg);
#endif

int dmWritePCXImage(DMResource *fp, const DMImage *img, const DMImageConvSpec *spec);
int dmReadPCXImage(DMResource *fp, DMImage **pimg);

int dmReadIFFImage(DMResource *fp, DMImage **pimg);
int dmWriteIFFImage(DMResource *fp, const DMImage *img, const DMImageConvSpec *spec);


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, DMResource *fp);



#ifdef __cplusplus
}
#endif

#endif // LIBMGFX_H