diff options
Diffstat (limited to 'src/GipfelWidget.cxx')
-rw-r--r-- | src/GipfelWidget.cxx | 94 |
1 files changed, 89 insertions, 5 deletions
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; |