summaryrefslogtreecommitdiffstats
path: root/plug-ins/twain/tw_dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'plug-ins/twain/tw_dump.c')
-rw-r--r--plug-ins/twain/tw_dump.c273
1 files changed, 273 insertions, 0 deletions
diff --git a/plug-ins/twain/tw_dump.c b/plug-ins/twain/tw_dump.c
new file mode 100644
index 0000000..b75bc8c
--- /dev/null
+++ b/plug-ins/twain/tw_dump.c
@@ -0,0 +1,273 @@
+/*
+ * TWAIN Plug-in
+ * Copyright (C) 1999 Craig Setera
+ * Craig Setera <setera@home.com>
+ * 03/31/1999
+ *
+ * Updated for Mac OS X support
+ * Brion Vibber <brion@pobox.com>
+ * 07/22/2004
+ *
+ * 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 3 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, see <https://www.gnu.org/licenses/>.
+ *
+ *
+ * Based on (at least) the following plug-ins:
+ * Screenshot
+ * GIF
+ * Randomize
+ *
+ * Any suggestions, bug-reports or patches are welcome.
+ *
+ * This plug-in interfaces to the TWAIN support library in order
+ * to capture images from TWAIN devices directly into GIMP images.
+ * The plug-in is capable of acquiring the following type of
+ * images:
+ * - B/W (1 bit images translated to grayscale B/W)
+ * - Grayscale up to 16 bits per pixel
+ * - RGB up to 16 bits per sample (24, 30, 36, etc.)
+ * - Paletted images (both Gray and RGB)
+ *
+ * Prerequisites:
+ * Should compile and run on both Win32 and Mac OS X 10.3 (possibly
+ * also on 10.2).
+ *
+ * Known problems:
+ * - Multiple image transfers will hang the plug-in. The current
+ * configuration compiles with a maximum of single image transfers.
+ * - On Mac OS X, canceling doesn't always close things out fully.
+ * - Epson TWAIN driver on Mac OS X crashes the plugin when scanning.
+ */
+
+/*
+ * Revision history
+ * (02/07/99) v0.1 First working version (internal)
+ * (02/09/99) v0.2 First release to anyone other than myself
+ * (02/15/99) v0.3 Added image dump and read support for debugging
+ * (03/31/99) v0.5 Added support for multi-byte samples and paletted
+ * images.
+ * (07/23/04) v0.6 Added Mac OS X support.
+ */
+
+#include "config.h"
+
+#include <string.h>
+
+#include <glib/gstdio.h>
+
+#include "libgimp/gimp.h"
+
+#include "tw_dump.h"
+#include "tw_func.h"
+#include "tw_util.h"
+
+/* File variables */
+static FILE *outputFile = NULL;
+extern pTW_SESSION twSession;
+
+/*
+ * dumpPreTransferCallback
+ *
+ * This callback function is called before any images
+ * are transferred. Set up the one time only stuff.
+ */
+void
+dumpPreTransferCallback(void *clientData)
+{
+ /* Open our output file... Not settable... Always
+ * write to the root directory. Simplistic, but
+ * gets the job done.
+ */
+ outputFile = g_fopen(DUMP_FILE, "wb");
+}
+
+/*
+ * dumpBeginTransferCallback
+ *
+ * The following function is called at the beginning
+ * of each image transfer.
+ */
+int
+dumpBeginTransferCallback(pTW_IMAGEINFO imageInfo, void *clientData)
+{
+ logBegin(imageInfo, clientData);
+
+ /* Dump the image information */
+ fwrite((void *) imageInfo, sizeof(TW_IMAGEINFO), 1, outputFile);
+
+ /* Keep going */
+ return TRUE;
+}
+
+/*
+ * dumpDataTransferCallback
+ *
+ * The following function is called for each memory
+ * block that is transferred from the data source.
+ */
+int
+dumpDataTransferCallback(pTW_IMAGEINFO imageInfo,
+ pTW_IMAGEMEMXFER imageMemXfer,
+ void *clientData)
+{
+ int flag = 1;
+
+ logData(imageInfo, imageMemXfer, clientData);
+
+ /* Write a flag that says that this is a data packet */
+ fwrite((void *) &flag, sizeof(int), 1, outputFile);
+
+ /* Dump the memory information */
+ fwrite((void *) imageMemXfer, sizeof(TW_IMAGEMEMXFER), 1, outputFile);
+ fwrite((void *) imageMemXfer->Memory.TheMem,
+ 1, imageMemXfer->BytesWritten, outputFile);
+
+ /* Keep going */
+ return TRUE;
+}
+
+/*
+ * dumpEndTransferCallback
+ *
+ * The following function is called at the end of the
+ * image transfer. The caller will be handed
+ * the image transfer completion state. The
+ * following values (defined in twain.h) are
+ * possible:
+ *
+ * TWRC_XFERDONE
+ * The transfer completed successfully
+ * TWRC_CANCEL
+ * The transfer was completed by the user
+ * TWRC_FAILURE
+ * The transfer failed.
+ */
+int
+dumpEndTransferCallback(int completionState, int pendingCount, void *clientData)
+{
+ int flag = 0;
+
+ /* Write a flag that says that this is a data packet */
+ fwrite((void *) &flag, sizeof(int), 1, outputFile);
+
+ /* Write the necessary data */
+ fwrite(&completionState, sizeof(int), 1, outputFile);
+ fwrite(&pendingCount, sizeof(int), 1, outputFile);
+
+ /* Only ever transfer a single image */
+ return FALSE;
+}
+
+/*
+ * dumpPostTransferCallback
+ *
+ * This callback function will be called
+ * after all possible images have been
+ * transferred.
+ */
+void
+dumpPostTransferCallback(int pendingCount, void *clientData)
+{
+ char buffer[128];
+
+ /* Shut things down. */
+ if (pendingCount != 0)
+ cancelPendingTransfers(twSession);
+
+ /* This will close the datasource and datasource
+ * manager. Then the message queue will be shut
+ * down and the run() procedure will finally be
+ * able to finish.
+ */
+ disableDS(twSession);
+ closeDS(twSession);
+ closeDSM(twSession);
+
+ /* Close the dump file */
+ fclose(outputFile);
+
+ /* Tell the user */
+ sprintf(buffer, "Image dumped to file %s\n", DUMP_FILE);
+ gimp_message(buffer);
+
+ /* Post a message to close up the application */
+ twainQuitApplication ();
+}
+
+/*
+ * readDumpedImage
+ *
+ * Get a previously dumped image.
+ */
+void readDumpedImage(pTW_SESSION twSession)
+{
+ int moreData;
+ int completionState;
+ int pendingCount;
+
+ TW_IMAGEINFO imageInfo;
+ TW_IMAGEMEMXFER imageMemXfer;
+
+ /* Open our output file... Not settable... Always
+ * write to the root directory. Simplistic, but
+ * gets the job done.
+ */
+ FILE *inputFile = g_fopen(DUMP_FILE, "rb");
+
+ /*
+ * Inform our application that we are getting ready
+ * to transfer images.
+ */
+ (*twSession->transferFunctions->preTxfrCb)(NULL);
+
+ /* Read the image information */
+ fread((void *) &imageInfo, sizeof(TW_IMAGEINFO), 1, inputFile);
+
+ /* Call the begin transfer callback */
+ if (!(*twSession->transferFunctions->txfrBeginCb)(&imageInfo, twSession->clientData))
+ return;
+
+ /* Read all of the data packets */
+ fread((void *) &moreData, sizeof(int), 1, inputFile);
+ while (moreData) {
+ /* Read the memory information */
+ fread((void *) &imageMemXfer, sizeof(TW_IMAGEMEMXFER), 1, inputFile);
+ imageMemXfer.Memory.TheMem = (TW_MEMREF) g_malloc (imageMemXfer.BytesWritten);
+ fread((void *) imageMemXfer.Memory.TheMem,
+ 1, imageMemXfer.BytesWritten, inputFile);
+
+ /* Call the data transfer callback function */
+ if (!(*twSession->transferFunctions->txfrDataCb)
+ (&imageInfo,
+ &imageMemXfer,
+ twSession->clientData))
+ return;
+
+ /* Clean up the memory */
+ g_free (imageMemXfer.Memory.TheMem);
+
+ /* Check for continuation */
+ fread((void *) &moreData, sizeof(int), 1, inputFile);
+ }
+
+ /* Grab the final information */
+ fread(&completionState, sizeof(int), 1, inputFile);
+ fread(&pendingCount, sizeof(int), 1, inputFile);
+
+ if (twSession->transferFunctions->txfrEndCb)
+ (*twSession->transferFunctions->txfrEndCb)(completionState, 0,
+ twSession->clientData);
+
+ /* Post a message to close up the application */
+ twainQuitApplication ();
+}