Am Montag, 3. November 2008 18:08:02 schrieb Lukas Gradl:
Has anyone experiences accessing a scanner with lazarus? Perhaps even
cross-platform?

I'm dreaming of embedding scanner-functionality in one of our programs.

Attached are libsane bindings for lazarus. Everything works except
functions SANE_OPTION_IS_ACTIVE and SANE_OPTION_IS_SETTABLE. I think
these would be easily fixed by someone with a better grasp of bitwise
operations :)

Let me know if you need any help implementing use of libsane

Malcolm

{
   sane - Scanner Access Now Easy.
   Copyright (C) 1997-1999 David Mosberger-Tang and Andreas Beck
   This file is part of the SANE package.

   This file is in the public domain.  You may use and modify it as
   you see fit, as long as this copyright message is included and
   that there is an indication as to what modifications have been
   made (if any).

   SANE 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.

   This file declares SANE application interface.  See the SANE
   standard for a detailed explanation of the interface.

   sane.h converted from C by Malcolm Poole August 2008
   }


unit sane;
{$ifdef FPC}
  {$mode objfpc}
	{$PACKRECORDS C}
{$endif}

interface

uses
  SysUtils;
  
const
  SaneExport = 'libsane';
  
  
const
  SANE_CURRENT_MAJOR = 1;
{
#define SANE_VERSION_CODE(major, minor, build)	\
  (  (((SANE_Word) (major) &   0xff) << 24)	\
   | (((SANE_Word) (minor) &   0xff) << 16)	\
   | (((SANE_Word) (build) & 0xffff) <<  0))

#define SANE_VERSION_MAJOR(code)	((((SANE_Word)(code)) >> 24) &   0xff)
#define SANE_VERSION_MINOR(code)	((((SANE_Word)(code)) >> 16) &   0xff)
#define SANE_VERSION_BUILD(code)	((((SANE_Word)(code)) >>  0) & 0xffff)
                                                                              }
const
  SANE_FALSE = 0;
  SANE_TRUE  = 1;
  
type
  SANE_Byte = byte;
  SANE_Word = longint;
  SANE_Bool = longint;
  SANE_Int = longint;
  SANE_Char = char;
  SANE_String = PChar;
  SANE_String_Const = PChar;
  SANE_Handle = Pointer;
  SANE_Fixed = SANE_Word;

  PSANE_Byte = ^SANE_Byte;
  PSANE_Int = ^SANE_Int;

const
  SANE_FIXED_SCALE_SHIFT = 16;
  
function SANE_FIX( v: SANE_Word): SANE_Word;
function SANE_UNFIX( v: SANE_Word): double;
  
type
  SANE_Status =
    (
    SANE_STATUS_GOOD = 0,	// everything A-OK
    SANE_STATUS_UNSUPPORTED,	// operation is not supported
    SANE_STATUS_CANCELLED,	// operation was cancelled
    SANE_STATUS_DEVICE_BUSY,	// device is busy; try again later
    SANE_STATUS_INVAL,		// data is invalid (includes no dev at open)
    SANE_STATUS_EOF,		// no more data available (end-of-file)
    SANE_STATUS_JAMMED,		// document feeder jammed
    SANE_STATUS_NO_DOCS,	// document feeder out of documents
    SANE_STATUS_COVER_OPEN,	// scanner cover is open
    SANE_STATUS_IO_ERROR,	// error during device I/O
    SANE_STATUS_NO_MEM,		// out of memory
    SANE_STATUS_ACCESS_DENIED	// access to resource has been denied
  );

  SANE_Value_Type = (
    SANE_TYPE_BOOL = 0,
    SANE_TYPE_INT,
    SANE_TYPE_FIXED,    // use functions SANE_FIX and SANE_UNFIX with values of type SANE_TYPE_FIXED
    SANE_TYPE_STRING,
    SANE_TYPE_BUTTON,
    SANE_TYPE_GROUP
  );

  SANE_Unit = (
    SANE_UNIT_NONE = 0,		// the value is unit-less (e.g., # of scans)
    SANE_UNIT_PIXEL,		// value is number of pixels
    SANE_UNIT_BIT,		// value is number of bits
    SANE_UNIT_MM,		// value is millimeters
    SANE_UNIT_DPI,		// value is resolution in dots/inch
    SANE_UNIT_PERCENT,		// value is a percentage
    SANE_UNIT_MICROSECOND	// value is micro seconds
  );

  SANE_Device = record
    name : SANE_String_Const;
    vendor :SANE_String_Const;
    model: SANE_String_Const;
    dev_type: SANE_String_Const;
    end;
  PSANE_Device = ^SANE_Device;
  DeviceArray = array of PSANE_Device;

  {
 // This section untested
  
const
  SANE_CAP_SOFT_SELECT        = 1 shl 0;
  SANE_CAP_HARD_SELECT        = 1 shl 1;
  SANE_CAP_SOFT_DETECT	      = 1 shl 2;
  SANE_CAP_EMULATED	      = 1 shl 3;
  SANE_CAP_AUTOMATIC	      = 1 shl 4;
  SANE_CAP_INACTIVE           = 1 shl 5;
  SANE_CAP_ADVANCED           = 1 shl 6;
  SANE_CAP_ALWAYS_SETTABLE    = 1 shl 7;
  
function SANE_OPTION_IS_ACTIVE( cap: SANE_Int ): Boolean;
function SANE_OPTION_IS_SETTABLE( cap: SANE_Int ): Boolean;

const
  SANE_INFO_INEXACT	      =	 1 shl 0;
  SANE_INFO_RELOAD_OPTIONS    =  1 shl 1;
  SANE_INFO_RELOAD_PARAMS     =  1 shl 2;
  }

