summaryrefslogtreecommitdiff
path: root/gs/base/gdevstc3.c
diff options
context:
space:
mode:
Diffstat (limited to 'gs/base/gdevstc3.c')
-rw-r--r--gs/base/gdevstc3.c102
1 files changed, 102 insertions, 0 deletions
diff --git a/gs/base/gdevstc3.c b/gs/base/gdevstc3.c
new file mode 100644
index 000000000..d40617c22
--- /dev/null
+++ b/gs/base/gdevstc3.c
@@ -0,0 +1,102 @@
+/* Copyright (C) 2001-2006 Artifex Software, Inc.
+ All Rights Reserved.
+
+ This software is provided AS-IS with no warranty, either express or
+ implied.
+
+ This software is distributed under license and may not be copied, modified
+ or distributed except as expressly authorized under the terms of that
+ license. Refer to licensing information at http://www.artifex.com/
+ or contact Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134,
+ San Rafael, CA 94903, U.S.A., +1(415)492-9861, for further information.
+*/
+
+/* $Id$*/
+/* Epson Stylus-Color Printer-Driver */
+
+/***
+ This file holds the sample-implementation of a RGB-algorithm for
+ the stcolor-driver. It is available via
+
+ gs -sDEVICE=stcolor -sDithering=gsrgb ...
+
+ Actually this is no dithering-algorithm, it lets ghostscript do the job.
+ This achieved, by requesting BYTE-Values between 0 and 1 to be delivered,
+ which causes a depth of 1-Bit by default.
+
+ ***/
+
+/*
+ * gdevstc.h holds all the includes and the driver-specific definitions, so
+ * it is the only include you need. To add a new algorthim, STC_MODI in
+ * gdevstc.h should be extended. (see the instructions there)
+ */
+
+#include "gdevstc.h"
+
+/*
+ * the routine required.
+ */
+
+/*ARGSUSED*/
+int
+stc_gsrgb(stcolor_device *sdev,int npixel,byte *ip,byte *buf,byte *out)
+{
+
+ int error = 0;
+
+/*
+ * There are basically 3 Types of calls:
+ * npixel < 0 => initialize buf, if this is required
+ * (happens only if requested)
+ * npixel > 0 => process next scanline, if the flag STC_WHITE is set, then
+ * in == NULL signals, that the basic-driver has decided
+ * that this scanline is white. (Useful for really dithering
+ * drivers)
+ */
+
+/* ============================================================= */
+ if(npixel > 0) { /* npixel > 0 -> scanline-processing */
+/* ============================================================= */
+
+ int p;
+
+/*
+ * simply merge the color-values into a single byte
+ * (RED, GREEN, BLUE are defined in gdevstc.h)
+ */
+ for(p = 0; p < npixel; ++p,++out) { /* loop over pixels */
+
+ *out = 0;
+ if(*ip++) *out |= RED;
+ if(*ip++) *out |= GREEN;
+ if(*ip++) *out |= BLUE;
+
+ } /* loop over pixels */
+
+/* ============================================================= */
+ } else { /* npixel <= 0 -> initialisation */
+/* ============================================================= */
+/*
+ * besides buffer-Initialisation, one may check the parameters in
+ * the algorithm-table of the driver.
+ */
+
+/* we didn't check for the white-calls above, so they would cause errors */
+ if(sdev->stc.dither->flags & STC_WHITE) error = -1;
+
+/* if we're not setup for bytes, this is an error too */
+ if((sdev->stc.dither->flags & STC_TYPE) != STC_BYTE) error = -2;
+
+/* and rgb-mode is the only supported mode */
+ if(sdev->color_info.num_components != 3) error = -3;
+
+/* we can't deal with ghostscript-data directly. */
+ if(sdev->stc.dither->flags & STC_DIRECT) error = -4;
+
+/* ============================================================= */
+ } /* scanline-processing or initialisation */
+/* ============================================================= */
+
+ return error;
+}