diff options
Diffstat (limited to 'src/intcgm/sism.c')
-rw-r--r-- | src/intcgm/sism.c | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/intcgm/sism.c b/src/intcgm/sism.c new file mode 100644 index 0000000..9946ac3 --- /dev/null +++ b/src/intcgm/sism.c @@ -0,0 +1,392 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> +#include <math.h> +#include <limits.h> +#include <float.h> + +#include <cd.h> + +#include "list.h" +#include "types.h" +#include "intcgm.h" +#include "intcgm2.h" +#include "intcgm6.h" + +static tpoint trace_start_pos, base_direction, amp_direction, trace_direction; +static double bline_sc_f, amp_sc_f, trc_st_f, VA_bline_offset, pos_clp_lmt, + neg_clp_lmt, pos_bckfil_bnd, neg_bckfil_bnd; +static int trace_dsp_md, samp_type, n_samp, wig_trc_mod, nul_clr_i, n_trace; +static double *sample; +static long *coind; +static int trace=0; + +void cgm_sism4 ( tpoint *pt, char *data_rec ) +{ + sscanf ( data_rec, "%lg %lg %lg %lg %lg %lg %d %d %d %lg %lg %*d %d %d %d", + &bline_sc_f, &_sc_f, &trc_st_f, &VA_bline_offset, &pos_clp_lmt, + &neg_clp_lmt, &trace_dsp_md, &samp_type, &n_samp, &pos_bckfil_bnd, + &neg_bckfil_bnd, &wig_trc_mod, &nul_clr_i, &n_trace ); + + trace_start_pos = pt[0]; + base_direction = pt[1]; + amp_direction = pt[2]; + trace_direction = pt[3]; + trace = 0; +} + +/* adjust the samples to the amplitude direction vector */ +static void dirvet ( double dx ) +{ + int i; + + for ( i=0; i<n_samp; i++ ) + sample[i] *= dx/fabs(dx); +} + +/* adust the x offset from the baseline to maximum amplitude */ +static void ampscf ( double dx ) +{ + double max=1; + int i; + + if ( samp_type == 0 || samp_type == 4 ) max = (double) SHRT_MAX; + else if ( samp_type == 1 ) max = (double) INT_MAX; + else if ( samp_type == 2 ) max = (double) FLT_MAX; + else if ( samp_type == 3 || samp_type == 5 ) max = (double) SCHAR_MAX; + + for ( i=0; i<n_samp; i++ ) + sample[i] = (sample[i]/max) * amp_sc_f * dx; +} + +static double interpl ( int i, double y1, double y2, double x ) +{ + return ( y1*(x-sample[i+1]) + y2*(sample[i]-x) ) / ( sample[i]-sample[i+1] ); +} + +static void vasamp ( int mode, double max, double min, int cordep ) +{ + double factx, facty; + double x[5], y[5]; + double samp1, samp2, mn, mx; + long int cor; + int i,j,n; + + facty = base_direction.y * bline_sc_f; + factx = trace_direction.x * trc_st_f; + + max *= amp_sc_f; + min *= amp_sc_f; + mn = min; + mx = max; + + if ( mode==64 ) + { + double tmp = min; + min = max; + max = tmp; + mn = min * -1.; + mx = max * -1.; + } + + for ( i=0; i<(n_samp-1); i++ ) + { + double y1 = trace_start_pos.y + facty*(i); + double y2 = trace_start_pos.y + facty*(i+1); + double dx = trace_start_pos.x + factx*(trace-1); + + samp1 = sample[i]; + samp2 = sample[i+1]; + + if ( mode==64 ) + { + samp1 *= -1.; + samp2 *= -1.; + } + + n=0; + + if (samp1<mn && samp2>mn && samp2<mx) + { + x[n] = min + dx; + y[n++] = interpl(i,y1,y2,min); + x[n] = sample[i+1] + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if (samp1<mn && samp2>mx) + { + x[n] = min + dx; + y[n++] = interpl(i,y1,y2,min); + x[n] = max + dx; + y[n++] = interpl(i,y1,y2,max); + x[n] = max + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if ( (samp1>mn && samp1<mx) && + (samp2>mn && samp2<mx) ) + { + x[n] = min + dx; + y[n++] = y1; + x[n] = sample[i] + dx; + y[n++] = y1; + x[n] = sample[i+1] + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if ( samp1>mn && samp1<mx && samp2>mx ) + { + x[n] = min + dx; + y[n++] = y1; + x[n] = sample[i] + dx; + y[n++] = y1; + x[n] = max + dx; + y[n++] = interpl(i,y1,y2,max); + x[n] = max + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if ( samp1>mx && samp2>mx ) + { + x[n] = min + dx; + y[n++] = y1; + x[n] = max + dx; + y[n++] = y1; + x[n] = max + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if ( samp1>mx && samp2<mx && samp2>mn ) + { + x[n] = min + dx; + y[n++] = y1; + x[n] = max + dx; + y[n++] = y1; + x[n] = max + dx; + y[n++] = interpl(i,y1,y2,max); + x[n] = sample[i+1] + dx; + y[n++] = y2; + x[n] = min + dx; + y[n++] = y2; + } + + else if ( samp1>mn && samp1<mx && samp2<mn ) + { + x[n] = min + dx; + y[n++] = y1; + x[n] = sample[i] + dx; + y[n++] = y1; + x[n] = min + dx; + y[n++] = interpl(i,y1,y2,min); + } + + if ( n>0 ) + { + if ( cordep ) + { + cor = cdEncodeColor ( (unsigned char)((intcgm_color_table[coind[i]].red*255)/intcgm_cgm.color_ext.white.red), + (unsigned char)((intcgm_color_table[coind[i]].green*255)/intcgm_cgm.color_ext.white.green), + (unsigned char)((intcgm_color_table[coind[i]].blue*255)/intcgm_cgm.color_ext.white.blue) ); + cdCanvasSetForeground (intcgm_canvas, cor ); + } + + cdCanvasBegin(intcgm_canvas, CD_FILL ); + + for ( j=0; j<n; j++ ) + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(x[j]), cgm_vdcy2canvas(y[j]) ); + + cdCanvasEnd(intcgm_canvas); + } + } +} + +static void bgclfl ( int mode ) +{ + double factx, facty; + double posdx, negdx; + long int cor; + int i; + + facty = base_direction.y * bline_sc_f; + factx = trace_direction.x * trc_st_f; + + posdx = pos_bckfil_bnd * amp_sc_f * amp_direction.x; + negdx = neg_bckfil_bnd * amp_sc_f * amp_direction.x; + + cdCanvasInteriorStyle(intcgm_canvas, CD_SOLID ); + + for ( i=0; i<n_samp; i++ ) + { + int index = ( coind[i] <= intcgm_cgm.max_cix ) ? coind[i] : 1; + + cor = cdEncodeColor ( (unsigned char)((intcgm_color_table[index].red*255)/intcgm_cgm.color_ext.white.red), + (unsigned char)((intcgm_color_table[index].green*255)/intcgm_cgm.color_ext.white.green), + (unsigned char)((intcgm_color_table[index].blue*255)/intcgm_cgm.color_ext.white.blue) ); + cdCanvasSetForeground (intcgm_canvas, cor ); + + cdCanvasBegin(intcgm_canvas, CD_FILL ); + + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posdx + trace_start_pos.x + factx*(trace-1)), + cgm_vdcy2canvas(trace_start_pos.y + facty*(i)) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posdx + trace_start_pos.x + factx*(trace-1)), + cgm_vdcy2canvas(trace_start_pos.y + facty*(i+1)) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negdx + trace_start_pos.x + factx*(trace-1)), + cgm_vdcy2canvas(trace_start_pos.y + facty*(i+1)) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negdx + trace_start_pos.x + factx*(trace-1)), + cgm_vdcy2canvas(trace_start_pos.y + facty*(i)) ); + + cdCanvasEnd(intcgm_canvas); + } +} + +void wiggle ( double posclp, double negclp ) +{ + int i; + double facty = base_direction.y * bline_sc_f; + double factx = trace_direction.x * trc_st_f; + double dx = trace_start_pos.x + factx*(trace-1); + + posclp *= amp_sc_f; + negclp *= amp_sc_f; + + cdCanvasBegin(intcgm_canvas, CD_OPEN_LINES ); + + for ( i=0; i<n_samp; i++ ) + { + double y1 = trace_start_pos.y + facty*(i); + double y2 = trace_start_pos.y + facty*(i+1); + + if ( sample[i]>negclp && sample[i]<posclp && + sample[i+1]>negclp && sample[i+1]<posclp ) + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(sample[i] + dx), cgm_vdcy2canvas(y1) ); + else if ( sample[i]<negclp && sample[i+1]>negclp && sample[i+1]<posclp ) + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,negclp)) ); + else if ( sample[i]<negclp && sample[i+1]>posclp ) + { + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,negclp)) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,posclp)) ); + } + else if ( sample[i]>negclp && sample[i]<posclp && sample[i+1]>posclp ) + { + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(sample[i] + dx), cgm_vdcy2canvas(y1) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,posclp)) ); + } + else if ( sample[i]>posclp && sample[i+1]<posclp && sample[i+1]>negclp ) + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,posclp)) ); + else if ( sample[i]>posclp && sample[i+1]<negclp ) + { + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(posclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,posclp)) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,negclp)) ); + } + else if ( sample[i]>negclp && sample[i]<posclp && sample[i+1]<negclp ) + { + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(sample[i] + dx), cgm_vdcy2canvas(y1) ); + cdCanvasVertex (intcgm_canvas, cgm_vdcx2canvas(negclp + dx), cgm_vdcy2canvas(interpl(i,y1,y2,negclp)) ); + } + } + + cdCanvasEnd(intcgm_canvas); +} + +void cgm_sism5 ( char *data_rec ) +{ + int i, mode, trace_mode; + double pos_clp, neg_clp; + + sample = (double *) malloc ( n_samp*sizeof(double) ); + + if ( trace_dsp_md > 7 ) + coind = (long *) malloc ( n_samp*sizeof(long) ); + + for ( i=0; i<n_samp; i++ ) + if ( trace_dsp_md < 8 ) + sample[i] = strtod ( data_rec, &data_rec ); + else + { + sample[i] = (double) strtol ( data_rec, &data_rec, 10 ); + coind[i] = strtol ( data_rec, &data_rec, 10 ); + } + + trace += 1; + + dirvet ( amp_direction.x ); + + ampscf ( amp_direction.x ); + + trace_mode = trace_dsp_md; + + do + { + + if ( trace_mode >= 64 ) + mode = 64; + else if ( trace_mode >= 32 ) + mode = 32; + else if ( trace_mode >= 16 ) + mode = 16; + else if ( trace_mode >= 8 ) + mode = 8; + else if ( trace_mode >= 4 ) + mode = 4; + else if ( trace_mode >= 2 ) + mode = 2; + else if ( trace_mode == 1 ) + mode = 1; + + switch ( mode ) + { + case 64: + neg_clp = neg_clp_lmt; + pos_clp = ( pos_clp_lmt < 0 ) ? pos_clp_lmt : 0; + vasamp ( mode, pos_clp, neg_clp, 1 ); + trace_mode -= 64; + break; + case 32: + neg_clp = ( neg_clp_lmt > 0 ) ? neg_clp_lmt : 0; + pos_clp = pos_clp_lmt; + vasamp ( mode, pos_clp, neg_clp, 1 ); + trace_mode -= 32; + break; + case 16: + bgclfl( mode ); + trace_mode -= 16; + break; + case 8: + bgclfl( mode ); + trace_mode -= 8; + break; + case 4: + neg_clp = ( neg_clp_lmt > 0 ) ? neg_clp_lmt : 0; + pos_clp = pos_clp_lmt; + vasamp ( mode, pos_clp, neg_clp, 0 ); + trace_mode -= 4; + break; + case 2: + neg_clp = ( neg_clp_lmt > 0 ) ? neg_clp_lmt : 0; + pos_clp = pos_clp_lmt; + vasamp ( mode, pos_clp, neg_clp, 0 ); + trace_mode -= 2; + break; + case 1: + wiggle ( pos_clp_lmt, neg_clp_lmt ); + trace_mode -= 1; + break; + } + } while ( trace_mode != 0 ); + + free(sample); + + if ( trace_dsp_md > 7 ) + free(coind); +} |