@@ -3257,7 +3257,7 @@ static int scaled_standard_header_cdp(
32573257 const segy_entry_definition * map ,
32583258 int cdp_offset ,
32593259 int scalar_offset ,
3260- float * cdp
3260+ double * cdp
32613261) {
32623262
32633263 segy_field_data fd = {0 };
@@ -3294,39 +3294,86 @@ static int scaled_standard_header_cdp(
32943294 return SEGY_OK ;
32953295}
32963296
3297- static int scaled_cdp (
3297+ static int scaled_ext1_header_cdp (
3298+ const char * header ,
3299+ const segy_entry_definition * map ,
3300+ int cdp_offset ,
3301+ double * cdp
3302+ ) {
3303+
3304+ segy_field_data fd = { 0 };
3305+ int err = segy_get_tracefield ( header , map , cdp_offset , & fd );
3306+ if ( err != SEGY_OK ) return err ;
3307+
3308+ switch ( fd .entry_type ) {
3309+ case SEGY_ENTRY_TYPE_IEEE64 :
3310+ * cdp = fd .value .f64 ;
3311+ return SEGY_OK ;
3312+ break ;
3313+ default :
3314+ return SEGY_INVALID_FIELD_DATATYPE ;
3315+ }
3316+ }
3317+
3318+ static int scaled_cdp_in_dimension (
32983319 segy_datasource * ds ,
32993320 int traceno ,
3300- float * cdpx ,
3301- float * cdpy
3321+ int dimension_standard_name ,
3322+ int dimension_ext1_name ,
3323+ double * cdp
33023324) {
33033325
33043326 char trheader [SEGY_TRACE_HEADER_SIZE ];
33053327
3306- int err = segy_read_standard_traceheader ( ds , traceno , trheader );
3307- if ( err != 0 ) return err ;
3328+ const segy_entry_definition * ext1_map =
3329+ ds -> traceheader_mapping_extension1 .offset_to_entry_definition ;
3330+ const int cdp_ext1_offset =
3331+ ds -> traceheader_mapping_extension1 .name_to_offset [dimension_ext1_name ];
3332+
3333+ if ( ext1_map [cdp_ext1_offset - 1 ].entry_type != SEGY_ENTRY_TYPE_UNDEFINED ) {
3334+ int err = segy_read_traceheader ( ds , traceno , 1 , ext1_map , trheader );
3335+ if ( err != SEGY_OK ) return err ;
3336+
3337+ err = scaled_ext1_header_cdp (
3338+ trheader , ext1_map , cdp_ext1_offset , cdp
3339+ );
3340+ if ( err != SEGY_OK ) return err ;
3341+ if ( * cdp != 0 || !ext1_map [cdp_ext1_offset - 1 ].requires_nonzero_value ) {
3342+ return SEGY_OK ;
3343+ }
3344+ }
33083345
33093346 const segy_entry_definition * standard_map =
33103347 ds -> traceheader_mapping_standard .offset_to_entry_definition ;
33113348
3312- const int cdp_x_offset =
3313- ds -> traceheader_mapping_standard .name_to_offset [SEGY_TR_CDP_X ];
3314- const int cdp_y_offset =
3315- ds -> traceheader_mapping_standard .name_to_offset [SEGY_TR_CDP_Y ];
3349+ const int cdp_standard_offset =
3350+ ds -> traceheader_mapping_standard .name_to_offset [dimension_standard_name ];
33163351 const int scalar_offset =
33173352 ds -> traceheader_mapping_standard .name_to_offset [SEGY_TR_SOURCE_GROUP_SCALAR ];
33183353
3319- err = scaled_standard_header_cdp (
3320- trheader , standard_map , cdp_x_offset , scalar_offset , cdpx
3321- );
3354+ int err = segy_read_standard_traceheader ( ds , traceno , trheader );
33223355 if ( err != SEGY_OK ) return err ;
33233356
33243357 err = scaled_standard_header_cdp (
3325- trheader , standard_map , cdp_y_offset , scalar_offset , cdpy
3358+ trheader , standard_map , cdp_standard_offset , scalar_offset , cdp
33263359 );
33273360 return err ;
33283361}
33293362
3363+ static int scaled_cdp (
3364+ segy_datasource * ds ,
3365+ int traceno ,
3366+ double * cdpx ,
3367+ double * cdpy
3368+ ) {
3369+ int err ;
3370+ err = scaled_cdp_in_dimension ( ds , traceno , SEGY_TR_CDP_X , SEGY_EXT1_CDP_X , cdpx );
3371+ if ( err != SEGY_OK ) return err ;
3372+
3373+ err = scaled_cdp_in_dimension ( ds , traceno , SEGY_TR_CDP_Y , SEGY_EXT1_CDP_Y , cdpy );
3374+ return err ;
3375+ }
3376+
33303377int segy_rotation_cw ( segy_datasource * ds ,
33313378 int line_length ,
33323379 int stride ,
@@ -3335,7 +3382,7 @@ int segy_rotation_cw( segy_datasource* ds,
33353382 int linenos_sz ,
33363383 float * rotation ) {
33373384
3338- struct coord { float x , y ; } nw , sw ;
3385+ struct coord { double x , y ; } nw , sw ;
33393386
33403387 int err ;
33413388 int traceno ;
@@ -3355,8 +3402,8 @@ int segy_rotation_cw( segy_datasource* ds,
33553402 err = scaled_cdp ( ds , traceno , & nw .x , & nw .y );
33563403 if ( err != 0 ) return err ;
33573404
3358- float x = nw .x - sw .x ;
3359- float y = nw .y - sw .y ;
3405+ double x = nw .x - sw .x ;
3406+ double y = nw .y - sw .y ;
33603407 double radians = x || y ? atan2 ( x , y ) : 0 ;
33613408 if ( radians < 0 ) radians += 2 * acos (-1 );
33623409
0 commit comments