kopia lustrzana https://gitlab.com/sane-project/backends
				
				
				
			
		
			
				
	
	
		
			287 wiersze
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
			
		
		
	
	
			287 wiersze
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
/* sane - Scanner Access Now Easy.
 | 
						|
   Copyright (C) 2000-2003 Jochen Eisinger <jochen.eisinger@gmx.net>
 | 
						|
   This file is part of the SANE package.
 | 
						|
 | 
						|
   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., 59 Temple Place - Suite 330, Boston,
 | 
						|
   MA 02111-1307, USA.
 | 
						|
 | 
						|
   As a special exception, the authors of SANE give permission for
 | 
						|
   additional uses of the libraries contained in this release of SANE.
 | 
						|
 | 
						|
   The exception is that, if you link a SANE library with other files
 | 
						|
   to produce an executable, this does not by itself cause the
 | 
						|
   resulting executable to be covered by the GNU General Public
 | 
						|
   License.  Your use of that executable is in no way restricted on
 | 
						|
   account of linking the SANE library code into it.
 | 
						|
 | 
						|
   This exception does not, however, invalidate any other reasons why
 | 
						|
   the executable file might be covered by the GNU General Public
 | 
						|
   License.
 | 
						|
 | 
						|
   If you submit changes to SANE to the maintainers to be included in
 | 
						|
   a subsequent release, you agree by submitting the changes that
 | 
						|
   those changes may be distributed with this exception intact.
 | 
						|
 | 
						|
   If you write modifications of your own for SANE, it is your choice
 | 
						|
   whether to permit this exception to apply to your modifications.
 | 
						|
   If you do not wish that, delete this exception notice.  */
 | 
						|
 | 
						|
#ifndef mustek_pp_h
 | 
						|
#define mustek_pp_h
 | 
						|
 | 
						|
#if defined(HAVE_SYS_TYPES_H)
 | 
						|
# include <sys/types.h>
 | 
						|
#endif
 | 
						|
#if defined(HAVE_SYS_TIME_H)
 | 
						|
# include <sys/time.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#define DEBUG_NOT_STATIC
 | 
						|
#include "../include/sane/sanei_debug.h"
 | 
						|
 | 
						|
/* Please note: ASSERT won't go away if you define NDEBUG, it just won't
 | 
						|
 * output a message when ASSERT failes. So if "cond" does anything, it will
 | 
						|
 * be executed, even if NDEBUG is defined...
 | 
						|
 */
 | 
						|
#define	ASSERT(cond, retval)	do { 					\
 | 
						|
				if (!(cond)) { 				\
 | 
						|
					DBG(2, "assertion %s failed\n",	\
 | 
						|
					STRINGIFY(cond));		\
 | 
						|
					if (retval >= 0)		\
 | 
						|
						return retval;		\
 | 
						|
					else				\
 | 
						|
						return;			\
 | 
						|
				}					\
 | 
						|
				}
 | 
						|
 | 
						|
/* This macro uses a otherwise unused argument */
 | 
						|
#if defined(__GNUC__)
 | 
						|
# define __UNUSED__	__attribute__ ((unused))
 | 
						|
#else
 | 
						|
# define __UNUSED__
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/* the function init uses this callback to register a device to the backend */
 | 
						|
typedef SANE_Status (*SANE_Attach_Callback) (SANE_String_Const port, SANE_String_Const name,
 | 
						|
						SANE_Int driver, SANE_Int info);
 | 
						|
 | 
						|
