diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/GipfelWidget.H | 3 | ||||
-rw-r--r-- | src/GipfelWidget.cxx | 94 | ||||
-rw-r--r-- | src/Hill.H | 3 | ||||
-rw-r--r-- | src/ImageMetaData.H | 1 | ||||
-rw-r--r-- | src/ImageMetaData.cxx | 12 | ||||
-rw-r--r-- | src/Panorama.H | 2 | ||||
-rw-r--r-- | src/Panorama.cxx | 4 | ||||
-rw-r--r-- | src/gipfel.cxx | 90 |
8 files changed, 179 insertions, 30 deletions
diff --git a/src/GipfelWidget.H b/src/GipfelWidget.H index 45bfaee..435c9be 100644 --- a/src/GipfelWidget.H +++ b/src/GipfelWidget.H @@ -22,6 +22,7 @@ class GipfelWidget : public Fl_Widget { Fl_Menu_Button *mb; char *img_file; double track_width; + int have_gipfel_info; ImageMetaData *md; int show_hidden; @@ -61,6 +62,8 @@ class GipfelWidget : public Fl_Widget { int save_image(char *file); + int export_hills(const char *file, FILE *fp); + const char * get_image_filename(); int load_data(const char *file); diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index f9b5d21..8590b5c 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -50,6 +50,7 @@ GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { img_file = NULL; track_width = 200.0; show_hidden = 0; + have_gipfel_info = 0; md = new ImageMetaData(); track_points = NULL; fl_register_images(); @@ -58,6 +59,7 @@ GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { int GipfelWidget::load_image(char *file) { Fl_Image *new_img; + double direction, nick, tilt, fl; new_img = new Fl_JPEG_Image(file); @@ -90,11 +92,40 @@ GipfelWidget::load_image(char *file) { set_view_long(md->get_longitude()); set_view_lat(md->get_latitude()); set_view_height(md->get_height()); - set_center_angle(md->get_direction()); - set_nick_angle(md->get_nick()); - set_tilt_angle(md->get_tilt()); set_projection((ProjectionLSQ::Projection_t) md->get_projection_type()); - set_focal_length_35mm(md->get_focal_length_35mm()); + + have_gipfel_info = 1; + direction = md->get_direction(); + if (isnan(direction)) { + set_center_angle(0.0); + have_gipfel_info = 0; + } else { + set_center_angle(direction); + } + + nick = md->get_nick(); + if (isnan(nick)) { + set_nick_angle(0.0); + have_gipfel_info = 0; + } else { + set_nick_angle(nick); + } + + tilt = md->get_tilt(); + if (isnan(tilt)) { + set_tilt_angle(0.0); + have_gipfel_info = 0; + } else { + set_tilt_angle(tilt); + } + + fl = md->get_focal_length_35mm(); + if (isnan(fl)) { + set_focal_length_35mm(35.0); + have_gipfel_info = 0; + } else { + set_focal_length_35mm(fl); + } // try to get distortion parameters in the following ordering: // 1. gipfel data in JPEG comment @@ -166,7 +197,7 @@ GipfelWidget::load_data(const char *file) { int GipfelWidget::load_track(const char *file) { if (track_points) { - pan->remove_trackpoints(); + pan->remove_hills(Hill::TRACK_POINT); track_points->clobber(); delete track_points; } @@ -675,6 +706,59 @@ GipfelWidget::handle(int event) { } int +GipfelWidget::export_hills(const char *file, FILE *fp) { + Hills export_hills, *mnts; + + if (!have_gipfel_info) { + fprintf(stderr, "No gipfel info available for %s.\n", img_file); + return 0; + } + + if (file) { + if (export_hills.load(file) != 0) { + return 1; + } + + for (int i=0; i<export_hills.get_num(); i++) { + export_hills.get(i)->flags |= Hill::EXPORT; + } + + pan->add_hills(&export_hills); + } + + fprintf(fp, "#\n# name\theight\tx\ty\tdistance\tflags\n#\n"); + + mnts = pan->get_visible_mountains(); + for (int i=0; i<mnts->get_num(); i++) { + Hill *m = mnts->get(i); + char *flags; + int _x = (int) rint(m->x) + w() / 2; + int _y = (int) rint(m->y) + h() / 2; + + if (m->flags & Hill::DUPLICATE || file && !(m->flags & Hill::EXPORT)) { + continue; + } + + if (_x < 0 || _x > w() || _y < 0 || _y > h()) { + continue; + } + + if (m->flags & Hill::HIDDEN) { + flags = "HIDDEN"; + } else { + flags = ""; + } + fprintf(fp, "%s\t%d\t%d\t%d\t%d\t%s\n", + m->name, (int) rint(m->height), _x, _y, + (int) rint(pan->get_real_distance(m)), flags); + } + + pan->remove_hills(Hill::EXPORT); + + return 0; +} + +int GipfelWidget::get_pixel(GipfelWidget::sample_mode_t m, double a_alph, double a_nick, int *r, int *g, int *b) { double px, py; @@ -18,7 +18,8 @@ class Hill { DUPLICATE = 0x01, TRACK_POINT = 0x02, VISIBLE = 0x04, - HIDDEN = 0x08 + HIDDEN = 0x08, + EXPORT = 0x10, } flags_t; double phi, lam; diff --git a/src/ImageMetaData.H b/src/ImageMetaData.H index 90b13c9..a305415 100644 --- a/src/ImageMetaData.H +++ b/src/ImageMetaData.H @@ -24,6 +24,7 @@ class ImageMetaData { double focal_length_35mm; double scale; int projection_type; + int have_gipfel_info; int load_image_jpgcom(char *name); int save_image_jpgcom(char *in_img, char *out_img); diff --git a/src/ImageMetaData.cxx b/src/ImageMetaData.cxx index 2693851..0fa95d4 100644 --- a/src/ImageMetaData.cxx +++ b/src/ImageMetaData.cxx @@ -51,20 +51,12 @@ ImageMetaData::clear() { int ImageMetaData::load_image(char *name) { - int ret; - clear(); - ret = load_image_jpgcom(name); - + load_image_jpgcom(name); load_image_exif(name); // fill missing values from exif data - if (isnan(direction)) direction = 0.0; - if (isnan(nick)) nick = 0.0; - if (isnan(tilt)) tilt = 0.0; - if (isnan(focal_length_35mm)) focal_length_35mm = 35.0; - - return ret; + return 0; } int diff --git a/src/Panorama.H b/src/Panorama.H index d5ebb37..86bf447 100644 --- a/src/Panorama.H +++ b/src/Panorama.H @@ -66,7 +66,7 @@ class Panorama { void add_hills(Hills *h); - void remove_trackpoints(); + void remove_hills(int flags); int set_viewpoint(const char *pos); diff --git a/src/Panorama.cxx b/src/Panorama.cxx index 516b688..1f13c21 100644 --- a/src/Panorama.cxx +++ b/src/Panorama.cxx @@ -67,13 +67,13 @@ Panorama::add_hills(Hills *h) { } void -Panorama::remove_trackpoints() { +Panorama::remove_hills(int flags) { Hills *h_new = new Hills(); Hill *m; for(int i=0; i<mountains->get_num(); i++) { m = mountains->get(i); - if (! (m->flags & Hill::TRACK_POINT)) { + if (! (m->flags & flags)) { h_new->add(m); } } diff --git a/src/gipfel.cxx b/src/gipfel.cxx index 746cfb5..bc6b050 100644 --- a/src/gipfel.cxx +++ b/src/gipfel.cxx @@ -59,6 +59,9 @@ static int stitch(GipfelWidget::sample_mode_t m , int b_16, int stitch_w, int stitch_h, double from, double to, int type, const char *path, int argc, char **argv); +static int export_hills(const char *export_file, double visibility); +static int export_position(); + void set_values() { double k0 = 0.0, k1 = 0.0, x0 = 0.0; @@ -259,13 +262,15 @@ void fill_menubar(Fl_Menu_Bar* mb) { void usage() { fprintf(stderr, - "usage: gipfel [-v <viewpoint>] [-d <datafile>]\n" - " [-s] [-j <outfile>] [-t <outdir] [-w <width>] [-h <height>]\n" + "usage: gipfel [-v <viewpoint>] [-d <file>]\n" + " [-s] [-j <file>] [-t <dir] [-w <width>] [-h <height>]\n" + " [-e <file>] [-E] [-p]\n" " [<image(s)>]\n" " -v <viewpoint> Set point from which the picture was taken.\n" " This must be a string that unambiguously \n" " matches the name of an entry in the data file.\n" - " -d <datafile> Use <datafile> for GPS data.\n" + " -d <file> Use <file> for GPS data.\n" + " -V <visibility> Set initial visibility.\n" " -u <k0>,<k1> Use distortion correction values k0,k1.\n" " -s Stitch mode.\n" " -4 Create 16bit output (only with TIFF stitching).\n" @@ -273,8 +278,11 @@ void usage() { " -b Use bilinear interpolation for stitching.\n" " -w <width> Width of result image.\n" " -h <height> Height of result image.\n" - " -j <outfile> JPEG output file for Stitch mode.\n" - " -t <outdir> Output directory for TIFF images in Stitch mode.\n" + " -j <file> JPEG output file for Stitch mode.\n" + " -t <dir> Output directory for TIFF images in Stitch mode.\n" + " -p Export position of image to stdout.\n" + " -e <file> Export positions of hills from <file> on image.\n" + " -E Export hills from default data file.\n" " <image(s)> JPEG file(s) to use.\n"); } @@ -409,14 +417,17 @@ int main(int argc, char** argv) { char *view_point = NULL; int err, my_argc; int stitch_flag = 0, stitch_w = 2000, stitch_h = 500; - int jpeg_flag = 0, tiff_flag = 0, distortion_flag = 0; + int jpeg_flag = 0, tiff_flag = 0, distortion_flag = 0, position_flag = 0; + int export_flag = 0; int bicubic_flag = 0, b_16_flag = 0; double stitch_from = 0.0, stitch_to = 380.0; double dist_k0 = 0.0, dist_k1 = 0.0, dist_x0 = 0.0; + double visibility = 0.07; char *outpath = "/tmp"; + char *export_file = NULL; err = 0; - while ((c = getopt(argc, argv, ":?d:v:sw:h:j:t:u:br:4")) != EOF) { + while ((c = getopt(argc, argv, ":?d:v:sw:h:j:t:u:br:4e:V:pE")) != EOF) { switch (c) { case '?': usage(); @@ -425,12 +436,25 @@ int main(int argc, char** argv) { case 'd': data_file = optarg; break; + case 'e': + export_flag++; + export_file = optarg; + break; + case 'E': + export_flag++; + break; case 'v': view_point = optarg; break; + case 'V': + visibility = atof(optarg); + break; case 's': stitch_flag++; break; + case 'p': + position_flag++; + break; case '4': b_16_flag++; break; @@ -480,7 +504,6 @@ int main(int argc, char** argv) { } } - my_argc = argc - optind; my_argv = argv + optind; @@ -503,12 +526,15 @@ int main(int argc, char** argv) { type = STITCH_PREVIEW; } - stitch(bicubic_flag?GipfelWidget::BICUBIC:GipfelWidget::NEAREST, + return stitch(bicubic_flag?GipfelWidget::BICUBIC:GipfelWidget::NEAREST, b_16_flag, stitch_w, stitch_h, stitch_from, stitch_to, type, outpath, my_argc, my_argv); - exit(0); + } else if (export_flag) { + return export_hills(export_file, visibility); + } else if (position_flag) { + return export_position(); } Fl::get_system_colors(); @@ -542,6 +568,8 @@ int main(int argc, char** argv) { scroll->size(gipf->w(), gipf->h()); gipf->load_data(data_file); + gipf->set_height_dist_ratio(visibility); + scroll->end(); set_values(); @@ -575,7 +603,6 @@ stitch(GipfelWidget::sample_mode_t m, int b_16, st->load_image(argv[i]); } - if (type & STITCH_JPEG) { st->set_output(new JPEGOutputImage(path, 90)); @@ -617,3 +644,44 @@ stitch(GipfelWidget::sample_mode_t m, int b_16, return 0; } + +static int +export_hills(const char *export_file, double visibility) { + int ret; + + if (!img_file) { + fprintf(stderr, "export: No image file given.\n"); + return 1; + } + + gipf = new GipfelWidget(0,0,800,600); + gipf->load_image(img_file); + gipf->load_data(data_file); + gipf->set_height_dist_ratio(visibility); + ret = gipf->export_hills(export_file, stdout); + delete gipf; + gipf = NULL; + + return ret; +} + +static int +export_position() { + ImageMetaData md; + + if (!img_file) { + fprintf(stderr, "export: No image file given.\n"); + return 1; + } + + if (md.load_image(img_file) == 0) { + printf(",%s,,%f,%f,%d\n", img_file, + md.get_latitude(), + md.get_longitude(), + (int) rint(md.get_height())); + + return 0; + } else { + return 1; + } +} |