diff options
author | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-02-16 01:04:51 +0000 |
---|---|---|
committer | Akira Kakuto <kakuto@fuk.kindai.ac.jp> | 2016-02-16 01:04:51 +0000 |
commit | eacd1b8f5c8024296c6fa4b19b3b99bd24de91a1 (patch) | |
tree | c0350d7eba85bcb5c01342bfef2f21d34b83c8bd /Build/source/libs/gd/libgd-src/src/gd_filename.c | |
parent | 08bed0cad41932663940d45d7fcc96986c2cca3c (diff) |
libs/gd: new convention
git-svn-id: svn://tug.org/texlive/trunk@39737 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Build/source/libs/gd/libgd-src/src/gd_filename.c')
-rw-r--r-- | Build/source/libs/gd/libgd-src/src/gd_filename.c | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Build/source/libs/gd/libgd-src/src/gd_filename.c b/Build/source/libs/gd/libgd-src/src/gd_filename.c new file mode 100644 index 00000000000..ba636cfe0e7 --- /dev/null +++ b/Build/source/libs/gd/libgd-src/src/gd_filename.c @@ -0,0 +1,254 @@ +/* Convenience functions to read or write images from or to disk, + * determining file type from the filename extension. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <stdio.h> +#include <string.h> + +#include "gd.h" + +typedef gdImagePtr (BGD_STDCALL *ReadFn)(FILE *in); +typedef void (BGD_STDCALL *WriteFn)(gdImagePtr im, FILE *out); +typedef gdImagePtr (BGD_STDCALL *LoadFn)(char *filename); + +#ifdef HAVE_LIBZ +static void BGD_STDCALL writegd2(gdImagePtr im, FILE *out) { + gdImageGd2(im, out, 0, GD2_FMT_COMPRESSED); +}/* writegd*/ +#endif + +#ifdef HAVE_LIBJPEG +static void BGD_STDCALL writejpeg(gdImagePtr im, FILE *out) { + gdImageJpeg(im, out, -1); +}/* writejpeg*/ +#endif + +static void BGD_STDCALL writewbmp(gdImagePtr im, FILE *out) { + int fg = gdImageColorClosest(im, 0, 0, 0); + + gdImageWBMP(im, fg, out); +}/* writejpeg*/ + +static void BGD_STDCALL writebmp(gdImagePtr im, FILE *out) { + gdImageBmp(im, out, GD_TRUE); +}/* writejpeg*/ + + +enum FType {UNKNOWN, PNG, JPG, GIF, TIFF, GD, GD2, WEBP}; +static struct FileType { + const char *ext; + ReadFn reader; + WriteFn writer; + LoadFn loader; +} Types[] = { + {".gif", gdImageCreateFromGif, gdImageGif, NULL}, + {".gd", gdImageCreateFromGd, gdImageGd, NULL}, + {".wbmp", gdImageCreateFromWBMP, writewbmp, NULL}, + {".bmp", gdImageCreateFromBmp, writebmp, NULL}, + + {".xbm", gdImageCreateFromXbm, NULL, NULL}, + {".tga", gdImageCreateFromTga, NULL, NULL}, + +#ifdef HAVE_LIBPNG + {".png", gdImageCreateFromPng, gdImagePng, NULL}, +#endif + +#ifdef HAVE_LIBJPEG + {".jpg", gdImageCreateFromJpeg, writejpeg, NULL}, + {".jpeg", gdImageCreateFromJpeg, writejpeg, NULL}, +#endif + +#ifdef HAVE_LIBTIFF + {".tiff", gdImageCreateFromTiff, gdImageTiff, NULL}, + {".tif" , gdImageCreateFromTiff, gdImageTiff, NULL}, +#endif + +#ifdef HAVE_LIBZ + {".gd2", gdImageCreateFromGd2, writegd2, NULL}, +#endif + +#ifdef HAVE_LIBVPX + {".webp", gdImageCreateFromWebp, gdImageWebp, NULL}, +#endif + +#ifdef HAVE_LIBXPM + {".xpm", NULL, NULL, gdImageCreateFromXpm}, +#endif + + {NULL, NULL, NULL} +}; + + +struct FileType * +ftype(const char *filename) { + int n; + char *ext; + + /* Find the file extension (i.e. the last period in the string. */ + ext = strrchr(filename, '.'); + if (!ext) return NULL; + + for (n = 0; Types[n].ext; n++) { + if (strcasecmp(ext, Types[n].ext) == 0) { + return &Types[n]; + }/* if */ + }/* for */ + + return NULL; +}/* ftype*/ + + +/* + Function: gdSupportsFileType + + Tests if a given file type is supported by GD. + + Given the name of an image file (which does not have to exist), + returns 1 (i.e. TRUE) if <gdImageCreateFromFile> can read a file + of that type. This is useful if you do not know which image types + were enabled at compile time. + + If _writing_ is true, the result will be true only if + <gdImageFile> can write a file of this type. + + Note that filename parsing is done exactly the same as is done by + <gdImageCreateFromFile> and <gdImageFile> and is subject to the + same limitations. + + Assuming LibGD is compiled with support for these image types, the + following extensions are supported: + + - .gif + - .gd, .gd2 + - .wbmp + - .bmp + - .xbm + - .tga + - .png + - .jpg, .jpeg + - .tiff, .tif + - .webp + - .xpm + + Names are parsed case-insenstively. + + Parameters: + + filename - Filename with tested extension. + writing - Flag: true tests if writing works + + Returns: + + GD_TRUE (1) if the file type is supported, GD_FALSE (0) if not. + +*/ +BGD_DECLARE(int) +gdSupportsFileType(const char *filename, int writing) { + struct FileType *entry = ftype(filename); + return !!entry && (!writing || !!entry->writer); +}/* gdSupportsFileType*/ + + +/* + Function: gdImageCreateFromFile + + Read an image file of any supported. + + Given the path to a file, <gdImageCreateFromFile> will open the + file, read its contents with the appropriate _gdImageCreateFrom*_ + function and return it. + + File type is determined by the filename extension, so having an + incorrect extension will probably not work. For example, renaming + PNG image "foo.png" to "foo.gif" and then attempting to load it + will fail even if GD supports both formats. See + <gdSupportsFiletype> for more details. + + NULL is returned on error. + + Parameters: + + filename - the input file name + + Returns: + + A pointer to the new image or NULL if an error occurred. + +*/ + +BGD_DECLARE(gdImagePtr) +gdImageCreateFromFile(const char *filename) { + struct FileType *entry = ftype(filename); + FILE *fh; + gdImagePtr result; + + if (!entry) return NULL; + if (entry->loader) return entry->loader((char *)filename); + if (!entry->reader) return NULL; + + fh = fopen(filename, "rb"); + if (!fh) return NULL; + + result = entry->reader(fh); + + fclose(fh); + + return result; +}/* gdImageCreateFromFile*/ + + + +/* + Function: gdImageFile + + Writes an image to a file in the format indicated by the filename. + + File type is determined by the extension of the file name. See + <gdSupportsFiletype> for an overview of the parsing. + + For file types that require extra arguments, <gdImageFile> + attempts to use sane defaults: + + <gdImageGd2> - chunk size = 0, compression is enabled. + <gdImageJpeg> - quality = -1 (i.e. the reasonable default) + <gdImageWBMP> - foreground is the darkest available color + + Everything else is called with the two-argument function and so + will use the default values. + + <gdImageFile> has some rudimentary error detection and will return + GD_FALSE (0) if a detectable error occurred. However, the image + loaders do not normally return their error status so a result of + GD_TRUE (1) does **not** mean the file was saved successfully. + + Parameters: + + im - The image to save. + filename - The path to the file to which the image is saved. + + Returns: + + GD_FALSE (0) if an error was detected, GD_TRUE (1) if not. + +*/ + +BGD_DECLARE(int) +gdImageFile(gdImagePtr im, const char *filename) { + struct FileType *entry = ftype(filename); + FILE *fh; + + if (!entry || !entry->writer) return GD_FALSE; + + fh = fopen(filename, "wb"); + if (!fh) return GD_FALSE; + + entry->writer(im, fh); + + fclose(fh); + + return GD_TRUE; +}/* gdImageFile*/ + |