typedef struct {
 | 
						|
 | 
						|
	const char		*driver;
 | 
						|
	const char		*author;
 | 
						|
	const char		*version;
 | 
						|
 | 
						|
	/* this function detects the presence of a scanner at the
 | 
						|
	 * given location */
 | 
						|
	SANE_Status		(*init)(SANE_Int options,
 | 
						|
					SANE_String_Const port,
 | 
						|
					SANE_String_Const name,
 | 
						|
					SANE_Attach_Callback attach);
 | 
						|
	/* this function returns the informationen needed to set up
 | 
						|
	 * the device entry. the info parameter is passed from
 | 
						|
	 * init to the attach_callback to this function, to
 | 
						|
	 * help to identify the device, before it is registered
 | 
						|
	 */
 | 
						|
	void			(*capabilities)(SANE_Int info,
 | 
						|
						SANE_String *model,
 | 
						|
						SANE_String *vendor,
 | 
						|
						SANE_String *type,
 | 
						|
						SANE_Int *maxres,
 | 
						|
						SANE_Int *minres,
 | 
						|
						SANE_Int *maxhsize,
 | 
						|
						SANE_Int *maxvsize,
 | 
						|
						SANE_Int *caps);
 | 
						|
 | 
						|
	/* tries to open the given device. returns a fd on success */
 | 
						|
	SANE_Status		(*open)(SANE_String port, SANE_Int caps, SANE_Int *fd);
 | 
						|
 | 
						|
	/* start scanning session */
 | 
						|
	void			(*setup)(SANE_Handle hndl);
 | 
						|
 | 
						|
        /* processes a configuration option */
 | 
						|
        SANE_Status		(*config)(SANE_Handle hndl,
 | 
						|
					  SANE_String_Const optname,
 | 
						|
                                          SANE_String_Const optval);
 | 
						|
 | 
						|
	/* stop scanning session */
 | 
						|
	void			(*close)(SANE_Handle hndl);
 | 
						|
 | 
						|
	/* start actuall scan */
 | 
						|
	SANE_Status		(*start)(SANE_Handle hndl);
 | 
						|
 | 
						|
	/* read data (one line) */
 | 
						|
	void			(*read)(SANE_Handle hndl, SANE_Byte *buffer);
 | 
						|
 | 
						|
	/* stop scanner and return scanhead home */
 | 
						|
	void			(*stop)(SANE_Handle hndl);
 | 
						|
 | 
						|
} Mustek_pp_Functions;
 | 
						|
 | 
						|
/* Drivers */
 | 
						|
 | 
						|
 | 
						|
 | 
						|
#define MUSTEK_PP_NUM_DRIVERS	((int)(sizeof(Mustek_pp_Drivers) / \
 | 
						|
				sizeof(Mustek_pp_Functions)))
 | 
						|
 | 
						|
#define	CAP_NOTHING		0
 | 
						|
#define CAP_GAMMA_CORRECT	1
 | 
						|
#define CAP_INVERT		2
 | 
						|
#define	CAP_SPEED_SELECT	4
 | 
						|
#define CAP_LAMP_OFF		8
 | 
						|
#define CAP_TA			16
 | 
						|
#define CAP_DEPTH		32
 | 
						|
 | 
						|
/* Structure for holding name/value options from the configuration file */
 | 
						|
typedef struct Mustek_pp_config_option {
 | 
						|
 | 
						|
   SANE_String name;
 | 
						|
   SANE_String value;
 | 
						|
 | 
						|
} Mustek_pp_config_option;
 | 
						|
 | 
						|
typedef struct Mustek_pp_Device {
 | 
						|
 | 
						|
	struct Mustek_pp_Device	*next;
 | 
						|
 | 
						|
	SANE_Device		sane;
 | 
						|
 | 
						|
	/* non-const copy of SANE_Device */
 | 
						|
	SANE_String		name, vendor, model, type;
 | 
						|
 | 
						|
	/* port */
 | 
						|
	SANE_String		port;
 | 
						|
 | 
						|
	/* part describing hardware capabilities */
 | 
						|
	int			minres;
 | 
						|
	int			maxres;
 | 
						|
	int			maxhsize;
 | 
						|
	int			maxvsize;
 | 
						|
	int			caps;
 | 
						|
 | 
						|
	/* functions */
 | 
						|
	Mustek_pp_Functions	*func;
 | 
						|
 | 
						|
        /* Modified by EDG: device identification is needed to initialize
 | 
						|
           private device descriptor */
 | 
						|
        SANE_Int 		info;
 | 
						|
 | 
						|
        /* Array of configuration file options */
 | 
						|
        int			numcfgoptions;
 | 
						|
        Mustek_pp_config_option *cfgoptions;
 | 
						|
 | 
						|
} Mustek_pp_Device;
 | 
						|
 | 
						|
