From 6524c95bb8ea0339908ab9bff03211f8c42e77d9 Mon Sep 17 00:00:00 2001
From: Johannes Hofmann <Johannes.Hofmann@gmx.de>
Date: Thu, 3 Aug 2006 20:45:57 +0200
Subject: add TIFFOutputImage

---
 src/JPEGOutputImage.cxx |   8 ++-
 src/Makefile.am         |   2 +
 src/OutputImage.cxx     | 179 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/TIFFOutputImage.H   |  49 +++++++++++++
 src/TIFFOutputImage.cxx | 110 +++++++++++++++++++++++++++++
 src/gipfel.cxx          |  95 +++++++++++++++----------
 6 files changed, 402 insertions(+), 41 deletions(-)
 create mode 100644 src/OutputImage.cxx
 create mode 100644 src/TIFFOutputImage.H
 create mode 100644 src/TIFFOutputImage.cxx

(limited to 'src')

diff --git a/src/JPEGOutputImage.cxx b/src/JPEGOutputImage.cxx
index 9e00458..3f7fd11 100644
--- a/src/JPEGOutputImage.cxx
+++ b/src/JPEGOutputImage.cxx
@@ -101,11 +101,13 @@ JPEGOutputImage::next_line_internal() {
 
 int
 JPEGOutputImage::done_internal() {
-	next_line_internal();
 	jpeg_finish_compress(&cinfo);
-	fclose(fp);
-	fp = NULL;
 	jpeg_destroy_compress(&cinfo);
+
+	if (fp) {
+		fclose(fp);
+		fp = NULL;
+	}
 	if (row) {
 		free(row);
 	}
diff --git a/src/Makefile.am b/src/Makefile.am
index b686716..5577090 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -15,6 +15,7 @@ gipfel_SOURCES = \
 	Stitch.cxx \
 	OutputImage.cxx \
 	JPEGOutputImage.cxx \
+	TIFFOutputImage.cxx \
 	PreviewOutputImage.cxx 
 
 noinst_HEADERS = \
@@ -31,5 +32,6 @@ noinst_HEADERS = \
 	Stitch.H \
 	OutputImage.H \
 	JPEGOutputImage.H \
+	TIFFOutputImage.H \
 	PreviewOutputImage.H \
 	util.h
diff --git a/src/OutputImage.cxx b/src/OutputImage.cxx
new file mode 100644
index 0000000..52af058
--- /dev/null
+++ b/src/OutputImage.cxx
@@ -0,0 +1,179 @@
+// 
+// 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 <stdlib.h>
+#include <stdio.h>
+
+#include "OutputImage.H"
+
+OutputImage::OutputImage() {
+	W = 0;
+	H = 0;
+	initialized = 0;
+}
+
+OutputImage::~OutputImage() {
+}
+
+int
+OutputImage::init(int w1, int h1) {
+	W = w1;
+	H = h1;
+	line = 0;
+	initialized = 1;
+
+	return init_internal(w1, h1);
+}
+
+
+int
+OutputImage::init_internal(int w1, int h1) {
+	return 0;
+}
+
+int
+OutputImage::set_pixel(int x, char r, char g, char b) {
+	if (!initialized || x < 0 || x >= W) {
+		return 1;
+	} else {
+		return set_pixel_internal(x, r, g, b);
+	}
+}
+
+int
+OutputImage::set_pixel_internal(int x, char r, char g, char b) {
+	return 0;
+}
+
+int
+OutputImage::next_line() {
+	if (!initialized || line++ >= H) {
+		return 1;
+	} else {
+		return next_line_internal();
+	}
+}
+
+int
+OutputImage::next_line_internal() {
+	return 0;
+}
+
+int
+OutputImage::done() {
+	if (!initialized) {
+		return 1;
+	} else {
+		next_line();
+		return done_internal();
+	}
+}
+
+int
+OutputImage::done_internal() {
+	return 0;
+}
+
+#define MAX_OUTPUT_IMAGES 16
+OutputImages::OutputImages() {
+	imgs = (OutputImage **) calloc(MAX_OUTPUT_IMAGES, sizeof(OutputImage *));
+	max_imgs = MAX_OUTPUT_IMAGES;
+}
+
+OutputImages::~OutputImages() {
+	free(imgs);
+}
+
+int
+OutputImages::add(OutputImage *img) {
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i] == NULL) {
+			imgs[i] = img;
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+
+int
+OutputImages::remove(OutputImage *img) {
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i] == img) {
+			imgs[i] = NULL;
+			return 0;
+		}
+	}
+
+	return 1;
+}
+
+int
+OutputImages::init(int w, int h) {
+	int ret = 0;
+
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i]) {
+			ret += imgs[i]->init(w, h);
+		}
+	}
+
+	return ret;
+}
+
+int
+OutputImages::set_pixel(int x, char r, char g, char b) {
+	int ret = 0;
+
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i]) {
+			ret += imgs[i]->set_pixel(x, r, g, b);
+		}
+	}
+
+	return ret;
+}
+
+int
+OutputImages::next_line() {
+	int ret = 0;
+
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i]) {
+			ret += imgs[i]->next_line();
+		}
+	}
+
+	return ret;
+}
+
+int
+OutputImages::done() {
+	int ret = 0;
+
+	for (int i=0; i<max_imgs;i++) {
+		if (imgs[i]) {
+			ret += imgs[i]->done();
+		}
+	}
+
+	return ret;
+}
+
diff --git a/src/TIFFOutputImage.H b/src/TIFFOutputImage.H
new file mode 100644
index 0000000..3a14279
--- /dev/null
+++ b/src/TIFFOutputImage.H
@@ -0,0 +1,49 @@
+// 
+// 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.
+//
+
+#ifndef TIFFOUTPUTIMAGE_H
+#define TIFFOUTPUTIMAGE_H
+
+#include <stdio.h>
+#include <tiffio.h>
+
+#include "OutputImage.H"
+
+class TIFFOutputImage : OutputImage {
+	private:
+		unsigned char *row;
+		char *file;
+		TIFF *tiff;
+
+	public:
+		TIFFOutputImage(const char *file);
+
+		~TIFFOutputImage();
+
+	protected:
+		int init_internal(int w, int h);
+
+		int set_pixel_internal(int x, char r, char g, char b);	
+
+		int next_line_internal();
+
+		int done_internal();
+};
+
+#endif
diff --git a/src/TIFFOutputImage.cxx b/src/TIFFOutputImage.cxx
new file mode 100644
index 0000000..ed9213f
--- /dev/null
+++ b/src/TIFFOutputImage.cxx
@@ -0,0 +1,110 @@
+// 
+// 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 <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "TIFFOutputImage.H"
+
+TIFFOutputImage::TIFFOutputImage(const char *f) {
+	file = strdup(f);
+	tiff = NULL;
+	row = NULL;
+}
+
+TIFFOutputImage::~TIFFOutputImage() {
+	if (row) {
+		free(row);
+	}
+	if (file) {
+		free(file);
+	}
+}
+
+int
+TIFFOutputImage::init_internal(int w1, int h1) {
+	if (row) {
+		free(row);
+		row = NULL;
+	}
+
+	row = (unsigned char*) malloc(sizeof(char) * 4 * w1);
+	if (!row) {
+		perror("malloc");
+		return 1;
+	}
+	memset(row, 0, sizeof(char) * 4 * w1);
+
+	if (tiff) {
+		TIFFClose(tiff);
+	}
+
+	if((tiff = TIFFOpen(file, "w")) == NULL){
+		fprintf(stderr, "can't open %s\n", file);
+		return 1;
+	}
+
+	TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, w1);
+	TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, h1);
+	TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_DEFLATE);
+	TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+	TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+	TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
+	TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4);
+
+	return 0;
+}
+
+int
+TIFFOutputImage::set_pixel_internal(int x, char r, char g, char b) {
+	row[x*4+0] = r;
+	row[x*4+1] = g;
+	row[x*4+2] = b;
+	row[x*4+3] = 255;
+
+	return 0;
+}
+
+int
+TIFFOutputImage::next_line_internal() {
+	int ret;
+	ret = TIFFWriteScanline(tiff, row, line-1, 0);
+	if (ret != 1) {
+		fprintf(stderr, "TIFFWriteScanline failed\n");
+	}
+	memset(row, 0, sizeof(char) * 4 * W);
+	return 0;
+}
+
+int
+TIFFOutputImage::done_internal() {
+	if (tiff) {
+		TIFFClose(tiff);
+		tiff = NULL;
+	}
+
+	if (row) {
+		free(row);
+		row = NULL;
+	}
+
+	return 0;
+}	
+
diff --git a/src/gipfel.cxx b/src/gipfel.cxx
index 8e0e1b9..74b092a 100644
--- a/src/gipfel.cxx
+++ b/src/gipfel.cxx
@@ -42,6 +42,7 @@
 #include "Fl_Search_Chooser.H"
 #include "GipfelWidget.H"
 #include "JPEGOutputImage.H"
