xref: /plan9-contrib/sys/src/cmd/gs/src/gdevstc1.c (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
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: gdevstc1.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 monochrome-algorithm for
227dd7cddfSDavid du Colombier      the stcolor-driver. It is available via
237dd7cddfSDavid du Colombier 
247dd7cddfSDavid du Colombier           gs -sDEVICE=stcolor -sDithering=gsmono ...
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_gsmono(stcolor_device * sdev,int npixel,byte * in,byte * buf,byte * out)467dd7cddfSDavid du Colombier stc_gsmono(stcolor_device *sdev,int npixel,byte *in,byte *buf,byte *out)
477dd7cddfSDavid du Colombier {
487dd7cddfSDavid du Colombier 
497dd7cddfSDavid du Colombier /*
507dd7cddfSDavid du Colombier  * There are basically 3 Types of calls:
517dd7cddfSDavid du Colombier  * npixel < 0    => initialize buf, if this is required
527dd7cddfSDavid du Colombier  *                  (happens only if requested)
537dd7cddfSDavid du Colombier  * npixel > 0    => process next scanline, if the flag STC_WHITE is set, then
547dd7cddfSDavid du Colombier  *                  in == NULL signals, that the basic-driver has decided
557dd7cddfSDavid du Colombier  *                  that this scanline is white. (Useful for really dithering
567dd7cddfSDavid du Colombier  *                  drivers)
577dd7cddfSDavid du Colombier  */
587dd7cddfSDavid du Colombier 
597dd7cddfSDavid du Colombier /* ============================================================= */
607dd7cddfSDavid du Colombier    if(npixel > 0) {  /* npixel >  0 -> scanline-processing       */
617dd7cddfSDavid du Colombier /* ============================================================= */
627dd7cddfSDavid du Colombier 
637dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
647dd7cddfSDavid du Colombier       if(in != NULL) { /* normal processing          */
657dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
667dd7cddfSDavid du Colombier 
677dd7cddfSDavid du Colombier          memcpy(out,in,npixel); /* really simple algorithm */
687dd7cddfSDavid du Colombier 
697dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
707dd7cddfSDavid du Colombier       } else {                  /* skip-notification */
717dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
727dd7cddfSDavid du Colombier 
737dd7cddfSDavid du Colombier          /* An algorithm may use the output-line as a buffer.
747dd7cddfSDavid du Colombier             So it might need to be cleared on white-lines.
757dd7cddfSDavid du Colombier          */
767dd7cddfSDavid du Colombier 
777dd7cddfSDavid du Colombier          memset(out,0,npixel);
787dd7cddfSDavid du Colombier 
797dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
807dd7cddfSDavid du Colombier       }                             /* normal / skip */
817dd7cddfSDavid du Colombier /*    -----------------------------------------------*/
827dd7cddfSDavid du Colombier 
837dd7cddfSDavid du Colombier /* ============================================================= */
847dd7cddfSDavid du Colombier    } else {          /* npixel <= 0 -> initialisation            */
857dd7cddfSDavid du Colombier /* ============================================================= */
867dd7cddfSDavid du Colombier /*
877dd7cddfSDavid du Colombier  *    the optional buffer is already allocated by the basic-driver, here
887dd7cddfSDavid du Colombier  *    you just need to fill it, for instance, set it all to zeros:
897dd7cddfSDavid du Colombier  */
907dd7cddfSDavid du Colombier      int buf_size;
917dd7cddfSDavid du Colombier 
927dd7cddfSDavid du Colombier /*
937dd7cddfSDavid du Colombier  * compute the size of the buffer, according to the requested values
947dd7cddfSDavid du Colombier  * the buffer consists of a constant part, e.g. related to the number
957dd7cddfSDavid du Colombier  * of color-components, and a number of arrays, which are multiples of
967dd7cddfSDavid du Colombier  * the size of a scanline times the number of components.
977dd7cddfSDavid du Colombier  * additionally, the size of the scanlines may be expanded by one to the
987dd7cddfSDavid du Colombier  * right and to the left.
997dd7cddfSDavid du Colombier  */
1007dd7cddfSDavid du Colombier      buf_size =
1017dd7cddfSDavid du Colombier            sdev->stc.dither->bufadd              /* scanline-independend size */
1027dd7cddfSDavid du Colombier              + (-npixel)                                     /* pixels */
1037dd7cddfSDavid du Colombier                * (sdev->stc.dither->flags/STC_SCAN)          /* * scanlines */
1047dd7cddfSDavid du Colombier                * sdev->color_info.num_components;            /* * comp */
1057dd7cddfSDavid du Colombier 
1067dd7cddfSDavid du Colombier      if(buf_size > 0) { /* we obviously have a buffer */
1077dd7cddfSDavid du Colombier         memset(buf,0,buf_size * sdev->stc.alg_item);
1087dd7cddfSDavid du Colombier      }                  /* we obviously have a buffer */
1097dd7cddfSDavid du Colombier 
1107dd7cddfSDavid du Colombier /*
1117dd7cddfSDavid du Colombier  * Usually one should check parameters upon initializaon
1127dd7cddfSDavid du Colombier  */
1137dd7cddfSDavid du Colombier      if(sdev->color_info.num_components         !=        1) return -1;
1147dd7cddfSDavid du Colombier 
1157dd7cddfSDavid du Colombier      if((sdev->stc.dither->flags & STC_TYPE)    != STC_BYTE) return -2;
1167dd7cddfSDavid du Colombier 
1177dd7cddfSDavid du Colombier /*
1187dd7cddfSDavid du Colombier  * must neither have STC_DIRECT nor STC_WHITE
1197dd7cddfSDavid du Colombier  */
1207dd7cddfSDavid du Colombier       if((sdev->stc.dither->flags & STC_DIRECT) !=        0) return -3;
1217dd7cddfSDavid du Colombier 
1227dd7cddfSDavid du Colombier    } /* scanline-processing or initialisation */
1237dd7cddfSDavid du Colombier 
1247dd7cddfSDavid du Colombier    return 0; /* negative values are error-codes, that abort printing */
1257dd7cddfSDavid du Colombier }
126