#define STATE_IDLE		0
 | 
						|
#define	STATE_CANCELLED		1
 | 
						|
#define STATE_SCANNING		2
 | 
						|
 | 
						|
#define MODE_BW			0
 | 
						|
#define MODE_GRAYSCALE		1
 | 
						|
#define MODE_COLOR		2
 | 
						|
 | 
						|
#define SPEED_SLOWEST		0
 | 
						|
#define SPEED_SLOWER		1
 | 
						|
#define SPEED_NORMAL		2
 | 
						|
#define SPEED_FASTER		3
 | 
						|
#define SPEED_FASTEST		4
 | 
						|
 | 
						|
 | 
						|
enum Mustek_pp_Option
 | 
						|
{
 | 
						|
  OPT_NUM_OPTS = 0,
 | 
						|
 | 
						|
  OPT_MODE_GROUP,
 | 
						|
  OPT_MODE,
 | 
						|
  OPT_DEPTH,
 | 
						|
  OPT_RESOLUTION,
 | 
						|
  OPT_PREVIEW,
 | 
						|
  OPT_GRAY_PREVIEW,
 | 
						|
  OPT_SPEED,
 | 
						|
 | 
						|
  OPT_GEOMETRY_GROUP,
 | 
						|
  OPT_TL_X,			/* top-left x */
 | 
						|
  OPT_TL_Y,			/* top-left y */
 | 
						|
  OPT_BR_X,			/* bottom-right x */
 | 
						|
  OPT_BR_Y,			/* bottom-right y */
 | 
						|
 | 
						|
  OPT_ENHANCEMENT_GROUP,
 | 
						|
 | 
						|
 | 
						|
  OPT_INVERT,
 | 
						|
 | 
						|
  OPT_CUSTOM_GAMMA,		/* use custom gamma tables? */
 | 
						|
  /* The gamma vectors MUST appear in the order gray, red, green,
 | 
						|
     blue.  */
 | 
						|
  OPT_GAMMA_VECTOR,
 | 
						|
  OPT_GAMMA_VECTOR_R,
 | 
						|
  OPT_GAMMA_VECTOR_G,
 | 
						|
  OPT_GAMMA_VECTOR_B,
 | 
						|
 | 
						|
  /* must come last: */
 | 
						|
  NUM_OPTIONS
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
typedef struct Mustek_pp_Handle {
 | 
						|
 | 
						|
	struct Mustek_pp_Handle	*next;
 | 
						|
 | 
						|
 | 
						|
 | 
						|
	Mustek_pp_Device	*dev;
 | 
						|
 | 
						|
	int			fd;
 | 
						|
 | 
						|
	int			reader;
 | 
						|
	int			pipe;
 | 
						|
 | 
						|
	int			state;
 | 
						|
 | 
						|
	int			topX, topY;
 | 
						|
	int			bottomX, bottomY;
 | 
						|
	int			mode;
 | 
						|
	int			res;
 | 
						|
 | 
						|
	/* gamma table, etc... */
 | 
						|
	SANE_Int		gamma_table[4][256];
 | 
						|
	int			do_gamma;
 | 
						|
	int			invert;
 | 
						|
	int			use_ta;
 | 
						|
	int			depth;
 | 
						|
	int			speed;
 | 
						|
 | 
						|
	/* current parameters */
 | 
						|
	SANE_Parameters params;
 | 
						|
 | 
						|
	SANE_Range dpi_range;
 | 
						|
	SANE_Range x_range;
 | 
						|
	SANE_Range y_range;
 | 
						|
	SANE_Range gamma_range;
 | 
						|
 | 
						|
	/* options */
 | 
						|
	SANE_Option_Descriptor	opt[NUM_OPTIONS];
 | 
						|
	Option_Value		val[NUM_OPTIONS];
 | 
						|
 | 
						|
 | 
						|
	time_t			lamp_on;
 | 
						|
 | 
						|
	void			*priv;
 | 
						|
 | 
						|
} Mustek_pp_Handle;
 | 
						|
 | 
						|
#endif /* mustek_pp_h */
 |