+#include "TIFFOutputImage.H"
 #include "PreviewOutputImage.H"
 #include "Stitch.H"
 #include "choose_hill.H"
@@ -63,7 +64,11 @@ Fl_Value_Input *i_view_lat, *i_view_long, *i_view_height;
 Fl_Box *b_viewpoint;
 Fl_Menu_Bar *mb;
 
-static int stitch(int stitch_w, int stitch_h, int argc, char **argv);
+#define STITCH_PREVIEW 1
+#define STITCH_JPEG    2
+#define STITCH_TIFF    4
+static int stitch(int stitch_w, int stitch_h, int type, const char *path,
+  int argc, char **argv);
 
 void set_values() {
   s_center->value(gipf->get_center_angle());
@@ -325,14 +330,16 @@ int main(int argc, char** argv) {
   char *view_point = NULL;
   int err, bflag = 0, dflag = 0, my_argc;
   int stitch_flag = 0, stitch_w = 2000, stitch_h = 500;
+  int jpeg_flag = 0, tiff_flag = 0;
+  char *outpath;
   Fl_Window *control_win, *view_win;
   Fl_Scroll *scroll;
 
   
   err = 0;
-  while ((c = getopt(argc, argv, "d:v:sw:b:")) != EOF) {
+  while ((c = getopt(argc, argv, "?d:v:sw:h:j:t:")) != EOF) {
     switch (c) {  
-    case 'h':
+    case '?':
       usage();
       exit(0);
       break;
@@ -345,10 +352,18 @@ int main(int argc, char** argv) {
     case 's':
       stitch_flag++;
       break;
+    case 'j':
+      jpeg_flag++;
+      outpath = optarg;
+      break;
+    case 't':
+      tiff_flag++;
+      outpath = optarg;
+      break;
     case 'w':
       stitch_w = atoi(optarg);
       break;
-    case 'b':
+    case 'h':
       stitch_h = atoi(optarg);
       break;
     default:
@@ -370,7 +385,13 @@ int main(int argc, char** argv) {
   }
 
   if (stitch_flag) {
-    stitch(stitch_w, stitch_h, my_argc, my_argv);
+    int type = STITCH_PREVIEW;
+    if (jpeg_flag) {
+      type = STITCH_JPEG;
+    } else if (tiff_flag) {
+      type = STITCH_TIFF;
+    }
+    stitch(stitch_w, stitch_h, type, outpath, my_argc, my_argv);
     exit(0);
   }
 
@@ -419,29 +440,7 @@ int main(int argc, char** argv) {
   return Fl::run();
 }
 
-#if 0
-static int tiffstitch(int stitch_w, int stitch_h, int argc, char **argv) {
-  char buf[256];
-
-  for (int i=0; i<argc; i++) {
-    Stitch *st = new Stitch();
-    DataImage *img = new DataImage(0, 0, stitch_w, stitch_h, 4);
-
-    st->load_image(argv[i]);
-
-    st->resample(img, 0.0, 7.0);
-    snprintf(buf, sizeof(buf), "gipfel_%d.tiff", i);
-	img->write_tiff(buf);
-    delete st;
-	delete img;
-  }
- 
-  return 0;
-}  
-#endif
-
-
-static int stitch(int stitch_w, int stitch_h, int argc, char **argv) {
+static int stitch(int stitch_w, int stitch_h, int type, const char *path, int argc, char **argv) {
   Fl_Window *win;
   Fl_Scroll *scroll;
   Stitch *st = new Stitch();
@@ -449,19 +448,39 @@ static int stitch(int stitch_w, int stitch_h, int argc, char **argv) {
   for (int i=0; i<argc; i++) {
     st->load_image(argv[i]);
   }
+  
+  if (type == STITCH_JPEG) {
+
+    st->set_output((OutputImage*) new JPEGOutputImage(path, 90));
+    st->resample(stitch_w, stitch_h, 0.0, 7.0);
+
+  } else if (type == STITCH_TIFF) {
 
-  win = new Fl_Window(0,0, stitch_w, stitch_h);
-  scroll = new Fl_Scroll(0, 0, win->w(), win->h());
-  PreviewOutputImage *img = new PreviewOutputImage(0, 0, stitch_w, stitch_h);
-  win->resizable(scroll);
+    for (int i=0; i<argc; i++) {
+      char buf[1024];
+      char *dot;
 
-  win->show(0, argv); 
+      snprintf(buf, sizeof(buf), "%s/%s", path, argv[i]);
+      dot = strrchr(buf, '.');
+      *dot = '\0';
+      strncat(buf, ".tiff", sizeof(buf));
 
-  st->set_output((OutputImage*) new JPEGOutputImage("/tmp/bla.jpg", 90));
-  //st->set_output((OutputImage*) img);
-  st->resample(stitch_w, stitch_h, 0.0, 7.0);
-  img->redraw();
-  Fl::run();
+      st->set_output(argv[i], (OutputImage*) new TIFFOutputImage(buf));
+    }
+
+    st->resample(stitch_w, stitch_h, 0.0, 7.0);
+
+  } else {
+    win = new Fl_Window(0,0, stitch_w, stitch_h);
+    scroll = new Fl_Scroll(0, 0, win->w(), win->h());
+    PreviewOutputImage *img = new PreviewOutputImage(0, 0, stitch_w, stitch_h);
+    win->resizable(scroll);
+    win->show(0, argv); 
+    st->set_output((OutputImage*) img);
+    st->resample(stitch_w, stitch_h, 0.0, 7.0);
+    img->redraw();
+    Fl::run();
+  }
 
   return 0;
 }
-- 
cgit v1.2.3