From 3863aa643f604f17b79684093fd34e7a67b093fa Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sat, 28 Oct 2006 00:03:29 +0200 Subject: fix ImageMetaData classes --- src/GipfelWidget.cxx | 58 +++++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 30 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 75451ec..8314222 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -35,6 +35,8 @@ #include #include +#include "ExifImageMetaData.H" +#include "JpgcomImageMetaData.H" #include "Fl_Search_Chooser.H" #include "choose_hill.H" #include "util.h" @@ -76,14 +78,9 @@ GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { int GipfelWidget::load_image(char *file) { - char * args[32]; - FILE *p; - pid_t pid; - char buf[1024]; - double lo, la, he, dir, ni, ti, sc; - int status; - Projection::Projection_t pt = Projection::TANGENTIAL; Fl_Image *new_img; + ImageMetaData *md; + int ret; new_img = new Fl_JPEG_Image(file); @@ -112,32 +109,33 @@ GipfelWidget::load_image(char *file) { mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); // try to retrieve gipfel data from JPEG comment section - args[0] = "rdjpgcom"; - args[1] = file; - args[2] = NULL; - - p = pexecvp(args[0], args, &pid, "r"); - if (p) { - while (fgets(buf, sizeof(buf), p) != NULL) { - if (sscanf(buf, GIPFEL_FORMAT, &lo, &la, &he, &dir, &ni, &ti, &sc, &pt) >= 7) { - set_view_long(lo); - set_view_lat(la); - set_view_height(he); - set_center_angle(dir); - set_nick_angle(ni); - set_tilt_angle(ti); - set_scale(sc); - set_projection(pt); - - break; - } + md = new JpgcomImageMetaData(); + ret = md->load_image(file); + if (ret != 1) { + 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((Projection::Projection_t) md->get_projection_type()); + if (ret == 2) { // special compatibility return code for old format + set_scale(md->get_focallength_sensor_ratio()); + } else { + set_scale(md->get_focallength_sensor_ratio() * img->w()); } - fclose(p); - waitpid(pid, &status, 0); - if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { - fprintf(stderr, "%s not found\n", args[0]); + } + + delete md; + + if (ret == 1) { + md = new ExifImageMetaData(); + ret = md->load_image(file); + if (ret == 0) { + set_scale(md->get_focallength_sensor_ratio() * img->w()); } + delete md; } return 0; -- cgit v1.2.3 From 20286c5a434580d38dc0a85981503d6310b9e55a Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sat, 28 Oct 2006 00:36:32 +0200 Subject: move Jpeg header writing to JpgcomImageMetaData class update NEWS --- src/GipfelWidget.cxx | 82 ++++++++++------------------------------------------ 1 file changed, 15 insertions(+), 67 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 8314222..33a3987 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -39,7 +39,6 @@ #include "JpgcomImageMetaData.H" #include "Fl_Search_Chooser.H" #include "choose_hill.H" -#include "util.h" #include "GipfelWidget.H" #define CROSS_SIZE 2 @@ -74,8 +73,6 @@ GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { fl_register_images(); } -#define GIPFEL_FORMAT "gipfel: longitude %lf, latitude %lf, height %lf, direction %lf, nick %lf, tilt %lf, scale %lf, projection type %d" - int GipfelWidget::load_image(char *file) { Fl_Image *new_img; @@ -108,8 +105,7 @@ GipfelWidget::load_image(char *file) { mb->box(FL_NO_BOX); mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); -// try to retrieve gipfel data from JPEG comment section - + // try to retrieve gipfel data from JPEG comment section md = new JpgcomImageMetaData(); ret = md->load_image(file); if (ret != 1) { @@ -148,79 +144,31 @@ GipfelWidget::get_image_filename() { int GipfelWidget::save_image(char *file) { - char * args[32]; - FILE *p, *out; - pid_t pid; - char buf[1024]; - int status; - size_t n; - struct stat in_stat, out_stat; + ImageMetaData *md; + int ret; if (img_file == NULL) { fprintf(stderr, "Nothing to save\n"); return 1; } - if (stat(img_file, &in_stat) != 0) { - perror("stat"); - return 1; - } - - if (stat(file, &out_stat) == 0) { - if (in_stat.st_ino == out_stat.st_ino) { - fprintf(stderr, "Input image %s and output image %s are the same file\n", - img_file, file); - return 1; - } - } + md = new JpgcomImageMetaData(); - out = fopen(file, "w"); - if (out == NULL) { - perror("fopen"); - return 1; - } + md->set_longitude(get_view_long()); + md->set_latitude(get_view_lat()); + md->set_height(get_view_height()); + md->set_direction(get_center_angle()); + md->set_nick(get_nick_angle()); + md->set_tilt(get_tilt_angle()); + md->set_focallength_sensor_ratio(get_scale() / (double) img->w()); + md->set_projection_type((int) get_projection()); - snprintf(buf, sizeof(buf), GIPFEL_FORMAT, - get_view_long(), - get_view_lat(), - get_view_height(), - get_center_angle(), - get_nick_angle(), - get_tilt_angle(), - get_scale(), - (int) get_projection()); - -// try to save gipfel data in JPEG comment section - args[0] = "wrjpgcom"; - args[1] = "-replace"; - args[2] = "-comment"; - args[3] = buf; - args[4] = img_file; - args[5] = NULL; - - p = pexecvp(args[0], args, &pid, "r"); - - if (p) { - while ((n = fread(buf, 1, sizeof(buf), p)) != 0) { - if (fwrite(buf, 1, n, out) != n) { - perror("fwrite"); - fclose(out); - fclose(p); - waitpid(pid, &status, 0); - } - } - fclose(p); - waitpid(pid, &status, 0); - if (WEXITSTATUS(status) == 127 || WEXITSTATUS(status) == 126) { - fprintf(stderr, "%s not found\n", args[0]); - } - } + ret = md->save_image(img_file, file); + delete md; - fclose(out); - return 0; + return ret; } - int GipfelWidget::load_data(const char *file) { int r; -- cgit v1.2.3 From 20d0a75d72711a11694c4796529acba280ac9443 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Sun, 29 Oct 2006 00:43:00 +0200 Subject: use Exif GPS Info if available --- src/GipfelWidget.cxx | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 33a3987..b8ebc79 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -130,6 +130,9 @@ GipfelWidget::load_image(char *file) { ret = md->load_image(file); if (ret == 0) { set_scale(md->get_focallength_sensor_ratio() * img->w()); + set_view_long(md->get_longitude()); + set_view_lat(md->get_latitude()); + set_view_height(md->get_height()); } delete md; } -- cgit v1.2.3 From da5192170bb7ed19a8eadbc8ac393b0fa222c7df Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 18:18:57 +0100 Subject: consolidate ExifImageMetaData and src/JpgcomImageMetaData into ImageMetaData --- src/GipfelWidget.cxx | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index b8ebc79..2efd231 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -35,8 +35,7 @@ #include #include -#include "ExifImageMetaData.H" -#include "JpgcomImageMetaData.H" +#include "ImageMetaData.H" #include "Fl_Search_Chooser.H" #include "choose_hill.H" #include "GipfelWidget.H" @@ -106,7 +105,7 @@ GipfelWidget::load_image(char *file) { mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); // try to retrieve gipfel data from JPEG comment section - md = new JpgcomImageMetaData(); + md = new ImageMetaData(); ret = md->load_image(file); if (ret != 1) { set_view_long(md->get_longitude()); @@ -125,18 +124,6 @@ GipfelWidget::load_image(char *file) { delete md; - if (ret == 1) { - md = new ExifImageMetaData(); - ret = md->load_image(file); - if (ret == 0) { - set_scale(md->get_focallength_sensor_ratio() * img->w()); - set_view_long(md->get_longitude()); - set_view_lat(md->get_latitude()); - set_view_height(md->get_height()); - } - delete md; - } - return 0; } @@ -155,7 +142,7 @@ GipfelWidget::save_image(char *file) { return 1; } - md = new JpgcomImageMetaData(); + md = new ImageMetaData(); md->set_longitude(get_view_long()); md->set_latitude(get_view_lat()); -- cgit v1.2.3 From 19bec8bde89fc08f6497a346b2121bcd96d1f528 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 18:37:27 +0100 Subject: fix problem with compatibility code --- src/GipfelWidget.cxx | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 2efd231..a1982d5 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -104,23 +104,17 @@ GipfelWidget::load_image(char *file) { mb->box(FL_NO_BOX); mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); - // try to retrieve gipfel data from JPEG comment section + // try to retrieve gipfel data from JPEG meta data md = new ImageMetaData(); - ret = md->load_image(file); - if (ret != 1) { - 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((Projection::Projection_t) md->get_projection_type()); - if (ret == 2) { // special compatibility return code for old format - set_scale(md->get_focallength_sensor_ratio()); - } else { - set_scale(md->get_focallength_sensor_ratio() * img->w()); - } - } + md->load_image(file, img->w()); + 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((Projection::Projection_t) md->get_projection_type()); + set_scale(md->get_focallength_sensor_ratio() * img->w()); delete md; -- cgit v1.2.3 From 4188cb198bec8a83cfeb893608af2bd39d515449 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 19:21:16 +0100 Subject: scale -> focal_length_35mm --- src/GipfelWidget.cxx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index a1982d5..f38b21c 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -114,7 +114,7 @@ GipfelWidget::load_image(char *file) { set_nick_angle(md->get_nick()); set_tilt_angle(md->get_tilt()); set_projection((Projection::Projection_t) md->get_projection_type()); - set_scale(md->get_focallength_sensor_ratio() * img->w()); + set_focal_length_35mm(md->get_focal_length_35mm()); delete md; @@ -144,7 +144,7 @@ GipfelWidget::save_image(char *file) { md->set_direction(get_center_angle()); md->set_nick(get_nick_angle()); md->set_tilt(get_tilt_angle()); - md->set_focallength_sensor_ratio(get_scale() / (double) img->w()); + md->set_focal_length_35mm(get_focal_length_35mm()); md->set_projection_type((int) get_projection()); ret = md->save_image(img_file, file); @@ -469,8 +469,8 @@ GipfelWidget::set_tilt_angle(double a) { } void -GipfelWidget::set_scale(double s) { - pan->set_scale(s); +GipfelWidget::set_focal_length_35mm(double s) { + pan->set_scale(s * (double) img->w() / 35.0); set_labels(pan->get_visible_mountains()); redraw(); } @@ -503,8 +503,8 @@ GipfelWidget::get_tilt_angle() { } double -GipfelWidget::get_scale() { - return pan->get_scale(); +GipfelWidget::get_focal_length_35mm() { + return pan->get_scale() * 35.0 / (double) img->w(); } double -- cgit v1.2.3 From 364fadcbea5f37799bb42e663106e3a007746984 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 20:45:53 +0100 Subject: strip copyright --- src/GipfelWidget.cxx | 18 ------------------ 1 file changed, 18 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index f38b21c..30320de 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -1,21 +1,3 @@ -// -// Copyright 2006 by Johannes Hofmann -// -// This library is free software; you can redistribute it and/or -// modify it under the terms of the GNU Library General Public -// License as published by the Free Software Foundation; either -// version 2 of the License, or (at your option) any later version. -// -// This library is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -// Library General Public License for more details. -// -// You should have received a copy of the GNU Library General Public -// License along with this library; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 -// USA. -// #include #include -- cgit v1.2.3 From 6c50749f40e50a4b6a260a262b40035bfe83fd76 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 20:49:30 +0100 Subject: add simplified copyright --- src/GipfelWidget.cxx | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 30320de..2927cde 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -1,3 +1,8 @@ +// +// Copyright 2006 Johannes Hofmann +// +// This software may be used and distributed according to the terms +// of the GNU General Public License, incorporated herein by reference. #include #include -- cgit v1.2.3 From f8fb82ba705f6314d502b8efc8f03ecd16b8bed8 Mon Sep 17 00:00:00 2001 From: Johannes Hofmann Date: Mon, 30 Oct 2006 22:27:04 +0100 Subject: more reindent --- src/GipfelWidget.cxx | 916 +++++++++++++++++++++++++-------------------------- 1 file changed, 458 insertions(+), 458 deletions(-) (limited to 'src/GipfelWidget.cxx') diff --git a/src/GipfelWidget.cxx b/src/GipfelWidget.cxx index 2927cde..23cb075 100644 --- a/src/GipfelWidget.cxx +++ b/src/GipfelWidget.cxx @@ -37,75 +37,75 @@ static double pi_d, deg2rad; static void center_cb(Fl_Widget *o, void *f); GipfelWidget::GipfelWidget(int X,int Y,int W, int H): Fl_Widget(X, Y, W, H) { - int i; - - pi_d = asin(1.0) * 2.0; - deg2rad = pi_d / 180.0; - img = NULL; - pan = new Panorama(); - cur_mountain = NULL; - mb = NULL; - marker = new Hills(); - m1 = NULL; - m2 = NULL; - img_file = NULL; - track_width = 200.0; - show_hidden = 0; - - for (i=0; i<=3; i++) { - marker->add(new Hill(i * 10, 0)); - } - track_points = NULL; - fl_register_images(); + int i; + + pi_d = asin(1.0) * 2.0; + deg2rad = pi_d / 180.0; + img = NULL; + pan = new Panorama(); + cur_mountain = NULL; + mb = NULL; + marker = new Hills(); + m1 = NULL; + m2 = NULL; + img_file = NULL; + track_width = 200.0; + show_hidden = 0; + + for (i=0; i<=3; i++) { + marker->add(new Hill(i * 10, 0)); + } + track_points = NULL; + fl_register_images(); } int GipfelWidget::load_image(char *file) { - Fl_Image *new_img; - ImageMetaData *md; - int ret; + Fl_Image *new_img; + ImageMetaData *md; + int ret; + + new_img = new Fl_JPEG_Image(file); + + if (new_img == NULL) { + return 1; + } - new_img = new Fl_JPEG_Image(file); - - if (new_img == NULL) { - return 1; - } + if (img) { + delete img; + } - if (img) { - delete img; - } + img = new_img; - img = new_img; - - if (img_file) { - free(img_file); - } + if (img_file) { + free(img_file); + } - img_file = strdup(file); + img_file = strdup(file); - h(img->h()); - w(img->w()); + h(img->h()); + w(img->w()); - mb = new Fl_Menu_Button(x(),y(),w()+x(),h()+y(),"&popup"); - mb->type(Fl_Menu_Button::POPUP3); - mb->box(FL_NO_BOX); - mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); + mb = new Fl_Menu_Button(x(),y(),w()+x(),h()+y(),"&popup"); + mb->type(Fl_Menu_Button::POPUP3); + mb->box(FL_NO_BOX); + mb->add("Center Peak", 0, (Fl_Callback*) center_cb, this); - // try to retrieve gipfel data from JPEG meta data - md = new ImageMetaData(); - md->load_image(file, img->w()); - 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((Projection::Projection_t) md->get_projection_type()); - set_focal_length_35mm(md->get_focal_length_35mm()); + // try to retrieve gipfel data from JPEG meta data + md = new ImageMetaData(); + md->load_image(file, img->w()); + 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((Projection::Projection_t) md->get_projection_type()); + set_focal_length_35mm(md->get_focal_length_35mm()); - delete md; + delete md; - return 0; + return 0; } const char * @@ -115,557 +115,557 @@ GipfelWidget::get_image_filename() { int GipfelWidget::save_image(char *file) { - ImageMetaData *md; - int ret; + ImageMetaData *md; + int ret; - if (img_file == NULL) { - fprintf(stderr, "Nothing to save\n"); - return 1; - } + if (img_file == NULL) { + fprintf(stderr, "Nothing to save\n"); + return 1; + } - md = new ImageMetaData(); + md = new ImageMetaData(); - md->set_longitude(get_view_long()); - md->set_latitude(get_view_lat()); - md->set_height(get_view_height()); - md->set_direction(get_center_angle()); - md->set_nick(get_nick_angle()); - md->set_tilt(get_tilt_angle()); - md->set_focal_length_35mm(get_focal_length_35mm()); - md->set_projection_type((int) get_projection()); + md->set_longitude(get_view_long()); + md->set_latitude(get_view_lat()); + md->set_height(get_view_height()); + md->set_direction(get_center_angle()); + md->set_nick(get_nick_angle()); + md->set_tilt(get_tilt_angle()); + md->set_focal_length_35mm(get_focal_length_35mm()); + md->set_projection_type((int) get_projection()); - ret = md->save_image(img_file, file); - delete md; + ret = md->save_image(img_file, file); + delete md; - return ret; + return ret; } int GipfelWidget::load_data(const char *file) { - int r; + int r; - r = pan->load_data(file); - set_labels(pan->get_visible_mountains()); + r = pan->load_data(file); + set_labels(pan->get_visible_mountains()); - return r; + return r; } int GipfelWidget::load_track(const char *file) { - if (track_points) { - pan->remove_trackpoints(); - track_points->clobber(); - delete track_points; - } + if (track_points) { + pan->remove_trackpoints(); + track_points->clobber(); + delete track_points; + } - track_points = new Hills(); + track_points = new Hills(); - if (track_points->load(file) != 0) { - delete track_points; - track_points = NULL; - return 1; - } + if (track_points->load(file) != 0) { + delete track_points; + track_points = NULL; + return 1; + } + + for (int i=0; iget_num(); i++) { + track_points->get(i)->flags |= Hill::TRACK_POINT; + } - for (int i=0; iget_num(); i++) { - track_points->get(i)->flags |= Hill::TRACK_POINT; - } + pan->add_hills(track_points); + redraw(); - pan->add_hills(track_points); - redraw(); - - return 0; + return 0; } int GipfelWidget::set_viewpoint(const char *pos) { - int r; + int r; - r = pan->set_viewpoint(pos); - set_labels(pan->get_visible_mountains()); + r = pan->set_viewpoint(pos); + set_labels(pan->get_visible_mountains()); - return r; + return r; } void GipfelWidget::set_viewpoint(const Hill *m) { - pan->set_viewpoint(m); - set_labels(pan->get_visible_mountains()); + pan->set_viewpoint(m); + set_labels(pan->get_visible_mountains()); } static void draw_flag(int x, int y, char *s) { - Fl_Color c = fl_color(); + Fl_Color c = fl_color(); - fl_polygon(x, y - 10, x, y - 20, x + 10, y - 15); - fl_yxline(x, y, y - 10); - + fl_polygon(x, y - 10, x, y - 20, x + 10, y - 15); + fl_yxline(x, y, y - 10); - if (s) { - fl_color(FL_WHITE); - fl_draw(s, x , y - 12); - fl_color(c); - } + + if (s) { + fl_color(FL_WHITE); + fl_draw(s, x , y - 12); + fl_color(c); + } } void GipfelWidget::draw() { - Hills *mnts; - Hill *m; - int center_x = w() / 2; - int center_y = h() / 2; - int i; - - if (img == NULL) { - return; - } - - fl_push_clip(x(), y(), w(), h()); - img->draw(x(),y(),w(),h(),0,0); - - /* hills */ - fl_font(FL_HELVETICA, 10); - mnts = pan->get_visible_mountains(); - for (i=0; iget_num(); i++) { - m = mnts->get(i); - - if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { - continue; - } - - if (!show_hidden && (m->flags & Hill::HIDDEN)) { - continue; - } - - if (m == m1) { - fl_color(FL_RED); - draw_flag(center_x + m->x + x(), center_y + m->y + y(), "1"); - } else if (m == m2) { - fl_color(FL_RED); - draw_flag(center_x + m->x + x(), center_y + m->y + y(), "2"); - } else if (m->flags & Hill::HIDDEN) { - fl_color(FL_BLUE); - } else { - fl_color(FL_BLACK); - } - - fl_xyline(center_x + m->x + x() - CROSS_SIZE, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE); - fl_yxline(center_x + m->x + x(), center_y + m->y + m->label_y + y() - CROSS_SIZE, center_y + m->y + y() + CROSS_SIZE); - - fl_draw(m->name, - center_x + m->x + x(), - center_y + m->y + m->label_y + y()); - } - - /* markers */ - for (i=0; iget_num(); i++) { - m = marker->get(i); - - fl_color(FL_GREEN); - fl_xyline(center_x + m->x + x() - CROSS_SIZE * 2, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE * 2); - fl_yxline(center_x + m->x + x(), center_y + m->y + y() - CROSS_SIZE * 2, center_y + m->y + y() + CROSS_SIZE * 2); - draw_flag(center_x + m->x + x(), center_y + m->y + y(), NULL); - } - - /* track */ - if (track_points && track_points->get_num() > 0) { - int last_x, last_y, last_initialized = 0; - - for (i=1; iget_num(); i++) { - if (!(track_points->get(i)->flags & Hill::VISIBLE)) { - continue; - } - - if (track_points->get(i)->flags & Hill::HIDDEN) { - fl_color(FL_BLUE); - } else { - fl_color(FL_RED); - } - - fl_line_style(FL_SOLID|FL_CAP_ROUND|FL_JOIN_ROUND, - get_rel_track_width(track_points->get(i))); - if (last_initialized) { - fl_begin_line(); - fl_vertex(center_x + x() + last_x, center_y + y() + last_y); - fl_vertex(center_x + x() + track_points->get(i)->x, - center_y + y() + track_points->get(i)->y); - fl_end_line(); - } - - last_x = track_points->get(i)->x; - last_y = track_points->get(i)->y; - last_initialized++; - } - fl_line_style(0); - } - - fl_pop_clip(); + Hills *mnts; + Hill *m; + int center_x = w() / 2; + int center_y = h() / 2; + int i; + + if (img == NULL) { + return; + } + + fl_push_clip(x(), y(), w(), h()); + img->draw(x(),y(),w(),h(),0,0); + + /* hills */ + fl_font(FL_HELVETICA, 10); + mnts = pan->get_visible_mountains(); + for (i=0; iget_num(); i++) { + m = mnts->get(i); + + if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { + continue; + } + + if (!show_hidden && (m->flags & Hill::HIDDEN)) { + continue; + } + + if (m == m1) { + fl_color(FL_RED); + draw_flag(center_x + m->x + x(), center_y + m->y + y(), "1"); + } else if (m == m2) { + fl_color(FL_RED); + draw_flag(center_x + m->x + x(), center_y + m->y + y(), "2"); + } else if (m->flags & Hill::HIDDEN) { + fl_color(FL_BLUE); + } else { + fl_color(FL_BLACK); + } + + fl_xyline(center_x + m->x + x() - CROSS_SIZE, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE); + fl_yxline(center_x + m->x + x(), center_y + m->y + m->label_y + y() - CROSS_SIZE, center_y + m->y + y() + CROSS_SIZE); + + fl_draw(m->name, + center_x + m->x + x(), + center_y + m->y + m->label_y + y()); + } + + /* markers */ + for (i=0; iget_num(); i++) { + m = marker->get(i); + + fl_color(FL_GREEN); + fl_xyline(center_x + m->x + x() - CROSS_SIZE * 2, center_y + m->y + y(), center_x + m->x + x() + CROSS_SIZE * 2); + fl_yxline(center_x + m->x + x(), center_y + m->y + y() - CROSS_SIZE * 2, center_y + m->y + y() + CROSS_SIZE * 2); + draw_flag(center_x + m->x + x(), center_y + m->y + y(), NULL); + } + + /* track */ + if (track_points && track_points->get_num() > 0) { + int last_x, last_y, last_initialized = 0; + + for (i=1; iget_num(); i++) { + if (!(track_points->get(i)->flags & Hill::VISIBLE)) { + continue; + } + + if (track_points->get(i)->flags & Hill::HIDDEN) { + fl_color(FL_BLUE); + } else { + fl_color(FL_RED); + } + + fl_line_style(FL_SOLID|FL_CAP_ROUND|FL_JOIN_ROUND, + get_rel_track_width(track_points->get(i))); + if (last_initialized) { + fl_begin_line(); + fl_vertex(center_x + x() + last_x, center_y + y() + last_y); + fl_vertex(center_x + x() + track_points->get(i)->x, + center_y + y() + track_points->get(i)->y); + fl_end_line(); + } + + last_x = track_points->get(i)->x; + last_y = track_points->get(i)->y; + last_initialized++; + } + fl_line_style(0); + } + + fl_pop_clip(); } static int overlap(int m1, int n1, int m2, int n2) { - return m1 <= n2 && n1 >= m2; + return m1 <= n2 && n1 >= m2; } void GipfelWidget::set_labels(Hills *v) { - int i, j, width, height; - Hill *m, *n; - - fl_font(FL_HELVETICA, 10); - height = fl_height(); - - for (i=0; iget_num(); i++) { - m = v->get(i); - - if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { - continue; - } - - if (!show_hidden && (m->flags & Hill::HIDDEN)) { - continue; - } - - width = (int) ceilf(fl_width(m->name)); - m->label_x = width; - m->label_y = 0; - for (j=0; j < i; j++) { - n = v->get(j); - - if (n->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { - continue; - } - - if (!show_hidden && (n->flags & Hill::HIDDEN)) { - continue; - } - - // Check for overlapping labels and - // overlaps between labels and peak markers - if ((overlap(m->x, m->x + m->label_x, n->x, n->x + n->label_x) && - overlap(m->y + m->label_y - height, m->y + m->label_y, n->y + n->label_y - height, n->y + n->label_y)) || - (overlap(m->x, m->x + m->label_x, n->x - 2, n->x + 2) && - overlap(m->y + m->label_y - height, m->y + m->label_y, n->y - 2, n->y + 2))) { - m->label_y = n->y + n->label_y - m->y - height - 1; - } - } - } + int i, j, width, height; + Hill *m, *n; + + fl_font(FL_HELVETICA, 10); + height = fl_height(); + + for (i=0; iget_num(); i++) { + m = v->get(i); + + if (m->flags & (Hill::DUPLICATE|Hill::TRACK_POINT)) { + continue; + } + + if (!show_hidden && (m->flags & Hill::HIDDEN)) { + continue; + } + + width = (int) ceilf(fl_width(m->name)); + m->label_x = width; + m->label_y = 0; + for (j=0; j < i; j++) { + n = v->get(j); + + if (n->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { + continue; + } + + if (!show_hidden && (n->flags & Hill::HIDDEN)) { + continue; + } + + // Check for overlapping labels and + // overlaps between labels and peak markers + if ((overlap(m->x, m->x + m->label_x, n->x, n->x + n->label_x) && + overlap(m->y + m->label_y - height, m->y + m->label_y, n->y + n->label_y - height, n->y + n->label_y)) || + (overlap(m->x, m->x + m->label_x, n->x - 2, n->x + 2) && + overlap(m->y + m->label_y - height, m->y + m->label_y, n->y - 2, n->y + 2))) { + m->label_y = n->y + n->label_y - m->y - height - 1; + } + } + } } int GipfelWidget::set_cur_mountain(int m_x, int m_y) { - Hills *mnts = pan->get_visible_mountains(); - Hill *m; - int center_x = w() / 2; - int center_y = h() / 2; - int i; - - for (i=0; iget_num(); i++) { - m = mnts->get(i); - if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { - continue; - } - - if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && - m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { - cur_mountain = m; - if (m1 != NULL && m2 != NULL) { - fprintf(stderr, "Resetting m1 and m2\n"); - m1 = NULL; - m2 = NULL; - } - - if (m1 == NULL) { - m1 = cur_mountain; - fprintf(stderr, "m1 = %s\n", m1->name); - } else if (m2 == NULL) { - m2 = cur_mountain; - fprintf(stderr, "m2 = %s\n", m2->name); - } - - redraw(); - return 0; - } - } + Hills *mnts = pan->get_visible_mountains(); + Hill *m; + int center_x = w() / 2; + int center_y = h() / 2; + int i; + + for (i=0; iget_num(); i++) { + m = mnts->get(i); + if (m->flags & (Hill::DUPLICATE | Hill::TRACK_POINT)) { + continue; + } + + if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && + m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { + cur_mountain = m; + if (m1 != NULL && m2 != NULL) { + fprintf(stderr, "Resetting m1 and m2\n"); + m1 = NULL; + m2 = NULL; + } + + if (m1 == NULL) { + m1 = cur_mountain; + fprintf(stderr, "m1 = %s\n", m1->name); + } else if (m2 == NULL) { + m2 = cur_mountain; + fprintf(stderr, "m2 = %s\n", m2->name); + } + + redraw(); + return 0; + } + } - for (i=0; iget_num(); i++) { - m = marker->get(i); + for (i=0; iget_num(); i++) { + m = marker->get(i); - if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && - m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { - cur_mountain = m; - redraw(); - return 0; - } - } + if (m_x - center_x >= m->x - 2 && m_x - center_x < m->x + 2 && + m_y - center_y >= m->y - 2 && m_y - center_y < m->y + 2) { + cur_mountain = m; + redraw(); + return 0; + } + } - cur_mountain = NULL; - redraw(); - return 1; + cur_mountain = NULL; + redraw(); + return 1; } int GipfelWidget::set_mountain(int m_x, int m_y) { - int old_x, old_y, old_label_y; - int center_x = w() / 2; - int center_y = h() / 2; - - if (cur_mountain == NULL) { - return 1; - } - - old_x = cur_mountain->x; - old_y = cur_mountain->y; - old_label_y = cur_mountain->label_y; - - cur_mountain->x = m_x - center_x; - cur_mountain->y = m_y - center_y; - cur_mountain->label_y = 0; - - damage(4, center_x + x() + old_x - 2*CROSS_SIZE - 1, - center_y + y() + old_y + old_label_y - 2*CROSS_SIZE - 20, - MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, - MAX(20, old_label_y) + 22 ); - damage(4, center_x + x() + cur_mountain->x - 2*CROSS_SIZE - 1, - center_y + y() + cur_mountain->y + cur_mountain->label_y - 2*CROSS_SIZE - 20, - MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, - MAX(20, cur_mountain->label_y) + 22 ); - - return 0; + int old_x, old_y, old_label_y; + int center_x = w() / 2; + int center_y = h() / 2; + + if (cur_mountain == NULL) { + return 1; + } + + old_x = cur_mountain->x; + old_y = cur_mountain->y; + old_label_y = cur_mountain->label_y; + + cur_mountain->x = m_x - center_x; + cur_mountain->y = m_y - center_y; + cur_mountain->label_y = 0; + + damage(4, center_x + x() + old_x - 2*CROSS_SIZE - 1, + center_y + y() + old_y + old_label_y - 2*CROSS_SIZE - 20, + MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, + MAX(20, old_label_y) + 22 ); + damage(4, center_x + x() + cur_mountain->x - 2*CROSS_SIZE - 1, + center_y + y() + cur_mountain->y + cur_mountain->label_y - 2*CROSS_SIZE - 20, + MAX(20, cur_mountain->label_x) + 2*CROSS_SIZE + 2, + MAX(20, cur_mountain->label_y) + 22 ); + + return 0; } void GipfelWidget::set_center_angle(double a) { - pan->set_center_angle(a); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_center_angle(a); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_nick_angle(double a) { - pan->set_nick_angle(a); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_nick_angle(a); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_tilt_angle(double a) { - pan->set_tilt_angle(a); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_tilt_angle(a); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_focal_length_35mm(double s) { - pan->set_scale(s * (double) img->w() / 35.0); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_scale(s * (double) img->w() / 35.0); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_projection(Projection::Projection_t p) { - pan->set_projection(p); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_projection(p); + set_labels(pan->get_visible_mountains()); + redraw(); } Projection::Projection_t GipfelWidget::get_projection() { - return pan->get_projection(); + return pan->get_projection(); } double GipfelWidget::get_center_angle() { - return pan->get_center_angle(); + return pan->get_center_angle(); } double GipfelWidget::get_nick_angle() { - return pan->get_nick_angle(); + return pan->get_nick_angle(); } double GipfelWidget::get_tilt_angle() { - return pan->get_tilt_angle(); + return pan->get_tilt_angle(); } double GipfelWidget::get_focal_length_35mm() { - return pan->get_scale() * 35.0 / (double) img->w(); + return pan->get_scale() * 35.0 / (double) img->w(); } double GipfelWidget::get_height_dist_ratio() { - return pan->get_height_dist_ratio(); + return pan->get_height_dist_ratio(); } const char * GipfelWidget::get_viewpoint() { - return pan->get_viewpoint(); + return pan->get_viewpoint(); } double GipfelWidget::get_view_lat() { - return pan->get_view_lat(); + return pan->get_view_lat(); } double GipfelWidget::get_view_long() { - return pan->get_view_long(); + return pan->get_view_long(); } double GipfelWidget::get_view_height() { - return pan->get_view_height(); + return pan->get_view_height(); } void GipfelWidget::center() { - Hill *m = choose_hill(pan->get_close_mountains(), "Center Peak"); - if (m) { - set_center_angle(m->alph / deg2rad); - if (!m1 || (m1 && m2)) { - m1 = m; - } else { - m2 = m; - } - } + Hill *m = choose_hill(pan->get_close_mountains(), "Center Peak"); + if (m) { + set_center_angle(m->alph / deg2rad); + if (!m1 || (m1 && m2)) { + m1 = m; + } else { + m2 = m; + } + } } static void center_cb(Fl_Widget *o, void *f) { - ((GipfelWidget*)f)->center(); + ((GipfelWidget*)f)->center(); } void GipfelWidget::set_height_dist_ratio(double r) { - pan->set_height_dist_ratio(r); - set_labels(pan->get_visible_mountains()); - - redraw(); + pan->set_height_dist_ratio(r); + set_labels(pan->get_visible_mountains()); + + redraw(); } void GipfelWidget::set_hide_value(double h) { - pan->set_hide_value(h); - set_labels(pan->get_visible_mountains()); - - redraw(); + pan->set_hide_value(h); + set_labels(pan->get_visible_mountains()); + + redraw(); } void GipfelWidget::set_show_hidden(int h) { - show_hidden = h; - set_labels(pan->get_visible_mountains()); - - redraw(); + show_hidden = h; + set_labels(pan->get_visible_mountains()); + + redraw(); } void GipfelWidget::set_view_lat(double v) { - pan->set_view_lat(v); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_view_lat(v); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_view_long(double v) { - pan->set_view_long(v); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_view_long(v); + set_labels(pan->get_visible_mountains()); + redraw(); } void GipfelWidget::set_view_height(double v) { - pan->set_view_height(v); - set_labels(pan->get_visible_mountains()); - redraw(); + pan->set_view_height(v); + set_labels(pan->get_visible_mountains()); + redraw(); } Hills* GipfelWidget::get_mountains() { - return pan->get_mountains(); + return pan->get_mountains(); } int GipfelWidget::comp_params() { - if (m1 == NULL || m2 == NULL) { - fprintf(stderr, "Position m1 and m2 first.\n"); - return 1; - } - fl_cursor(FL_CURSOR_WAIT); - pan->comp_params(m1, m2); - set_labels(pan->get_visible_mountains()); - redraw(); - fl_cursor(FL_CURSOR_DEFAULT); + if (m1 == NULL || m2 == NULL) { + fprintf(stderr, "Position m1 and m2 first.\n"); + return 1; + } + fl_cursor(FL_CURSOR_WAIT); + pan->comp_params(m1, m2); + set_labels(pan->get_visible_mountains()); + redraw(); + fl_cursor(FL_CURSOR_DEFAULT); } int GipfelWidget::guess() { - if (m1 == NULL) { - fprintf(stderr, "Position m1 first.\n"); - return 1; - } - fl_cursor(FL_CURSOR_WAIT); - pan->guess(marker, m1); - set_labels(pan->get_visible_mountains()); - redraw(); - fl_cursor(FL_CURSOR_DEFAULT); + if (m1 == NULL) { + fprintf(stderr, "Position m1 first.\n"); + return 1; + } + fl_cursor(FL_CURSOR_WAIT); + pan->guess(marker, m1); + set_labels(pan->get_visible_mountains()); + redraw(); + fl_cursor(FL_CURSOR_DEFAULT); } int GipfelWidget::update() { - redraw(); - Fl::wait(1.0); + redraw(); + Fl::wait(1.0); } int GipfelWidget::get_rel_track_width(Hill *m) { - double dist = pan->get_real_distance(m); + double dist = pan->get_real_distance(m); - return MAX((pan->get_scale() * track_width) / (dist * 10.0), 1.0); + return MAX((pan->get_scale() * track_width) / (dist * 10.0), 1.0); } void GipfelWidget::set_track_width(double w) { - track_width = w; - redraw(); + track_width = w; + redraw(); } int GipfelWidget::handle(int event) { - int mark_x, mark_y; - - switch(event) { - case FL_PUSH: - if (Fl::event_button() == 1) { - - mark_x = Fl::event_x()-x(); - mark_y = Fl::event_y()-y(); - set_cur_mountain(mark_x, mark_y); - - Fl::focus(this); - return 1; - } - break; - case FL_DRAG: - set_mountain(Fl::event_x()-x(), Fl::event_y()-y()); - return 1; - break; - case FL_FOCUS: - return 1; - break; - case FL_UNFOCUS: - return 0; - break; - } - return 0; + int mark_x, mark_y; + + switch(event) { + case FL_PUSH: + if (Fl::event_button() == 1) { + + mark_x = Fl::event_x()-x(); + mark_y = Fl::event_y()-y(); + set_cur_mountain(mark_x, mark_y); + + Fl::focus(this); + return 1; + } + break; + case FL_DRAG: + set_mountain(Fl::event_x()-x(), Fl::event_y()-y()); + return 1; + break; + case FL_FOCUS: + return 1; + break; + case FL_UNFOCUS: + return 0; + break; + } + return 0; } int GipfelWidget::get_pixel(double a_view, double a_nick, - char *r, char *g, char *b) { + char *r, char *g, char *b) { double px, py; @@ -678,7 +678,7 @@ GipfelWidget::get_pixel(double a_view, double a_nick, } return get_pixel_nearest(img, px + ((double) img->w()) / 2.0, - py + ((double) img->h()) / 2.0, r, g, b); + py + ((double) img->h()) / 2.0, r, g, b); } int @@ -694,40 +694,40 @@ GipfelWidget::get_pixel_nearest(Fl_Image *img, double x, double y, int GipfelWidget::get_pixel(Fl_Image *img, int x, int y, - char *r, char *g, char *b) { - if ( img->d() == 0 ) { - return 1; - } - - if (x < 0 || x >=img->w() || y < 0 || y >= img->h()) { - return 1; - } - long index = (y * img->w() * img->d()) + (x * img->d()); // X/Y -> buf index - switch ( img->count() ) { - case 1: { // bitmap - const char *buf = img->data()[0]; - switch ( img->d() ) { - case 1: { // 8bit - *r = *g = *b = *(buf+index); - break; - } - case 3: // 24bit - *r = *(buf+index+0); - *g = *(buf+index+1); - *b = *(buf+index+2); - break; - default: // ?? - printf("Not supported: chans=%d\n", img->d()); - return 1; - } - break; - } - default: // ?? pixmap, bit vals - printf("Not supported: count=%d\n", img->count()); - return 1; - } - - return 0; + char *r, char *g, char *b) { + if ( img->d() == 0 ) { + return 1; + } -} + if (x < 0 || x >=img->w() || y < 0 || y >= img->h()) { + return 1; + } + long index = (y * img->w() * img->d()) + (x * img->d()); // X/Y -> buf index + switch (img->count()) { + case 1: + { // bitmap + const char *buf = img->data()[0]; + switch (img->d()) + { + case 1: + *r = *g = *b = *(buf+index); + break; + case 3: // 24bit + *r = *(buf+index+0); + *g = *(buf+index+1); + *b = *(buf+index+2); + break; + default: // ?? + printf("Not supported: chans=%d\n", img->d()); + return 1; + } + break; + } + default: // ?? pixmap, bit vals + printf("Not supported: count=%d\n", img->count()); + return 1; + } + + return 0; +} -- cgit v1.2.3