home *** CD-ROM | disk | FTP | other *** search
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
-
- #include <exec/types.h>
- #include <proto/icon.h>
-
- #include <MakeILBM.h>
- #include <Scanner_protos.h>
- #include <Scanner.h>
-
- static struct ScannerOptions option;
-
- static char* unitName;
- static int unitNum = 2;
-
- static int color;
- static int speed;
- static fixed fx0,fy0,fx1,fy1;
- static int resolution;
- static int brightness;
- static int contrast;
- static int shadow;
- static int highlight;
- static int midtone;
- static int halftonePattern;
- static int exposureTime;
- static int gamma;
- static int compress;
- static char* outputFile;
-
- static char* sodType[] = {"Boolean","Integer","Fixed","String","Button",NULL};
- static char* sodUnit[] = {"No unit","Pixel","Bit","mm","DPI","Percent","µs",NULL};
- static char* cmdOptionString[ID_NUMBER_OF_OPTIONS] =
- {
- "",
- "color",
- "top left x",
- "top left y",
- "bottom right x",
- "bottom right y",
- "resolution",
- "halftone pattern",
- "brightness",
- "contrast",
- "gamma",
- "shadow",
- "highlight",
- "threshold",
- "time",
- "ADF",
- "speed"
- };
-
- static struct OptionValue parameterValue[ID_NUMBER_OF_OPTIONS];
-
- void usage(void);
- void showOptions(struct ScannerOptions* option);
- struct OptionDescriptor* descriptor(OptionId id);
- short readToolTypes(char **array,struct ScannerOptions* option);
- BOOL toolValue(char** array,char* matchStr,struct OptionDescriptor* descr,int* val);
-
- /**************************************************************************/
-
- /********************** M A I N ***********************/
-
- /**************************************************************************/
- int testStart(char **toolTypes)
- {
- BYTE status;
- // char** toolTypes;
- int i;
- char* str;
-
- if( FindToolType(toolTypes,"help") )
- {
- usage();
-
- return 0;
- }
-
- if( !(unitName = FindToolType(toolTypes,"device")) )
- unitName = "scsi.device";
- if( str = FindToolType(toolTypes,"unit") )
- unitNum = strtol(str,NULL,10);
-
- memset(&option,0,sizeof(struct ScannerOptions));
- openScanner(unitName,unitNum,&option,&status);
-
- if( FindToolType(toolTypes,"options") )
- {
- if( status )
- puts("No scanner available.\n");
- else
- {
- showOptions(&option);
- closeScanner();
- }
-
- return status;
- }
-
- if( status == 0)
- {
- struct ScanInformation inform;
- struct OptionValue value[2];
-
- // value[1].sp_optionID = ID_NONE;
- for( i = 0 ; i < option.so_optionNum ; i++ )
- {
- value[0].sp_optionID = option.so_descriptor[i].od_optionID;
- value[0].sp_flags = CONTROL_GET;
- controlOption(value,&status);
-
- if( !(value[0].sp_flags & CONTROL_INVALID) )
- {
- switch( option.so_descriptor[i].od_optionID )
- {
- case ID_SCANMODE:
- color = value[0].sp_value;
- break;
- case ID_TL_X: /* upper left corner of scan area */
- fx0 = DOUBLE_FIX(25.0); // value[0].sp_value;
- break;
- case ID_TL_Y: /* upper left corner of scan area */
- fy0 = DOUBLE_FIX(50.0); // value[0].sp_value;
- break;
- case ID_BR_X: /* bottom right corner of scan area */
- fx1 = DOUBLE_FIX(75.0); // value[0].sp_value;
- break;
- case ID_BR_Y: /* bottom right corner of scan area */
- fy1 = DOUBLE_FIX(100.0);// value[0].sp_value;
- break;
- case ID_RESOLUTION: /* scan resolution (combined x and y) */
- resolution = value[0].sp_value;
- break;
- case ID_HALFTONEPATTERN:
- halftonePattern = value[0].sp_value;
- break;
- case ID_BRIGHTNESS:
- brightness = value[0].sp_value;
- break;
- case ID_CONTRAST:
- contrast = value[0].sp_value;
- break;
- case ID_ANALOGGAMMA:
- gamma = value[0].sp_value;
- break;
- case ID_BLACKLEVEL: /* some times called shadow */
- shadow = value[0].sp_value;
- break;
- case ID_WHITELEVEL: /* some times called highlight */
- highlight = value[0].sp_value;
- break;
- case ID_THRESHOLD:
- midtone = value[0].sp_value;
- break;
- case ID_EXPOSURETIME:
- exposureTime = value[0].sp_value;
- break;
- default:
- break;
- }
- }
- }
-
- if( status = readToolTypes(toolTypes,&option) )
- {
- usage();
- closeScanner();
- return status;
- }
-
- parameterValue[ID_SCANMODE-1].sp_optionID = ID_SCANMODE;
- parameterValue[ID_SCANMODE-1].sp_value = color;
- parameterValue[ID_SCANMODE-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_SCANMODE-1],&status);
-
- parameterValue[ID_SPEED-1].sp_optionID = ID_SPEED;
- parameterValue[ID_SPEED-1].sp_value = speed;
- parameterValue[ID_SPEED-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_SPEED-1],&status);
-
- parameterValue[ID_TL_X-1].sp_optionID = ID_TL_X;
- parameterValue[ID_TL_X-1].sp_value = fx0;
- parameterValue[ID_TL_X-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_TL_X-1],&status);
-
- parameterValue[ID_TL_Y-1].sp_optionID = ID_TL_Y;
- parameterValue[ID_TL_Y-1].sp_value = fy0;
- parameterValue[ID_TL_Y-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_TL_Y-1],&status);
-
- parameterValue[ID_BR_X-1].sp_optionID = ID_BR_X;
- parameterValue[ID_BR_X-1].sp_value = fx1;
- parameterValue[ID_BR_X-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_BR_X-1],&status);
-
- parameterValue[ID_BR_Y-1].sp_optionID = ID_BR_Y;
- parameterValue[ID_BR_Y-1].sp_value = fy1;
- parameterValue[ID_BR_Y-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_BR_Y-1],&status);
-
- parameterValue[ID_RESOLUTION-1].sp_optionID = ID_RESOLUTION;
- parameterValue[ID_RESOLUTION-1].sp_value = resolution;
- parameterValue[ID_RESOLUTION-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_RESOLUTION-1],&status);
-
- parameterValue[ID_HALFTONEPATTERN-1].sp_optionID = ID_HALFTONEPATTERN;
- parameterValue[ID_HALFTONEPATTERN-1].sp_value = halftonePattern;
- parameterValue[ID_HALFTONEPATTERN-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_HALFTONEPATTERN-1],&status);
-
- parameterValue[ID_BRIGHTNESS-1].sp_optionID = ID_BRIGHTNESS;
- parameterValue[ID_BRIGHTNESS-1].sp_value = brightness;
- parameterValue[ID_BRIGHTNESS-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_BRIGHTNESS-1],&status);
-
- parameterValue[ID_CONTRAST-1].sp_optionID = ID_CONTRAST;
- parameterValue[ID_CONTRAST-1].sp_value = contrast;
- parameterValue[ID_CONTRAST-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_CONTRAST-1],&status);
-
- parameterValue[ID_ANALOGGAMMA-1].sp_optionID = ID_ANALOGGAMMA;
- parameterValue[ID_ANALOGGAMMA-1].sp_value = gamma;
- parameterValue[ID_ANALOGGAMMA-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_ANALOGGAMMA-1],&status);
-
- parameterValue[ID_BLACKLEVEL-1].sp_optionID = ID_BLACKLEVEL;
- parameterValue[ID_BLACKLEVEL-1].sp_value = shadow;
- parameterValue[ID_BLACKLEVEL-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_BLACKLEVEL-1],&status);
-
- parameterValue[ID_WHITELEVEL-1].sp_optionID = ID_WHITELEVEL;
- parameterValue[ID_WHITELEVEL-1].sp_value = highlight;
- parameterValue[ID_WHITELEVEL-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_WHITELEVEL-1],&status);
-
- parameterValue[ID_THRESHOLD-1].sp_optionID = ID_THRESHOLD;
- parameterValue[ID_THRESHOLD-1].sp_value = midtone;
- parameterValue[ID_THRESHOLD-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_THRESHOLD-1],&status);
-
- parameterValue[ID_EXPOSURETIME-1].sp_optionID = ID_EXPOSURETIME;
- parameterValue[ID_EXPOSURETIME-1].sp_value = exposureTime;
- parameterValue[ID_EXPOSURETIME-1].sp_flags = CONTROL_SET;
- controlOption(¶meterValue[ID_EXPOSURETIME-1],&status);
-
- // parameterValue[ID_NUMBER_OF_OPTIONS-1].sp_optionID = ID_NONE;
-
- // controlOption(parameterValue,&status);
-
- if( status == 0 )
- {
- startScanning(&inform,&status);
-
- if( status == 0 )
- {
- struct ILBMFile *fh;
- struct ScanLine line;
-
- if( (line.sl_data = malloc(inform.sv_bytesPerLine)) && (fh = openILBM(outputFile,compress,&inform)) )
- {
- line.sl_color = 0;
-
- while( status == 0 )
- {
- readScanLine(&line,&status);
- if( status == 0 )
- writeILBM(fh,&line);
- }
-
- if( status == SCAN_STATUS_EOF )
- {
- closeILBM(fh,0);
- status = 0;
- }
- else
- closeILBM(fh,1);
- }
-
- stopScanning();
-
- if( line.sl_data )
- free(line.sl_data);
- }
- }
-
- closeScanner();
- }
-
- return status;
- }
-
- void usage(void)
- {
- puts("\nUsage: Scanner [options]\n");
- puts("where options are:\n");
-
- puts("help print this usage\n");
-
- puts("options show scanner options\n");
-
- puts("device=<name> default is: device=scsi.device\n");
-
- puts("unit=n default is: unit=2\n");
-
- puts("debug=n set debug level to n");
- puts(" default is: debug=0\n");
-
- puts("color=<color name> default is driver default\n");
-
- puts("speed=s default is driver default\n");
-
- puts("frame=x0,y0,x1,y1 upper left and lower right corner in mm");
- puts(" default is: frame=25,50,75,100\n");
-
- puts("resolution=r resolution in dpi");
- puts(" default is driver default\n");
-
- puts("brightness=b default is driver default\n");
-
- puts("contrast=c default is driver default\n");
-
- puts("shadow=s default is driver default\n");
-
- puts("highlight=h default is driver default\n");
-
- puts("threshold=m default is driver default\n");
-
- puts("pattern=p default is driver default\n");
-
- puts("time=t exposure time");
- puts(" default is driver default\n");
-
- puts("gamma=g default is: gamma=1.0\n");
-
- puts("compress=on|off default is: compress=on\n");
-
- puts("file=<name> default is: file=ram:scanner.ilbm\n");
-
-
- puts("Example: scanner\n");
- puts(" scanner color=Gray frame=0,0,10,10 compress=off file=dh0:test.ilbm\n");
- }
-
- void showOptions(struct ScannerOptions* option)
- {
- struct OptionValue value[2];
- int i;
- BYTE status;
-
- printf("\nScanner: %s %s \n\n",option->so_scannerVendor,option->so_scannerModel);
-
- printf("Driver version %d.%d\n\n",option->so_driverVersion,option->so_driverRevision);
-
- printf("Document width: %5.1f mm\n",option->so_docWidth);
- printf("Document height: %5.1f mm\n\n",option->so_docHeight);
-
- // value[1].sp_optionID = ID_NONE;
- for( i = 0 ; i < option->so_optionNum ; i++ )
- {
- value[0].sp_optionID = option->so_descriptor[i].od_optionID;
- value[0].sp_flags = CONTROL_GET;
- controlOption(value,&status);
-
- printf("%s:\n",cmdOptionString[option->so_descriptor[i].od_optionID]);
- printf(" type: %s\n",sodType[option->so_descriptor[i].od_valueType]);
- printf(" unit: %s\n",sodUnit[option->so_descriptor[i].od_valueUnit]);
-
- switch( option->so_descriptor[i].od_constraintType )
- {
- case CONSTRAINT_NONE:
- break;
- case CONSTRAINT_STRING_LIST:
- {
- char** p;
-
- p = option->so_descriptor[i].od_constraint.stringList;
-
- printf(" values: %s\n",*p);
- p++;
- while( *p )
- {
- printf(" %s\n",*p);
- p++;
- }
-
- printf(" default=%s\n",option->so_descriptor[i].od_constraint.stringList[value[0].sp_value]);
- }
- break;
- case CONSTRAINT_WORD_LIST:
- {
- int x;
-
- printf(" list: "); //(%d) : ",option->so_descriptor[i].od_numberList[0]);
- for(x = 1; x <= option->so_descriptor[i].od_constraint.numberList[0]; x++)
- {
- if( option->so_descriptor[i].od_valueType == TYPE_INT )
- printf(" %d, ",option->so_descriptor[i].od_constraint.numberList[x]);
- else if( option->so_descriptor[i].od_valueType == TYPE_FIXED )
- printf(" %1.1f, ",FIX_DOUBLE(option->so_descriptor[i].od_constraint.numberList[x]));
- }
- printf("\n");
-
- if( option->so_descriptor[i].od_valueType == TYPE_INT )
- printf(" default=%d\n",value[0].sp_value);
- else if( option->so_descriptor[i].od_valueType == TYPE_FIXED )
- printf(" default=%1.1f\n",FIX_DOUBLE(value[0].sp_value));
- }
- break;
- case CONSTRAINT_RANGE:
- if( option->so_descriptor[i].od_valueType == TYPE_INT )
- printf(" range: %d .. %d with steps: %d \n",
- option->so_descriptor[i].od_constraint.numberRange->min,
- option->so_descriptor[i].od_constraint.numberRange->max,
- option->so_descriptor[i].od_constraint.numberRange->quant
- );
- else if( option->so_descriptor[i].od_valueType == TYPE_FIXED )
- printf(" range: %1.1f .. %1.1f with steps: %1.1f \n",
- FIX_DOUBLE(option->so_descriptor[i].od_constraint.numberRange->min),
- FIX_DOUBLE(option->so_descriptor[i].od_constraint.numberRange->max),
- (option->so_descriptor[i].od_constraint.numberRange->quant?FIX_DOUBLE(option->so_descriptor[i].od_constraint.numberRange->quant):0.1)
- );
-
- if( option->so_descriptor[i].od_valueType == TYPE_INT )
- printf(" default=%d\n",value[0].sp_value);
- else if( option->so_descriptor[i].od_valueType == TYPE_FIXED )
- printf(" default=%1.1f\n",FIX_DOUBLE(value[0].sp_value));
-
- break;
- }
- printf("\n");
- }
- }
-
- short readToolTypes(char **array,struct ScannerOptions* option)
- {
- char* str;
-
- // Get frame coordinates
- if( str = FindToolType(array,"frame") )
- {
- fx0 = DOUBLE_FIX(strtod(str,&str));
- if( *(str++) != ',' )
- return 2;
- fy0 = DOUBLE_FIX(strtod(str,&str));
- if( *(str++) != ',' )
- return 2;
- fx1 = DOUBLE_FIX(strtod(str,&str));
- if( *(str++) != ',' )
- return 2;
- fy1 = DOUBLE_FIX(strtod(str,&str));
- if( (*str != ' ') && (*str != 0) )
- return 1;
- }
-
- if( !toolValue(array,"color",descriptor(ID_SCANMODE),&color) )
- return 2;
-
- if( !toolValue(array,"speed",descriptor(ID_SPEED),&speed) )
- return 2;
-
- if( !toolValue(array,"resolution",descriptor(ID_RESOLUTION),&resolution) )
- return 3;
-
- if( !toolValue(array,"brightness",descriptor(ID_BRIGHTNESS),&brightness) )
- return 4;
-
- if( !toolValue(array,"contrast",descriptor(ID_CONTRAST),&contrast) )
- return 5;
-
- if( !toolValue(array,"shadow",descriptor(ID_BLACKLEVEL),&shadow) )
- return 6;
-
- if( !toolValue(array,"highlight",descriptor(ID_WHITELEVEL),&highlight) )
- return 7;
-
- if( !toolValue(array,"pattern",descriptor(ID_HALFTONEPATTERN),&halftonePattern) )
- return 8;
-
- if( !toolValue(array,"time",descriptor(ID_EXPOSURETIME),&exposureTime) )
- return 9;
-
- if( !toolValue(array,"midtone",descriptor(ID_THRESHOLD),&midtone) )
- return 10;
-
- if( !toolValue(array,"gamma",descriptor(ID_ANALOGGAMMA),&gamma) )
- return 11;
-
- if( str = FindToolType(array,"compress") )
- {
- if( MatchToolValue(str,"on") )
- compress = 1;
- else if( MatchToolValue(str,"off") )
- compress = 0;
- else
- return 12;
- }
- else
- compress = 1;
-
- if( !(outputFile = FindToolType(array,"file")) )
- outputFile = "ram:scanner.ilbm";
-
- return 0;
- }
-
- struct OptionDescriptor* descriptor(OptionId id)
- {
- int i;
-
- for( i = 0 ; i < option.so_optionNum ; i++ )
- {
- if( id == option.so_descriptor[i].od_optionID )
- return &option.so_descriptor[i];
- }
-
- return NULL;
- }
-
- BOOL toolValue(char** array,char* matchStr,struct OptionDescriptor* descr,int* val)
- {
- char* toolStr;
-
- if( descr == NULL )
- return TRUE;
-
- toolStr = FindToolType(array,matchStr);
-
- if( toolStr == NULL )
- return TRUE;
-
- switch( descr->od_valueType )
- {
- case TYPE_BOOL:
- if( MatchToolValue(toolStr,"on") )
- {
- *val = 1;
- return TRUE;
- }
- else if( MatchToolValue(toolStr,"off") )
- {
- *val = 0;
- return TRUE;
- }
- else
- return FALSE;
- case TYPE_INT:
- case TYPE_FIXED:
- if( descr->od_valueType == TYPE_INT )
- *val = strtol(toolStr,NULL,10);
- else
- *val = DOUBLE_FIX(strtod(toolStr,NULL));
-
- switch( descr->od_constraintType )
- {
- case CONSTRAINT_RANGE:
- if( *val < descr->od_constraint.numberRange->min )
- *val = descr->od_constraint.numberRange->min;
- else if( *val > descr->od_constraint.numberRange->max )
- *val = descr->od_constraint.numberRange->max;
- else if( descr->od_constraint.numberRange->quant > 0 )
- {
- int n = descr->od_constraint.numberRange->min;
-
- while( *val > n + descr->od_constraint.numberRange->quant )
- n += descr->od_constraint.numberRange->quant;
- *val = n;
- }
- return TRUE;
- case CONSTRAINT_WORD_LIST:
- {
- int i;
-
- for( i = 1 ; i < descr->od_constraint.numberList[0] ; i++ )
- {
- if( *val < descr->od_constraint.numberList[i+1] )
- {
- *val = descr->od_constraint.numberList[i];
- return TRUE;
- }
- }
- *val = descr->od_constraint.numberList[i+1];
- return TRUE;
- }
- default:
- return FALSE;
- }
-
- break;
- case TYPE_STRING:
- *val = 0;
-
- while( descr->od_constraint.stringList[*val] && strcmpi(toolStr,descr->od_constraint.stringList[*val]) )
- (*val)++;
- if( descr->od_constraint.stringList[*val] )
- return TRUE;
- else
- return FALSE;
- }
- }
-