Blame projects/neural/tga.inc.cpp

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