You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
174 lines
5.3 KiB
174 lines
5.3 KiB
4 years ago
|
#define _GNU_SOURCE
|
||
|
#include <config.h>
|
||
|
#include "gdk_imlib.h"
|
||
|
#define id _gdk_imlib_data
|
||
|
#include "gdk_imlib_private.h"
|
||
|
|
||
|
gint
|
||
|
gdk_imlib_save_image(GdkImlibImage * im, char *file, GdkImlibSaveInfo * info)
|
||
|
{
|
||
|
char *ext;
|
||
|
char cmd[10240];
|
||
|
FILE *f;
|
||
|
GdkImlibSaveInfo defaults;
|
||
|
|
||
|
if (!im || !file)
|
||
|
return 0;
|
||
|
|
||
|
defaults.quality = 208;
|
||
|
defaults.scaling = 1024;
|
||
|
defaults.xjustification = 512;
|
||
|
defaults.yjustification = 512;
|
||
|
defaults.page_size = PAGE_SIZE_LETTER;
|
||
|
defaults.color = 1;
|
||
|
|
||
|
if (!info)
|
||
|
info = &defaults;
|
||
|
ext = _gdk_imlib_GetExtension(file);
|
||
|
|
||
|
if ((!strcasecmp(ext, "ppm")) || (!strcasecmp(ext, "pnm")) || (!strcasecmp (ext, "pgm")))
|
||
|
{
|
||
|
return _gdk_imlib_SavePPM (im, file, info);
|
||
|
}
|
||
|
else if (!strcasecmp(ext, "ps"))
|
||
|
{
|
||
|
return _gdk_imlib_SavePS (im, file, info);
|
||
|
}
|
||
|
else if ((!strcasecmp(ext, "jpeg")) || (!strcasecmp(ext, "jpg")))
|
||
|
{
|
||
|
return _gdk_imlib_SaveJPEG (im, file, info);
|
||
|
}
|
||
|
else if (!strcasecmp(ext, "png"))
|
||
|
{
|
||
|
return _gdk_imlib_SavePNG (im, file, info);
|
||
|
}
|
||
|
else if ((!strcasecmp(ext, "tiff")) || (!strcasecmp(ext, "tif")))
|
||
|
{
|
||
|
return _gdk_imlib_SaveTIFF (im, file, info);
|
||
|
}
|
||
|
#if 0
|
||
|
/* Get rid of the "helpers" */
|
||
|
if (id->fallback)
|
||
|
{
|
||
|
f = _gdk_imlib_open_helper("%C/convert pnm:- %s", file, "wb");
|
||
|
if (f)
|
||
|
{
|
||
|
if (!fprintf(f, "P6\n# Created by Imlib\n%i %i\n255\n", im->rgb_width, im->rgb_height))
|
||
|
{
|
||
|
_gdk_imlib_close_helper(f);
|
||
|
return 0;
|
||
|
}
|
||
|
if (!fwrite(im->rgb_data, 1, (im->rgb_width * im->rgb_height * 3), f))
|
||
|
{
|
||
|
_gdk_imlib_close_helper(f);
|
||
|
return 0;
|
||
|
}
|
||
|
if (_gdk_imlib_close_helper(f))
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
if (!strcasecmp(ext, "jpeg"))
|
||
|
g_snprintf(cmd, sizeof(cmd), "%%H -quality %i -progressive -outfile %%s", 100 * info->quality / 256);
|
||
|
else if (!strcasecmp(ext, "jpg"))
|
||
|
g_snprintf(cmd, sizeof(cmd), "%%H -quality %i -progressive -outfile %%s", 100 * info->quality / 256);
|
||
|
else if (!strcasecmp(ext, "bmp"))
|
||
|
strcpy(cmd, "%Q %N/ppmtobmp > %s");
|
||
|
else if (!strcasecmp(ext, "gif"))
|
||
|
strcpy(cmd, "%Q %N/ppmtogif -interlace > %s");
|
||
|
else if (!strcasecmp(ext, "ilbm"))
|
||
|
strcpy(cmd, "%N/ppmtoilbm -24if -hires -lace -compress > %s");
|
||
|
else if (!strcasecmp(ext, "ilb"))
|
||
|
strcpy(cmd, "%N/ppmtoilbm -24if -hires -lace -compress > %s");
|
||
|
else if (!strcasecmp(ext, "iff"))
|
||
|
strcpy(cmd, "%N/ppmtoilbm -24if -hires -lace -compress > %s");
|
||
|
else if (!strcasecmp(ext, "icr"))
|
||
|
strcpy(cmd, "%N/ppmtoicr > %s");
|
||
|
else if (!strcasecmp(ext, "map"))
|
||
|
strcpy(cmd, "%N/ppmtomap > %s");
|
||
|
else if (!strcasecmp(ext, "mit"))
|
||
|
strcpy(cmd, "%N/ppmtomitsu -sharpness 4 > %s");
|
||
|
else if (!strcasecmp(ext, "mitsu"))
|
||
|
strcpy(cmd, "%N/ppmtomitsu -sharpness 4 > %s");
|
||
|
else if (!strcasecmp(ext, "pcx"))
|
||
|
strcpy(cmd, "%N/ppmtopcx -24bit -packed > %s");
|
||
|
else if (!strcasecmp(ext, "pgm"))
|
||
|
strcpy(cmd, "%N/ppmtopgm > %s");
|
||
|
else if (!strcasecmp(ext, "pi1"))
|
||
|
strcpy(cmd, "%N/ppmtopi1 > %s");
|
||
|
else if (!strcasecmp(ext, "pic"))
|
||
|
strcpy(cmd, "%Q %N/ppmtopict > %s");
|
||
|
else if (!strcasecmp(ext, "pict"))
|
||
|
strcpy(cmd, "%Q %N/ppmtopict > %s");
|
||
|
else if (!strcasecmp(ext, "pj"))
|
||
|
strcpy(cmd, "%N/ppmtopj > %s");
|
||
|
else if (!strcasecmp(ext, "pjxl"))
|
||
|
strcpy(cmd, "%N/ppmtopjxl > %s");
|
||
|
else if (!strcasecmp(ext, "puz"))
|
||
|
strcpy(cmd, "%N/ppmtopuzz > %s");
|
||
|
else if (!strcasecmp(ext, "puzz"))
|
||
|
strcpy(cmd, "%N/ppmtopuzz > %s");
|
||
|
else if (!strcasecmp(ext, "rgb3"))
|
||
|
strcpy(cmd, "%N/ppmtorgb3 > %s");
|
||
|
else if (!strcasecmp(ext, "six"))
|
||
|
strcpy(cmd, "%N/ppmtosixel > %s");
|
||
|
else if (!strcasecmp(ext, "sixel"))
|
||
|
strcpy(cmd, "%N/ppmtosizel > %s");
|
||
|
else if (!strcasecmp(ext, "tga"))
|
||
|
strcpy(cmd, "%N/ppmtotga -rgb > %s");
|
||
|
else if (!strcasecmp(ext, "targa"))
|
||
|
strcpy(cmd, "%N/ppmtotga -rgb > %s");
|
||
|
else if (!strcasecmp(ext, "uil"))
|
||
|
strcpy(cmd, "%N/ppmtouil > %s");
|
||
|
else if (!strcasecmp(ext, "xpm"))
|
||
|
strcpy(cmd, "%Q %N/ppmtoxpm > %s");
|
||
|
else if (!strcasecmp(ext, "yuv"))
|
||
|
strcpy(cmd, "%N/ppmtoyuv > %s");
|
||
|
else if (!strcasecmp(ext, "png"))
|
||
|
strcpy(cmd, "%N/pnmtopng > %s");
|
||
|
else if (!strcasecmp(ext, "ps"))
|
||
|
strcpy(cmd, "%N/pnmtops -center -scale 100 > %s");
|
||
|
else if (!strcasecmp(ext, "rast"))
|
||
|
strcpy(cmd, "%N/pnmtorast -rle > %s");
|
||
|
else if (!strcasecmp(ext, "ras"))
|
||
|
strcpy(cmd, "%N/pnmtorast -rle > %s");
|
||
|
else if (!strcasecmp(ext, "sgi"))
|
||
|
strcpy(cmd, "%N/pnmtosgi > %s");
|
||
|
else if (!strcasecmp(ext, "sir"))
|
||
|
strcpy(cmd, "%N/pnmtosir > %s");
|
||
|
else if (!strcasecmp(ext, "tif"))
|
||
|
strcpy(cmd, "%N/pnmtotiff -lzw > %s");
|
||
|
else if (!strcasecmp(ext, "tiff"))
|
||
|
strcpy(cmd, "%N/pnmtotiff -lzw > %s");
|
||
|
else if (!strcasecmp(ext, "xwd"))
|
||
|
strcpy(cmd, "%N/pnmtoxwd > %s");
|
||
|
else
|
||
|
ext = "";
|
||
|
if (ext[0])
|
||
|
{
|
||
|
f = _gdk_imlib_open_helper(cmd, file, "wb");
|
||
|
if (f)
|
||
|
{
|
||
|
if (!fprintf(f, "P6\n# Created by Imlib\n%i %i\n255\n", im->rgb_width, im->rgb_height))
|
||
|
{
|
||
|
_gdk_imlib_close_helper(f);
|
||
|
return 0;
|
||
|
}
|
||
|
if (!fwrite(im->rgb_data, 1, (im->rgb_width * im->rgb_height * 3), f))
|
||
|
{
|
||
|
_gdk_imlib_close_helper(f);
|
||
|
return 0;
|
||
|
}
|
||
|
if (_gdk_imlib_close_helper(f))
|
||
|
return 0;
|
||
|
return 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|
||
|
fprintf(stderr, "gdk_imlib ERROR: Cannot save image: %s\n", file);
|
||
|
fprintf(stderr, "All fallbacks failed.\n");
|
||
|
|
||
|
return 0;
|
||
|
}
|