17dd7cddfSDavid du Colombier /* Copyright (C) 1995, 1996 Aladdin Enterprises. All rights reserved.
27dd7cddfSDavid du Colombier
3*593dc095SDavid du Colombier This software is provided AS-IS with no warranty, either express or
4*593dc095SDavid du Colombier implied.
57dd7cddfSDavid du Colombier
6*593dc095SDavid du Colombier This software is distributed under license and may not be copied,
7*593dc095SDavid du Colombier modified or distributed except as expressly authorized under the terms
8*593dc095SDavid du Colombier of the license contained in the file LICENSE in this distribution.
97dd7cddfSDavid du Colombier
10*593dc095SDavid du Colombier For more information about licensing, please refer to
11*593dc095SDavid du Colombier http://www.ghostscript.com/licensing/. For information on
12*593dc095SDavid du Colombier commercial licensing, go to http://www.artifex.com/licensing/ or
13*593dc095SDavid du Colombier contact Artifex Software, Inc., 101 Lucas Valley Road #110,
14*593dc095SDavid du Colombier San Rafael, CA 94903, U.S.A., +1(415)492-9861.
157dd7cddfSDavid du Colombier */
167dd7cddfSDavid du Colombier
17*593dc095SDavid du Colombier /* $Id: gdevstc3.c,v 1.4 2002/02/21 22:24:52 giles Exp $*/
187dd7cddfSDavid du Colombier /* Epson Stylus-Color Printer-Driver */
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier /***
217dd7cddfSDavid du Colombier This file holds the sample-implementation of a RGB-algorithm for
227dd7cddfSDavid du Colombier the stcolor-driver. It is available via
237dd7cddfSDavid du Colombier
247dd7cddfSDavid du Colombier gs -sDEVICE=stcolor -sDithering=gsrgb ...
257dd7cddfSDavid du Colombier
267dd7cddfSDavid du Colombier Actually this is no dithering-algorithm, it lets ghostscript do the job.
277dd7cddfSDavid du Colombier This achieved, by requesting BYTE-Values between 0 and 1 to be delivered,
287dd7cddfSDavid du Colombier which causes a depth of 1-Bit by default.
297dd7cddfSDavid du Colombier
307dd7cddfSDavid du Colombier ***/
317dd7cddfSDavid du Colombier
327dd7cddfSDavid du Colombier /*
337dd7cddfSDavid du Colombier * gdevstc.h holds all the includes and the driver-specific definitions, so
347dd7cddfSDavid du Colombier * it is the only include you need. To add a new algorthim, STC_MODI in
357dd7cddfSDavid du Colombier * gdevstc.h should be extended. (see the instructions there)
367dd7cddfSDavid du Colombier */
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier #include "gdevstc.h"
397dd7cddfSDavid du Colombier
407dd7cddfSDavid du Colombier /*
417dd7cddfSDavid du Colombier * the routine required.
427dd7cddfSDavid du Colombier */
437dd7cddfSDavid du Colombier
447dd7cddfSDavid du Colombier /*ARGSUSED*/
457dd7cddfSDavid du Colombier int
stc_gsrgb(stcolor_device * sdev,int npixel,byte * ip,byte * buf,byte * out)467dd7cddfSDavid du Colombier stc_gsrgb(stcolor_device *sdev,int npixel,byte *ip,byte *buf,byte *out)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier
497dd7cddfSDavid du Colombier int error = 0;
507dd7cddfSDavid du Colombier
517dd7cddfSDavid du Colombier /*
527dd7cddfSDavid du Colombier * There are basically 3 Types of calls:
537dd7cddfSDavid du Colombier * npixel < 0 => initialize buf, if this is required
547dd7cddfSDavid du Colombier * (happens only if requested)
557dd7cddfSDavid du Colombier * npixel > 0 => process next scanline, if the flag STC_WHITE is set, then
567dd7cddfSDavid du Colombier * in == NULL signals, that the basic-driver has decided
577dd7cddfSDavid du Colombier * that this scanline is white. (Useful for really dithering
587dd7cddfSDavid du Colombier * drivers)
597dd7cddfSDavid du Colombier */
607dd7cddfSDavid du Colombier
617dd7cddfSDavid du Colombier /* ============================================================= */
627dd7cddfSDavid du Colombier if(npixel > 0) { /* npixel > 0 -> scanline-processing */
637dd7cddfSDavid du Colombier /* ============================================================= */
647dd7cddfSDavid du Colombier
657dd7cddfSDavid du Colombier int p;
667dd7cddfSDavid du Colombier
677dd7cddfSDavid du Colombier /*
687dd7cddfSDavid du Colombier * simply merge the color-values into a single byte
697dd7cddfSDavid du Colombier * (RED, GREEN, BLUE are defined in gdevstc.h)
707dd7cddfSDavid du Colombier */
717dd7cddfSDavid du Colombier for(p = 0; p < npixel; ++p,++out) { /* loop over pixels */
727dd7cddfSDavid du Colombier
737dd7cddfSDavid du Colombier *out = 0;
747dd7cddfSDavid du Colombier if(*ip++) *out |= RED;
757dd7cddfSDavid du Colombier if(*ip++) *out |= GREEN;
767dd7cddfSDavid du Colombier if(*ip++) *out |= BLUE;
777dd7cddfSDavid du Colombier
787dd7cddfSDavid du Colombier } /* loop over pixels */
797dd7cddfSDavid du Colombier
807dd7cddfSDavid du Colombier /* ============================================================= */
817dd7cddfSDavid du Colombier } else { /* npixel <= 0 -> initialisation */
827dd7cddfSDavid du Colombier /* ============================================================= */
837dd7cddfSDavid du Colombier /*
847dd7cddfSDavid du Colombier * besides buffer-Initialisation, one may check the parameters in
857dd7cddfSDavid du Colombier * the algorithm-table of the driver.
867dd7cddfSDavid du Colombier */
877dd7cddfSDavid du Colombier
887dd7cddfSDavid du Colombier /* we didn't check for the white-calls above, so they would cause errors */
897dd7cddfSDavid du Colombier if(sdev->stc.dither->flags & STC_WHITE) error = -1;
907dd7cddfSDavid du Colombier
917dd7cddfSDavid du Colombier /* if we're not setup for bytes, this is an error too */
927dd7cddfSDavid du Colombier if((sdev->stc.dither->flags & STC_TYPE) != STC_BYTE) error = -2;
937dd7cddfSDavid du Colombier
947dd7cddfSDavid du Colombier /* and rgb-mode is the only supported mode */
957dd7cddfSDavid du Colombier if(sdev->color_info.num_components != 3) error = -3;
967dd7cddfSDavid du Colombier
977dd7cddfSDavid du Colombier /* we can't deal with ghostscript-data directly. */
987dd7cddfSDavid du Colombier if(sdev->stc.dither->flags & STC_DIRECT) error = -4;
997dd7cddfSDavid du Colombier
1007dd7cddfSDavid du Colombier /* ============================================================= */
1017dd7cddfSDavid du Colombier } /* scanline-processing or initialisation */
1027dd7cddfSDavid du Colombier /* ============================================================= */
1037dd7cddfSDavid du Colombier
1047dd7cddfSDavid du Colombier return error;
1057dd7cddfSDavid du Colombier }
106