How did this stay in here? Must be them there cvs ghosts.
-Yosh
This commit is contained in:
@ -396,7 +396,6 @@ plug-ins/colorify/Makefile
|
|||||||
plug-ins/papertile/Makefile
|
plug-ins/papertile/Makefile
|
||||||
plug-ins/illusion/Makefile
|
plug-ins/illusion/Makefile
|
||||||
plug-ins/fractaltrace/Makefile
|
plug-ins/fractaltrace/Makefile
|
||||||
plug-ins/fs/Makefile
|
|
||||||
plug-ins/flarefx/Makefile
|
plug-ins/flarefx/Makefile
|
||||||
plug-ins/webbrowser/Makefile
|
plug-ins/webbrowser/Makefile
|
||||||
app/Makefile
|
app/Makefile
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
Makefile.in
|
|
||||||
Makefile
|
|
||||||
.deps
|
|
||||||
_libs
|
|
||||||
.libs
|
|
||||||
fs
|
|
||||||
fs2pgm
|
|
@ -1,38 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
|
|
||||||
pluginlibdir = $(gimpplugindir)/plug-ins
|
|
||||||
|
|
||||||
pluginlib_PROGRAMS = #STD#
|
|
||||||
|
|
||||||
#STD#_SOURCES = \
|
|
||||||
#STD#.c
|
|
||||||
|
|
||||||
INCLUDES = \
|
|
||||||
$(X_CFLAGS) \
|
|
||||||
-I$(top_srcdir) \
|
|
||||||
-I$(includedir)
|
|
||||||
|
|
||||||
LDADD = \
|
|
||||||
$(top_builddir)/libgimp/libgimpui.la \
|
|
||||||
$(top_builddir)/libgimp/libgimp.la \
|
|
||||||
$(X_LIBS) \
|
|
||||||
-lc
|
|
||||||
|
|
||||||
DEPS = \
|
|
||||||
$(top_builddir)/libgimp/libgimpui.la \
|
|
||||||
$(top_builddir)/libgimp/libgimp.la
|
|
||||||
|
|
||||||
#STD#_DEPENDENCIES = $(DEPS)
|
|
||||||
|
|
||||||
.PHONY: files
|
|
||||||
|
|
||||||
files:
|
|
||||||
@files=`ls $(DISTFILES) 2> /dev/null`; for p in $$files; do \
|
|
||||||
echo $$p; \
|
|
||||||
done
|
|
||||||
@for subdir in $(SUBDIRS); do \
|
|
||||||
files=`cd $$subdir; $(MAKE) files | grep -v "make\[[1-9]\]"`; \
|
|
||||||
for file in $$files; do \
|
|
||||||
echo $$subdir/$$file; \
|
|
||||||
done; \
|
|
||||||
done
|
|
@ -1,15 +0,0 @@
|
|||||||
CC = gcc
|
|
||||||
CFLAGS = -g -O2 -Wall
|
|
||||||
LDFLAGS = -g
|
|
||||||
LDLIBS = -L/usr/X11R6/lib -lgimp -lgtk -lgdk -lglib -lXext -lX11 -lm
|
|
||||||
|
|
||||||
fs: fs.o
|
|
||||||
|
|
||||||
install: fs
|
|
||||||
cp fs $(HOME)/.gimp/plug-ins/fs
|
|
||||||
|
|
||||||
clean:
|
|
||||||
$(RM) *.o core *~
|
|
||||||
|
|
||||||
fs2pgm: fs2pgm.o
|
|
||||||
$(CC) -g -o $@ $<
|
|
@ -1,21 +0,0 @@
|
|||||||
|
|
||||||
Add all the autoconfig/automake stuff, so that the standard build
|
|
||||||
procedures and such can be used.
|
|
||||||
|
|
||||||
Figure out why the fs executable is as large as it is, and fix it,
|
|
||||||
unless the automake fix cures this as well.
|
|
||||||
|
|
||||||
Handle non-square pixels properly. If px!=ix or py!=iy, there should
|
|
||||||
be an option to correct the display. I'm not sure whether this
|
|
||||||
correction should be on or off by default. Turning it on loses
|
|
||||||
information; leaving it off distorts the image display. Sigh,
|
|
||||||
decisions, decisions...
|
|
||||||
|
|
||||||
Save header lines on input so that they can be restored on output.
|
|
||||||
The "Image:" line will have to be special cased, depending on what
|
|
||||||
gets done about non-square pixels. All other lines can just be cached
|
|
||||||
on input and restored on output.
|
|
||||||
|
|
||||||
Write some help information.
|
|
||||||
|
|
||||||
|
|
@ -1,50 +0,0 @@
|
|||||||
From: lou@usenix.UUCP (Lou Katz)
|
|
||||||
Newsgroups: comp.graphics
|
|
||||||
Subject: FaceSaver format Revealed
|
|
||||||
Message-ID: <312@usenix.UUCP>
|
|
||||||
Date: 16 Jan 90 08:02:52 GMT
|
|
||||||
Reply-To: lou@usenix.UUCP (Lou Katz)
|
|
||||||
Organization: USENIX Association, Berkeley, CA
|
|
||||||
Lines: 41
|
|
||||||
|
|
||||||
Format of pictures is:
|
|
||||||
|
|
||||||
An ASCII file containing some or all of the following lines:
|
|
||||||
FirstName:
|
|
||||||
LastName:
|
|
||||||
E-mail:
|
|
||||||
Telephone:
|
|
||||||
Company:
|
|
||||||
Address1:
|
|
||||||
Address2:
|
|
||||||
CityStateZip:
|
|
||||||
Date:
|
|
||||||
PicData: Actual data: width - height - bits/pixel
|
|
||||||
Image: Should be transformed to: width - height - bits/pixel
|
|
||||||
(A REQUIRED Blank line)
|
|
||||||
|
|
||||||
Hexified picture in scanline order, in the form suitable for
|
|
||||||
printing in postscript. It is unpadded scanlines, I believe left to right.
|
|
||||||
If it is bottom to top it is due to funny transforms in going from the real
|
|
||||||
scanned image, which came from a video camera turned on its side! (to get a
|
|
||||||
portrait aspect ratio).
|
|
||||||
All the images are 8 bits per pixel, and have been intensity levelled to
|
|
||||||
use up the full dynamic range (each pixel multiplied by 256/(max - min) and
|
|
||||||
shifted so that min becomes zero).
|
|
||||||
I'm sorry about that, I should have put out untransformed data.
|
|
||||||
The original frame grabbing was off a Targa M8, and the gamma varied due
|
|
||||||
to a number of real world factors. Most pictures had a dynamic range in
|
|
||||||
the 128 - 196 vicinity.
|
|
||||||
|
|
||||||
The line labeled Image: can be used to correct for non-square pixels.
|
|
||||||
In most cases, there are 108 (non-square) pixels across in the data, but they
|
|
||||||
would have been 96 pixels across if they were square. Therefore,
|
|
||||||
Image: says 96, PicData says 108.
|
|
||||||
|
|
||||||
Lou Katz
|
|
||||||
Saver of Lost Faces
|
|
||||||
|
|
||||||
lou@usenix.org
|
|
||||||
(415) 530-8870
|
|
||||||
|
|
||||||
|
|
370
plug-ins/fs/fs.c
370
plug-ins/fs/fs.c
@ -1,370 +0,0 @@
|
|||||||
/* The GIMP -- an image manipulation program
|
|
||||||
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
|
|
||||||
* Face saver reading and writing code Copyright 1998 by John Kodis
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program; if not, write to the Free Software
|
|
||||||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fs.c -- a facesaver/faceserver plugin for the gimp. Developed by
|
|
||||||
* John Kodis, Dec 1997. Bug reports are welcomed at kodis@jagunet.com
|
|
||||||
*
|
|
||||||
* Based on HRZ code by Albert Cahalan <acahalan at cs.uml.edu>,
|
|
||||||
* which was in turn based on PNM code by Erik Nygren (nygren@mit.edu).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "gtk/gtk.h"
|
|
||||||
#include "libgimp/gimp.h"
|
|
||||||
|
|
||||||
static int save_okay = FALSE;
|
|
||||||
|
|
||||||
static void query()
|
|
||||||
{
|
|
||||||
static GParamDef load_args[] =
|
|
||||||
{
|
|
||||||
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
|
|
||||||
{ PARAM_STRING, "filename", "The name of the file to load" },
|
|
||||||
{ PARAM_STRING, "raw_filename", "The name of the file to load" },
|
|
||||||
};
|
|
||||||
static int nload_args = sizeof (load_args) / sizeof (load_args[0]);
|
|
||||||
|
|
||||||
static GParamDef load_return_vals[] =
|
|
||||||
{
|
|
||||||
{ PARAM_IMAGE, "image", "Output image" },
|
|
||||||
};
|
|
||||||
static int nload_return_vals =
|
|
||||||
sizeof(load_return_vals) / sizeof(*load_return_vals);
|
|
||||||
|
|
||||||
static GParamDef save_args[] =
|
|
||||||
{
|
|
||||||
{ PARAM_INT32, "run_mode", "Interactive, non-interactive" },
|
|
||||||
{ PARAM_IMAGE, "image", "Input image" },
|
|
||||||
{ PARAM_DRAWABLE, "drawable", "Drawable to save" },
|
|
||||||
{ PARAM_STRING, "filename", "Name of the file to save the image in" },
|
|
||||||
{ PARAM_STRING, "raw_filename", "Name of the file to save the image in" }
|
|
||||||
};
|
|
||||||
static int nsave_args = sizeof (save_args) / sizeof (save_args[0]);
|
|
||||||
|
|
||||||
gimp_install_procedure(
|
|
||||||
"file_fs_load",
|
|
||||||
"loads files in face saver file format",
|
|
||||||
"FIXME: write help for file_fs_load",
|
|
||||||
"John Kodis", "John Kodis", "1997",
|
|
||||||
"<Load>/FS",
|
|
||||||
NULL, PROC_PLUG_IN,
|
|
||||||
nload_args, nload_return_vals,
|
|
||||||
load_args, load_return_vals);
|
|
||||||
|
|
||||||
gimp_install_procedure(
|
|
||||||
"file_fs_save",
|
|
||||||
"saves files in face saver file format",
|
|
||||||
"saves a grayscale image in facesaver format",
|
|
||||||
"John Kodis", "John Kodis", "1997",
|
|
||||||
"<Save>/FS",
|
|
||||||
"GRAY*", PROC_PLUG_IN,
|
|
||||||
nsave_args, 0,
|
|
||||||
save_args, NULL);
|
|
||||||
|
|
||||||
gimp_register_magic_load_handler(
|
|
||||||
"file_fs_load", "fs", "", "");
|
|
||||||
gimp_register_save_handler(
|
|
||||||
"file_fs_save", "fs", "");
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
int ix, iy, iz;
|
|
||||||
int px, py, pz;
|
|
||||||
char *emsg;
|
|
||||||
unsigned char *pixmap;
|
|
||||||
}
|
|
||||||
Fs_info;
|
|
||||||
|
|
||||||
static Fs_info *fs_alloc(void)
|
|
||||||
{
|
|
||||||
Fs_info *fs = g_malloc(sizeof(*fs));
|
|
||||||
fs->emsg = g_malloc(FILENAME_MAX + 100);
|
|
||||||
*fs->emsg = '\0';
|
|
||||||
fs->pixmap = NULL;
|
|
||||||
fs->ix = fs->iy = fs->iz = fs->px = fs->py = fs->pz = 0;
|
|
||||||
return fs;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void fs_free(Fs_info *fs)
|
|
||||||
{
|
|
||||||
if (fs)
|
|
||||||
{
|
|
||||||
if (fs->emsg) g_free(fs->emsg);
|
|
||||||
if (fs->pixmap) g_free(fs->pixmap);
|
|
||||||
g_free(fs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int fs_ingest(char *fn, Fs_info *fs)
|
|
||||||
{
|
|
||||||
FILE *ifd = fopen(fn, "r");
|
|
||||||
if (ifd == NULL)
|
|
||||||
sprintf(fs->emsg, "can't open file \"%s\"", fn);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int body = FALSE;
|
|
||||||
char buf[1000];
|
|
||||||
|
|
||||||
while (!body && fgets(buf, sizeof(buf), ifd))
|
|
||||||
if (strncasecmp(buf, "picdata:", 8) == 0)
|
|
||||||
sscanf(buf+8, "%d %d %d", &fs->px, &fs->py, &fs->pz);
|
|
||||||
else if (strncasecmp(buf, "image:", 6) == 0)
|
|
||||||
sscanf(buf+6, "%d %d %d", &fs->ix, &fs->iy, &fs->iz);
|
|
||||||
else if (buf[strspn(buf, " \t\n")] == '\0')
|
|
||||||
body = TRUE;
|
|
||||||
|
|
||||||
if (!body)
|
|
||||||
sprintf(fs->emsg, "%s: missing body", fn);
|
|
||||||
else if (!fs->pz)
|
|
||||||
sprintf(fs->emsg, "%s: bad or missing picdata line", fn);
|
|
||||||
#ifdef REQUIRE_IMAGE_LINE
|
|
||||||
else if (!fs->iz)
|
|
||||||
sprintf(fs->emsg, "%s: bad or missing image line", fn);
|
|
||||||
#endif
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pix_x0;
|
|
||||||
int x, y, pixval, pixno = 0, pixcnt = fs->px * fs->py;
|
|
||||||
fs->pixmap = g_malloc(pixcnt + 1);
|
|
||||||
pix_x0 = fs->pixmap + pixcnt;
|
|
||||||
for (y=0; y<fs->py; y++)
|
|
||||||
{
|
|
||||||
char *pix = (pix_x0 -= fs->px);
|
|
||||||
for (x=0; x<fs->px; x++)
|
|
||||||
if (pixno++ < pixcnt && fscanf(ifd, "%2x", &pixval) == 1)
|
|
||||||
*pix++ = pixval & 0xff;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sprintf(fs->emsg, "%s: eof at %d of %d (%dx%d) pixels",
|
|
||||||
fn, pixno, pixcnt, fs->px, fs->py);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return !*fs->emsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint32 load_image(char *filename)
|
|
||||||
{
|
|
||||||
char *loading;
|
|
||||||
gint32 image_id, layer_id;
|
|
||||||
GDrawable *drawable;
|
|
||||||
GPixelRgn pixel_rgn;
|
|
||||||
Fs_info *fs = fs_alloc();
|
|
||||||
|
|
||||||
loading = g_malloc(strlen(filename) + 11);
|
|
||||||
sprintf(loading, "Loading %s:", filename);
|
|
||||||
gimp_progress_init(loading);
|
|
||||||
g_free(loading);
|
|
||||||
|
|
||||||
gimp_progress_update(0.25);
|
|
||||||
if (!fs_ingest(filename, fs))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "fs_load: %s\n", fs->emsg);
|
|
||||||
fs_free(fs);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create new image of proper size and associate filename; create
|
|
||||||
and add a new layer to the image, and get a drawable; finally,
|
|
||||||
initialize the drawing region. */
|
|
||||||
gimp_progress_update(0.50);
|
|
||||||
image_id = gimp_image_new(fs->px, fs->py, GRAY);
|
|
||||||
gimp_image_set_filename(image_id, filename);
|
|
||||||
layer_id = gimp_layer_new(image_id, "Background",
|
|
||||||
fs->px, fs->py, GRAY_IMAGE, 100, NORMAL_MODE);
|
|
||||||
gimp_image_add_layer(image_id, layer_id, 0);
|
|
||||||
drawable = gimp_drawable_get(layer_id);
|
|
||||||
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0,
|
|
||||||
drawable->width, drawable->height, TRUE, FALSE);
|
|
||||||
|
|
||||||
/* Transfer the pixel buffer into the image layer. */
|
|
||||||
gimp_progress_update(0.75);
|
|
||||||
gimp_pixel_rgn_set_rect(&pixel_rgn, fs->pixmap, 0,0, fs->px, fs->py);
|
|
||||||
|
|
||||||
/* Lastly, display the image and return. */
|
|
||||||
gimp_progress_update(1.00);
|
|
||||||
gimp_drawable_flush(drawable);
|
|
||||||
return image_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void save_close_callback(GtkWidget *widget, gpointer data)
|
|
||||||
{
|
|
||||||
gtk_main_quit();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void save_ok_callback(GtkWidget *widget, gpointer data)
|
|
||||||
{
|
|
||||||
gtk_widget_destroy(GTK_WIDGET(data));
|
|
||||||
save_okay = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint save_image(char *filename, gint32 image_id, gint32 drawable_id)
|
|
||||||
{
|
|
||||||
GPixelRgn pixel_rgn;
|
|
||||||
GDrawable *drawable;
|
|
||||||
FILE *fd;
|
|
||||||
int x, y, w, h;
|
|
||||||
char *saving, *pixbuf, *pix_x0;
|
|
||||||
|
|
||||||
drawable = gimp_drawable_get(drawable_id);
|
|
||||||
w = drawable->width;
|
|
||||||
h = drawable->height;
|
|
||||||
gimp_pixel_rgn_init(&pixel_rgn, drawable, 0, 0, w, h, FALSE, FALSE);
|
|
||||||
|
|
||||||
if (gimp_drawable_has_alpha(drawable_id))
|
|
||||||
{
|
|
||||||
fprintf(stderr, "fs: can't save images with alpha channels.");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if (gimp_drawable_type(drawable_id) != GRAY_IMAGE)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "fs: image must be grayscale for facesaver format\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
if ((fd = fopen(filename, "w")) == NULL)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "fs: can't open \"%s\"\n", filename);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
saving = g_malloc(strlen(filename) + 11);
|
|
||||||
sprintf(saving, "Saving %s:", filename);
|
|
||||||
gimp_progress_init(saving);
|
|
||||||
g_free(saving);
|
|
||||||
fprintf(fd, "Picdata: %d %d %d\n", w, h, drawable->bpp * 8);
|
|
||||||
fprintf(fd, "Image: %d %d %d\n", w, h, drawable->bpp * 8);
|
|
||||||
|
|
||||||
gimp_progress_update(0.25);
|
|
||||||
pixbuf = g_malloc(w * h);
|
|
||||||
gimp_pixel_rgn_get_rect(&pixel_rgn, pixbuf, 0, 0, w, h);
|
|
||||||
gimp_progress_update(0.50);
|
|
||||||
|
|
||||||
pix_x0 = pixbuf + w*h;
|
|
||||||
for (y=0; y<h; y++)
|
|
||||||
{
|
|
||||||
unsigned char *pix = (pix_x0 -= w);
|
|
||||||
for (x=0; x<w; x++)
|
|
||||||
{
|
|
||||||
if ((x%27) == 0) fprintf(fd, "\n");
|
|
||||||
fprintf(fd, "%02x", *pix++);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(fd, "\n");
|
|
||||||
|
|
||||||
fclose(fd);
|
|
||||||
g_free(pixbuf);
|
|
||||||
gimp_drawable_detach(drawable);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gint save_dialog(void)
|
|
||||||
{
|
|
||||||
GtkWidget *dlg;
|
|
||||||
GtkWidget *button;
|
|
||||||
gint argc = 1;
|
|
||||||
gchar **argv = g_new(gchar*, 1);
|
|
||||||
argv[0] = g_strdup("save");
|
|
||||||
|
|
||||||
gtk_init(&argc, &argv);
|
|
||||||
gtk_rc_parse(gimp_gtkrc());
|
|
||||||
dlg = gtk_dialog_new();
|
|
||||||
gtk_window_set_title(GTK_WINDOW(dlg), "Save as facesaver file");
|
|
||||||
gtk_window_position(GTK_WINDOW(dlg), GTK_WIN_POS_MOUSE);
|
|
||||||
gtk_signal_connect(GTK_OBJECT(dlg), "destroy",
|
|
||||||
(GtkSignalFunc)save_close_callback, NULL);
|
|
||||||
|
|
||||||
button = gtk_button_new_with_label("Okay");
|
|
||||||
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
|
|
||||||
gtk_signal_connect(GTK_OBJECT(button), "clicked",
|
|
||||||
(GtkSignalFunc)save_ok_callback, dlg);
|
|
||||||
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
|
|
||||||
button, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_grab_default(button);
|
|
||||||
gtk_widget_show(button);
|
|
||||||
|
|
||||||
button = gtk_button_new_with_label("Cancel");
|
|
||||||
GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
|
|
||||||
gtk_signal_connect_object(GTK_OBJECT(button), "clicked",
|
|
||||||
(GtkSignalFunc)gtk_widget_destroy, GTK_OBJECT(dlg));
|
|
||||||
gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dlg)->action_area),
|
|
||||||
button, TRUE, TRUE, 0);
|
|
||||||
gtk_widget_show(button);
|
|
||||||
|
|
||||||
gtk_widget_show(dlg);
|
|
||||||
gtk_main();
|
|
||||||
gdk_flush();
|
|
||||||
|
|
||||||
return save_okay; /* Initially false; true after clicking on "Okay" */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
run(char *name, int params, GParam *param, int *rvals, GParam **rval)
|
|
||||||
{
|
|
||||||
static GParam values[2];
|
|
||||||
values[0].type = PARAM_STATUS;
|
|
||||||
values[0].data.d_status = STATUS_SUCCESS;
|
|
||||||
|
|
||||||
*rvals = 1;
|
|
||||||
*rval = values;
|
|
||||||
|
|
||||||
if (strcmp(name, "file_fs_load") == 0)
|
|
||||||
{
|
|
||||||
gint32 image_id = load_image(param[1].data.d_string);
|
|
||||||
if (image_id == -1)
|
|
||||||
values[0].data.d_status = STATUS_EXECUTION_ERROR;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*rvals = 2;
|
|
||||||
values[1].type = PARAM_IMAGE;
|
|
||||||
values[1].data.d_image = image_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (strcmp(name, "file_fs_save") == 0)
|
|
||||||
{
|
|
||||||
GRunModeType mode = param[0].data.d_int32;
|
|
||||||
if (mode == RUN_NONINTERACTIVE && params != 4)
|
|
||||||
values[0].data.d_status = STATUS_CALLING_ERROR;
|
|
||||||
else if ((mode == RUN_WITH_LAST_VALS) ||
|
|
||||||
(mode == RUN_INTERACTIVE && save_dialog()) )
|
|
||||||
{
|
|
||||||
char *filename = param[3].data.d_string;
|
|
||||||
gint32 image_id = param[1].data.d_int32;
|
|
||||||
gint32 drawable_id = param[2].data.d_int32;
|
|
||||||
if (!save_image(filename, image_id, drawable_id))
|
|
||||||
values[0].data.d_status = STATUS_EXECUTION_ERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
values[0].data.d_status = STATUS_CALLING_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
GPlugInInfo PLUG_IN_INFO =
|
|
||||||
{
|
|
||||||
NULL, /* init_proc */
|
|
||||||
NULL, /* quit_proc */
|
|
||||||
query, /* query_proc */
|
|
||||||
run, /* run_proc */
|
|
||||||
};
|
|
||||||
|
|
||||||
MAIN()
|
|
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* fs2pgm.c -- converts a face-saver image to a portable graymap image.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static int errors;
|
|
||||||
static char *progname;
|
|
||||||
static void error(char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
fprintf(stderr, "%s: ", progname);
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vfprintf(stderr, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
errors++;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
int arg;
|
|
||||||
|
|
||||||
progname = strrchr(argv[0], '/') ? strrchr(argv[0], '/')+1 : argv[0];
|
|
||||||
for (arg=1; arg<argc; arg++)
|
|
||||||
{
|
|
||||||
FILE *ifd = fopen(argv[arg], "r");
|
|
||||||
if (ifd == NULL)
|
|
||||||
error("can't open file \"%s\"\n", argv[arg]);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[1000];
|
|
||||||
int body=0, ix=0, iy=0, iz=0, px=0, py=0, pz=0;
|
|
||||||
|
|
||||||
while (!body && fgets(buf, sizeof(buf), ifd))
|
|
||||||
if (strncasecmp(buf, "picdata:", 8) == 0)
|
|
||||||
sscanf(buf+8, "%d %d %d", &px, &py, &pz);
|
|
||||||
else if (strncasecmp(buf, "image:", 6) == 0)
|
|
||||||
sscanf(buf+6, "%d %d %d", &ix, &iy, &iz);
|
|
||||||
else if (buf[strspn(buf, " \t\n")] == '\0')
|
|
||||||
body = 1;
|
|
||||||
|
|
||||||
if (!body) error("%s: missing body\n", argv[arg]);
|
|
||||||
else if (!pz) error("%s: missing or short pixdata\n", argv[arg]);
|
|
||||||
else if (!iz) error("%s: missing or short image\n", argv[arg]);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int pixval, pixno=0;
|
|
||||||
char *pixmap = malloc(px*py+1);
|
|
||||||
while (fscanf(ifd, "%2x", &pixval) == 1)
|
|
||||||
{
|
|
||||||
pixmap[pixno] = pixval & 0xff;
|
|
||||||
pixno++;
|
|
||||||
}
|
|
||||||
if (0)
|
|
||||||
fprintf(stderr, "%3d %3d %3d %3d %3d %3d %5d\n", // argv[arg],
|
|
||||||
ix, iy, iz, px, py, pz, pixno);
|
|
||||||
if (pixno != px*py)
|
|
||||||
error("%s: expected %d (%dx%d) pixels, found %d%s\n",
|
|
||||||
argv[arg], px*py, px, py, pixno,
|
|
||||||
pixno<px*py ? "." : " or more." );
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FILE *ofd;
|
|
||||||
char *ofn = malloc(strlen(argv[arg])+10);
|
|
||||||
strcpy(ofn, argv[arg]);
|
|
||||||
if (strrchr(ofn, '.') > strrchr(ofn, '/'))
|
|
||||||
*strrchr(ofn, '.') = '\0';
|
|
||||||
strcat(ofn, ".pgm");
|
|
||||||
|
|
||||||
if ((ofd=fopen(ofn, "w")) == NULL)
|
|
||||||
error("%s: can't open output file \"%s\"\n",
|
|
||||||
argv[arg], ofn);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
fprintf(ofd, "P5\n%d %d\n%d\n", px, py, 255);
|
|
||||||
for (y=0; y<py; y++)
|
|
||||||
for (x=0; x<px; x++)
|
|
||||||
fputc(pixmap[(py-y)*px + x], ofd);
|
|
||||||
}
|
|
||||||
free(ofn);
|
|
||||||
}
|
|
||||||
free(pixmap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return errors ? EXIT_FAILURE : EXIT_SUCCESS;
|
|
||||||
}
|
|
Reference in New Issue
Block a user