#include <marxf.h>

Public Types | |
| typedef QObject | inherited |
Signals | |
| void | print_message (QString msg) |
| void | spy_message (QString msg) |
| void | scan_finished () |
| void | erase_finished () |
| void | task_finished () |
Public Member Functions | |
| MarXF (QObject *parent=0) | |
| int | mar_start_scan_readout (int next_scan) |
| void | Transform (int i_sp, int block_no, unsigned short *spiral) |
Private Member Functions | |
| void | ImageArray (int addr, unsigned short i2_val) |
| void | output_image (void) |
| int | output_header (int mode) |
| void | get_header_values (int mode) |
| void | PrintResults (int mode) |
| int | ReadNB (FILE *fp) |
| float | PrintStats (int mode, int x, int y, int NP, unsigned int *i4_arr) |
| int | HistoMinMax (void) |
| virtual void | marError (int err_no, int idata)=0 |
| typedef QObject MarXF::inherited |
Reimplemented in Command, MarClock, MarHW, MarNet, MarStartup, QScan345Controller, and Scan345.
| MarXF::MarXF | ( | QObject * | parent = 0 | ) |
| void MarXF::erase_finished | ( | ) | [signal] |
Referenced by MarHW::mar_progress().
| void MarXF::get_header_values | ( | int | mode | ) | [private] |
Definition at line 1406 of file marxf.cpp.
References ac_size, adc1, adc2, MAR345_HEADER::adc_A, MAR345_HEADER::adc_B, add_A, MAR345_HEADER::add_A, add_B, MAR345_HEADER::add_B, AvgI, MAR345_HEADER::byteorder, MAR300_HEADER::centre_x, MAR300_HEADER::centre_y, MAR345_HEADER::chi, com_chi, com_dist, com_doseavg, com_dosebeg, com_doseend, com_dosemax, com_dosemin, com_dosen, com_dosesig, com_filter, com_format, com_kV, com_mA, com_mode, com_omebeg, com_omeend, com_omeosc, com_phibeg, com_phiend, com_phiosc, com_polar, com_remark, com_source, com_theta, com_time, com_wavelength, MAR300_HEADER::counts_end, MAR300_HEADER::counts_start, MAR300_HEADER::date, MAR345_HEADER::date, CONFIG::diameter, MAR345_HEADER::dist, MAR300_HEADER::distance, MAR345_HEADER::doseavg, MAR345_HEADER::dosebeg, MAR345_HEADER::doseend, MAR345_HEADER::dosemax, MAR345_HEADER::dosemin, MAR345_HEADER::dosen, MAR345_HEADER::dosesig, MAR300_HEADER::exptime_sec, MAR300_HEADER::exptime_units, MAR345_HEADER::filter, MAR345_HEADER::format, MAR345_HEADER::gain, MAR345_HEADER::gap, GetResol(), MAR345_HEADER::high, MAR300_HEADER::high_pixels, MAR300_HEADER::high_records, hist_begin, hist_end, hist_max, MAR345_HEADER::histbeg, MAR345_HEADER::histend, MAR345_HEADER::histmax, Imax, MAR345_HEADER::kV, MAR300_HEADER::lambda, MAR300_HEADER::lrecl, MAR345_HEADER::mA, MAR_VERSION, MAR300_HEADER::max_rec, maximum_pixels, MAR345_HEADER::mode, MAR300_HEADER::multiplier, MAR345_HEADER::multiplier, ns_rec, nstrong, MAR345_HEADER::omebeg, MAR345_HEADER::omeend, MAR300_HEADER::omega, MAR345_HEADER::omeosc, op_dosebeg, op_doseend, OUT_IMAGE, MAR300_HEADER::p_l, MAR300_HEADER::p_r, MAR300_HEADER::p_x, MAR300_HEADER::p_y, MAR300_HEADER::phi_end, MAR300_HEADER::phi_start, MAR345_HEADER::phibeg, MAR345_HEADER::phiend, MAR345_HEADER::phiosc, MARNB_HEADER::pixel_height, MAR345_HEADER::pixel_height, MARNB_HEADER::pixel_length, MAR345_HEADER::pixel_length, MAR345_HEADER::pixels, MAR300_HEADER::pixels_x, MAR300_HEADER::pixels_y, poff, MAR345_HEADER::polar, MAR300_HEADER::prog_time, MAR345_HEADER::program, MAR300_HEADER::r_max, MAR300_HEADER::r_min, MAR345_HEADER::remark, MAR345_HEADER::resol, CONFIG::roff, MAR345_HEADER::roff, MARNB_HEADER::scanner, MAR345_HEADER::scanner, SigI, MAR345_HEADER::size, MAR345_HEADER::source, CONFIG::spiral_scale, start_with_A, stat_gap, stat_pixelsize, stat_scanmode, stat_time, str, sum_xray_units, MAR345_HEADER::theta, MAR345_HEADER::time, CONFIG::toff, MAR345_HEADER::toff, MAR345_HEADER::valavg, MAR345_HEADER::valmax, valmin, MAR345_HEADER::valmin, MAR345_HEADER::valsig, MAR345_HEADER::version, MAR345_HEADER::wave, MAR345_HEADER::xcen, and MAR345_HEADER::ycen.
Referenced by output_header(), and output_image().
{
time_t clock;
extern int hist_begin, hist_end, hist_max;
extern float op_dosebeg,op_doseend;
memcpy( (char *)&h345.gap[0], (char *)stat_gap, 8*sizeof(int));
/*
* Fill header values: mar345 header
*/
h345.byteorder = 1234;
h345.high = nstrong;
h345.scanner = nb.scanner;
h345.size = (short)ac_size;
if ( com_format == OUT_IMAGE )
h345.format = 0; /* IMAGE */
else
h345.format = 1; /* PCK */
h345.mode = (char)com_mode;
h345.high = nstrong;
h345.pixels = ac_size*ac_size;
h345.pixel_length = stat_pixelsize*1000.;
h345.pixel_height = stat_pixelsize*1000.;
h345.xcen = ac_size/2;
h345.ycen = ac_size/2;
h345.roff = cfg.roff[(int)stat_scanmode];
h345.toff = cfg.toff[(int)stat_scanmode];
h345.gain = 1.0;
h345.time = com_time;
h345.dosebeg = com_dosebeg;
h345.doseend = com_doseend;
h345.dosemin = com_dosemin;
h345.dosemax = com_dosemax;
h345.doseavg = com_doseavg;
h345.dosesig = com_dosesig;
h345.dosen = com_dosen;
h345.wave = com_wavelength;
if ( start_with_A ) {
h345.adc_A = adc1;
h345.adc_B = adc2;
h345.add_A = add_A;
h345.add_B = add_B;
}
else {
h345.adc_A = adc2;
h345.adc_B = adc1;
h345.add_A = add_B;
h345.add_B = add_A;
}
h345.dist = com_dist;
h345.resol = GetResol( (float)(ac_size*stat_pixelsize/2.0),
(float)h345.dist,(float)h345.wave);
h345.phibeg = com_phibeg;
h345.phiend = com_phiend;
h345.omebeg = com_omebeg;
h345.omeend = com_omeend;
h345.theta = com_theta;
h345.chi = com_chi;
h345.phiosc = com_phiosc;
h345.omeosc = com_omeosc;
h345.valavg = AvgI;
h345.valmin = valmin;
h345.valmax = Imax;
h345.valsig = SigI;
h345.histbeg = hist_begin;
h345.histend = hist_end;
h345.histmax = hist_max;
h345.multiplier = cfg.spiral_scale;
/*
h345.slitx = slitx;
h345.slity = slity;
*/
h345.polar = com_polar;
h345.kV = com_kV;
h345.mA = com_mA;
strcpy( h345.version, MAR_VERSION );
strcpy( h345.program, "scan345 (ESD)" );
strcpy( h345.source, com_source );
strcpy( h345.filter, com_filter );
strcpy( h345.remark, com_remark );
time( &clock );
sprintf( str, "%s",(char *) ctime(&clock) );
memcpy( h345.date, str, 24 );
memcpy( h300.date, str, 24 );
/* Specials for spirals ... */
if ( mode == 0 ) {
if ( stat_scanmode > 3 )
h345.pixel_length = stat_pixelsize*500.;
h345.pixels = maximum_pixels - poff;
h345.format = 2; /* SPIRAL */
}
/*
* Fill header values: mar300 header
*/
h300.pixels_x = ac_size;
h300.pixels_y = ac_size;
h300.lrecl = 2*ac_size;
h300.max_rec = ac_size+1;
h300.high_pixels = h345.high;
h300.high_records = ns_rec;
h300.counts_start = (int)op_dosebeg;
h300.counts_end = (int)op_doseend;
h300.exptime_sec = stat_time;
h300.exptime_units = (int)sum_xray_units;
h300.prog_time = com_time;
h300.r_max = cfg.diameter[stat_scanmode]/2.;
h300.r_min = 0;
h300.p_r = nb.pixel_height;
h300.p_l = nb.pixel_length;
h300.p_x = nb.pixel_height;
h300.p_y = nb.pixel_height;
h300.centre_x = h345.xcen;
h300.centre_y = h345.ycen;
h300.lambda = h345.wave;
h300.distance = h345.dist;
h300.phi_start = h345.phibeg;
h300.phi_end = h345.phiend;
h300.omega = h345.omebeg;
h300.multiplier = h345.multiplier;
}
| int MarXF::HistoMinMax | ( | void | ) | [private] |
Definition at line 1723 of file marxf.cpp.
References hist_begin, hist_end, hist_max, i, max0, and xf_histo.
Referenced by output_image().
{
register int *hist=xf_histo;
register int i;
float dh, hsumr, hsuml;
/*
* Integrate whole histogram
*/
hsuml=hist_max=0;
for (i=1; i<=65535; i++ ) {
hsuml = hsuml + hist[i];
max0( hist_max, hist[i] );
}
/* From high intensity end go down stepwise, until right integral
* is 0.002 % from left integral */
hist_begin = 0;
hsumr = 0;
for (i=65535; i>0; i-- ) {
hsumr = hsumr + hist[i];
hsuml = hsuml - hist[i];
if (hsuml>(float)0.0) dh = hsumr/hsuml;
if (dh>0.002) break;
}
hist_end = i;
if (hist_end < 250) hist_end = 250;
return( hist_end );
}
| void MarXF::ImageArray | ( | int | addr, |
| unsigned short | i2_val | ||
| ) | [private] |
Definition at line 798 of file marxf.cpp.
References fract_intens, UIMG::i4_img, and u.
Referenced by Transform().
{
/*
* Get 32 bit intensity of this pixel
*/
u.i4_img[ addr ] = u.i4_img[ addr ] +
(int) ( i2_val * fract_intens + 0.5 );
}
| int MarXF::mar_start_scan_readout | ( | int | next_scan | ) |
Definition at line 171 of file marxf.cpp.
References ac_size, adc_channel, CONFIG::adcadd_A, CONFIG::adcadd_B, adcavg1, adcavg11, adcavg2, adcavg21, CONFIG::adcoff, STRONG::add, add_A, add_B, buf, MARNB_HEADER::byteorder, bytes2xfer, com_format, current_pixel, data_offset, debug, do_xform, fdspiral, fdxf, fpnb, MARNB_HEADER::fpos, GetmarNBHeader(), i, i2_record, UIMG::i4_img, i_rec, i_x0, iindex, image_file, istrong, j_y0, keep_image, keep_spiral, last_block, last_pixel, lin_dxy, marError(), martable_dir, MAX_SIZE, max_spiral_int, maximum_block, maximum_bytes, maximum_pixels, MARNB_HEADER::mode, n1, n2, nb_index, nbcode_file, nskip, OUT_CBF, OUT_CIF, output_header(), MARNB_HEADER::pixels, CONFIG::pixelsize, poff, saturation, scan_in_progress, MARNB_HEADER::scanner, scanner_no, MARNB_HEADER::size, CONFIG::size, MARNB_HEADER::skip, sp_pixels, spiral_file, spiral_offset, spiral_only, spiral_size, start_with_A, stat_blocks_sent, stat_pixelsize, stat_scan_add, stat_scanmode, stat_xform_msg, swap_nb, swaplong(), CONFIG::toff, total_pixels, u, CONFIG::use_adc, STRONG::val, valmin, MARNB_HEADER::x, xf_histo, xf_in_progress, xf_pixels, xf_rec, xform_status, and MARNB_HEADER::y.
Referenced by MarHW::StartScan().
{
int i, i_pix;
int swap[2];
int j_dj[8] = { -1, 0, 1,-1, 1,-1, 0, 1};
int i_di[8] = { -1,-1,-1, 0, 0, 1, 1, 1};
extern char martable_dir[128];
extern char nbcode_file[128];
/*
* Initialize readout variables
*/
n1 = n2 = adcavg1 = adcavg2 = adcavg11= adcavg21= 0;
adc_channel = 0;
start_with_A = 1;
bytes2xfer = 0;
xform_status = 0;
scan_in_progress = 1;
xf_in_progress = 1;
do_xform = 1;
stat_xform_msg = 0;
stat_blocks_sent = 0;
current_pixel = 0;
sp_pixels = 0;
xf_pixels = 0;
valmin = 999999;
last_pixel = -1;
last_block = -1;
poff = 0;
data_offset = 0;
add_A = cfg.adcadd_A[ (int)stat_scanmode ];
add_B = cfg.adcadd_B[ (int)stat_scanmode ];
saturation = 1000000;
stat_pixelsize = cfg.pixelsize[ (int)stat_scanmode ];
if ( strncmp( image_file, spiral_file, strlen(spiral_file) )== 0 )
spiral_only = 1;
else
spiral_only = 0;
fdxf = 0;
if ( fdspiral >= 0 ) {
close( fdspiral );
fdspiral = -1;
}
/*
* Initialize xform variables
*/
spiral_offset = 0;
/* Use the ADC values from controller */
if ( cfg.use_adc == 1 ) {
spiral_offset = cfg.adcoff[(int)stat_scanmode];
}
max_spiral_int = 0;
istrong = 0;
xf_rec = 0;
iindex = 1024;
nb_index = 0;
ac_size = cfg.size[ (int)stat_scanmode ];
total_pixels = ac_size * ac_size;
/*
* Open neighbour code file
*/
if ( fpnb != NULL ) {
fclose( fpnb );
fpnb = NULL;
}
if ( stat_scanmode > 3 ) {
sprintf( nbcode_file,"%s/mar3450.%s", martable_dir, scanner_no);
}
else {
sprintf( nbcode_file,"%s/mar2300.%s", martable_dir, scanner_no);
}
if ( NULL == (fpnb = fopen( nbcode_file, "r" ))) {
marError( 1100, 0 );
do_xform = 0;
keep_image = 0;
}
/*
* Read nb header.
*/
nb = GetmarNBHeader( fpnb );
/*
* Neighbour code header okay ?
*/
if ( nb.mode < 1 ) {
marError( 1101, 0 );
do_xform = 0;
keep_image = 0;
}
/*
* Is byte swapping required ?
*/
if ( nb.byteorder != 1234 ) {
swap_nb = nb.byteorder;
swap[0] = swap_nb;
swaplong( (char*) swap, 4 );
swap_nb = swap[0];
nb.byteorder = 1234;
if ( swap_nb != 1234 ) {
marError( 1102, 0 );
do_xform = 0;
keep_image = 0;
}
swap_nb = 1;
}
/*
* Is the serial no. of nbcode identical to the one
* defined by $MAR_SCANNER_NO ?
*/
if ( atoi( scanner_no ) != nb.scanner ) {
marError( 1103, 0 );
}
/*
* Is there the desired scanning mode ?
*/
i_rec = -1;
for ( i=0; i<=4; i++ ) {
/* Size is identical, use this mode ... */
if ( nb.size[i] == ac_size ) {
i_rec = nb.fpos[i];
i_x0 = nb.x[i];
j_y0 = nb.y[i];
i_pix = nb.pixels[i];
poff = nb.skip[i] + (int)cfg.toff[(int)stat_scanmode];
nskip = poff-1;
maximum_pixels = nb.pixels[i] + nb.skip[i];
maximum_block = (int)(maximum_pixels/8192. + 0.999);
maximum_bytes = maximum_block * 16386;
/* When dealing with odd no. of pixels in preturn
* the ADC offset for channels A and B must be
* exchanged
*/
if ( nb.skip[i] % 2 != 0 ) {
adc_channel = 1;
start_with_A = 0;
}
break;
}
}
/*
* When applying offset, take only a fraction when using multiple
* sampling
*/
if ( i_rec < 0 ) {
marError( 1105, 0 );
do_xform = 0;
keep_image = 0;
i_rec = 0;
}
/*
* Create transformed image file
*/
if ( keep_image && !spiral_only ) {
sprintf( buf, "%s.tmp", image_file );
if ( com_format == OUT_CIF || com_format == OUT_CBF ) {
fdxf = 0;
}
else {
fdxf = creat( buf, 0666 );
if ( fdxf == -1 ) {
marError( 1110, 0 );
do_xform = 0;
fdxf = 0;
}
/* Close file after creation */
else {
close( fdxf );
fdxf = 0;
}
/*
* Open created image file
*/
fdxf = open( buf, O_RDWR ); /* Mode = O_RDWR (=2) */
if( fdxf == -1 ) {
marError( 1111, 0 );
do_xform = 0;
fdxf = 0;
}
}
}
else {
if ( !spiral_only )
do_xform = 0;
keep_spiral = 1;
}
/* If we write only spirals, free memory and skip next lines */
if ( keep_image == 0 ) {
goto NEXT_1;
}
for(i = 0; i < 8; i++)
lin_dxy[i] = j_dj[i] * ac_size + i_di[i];
/*
* Initialize memory for image arrays...
*/
if ( stat_scan_add == 0 ) {
memset( (char *)u.i4_img, 0, sizeof(int)*total_pixels);
}
memset( (char *)xf_histo, 0, sizeof(int)*65600 );
for ( i=0; i<MAX_SIZE; i++ ) {
i2_record[i] = 0;
}
for ( i=0; i<MAX_SIZE/2; i++ ) {
strong_rec[i].val = 0;
strong_rec[i].add = 0;
}
/*
* Go to starting position (i_rec) in neighbor code
*/
NEXT_1:
if ( do_xform )
fseek( fpnb, i_rec, SEEK_SET);
if ( debug & 0x40 ) {
fprintf(stdout,"\nscan345: transformation parameters:\n");
fprintf(stdout,"\tCurrent scan mode: %d\n",stat_scanmode);
fprintf(stdout,"\tStarting x: %d\n",i_x0);
fprintf(stdout,"\tStarting y: %d\n",j_y0);
fprintf(stdout,"\tSpiral offset: %d\n",poff);
fprintf(stdout,"\tFirst rec at: %d\n",i_rec);
fprintf(stdout,"\tNo. of pix/rec: %d\n",ac_size);
fprintf(stdout,"\tTotal no. of pixels: %d\n",maximum_pixels);
fprintf(stdout,"\tTotal no. of blocks: %d\n",maximum_block);
}
#ifdef DEBUG
#endif
/*
* We cannot write transformed image, so we try to write
* spiral images...
*/
if ( do_xform == 0 && keep_image == 1 ) {
fprintf(stdout, "scan345: Image cannot be transformed!\n");
fprintf(stdout, "scan345: Trying to write spiral files...!\n");
keep_spiral = 1;
}
/*
* Write image header first time
*/
if ( do_xform == 1 && fdxf > 0 ) {
if ( output_header( (int)1 ) != 1 ) {
do_xform = 0;
i = close( fdxf );
keep_spiral = 1;
fdxf = 0;
}
}
/*
* In keep spiral mode, write spiral header to output
*/
if ( output_header( 0 ) != 1 ) {
/*
* Spiral file could not be opened, so we have to abort
* data collection
*/
if ( fdxf ) {
i = close( fdxf );
fdxf = 0;
}
i = close(fdspiral);
fdspiral = -1;
return( 0 );
}
/*
*/
spiral_size = 4096 + maximum_block*16384;
return( 1 );
}
| virtual void MarXF::marError | ( | int | err_no, |
| int | idata | ||
| ) | [private, pure virtual] |
Implemented in MarHW.
Referenced by mar_start_scan_readout(), output_header(), and output_image().
| int MarXF::output_header | ( | int | mode | ) | [private] |
Definition at line 1312 of file marxf.cpp.
References ac_size, buf, com_format, do_xform, fdspiral, fdxf, get_header_values(), i, keep_image, keep_spiral, marError(), OUT_IMAGE, OUT_PCK, Putmar300Header(), Putmar345Header(), MARNB_HEADER::scanner, spiral_file, and spiral_only.
Referenced by mar_start_scan_readout(), and output_image().
{
int i;
int fd;
/* Spiral file output */
if ( mode == 0 && fdspiral < 0 ) {
/*
* Return, if spiral image should not be written
*/
if ( keep_spiral == 0 ) return( 1 );
sprintf( buf, "%s.tmp", spiral_file );
fdspiral = creat( buf, 0666 );
if ( fdspiral == -1 ) {
marError( 1115, 0 );
return( 0 );
}
else
close( fdspiral );
/*
* Open created spiral file
*/
fdspiral = open( buf, 2 ); /* Mode = O_RDWR (=2) */
if( fdspiral == -1 ) {
marError( 1120, 0 );
return( 0 );
}
/* Set file descriptor to spiral */
fd = fdspiral;
} /* End spiral section */
else if ( mode == 0 && fdspiral >= 0 ) {
/* Set file descriptor to spiral */
fd = fdspiral;
}
/* Image file output */
else {
if ( do_xform == 0 || keep_image == 0 || spiral_only ) return( 1 );
fd = fdxf;
}
/*
* Get values for image header
*/
get_header_values( mode );
/*
* Rewind file
*/
i = lseek( fd, 0, SEEK_SET );
if ( com_format == OUT_IMAGE || com_format == OUT_PCK ) {
i = Putmar300Header( fd, nb.scanner, h300 );
lseek( fd, 2*ac_size, SEEK_SET );
}
else {
i = Putmar345Header( fd, h345 );
lseek( fd, 4096, SEEK_SET );
}
/* Error occured ? */
if ( i < 1 ) {
if ( mode == 0 )
marError( 1121, 0 );
else {
marError( 1115, 0 );
do_xform = 0;
}
return( 0 );
}
return( (int)1 );
}
| void MarXF::output_image | ( | void | ) | [private] |
Definition at line 812 of file marxf.cpp.
References ac_size, STRONG::add, AvgI, BOX_OFF, BOXSIZE, buf, com_format, com_scan_add, debug, do_xform, fdspiral, fdxf, get_header_values(), HistoMinMax(), i, UIMG::i2_img, UIMG::i4_img, image_file, Imax, input_skip_op, istrong, j, keep_image, keep_spiral, last_image, ltell, mar3452CIFHeader(), MAR_VERSION, marError(), max0, min0, now, ns_rec, nsat, nstrong, op_in_progress, OUT_CBF, OUT_CIF, OUT_IMAGE, OUT_MAR, OUT_PCK, output_header(), print_message(), PrintResults(), PrintStats(), put_pck(), PutCIFData(), PutCIFHeader(), rotate_i4(), rotate_i4_anti(), scan_in_progress, SigI, skip_op, spiral_file, spiral_only, stat_scanmode, str, total_pixels, u, CONFIG::use_image, CONFIG::use_stats, STRONG::val, valmin, xf_histo, xf_in_progress, and xf_pixels.
Referenced by Transform().
{
register unsigned int *i4_arr;
register unsigned int i4_val;
register unsigned int xx,yy;
time_t now;
float avgN,avgW,avgO,avgS;
int k;
unsigned int cenmax,cenmin,no, ns, reclen, len, i,j, nhist, pos;
double Isum, diff;
#ifdef DEBUG
if (debug & 0x40 )
printf("debug (marxf): output image started %d\n",scan_in_progress);
#endif
if ( scan_in_progress == 0 || op_in_progress ) return;
xf_in_progress = 0;
op_in_progress = 1;
#ifdef FORMAT_TEST
for ( istrong=0, i=0; i<80; i++ ) {
pos = (i+605)*ac_size+500+i;
for ( j=0; j<100; j++, pos++ ) {
i4_val = 70000+i*10000+j*100;
while ( i4_val > 65535 ) {
if ( ch_image[pos] < 250 )
ch_image[ pos ]++;
i4_val -= 65535;
}
i2_image[ pos ] = i4_val;
istrong++;
}
}
#endif
nstrong = istrong;
/*
* Only spiral file has been produced, print result and return
*/
if ( do_xform == 0 || keep_image == 0 ) {
if ( keep_spiral )
PrintResults( 0 );
goto ALL_DONE;
}
/*
* Everything is fine, so go ahead
* and write image to output ...
*/
/* Rotate image by 90 deg. when working in old image format */
if ( com_format == OUT_IMAGE ) {
rotate_i4( u.i4_img, ac_size );
}
/*
* Use pointers instead of arrays. This is a bit faster...
*/
i4_arr = u.i4_img;
/*
* Init. some variables
*/
cenmin = ac_size/2 - 5;
cenmax = ac_size/2 + 5;
Isum = 0.0;
Imax = 0;
nhist = 0;
nsat = ns_rec = no = ns = 0;
/*
* The overflow record is written in standard image format
* In PCK mode, the overflow records follow the header, i.e.
* the first overflow record is: 2
* In IMAGE mode, the overflow records follow the image array,
* i.e. the first overflow record is: 1+ac_size
*/
if ( com_format == OUT_MAR ) {
reclen = 8;
if ( fdxf )
lseek(fdxf, 4096, SEEK_SET);
}
else {
reclen = ac_size/4;
if ( fdxf ) {
if ( com_format == OUT_PCK )
lseek(fdxf, 2*ac_size, SEEK_SET);
else
lseek(fdxf, 2*ac_size + 2*total_pixels, SEEK_SET);
}
}
/*
* Loop 1: Go through image and look for values exceeding 16 bits
*/
for ( i=j=0; i< total_pixels ; i++, i4_arr++ ) {
i4_val = *i4_arr;
/*
* The maximum intensity in the transformed image is...
*/
if ( i4_val > Imax && i4_val < 250000 ) {
xx = i%ac_size;
yy = i/ac_size;
/* Exclude inner 5 pixels from Imax calculation */
if ( xx<cenmin || xx >cenmax || yy<cenmin || yy > cenmax )
Imax = i4_val;
}
/*
* Add to intensity histogram
*/
if ( i4_val > 0 && i4_val <= 65535 ) {
Isum += i4_val;
nhist++;
xf_histo[ i4_val ]++;
min0( valmin, (int)i4_val );
}
/*
* Is overflow counter for pixel i > 0 ?
*/
if ( i4_val <= 65535 ) continue;
/*
* The next pixel value is > 16 bits
*/
strong_rec[no].add = i;
strong_rec[no].val = i4_val;
/* In IMAGE output mode, add +1 to address!!! */
if ( com_format == OUT_IMAGE || com_format == OUT_PCK )
strong_rec[no].add++;
/*
* Saturated pixels and sum up intensities
*/
if ( strong_rec[no].val > 250000 ) {
nsat++;
strong_rec[no].val = 999999;
*i4_arr = 999999;
}
else {
nhist++;
xx = i%ac_size;
yy = i/ac_size;
if ( xx<cenmin || xx >cenmax || yy<cenmin || yy > cenmax )
max0( Imax, strong_rec[no].val );
Isum += strong_rec[no].val;
}
/*
* Increment counters
*/
no++;
ns++;
/*
* Record is full, so write it to output...
*/
if ( no == reclen && do_xform && keep_image ) {
ns_rec++;
len = reclen*sizeof(STRONG);
if ( fdxf ) {
if ( write( fdxf, (char *)strong_rec, len) < len ) {
marError( 1112, ltell( fdxf) );
do_xform = 0;
}
}
no = 0;
}
}
/*
* Fill last oveflow record with zeroes and write to output
*/
if ( no > 0 && do_xform && keep_image && !spiral_only ) {
for ( i=no; i<reclen; i++ ) {
strong_rec[i].add = 0;
strong_rec[i].val = 0;
}
ns_rec++;
len = reclen*sizeof(STRONG);
if ( fdxf ) {
if ( write( fdxf, (char *)strong_rec, len) < len ) {
marError( 1112, ltell( fdxf) );
do_xform = 0;
}
}
}
if ( fdxf )
pos = ltell( fdxf );
/* Get average I */
if ( nhist > 0 )
AvgI = Isum/(double)nhist;
else
AvgI = 0.0;
/* Get Sigma if Intensity */
i4_arr = u.i4_img;
SigI = 0.0;
/*
* Go through high intensity array to get Avg, sigma
*/
for ( i=j=0; i< total_pixels ; i++, i4_arr++ ) {
i4_val = *i4_arr;
if ( i4_val == 0 ) continue;
if ( i4_val > 250000 ) {
if ( stat_scanmode < 4 )
i4_val = 131072;
else
i4_val = 65535;
}
diff = i4_val - AvgI;
diff *= diff;
SigI += diff;
j++;
}
if ( j>1 )
SigI = sqrt( SigI/(double)(j - 1.0) );
/*
* Since istrong and ns_rec are known by now, we
* can write the image header, next...
*/
if ( fdxf )
if ( output_header( 1 ) != 1 ) {
do_xform = 0;
}
PrintResults( 1 );
if ( !do_xform ) goto ALL_DONE;
if ( input_skip_op || skip_op || spiral_only ) goto SKIP1;
/* Print STATS, if configured */
if ( cfg.use_stats && do_xform ) {
j = (int)(cos( 3.14159 / 4.0 ) * (ac_size/2 - BOX_OFF) );
/* NORDWEST */
xx = yy = ac_size/2. - BOXSIZE/2 - j;
avgW = PrintStats( 0, xx, yy, BOXSIZE, u.i4_img);
/* WEST */
xx = BOX_OFF - BOXSIZE/2;
yy = ac_size/2 - BOXSIZE/2;
avgW = PrintStats( 1, xx, yy, BOXSIZE, u.i4_img);
/* NORD */
xx = ac_size/2 - BOXSIZE/2;
yy = BOX_OFF - BOXSIZE/2;
avgN = PrintStats( 1, xx, yy, BOXSIZE, u.i4_img);
/* OST */
xx = ac_size - BOXSIZE/2 - BOX_OFF;
yy = ac_size/2 - BOXSIZE/2;
avgO = PrintStats( 1, xx, yy, BOXSIZE, u.i4_img);
/* SUED */
xx = ac_size/2 - BOXSIZE/2;
yy = ac_size - BOXSIZE/2 - BOX_OFF;
avgS = PrintStats( 1, xx, yy, BOXSIZE, u.i4_img);
if ( avgO > 0.0 ) avgW /= avgO;
else avgW = 0.0;
if ( avgS > 0.0 ) avgN /= avgS;
else avgN = 0.0;
/*
sprintf( str, "%8.4f%8.4f ", avgW, avgN);
*/
avgW = 100.0-avgW*100.;
avgN = 100.0-avgN*100.;
if ( avgW < 0.0 )
sprintf( str, "%8.3f" , avgW);
else
sprintf( str, " +%6.3f", avgW);
if ( avgN < 0.0 )
sprintf( str, "%8.3f " , avgN);
else
sprintf( str, " +%6.3f ", avgN);
avgS = PrintStats(99, xx, yy, BOXSIZE, u.i4_img);
}
/* From image display we got some new information for the
* header which we may will be written again into header */
i=HistoMinMax();
/*
* Write CBF/imgCIF output
*/
if ( com_format == OUT_CIF || com_format == OUT_CBF ) {
/* Fill CIF header structure */
get_header_values( 1 );
sprintf( str, "scan345 (V %s)",MAR_VERSION);
mar3452CIFHeader( str, image_file, h345);
/* Write CIF header */
if ( PutCIFHeader("scan345", image_file) < 1 ) {
marError( 1115, 0 );
do_xform = 0;
}
else {
/* Write CIF data array */
i= PutCIFData( "scan345", image_file, (char)(com_format-OUT_CIF), u.i4_img);
if ( i == 0 ) {
marError( 1112, i );
do_xform = 0;
}
}
}
/* All other formats: convert 32-bit to 16-bit array */
else {
i4_arr = u.i4_img;
for ( k=0; k<total_pixels ; k++) {
i4_val = *i4_arr++;
if ( i4_val > 65535 )
u.i2_img[k] = 65535;
else
u.i2_img[k] = (unsigned short)i4_val;
}
}
/*
* Write out the 16 bit image array.
* ---------------------------------
* IMAGE format...
*/
if ( com_format == OUT_IMAGE ) {
lseek(fdxf, 2*ac_size, SEEK_SET);
j = write( fdxf, u.i2_img, 2*total_pixels );
if ( (j < 2*total_pixels) == -1) {
marError( 1112, j );
do_xform = 0;
}
xf_pixels = j/2;
}
/*
* MAR345 format...
*/
else if ( com_format == OUT_MAR || com_format == OUT_PCK ) {
/*
* Write PCK header following the overflow record...
*/
lseek(fdxf, pos , SEEK_SET);
sprintf(str,"\nCCP4 packed image, X: %04d, Y: %04d\n",ac_size,ac_size);
if ( write(fdxf, str, strlen( str )) == -1 ) {
marError( 1112, 2);
}
j = put_pck( u.i2_img, ac_size, ac_size, fdxf );
if ( j == 0 ) {
marError( 1112, 3);
do_xform = 0;
}
}
SKIP1:
if ( fdxf && ( com_format != OUT_IMAGE && com_format != OUT_PCK ) )
i = output_header( 1 );
/*
* All done: close file, reset markers
*/
ALL_DONE:
/* When adding scans, we have to reverse some action
* if there are overflows. We also have to rotate image
* arrays when working in mar300 formats
*/
if ( com_scan_add > 0 && do_xform && fdxf ) {
/* Convert 16-bits to 32-bits array */
k=total_pixels-1;
while ( k>=0 ) {
i4_val = (unsigned int)u.i2_img[k];
u.i4_img[k] = i4_val;
k--;
}
/* High intensity pixels ? */
if ( com_format == OUT_IMAGE )
lseek(fdxf, 2*ac_size + 2*total_pixels, SEEK_SET);
else if ( com_format == OUT_PCK )
lseek(fdxf, 2*ac_size, SEEK_SET);
else
lseek(fdxf, 4096, SEEK_SET);
for ( no=0; no<=nstrong; no++ ) {
i = read(fdxf, strong_rec, 8 );
if ( i != 8 ) {
break;
}
i = strong_rec[0].add;
i4_val = strong_rec[0].val;
/* In IMAGE output mode, take off -1 from address!!! */
if ( com_format != OUT_MAR ) i--;
if ( i < 0 || i >= (total_pixels-1) ) continue;
if ( i4_val < 65535 )
continue;
u.i4_img[i] = i4_val;
}
/* Rotate image back when working in old image format */
if ( com_format == OUT_IMAGE || com_format == OUT_PCK )
rotate_i4_anti( u.i4_img, ac_size );
} /* End of : if ( com_scan_add > 0 ) */
/*
* Close and rename files
*/
if ( keep_image && !spiral_only ) {
if ( fdxf ) {
i = close( fdxf );
fdxf = 0;
}
sprintf( buf, "%s.tmp", image_file );
/* Remove temporary file */
if ( input_skip_op || skip_op )
remove( buf );
/* Rename temporary file to image_file */
else {
rename( buf, image_file );
strcpy( last_image, image_file );
}
}
else if ( spiral_only ) {
strcpy( last_image, image_file );
}
scan_in_progress = do_xform = 0;
op_in_progress = 0;
/*
* Close spiral file, if in use at all...
*/
if (keep_spiral) {
i = output_header( 0 );
close(fdspiral);
/* Rename tmp to spiral file */
sprintf( buf, "%s.tmp", spiral_file );
rename( buf, spiral_file );
/* Compress spiral file */
if ( cfg.use_image == 3 ) {
sprintf( str, "packspiral %s &\n",spiral_file);
system( str );
}
fdspiral = -1;
}
#ifdef DEBUG
if ( debug & 0x40 )
printf("debug (marwh): output image all done\n");
#endif
/* Open message file */
time( &now );
emit print_message(QString().sprintf("scan345: OUTPUT IMAGE ENDED at %s",(char *)ctime( &now )));
}
| void MarXF::print_message | ( | QString | msg | ) | [signal] |
Referenced by Command::exec_command(), MarHW::get_error(), MarHW::mar_abort(), MarHW::mar_change_mode(), MarHW::mar_command(), MarHW::mar_lock(), MarHW::mar_progress(), MarHW::mar_quit(), MarHW::mar_servo(), MarHW::mar_start_expo(), MarHW::marError(), MarStartup::marStartup(), MarHW::marTask(), MarHW::Modulo360(), MarNet::net_open(), MarHW::NotEnoughDiskSpace(), output_image(), MarHW::print_msg(), PrintResults(), MarHW::process_status(), and Transform().
| void MarXF::PrintResults | ( | int | mode | ) | [private] |
Definition at line 1545 of file marxf.cpp.
References AvgI, com_phibeg, com_phiend, com_time, image_file, Imax, input_skip_op, istrong, mar_cmd, MDC_COM_SCAN, nsat, nstrong, print_message(), skip_op, spiral_file, spiral_only, str, sum_xray_units, CONFIG::use_phi, and CONFIG::use_stats.
Referenced by output_image().
{
/*
* Print most important results
*/
if ( mode == 1 && !(input_skip_op || skip_op ) )
sprintf( str, " -> File: %s\n", image_file);
else {
if ( spiral_only )
sprintf( str, " -> File: %s\n", spiral_file);
else
sprintf( str, " !!! -> File: %s\n", spiral_file);
}
emit print_message(str);
if ( mar_cmd != MDC_COM_SCAN ) {
sprintf( str, " Phi range [degrees]: %8.3f --> %1.3f\n",com_phibeg,com_phiend);
if ( cfg.use_phi ) {
emit print_message(str);
}
sprintf( str, " Exposure time [sec]: %8.0f\n",com_time);
emit print_message(str);
#ifdef MAR345
sprintf( str, " Average X-ray intensity: %8.2f\n", sum_xray_units);
emit print_message(str);
#endif
}
if ( mode != 0 || input_skip_op || skip_op || spiral_only ) {
if ( cfg.use_stats ) {
sprintf( str, " Average image intensity: %8.1f\n",AvgI);
emit print_message( str );
}
sprintf( str, " Maximum valid intensity: %8d\n", Imax );
emit print_message( str );
sprintf( str, " No. of pixels > 65535: %8d\n",nstrong);
if ( istrong > 0 ) {
emit print_message( str );
}
sprintf( str, " No. of saturated pixels: %8d\n",nsat);
if ( nsat > 0 ) {
emit print_message( str );
}
}
}
| float MarXF::PrintStats | ( | int | mode, |
| int | x, | ||
| int | y, | ||
| int | NP, | ||
| unsigned int * | i4_arr | ||
| ) | [private] |
Definition at line 1650 of file marxf.cpp.
References ac_size, adc1, adc2, i, image_file, j, last, now, stat_gap, and str.
Referenced by output_image().
{
register unsigned int i,j,*i4;
register unsigned int i4_val;
static time_t now,last=0 ;
struct tm *time_ptr;
int n, k,l;
double diff,sum,avg,sig;
char clock_time[32];
/* Last call: print time and image name */
if ( mode == 99 ) {
now = time( NULL );
time_ptr= localtime( &now);
n = now - last;
if ( last==0 ) n = 0;
/* Print the date: */
strftime( clock_time, 16, "%a %H:%M.%S", time_ptr );
sprintf( str, "%s%5d%6d%6.1f%6.1f %s\n",
clock_time,n,stat_gap[0],adc1/1000.,adc2/1000.,image_file);
last = now;
return(1.0);
}
sig = sum = avg = 0.0;
for ( i=k=l=0; i<NP; i++ ) {
n = ac_size*( y+i ) + x;
i4 = i4_arr + n ;
for ( j=0; j<NP; j++, i4++ ) {
i4_val = *i4;
if ( i4_val == 0 || i4_val > 250000 ) {
continue;
}
k++;
sum += i4_val;
}
}
sig = 0.0;
if ( k > 1 )
avg = sum/(double)k;
else
return( avg);
for ( i=0; i<NP; i++ ) {
n = ac_size*( y+i ) + x;
i4 = i4_arr + n ;
for ( j=0; j<NP; j++, i4++ ) {
i4_val = *i4;
if ( i4_val == 0 || i4_val > 250000 ) continue;
diff = i4_val - avg;
diff *= diff;
sig += diff;
}
}
sig = sqrt( sig/(double)(k - 1.0) );
if ( mode == 0 ) {
sprintf( str, "%7.1f%6.1f", avg, sig);
}
return avg;
}
| int MarXF::ReadNB | ( | FILE * | fp | ) | [private] |
Definition at line 1599 of file marxf.cpp.
References i, nb_rec, px_rec, sp_pixels, swap_nb, swapshort(), x_rec, and y_rec.
Referenced by Transform().
{
int i,n,n_nb;
unsigned short r_rec[4];
static int n_rec=0;
/* Read record with index counters */
i = fread( (unsigned short *)r_rec, sizeof(short), 2, fp );
/* Swap bytes if required */
if (swap_nb) swapshort((char*) r_rec, 2*sizeof(short) );
n = r_rec[0];
n_nb = r_rec[1];
/* Read record with x coordinate */
i += fread( x_rec, sizeof(char), n, fp );
/* Read record with x coordinate */
i += fread( y_rec, sizeof(char), n, fp );
/* Read record with nb_byte */
i += fread(nb_rec, sizeof(char), n, fp );
if ( i != (3*n+2) ) {
/*
fprintf( stdout, "scan345: only %d out of %d bytes read from nb after pixel %d\n",i,3*n+2,sp_pixels+1);
*/
return( 0 );
}
/* Read record with n_nb nb contributions */
if ( n_nb > 0 ) {
i = fread( px_rec, sizeof(unsigned short), n_nb, fp );
/* Swap bytes if required */
if (swap_nb) swapshort( (char*) px_rec, n_nb*sizeof(short) );
if ( i != n_nb ) {
fprintf( stdout, "scan345: ERROR reading nb at pixel %d in record %ld\n",sp_pixels+1,ftell(fp) );
return( 0 );
}
}
n_rec++;
return( n );
}
| void MarXF::scan_finished | ( | ) | [signal] |
Referenced by MarHW::mar_progress().
| void MarXF::spy_message | ( | QString | msg | ) | [signal] |
Referenced by MarHW::print_msg().
| void MarXF::task_finished | ( | ) | [signal] |
Referenced by MarHW::mar_progress().
| void MarXF::Transform | ( | int | i_sp, |
| int | block_no, | ||
| unsigned short * | spiral | ||
| ) |
Definition at line 485 of file marxf.cpp.
References ac_size, _esd_stb::adc1, adc1, _esd_stb::adc2, adc2, adc_channel, adcavg1, adcavg11, add_A, add_B, bit, current_pixel, debug, do_xform, esd_stb, fdspiral, fpnb, fract_intens, i, i_x0, ImageArray(), j_y0, keep_image, keep_spiral, last_block, last_pixel, lin_dxy, ltell, max0, max_spiral_int, maximum_block, maximum_pixels, n1, nb_index, nb_rec, NB_SIZE, nskip, op_in_progress, output_image(), poff, print_message(), px_rec, ReadNB(), MARNB_HEADER::scale, scan_in_progress, sp_pixels, CONFIG::spiral_max, spiral_offset, CONFIG::spiral_scale, spiral_size, stat_blocks_sent, stat_xform_msg, swapshort(), total_pixels, CONFIG::use_adc, x_rec, xform_status, and y_rec.
Referenced by MarNet::net_data().
{
register unsigned int adc,adcadd;
register int sp_index, lin_pointer, nb_pointer;
register int pixel_intensity;
register int i;
static unsigned short *s_p;
static unsigned char *n_p, nb_byte;
static unsigned short *v_p;
static signed char dx, dy, *x_p, *y_p;
int sp_offset;
static int n_nb;
double dtmp;
/*
* Used parameters and their values:
* ---------------------------------
* stat_blocks_sent = block counter read by this program
* current_pixel = pixel counter read by this program
*/
if ( scan_in_progress == 0 || op_in_progress == 1 ) return;
/*
* Block of data has been read successfully...
*/
/* Pixel offset in some modes 5, 6, 7 ... */
if ( poff > 0 ) {
sp_offset = poff;
if ( i_sp < poff ) {
poff -= i_sp;
current_pixel += i_sp;
goto OUTPUT;
}
i_sp -= poff;
poff = 0;
current_pixel = nskip;
}
else
sp_offset = 0;
last_block = stat_blocks_sent;
last_pixel = current_pixel;
/*
* Use new ADC values for this scan. Use first data block
*/
if ( block_no <= 1 ) {
adc1 = esd_stb.adc1;
adc2 = esd_stb.adc2;
}
/*
* Swap bytes
*/
#if ( __sgi111 || HPUX111 )
swapshort( spiral+sp_offset, i_sp*sizeof(short) );
#endif
/* Write data block into spiral file... */
if (keep_spiral) {
i = write(fdspiral, spiral+sp_offset, i_sp*sizeof(short) );
if ( i == -1 ) {
/* Error writing spiral record... */
emit print_message(tr("scan345: Error writing spiral block %1\n").arg(stat_blocks_sent));
if ( do_xform == 0 ) {
close( fdspiral );
fdspiral = -1;
xform_status = -1;
return;
}
}
if ( !keep_image )
current_pixel += i_sp;
}
/* Ignore first 2 pixels (set to value of third) */
if ( sp_pixels == 0 ) {
for ( i=0; i<2; i++ ) {
spiral[i+sp_offset] = spiral[2+sp_offset];
}
}
/*
* Monitor progress of transformation
*/
#ifdef __osf__
dtmp = block_no/(double)maximum_block;
stat_xform_msg = (int)( 100*dtmp);
#else
stat_xform_msg = (int)( 100*(block_no/(float)maximum_block));
stat_xform_msg = (int)( 100*(current_pixel/(float)maximum_pixels));
#endif
/******************************************************
******************************************************
** **
** Transform pixels for the current spiral_buffer **
** **
******************************************************
******************************************************/
/* Reset xform_status to 1 */
xform_status = 1;
/* If we don't want to write transformed image, skip while loop... */
if ( do_xform == 0 ) {
xform_status = 2;
if ( last_pixel >= maximum_pixels ) {
xform_status = 3;
}
}
if ( xform_status != 1 || sp_pixels >= maximum_pixels ) goto OUTPUT;
/* Set pointer to first element in spiral array and reset counter */
s_p = spiral + sp_offset; /* Spiral pixel value */
sp_index = 0;
/*
* Read neighbour code for 1024 pixels
*/
NEXT_NB:
if ( nb_index == 0 ) {
if ( ( nb_index = ReadNB( fpnb ) ) < 1 ) {
xform_status = 3;
goto OUTPUT;
}
/* Set pointer to first element in array */
x_p = x_rec; /* Pixel x coordinate */
y_p = y_rec; /* Pixel y coordinate */
n_p = nb_rec; /* Neighbour byte */
v_p = px_rec; /* Neighbour contributions */
n_nb = 0;
}
/*
* Loop 1: Transform pixels for this data block
*/
while( sp_index < i_sp ) {
/* Dereference pointers */
if ( n_nb < 0 ) n_nb = 0;
pixel_intensity = (int)*s_p;
dx = *x_p;
dy = *y_p;
nb_byte = *n_p;
/*
* Get maximum intensity of raw data
*/
max0( max_spiral_int, pixel_intensity );
/*
* Push out values we cannot trust, scale and add offset
*/
if ( pixel_intensity > cfg.spiral_max )
pixel_intensity *= 100;
else {
/* Apply ADC offsets as obtained from STATUS block */
if ( cfg.use_adc ) {
if ( adc_channel == 1 ) {
adc = adc2;
adcadd = add_B;
}
else {
adc = adc1;
adcadd = add_A;
#ifdef DEBUG1
n1++;
adcavg1 += ( pixel_intensity - adc );
adcavg11+= ( pixel_intensity - adc2);
if ( n1 > 100000 ) {
printf( "xxx n1=%8d \tavg1=%1.3f (%1.3f)\n", n1,adcavg1/(double)n1,adcavg11/(double)n1);
n1 = adcavg1 = adcavg11= 0;
}
#endif
}
pixel_intensity += (spiral_offset + adcadd - adc);
}
else {
if ( adc_channel == 1 )
adcadd = add_B;
else
adcadd = add_A;
pixel_intensity += adcadd;
}
adc_channel = adc_channel ^ 0x01;
pixel_intensity *= cfg.spiral_scale;
if ( pixel_intensity < 0 ) pixel_intensity = 0;
}
/*
* In neighbor code, nb.scale is 100% contribution.
*/
fract_intens = pixel_intensity / nb.scale;
/*
* Actual x, y coordinates are ...
*/
i_x0 += dx;
j_y0 += dy;
/*
* Main contribution: position in linear array
*/
lin_pointer = i_x0 * ac_size + j_y0 - 1;
/*
* Put pixel value into image array
*/
if ( lin_pointer > 0 && lin_pointer <= total_pixels)
ImageArray( lin_pointer, *v_p );
/* Next contrib pointer ... */
v_p++;
/*
* Cartesian neighbours:
*
* 0 1 2
* bit j: 3 4
* 5 6 7
*/
for(i = 0; i < 8; i++) {
/* Neighbour does NOT contribute */
if ( (nb_byte & bit[i] ) == 0 ) continue;
/* Neighbour does contribute */
nb_pointer = lin_dxy[i] + lin_pointer;
if ( nb_pointer>0 && nb_pointer<=total_pixels)
ImageArray( nb_pointer, *v_p );
/* Next contrib pointer ... */
v_p++;
}
/* Increase counters */
sp_index++;
sp_pixels++;
current_pixel++;
/* Increase array pointers */
s_p++;
x_p++;
y_p++;
n_p++;
/* Decrease counters */
n_nb++;
nb_index--;
if ( nb_index == 0 || n_nb >= NB_SIZE ) goto NEXT_NB;
if ( current_pixel >= maximum_pixels ) {
xform_status = 3;
goto OUTPUT;
}
} /* End of loop 1: while ( sp_index < i_sp ) */
OUTPUT:
/*
* Output image when last record of nb_code reached.
*/
if ( xform_status == 3 || ( current_pixel >= maximum_pixels && stat_blocks_sent > 0) ) {
#ifdef DEBUG
if ( debug & 0x80 )
printf("debug (marxf): start of output image xf=%d current_pixel=%d (%d) block=%d\n",
xform_status,current_pixel,maximum_pixels,stat_blocks_sent);
#endif
if ( current_pixel < maximum_pixels ) {
current_pixel = maximum_pixels;
}
if (keep_spiral) {
i = ltell( fdspiral );
memset( (char *)spiral, 0, 8192);
while ( ltell( fdspiral ) < spiral_size )
i=write(fdspiral, spiral, 1*sizeof(short) );
}
output_image();
}
return;
}
1.7.3