X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/29c93cc57d2f7715c58b4e577440bc580a47bd8a..c2cf03332f51a9fa992220124635f737399fba91:/src/dem.c diff --git a/src/dem.c b/src/dem.c index 007a5353..461c2bdf 100644 --- a/src/dem.c +++ b/src/dem.c @@ -35,7 +35,6 @@ #ifdef HAVE_STDLIB_H #include #endif -#include #include #include #ifdef HAVE_UNISTD_H @@ -45,8 +44,10 @@ #include #include +#include "compression.h" #include "dem.h" -#include "file.h" +#include "coords.h" +#include "fileutils.h" /* Compatibility */ #if ! GLIB_CHECK_VERSION(2,22,0) @@ -251,78 +252,6 @@ static void dem_parse_block ( gchar *buffer, VikDEM *dem, gint *cur_column, gint } } -/* return size of unzip data or 0 if failed */ -/* can be made generic to uncompress zip, gzip, bzip2 data */ -static guint uncompress_data(void *uncompressed_buffer, guint uncompressed_size, void *compressed_data, guint compressed_size) -{ - z_stream stream; - int err; - - stream.next_in = compressed_data; - stream.avail_in = compressed_size; - stream.next_out = uncompressed_buffer; - stream.avail_out = uncompressed_size; - stream.zalloc = (alloc_func)0; - stream.zfree = (free_func)0; - stream.opaque = (voidpf)0; - - /* negative windowBits to inflateInit2 means "no header" */ - if ((err = inflateInit2(&stream, -MAX_WBITS)) != Z_OK) { - g_warning("%s(): inflateInit2 failed", __PRETTY_FUNCTION__); - return 0; - } - - err = inflate(&stream, Z_FINISH); - if ((err != Z_OK) && (err != Z_STREAM_END) && stream.msg) { - g_warning("%s() inflate failed err=%d \"%s\"", __PRETTY_FUNCTION__, err, stream.msg == NULL ? "unknown" : stream.msg); - inflateEnd(&stream); - return 0; - } - - inflateEnd(&stream); - return(stream.total_out); -} - -static void *unzip_hgt_file(gchar *zip_file, gulong *unzip_size) -{ - void *unzip_data = NULL; - gchar *zip_data; - struct _lfh { - guint32 sig; - guint16 extract_version; - guint16 flags; - guint16 comp_method; - guint16 time; - guint16 date; - guint32 crc_32; - guint32 compressed_size; - guint32 uncompressed_size; - guint16 filename_len; - guint16 extra_field_len; - } __attribute__ ((__packed__)) *local_file_header = NULL; - - - local_file_header = (struct _lfh *) zip_file; - if (local_file_header->sig != 0x04034b50) { - g_warning("%s(): wrong format", __PRETTY_FUNCTION__); - g_free(unzip_data); - goto end; - } - - zip_data = zip_file + sizeof(struct _lfh) + local_file_header->filename_len + local_file_header->extra_field_len; - unzip_data = g_malloc(local_file_header->uncompressed_size); - gulong uncompressed_size = local_file_header->uncompressed_size; - - if (!(*unzip_size = uncompress_data(unzip_data, uncompressed_size, zip_data, local_file_header->compressed_size))) { - g_free(unzip_data); - unzip_data = NULL; - goto end; - } - -end: - return(unzip_data); -} - static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basename, gboolean zip) { gint i, j; @@ -369,8 +298,9 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena void *unzip_mem = NULL; gulong ucsize; - if ((unzip_mem = unzip_hgt_file(dem_file, &ucsize)) == NULL) { + if ((unzip_mem = unzip_file(dem_file, &ucsize)) == NULL) { g_mapped_file_unref(mf); + g_ptr_array_foreach ( dem->columns, (GFunc)g_free, NULL ); g_ptr_array_free(dem->columns, TRUE); g_free(dem); return NULL; @@ -379,6 +309,8 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena dem_mem = unzip_mem; file_size = ucsize; } + else + dem_mem = (gint16 *)dem_file; if (file_size == (num_rows_3sec * num_rows_3sec * sizeof(gint16))) arcsec = 3; @@ -504,6 +436,7 @@ void vik_dem_free ( VikDEM *dem ) guint i; for ( i = 0; i < dem->n_columns; i++) g_free ( GET_COLUMN(dem, i)->points ); + g_ptr_array_foreach ( dem->columns, (GFunc)g_free, NULL ); g_ptr_array_free ( dem->columns, TRUE ); g_free ( dem ); }