static GwyContainer* sensofar_load(const gchar *filename, G_GNUC_UNUSED GwyRunType mode, GError **error) { SensofarDataDesc data_desc; GwyContainer *container = NULL; GwyDataField *dfield, *mfield; GwyGraphModel *gmodel; guchar *buffer = NULL; gsize size = 0; GError *err = NULL; const guchar *p; if (!gwy_file_get_contents(filename, &buffer, &size, &err)) { err_GET_FILE_CONTENTS(error, &err); return NULL; } if (size < HEADER_SIZE + 12) { g_set_error(error, GWY_MODULE_FILE_ERROR, GWY_MODULE_FILE_ERROR_DATA, _("File header is truncated")); gwy_file_abandon_contents(buffer, size, NULL); return NULL; } /* Date block */ p = buffer; memcpy(&data_desc.date.str, p, DATE_SIZE); data_desc.date.str[DATE_SIZE-1] = '\0'; p += DATE_SIZE; data_desc.date.t = gwy_get_guint32_le(&p); /* Comment block */ memcpy(&data_desc.user_comment, p, COMMENT_SIZE); data_desc.user_comment[COMMENT_SIZE-1] = '\0'; p += COMMENT_SIZE; /* Calbration block */ data_desc.axes_config.yres = gwy_get_guint32_le(&p); data_desc.axes_config.xres = gwy_get_guint32_le(&p); data_desc.axes_config.N_tall = gwy_get_guint32_le(&p); data_desc.axes_config.dy_multip = gwy_get_gfloat_le(&p); data_desc.axes_config.mppx = gwy_get_gfloat_le(&p); data_desc.axes_config.mppy = gwy_get_gfloat_le(&p); data_desc.axes_config.x_0 = gwy_get_gfloat_le(&p); data_desc.axes_config.y_0 = gwy_get_gfloat_le(&p); data_desc.axes_config.mpp_tall = gwy_get_gfloat_le(&p); data_desc.axes_config.z_0 = gwy_get_gfloat_le(&p); /* Measurement block */ data_desc.measure_config.type = gwy_get_guint32_le(&p); data_desc.measure_config.algorithm = gwy_get_guint32_le(&p); data_desc.measure_config.method = gwy_get_guint32_le(&p); data_desc.measure_config.objective = gwy_get_guint32_le(&p); data_desc.measure_config.area = gwy_get_guint32_le(&p); data_desc.measure_config.xres_area = gwy_get_guint32_le(&p); data_desc.measure_config.yres_area = gwy_get_guint32_le(&p); data_desc.measure_config.xres = gwy_get_guint32_le(&p); data_desc.measure_config.yres = gwy_get_guint32_le(&p); data_desc.measure_config.na = gwy_get_guint32_le(&p); data_desc.measure_config.incr_z = gwy_get_gdouble_le(&p); data_desc.measure_config.range = gwy_get_gfloat_le(&p); data_desc.measure_config.n_planes = gwy_get_guint32_le(&p); data_desc.measure_config.tpc_umbral_F = gwy_get_guint32_le(&p); data_desc.measure_config.restore = gwy_get_gboolean8(&p); data_desc.measure_config.num_layers = *(p++); data_desc.measure_config.version = *(p++); data_desc.measure_config.config_hardware = *(p++); data_desc.measure_config.stack_im_num = *(p++); data_desc.measure_config.reserved = *(p++); p += 2; // struct padding data_desc.measure_config.factor_delmacio = gwy_get_guint32_le(&p); gwy_debug("File date=<%s>, data type=%d, xres=%d, yres=%d, version=%d", data_desc.date.str, data_desc.measure_config.type, data_desc.measure_config.xres, data_desc.measure_config.yres, data_desc.measure_config.version); switch (data_desc.measure_config.type) { case MES_TOPO: case MES_IMATGE: dfield = sensofar_read_data_field(&data_desc, &mfield, &p, size - (p - buffer), error); if (!dfield) { gwy_file_abandon_contents(buffer, size, NULL); return NULL; } container = gwy_container_new(); gwy_container_set_object(container, gwy_app_get_data_key_for_id(0), dfield); g_object_unref(dfield); if (mfield) { gwy_container_set_object(container, gwy_app_get_mask_key_for_id(0), mfield); g_object_unref(mfield); } gwy_app_channel_title_fall_back(container, 0); break; case MES_PERFIL: case MES_GRUIX: gmodel = sensofar_read_profile(&data_desc, &p, size - (p - buffer), error); if (!gmodel) { gwy_file_abandon_contents(buffer, size, NULL); return NULL; } container = gwy_container_new(); gwy_container_set_object(container, gwy_app_get_graph_key_for_id(0), gmodel); g_object_unref(gmodel); break; default: err_DATA_TYPE(error, data_desc.measure_config.type); break; } return container; }
static void jeol_read_image_header(const guchar *p, JEOLImageHeader *header) { p += TIFF_HEADER_SIZE; header->winspm_version = gwy_get_guint16_le(&p); gwy_debug("version: %u", header->winspm_version); p += 80; /* there isn't anything interesting in internal_filename_old */ header->xres = gwy_get_guint16_le(&p); header->yres = gwy_get_guint16_le(&p); header->xreal = gwy_get_gfloat_le(&p); header->yreal = gwy_get_gfloat_le(&p); gwy_debug("res: (%d,%d), real: (%g,%g)", header->xres, header->yres, header->xreal, header->yreal); header->z0 = gwy_get_gfloat_le(&p); header->z255 = gwy_get_gfloat_le(&p); header->adc_min = gwy_get_guint16_le(&p); header->adc_max = gwy_get_guint16_le(&p); header->initial_scan_scale = gwy_get_gfloat_le(&p); get_CHARARRAY0(header->internal_filename, &p); get_CHARARRAY0(header->info[0], &p); get_CHARARRAY0(header->info[1], &p); get_CHARARRAY0(header->info[2], &p); get_CHARARRAY0(header->info[3], &p); get_CHARARRAY0(header->info[4], &p); get_CHARARRAY(header->history, &p); header->has_current_info = gwy_get_guint16_le(&p); header->bias = gwy_get_gfloat_le(&p); gwy_debug("bias: %g", header->bias); header->reference_value = gwy_get_gfloat_le(&p); gwy_debug("reference_value: %g", header->reference_value); p += 2; /* reserved */ header->measurement_date.day = *(p++); header->measurement_date.month = *(p++); header->measurement_date.year_1980 = gwy_get_guint16_le(&p); header->measurement_date.weekday_sun = *(p++); header->save_date.day = *(p++); header->save_date.month = *(p++); header->save_date.year_1980 = gwy_get_guint16_le(&p); header->save_date.weekday_sun = *(p++); header->measurement_time.hour = *(p++); header->measurement_time.minute = *(p++); header->measurement_time.second= *(p++); header->measurement_time.second_100 = *(p++); header->save_time.hour = *(p++); header->save_time.minute = *(p++); header->save_time.second= *(p++); header->save_time.second_100 = *(p++); p += 0x100; /* lookup table */ header->fft_offset = gwy_get_guint32_le(&p); header->transform_off = gwy_get_guint16_le(&p); p += 8; /* extra */ header->compressed = gwy_get_gboolean8(&p); header->bpp = *(p++); gwy_debug("bpp: %d", header->bpp); header->cits_offset = gwy_get_guint32_le(&p); header->backscan_tip_voltage = gwy_get_gfloat_le(&p); header->sts_point_x = gwy_get_guint16_le(&p); header->sts_point_y = gwy_get_guint16_le(&p); p += 20; /* reserved */ header->tip_speed_x = gwy_get_gfloat_le(&p); header->tip_speed_y = gwy_get_gfloat_le(&p); p += 42; /* piezo_sensitivity */ header->spm_param.clock = gwy_get_gfloat_le(&p); header->spm_param.rotation = gwy_get_gfloat_le(&p); header->spm_param.feedback_filter = gwy_get_gfloat_le(&p); header->spm_param.present_filter = gwy_get_gfloat_le(&p); header->spm_param.head_amp_gain = gwy_get_gfloat_le(&p); header->spm_param.loop_gain = gwy_get_guint16_le(&p); header->spm_param.x_off = gwy_get_gfloat_le(&p); header->spm_param.y_off = gwy_get_gfloat_le(&p); header->spm_param.z_gain = gwy_get_gfloat_le(&p); header->spm_param.z_off = gwy_get_gfloat_le(&p); header->spm_param.o_gain = gwy_get_gfloat_le(&p); header->spm_param.o_off = gwy_get_gfloat_le(&p); gwy_debug("z_gain: %g o_gain: %g", header->spm_param.z_gain, header->spm_param.o_gain); header->spm_param.back_scan_bias = gwy_get_gfloat_le(&p); /* XXX: This does not match what the documentation says, there seems to be * a four-byte quantity missing between back_scan_bias and mode (the size * of SPM params struct is also 4 bytes shorter than the space alloted for * it). */ p += 4; /* whatever */ header->spm_param.mode = gwy_get_guint32_le(&p); gwy_debug("mode: %d", header->spm_param.mode); p += 2; /* reserved */ header->montage_offset = gwy_get_guint32_le(&p); get_CHARARRAY0(header->image_location, &p); p += 2*4; /* reserved */ header->spm_misc_param.dds_frequency = gwy_get_gfloat_le(&p); header->spm_misc_param.dds_low_filter = gwy_get_guint16_le(&p); header->spm_misc_param.dds_high_filter = gwy_get_guint16_le(&p); header->spm_misc_param.dds_center_filter = gwy_get_guint16_le(&p); header->spm_misc_param.dds_enable = gwy_get_guint16_le(&p); header->spm_misc_param.scan_filter = gwy_get_guint16_le(&p); header->spm_misc_param.afm_mode = gwy_get_guint32_le(&p); gwy_debug("afm_mode: 0x%x", header->spm_misc_param.afm_mode); header->spm_misc_param.slope_gain = gwy_get_guint32_le(&p); header->spm_misc_param.x_addition_signal = gwy_get_guint16_le(&p); header->spm_misc_param.y_addition_signal = gwy_get_guint16_le(&p); header->spm_misc_param.z_addition_signal = gwy_get_guint16_le(&p); header->spm_misc_param.bias_addition_signal = gwy_get_guint16_le(&p); header->spm_misc_param.active_dialog = gwy_get_guint32_le(&p); header->spm_misc_param.spm_mode = gwy_get_guint32_le(&p); gwy_debug("spm_mode: 0x%x", header->spm_misc_param.spm_mode); header->spm_misc_param.measurement_signal = gwy_get_guint32_le(&p); gwy_debug("signal: 0x%x", header->spm_misc_param.measurement_signal); header->spm_misc_param.phase_vco_scan = gwy_get_guint16_le(&p); header->spm_misc_param.sps_mode = gwy_get_guint32_le(&p); header->spm_misc_param.dds_amplitude = gwy_get_gdouble_le(&p); header->spm_misc_param.dds_center_locked_freq = gwy_get_gdouble_le(&p); header->spm_misc_param.dds_phase_shift = gwy_get_gfloat_le(&p); header->spm_misc_param.dds_high_gain = gwy_get_guint16_le(&p); header->spm_misc_param.dds_phase_polarity = gwy_get_guint16_le(&p); header->spm_misc_param.dds_pll_excitation = gwy_get_guint16_le(&p); header->spm_misc_param.dds_external = gwy_get_guint16_le(&p); header->spm_misc_param.dds_rms_filter = gwy_get_guint32_le(&p); header->spm_misc_param.dds_pll_loop_gain = gwy_get_guint32_le(&p); header->spm_misc_param.dds_beat_noise = gwy_get_guint32_le(&p); header->spm_misc_param.dds_dynamic_range = gwy_get_guint32_le(&p); header->spm_misc_param.cantilever_peak_freq = gwy_get_guint32_le(&p); header->spm_misc_param.cantilever_q_factor = gwy_get_guint32_le(&p); p += 10; /* reserved */ p += 0x300; /* RGB lookup table */ header->sub_revision_no = gwy_get_guint32_le(&p); header->image_type = gwy_get_guint32_le(&p); gwy_debug("image_type: %d", header->image_type); header->data_source = gwy_get_guint32_le(&p); gwy_debug("data_source: %d", header->data_source); header->display_mode = gwy_get_guint32_le(&p); p += 2*8; /* measurement_start_time, measurement_end_time */ p += 254; /* profile_roughness */ p += 446; /* settings_3d */ header->lut_brightness = gwy_get_gfloat_le(&p); header->lut_contrast = gwy_get_gfloat_le(&p); header->software_version = gwy_get_guint16_le(&p); header->software_subversion = gwy_get_guint32_le(&p); p += 20; /* extracted_region */ header->lut_gamma = gwy_get_gfloat_le(&p); header->n_of_sps = gwy_get_guint16_le(&p); header->sps_offset = gwy_get_guint32_le(&p); header->line_trace_end_x = gwy_get_guint16_le(&p); header->line_trace_end_y = gwy_get_guint16_le(&p); header->forward = gwy_get_guint16_le(&p); gwy_debug("forward: %d", header->forward); header->lift_signal = gwy_get_guint16_le(&p); /* stuff... */ }