Blame simple/imgfilters/img.ldr.inc.c

Ivan Mahonin 608c44
Ivan Mahonin 608c44
#include "img.ldr.tga.inc.c"
Ivan Mahonin 608c44
Ivan Mahonin 608c44
#ifdef PNG_LIBPNG_VER_STRING
Ivan Mahonin 608c44
#include "img.ldr.png.inc.c"
Ivan Mahonin 608c44
#endif
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
typedef int (*ImageLoadFunc)(const char *path, int *outWidth, int *outHeight, unsigned char **pixels);
Ivan Mahonin 608c44
typedef int (*ImageSaveFunc)(const char *path, int width, int height, const unsigned char *pixels);
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
int checkExt(const char *path, const char *ext) {
Ivan Mahonin 608c44
  int lp = strlen(path);
Ivan Mahonin 608c44
  int le = strlen(ext);
Ivan Mahonin 608c44
  if (lp <= le) return FALSE;
Ivan Mahonin 608c44
  if (path[lp-le-1] != '.') return FALSE;
Ivan Mahonin 608c44
  for(const char *a = path+lp-le, *b = ext; *b; ++a, ++b)
Ivan Mahonin 608c44
    if (tolower(*a) != tolower(*b)) return FALSE;
Ivan Mahonin 608c44
  return TRUE;
Ivan Mahonin 608c44
}
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
int imageLoadAuto(const char *path, int *outWidth, int *outHeight, unsigned char **pixels) {
Ivan Mahonin 608c44
  struct {
Ivan Mahonin 608c44
    const char *ext;
Ivan Mahonin 608c44
    ImageLoadFunc func;
Ivan Mahonin 608c44
  } formats[] = {
Ivan Mahonin 608c44
    { "tga", &imageLoadTga },
Ivan Mahonin 608c44
    #if defined(HELI_HELIANTUS_H)
Ivan Mahonin 608c44
    { "png", &imageLoad },
Ivan Mahonin 608c44
    #elif defined(PNG_LIBPNG_VER_STRING)
Ivan Mahonin 608c44
    { "png", &imageLoadPng },
Ivan Mahonin 608c44
    #endif
Ivan Mahonin 608c44
  };
Ivan Mahonin 608c44
Ivan Mahonin 608c44
  int cnt = sizeof(formats)/sizeof(*formats);
Ivan Mahonin 608c44
  for(int i = 0; i < cnt; ++i)
Ivan Mahonin 608c44
    if (checkExt(path, formats[i].ext))
Ivan Mahonin 608c44
      return formats[i].func(path, outWidth, outHeight, pixels);
Ivan Mahonin 608c44
Ivan Mahonin 608c44
  fprintf(stderr, "Cannot load this image format (supported formats:");
Ivan Mahonin 608c44
  for(int i = 0; i < cnt; ++i)
Ivan Mahonin 608c44
    fprintf(stderr, " %s", formats[i].ext);
Ivan Mahonin 608c44
  fprintf(stderr, "): %s\n", path);
Ivan Mahonin 608c44
  fflush(stderr);
Ivan Mahonin 608c44
  return FALSE;
Ivan Mahonin 608c44
}
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
int imageSaveAuto(const char *path, int width, int height, const unsigned char *pixels) {
Ivan Mahonin 608c44
  struct {
Ivan Mahonin 608c44
    const char *ext;
Ivan Mahonin 608c44
    ImageSaveFunc func;
Ivan Mahonin 608c44
  } formats[] = {
Ivan Mahonin 608c44
    { "tga", &imageSaveTga },
Ivan Mahonin 608c44
    #if defined(HELI_HELIANTUS_H)
Ivan Mahonin 608c44
    { "png", (ImageSaveFunc)&imageSave },
Ivan Mahonin 608c44
    #elif defined(PNG_LIBPNG_VER_STRING)
Ivan Mahonin 608c44
    { "png", &imageSavePng },
Ivan Mahonin 608c44
    #endif
Ivan Mahonin 608c44
  };
Ivan Mahonin 608c44
Ivan Mahonin 608c44
  int cnt = sizeof(formats)/sizeof(*formats);
Ivan Mahonin 608c44
  for(int i = 0; i < cnt; ++i)
Ivan Mahonin 608c44
    if (checkExt(path, formats[i].ext))
Ivan Mahonin 608c44
      return formats[i].func(path, width, height, pixels);
Ivan Mahonin 608c44
Ivan Mahonin 608c44
  fprintf(stderr, "Cannot save this image format (supported formats:");
Ivan Mahonin 608c44
  for(int i = 0; i < cnt; ++i)
Ivan Mahonin 608c44
    fprintf(stderr, " %s", formats[i].ext);
Ivan Mahonin 608c44
  fprintf(stderr, "): %s\n", path);
Ivan Mahonin 608c44
  fflush(stderr);
Ivan Mahonin 608c44
  return FALSE;
Ivan Mahonin 608c44
}
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
int imgLoad(Img *img, const char *path) {
Ivan Mahonin 608c44
  imgDestroy(img);
Ivan Mahonin 608c44
  int w, h;
Ivan Mahonin 608c44
  unsigned char *data;
Ivan Mahonin 608c44
  if (!imageLoadAuto(path, &w, &h, &data))
Ivan Mahonin 608c44
    { free(data); return FALSE; }
Ivan Mahonin 608c44
  imgFromInt(img, w, h, data);
Ivan Mahonin 608c44
  free(data);
Ivan Mahonin 608c44
  return TRUE;
Ivan Mahonin 608c44
}
Ivan Mahonin 608c44
Ivan Mahonin 608c44
Ivan Mahonin 608c44
int imgSave(Img *img, const char *path) {
Ivan Mahonin 608c44
  unsigned char *data = imgToInt(img);
Ivan Mahonin 608c44
  if (!imageSaveAuto(path, img->w, img->h, data))
Ivan Mahonin 608c44
    { free(data); return FALSE; }
Ivan Mahonin 608c44
  free(data);
Ivan Mahonin 608c44
  return TRUE;
Ivan Mahonin 608c44
}
Ivan Mahonin 608c44
Ivan Mahonin 608c44