type
  SANE_Constraint_Type =
    (
    SANE_CONSTRAINT_NONE = 0,
    SANE_CONSTRAINT_RANGE,
    SANE_CONSTRAINT_WORD_LIST,
    SANE_CONSTRAINT_STRING_LIST
  );

  SANE_Range =  record
    min: SANE_Word;		// minimum (element) value
    max: SANE_Word;		// maximum (element) value
    quant: SANE_Word;		// quantization value (0 if none)
    end;

  SANE_Option_Descriptor = record
    name: SANE_String_Const;	// name of this option (command-line name)
    title: SANE_String_Const;	// title of this option (single-line)
    desc: SANE_String_Const;	// description of this option (multi-line)
    option_type: SANE_Value_Type;	// how are values interpreted?
    option_unit: SANE_Unit;		// what is the (physical) unit?
    size: SANE_Int;
    cap: SANE_Int;		// capabilities
    constraint_type: SANE_Constraint_Type;
    constraint: Pointer; //pointer to one of the following , depending on value of constraint_type
                         //string_list          // NULL-terminated array of PChar
                         //word_list            // array of SANE_Word: first element is list-length
                         //range                // SANE_Range
    end;

  PSANE_Option_Descriptor = ^SANE_Option_Descriptor;

  SANE_Action =
    (
    SANE_ACTION_GET_VALUE = 0,
    SANE_ACTION_SET_VALUE,
    SANE_ACTION_SET_AUTO
  );

  SANE_Frame =
    (
    SANE_FRAME_GRAY = 0,	// band covering human visual range
    SANE_FRAME_RGB,		// red band only
    SANE_FRAME_GREEN,		// green band only
    SANE_FRAME_BLUE		// blue band only
  );

type
  SANE_Parameters = record
    format: SANE_Frame;
    last_frame: SANE_Bool;
    bytes_per_line : SANE_Int;
    pixels_per_line : SANE_Int;
    lines: SANE_Int;
    depth: SANE_Int;
    end;
    
  pSANE_Parameters = ^SANE_Parameters;
  
const
  SANE_MAX_USERNAME_LEN	= 128;
  SANE_MAX_PASSWORD_LEN	= 128;
  
type
  SANE_Auth_Callback = procedure(resource: SANE_String_Const; username, password: PChar) of object;

  function sane_init (version_code: Integer; authorize: Pointer): SANE_Status; cdecl; external SaneExport;
  procedure sane_exit;  cdecl; external SaneExport;
  function sane_get_devices ( const devices: Pointer; local_only: Integer): SANE_Status; cdecl; external SaneExport;
  function sane_open ( devicename: PChar; handle: SANE_Handle): SANE_Status; cdecl; external SaneExport;
  procedure sane_close (handle: SANE_Handle); cdecl; external SaneExport;
  function sane_get_option_descriptor (handle: SANE_Handle; option: SANE_Int): Pointer cdecl; external SaneExport;
  function sane_control_option (handle: SANE_Handle; option: SANE_Int;
  					action: SANE_Action; value: Pointer;
  					info: pSANE_Int): SANE_Status; cdecl; external SaneExport;
  function sane_get_parameters ( handle: SANE_Handle; params: pSANE_Parameters ): SANE_Status; cdecl; external SaneExport;
  function sane_start (handle: SANE_Handle): SANE_Status; cdecl; external SaneExport;
  function sane_read ( handle: SANE_Handle; data: PChar; max_length: SANE_Int; length: pSANE_Int): SANE_Status; cdecl; external SaneExport;
  procedure sane_cancel ( handle: SANE_Handle ); cdecl; external SaneExport;
  function sane_set_io_mode ( handle: SANE_Handle; non_blocking: SANE_Bool): SANE_Status; cdecl; external SaneExport;
  function sane_get_select_fd ( handle: SANE_Handle; fd: PSANE_Int): SANE_Status; cdecl; external SaneExport;
  function sane_strstatus (status: SANE_Status): Pchar; cdecl; external SaneExport;

implementation

function SANE_FIX ( v: SANE_Word ) : SANE_Word;
begin
  Result := v * (1 shl SANE_FIXED_SCALE_SHIFT);
end;

function SANE_UNFIX ( v: SANE_WORD ) : double;
begin
  Result := v / (1 shl SANE_FIXED_SCALE_SHIFT);
end;

{
function SANE_OPTION_IS_ACTIVE ( cap: SANE_Int ) : Boolean;
begin
{ #define SANE_OPTION_IS_ACTIVE(cap)	(((cap) & SANE_CAP_INACTIVE) == 0) }
  Result :=  (((cap) and SANE_CAP_INACTIVE) = 0);
end;

function SANE_OPTION_IS_SETTABLE ( cap: SANE_Int ) : Boolean;
begin
{ #define SANE_OPTION_IS_SETTABLE(cap)	(((cap) & SANE_CAP_SOFT_SELECT) != 0) }
  Result := (((cap) and SANE_CAP_SOFT_SELECT) <> 0);
end;
}

end.


_______________________________________________
Lazarus mailing list
Lazarus@lazarus.freepascal.org
http://www.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to