pike.git
/
src
/
modules
/
SANE
/
sane.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/modules/SANE/sane.c:27:
#include "module_support.h" #include "builtin_functions.h" #include "../Image/image.h" /* must be included last */ #include "module_magic.h" #define sp Pike_sp
-
RCSID("$Id: sane.c,v 1.
11
2002/
05
/
19
15
:
25
:
24
per
Exp $");
+
RCSID("$Id: sane.c,v 1.
12
2002/
07
/
28
23
:
59
:
49
nilsson
Exp $");
-
/*
-
**
!
module
SANE
-
*
*
!
-
*
*
!
This module enables access to the SANE (Scanner Access Now Easy)
-
*
*
!
library from pike
-
**!
-
**! note
-
**! $Id: sane.c,v 1.11 2002/05/19 15:25:24 per Exp $
+
/*!
@module
SANE
+
*!
+
*! This module enables access to the SANE (Scanner Access Now Easy)
+
*! library from pike
*/ static int sane_is_inited; struct scanner { SANE_Handle h; }; static void init_sane()
pike.git/src/modules/SANE/sane.c:63:
static void push_device( SANE_Device *d ) { push_text( "name" ); push_text( d->name ); push_text( "vendor" ); push_text( d->vendor ); push_text( "model" ); push_text( d->model ); push_text( "type" ); push_text( d->type ); f_aggregate_mapping( 8 ); }
-
/*
-
**
!
method
array(mapping) list_scanners()
-
*
*
!
-
*
*
! Returns an array with all available scanners.
-
*
*
!
-
**!
Example:
-
*
*
!
<pre>
-
*
*
! Pike v0.7 release 120 running Hilfe v2.0 (Incremental Pike Frontend)
-
*
*
! > SANE.list_scanners();
-
*
*
! Result: ({
-
*
*
! ([
-
*
*
! "model":"Astra 1220S ",
-
*
*
! "name":"umax:/dev/scg1f",
-
*
*
! "type":"flatbed scanner",
-
*
*
! "vendor":"UMAX "
-
*
*
! ]),
-
*
*
! ([
-
*
*
! "model":"Astra 1220S ",
-
*
*
! "name":"net:lain.idonex.se:umax:/dev/scg1f",
-
*
*
! "type":"flatbed scanner",
-
*
*
! "vendor":"UMAX "
-
*
*
! ])
-
*
*
! })
-
**!
-
**! </pre>
+
/*!
@decl
array(mapping) list_scanners()
+
*!
+
*! Returns an array with all available scanners.
+
*!
+
*!
@example
+
*! Pike v0.7 release 120 running Hilfe v2.0 (Incremental Pike Frontend)
+
*! > SANE.list_scanners();
+
*! Result: ({
+
*! ([
+
*! "model":"Astra 1220S ",
+
*! "name":"umax:/dev/scg1f",
+
*! "type":"flatbed scanner",
+
*! "vendor":"UMAX "
+
*! ]),
+
*! ([
+
*! "model":"Astra 1220S ",
+
*! "name":"net:lain.idonex.se:umax:/dev/scg1f",
+
*! "type":"flatbed scanner",
+
*! "vendor":"UMAX "
+
*! ])
+
*! })
*/ static void f_list_scanners( INT32 args ) { SANE_Device **devices; int i = 0; if( !sane_is_inited ) init_sane(); switch( sane_get_devices( (void *)&devices, 0 ) ) { case 0:
pike.git/src/modules/SANE/sane.c:201:
push_text( "list" ); for( i = 0; o->constraint.string_list[i]; i++ ) push_text( o->constraint.string_list[i] ); f_aggregate( i ); f_aggregate_mapping( 4 ); break; } f_aggregate_mapping( sp - osp ); }
-
/*
-
**
!
class
Scanner
-
**! Scanner s = Scanner( scanner name )
+
/*!
@class
Scanner
*/
-
+
+
/*! @decl void create(string name)
+
*/
static void f_scanner_create( INT32 args ) { char *name; if(!sane_is_inited) init_sane(); get_all_args( "create", args, "%s", &name ); if( sane_open( name, &THIS->h ) ) Pike_error("Failed to open scanner \"%s\"\n", name ); }
-
/*
-
**! method array(mapping) list
_options
()
+
/*
! @decl array(mapping) list_options()
+
*
!
+
*!
This
method
returns an
array
where every element is a
+
*! mapping, layed out as follows.
+
*!
+
*! @mapping
+
*! @member string "name"
+
*!
+
*! @member string "title"
+
*!
+
*! @member string "desc"
+
*!
+
*! @member string "type"
+
*! @string
+
*! @value "boolean"
+
*! @value "int"
+
*! @value "float"
+
*! @value "string"
+
*! @value "button"
+
*! @value "group"
+
*! @endstring
+
*! @member string "unit"
+
*! @string
+
*! @value "none"
+
*! @value "pixel"
+
*! @value "bit"
+
*! @value "mm"
+
*! @value "dpi"
+
*! @value "percent"
+
*! @value "microsend"
+
*! @endstring
+
*! @member int "size"
+
*!
+
*! @member multiset "cap"
+
*! @multiset
+
*! @index "soft_select"
+
*! @index "hard_select"
+
*! @index "emulate"
+
*! @index "automatic"
+
*! @index "inactive"
+
*! @index "advanced"
+
*! @endmultiset
+
*! @member int
(
0..0)|
mapping
"constraint"
+
*! Constraints can be of three different types; range, word list or string
+
*! list. Constraint contains 0 if there are no constraints.
+
*!
+
*! @mapping range
+
*! @member string "type"
+
*! Contains the value "range".
+
*! @member int "max"
+
*! @member int "min"
+
*! @member int "quant"
+
*! @endmapping
+
*!
+
*! @mapping "word list"
+
*! @member string "type"
+
*! Contains the value "list".
+
*! @member array(float|int
)
"
list
"
+
*! @endmapping
+
*!
+
*! @mapping "string list"
+
*! @member string "type"
+
*! Contains the value "list".
+
*! @member array
(
string
)
"list"
+
*! @endmapping
+
*! @endmapping
*/ static void f_scanner_list_options( INT32 args ) { int i, n; const SANE_Option_Descriptor *d; pop_n_elems( args ); for( i = 1; (d = sane_get_option_descriptor( THIS->h, i) ); i++ ) push_option_descriptor( d ); f_aggregate( i-1 );
pike.git/src/modules/SANE/sane.c:243:
for( i = 1; (d = sane_get_option_descriptor( THIS->h, i ) ); i++ ) if(d->name && !strcmp( d->name, name ) ) { *p = d; return i; } Pike_error("No such option: %s\n", name ); }
-
/*
-
**
!
method
void set_option( string name, mixed new_value )
-
*
*
!
method
void set_option( string name )
-
*
*
! If no value is specified, the option is set to it's default value
+
/*!
@decl
void set_option( string name, mixed new_value )
+
*!
@decl
void set_option( string name )
+
*! If no value is specified, the option is set to it's default value
*/ static void f_scanner_set_option( INT32 args ) { char *name; int no; INT_TYPE int_value; FLOAT_TYPE float_value; SANE_Int tmp; const SANE_Option_Descriptor *d; get_all_args( "set_option", args, "%s", &name );
pike.git/src/modules/SANE/sane.c:292:
} } else { int_value = 1; sane_control_option( THIS->h, no, SANE_ACTION_SET_AUTO, &int_value, &tmp ); } pop_n_elems( args ); push_int( 0 ); }
-
/*
-
**
!
method
mixed get_option( string name )
+
/*!
@decl
mixed get_option( string name )
*/ static void f_scanner_get_option( INT32 args ) { char *name; int no; SANE_Int int_value; float f; SANE_Int tmp; const SANE_Option_Descriptor *d; get_all_args( "get_option", args, "%s", &name );
pike.git/src/modules/SANE/sane.c:333:
case SANE_TYPE_STRING: sane_control_option( THIS->h, no, SANE_ACTION_GET_VALUE, &name, &tmp ); pop_n_elems( args ); push_text( name ); case SANE_TYPE_GROUP: break; } }
-
/*
-
**
!
method
mapping(string:int) get_parameters()
+
/*!
@decl
mapping(string:int) get_parameters()
+
*!
+
*! @returns
+
*! @mapping
+
*! @member int "format"
+
*! @member int "last_frame"
+
*! @member int "lines"
+
*! @member int "depth"
+
*! @member int "pixels_per_line"
+
*! @member int "bytes_per_line"
+
*! @endmapping
*/ static void f_scanner_get_parameters( INT32 args ) { SANE_Parameters p; pop_n_elems( args ); sane_get_parameters( THIS->h, &p ); push_text( "format" ); push_int( p.format ); push_text( "last_frame" ); push_int( p.last_frame ); push_text( "lines" ); push_int( p.lines ); push_text( "depth" ); push_int( p.depth );
pike.git/src/modules/SANE/sane.c:415:
{ push_text( "Image.Image" ); APPLY_MASTER( "resolv", 1 ); image_program = program_from_svalue( sp - 1 ); sp--;/* Do not free image program.. */ } if( !image_program ) Pike_error("No Image.Image?!\n"); }
-
/*
-
**
!
method
Image.Image simple_scan()
+
/*!
@decl
Image.Image simple_scan()
*/ static void f_scanner_simple_scan( INT32 args ) { SANE_Parameters p; SANE_Handle h = THIS->h; struct object *o; rgb_group *r; assert_image_program();
pike.git/src/modules/SANE/sane.c:470:
get_comp_frame( h, &p, ((char *)r)+2 ); break; } } while( !p.last_frame ); THREADS_DISALLOW(); push_object( o ); }
-
/*
-
**
!
method
void row_scan(function(Image.Image,int,Scanner:void) callback)
+
/*!
@decl
void row_scan(function(Image.Image,int,Scanner:void) callback)
*/ static void f_scanner_row_scan( INT32 args ) { SANE_Parameters p; SANE_Handle h = THIS->h; struct svalue *s; struct object *o; rgb_group *r, or; int i, nr;
pike.git/src/modules/SANE/sane.c:615:
{ set_read_callback( fd, 0, 0 ); free_object( c->o ); free_object( c->t ); free_svalue( &c->callback ); free( c->buffer ); free( c ); } }
-
/*
-
**
!
method
void nonblocking_row_scan(function(Image.Image,int,Scanner,int:void) callback)
+
/*!
@decl
void nonblocking_row_scan(function(Image.Image,int,Scanner,int:void) callback)
*/ static void f_scanner_nonblocking_row_scan( INT32 args ) { SANE_Parameters p; SANE_Handle h = THIS->h; struct svalue *s; int fd; struct row_scan_struct *rsp; if( sane_start( THIS->h ) ) Pike_error("Start failed\n");
pike.git/src/modules/SANE/sane.c:672:
free_object( rsp->o ); free_object( rsp->t ); free( rsp->buffer ); free( rsp ); Pike_error("Failed to get select fd for scanning device!\n"); } set_read_callback( fd, nonblocking_row_scan_callback, (void*)rsp ); push_int( 0 ); }
+
/*! @decl void cancel_scan()
+
*/
static void f_scanner_cancel_scan( INT32 args ) { sane_cancel( THIS->h ); }
-
+
/*! @endclass
+
*/
+
+
/*! @decl constant FrameGray
+
*! @decl constant FrameRGB
+
*! @decl constant FrameRed
+
*! @decl constant FrameGreen
+
*! @decl cosntant FrameBlue
+
*/
+
+
/*! @endmodule
+
*/
+
static void init_scanner_struct( struct object *p ) { THIS->h = 0; } static void exit_scanner_struct( struct object *p ) { if( THIS->h ) sane_close( THIS->h ); }