Blame simple/neural/tga.inc.cpp

Ivan Mahonin 53488e
#ifndef TGA_INC_CPP
Ivan Mahonin 53488e
#define TGA_INC_CPP
Ivan Mahonin 53488e
Ivan Mahonin 53488e
Ivan Mahonin 53488e
#include <cstdio>
Ivan Mahonin 53488e
Ivan Mahonin 53488e
Ivan Mahonin 53488e
bool tgaSave(const char *filename, const unsigned char *data, int w, int h, int ch) {
Ivan Mahonin 53488e
    if (!data || w <= 0 || h <= 0 || w > 0xffff || h > 0xffff || (ch != 3 && ch != 4)) {
Ivan Mahonin 53488e
        printf("ERROR: cannot save image (bad image): %s\n", filename);
Ivan Mahonin 53488e
        return false;
Ivan Mahonin 53488e
    }
Ivan Mahonin 53488e
Ivan Mahonin 53488e
    FILE *f = fopen(filename, "wb");
Ivan Mahonin 53488e
    if (!f) {
Ivan Mahonin 53488e
        printf("ERROR: cannot open file: %s\n", filename);
Ivan Mahonin 53488e
        return false;
Ivan Mahonin 53488e
    }
Ivan Mahonin 53488e
Ivan Mahonin 53488e
    #pragma pack(push,1)
Ivan Mahonin 53488e
    struct Header {
Ivan Mahonin 53488e
        unsigned char  idLength;
Ivan Mahonin 53488e
        unsigned char  colormapType;
Ivan Mahonin 53488e
        unsigned char  imageType;
Ivan Mahonin 53488e
        unsigned char  colormapIndex[2];
Ivan Mahonin 53488e
        unsigned char  colormapLength[2];
Ivan Mahonin 53488e
        unsigned char  colormapSize;
Ivan Mahonin 53488e
        unsigned char  xOrigin[2];
Ivan Mahonin 53488e
        unsigned char  yOrigin[2];
Ivan Mahonin 53488e
        unsigned char  width[2];
Ivan Mahonin 53488e
        unsigned char  height[2];
Ivan Mahonin 53488e
        unsigned char  pixelSize;
Ivan Mahonin 53488e
        unsigned char  attributes;
Ivan Mahonin 53488e
    };
Ivan Mahonin 53488e
    #pragma pack(pop)
Ivan Mahonin 53488e
    Header header = {};
Ivan Mahonin 53488e
    header.imageType = 2;
Ivan Mahonin 53488e
    header.width[0] = w;
Ivan Mahonin 53488e
    header.width[1] = w >> 8;
Ivan Mahonin 53488e
    header.height[0] = h;
Ivan Mahonin 53488e
    header.height[1] = h >> 8;
Ivan Mahonin 53488e
    header.pixelSize = ch == 4 ? 32 : 24;
Ivan Mahonin 53488e
    fwrite(&header, sizeof(header), 1, f);
Ivan Mahonin 53488e
Ivan Mahonin 53488e
    int rowSize = w*ch;
Ivan Mahonin 53488e
    int size = h*rowSize;
Ivan Mahonin 53488e
    const unsigned char *row = data + size;
Ivan Mahonin 53488e
    for(unsigned short r = h; r; --r, row -= rowSize) {
Ivan Mahonin 53488e
        for(const unsigned char *c = row - rowSize; c < row; c += ch) {
Ivan Mahonin 53488e
            fputc(c[2], f);
Ivan Mahonin 53488e
            fputc(c[1], f);
Ivan Mahonin 53488e
            fputc(c[0], f);
Ivan Mahonin 53488e
            if (ch == 4) fputc(c[3], f);
Ivan Mahonin 53488e
        }
Ivan Mahonin 53488e
    }
Ivan Mahonin 53488e
    fclose(f);
Ivan Mahonin 53488e
Ivan Mahonin 53488e
    return true;
Ivan Mahonin 53488e
}
Ivan Mahonin 53488e
Ivan Mahonin 53488e
Ivan Mahonin 53488e
#endif