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