summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt4
-rw-r--r--README35
-rw-r--r--tests/CMakeLists.txt4
-rw-r--r--tests/glean/CMakeLists.gl.txt5
-rw-r--r--tests/glean/environ.h3
-rw-r--r--tests/glean/image.h16
-rw-r--r--tests/glean/rdtiff.cpp156
-rw-r--r--tests/glean/trgbtris.cpp196
-rw-r--r--tests/glean/trgbtris.h63
-rw-r--r--tests/glean/wrtiff.cpp134
10 files changed, 6 insertions, 610 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 689631de3..98fa71389 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,8 +10,6 @@ INCLUDE (FindPkgConfig)
project (piglit)
-find_package(TIFF)
-find_package(PNG REQUIRED)
find_package(X11)
@@ -50,7 +48,7 @@ else()
find_package(GLUT REQUIRED)
# The 'REQUIRED' above correctly produces an error for
- # OpenGL and PNG, but there's a bug involving FindGLUT.cmake
+ # OpenGL, but there's a bug involving FindGLUT.cmake
# that fails to produce the error as of CMake 2.8.5.
#
# Instead, CMake keeps going and eventually spams
diff --git a/README b/README
index c114023e7..68108c94d 100644
--- a/README
+++ b/README
@@ -34,7 +34,6 @@ First of all, you need to make sure that the following are installed:
- cmake (http://www.cmake.org)
- GL, glu and glut libraries and development packages (i.e. headers)
- X11 libraries and development packages (i.e. headers)
- - libpng, libtiff and related development packages (i.e. headers)
- waffle (http://people.freedesktop.org/~chadversary/waffle)
Now configure the build system:
@@ -62,7 +61,7 @@ invoke cmake with option "-DCMAKE_SYSTEM_PROCESSOR=i386".
----------
Install development packages.
- $ sudo apt-get install cmake g++ mesa-common-dev libgl1-mesa-dev libtiff4-dev zlib1g-dev libpng12-dev python-numpy freeglut3-dev x11proto-gl-dev libxrender-dev
+ $ sudo apt-get install cmake g++ mesa-common-dev libgl1-mesa-dev python-numpy freeglut3-dev x11proto-gl-dev libxrender-dev
Install additional components for which Ubuntu packages do not yet exist:
- waffle (http://people.freedesktop.org/~chadversary/waffle)
@@ -87,19 +86,8 @@ Configure and build.
$ make
glean
-In order to build glean, TIFF is required but not included as part of
-Xcode. TIFF must be obtained elsewhere and one solution is to get TIFF
-from MacPorts.
-Install MacPorts.
-http://www.macports.org/install.php
-
-Install TIFF through MacPorts. The '+universal' option is needed as
-glean cannot be built as x86_64, only as i386.
- $ sudo port selfupdate
- $ sudo port install tiff +universal
-
-glean will also not build with MacOSX10.7.sdk. If you are trying to
+glean will not build with MacOSX10.7.sdk. If you are trying to
build glean on Mac OS 10.7 (Lion), you will have to use MacOSX10.6.sdk.
$ ccmake .
Set 'CMAKE_OSX_SYSROOT' to '/Developer/SDKs/MacOSX10.6.sdk'. Configure.
@@ -116,10 +104,6 @@ Install development packages.
- make
- opengl
- libGL-devel
- - libpng12-devel
- - libpng14-devel
- - zlib-devel
- - libtiff-devel
- python
- python-numpy
- libglut-devel
@@ -146,15 +130,6 @@ Download and install 'Windows' platform.
Install Microsoft Visual Studio.
Install 'Visual C++' feature.
-Install TIFF for Windows.
-http://gnuwin32.sourceforge.net/packages/tiff.htm
-
-Install Zlib for Windows.
-http://gnuwin32.sourceforge.net/packages/zlib.htm
-
-Install LibPng for Windows.
-http://gnuwin32.sourceforge.net/packages/libpng.htm
-
Download OpenGL Core API and Extension Header Files.
http://www.opengl.org/registry/#headers
Copy header files to MSVC.
@@ -173,12 +148,6 @@ Configure
- NMake Makefiles
- Use default native compilers
Set these variables in the Advanced view.
- - TIFF_INCLUDE_DIR
- - TIFF_LIBRARY
- - ZLIB_INCLUDE_DIR
- - ZLIB_LIBRARY
- - PNG_PNG_INCLUDE_DIR
- - PNG_LIBRARY
- GLUT_INCLUDE_DIR
- GLUT_glut_LIBRARY
Configure
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index c38a72d3a..a85af2af6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -16,9 +16,7 @@ add_subdirectory (shaders)
add_subdirectory (texturing)
add_subdirectory (spec)
-if (TIFF_FOUND)
- add_subdirectory (glean)
-endif (TIFF_FOUND)
+add_subdirectory (glean)
IF(OPENGL_egl_LIBRARY)
add_subdirectory (egl)
diff --git a/tests/glean/CMakeLists.gl.txt b/tests/glean/CMakeLists.gl.txt
index 3485b42d3..b510f36d1 100644
--- a/tests/glean/CMakeLists.gl.txt
+++ b/tests/glean/CMakeLists.gl.txt
@@ -11,7 +11,6 @@ ENDIF ()
include_directories(
${GLEXT_INCLUDE_DIR}
${OPENGL_INCLUDE_PATH}
- ${TIFF_INCLUDE_DIR}
${piglit_SOURCE_DIR}/tests/util
)
@@ -56,7 +55,6 @@ piglit_add_executable (glean
tpointsprite.cpp
treadpix.cpp
treadpixperf.cpp
- trgbtris.cpp
tscissor.cpp
tshaderapi.cpp
tstencil2.cpp
@@ -78,10 +76,8 @@ piglit_add_executable (glean
gl.cpp
image_misc.cpp
pack.cpp
- rdtiff.cpp
reg.cpp
unpack.cpp
- wrtiff.cpp
basic.cpp
lex.cpp
timer.cpp
@@ -93,6 +89,5 @@ target_link_libraries (glean
${OPENGL_gl_LIBRARY}
${OPENGL_glu_LIBRARY}
${X11_X11_LIB}
- ${TIFF_LIBRARY}
${CARBON_LIBRARY}
)
diff --git a/tests/glean/environ.h b/tests/glean/environ.h
index 1bf08f0c9..bb0139e9d 100644
--- a/tests/glean/environ.h
+++ b/tests/glean/environ.h
@@ -87,8 +87,7 @@ class Environment {
string imageFileName(string& dbName, string& testName, int n);
// Return name of image file number ``n''
- // associated with the given test. Suitable
- // for use with Image::readTIFF(), etc.
+ // associated with the given test.
// XXX Doesn't create results directory,
// so resultFileName() must be called before
// using this.
diff --git a/tests/glean/image.h b/tests/glean/image.h
index fd28f49cb..3c6d62c69 100644
--- a/tests/glean/image.h
+++ b/tests/glean/image.h
@@ -95,7 +95,7 @@ class Image {
// descriptive information that might arise when an Image is reused,
// and might permit use of template functions instead of lots of
// switches. Probably not; it would make dynamic type assignment
- // (such as reading a TIFF file) quite awkward.
+ // quite awkward.
public:
@@ -114,8 +114,6 @@ class Image {
const char* filename;
CantOpen(const char* p) {filename = p;}
};
- struct UnsupportedTIFF: public Error { // TIFF we can't handle.
- };
struct RefImageTooLarge: public Error { // Can't register ref image.
};
@@ -228,18 +226,6 @@ class Image {
// test if images are identical
bool operator==(const Image &ref) const;
- // Image arithmetic
- // XXX type and format conversions, with appropriate scaling.
- // XXX image difference
- // XXX minmax, histogram, contrast stretch?
-
- // TIFF I/O utilities:
-
- void readTIFF(const char* filename);
- inline void readTIFF(const std::string& s) { readTIFF(s.c_str()); }
- void writeTIFF(const char* filename);
- inline void writeTIFF(const std::string& s) { writeTIFF(s.c_str()); }
-
// GL operation utilities:
void draw(); // Invoke glDrawPixels.
diff --git a/tests/glean/rdtiff.cpp b/tests/glean/rdtiff.cpp
deleted file mode 100644
index 5e5068f26..000000000
--- a/tests/glean/rdtiff.cpp
+++ /dev/null
@@ -1,156 +0,0 @@
-// BEGIN_COPYRIGHT
-//
-// Copyright (C) 1999 Allen Akin All Rights Reserved.
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the
-// Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ALLEN AKIN BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//
-// END_COPYRIGHT
-
-
-
-
-#include "image.h"
-#include "tiffio.h"
-
-namespace GLEAN {
-
-///////////////////////////////////////////////////////////////////////////////
-// readTIFF - read image from TIFF file, set attributes to match the file
-///////////////////////////////////////////////////////////////////////////////
-void
-Image::readTIFF(const char* filename) {
- // XXX Things we explicitly don't handle:
- // Varying number of bits per sample. Sam's library doesn't
- // handle that.
- // Bits per sample other than 8, 16, or 32.
- // Tile-oriented TIFF files. We only do strip-oriented files.
- // Planar configurations other than contiguous (R,G,B,R,G,B,...).
- // Premultiplied alpha. If there's a fourth color channel,
- // we just assume it's non-premultiplied alpha.
- // Eventually would be good to add a ``validation'' function which
- // checks a file before attempting to read the image it contains.
- // Also: need error-reporting code.
-
- TIFF* tf = TIFFOpen(filename, "r");
- if (!tf)
- throw CantOpen(filename);
-
- uint32 u32;
-
- TIFFGetFieldDefaulted(tf, TIFFTAG_IMAGELENGTH, &u32);
- height(u32);
-
- TIFFGetFieldDefaulted(tf, TIFFTAG_IMAGEWIDTH, &u32);
- width(u32);
-
- uint16 samplesPerPixel;
- TIFFGetFieldDefaulted(tf, TIFFTAG_SAMPLESPERPIXEL, &samplesPerPixel);
- switch (samplesPerPixel) {
- case 1:
- format(GL_LUMINANCE);
- break;
- case 2:
- format(GL_LUMINANCE_ALPHA);
- break;
- case 3:
- format(GL_RGB);
- break;
- case 4:
- format(GL_RGBA);
- break;
- default:
- TIFFClose(tf);
- throw UnsupportedTIFF();
- }
-
- uint16 bitsPerSample;
- TIFFGetFieldDefaulted(tf, TIFFTAG_BITSPERSAMPLE, &bitsPerSample);
- uint16 sampleFormat;
- if (TIFFGetField(tf, TIFFTAG_SAMPLEFORMAT, &sampleFormat) != 1)
- sampleFormat = SAMPLEFORMAT_UINT;
- switch ((sampleFormat << 8) | bitsPerSample) {
- case (SAMPLEFORMAT_UINT << 8) | 8:
- type(GL_UNSIGNED_BYTE);
- break;
- case (SAMPLEFORMAT_UINT << 8) | 16:
- type(GL_UNSIGNED_SHORT);
- break;
- case (SAMPLEFORMAT_UINT << 8) | 32:
- type(GL_UNSIGNED_INT);
- break;
- case (SAMPLEFORMAT_INT << 8) | 8:
- type(GL_BYTE);
- break;
- case (SAMPLEFORMAT_INT << 8) | 16:
- type(GL_SHORT);
- break;
- case (SAMPLEFORMAT_INT << 8) | 32:
- type(GL_INT);
- break;
- case (SAMPLEFORMAT_IEEEFP << 8) | 32:
- type(GL_FLOAT);
- break;
- default:
- TIFFClose(tf);
- throw UnsupportedTIFF();
- }
-
- // At the moment it's not obvious whether we should pad
- // scanlines to achieve a preferred alignment, so we'll just
- // return an alignment that matches the data.
- alignment(1);
- switch (rowSizeInBytes() & 0x7) {
- case 0:
- alignment(8);
- break;
- case 4:
- alignment(4);
- break;
- case 2:
- case 6:
- alignment(2);
- break;
- case 1:
- case 3:
- case 5:
- case 7:
- alignment(1);
- break;
- }
-
- reserve();
-
- {
- // Store rows in reverse order, so that the default TIFF
- // orientation won't result in an upside-down image for
- // OpenGL:
- GLsizei rowStep = rowSizeInBytes();
- char* row = pixels() + (height() - 1) * rowStep;
- for (GLsizei r = 0; r < height(); ++r, row -= rowStep)
- TIFFReadScanline(tf, row, r);
- }
-
- TIFFClose(tf);
-} // Image::readTIFF
-
-}; // namespace GLEAN
diff --git a/tests/glean/trgbtris.cpp b/tests/glean/trgbtris.cpp
deleted file mode 100644
index 565a85fbe..000000000
--- a/tests/glean/trgbtris.cpp
+++ /dev/null
@@ -1,196 +0,0 @@
-// BEGIN_COPYRIGHT -*- glean -*-
-//
-// Copyright (C) 1999 Allen Akin All Rights Reserved.
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the
-// Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ALLEN AKIN BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//
-// END_COPYRIGHT
-
-// trgbtris.cpp: example image-based test to show use of TIFF images
-
-#include "trgbtris.h"
-#include "stats.h"
-#include "rand.h"
-#include "geomutil.h"
-#include "image.h"
-
-#if 0
-#if defined __UNIX__
-#include <unistd.h>
-#endif
-
-#include <iostream>
-#include <fstream>
-#include <algorithm>
-#include "dsconfig.h"
-#include "dsfilt.h"
-#include "dsurf.h"
-#include "winsys.h"
-#include "environ.h"
-#include "rc.h"
-#include "glutils.h"
-#include "trgbtris.h"
-#include "misc.h"
-#endif
-
-namespace {
-
-void
-logStats(GLEAN::BasicStats& stats, GLEAN::Environment* env) {
- env->log << "\t\tmin = " << stats.min() << ", max = " << stats.max()
- << "\n\t\tmean = " << stats.mean() << ", standard deviation = "
- << stats.deviation() << '\n';
-}
-
-} // anonymous namespace
-
-namespace GLEAN {
-
-///////////////////////////////////////////////////////////////////////////////
-// runOne: Run a single test case
-///////////////////////////////////////////////////////////////////////////////
-void
-RGBTriStripTest::runOne(RGBTriStripResult& r, Window& w) {
- static int this_config = 0;
- r.imageNumber = ++this_config;
-
- GLUtils::useScreenCoords(drawingSize + 2, drawingSize + 2);
-
- int nPoints = 20; // Exact value doesn't really matter.
- RandomDouble vRand(142857);
- RandomMesh2D v(1.0, drawingSize, nPoints, 1.0, drawingSize, nPoints,
- vRand);
-
- RandomDouble cRand(271828);
-
- glClear(GL_COLOR_BUFFER_BIT);
- glShadeModel(GL_SMOOTH);
-
- for (int row = 0; row < nPoints - 1; ++row) {
- glBegin(GL_TRIANGLE_STRIP);
- for (int col = 0; col < nPoints; ++col) {
- float r = cRand.next();
- float g = cRand.next();
- float b = cRand.next();
- glColor3f(r, g, b);
- glVertex2fv(v(row, col));
- r = cRand.next();
- g = cRand.next();
- b = cRand.next();
- glColor3f(r, g, b);
- glVertex2fv(v(row + 1, col));
- }
- glEnd();
- }
- w.swap();
-
- Image image(drawingSize + 2, drawingSize + 2, GL_RGB, GL_FLOAT);
- image.read(0, 0); // Invoke glReadPixels to read the image.
- image.writeTIFF(env->imageFileName(name, r.imageNumber));
-
- r.pass = true;
-} // RGBTriStripTest::runOne
-
-///////////////////////////////////////////////////////////////////////////////
-// logOne: Log a single test case
-///////////////////////////////////////////////////////////////////////////////
-void
-RGBTriStripTest::logOne(RGBTriStripResult& r) {
- env->log << name << ": NOTE "
- << r.config->conciseDescription() << '\n'
- << "\tImage number " << r.imageNumber << '\n';
- if (env->options.verbosity)
- env->log <<
- "\tThis test does not check its result. Please view\n"
- "\tthe image to verify that the result is correct, or\n"
- "\tcompare it to a known-good result from a different\n"
- "\trun of glean.\n";
-} // RGBTriStripTest::logOne
-
-///////////////////////////////////////////////////////////////////////////////
-// compareOne: Compare results for a single test case
-///////////////////////////////////////////////////////////////////////////////
-void
-RGBTriStripTest::compareOne(RGBTriStripResult& oldR, RGBTriStripResult& newR) {
- // Fetch the old and new images:
- Image oldI;
- oldI.readTIFF(env->image1FileName(name, oldR.imageNumber));
- Image newI;
- newI.readTIFF(env->image2FileName(name, newR.imageNumber));
-
- // Register the images, and gather statistics about the differences
- // for each color channel:
- Image::Registration reg(oldI.reg(newI));
-
- // Compute worst-case tolerance (1 LSB in the shallowest drawing
- // surface configuration) for each color channel:
- double rTol = 1.0 / (1 << min(oldR.config->r, newR.config->r));
- double gTol = 1.0 / (1 << min(oldR.config->g, newR.config->g));
- double bTol = 1.0 / (1 << min(oldR.config->b, newR.config->b));
-
- // We'll conclude that the images are the ``same'' if the maximum
- // absolute error is no more than 1 LSB (in the shallowest config):
- if (reg.stats[0].max() <= rTol && reg.stats[1].max() <= gTol
- && reg.stats[2].max() <= bTol) {
- if (env->options.verbosity) {
- env->log << name << ": SAME "
- << newR.config->conciseDescription() << '\n';
- if (reg.stats[0].max() == 0 && reg.stats[1].max() == 0
- && reg.stats[1].max() == 0)
- env->log << "\tImages are exactly equal\n";
- else
- env->log << "\tImages are approximately equal\n";
- }
- } else {
- env->log << name << ": DIFF "
- << newR.config->conciseDescription() << '\n'
- << "\tDifference exceeds 1 LSB in at least one "
- "color channel\n";
- }
- if (env->options.verbosity) {
- env->log << "\tred:\n";
- logStats(reg.stats[0], env);
- env->log << "\tgreen:\n";
- logStats(reg.stats[1], env);
- env->log << "\tblue:\n";
- logStats(reg.stats[2], env);
- }
-} // RGBTriStripTest::compareOne
-
-///////////////////////////////////////////////////////////////////////////////
-// The test object itself:
-///////////////////////////////////////////////////////////////////////////////
-RGBTriStripTest rgbTriStripTest("rgbTriStrip", "window, rgb",
-
- "The best approach when designing a test is to make it\n"
- "self-checking; that is, the test itself should determine\n"
- "whether the image or other data structure that it produces is\n"
- "correct. However, some tests are difficult to design in this\n"
- "way, and for some other tests (like stress tests or regression\n"
- "tests concerning previously-reported bugs) it may be\n"
- "unnecessary. For such tests, glean provides mechanisms to\n"
- "save images and compare them to images generated from other\n"
- "runs. This test simply exercises those mechanisms.\n");
-
-
-} // namespace GLEAN
diff --git a/tests/glean/trgbtris.h b/tests/glean/trgbtris.h
deleted file mode 100644
index b41a10bde..000000000
--- a/tests/glean/trgbtris.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// BEGIN_COPYRIGHT -*- glean -*-
-//
-// Copyright (C) 1999 Allen Akin All Rights Reserved.
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the
-// Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ALLEN AKIN BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//
-// END_COPYRIGHT
-
-// trgbtris.h: example image-based test to show use of TIFF images
-
-#ifndef __trgbtris_h__
-#define __trgbtris_h__
-
-#include "tbase.h"
-
-namespace GLEAN {
-
-#define drawingSize 64
-
-class RGBTriStripResult: public BaseResult {
-public:
- bool pass;
- int imageNumber;
-
- void putresults(ostream& s) const {
- s << imageNumber << '\n';
- }
-
- bool getresults(istream& s) {
- s >> imageNumber;
- return s.good();
- }
-};
-
-class RGBTriStripTest: public BaseTest<RGBTriStripResult> {
-public:
- GLEAN_CLASS_WH(RGBTriStripTest, RGBTriStripResult,
- drawingSize, drawingSize);
-}; // class RGBTriStripTest
-
-} // namespace GLEAN
-
-#endif // __trgbtris_h__
diff --git a/tests/glean/wrtiff.cpp b/tests/glean/wrtiff.cpp
deleted file mode 100644
index f4b95bacf..000000000
--- a/tests/glean/wrtiff.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-// BEGIN_COPYRIGHT
-//
-// Copyright (C) 1999 Allen Akin All Rights Reserved.
-//
-// Permission is hereby granted, free of charge, to any person
-// obtaining a copy of this software and associated documentation
-// files (the "Software"), to deal in the Software without
-// restriction, including without limitation the rights to use,
-// copy, modify, merge, publish, distribute, sublicense, and/or
-// sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following
-// conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the
-// Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-// KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-// WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ALLEN AKIN BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-// AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
-// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-//
-// END_COPYRIGHT
-
-
-
-
-// Implementation of image data, attribute, and I/O
-
-#include "image.h"
-#include "tiffio.h"
-
-namespace GLEAN {
-
-///////////////////////////////////////////////////////////////////////////////
-// writeTIFF - write image to TIFF file
-///////////////////////////////////////////////////////////////////////////////
-void
-Image::writeTIFF(const char* filename) {
- static uint16 unassocAlpha[] = {EXTRASAMPLE_UNASSALPHA};
- GLsizei rowStep = rowSizeInBytes();
-
- TIFF* tf = TIFFOpen(filename, "w");
- if (!tf)
- throw CantOpen(filename);
-
- TIFFSetField(tf, TIFFTAG_IMAGELENGTH, height());
- TIFFSetField(tf, TIFFTAG_IMAGEWIDTH, width());
- TIFFSetField(tf, TIFFTAG_XRESOLUTION, 100.0);
- TIFFSetField(tf, TIFFTAG_YRESOLUTION, 100.0);
- TIFFSetField(tf, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);
- TIFFSetField(tf, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
- TIFFSetField(tf, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
- TIFFSetField(tf, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
- // LZW would have been acceptable, were it not for patent
- // issues.
- TIFFSetField(tf, TIFFTAG_ROWSPERSTRIP, height());
-
- switch (format()) {
- case GL_LUMINANCE:
- TIFFSetField(tf, TIFFTAG_SAMPLESPERPIXEL, 1);
- TIFFSetField(tf, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
- break;
- case GL_LUMINANCE_ALPHA:
- TIFFSetField(tf, TIFFTAG_SAMPLESPERPIXEL, 2);
- TIFFSetField(tf, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
- TIFFSetField(tf, TIFFTAG_EXTRASAMPLES, 1, unassocAlpha);
- break;
- case GL_RGB:
- TIFFSetField(tf, TIFFTAG_SAMPLESPERPIXEL, 3);
- TIFFSetField(tf, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
- break;
- case GL_RGBA:
- TIFFSetField(tf, TIFFTAG_SAMPLESPERPIXEL, 4);
- TIFFSetField(tf, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
- TIFFSetField(tf, TIFFTAG_EXTRASAMPLES, 1, unassocAlpha);
- break;
- default:
- TIFFClose(tf);
- throw BadFormat(format());
- }
-
- switch (type()) {
- case GL_BYTE:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
- break;
- case GL_UNSIGNED_BYTE:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 8);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case GL_SHORT:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 16);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
- break;
- case GL_UNSIGNED_SHORT:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 16);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case GL_INT:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 32);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
- break;
- case GL_UNSIGNED_INT:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 32);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
- break;
- case GL_FLOAT:
- TIFFSetField(tf, TIFFTAG_BITSPERSAMPLE, 32);
- TIFFSetField(tf, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
- break;
- default:
- TIFFClose(tf);
- throw BadType(type());
- }
-
- {
- // Write rows in reverse order, so that the usual OpenGL
- // orientation won't result in an upside-down image for
- // naive TIFF readers:
- char* row = pixels() + (height() - 1) * rowStep;
- for (GLsizei r = 0; r < height(); ++r, row -= rowStep)
- TIFFWriteScanline(tf, row, r, 0);
- }
-
- TIFFClose(tf);
-}; // Image::writeTIFF
-
-
-}; // namespace GLEAN