diff --git a/panda/src/glxdisplay/glxGraphicsWindow.cxx b/panda/src/glxdisplay/glxGraphicsWindow.cxx index c258de071b..244bb635d8 100644 --- a/panda/src/glxdisplay/glxGraphicsWindow.cxx +++ b/panda/src/glxdisplay/glxGraphicsWindow.cxx @@ -19,17 +19,18 @@ #include "glxDisplay.h" #include "config_glxdisplay.h" -#include -#include -#include -#include -#include -#include +#include "graphicsPipe.h" +#include "keyboardButton.h" +#include "mouseButton.h" +#include "glGraphicsStateGuardian.h" +#include "pStatTimer.h" +#include "clockObject.h" #include #include #include #include +#include // for sprintf() //////////////////////////////////////////////////////////////////// // Static variables diff --git a/panda/src/pnmimage/pnmFileType.cxx b/panda/src/pnmimage/pnmFileType.cxx index a21f6d80bb..ad42542ac5 100644 --- a/panda/src/pnmimage/pnmFileType.cxx +++ b/panda/src/pnmimage/pnmFileType.cxx @@ -114,7 +114,7 @@ matches_magic_number(const string &) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileType:: -make_reader(FILE *, bool, const string &) { +make_reader(istream *, bool, const string &) { return NULL; } @@ -126,7 +126,7 @@ make_reader(FILE *, bool, const string &) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileType:: -make_writer(FILE *, bool) { +make_writer(ostream *, bool) { return NULL; } @@ -144,7 +144,7 @@ init_pnm() { if (!_did_init_pnm) { _did_init_pnm = true; - // No reason to do anything here now. + // No reason to do anything here nowadays. /* // Make an argc/argv style copy of the ExecutionEnvironment's diff --git a/panda/src/pnmimage/pnmFileType.h b/panda/src/pnmimage/pnmFileType.h index b11dc398cd..5074168be7 100644 --- a/panda/src/pnmimage/pnmFileType.h +++ b/panda/src/pnmimage/pnmFileType.h @@ -52,9 +52,9 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); protected: static void init_pnm(); diff --git a/panda/src/pnmimage/pnmImageHeader.cxx b/panda/src/pnmimage/pnmImageHeader.cxx index 00e9eaa891..2a9baadff5 100644 --- a/panda/src/pnmimage/pnmImageHeader.cxx +++ b/panda/src/pnmimage/pnmImageHeader.cxx @@ -21,6 +21,8 @@ #include "pnmFileType.h" #include "pnmReader.h" #include "config_pnmimage.h" +#include "virtualFileSystem.h" +#include "config_util.h" //////////////////////////////////////////////////////////////////// // Function: PNMImageHeader::read_header @@ -63,13 +65,12 @@ make_reader(const Filename &filename, PNMFileType *type) const { pnmimage_cat.debug() << "Reading image from " << filename << "\n"; } - Filename actual_name = Filename::binary_filename(filename); - bool owns_file; - FILE *file; + bool owns_file = false; + istream *file = (istream *)NULL; if (filename == "-") { owns_file = false; - file = stdin; + file = &cin; if (pnmimage_cat.is_debug()) { pnmimage_cat.debug() @@ -77,21 +78,25 @@ make_reader(const Filename &filename, PNMFileType *type) const { } } else { - if (!actual_name.exists()) { - if (pnmimage_cat.is_debug()) { - pnmimage_cat.debug() - << "File " << filename << " does not exist.\n"; + if (use_vfs) { + VirtualFileSystem *vfs = VirtualFileSystem::get_global_ptr(); + owns_file = true; + file = vfs->open_read_file(filename); + + } else { + ifstream *new_istream = new ifstream; + Filename actual_name = Filename::binary_filename(filename); + if (!actual_name.open_read(*new_istream)) { + delete new_istream; + + } else { + owns_file = true; + file = new_istream; } - // The file doesn't exist. Don't pass it through libpnm, which - // will abort. - return NULL; } - owns_file = true; - string os_specific = actual_name.to_os_specific(); - file = fopen((char *)os_specific.c_str(), "rb"); } - if (file == (FILE *)NULL) { + if (file == (istream *)NULL) { if (pnmimage_cat.is_debug()) { pnmimage_cat.debug() << "Unable to open file.\n"; @@ -111,10 +116,10 @@ make_reader(const Filename &filename, PNMFileType *type) const { // or NULL if the file cannot be read for some reason. // // owns_file should be set true if the PNMReader is to -// be considered the owner of the FILE stream (in which -// case the stream will be closed on completion, whether -// successful or not), or false if it should not close -// it. +// be considered the owner of the stream pointer (in +// which case the stream will be deleted on completion, +// whether successful or not), or false if it should not +// delete it. // // The filename parameter is optional here, since the // file has already been opened; it is only used to @@ -133,7 +138,7 @@ make_reader(const Filename &filename, PNMFileType *type) const { // needed. //////////////////////////////////////////////////////////////////// PNMReader *PNMImageHeader:: -make_reader(FILE *file, bool owns_file, const Filename &filename, +make_reader(istream *file, bool owns_file, const Filename &filename, string magic_number, PNMFileType *type) const { if (type == (PNMFileType *)NULL) { if (!read_magic_number(file, magic_number, 2)) { @@ -143,7 +148,7 @@ make_reader(FILE *file, bool owns_file, const Filename &filename, << "Image file appears to be empty.\n"; } if (owns_file) { - fclose(file); + delete file; } return NULL; } @@ -200,14 +205,14 @@ make_reader(FILE *file, bool owns_file, const Filename &filename, write_types(pnmimage_cat.error(false), 2); } if (owns_file) { - fclose(file); + delete file; } return NULL; } PNMReader *reader = type->make_reader(file, owns_file, magic_number); if (reader == NULL && owns_file) { - fclose(file); + delete file; } if (!reader->is_valid()) { @@ -237,13 +242,12 @@ make_writer(const Filename &filename, PNMFileType *type) const { pnmimage_cat.debug() << "Writing image to " << filename << "\n"; } - Filename actual_name = Filename::binary_filename(filename); - bool owns_file; - FILE *file; + bool owns_file = false; + ostream *file = (ostream *)NULL; if (filename == "-") { owns_file = false; - file = stdout; + file = &cout; if (pnmimage_cat.is_debug()) { pnmimage_cat.debug() @@ -251,12 +255,18 @@ make_writer(const Filename &filename, PNMFileType *type) const { } } else { - owns_file = true; - string os_specific = actual_name.to_os_specific(); - file = fopen((char *)os_specific.c_str(), "wb"); + ofstream *new_ostream = new ofstream; + Filename actual_name = Filename::binary_filename(filename); + if (!actual_name.open_write(*new_ostream)) { + delete new_ostream; + + } else { + owns_file = true; + file = new_ostream; + } } - if (file == (FILE *)NULL) { + if (file == (ostream *)NULL) { if (pnmimage_cat.is_debug()) { pnmimage_cat.debug() << "Unable to write to file.\n"; @@ -275,10 +285,10 @@ make_writer(const Filename &filename, PNMFileType *type) const { // NULL if the file cannot be written for some reason. // // owns_file should be set true if the PNMWriter is to -// be considered the owner of the FILE stream (in which -// case the stream will be closed on completion, whether -// successful or not), or false if it should not close -// it. +// be considered the owner of the stream pointer (in +// which case the stream will be deleted on completion, +// whether successful or not), or false if it should not +// delete it. // // The filename parameter is optional here, since the // file has already been opened; it is only used to @@ -292,7 +302,7 @@ make_writer(const Filename &filename, PNMFileType *type) const { // needed. //////////////////////////////////////////////////////////////////// PNMWriter *PNMImageHeader:: -make_writer(FILE *file, bool owns_file, const Filename &filename, +make_writer(ostream *file, bool owns_file, const Filename &filename, PNMFileType *type) const { if (type == (PNMFileType *)NULL && !filename.empty()) { // We don't know the type; attempt to guess it from the filename @@ -328,14 +338,14 @@ make_writer(FILE *file, bool owns_file, const Filename &filename, << "Cannot determine type of image file " << filename << ".\n"; } if (owns_file) { - fclose(file); + delete file; } return NULL; } PNMWriter *writer = type->make_writer(file, owns_file); if (writer == NULL && owns_file) { - fclose(file); + delete file; } return writer; @@ -352,10 +362,10 @@ make_writer(FILE *file, bool owns_file, const Filename &filename, // could be read. //////////////////////////////////////////////////////////////////// bool PNMImageHeader:: -read_magic_number(FILE *file, string &magic_number, int num_bytes) { +read_magic_number(istream *file, string &magic_number, int num_bytes) { while ((int)magic_number.size() < num_bytes) { - int ch = getc(file); - if (ch == EOF) { + int ch = file->get(); + if (file->eof() || file->fail()) { return false; } magic_number += (char)ch; diff --git a/panda/src/pnmimage/pnmImageHeader.h b/panda/src/pnmimage/pnmImageHeader.h index cd67fe017c..abc7b005d2 100644 --- a/panda/src/pnmimage/pnmImageHeader.h +++ b/panda/src/pnmimage/pnmImageHeader.h @@ -80,18 +80,18 @@ public: PNMReader *make_reader(const Filename &filename, PNMFileType *type = NULL) const; - PNMReader *make_reader(FILE *file, bool owns_file = true, + PNMReader *make_reader(istream *file, bool owns_file = true, const Filename &filename = Filename(), string magic_number = string(), PNMFileType *type = NULL) const; PNMWriter *make_writer(const Filename &filename, PNMFileType *type = NULL) const; - PNMWriter *make_writer(FILE *file, bool owns_file = true, + PNMWriter *make_writer(ostream *file, bool owns_file = true, const Filename &filename = Filename(), PNMFileType *type = NULL) const; - static bool read_magic_number(FILE *file, string &magic_number, + static bool read_magic_number(istream *file, string &magic_number, int num_bytes); void output(ostream &out) const; diff --git a/panda/src/pnmimage/pnmReader.I b/panda/src/pnmimage/pnmReader.I index d9a31b332b..18aea18a4a 100644 --- a/panda/src/pnmimage/pnmReader.I +++ b/panda/src/pnmimage/pnmReader.I @@ -22,7 +22,7 @@ // Description: //////////////////////////////////////////////////////////////////// INLINE PNMReader:: -PNMReader(PNMFileType *type, FILE *file, bool owns_file) : +PNMReader(PNMFileType *type, istream *file, bool owns_file) : _type(type), _owns_file(owns_file), _file(file), diff --git a/panda/src/pnmimage/pnmReader.cxx b/panda/src/pnmimage/pnmReader.cxx index aa5bc2fd6d..1fb8425b93 100644 --- a/panda/src/pnmimage/pnmReader.cxx +++ b/panda/src/pnmimage/pnmReader.cxx @@ -26,8 +26,9 @@ PNMReader:: ~PNMReader() { if (_owns_file) { - fclose(_file); + delete _file; } + _file = (istream *)NULL; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pnmimage/pnmReader.h b/panda/src/pnmimage/pnmReader.h index b6848d4d39..e3b5fd11f9 100644 --- a/panda/src/pnmimage/pnmReader.h +++ b/panda/src/pnmimage/pnmReader.h @@ -34,7 +34,7 @@ //////////////////////////////////////////////////////////////////// class EXPCL_PANDA PNMReader : public PNMImageHeader { protected: - INLINE PNMReader(PNMFileType *type, FILE *file, bool owns_file); + INLINE PNMReader(PNMFileType *type, istream *file, bool owns_file); public: virtual ~PNMReader(); @@ -52,7 +52,7 @@ public: protected: PNMFileType *_type; bool _owns_file; - FILE *_file; + istream *_file; bool _is_valid; }; diff --git a/panda/src/pnmimage/pnmReaderTypes.h b/panda/src/pnmimage/pnmReaderTypes.h deleted file mode 100644 index 9ab9d2d991..0000000000 --- a/panda/src/pnmimage/pnmReaderTypes.h +++ /dev/null @@ -1,172 +0,0 @@ -// Filename: pnmReaderTypes.h -// Created by: drose (14Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - -#ifndef PNMREADERTYPES_H -#define PNMREADERTYPES_H - -#include - -#include "pnmReader.h" - -class EXPCL_PANDA PNMReaderPNM : public PNMReader { -public: - PNMReaderPNM(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::PNM; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); - - int ftype; -}; - -class EXPCL_PANDA PNMReaderSGI : public PNMReader { -public: - PNMReaderSGI(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::SGI; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); - ~PNMReaderSGI(); - - typedef struct { - long start; /* offset in file */ - long length; /* length of compressed scanline */ - } TabEntry; - - TabEntry *table; - long table_start; - int current_row; - int zsize, bpc; -}; - -class EXPCL_PANDA PNMReaderAlias : public PNMReader { -public: - PNMReaderAlias(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::Alias; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); -}; - -class EXPCL_PANDA PNMReaderRadiance : public PNMReader { -public: - PNMReaderRadiance(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::Radiance; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); -}; - -#ifndef WIN32_VC -class EXPCL_PANDA PNMReaderTIFF : public PNMReader { -public: - PNMReaderTIFF(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::TIFF; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); - ~PNMReaderTIFF(); - - unsigned short photomet; - unsigned short bps, spp; - xel colormap[1024]; // == MAXCOLORS in pnm-image-tiff.cxx - - int current_row; - struct tiff *tif; -}; -#endif - -class EXPCL_PANDA PNMReaderIMG : public PNMReader { -public: - PNMReaderIMG(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::IMG; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); -}; - -class EXPCL_PANDA PNMReaderSoftImage : public PNMReader { -public: - PNMReaderSoftImage(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::SoftImage; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); - - enum { unknown, rgb, rgba, rgb_a } soft_color; - int rgb_ctype, alpha_ctype; -}; - -class EXPCL_PANDA PNMReaderYUV : public PNMReader { -public: - PNMReaderYUV(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::YUV; - } - - virtual bool ReadRow(xel *row_data, xelval *alpha_data); - ~PNMReaderYUV(); - - long *yuvbuf; -}; - -class EXPCL_PANDA PNMReaderBMP : public PNMReader { -public: - PNMReaderBMP(FILE *file, int already_read_magic); - - virtual FileType Type() const { - return PNMImageHeader::BMP; - } - - virtual int ReadData(xel *array, xelval *alpha); - - virtual bool SupportsStreaming() const { - return false; - } - - unsigned long pos; - - unsigned long offBits; - - unsigned short cBitCount; - int indexed; - int classv; - - pixval R[256]; /* reds */ - pixval G[256]; /* greens */ - pixval B[256]; /* blues */ -}; - -#endif - - diff --git a/panda/src/pnmimage/pnmWriter.I b/panda/src/pnmimage/pnmWriter.I index a8cabc36d6..350c910dd9 100644 --- a/panda/src/pnmimage/pnmWriter.I +++ b/panda/src/pnmimage/pnmWriter.I @@ -23,7 +23,7 @@ // Description: //////////////////////////////////////////////////////////////////// INLINE PNMWriter:: -PNMWriter(PNMFileType *type, FILE *file, bool owns_file) : +PNMWriter(PNMFileType *type, ostream *file, bool owns_file) : _type(type), _owns_file(owns_file), _file(file) diff --git a/panda/src/pnmimage/pnmWriter.cxx b/panda/src/pnmimage/pnmWriter.cxx index e550737aaa..7a371101af 100644 --- a/panda/src/pnmimage/pnmWriter.cxx +++ b/panda/src/pnmimage/pnmWriter.cxx @@ -26,8 +26,9 @@ PNMWriter:: ~PNMWriter() { if (_owns_file) { - fclose(_file); + delete _file; } + _file = (ostream *)NULL; } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/pnmimage/pnmWriter.h b/panda/src/pnmimage/pnmWriter.h index 670fb6e0f4..22f4a2b6b8 100644 --- a/panda/src/pnmimage/pnmWriter.h +++ b/panda/src/pnmimage/pnmWriter.h @@ -33,7 +33,7 @@ //////////////////////////////////////////////////////////////////// class EXPCL_PANDA PNMWriter : public PNMImageHeader { protected: - INLINE PNMWriter(PNMFileType *type, FILE *file, bool owns_file); + INLINE PNMWriter(PNMFileType *type, ostream *file, bool owns_file); public: @@ -62,7 +62,7 @@ public: protected: PNMFileType *_type; bool _owns_file; - FILE *_file; + ostream *_file; }; #include "pnmWriter.I" diff --git a/panda/src/pnmimage/pnmWriterTypes.h b/panda/src/pnmimage/pnmWriterTypes.h deleted file mode 100644 index e3a52c10db..0000000000 --- a/panda/src/pnmimage/pnmWriterTypes.h +++ /dev/null @@ -1,184 +0,0 @@ -// Filename: pnmWriterTypes.h -// Created by: drose (14Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - -#ifndef PNMWRITERTYPES_H -#define PNMWRITERTYPES_H - -#include - -#include "pnmWriter.h" - -class EXPCL_PANDA PNMWriterPNM : public PNMWriter { -public: - PNMWriterPNM(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::PNM; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); - - int pnm_format; -}; - -class EXPCL_PANDA PNMWriterSGI : public PNMWriter { -public: - PNMWriterSGI(FILE *file) : PNMWriter(file) {} - ~PNMWriterSGI(); - - virtual FileType Type() const { - return PNMImageHeader::SGI; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); - - -protected: - - typedef struct { - long start; /* offset in file */ - long length; /* length of compressed scanline */ - } TabEntry; - - typedef short ScanElem; - typedef struct { - ScanElem * data; - long length; - } ScanLine; - - TabEntry &Table(int chan) { - return table[chan * rows + current_row]; - } - - void write_header(char *imagename); - void WriteTable(); - void WriteChannels(ScanLine channel[], void (*put)(FILE *, short)); - void BuildScanline(ScanLine output[], xel *row_data, xelval *alpha_data); - ScanElem *Compress(ScanElem *temp, ScanLine &output); - int RLECompress(ScanElem *inbuf, int size); - - TabEntry *table; - long table_start; - int current_row; - int zsize, bpc; - int channels, dimensions; - int new_maxval; - - ScanElem *rletemp; -}; - -class EXPCL_PANDA PNMWriterAlias : public PNMWriter { -public: - PNMWriterAlias(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::Alias; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); -}; - -class EXPCL_PANDA PNMWriterRadiance : public PNMWriter { -public: - PNMWriterRadiance(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::Radiance; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); -}; - -#ifndef WIN32_VC -class EXPCL_PANDA PNMWriterTIFF : public PNMWriter { -public: - PNMWriterTIFF(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::TIFF; - } - - virtual int WriteData(xel *array, xelval *alpha); - virtual bool SupportsStreaming() const { - return false; - } -}; -#endif - -class EXPCL_PANDA PNMWriterIMG : public PNMWriter { -public: - PNMWriterIMG(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::IMG; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); -}; - -class EXPCL_PANDA PNMWriterSoftImage : public PNMWriter { -public: - PNMWriterSoftImage(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::SoftImage; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); -}; - -class EXPCL_PANDA PNMWriterYUV : public PNMWriter { -public: - PNMWriterYUV(FILE *file) : PNMWriter(file) { - yuvbuf = NULL; - } - - virtual FileType Type() const { - return PNMImageHeader::YUV; - } - - virtual bool WriteHeader(); - virtual bool WriteRow(xel *row_data, xelval *alpha_data); - ~PNMWriterYUV(); - - unsigned char *yuvbuf; -}; - -class EXPCL_PANDA PNMWriterBMP : public PNMWriter { -public: - PNMWriterBMP(FILE *file) : PNMWriter(file) {} - - virtual FileType Type() const { - return PNMImageHeader::BMP; - } - - virtual int WriteData(xel *array, xelval *alpha); - virtual bool SupportsStreaming() const { - return false; - } -}; - -#endif - - diff --git a/panda/src/pnmimage/pnmbitio.cxx b/panda/src/pnmimage/pnmbitio.cxx index fe381fa0f6..ec3ba8ea88 100644 --- a/panda/src/pnmimage/pnmbitio.cxx +++ b/panda/src/pnmimage/pnmbitio.cxx @@ -17,8 +17,8 @@ #include struct bitstream { - FILE * - f; /* bytestream */ + istream *inf; + ostream *outf; unsigned long bitbuf; /* bit buffer */ int @@ -46,19 +46,39 @@ struct bitstream */ EXPCL_PANDA struct bitstream * -pm_bitinit(FILE *f, char *mode) +pm_bitinit(istream *f, char *mode) { struct bitstream *ans = (struct bitstream *)0; if(!f || !mode || !*mode) return ans; - if(strcmp(mode, "r") && strcmp(mode, "w")) + if(strcmp(mode, "r")) return ans; ans = (struct bitstream *)calloc(1, sizeof(struct bitstream)); if(ans) { - ans->f = f; + ans->inf = f; + ans->mode = *mode; + } + + return ans; +} + +EXPCL_PANDA struct bitstream * +pm_bitinit(ostream *f, char *mode) +{ + struct bitstream *ans = (struct bitstream *)0; + + if(!f || !mode || !*mode) + return ans; + if(strcmp(mode, "w")) + return ans; + + ans = (struct bitstream *)calloc(1, sizeof(struct bitstream)); + if(ans) + { + ans->outf = f; ans->mode = *mode; } @@ -102,7 +122,7 @@ pm_bitfini(struct bitstream *b) BitPut(b, 0, (long)8-(b->nbitbuf)); c = (char) BitGet(b, (long)8); - if(putc(c, b->f) == EOF) + if(!b->outf->put(c)) { return -1; } @@ -137,7 +157,7 @@ pm_bitread(struct bitstream *b, unsigned long nbits, unsigned long *val) while (b->nbitbuf < (signed long)nbits) { - if((c = getc(b->f)) == EOF) + if((c = b->inf->get()) == EOF) { return -1; } @@ -173,7 +193,7 @@ pm_bitwrite(struct bitstream *b, unsigned long nbits, unsigned long val) { c = (char) BitGet(b, (long)8); - if(putc(c, b->f) == EOF) + if(!b->outf->put(c)) { return -1; } diff --git a/panda/src/pnmimage/pnmbitio.h b/panda/src/pnmimage/pnmbitio.h index 7f6fab0441..3ce1168cd0 100644 --- a/panda/src/pnmimage/pnmbitio.h +++ b/panda/src/pnmimage/pnmbitio.h @@ -19,7 +19,7 @@ #include "pandabase.h" #include "pnmimage_base.h" -typedef struct bitstream *BITSTREAM; +typedef struct bitstream *BITSTREAM; /* * pm_bitinit() - allocate and return a BITSTREAM for the given FILE*. @@ -30,7 +30,8 @@ typedef struct bitstream *BITSTREAM; * Returns 0 on error. */ -extern EXPCL_PANDA BITSTREAM pm_bitinit(FILE *f, char *mode); +extern EXPCL_PANDA BITSTREAM pm_bitinit(istream *f, char *mode); +extern EXPCL_PANDA BITSTREAM pm_bitinit(ostream *f, char *mode); /* * pm_bitfini() - deallocate the given BITSTREAM. diff --git a/panda/src/pnmimage/pnmimage_base.cxx b/panda/src/pnmimage/pnmimage_base.cxx index fd64f59982..e4edcca732 100644 --- a/panda/src/pnmimage/pnmimage_base.cxx +++ b/panda/src/pnmimage/pnmimage_base.cxx @@ -17,9 +17,12 @@ //////////////////////////////////////////////////////////////////// #include "pnmimage_base.h" +#include "streamReader.h" +#include "streamWriter.h" #include -#include +#include // for sprintf() + //////////////////////////////////////////////////////////////////// // Function: pm_message @@ -124,105 +127,57 @@ pm_freerow(char *itrow) { */ int -pm_readbigshort(FILE* in, short* sP) - { - int c; - - if ( (c = getc( in )) == EOF ) - return -1; - *sP = ( c & 0xff ) << 8; - if ( (c = getc( in )) == EOF ) - return -1; - *sP |= c & 0xff; - return 0; - } +pm_readbigshort(istream *in, short *sP) { + StreamReader reader(in); + *sP = reader.get_be_int16(); + return (!in->eof() && !in->fail()) ? 0 : -1; +} int -pm_writebigshort( FILE* out, short s ) - { - (void) putc( ( s >> 8 ) & 0xff, out ); - (void) putc( s & 0xff, out ); - return 0; - } +pm_writebigshort(ostream *out, short s) { + StreamWriter writer(out); + writer.add_be_int16(s); + return (!out->fail()) ? 0 : -1; +} int -pm_readbiglong(FILE* in, long* lP) - { - int c; - - if ( (c = getc( in )) == EOF ) - return -1; - *lP = ( c & 0xff ) << 24; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= ( c & 0xff ) << 16; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= ( c & 0xff ) << 8; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= c & 0xff; - return 0; - } +pm_readbiglong(istream *in, long *lP) { + StreamReader reader(in); + *lP = reader.get_be_int32(); + return (!in->eof() && !in->fail()) ? 0 : -1; +} int -pm_writebiglong(FILE* out, long l) - { - (void) putc( ( l >> 24 ) & 0xff, out ); - (void) putc( ( l >> 16 ) & 0xff, out ); - (void) putc( ( l >> 8 ) & 0xff, out ); - (void) putc( l & 0xff, out ); - return 0; - } +pm_writebiglong(ostream *out, long l) { + StreamWriter writer(out); + writer.add_be_int32(l); + return (!out->fail()) ? 0 : -1; +} int -pm_readlittleshort(FILE* in, short* sP) - { - int c; - - if ( (c = getc( in )) == EOF ) - return -1; - *sP = c & 0xff; - if ( (c = getc( in )) == EOF ) - return -1; - *sP |= ( c & 0xff ) << 8; - return 0; - } +pm_readlittleshort(istream *in, short *sP) { + StreamReader reader(in); + *sP = reader.get_int16(); + return (!in->eof() && !in->fail()) ? 0 : -1; +} int -pm_writelittleshort( FILE* out, short s ) - { - (void) putc( s & 0xff, out ); - (void) putc( ( s >> 8 ) & 0xff, out ); - return 0; - } +pm_writelittleshort(ostream *out, short s) { + StreamWriter writer(out); + writer.add_int16(s); + return (!out->fail()) ? 0 : -1; +} int -pm_readlittlelong(FILE* in, long* lP) - { - int c; - - if ( (c = getc( in )) == EOF ) - return -1; - *lP = c & 0xff; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= ( c & 0xff ) << 8; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= ( c & 0xff ) << 16; - if ( (c = getc( in )) == EOF ) - return -1; - *lP |= ( c & 0xff ) << 24; - return 0; - } +pm_readlittlelong(istream *in, long *lP) { + StreamReader reader(in); + *lP = reader.get_int32(); + return (!in->eof() && !in->fail()) ? 0 : -1; +} int -pm_writelittlelong(FILE* out, long l) - { - (void) putc( l & 0xff, out ); - (void) putc( ( l >> 8 ) & 0xff, out ); - (void) putc( ( l >> 16 ) & 0xff, out ); - (void) putc( ( l >> 24 ) & 0xff, out ); - return 0; - } +pm_writelittlelong(ostream *out, long l) { + StreamWriter writer(out); + writer.add_int32(l); + return (!out->fail()) ? 0 : -1; +} diff --git a/panda/src/pnmimage/pnmimage_base.h b/panda/src/pnmimage/pnmimage_base.h index 8bdbd42a70..0abf66e1df 100644 --- a/panda/src/pnmimage/pnmimage_base.h +++ b/panda/src/pnmimage/pnmimage_base.h @@ -25,7 +25,6 @@ #include "pandabase.h" #include -#include // Since we no longer include pnm.h directly, we have to provide our // own definitions for xel and xelval. @@ -85,14 +84,14 @@ EXPCL_PANDA int pm_bitstomaxval(int bits); EXPCL_PANDA char *pm_allocrow(int cols, int size); EXPCL_PANDA void pm_freerow(char *itrow); -EXPCL_PANDA int pm_readbigshort(FILE *in, short *sP); -EXPCL_PANDA int pm_writebigshort(FILE *out, short s); -EXPCL_PANDA int pm_readbiglong(FILE *in, long *lP); -EXPCL_PANDA int pm_writebiglong(FILE *out, long l); -EXPCL_PANDA int pm_readlittleshort(FILE *in, short *sP); -EXPCL_PANDA int pm_writelittleshort(FILE *out, short s); -EXPCL_PANDA int pm_readlittlelong(FILE *in, long *lP); -EXPCL_PANDA int pm_writelittlelong(FILE *out, long l); +EXPCL_PANDA int pm_readbigshort(istream *in, short *sP); +EXPCL_PANDA int pm_writebigshort(ostream *out, short s); +EXPCL_PANDA int pm_readbiglong(istream *in, long *lP); +EXPCL_PANDA int pm_writebiglong(ostream *out, long l); +EXPCL_PANDA int pm_readlittleshort(istream *in, short *sP); +EXPCL_PANDA int pm_writelittleshort(ostream *out, short s); +EXPCL_PANDA int pm_readlittlelong(istream *in, long *lP); +EXPCL_PANDA int pm_writelittlelong(ostream *out, long l); // These ratios are used to compute the brightness of a colored pixel; they diff --git a/panda/src/pnmimagetypes/Sources.pp b/panda/src/pnmimagetypes/Sources.pp index 8b239ce07b..0d11545db9 100644 --- a/panda/src/pnmimagetypes/Sources.pp +++ b/panda/src/pnmimagetypes/Sources.pp @@ -14,10 +14,9 @@ #define SOURCES \ config_pnmimagetypes.h pnmFileTypeAlias.h pnmFileTypeBMP.h \ - pnmFileTypeIMG.h pnmFileTypeRadiance.h \ + pnmFileTypeIMG.h \ pnmFileTypeSGI.h pnmFileTypeSoftImage.h \ - pnmFileTypeTGA.h pnmFileTypeYUV.h color.c colrops.c resolu.c \ - header.c \ + pnmFileTypeTGA.h \ $[if $[HAVE_TIFF], pnmFileTypeTIFF.cxx pnmFileTypeTIFF.h] \ $[if $[HAVE_JPEG], pnmFileTypeJPG.h] \ $[if $[HAVE_JPEG2000], pnmFileTypeJPG2000.h] @@ -26,10 +25,10 @@ config_pnmimagetypes.cxx pnmFileTypeAlias.cxx \ pnmFileTypeBMPReader.cxx pnmFileTypeBMPWriter.cxx \ pnmFileTypeIMG.cxx pnmFileTypeBMP.cxx \ - pnmFileTypeRadiance.cxx pnmFileTypeSGI.cxx \ + pnmFileTypeSGI.cxx \ pnmFileTypeSGIReader.cxx pnmFileTypeSGIWriter.cxx \ pnmFileTypeSoftImage.cxx \ - pnmFileTypeTGA.cxx pnmFileTypeYUV.cxx \ + pnmFileTypeTGA.cxx \ $[if $[HAVE_JPEG], pnmFileTypeJPG.cxx pnmFileTypeJPGReader.cxx pnmFileTypeJPGWriter.cxx] \ $[if $[HAVE_JPEG2000], pnmFileTypeJPG2000.cxx pnmFileTypeJPG2000Reader.cxx pnmFileTypeJPG2000Writer.cxx] diff --git a/panda/src/pnmimagetypes/color.c b/panda/src/pnmimagetypes/color.c deleted file mode 100644 index cb6df36444..0000000000 --- a/panda/src/pnmimagetypes/color.c +++ /dev/null @@ -1,292 +0,0 @@ -/* Filename: color.c - * Created by: - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * PANDA 3D SOFTWARE - * Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved - * - * All use of this software is subject to the terms of the Panda 3d - * Software license. You should have received a copy of this license - * along with this source code; you will also find a current copy of - * the license at http://www.panda3d.org/license.txt . - * - * To contact the maintainers of this program write to - * panda3d@yahoogroups.com . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * color.c - routines for color calculations. - * - * 10/10/85 - */ - -#include - -#include - -#include "color.h" - -#ifdef WIN32_VC -#include -#endif - -#define MINELEN 8 /* minimum scanline length for encoding */ -#define MAXELEN 0x7fff /* maximum scanline length for encoding */ -#define MINRUN 4 /* minimum run length */ - -void setcolr(register COLR, double, double, double); -void colr_color(register COLOR, register COLR); - - -char * -tempbuffer(unsigned len) /* get a temporary buffer */ -{ -#ifndef WIN32_VC - extern char *malloc(size_t), *realloc(void *, size_t); -#endif - static char *tempbuf = NULL; - static unsigned tempbuflen = 0; - - if (len > tempbuflen) { - if (tempbuflen > 0) - tempbuf = (char *)realloc(tempbuf, len); - else - tempbuf = (char *)malloc(len); - tempbuflen = tempbuf==NULL ? 0 : len; - } - return(tempbuf); -} - - -int fwritecolrs(register COLR *scanline, unsigned len, register FILE *fp) - /* write out a colr scanline */ -{ - register int i, j, beg, cnt; - int c2; - - if (len < MINELEN || len > MAXELEN) /* OOBs, write out flat */ - return(fwrite((char *)scanline,sizeof(COLR),len,fp) - len); - /* put magic header */ - putc(2, fp); - putc(2, fp); - putc(len>>8, fp); - putc(len&255, fp); - /* put components seperately */ - for (i = 0; i < 4; i++) { - for (j = 0; j < (int)len; j += cnt) { /* find next run */ - for (beg = j; beg < (int)len; beg += cnt) { - for (cnt = 1; cnt < 127 && ((beg+cnt) < (int)len) && - (scanline[beg+cnt][i] == scanline[beg][i]); cnt++) - ; - if (cnt >= MINRUN) - break; /* long enough */ - } - if (beg-j > 1 && beg-j < MINRUN) { - c2 = j+1; - while (scanline[c2++][i] == scanline[j][i]) - if (c2 == beg) { /* short run */ - putc(128+beg-j, fp); - putc(scanline[j][i], fp); - j = beg; - break; - } - } - while (j < beg) { /* write out non-run */ - if ((c2 = beg-j) > 128) c2 = 128; - putc(c2, fp); - while (c2--) - putc(scanline[j++][i], fp); - } - if (cnt >= MINRUN) { /* write out run */ - putc(128+cnt, fp); - putc(scanline[beg][i], fp); - } else - cnt = 0; - } - } - return(ferror(fp) ? -1 : 0); -} - -int oldreadcolrs(register COLR *scanline, int len, register FILE *fp); - -int freadcolrs(register COLR *scanline, int len, register FILE *fp) - /* read in an encoded colr scanline */ -{ - register int i, j; - int code, val; - /* determine scanline type */ - if (len < MINELEN || len > MAXELEN) - return(oldreadcolrs(scanline, len, fp)); - if ((i = getc(fp)) == EOF) - return(-1); - if (i != 2) { - ungetc(i, fp); - return(oldreadcolrs(scanline, len, fp)); - } - scanline[0][GRN] = getc(fp); - scanline[0][BLU] = getc(fp); - if ((i = getc(fp)) == EOF) - return(-1); - if (scanline[0][GRN] != 2 || scanline[0][BLU] & 128) { - scanline[0][RED] = 2; - scanline[0][EXP] = i; - return(oldreadcolrs(scanline+1, len-1, fp)); - } - if ((scanline[0][BLU]<<8 | i) != len) - return(-1); /* length mismatch! */ - /* read each component */ - for (i = 0; i < 4; i++) - for (j = 0; j < len; ) { - if ((code = getc(fp)) == EOF) - return(-1); - if (code > 128) { /* run */ - code &= 127; - val = getc(fp); - while (code--) - scanline[j++][i] = val; - } else /* non-run */ - while (code--) - scanline[j++][i] = getc(fp); - } - return(feof(fp) ? -1 : 0); -} - - - /* read in an old colr scanline */ -int oldreadcolrs(register COLR *scanline, int len, register FILE *fp) -{ - int rshift; - register int i; - - rshift = 0; - - while (len > 0) { - scanline[0][RED] = getc(fp); - scanline[0][GRN] = getc(fp); - scanline[0][BLU] = getc(fp); - scanline[0][EXP] = getc(fp); - if (feof(fp) || ferror(fp)) - return(-1); - if (scanline[0][RED] == 1 && - scanline[0][GRN] == 1 && - scanline[0][BLU] == 1) { - for (i = scanline[0][EXP] << rshift; i > 0; i--) { - copycolr(scanline[0], scanline[-1]); - scanline++; - len--; - } - rshift += 8; - } else { - scanline++; - len--; - rshift = 0; - } - } - return(0); -} - - - /* write out a scanline */ -int fwritescan(register COLOR *scanline, int len, FILE *fp) -{ - COLR *clrscan; - int n; - register COLR *sp; - /* get scanline buffer */ - if ((sp = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) - return(-1); - clrscan = sp; - /* convert scanline */ - n = len; - while (n-- > 0) { - setcolr(sp[0], scanline[0][RED], - scanline[0][GRN], - scanline[0][BLU]); - scanline++; - sp++; - } - return(fwritecolrs(clrscan, len, fp)); -} - - -int freadscan(register COLOR *scanline, int len, FILE *fp) - /* read in a scanline */ -{ - register COLR *clrscan; - - if ((clrscan = (COLR *)tempbuffer(len*sizeof(COLR))) == NULL) - return(-1); - if (freadcolrs(clrscan, len, fp) < 0) - return(-1); - /* convert scanline */ - colr_color(scanline[0], clrscan[0]); - while (--len > 0) { - scanline++; clrscan++; - if (clrscan[0][RED] == clrscan[-1][RED] && - clrscan[0][GRN] == clrscan[-1][GRN] && - clrscan[0][BLU] == clrscan[-1][BLU] && - clrscan[0][EXP] == clrscan[-1][EXP]) - copycolor(scanline[0], scanline[-1]); - else - colr_color(scanline[0], clrscan[0]); - } - return(0); -} - - -void -setcolr(register COLR clr, double r, double g, double b) - /* assign a short color value */ -{ - double d; - int e; - - d = r > g ? r : g; - if (b > d) d = b; - - if (d <= 1e-32) { - clr[RED] = clr[GRN] = clr[BLU] = 0; - clr[EXP] = 0; - return; - } - - d = frexp(d, &e) * 255.9999 / d; - - clr[RED] = (BYTE) (r * d); - clr[GRN] = (BYTE) (g * d); - clr[BLU] = (BYTE) (b * d); - clr[EXP] = (BYTE) (e) + COLXS; -} - - -void -colr_color(register COLOR col, register COLR clr) - /* convert short to float color */ -{ - double f; - - if (clr[EXP] == 0) - col[RED] = col[GRN] = col[BLU] = 0.0; - else { - f = ldexp(1.0, (int)clr[EXP]-(COLXS+8)); - col[RED] = (float) ((clr[RED] + 0.5)*f); - col[GRN] = (float) ((clr[GRN] + 0.5)*f); - col[BLU] = (float) ((clr[BLU] + 0.5)*f); - } -} - - -int -bigdiff(register COLOR c1, register COLOR c2, double md) - /* c1 delta c2 > md? */ -{ - register int i; - - for (i = 0; i < 3; i++) - if (colval(c1,i)-colval(c2,i) > md*colval(c2,i) || - colval(c2,i)-colval(c1,i) > md*colval(c1,i)) - return(1); - return(0); -} diff --git a/panda/src/pnmimagetypes/color.h b/panda/src/pnmimagetypes/color.h deleted file mode 100644 index 868f0a7bcc..0000000000 --- a/panda/src/pnmimagetypes/color.h +++ /dev/null @@ -1,158 +0,0 @@ -/* Filename: color.h - * Created by: - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * PANDA 3D SOFTWARE - * Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved - * - * All use of this software is subject to the terms of the Panda 3d - * Software license. You should have received a copy of this license - * along with this source code; you will also find a current copy of - * the license at http://www.panda3d.org/license.txt . - * - * To contact the maintainers of this program write to - * panda3d@yahoogroups.com . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* SCCSid "@(#)color.h 2.9 9/2/94 LBL" */ - -/* - * color.h - header for routines using pixel color values. - * - * 12/31/85 - * - * Two color representations are used, one for calculation and - * another for storage. Calculation is done with three floats - * for speed. Stored color values use 4 bytes which contain - * three single byte mantissas and a common exponent. - */ - -#define RED 0 -#define GRN 1 -#define BLU 2 -#define EXP 3 -#define COLXS 128 /* excess used for exponent */ - -typedef unsigned char BYTE; /* 8-bit unsigned integer */ - -typedef BYTE COLR[4]; /* red, green, blue, exponent */ - -#define copycolr(c1,c2) (c1[0]=c2[0],c1[1]=c2[1], \ - c1[2]=c2[2],c1[3]=c2[3]) - -typedef float COLOR[3]; /* red, green, blue */ - -#define colval(col,pri) ((col)[pri]) - -#define setcolor(col,r,g,b) ((col)[RED]=(r),(col)[GRN]=(g),(col)[BLU]=(b)) - -#define copycolor(c1,c2) ((c1)[0]=(c2)[0],(c1)[1]=(c2)[1],(c1)[2]=(c2)[2]) - -#define scalecolor(col,sf) ((col)[0]*=(sf),(col)[1]*=(sf),(col)[2]*=(sf)) - -#define addcolor(c1,c2) ((c1)[0]+=(c2)[0],(c1)[1]+=(c2)[1],(c1)[2]+=(c2)[2]) - -#define multcolor(c1,c2) ((c1)[0]*=(c2)[0],(c1)[1]*=(c2)[1],(c1)[2]*=(c2)[2]) - -#ifdef NTSC -#define CIE_x_r 0.670 /* standard NTSC primaries */ -#define CIE_y_r 0.330 -#define CIE_x_g 0.210 -#define CIE_y_g 0.710 -#define CIE_x_b 0.140 -#define CIE_y_b 0.080 -#define CIE_x_w 0.3333 /* use true white */ -#define CIE_y_w 0.3333 -#else -#define CIE_x_r 0.640 /* nominal CRT primaries */ -#define CIE_y_r 0.330 -#define CIE_x_g 0.290 -#define CIE_y_g 0.600 -#define CIE_x_b 0.150 -#define CIE_y_b 0.060 -#define CIE_x_w 0.3333 /* use true white */ -#define CIE_y_w 0.3333 -#endif - -#define CIE_D ( CIE_x_r*(CIE_y_g - CIE_y_b) + \ - CIE_x_g*(CIE_y_b - CIE_y_r) + \ - CIE_x_b*(CIE_y_r - CIE_y_g) ) -#define CIE_C_rD ( (1./CIE_y_w) * \ - ( CIE_x_w*(CIE_y_g - CIE_y_b) - \ - CIE_y_w*(CIE_x_g - CIE_x_b) + \ - CIE_x_g*CIE_y_b - CIE_x_b*CIE_y_g ) ) -#define CIE_C_gD ( (1./CIE_y_w) * \ - ( CIE_x_w*(CIE_y_b - CIE_y_r) - \ - CIE_y_w*(CIE_x_b - CIE_x_r) - \ - CIE_x_r*CIE_y_b + CIE_x_b*CIE_y_r ) ) -#define CIE_C_bD ( (1./CIE_y_w) * \ - ( CIE_x_w*(CIE_y_r - CIE_y_g) - \ - CIE_y_w*(CIE_x_r - CIE_x_g) + \ - CIE_x_r*CIE_y_g - CIE_x_g*CIE_y_r ) ) - -#define CIE_rf (CIE_y_r*CIE_C_rD/CIE_D) -#define CIE_gf (CIE_y_g*CIE_C_gD/CIE_D) -#define CIE_bf (CIE_y_b*CIE_C_bD/CIE_D) - -/* As of 9-94, CIE_rf=.265074126, CIE_gf=.670114631 and CIE_bf=.064811243 */ - -#define bright(col) (CIE_rf*(col)[RED]+CIE_gf*(col)[GRN]+CIE_bf*(col)[BLU]) -#define normbright(c) ( ( (long)(CIE_rf*256.+.5)*(c)[RED] + \ - (long)(CIE_gf*256.+.5)*(c)[GRN] + \ - (long)(CIE_bf*256.+.5)*(c)[BLU] ) >> 8 ) - - /* luminous efficacies over visible spectrum */ -#define MAXEFFICACY 683. /* defined maximum at 550 nm */ -#define WHTEFFICACY 179. /* uniform white light */ -#define D65EFFICACY 203. /* standard illuminant D65 */ -#define INCEFFICACY 160. /* illuminant A (incand.) */ -#define SUNEFFICACY 208. /* illuminant B (solar dir.) */ -#define SKYEFFICACY D65EFFICACY /* skylight */ -#define DAYEFFICACY D65EFFICACY /* combined sky and solar */ - -#define luminance(col) (WHTEFFICACY * bright(col)) - -#define intens(col) ( (col)[0] > (col)[1] \ - ? (col)[0] > (col)[2] ? (col)[0] : (col)[2] \ - : (col)[1] > (col)[2] ? (col)[1] : (col)[2] ) - -#define colrval(c,p) ( (c)[EXP] ? \ - ldexp((c)[p]+.5,(int)(c)[EXP]-(COLXS+8)) : \ - 0. ) - -#define WHTCOLOR {1.0,1.0,1.0} -#define BLKCOLOR {0.0,0.0,0.0} -#define WHTCOLR {128,128,128,COLXS+1} -#define BLKCOLR {0,0,0,0} - - /* picture format identifier */ -#define COLRFMT "32-bit_rle_rgbe" - - /* macros for exposures */ -#define EXPOSSTR "EXPOSURE=" -#define LEXPOSSTR 9 -#define isexpos(hl) (!strncmp(hl,EXPOSSTR,LEXPOSSTR)) -#define exposval(hl) atof((hl)+LEXPOSSTR) -#define fputexpos(ex,fp) fprintf(fp,"%s%e\n",EXPOSSTR,ex) - - /* macros for pixel aspect ratios */ -#define ASPECTSTR "PIXASPECT=" -#define LASPECTSTR 10 -#define isaspect(hl) (!strncmp(hl,ASPECTSTR,LASPECTSTR)) -#define aspectval(hl) atof((hl)+LASPECTSTR) -#define fputaspect(pa,fp) fprintf(fp,"%s%f\n",ASPECTSTR,pa) - - /* macros for color correction */ -#define COLCORSTR "COLORCORR=" -#define LCOLCORSTR 10 -#define iscolcor(hl) (!strncmp(hl,COLCORSTR,LCOLCORSTR)) -#define colcorval(cc,hl) sscanf(hl+LCOLCORSTR,"%f %f %f", \ - &(cc)[RED],&(cc)[GRN],&(cc)[BLU]) -#define fputcolcor(cc,fp) fprintf(fp,"%s %f %f %f\n",COLCORSTR, \ - (cc)[RED],(cc)[GRN],(cc)[BLU]) - -#ifdef DCL_ATOF -extern double atof(), ldexp(), frexp(); -#endif diff --git a/panda/src/pnmimagetypes/config_pnmimagetypes.cxx b/panda/src/pnmimagetypes/config_pnmimagetypes.cxx index b0f42e5b6c..99cf5ece85 100644 --- a/panda/src/pnmimagetypes/config_pnmimagetypes.cxx +++ b/panda/src/pnmimagetypes/config_pnmimagetypes.cxx @@ -19,9 +19,7 @@ #include "config_pnmimagetypes.h" #include "pnmFileTypeSGI.h" #include "pnmFileTypeAlias.h" -#include "pnmFileTypeRadiance.h" #include "pnmFileTypeTGA.h" -#include "pnmFileTypeYUV.h" #include "pnmFileTypeIMG.h" #include "pnmFileTypeSoftImage.h" #include "pnmFileTypeBMP.h" @@ -42,10 +40,8 @@ Configure(config_pnmimagetypes); NotifyCategoryDef(pnmimage_pnm, pnmimage_cat); NotifyCategoryDef(pnmimage_sgi, pnmimage_cat); NotifyCategoryDef(pnmimage_alias, pnmimage_cat); -NotifyCategoryDef(pnmimage_radiance, pnmimage_cat); NotifyCategoryDef(pnmimage_tiff, pnmimage_cat); NotifyCategoryDef(pnmimage_tga, pnmimage_cat); -NotifyCategoryDef(pnmimage_yuv, pnmimage_cat); NotifyCategoryDef(pnmimage_img, pnmimage_cat); NotifyCategoryDef(pnmimage_soft, pnmimage_cat); NotifyCategoryDef(pnmimage_bmp, pnmimage_cat); @@ -54,15 +50,6 @@ NotifyCategoryDef(pnmimage_jpg2000, pnmimage_cat); int sgi_storage_type = STORAGE_RLE; const string sgi_imagename = config_pnmimagetypes.GetString("sgi-imagename", ""); -const double radiance_gamma_correction = config_pnmimagetypes.GetDouble("radiance-gamma-correction", 2.2); -const int radiance_brightness_adjustment = config_pnmimagetypes.GetInt("radiance-brightness-adjustment", 0); - -// YUV format doesn't include an image size specification, so the -// image size must be specified externally. The defaults here are -// likely candidates, since this is the Abekas native size; the ysize -// is automatically adjusted down to account for a short file. -const int yuv_xsize = config_pnmimagetypes.GetInt("yuv-xsize", 720); -const int yuv_ysize = config_pnmimagetypes.GetInt("yuv-ysize", 486); // TGA supports RLE compression, as well as colormapping and/or // grayscale images. Set these true to enable these features, if @@ -124,9 +111,7 @@ init_libpnmimagetypes() { init_libpnmimage(); PNMFileTypeSGI::init_type(); PNMFileTypeAlias::init_type(); - PNMFileTypeRadiance::init_type(); PNMFileTypeTGA::init_type(); - PNMFileTypeYUV::init_type(); PNMFileTypeIMG::init_type(); PNMFileTypeSoftImage::init_type(); PNMFileTypeBMP::init_type(); @@ -169,9 +154,7 @@ init_libpnmimagetypes() { tr->register_type(new PNMFileTypeSGI); tr->register_type(new PNMFileTypeAlias); - tr->register_type(new PNMFileTypeRadiance); tr->register_type(new PNMFileTypeTGA); - tr->register_type(new PNMFileTypeYUV); tr->register_type(new PNMFileTypeIMG); tr->register_type(new PNMFileTypeSoftImage); tr->register_type(new PNMFileTypeBMP); @@ -188,9 +171,7 @@ init_libpnmimagetypes() { // Also register with the Bam reader. PNMFileTypeSGI::register_with_read_factory(); PNMFileTypeAlias::register_with_read_factory(); - PNMFileTypeRadiance::register_with_read_factory(); PNMFileTypeTGA::register_with_read_factory(); - PNMFileTypeYUV::register_with_read_factory(); PNMFileTypeIMG::register_with_read_factory(); PNMFileTypeSoftImage::register_with_read_factory(); PNMFileTypeBMP::register_with_read_factory(); diff --git a/panda/src/pnmimagetypes/header.c b/panda/src/pnmimagetypes/header.c deleted file mode 100644 index f31b6c2df9..0000000000 --- a/panda/src/pnmimagetypes/header.c +++ /dev/null @@ -1,242 +0,0 @@ -/* Filename: header.c - * Created by: - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * PANDA 3D SOFTWARE - * Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved - * - * All use of this software is subject to the terms of the Panda 3d - * Software license. You should have received a copy of this license - * along with this source code; you will also find a current copy of - * the license at http://www.panda3d.org/license.txt . - * - * To contact the maintainers of this program write to - * panda3d@yahoogroups.com . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * header.c - routines for reading and writing information headers. - * - * 8/19/88 - * - * newheader(t,fp) start new information header identified by string t - * isheadid(s) returns true if s is a header id line - * headidval(r,s) copy header identifier value in s to r - * printargs(ac,av,fp) print an argument list to fp, followed by '\n' - * isformat(s) returns true if s is of the form "FORMAT=*" - * formatval(r,s) copy the format value in s to r - * fputformat(s,fp) write "FORMAT=%s" to fp - * getheader(fp,f,p) read header from fp, calling f(s,p) on each line - * checkheader(i,p,o) check header format from i against p and copy to o - * - * To copy header from input to output, use getheader(fin, fputs, fout) - */ - -#include -#include -#include - -#define MAXLINE 512 - -char HDRSTR[] = "#?"; /* information header magic number */ - -char FMTSTR[] = "FORMAT="; /* format identifier */ - - -void -newheader(char *s, register FILE *fp) /* identifying line of information header */ -{ - fputs(HDRSTR, fp); - fputs(s, fp); - putc('\n', fp); -} - - -int -headidval(register char *r, register char *s) /* get header id (return true if is id) */ -{ - register char *cp = HDRSTR; - - while (*cp) if (*cp++ != *s++) return(0); - if (r == NULL) return(1); - while (*s) *r++ = *s++; - *r = '\0'; - return(1); -} - - -int -isheadid(char *s) /* check to see if line is header id */ -{ - return(headidval(NULL, s)); -} - - -void -printargs(int ac, char **av, register FILE *fp) /* print arguments to a file */ -{ - int quote; - - while (ac-- > 0) { - if (strchr(*av, ' ') != NULL) { /* quote it */ - if (strchr(*av, '\'') != NULL) - quote = '"'; - else - quote = '\''; - putc(quote, fp); - fputs(*av++, fp); - putc(quote, fp); - } else - fputs(*av++, fp); - putc(' ', fp); - } - putc('\n', fp); -} - - -int -formatval(register char *r, register char *s) /* get format value (return true if format) */ -{ - register char *cp = FMTSTR; - - while (*cp) if (*cp++ != *s++) return(0); - while (isspace(*s)) s++; - if (!*s) return(0); - if (r == NULL) return(1); - while(*s) *r++ = *s++; - while (isspace(r[-1])) r--; - *r = '\0'; - return(1); -} - - -int -isformat(char *s) /* is line a format line? */ -{ - return(formatval(NULL, s)); -} - - -void -fputformat(char *s, FILE *fp) /* put out a format value */ -{ - fputs(FMTSTR, fp); - fputs(s, fp); - putc('\n', fp); -} - - -int -getheader(FILE *fp, int (*f)(char *, char *), char *p) /* get header from file */ -{ - char buf[MAXLINE]; - - for ( ; ; ) { - buf[MAXLINE-2] = '\n'; - if (fgets(buf, MAXLINE, fp) == NULL) - return(-1); - if (buf[0] == '\n') - return(0); -#ifdef MSDOS - if (buf[0] == '\r' && buf[1] == '\n') - return(0); -#endif - if (buf[MAXLINE-2] != '\n') { - ungetc(buf[MAXLINE-2], fp); /* prevent false end */ - buf[MAXLINE-2] = '\0'; - } - if (f != NULL) - (*f)(buf, p); - } -} - - -struct check { - FILE *fp; - char fs[64]; -}; - - -static void -mycheck(char *s, register struct check *cp) /* check a header line for format info. */ -{ - if (!formatval(cp->fs, s) && cp->fp != NULL) - fputs(s, cp->fp); -} - - -/* - * Copymatch(pat,str) checks pat for wildcards, and - * copies str into pat if there is a match (returning true). - */ - -#ifdef COPYMATCH -copymatch(char *pat, char *str) -{ - int docopy = 0; - register char *p = pat, *s = str; - - do { - switch (*p) { - case '?': /* match any character */ - if (!*s++) - return(0); - docopy++; - break; - case '*': /* match any string */ - while (p[1] == '*') p++; - do - if ( (p[1]=='?' || p[1]==*s) - && copymatch(p+1,s) ) { - strcpy(pat, str); - return(1); - } - while (*s++); - return(0); - case '\\': /* literal next */ - p++; - /* fall through */ - default: /* normal character */ - if (*p != *s) - return(0); - s++; - break; - } - } while (*p++); - if (docopy) - strcpy(pat, str); - return(1); -} -#else -#define copymatch(pat, s) (!strcmp(pat, s)) -#endif - - -/* - * Checkheader(fin,fmt,fout) returns a value of 1 if the input format - * matches the specification in fmt, 0 if no input format was found, - * and -1 if the input format does not match or there is an - * error reading the header. If fmt is empty, then -1 is returned - * if any input format is found (or there is an error), and 0 otherwise. - * If fmt contains any '*' or '?' characters, then checkheader - * does wildcard expansion and copies a matching result into fmt. - * Be sure that fmt is big enough to hold the match in such cases! - * The input header (minus any format lines) is copied to fout - * if fout is not NULL. - */ - -int -checkheader(FILE *fin, char *fmt, FILE *fout) -{ - struct check cdat; - - cdat.fp = fout; - cdat.fs[0] = '\0'; - if (getheader(fin, (int (*)(char *, char *))mycheck, (char *)&cdat) < 0) - return(-1); - if (cdat.fs[0] != '\0') - return(copymatch(fmt, cdat.fs) ? 1 : -1); - return(0); -} diff --git a/panda/src/pnmimagetypes/pnmFileTypeAlias.cxx b/panda/src/pnmimagetypes/pnmFileTypeAlias.cxx index b58d89e672..60634d19b1 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeAlias.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeAlias.cxx @@ -27,10 +27,10 @@ // or height is larger than this, it must be bogus. #define INSANE_SIZE 20000 -static const char * const extensions_ALIAS[] = { +static const char * const extensions_alias[] = { "pix", "als" }; -static const int num_extensions_ALIAS = sizeof(extensions_ALIAS) / sizeof(const char *); +static const int num_extensions_alias = sizeof(extensions_alias) / sizeof(const char *); TypeHandle PNMFileTypeAlias::_type_handle; @@ -57,11 +57,11 @@ get_name() const { // Function: PNMFileTypeAlias::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_ALIAS associated with this particular file type. +// extensions associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeAlias:: get_num_extensions() const { - return num_extensions_ALIAS; + return num_extensions_alias; } //////////////////////////////////////////////////////////////////// @@ -73,8 +73,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeAlias:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_ALIAS, string()); - return extensions_ALIAS[n]; + nassertr(n >= 0 && n < num_extensions_alias, string()); + return extensions_alias[n]; } //////////////////////////////////////////////////////////////////// @@ -97,7 +97,7 @@ get_suggested_extension() const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeAlias:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -110,7 +110,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeAlias:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } @@ -118,26 +118,26 @@ make_writer(FILE *file, bool owns_file) { inline unsigned short -read_ushort(FILE *file) { +read_ushort(istream *file) { unsigned short x; return pm_readbigshort(file, (short *)&x)==0 ? x : 0; } inline unsigned char -read_uchar_ALIAS(FILE *file) { +read_uchar_ALIAS(istream *file) { int x; - x = getc(file); + x = file->get(); return (x!=EOF) ? (unsigned char)x : 0; } inline void -write_ushort(FILE *file, unsigned short x) { +write_ushort(ostream *file, unsigned short x) { pm_writebigshort(file, (short)x); } inline void -write_uchar_ALIAS(FILE *file, unsigned char x) { - putc(x, file); +write_uchar_ALIAS(ostream *file, unsigned char x) { + file->put(x); } //////////////////////////////////////////////////////////////////// @@ -146,7 +146,7 @@ write_uchar_ALIAS(FILE *file, unsigned char x) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeAlias::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { if (!read_magic_number(_file, magic_number, 4)) { @@ -270,7 +270,7 @@ static unsigned char last_red = 0, last_blu = 0, last_grn = 0; static int num_count = 0; static void -flush_color(FILE *file) { +flush_color(ostream *file) { if (num_count>0) { write_uchar_ALIAS(file, num_count); write_uchar_ALIAS(file, last_blu); @@ -281,7 +281,7 @@ flush_color(FILE *file) { } static void -write_color(FILE *file, +write_color(ostream *file, unsigned char red, unsigned char blu, unsigned char grn) { if (red==last_red && blu==last_blu && grn==last_grn && num_count<0377) { num_count++; @@ -301,7 +301,7 @@ write_color(FILE *file, // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeAlias::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } diff --git a/panda/src/pnmimagetypes/pnmFileTypeAlias.h b/panda/src/pnmimagetypes/pnmFileTypeAlias.h index 4936672513..b3fe5ade53 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeAlias.h +++ b/panda/src/pnmimagetypes/pnmFileTypeAlias.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPEALIAS_H #define PNMFILETYPEALIAS_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeAlias @@ -39,14 +39,14 @@ public: virtual string get_extension(int n) const; virtual string get_suggested_extension() const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual bool supports_read_row() const; virtual bool read_row(xel *array, xelval *alpha); @@ -54,7 +54,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual bool supports_write_row() const; virtual bool write_header(); diff --git a/panda/src/pnmimagetypes/pnmFileTypeBMP.cxx b/panda/src/pnmimagetypes/pnmFileTypeBMP.cxx index 0c7dfee97d..50c7e6cba8 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeBMP.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeBMP.cxx @@ -19,13 +19,13 @@ #include "pnmFileTypeBMP.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" -static const char * const extensions_BMP[] = { +static const char * const extensions_bmp[] = { "bmp" }; -static const int num_extensions_BMP = sizeof(extensions_BMP) / sizeof(const char *); +static const int num_extensions_bmp = sizeof(extensions_bmp) / sizeof(const char *); TypeHandle PNMFileTypeBMP::_type_handle; @@ -52,11 +52,11 @@ get_name() const { // Function: PNMFileTypeBMP::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_BMP associated with this particular file type. +// extensions associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeBMP:: get_num_extensions() const { - return num_extensions_BMP; + return num_extensions_bmp; } //////////////////////////////////////////////////////////////////// @@ -68,8 +68,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeBMP:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_BMP, string()); - return extensions_BMP[n]; + nassertr(n >= 0 && n < num_extensions_bmp, string()); + return extensions_bmp[n]; } //////////////////////////////////////////////////////////////////// @@ -116,7 +116,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeBMP:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -129,7 +129,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeBMP:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeBMP.h b/panda/src/pnmimagetypes/pnmFileTypeBMP.h index ccfc79f56a..b35c6525e7 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeBMP.h +++ b/panda/src/pnmimagetypes/pnmFileTypeBMP.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPEBMP_H #define PNMFILETYPEBMP_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeBMP @@ -42,14 +42,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual int read_data(xel *array, xelval *alpha); @@ -69,7 +69,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual int write_data(xel *array, xelval *alpha); }; diff --git a/panda/src/pnmimagetypes/pnmFileTypeBMPReader.cxx b/panda/src/pnmimagetypes/pnmFileTypeBMPReader.cxx index 51be2bac10..22f9d24ceb 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeBMPReader.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeBMPReader.cxx @@ -43,16 +43,16 @@ * Utilities */ -static int GetByte (FILE * fp); -static short GetShort (FILE * fp); -static long GetLong (FILE * fp); -static void readto (FILE *fp, unsigned long *ppos, unsigned long dst); -static void BMPreadfileheader (FILE *fp, unsigned long *ppos, +static int GetByte (istream * fp); +static short GetShort (istream * fp); +static long GetLong (istream * fp); +static void readto (istream *fp, unsigned long *ppos, unsigned long dst); +static void BMPreadfileheader (istream *fp, unsigned long *ppos, unsigned long *poffBits); -static void BMPreadinfoheader (FILE *fp, unsigned long *ppos, +static void BMPreadinfoheader (istream *fp, unsigned long *ppos, unsigned long *pcx, unsigned long *pcy, unsigned short *pcBitCount, int *pclassv); -static int BMPreadrgbtable (FILE *fp, unsigned long *ppos, +static int BMPreadrgbtable (istream *fp, unsigned long *ppos, unsigned short cBitCount, int classv, pixval *R, pixval *G, pixval *B); static const char *ifname = "BMP"; @@ -60,11 +60,11 @@ static char er_read[] = "%s: read error"; //static char er_seek[] = "%s: seek error"; static int -GetByte(FILE *fp) +GetByte(istream *fp) { int v; - if ((v = getc(fp)) == EOF) + if ((v = fp->get()) == EOF) { pm_error(er_read, ifname); } @@ -73,7 +73,7 @@ GetByte(FILE *fp) } static short -GetShort(FILE *fp) +GetShort(istream *fp) { short v; @@ -86,7 +86,7 @@ GetShort(FILE *fp) } static long -GetLong(FILE *fp) +GetLong(istream *fp) { long v; @@ -104,7 +104,7 @@ GetLong(FILE *fp) */ static void -readto(FILE *fp, +readto(istream *fp, unsigned long *ppos, /* pointer to number of bytes read from fp */ unsigned long dst) { @@ -120,7 +120,7 @@ readto(FILE *fp, for(; pos < dst; pos++) { - if (getc(fp) == EOF) + if (fp->get() == EOF) { pm_error(er_read, ifname); } @@ -136,7 +136,7 @@ readto(FILE *fp, static void BMPreadfileheader( - FILE *fp, + istream *fp, unsigned long *ppos, /* number of bytes read from fp */ unsigned long *poffBits) { @@ -171,7 +171,7 @@ BMPreadfileheader( static void BMPreadinfoheader( - FILE *fp, + istream *fp, unsigned long *ppos, /* number of bytes read from fp */ unsigned long *pcx, unsigned long *pcy, @@ -269,7 +269,7 @@ BMPreadinfoheader( */ static int BMPreadrgbtable( - FILE *fp, + istream *fp, unsigned long *ppos, /* number of bytes read from fp */ unsigned short cBitCount, int classv, @@ -305,7 +305,7 @@ BMPreadrgbtable( */ static int BMPreadrow( - FILE *fp, + istream *fp, unsigned long *ppos, /* number of bytes read from fp */ pixel *row, unsigned long cx, @@ -371,7 +371,7 @@ BMPreadrow( static void BMPreadbits(xel *array, - FILE *fp, + istream *fp, unsigned long *ppos, /* number of bytes read from fp */ unsigned long offBits, unsigned long cx, @@ -424,7 +424,7 @@ BMPreadbits(xel *array, // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeBMP::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { if (!read_magic_number(_file, magic_number, 2)) { diff --git a/panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx b/panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx index fae6e3db34..5a49382358 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeBMPWriter.cxx @@ -53,25 +53,25 @@ static char er_write[] = "stdout: write error"; /* prototypes */ -static void PutByte (FILE *fp, char v); -static void PutShort (FILE *fp, short v); -static void PutLong (FILE *fp, long v); -static int BMPwritefileheader (FILE *fp, int classv, unsigned long bitcount, +static void PutByte (ostream *fp, char v); +static void PutShort (ostream *fp, short v); +static void PutLong (ostream *fp, long v); +static int BMPwritefileheader (ostream *fp, int classv, unsigned long bitcount, unsigned long x, unsigned long y); -static int BMPwriteinfoheader (FILE *fp, int classv, unsigned long bitcount, +static int BMPwriteinfoheader (ostream *fp, int classv, unsigned long bitcount, unsigned long x, unsigned long y); -static int BMPwritergb (FILE *fp, int classv, pixval R, pixval G, pixval B); -static int BMPwritergbtable (FILE *fp, int classv, int bpp, int colors, +static int BMPwritergb (ostream *fp, int classv, pixval R, pixval G, pixval B); +static int BMPwritergbtable (ostream *fp, int classv, int bpp, int colors, pixval *R, pixval *G, pixval *B); static int colorstobpp (int colors); -static void BMPEncode (FILE *fp, int classv, int x, int y, pixel **pixels, +static void BMPEncode (ostream *fp, int classv, int x, int y, pixel **pixels, int colors, colorhash_table cht, pixval *R, pixval *G, pixval *B); static void PutByte( - FILE *fp, + ostream *fp, char v) { - if (putc(v, fp) == EOF) + if (!fp->put(v)) { pm_error(er_write); } @@ -79,7 +79,7 @@ PutByte( static void PutShort( - FILE *fp, + ostream *fp, short v) { if (pm_writelittleshort(fp, v) == -1) @@ -90,7 +90,7 @@ PutShort( static void PutLong( - FILE *fp, + ostream *fp, long v) { if (pm_writelittlelong(fp, v) == -1) @@ -108,7 +108,7 @@ PutLong( */ static int BMPwritefileheader( - FILE *fp, + ostream *fp, int classv, unsigned long bitcount, unsigned long x, @@ -137,7 +137,7 @@ BMPwritefileheader( */ static int BMPwriteinfoheader( - FILE *fp, + ostream *fp, int classv, unsigned long bitcount, unsigned long x, @@ -201,7 +201,7 @@ BMPwriteinfoheader( */ static int BMPwritergb( - FILE *fp, + ostream *fp, int classv, pixval R, pixval G, @@ -231,7 +231,7 @@ BMPwritergb( */ static int BMPwritergbtable( - FILE *fp, + ostream *fp, int classv, int bpp, int colors, @@ -263,7 +263,7 @@ BMPwritergbtable( */ static int BMPwriterow( - FILE *fp, + ostream *fp, pixel *row, unsigned long cx, unsigned short bpp, @@ -323,7 +323,7 @@ BMPwriterow( */ static int BMPwritebits( - FILE *fp, + ostream *fp, unsigned long cx, unsigned long cy, unsigned short cBitCount, @@ -397,7 +397,7 @@ colorstobpp(int colors) */ static void BMPEncode( - FILE *fp, + ostream *fp, int classv, int x, int y, @@ -472,7 +472,7 @@ BMPEncode( */ static void BMPEncode24( - FILE *fp, + ostream *fp, int classv, int x, int y, @@ -507,7 +507,7 @@ BMPEncode24( // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeBMP::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } diff --git a/panda/src/pnmimagetypes/pnmFileTypeIMG.cxx b/panda/src/pnmimagetypes/pnmFileTypeIMG.cxx index 0ed79e5cbe..a715165005 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeIMG.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeIMG.cxx @@ -19,18 +19,18 @@ #include "pnmFileTypeIMG.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" // Since raw image files don't have a magic number, we'll make a little // sanity check on the size of the image. If either the width or height is // larger than this, it must be bogus. #define INSANE_SIZE 20000 -static const char * const extensionsIMG[] = { +static const char * const extensions_img[] = { "img" }; -static const int num_extensions_IMG = sizeof(extensionsIMG) / sizeof(const char *); +static const int num_extensions_img = sizeof(extensions_img) / sizeof(const char *); TypeHandle PNMFileTypeIMG::_type_handle; @@ -61,7 +61,7 @@ get_name() const { //////////////////////////////////////////////////////////////////// int PNMFileTypeIMG:: get_num_extensions() const { - return num_extensions_IMG; + return num_extensions_img; } //////////////////////////////////////////////////////////////////// @@ -73,8 +73,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeIMG:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_IMG, string()); - return extensionsIMG[n]; + nassertr(n >= 0 && n < num_extensions_img, string()); + return extensions_img[n]; } //////////////////////////////////////////////////////////////////// @@ -97,7 +97,7 @@ get_suggested_extension() const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeIMG:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -110,44 +110,44 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeIMG:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } inline unsigned long -read_ulong(FILE *file) { +read_ulong(istream *file) { unsigned long x; return pm_readbiglong(file, (long *)&x)==0 ? x : 0; } inline unsigned short -read_ushort_IMG(FILE *file) { +read_ushort_IMG(istream *file) { unsigned short x; return pm_readbigshort(file, (short *)&x)==0 ? x : 0; } inline unsigned char -read_uchar_IMG(FILE *file) { +read_uchar_IMG(istream *file) { int x; - x = getc(file); + x = file->get(); return (x!=EOF) ? (unsigned char)x : 0; } inline void -write_ulong(FILE *file, unsigned long x) { +write_ulong(ostream *file, unsigned long x) { pm_writebiglong(file, (long)x); } inline void -write_ushort_IMG(FILE *file, unsigned long x) { +write_ushort_IMG(ostream *file, unsigned long x) { pm_writebigshort(file, (short)(long)x); } inline void -write_uchar_IMG(FILE *file, unsigned char x) { - putc(x, file); +write_uchar_IMG(ostream *file, unsigned char x) { + file->put(x); } //////////////////////////////////////////////////////////////////// @@ -156,7 +156,7 @@ write_uchar_IMG(FILE *file, unsigned char x) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeIMG::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { if (img_header_type == IHT_long) { @@ -274,7 +274,7 @@ read_row(xel *row_data, xelval *) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeIMG::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } diff --git a/panda/src/pnmimagetypes/pnmFileTypeIMG.h b/panda/src/pnmimagetypes/pnmFileTypeIMG.h index 922cb77f24..3a51e59339 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeIMG.h +++ b/panda/src/pnmimagetypes/pnmFileTypeIMG.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPEIMG_H #define PNMFILETYPEIMG_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeIMG @@ -39,14 +39,14 @@ public: virtual string get_extension(int n) const; virtual string get_suggested_extension() const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual bool supports_read_row() const; virtual bool read_row(xel *array, xelval *alpha); @@ -54,7 +54,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual bool supports_write_row() const; virtual bool write_header(); diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPG.cxx index 39dd03e687..6107e601ef 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG.cxx @@ -19,13 +19,13 @@ #include "pnmFileTypeJPG.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" -static const char * const extensions_JPG[] = { +static const char *const extensions_jpg[] = { "jpg", "jpeg" }; -static const int num_extensions_JPG = sizeof(extensions_JPG) / sizeof(const char *); +static const int num_extensions_jpg = sizeof(extensions_jpg) / sizeof(const char *); TypeHandle PNMFileTypeJPG::_type_handle; @@ -52,11 +52,11 @@ get_name() const { // Function: PNMFileTypeJPG::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_JPG associated with this particular file type. +// extensions associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeJPG:: get_num_extensions() const { - return num_extensions_JPG; + return num_extensions_jpg; } //////////////////////////////////////////////////////////////////// @@ -68,8 +68,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeJPG:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_JPG, string()); - return extensions_JPG[n]; + nassertr(n >= 0 && n < num_extensions_jpg, string()); + return extensions_jpg[n]; } //////////////////////////////////////////////////////////////////// @@ -117,7 +117,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeJPG:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -130,7 +130,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeJPG:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG.h b/panda/src/pnmimagetypes/pnmFileTypeJPG.h index 4d52aa8df4..cb6c8a2f0a 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG.h +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG.h @@ -19,17 +19,18 @@ #ifndef PNMFILETYPEJPG_H #define PNMFILETYPEJPG_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" #if defined(_WIN32) #include // we need to include this before jpeglib. #endif extern "C" { +#include // jpeglib requires this to be included first. #include #include } @@ -51,14 +52,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); ~Reader(void); virtual int read_data(xel *array, xelval *alpha); @@ -86,7 +87,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual int write_data(xel *array, xelval *alpha); }; diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG2000.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPG2000.cxx index b0ff795694..51be38a803 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG2000.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG2000.cxx @@ -19,13 +19,13 @@ #include "pnmFileTypeJPG2000.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" -static const char * const extensions_JPG2000[] = { +static const char * const extensions_jpg2000[] = { "JP2","JPC" }; -static const int num_extensions_JPG2000 = sizeof(extensions_JPG2000) / sizeof(const char *); +static const int num_extensions_jpg2000 = sizeof(extensions_jpg2000) / sizeof(const char *); TypeHandle PNMFileTypeJPG2000::_type_handle; @@ -45,18 +45,18 @@ PNMFileTypeJPG2000() { //////////////////////////////////////////////////////////////////// string PNMFileTypeJPG2000:: get_name() const { - return "JPEG_2000"; + return "JPEG 2000"; } //////////////////////////////////////////////////////////////////// // Function: PNMFileTypeJPG2000::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_JPG2000 associated with this particular file type. +// extensions_jpg2000 associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeJPG2000:: get_num_extensions() const { - return num_extensions_JPG2000; + return num_extensions_jpg2000; } //////////////////////////////////////////////////////////////////// @@ -68,8 +68,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeJPG2000:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_JPG2000, string()); - return extensions_JPG2000[n]; + nassertr(n >= 0 && n < num_extensions_jpg2000, string()); + return extensions_jpg2000[n]; } //////////////////////////////////////////////////////////////////// @@ -117,7 +117,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeJPG2000:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -130,7 +130,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeJPG2000:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG2000.h b/panda/src/pnmimagetypes/pnmFileTypeJPG2000.h index 1b827f203e..872ee8109a 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG2000.h +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG2000.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPEJPG2000_H #define PNMFILETYPEJPG2000_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" #if defined(_WIN32) #include // we need to include this before jpeglib. @@ -31,16 +31,9 @@ #include -/* -extern "C" { -#include -#include -} -*/ - //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeJPG2000 -// Description : For reading and writing Jpeg files. +// Description : For reading and writing Jpeg2000 files. //////////////////////////////////////////////////////////////////// class EXPCL_PANDA PNMFileTypeJPG2000 : public PNMFileType { public: @@ -55,14 +48,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); ~Reader(void); virtual int read_data(xel *array, xelval *alpha); @@ -97,7 +90,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual int write_data(xel *array, xelval *alpha); }; diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG2000Reader.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPG2000Reader.cxx index 4d3e80c285..6de8dc005c 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG2000Reader.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG2000Reader.cxx @@ -18,7 +18,6 @@ #include "pnmFileTypeJPG2000.h" #include "config_pnmimagetypes.h" -#include //////////////////////////////////////////////////////////////////// // Function: PNMFileTypeJPG2000::Reader::Constructor @@ -26,11 +25,11 @@ // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeJPG2000::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { // Put the magic number bytes back into the file - fseek(file, 0, SEEK_SET); + file->seekg(0); /* Step 1: allocate and initialize JPEG decompression object */ @@ -41,7 +40,8 @@ Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : jpeg_create_decompress(&_cinfo); /* Step 2: specify data source (eg, a file) */ - + // This is broken, and won't compile. We need to drop in an + // iostream replacement, like we did for JPG. jpeg_stdio_src(&_cinfo, file); /* Step 3: read file parameters with jpeg_read_header() */ diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPG2000Writer.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPG2000Writer.cxx index 95282516c5..880d064207 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPG2000Writer.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPG2000Writer.cxx @@ -19,8 +19,8 @@ #include "pnmFileTypeJPG2000.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmImage.h" +#include "pnmWriter.h" extern "C" { #include @@ -32,7 +32,7 @@ extern "C" { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeJPG2000::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } @@ -106,6 +106,8 @@ write_data(xel *array, xelval *) { * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that * requires it in order to write binary files. */ + // This is broken, and won't compile. We need to drop in an + // iostream replacement, like we did for JPG. jpeg_stdio_dest(&cinfo, _file); /* Step 3: set parameters for compression */ diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPGReader.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPGReader.cxx index 94454b0d73..9aefdafe05 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPGReader.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPGReader.cxx @@ -18,7 +18,234 @@ #include "pnmFileTypeJPG.h" #include "config_pnmimagetypes.h" -#include + + +// +// The following bit of code, for setting up jpeg_istream_src(), was +// lifted from jpeglib, and modified to work with istream istead of +// stdio. +// + +/* + * jdatasrc.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains decompression data source routines for the case of + * reading JPEG data from a file (or any stdio stream). While these routines + * are sufficient for most applications, some will want to use a different + * source manager. + * IMPORTANT: we assume that fread() will correctly transcribe an array of + * JOCTETs from 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ +extern "C" { +#include +#include +} + + +/* Expanded data source object for stdio input */ + +typedef struct { + struct jpeg_source_mgr pub; /* public fields */ + + istream * infile; /* source stream */ + JOCTET * buffer; /* start of buffer */ + boolean start_of_file; /* have we gotten any data yet? */ +} my_source_mgr; + +typedef my_source_mgr * my_src_ptr; + +#define INPUT_BUF_SIZE 4096 /* choose an efficiently fread'able size */ + + +/* + * Initialize source --- called by jpeg_read_header + * before any data is actually read. + */ + +METHODDEF(void) +init_source (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* We reset the empty-input-file flag for each image, + * but we don't clear the input buffer. + * This is correct behavior for reading a series of images from one source. + */ + src->start_of_file = TRUE; +} + + +/* + * Fill the input buffer --- called whenever buffer is emptied. + * + * In typical applications, this should read fresh data into the buffer + * (ignoring the current state of next_input_byte & bytes_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been reloaded. It is not necessary to + * fill the buffer entirely, only to obtain at least one more byte. + * + * There is no such thing as an EOF return. If the end of the file has been + * reached, the routine has a choice of ERREXIT() or inserting fake data into + * the buffer. In most cases, generating a warning message and inserting a + * fake EOI marker is the best course of action --- this will allow the + * decompressor to output however much of the image is there. However, + * the resulting error message is misleading if the real problem is an empty + * input file, so we handle that case specially. + * + * In applications that need to be able to suspend compression due to input + * not being available yet, a FALSE return indicates that no more data can be + * obtained right now, but more may be forthcoming later. In this situation, + * the decompressor will return to its caller (with an indication of the + * number of scanlines it has read, if any). The application should resume + * decompression after it has loaded more data into the input buffer. Note + * that there are substantial restrictions on the use of suspension --- see + * the documentation. + * + * When suspending, the decompressor will back up to a convenient restart point + * (typically the start of the current MCU). next_input_byte & bytes_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point must be rescanned after resumption, so move it to + * the front of the buffer rather than discarding it. + */ + +METHODDEF(boolean) +fill_input_buffer (j_decompress_ptr cinfo) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + size_t nbytes; + + src->infile->read(src->buffer, INPUT_BUF_SIZE); + nbytes = src->infile->gcount(); + + if (nbytes <= 0) { + if (src->start_of_file) /* Treat empty input file as fatal error */ + ERREXIT(cinfo, JERR_INPUT_EMPTY); + WARNMS(cinfo, JWRN_JPEG_EOF); + /* Insert a fake EOI marker */ + src->buffer[0] = (JOCTET) 0xFF; + src->buffer[1] = (JOCTET) JPEG_EOI; + nbytes = 2; + } + + src->pub.next_input_byte = src->buffer; + src->pub.bytes_in_buffer = nbytes; + src->start_of_file = FALSE; + + return TRUE; +} + + +/* + * Skip data --- used to skip over a potentially large amount of + * uninteresting data (such as an APPn marker). + * + * Writers of suspendable-input applications must note that skip_input_data + * is not granted the right to give a suspension return. If the skip extends + * beyond the data currently in the buffer, the buffer can be marked empty so + * that the next read will cause a fill_input_buffer call that can suspend. + * Arranging for additional bytes to be discarded before reloading the input + * buffer is the application writer's problem. + */ + +METHODDEF(void) +skip_input_data (j_decompress_ptr cinfo, long num_bytes) +{ + my_src_ptr src = (my_src_ptr) cinfo->src; + + /* Just a dumb implementation for now. Could use fseek() except + * it doesn't work on pipes. Not clear that being smart is worth + * any trouble anyway --- large skips are infrequent. + */ + if (num_bytes > 0) { + while (num_bytes > (long) src->pub.bytes_in_buffer) { + num_bytes -= (long) src->pub.bytes_in_buffer; + (void) fill_input_buffer(cinfo); + /* note we assume that fill_input_buffer will never return FALSE, + * so suspension need not be handled. + */ + } + src->pub.next_input_byte += (size_t) num_bytes; + src->pub.bytes_in_buffer -= (size_t) num_bytes; + } +} + + +/* + * An additional method that can be provided by data source modules is the + * resync_to_restart method for error recovery in the presence of RST markers. + * For the moment, this source module just uses the default resync method + * provided by the JPEG library. That method assumes that no backtracking + * is possible. + */ + + +/* + * Terminate source --- called by jpeg_finish_decompress + * after all data has been read. Often a no-op. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_source (j_decompress_ptr cinfo) +{ + /* no work necessary here */ +} + + +/* + * Prepare for input from a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing decompression. + */ + +GLOBAL(void) +jpeg_istream_src (j_decompress_ptr cinfo, istream * infile) +{ + my_src_ptr src; + + /* The source object and input buffer are made permanent so that a series + * of JPEG images can be read from the same file by calling jpeg_stdio_src + * only before the first one. (If we discarded the buffer at the end of + * one image, we'd likely lose the start of the next one.) + * This makes it unsafe to use this manager and a different source + * manager serially with the same JPEG object. Caveat programmer. + */ + if (cinfo->src == NULL) { /* first time for this JPEG object? */ + cinfo->src = (struct jpeg_source_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(my_source_mgr)); + src = (my_src_ptr) cinfo->src; + src->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + INPUT_BUF_SIZE * sizeof(JOCTET)); + } + + src = (my_src_ptr) cinfo->src; + src->pub.init_source = init_source; + src->pub.fill_input_buffer = fill_input_buffer; + src->pub.skip_input_data = skip_input_data; + src->pub.resync_to_restart = jpeg_resync_to_restart; /* use default method */ + src->pub.term_source = term_source; + src->infile = infile; + src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ + src->pub.next_input_byte = NULL; /* until buffer loaded */ +} + + + +// +// The rest of the code in this file is new to Panda. +// //////////////////////////////////////////////////////////////////// // Function: PNMFileTypeJPG::Reader::Constructor @@ -26,11 +253,11 @@ // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeJPG::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { // Put the magic number bytes back into the file - fseek(file, 0, SEEK_SET); + file->seekg(0); /* Step 1: allocate and initialize JPEG decompression object */ @@ -41,8 +268,7 @@ Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : jpeg_create_decompress(&_cinfo); /* Step 2: specify data source (eg, a file) */ - - jpeg_stdio_src(&_cinfo, file); + jpeg_istream_src(&_cinfo, file); /* Step 3: read file parameters with jpeg_read_header() */ diff --git a/panda/src/pnmimagetypes/pnmFileTypeJPGWriter.cxx b/panda/src/pnmimagetypes/pnmFileTypeJPGWriter.cxx index e6fb087848..b673a1fa1c 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeJPGWriter.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeJPGWriter.cxx @@ -19,20 +19,181 @@ #include "pnmFileTypeJPG.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmImage.h" +#include "pnmWriter.h" + +// +// The following bit of code, for setting up jpeg_istream_src(), was +// lifted from jpeglib, and modified to work with istream istead of +// stdio. +// + +/* + * jdatadst.c + * + * Copyright (C) 1994-1996, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains compression data destination routines for the case of + * emitting JPEG data to a file (or any stdio stream). While these routines + * are sufficient for most applications, some will want to use a different + * destination manager. + * IMPORTANT: we assume that fwrite() will correctly transcribe an array of + * JOCTETs into 8-bit-wide elements on external storage. If char is wider + * than 8 bits on your machine, you may need to do some tweaking. + */ + +/* this is not a core library module, so it doesn't define JPEG_INTERNALS */ extern "C" { #include +#include } + +/* Expanded data destination object for stdio output */ + +typedef struct { + struct jpeg_destination_mgr pub; /* public fields */ + + ostream * outfile; /* target stream */ + JOCTET * buffer; /* start of buffer */ +} my_destination_mgr; + +typedef my_destination_mgr * my_dest_ptr; + +#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ + + +/* + * Initialize destination --- called by jpeg_start_compress + * before any data is actually written. + */ + +METHODDEF(void) +init_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + /* Allocate the output buffer --- it will be released when done with image */ + dest->buffer = (JOCTET *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, + OUTPUT_BUF_SIZE * sizeof(JOCTET)); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; +} + + +/* + * Empty the output buffer --- called whenever buffer fills up. + * + * In typical applications, this should write the entire output buffer + * (ignoring the current state of next_output_byte & free_in_buffer), + * reset the pointer & count to the start of the buffer, and return TRUE + * indicating that the buffer has been dumped. + * + * In applications that need to be able to suspend compression due to output + * overrun, a FALSE return indicates that the buffer cannot be emptied now. + * In this situation, the compressor will return to its caller (possibly with + * an indication that it has not accepted all the supplied scanlines). The + * application should resume compression after it has made more room in the + * output buffer. Note that there are substantial restrictions on the use of + * suspension --- see the documentation. + * + * When suspending, the compressor will back up to a convenient restart point + * (typically the start of the current MCU). next_output_byte & free_in_buffer + * indicate where the restart point will be if the current call returns FALSE. + * Data beyond this point will be regenerated after resumption, so do not + * write it out when emptying the buffer externally. + */ + +METHODDEF(boolean) +empty_output_buffer (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + + if (!dest->outfile->write(dest->buffer, OUTPUT_BUF_SIZE)) + ERREXIT(cinfo, JERR_FILE_WRITE); + + dest->pub.next_output_byte = dest->buffer; + dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; + + return TRUE; +} + + +/* + * Terminate destination --- called by jpeg_finish_compress + * after all data has been written. Usually needs to flush buffer. + * + * NB: *not* called by jpeg_abort or jpeg_destroy; surrounding + * application must deal with any cleanup that should happen even + * for error exit. + */ + +METHODDEF(void) +term_destination (j_compress_ptr cinfo) +{ + my_dest_ptr dest = (my_dest_ptr) cinfo->dest; + size_t datacount = OUTPUT_BUF_SIZE - dest->pub.free_in_buffer; + + /* Write any data remaining in the buffer */ + if (datacount > 0) { + if (!dest->outfile->write(dest->buffer, datacount)) + ERREXIT(cinfo, JERR_FILE_WRITE); + } + dest->outfile->flush(); + /* Make sure we wrote the output file OK */ + if (dest->outfile->fail()) + ERREXIT(cinfo, JERR_FILE_WRITE); +} + + +/* + * Prepare for output to a stdio stream. + * The caller must have already opened the stream, and is responsible + * for closing it after finishing compression. + */ + +GLOBAL(void) +jpeg_ostream_dest (j_compress_ptr cinfo, ostream * outfile) +{ + my_dest_ptr dest; + + /* The destination object is made permanent so that multiple JPEG images + * can be written to the same file without re-executing jpeg_stdio_dest. + * This makes it dangerous to use this manager and a different destination + * manager serially with the same JPEG object, because their private object + * sizes may be different. Caveat programmer. + */ + if (cinfo->dest == NULL) { /* first time for this JPEG object? */ + cinfo->dest = (struct jpeg_destination_mgr *) + (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, + sizeof(my_destination_mgr)); + } + + dest = (my_dest_ptr) cinfo->dest; + dest->pub.init_destination = init_destination; + dest->pub.empty_output_buffer = empty_output_buffer; + dest->pub.term_destination = term_destination; + dest->outfile = outfile; +} + + + +// +// The rest of the code in this file is new to Panda. +// + //////////////////////////////////////////////////////////////////// // Function: PNMFileTypeJPG::Writer::Constructor // Access: Public // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeJPG::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } @@ -100,13 +261,7 @@ write_data(xel *array, xelval *) { /* Step 2: specify data destination (eg, a file) */ /* Note: steps 2 and 3 can be done in either order. */ - - /* Here we use the library-supplied code to send compressed data to a - * stdio stream. You can also write your own code to do something else. - * VERY IMPORTANT: use "b" option to fopen() if you are on a machine that - * requires it in order to write binary files. - */ - jpeg_stdio_dest(&cinfo, _file); + jpeg_ostream_dest(&cinfo, _file); /* Step 3: set parameters for compression */ diff --git a/panda/src/pnmimagetypes/pnmFileTypeRadiance.cxx b/panda/src/pnmimagetypes/pnmFileTypeRadiance.cxx deleted file mode 100644 index d837ae3541..0000000000 --- a/panda/src/pnmimagetypes/pnmFileTypeRadiance.cxx +++ /dev/null @@ -1,382 +0,0 @@ -// Filename: pnmFileTypeRadiance.cxx -// Created by: drose (17Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - -#include "pnmFileTypeRadiance.h" -#include "config_pnmimagetypes.h" - -#include -#include - -extern "C" { - #include "color.h" - #include "resolu.h" - - void setcolrgam(double); - int checkheader(FILE *, char *, FILE *); - int fgetresolu(int *, int *, FILE *); - int freadcolrs(COLR *, int, FILE *); - int fwritecolrs(COLR *, unsigned, FILE *); - void fputformat(char *, FILE *); - void shiftcolrs(COLR *, int, int); - void colrs_gambs(COLR *, int); - void newheader(char *, FILE *); - void printargs(int, char **, FILE *); - void gambs_colrs(COLR *, int); -} - -static const char * const extensions_RAD[] = { - "pic", "rad" -}; -static const int num_extensions_RAD = sizeof(extensions_RAD) / sizeof(const char *); - -TypeHandle PNMFileTypeRadiance::_type_handle; - - -static const int COLR_MAX = 255; - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeRadiance:: -PNMFileTypeRadiance() { -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::get_name -// Access: Public, Virtual -// Description: Returns a few words describing the file type. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeRadiance:: -get_name() const { - return "Radiance"; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::get_num_extensions -// Access: Public, Virtual -// Description: Returns the number of different possible filename -// extensions_RAD associated with this particular file type. -//////////////////////////////////////////////////////////////////// -int PNMFileTypeRadiance:: -get_num_extensions() const { - return num_extensions_RAD; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::get_extension -// Access: Public, Virtual -// Description: Returns the nth possible filename extension -// associated with this particular file type, without a -// leading dot. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeRadiance:: -get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_RAD, string()); - return extensions_RAD[n]; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::get_suggested_extension -// Access: Public, Virtual -// Description: Returns a suitable filename extension (without a -// leading dot) to suggest for files of this type, or -// empty string if no suggestions are available. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeRadiance:: -get_suggested_extension() const { - return "rad"; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::has_magic_number -// Access: Public, Virtual -// Description: Returns true if this particular file type uses a -// magic number to identify it, false otherwise. -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance:: -has_magic_number() const { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::matches_magic_number -// Access: Public, Virtual -// Description: Returns true if the indicated "magic number" byte -// stream (the initial few bytes read from the file) -// matches this particular file type, false otherwise. -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance:: -matches_magic_number(const string &magic_number) const { - nassertr(magic_number.size() >= 2, false); - return (magic_number.substr(0, 2) == "#?"); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::make_reader -// Access: Public, Virtual -// Description: Allocates and returns a new PNMReader suitable for -// reading from this file type, if possible. If reading -// from this file type is not supported, returns NULL. -//////////////////////////////////////////////////////////////////// -PNMReader *PNMFileTypeRadiance:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { - init_pnm(); - return new Reader(this, file, owns_file, magic_number); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::make_writer -// Access: Public, Virtual -// Description: Allocates and returns a new PNMWriter suitable for -// reading from this file type, if possible. If writing -// files of this type is not supported, returns NULL. -//////////////////////////////////////////////////////////////////// -PNMWriter *PNMFileTypeRadiance:: -make_writer(FILE *file, bool owns_file) { - init_pnm(); - return new Writer(this, file, owns_file); -} - - - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Reader::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeRadiance::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : - PNMReader(type, file, owns_file) -{ - setcolrgam(radiance_gamma_correction); - - // Hope we can ungetc() more than one character. - for (string::reverse_iterator mi = magic_number.rbegin(); - mi != magic_number.rend(); - mi++) { - ungetc(*mi, _file); - } - - /* get our header */ - if (checkheader(file, COLRFMT, NULL) < 0 || - fgetresolu(&_x_size, &_y_size, _file) < 0) { - _is_valid = false; - pnmimage_radiance_cat.debug() - << "File is not a valid Radiance image.\n"; - return; - } - - _num_channels = 3; - _maxval = COLR_MAX; - - if (pnmimage_radiance_cat.is_debug()) { - pnmimage_radiance_cat.debug() - << "Reading Radiance image: " << _x_size << " by " << _y_size - << " pixels.\n" - << "gamma correction is " << radiance_gamma_correction - << ", brightness adjustment is " << radiance_brightness_adjustment - << "\n"; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Reader::supports_read_row -// Access: Public, Virtual -// Description: Returns true if this particular PNMReader supports a -// streaming interface to reading the data: that is, it -// is capable of returning the data one row at a time, -// via repeated calls to read_row(). Returns false if -// the only way to read from this file is all at once, -// via read_data(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance::Reader:: -supports_read_row() const { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Reader::read_row -// Access: Public, Virtual -// Description: If supports_read_row(), above, returns true, this -// function may be called repeatedly to read the image, -// one horizontal row at a time, beginning from the top. -// Returns true if the row is successfully read, false -// if there is an error or end of file. -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance::Reader:: -read_row(xel *row_data, xelval *) { - if (!is_valid()) { - return false; - } - - COLR *scanin; - int x; - - scanin = (COLR *)alloca(_x_size * sizeof(COLR)); - - if (freadcolrs(scanin, _x_size, _file) < 0) { - return false; - } - - if (radiance_brightness_adjustment) { - shiftcolrs(scanin, _x_size, radiance_brightness_adjustment); - } - - colrs_gambs(scanin, _x_size); /* gamma correction */ - - for (x = 0; x < _x_size; x++) { - PPM_ASSIGN(row_data[x], scanin[x][RED], scanin[x][GRN], scanin[x][BLU]); - } - - return true; -} - - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Writer::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeRadiance::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : - PNMWriter(type, file, owns_file) -{ -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Writer::supports_write_row -// Access: Public, Virtual -// Description: Returns true if this particular PNMWriter supports a -// streaming interface to writing the data: that is, it -// is capable of writing the image one row at a time, -// via repeated calls to write_row(). Returns false if -// the only way to write from this file is all at once, -// via write_data(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance::Writer:: -supports_write_row() const { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Writer::write_header -// Access: Public, Virtual -// Description: If supports_write_row(), above, returns true, this -// function may be called to write out the image header -// in preparation to writing out the image data one row -// at a time. Returns true if the header is -// successfully written, false if there is an error. -// -// It is the user's responsibility to fill in the header -// data via calls to set_x_size(), set_num_channels(), -// etc., or copy_header_from(), before calling -// write_header(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance::Writer:: -write_header() { - setcolrgam(radiance_gamma_correction); - - /* put our header */ - newheader("RADIANCE", _file); - fputs("Generated via pnmimage\n", _file); - fputformat(COLRFMT, _file); - putc('\n', _file); - fprtresolu(_x_size, _y_size, _file); - - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::Writer::write_row -// Access: Public, Virtual -// Description: If supports_write_row(), above, returns true, this -// function may be called repeatedly to write the image, -// one horizontal row at a time, beginning from the top. -// Returns true if the row is successfully written, -// false if there is an error. -// -// You must first call write_header() before writing the -// individual rows. It is also important to delete the -// PNMWriter class after successfully writing the last -// row. Failing to do this may result in some data not -// getting flushed! -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeRadiance::Writer:: -write_row(xel *row_data, xelval *) { - /* convert file */ - bool grayscale = is_grayscale(); - - COLR *scanout; - int x; - - /* allocate scanline */ - scanout = (COLR *)alloca(_x_size * sizeof(COLR)); - - /* convert image */ - for (x = 0; x < _x_size; x++) { - if (grayscale) { - scanout[x][RED] = - scanout[x][GRN] = - scanout[x][BLU] = (BYTE)((int)COLR_MAX * PPM_GETB(row_data[x]) / _maxval); - } else { - scanout[x][RED] = (BYTE)((int)COLR_MAX * PPM_GETR(row_data[x]) / _maxval); - scanout[x][GRN] = (BYTE)((int)COLR_MAX * PPM_GETG(row_data[x]) / _maxval); - scanout[x][BLU] = (BYTE)((int)COLR_MAX * PPM_GETB(row_data[x]) / _maxval); - } - } - - /* undo gamma */ - gambs_colrs(scanout, _x_size); - if (radiance_brightness_adjustment) - shiftcolrs(scanout, _x_size, radiance_brightness_adjustment); - if (fwritecolrs(scanout, _x_size, _file) < 0) - return false; - - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::register_with_read_factory -// Access: Public, Static -// Description: Registers the current object as something that can be -// read from a Bam file. -//////////////////////////////////////////////////////////////////// -void PNMFileTypeRadiance:: -register_with_read_factory() { - BamReader::get_factory()-> - register_factory(get_class_type(), make_PNMFileTypeRadiance); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeRadiance::make_PNMFileTypeRadiance -// Access: Protected, Static -// Description: This method is called by the BamReader when an object -// of this type is encountered in a Bam file; it should -// allocate and return a new object with all the data -// read. -// -// In the case of the PNMFileType objects, since these -// objects are all shared, we just pull the object from -// the registry. -//////////////////////////////////////////////////////////////////// -TypedWritable *PNMFileTypeRadiance:: -make_PNMFileTypeRadiance(const FactoryParams ¶ms) { - return PNMFileTypeRegistry::get_ptr()->get_type_by_handle(get_class_type()); -} diff --git a/panda/src/pnmimagetypes/pnmFileTypeRadiance.h b/panda/src/pnmimagetypes/pnmFileTypeRadiance.h deleted file mode 100644 index d05fb949ed..0000000000 --- a/panda/src/pnmimagetypes/pnmFileTypeRadiance.h +++ /dev/null @@ -1,95 +0,0 @@ -// Filename: pnmFileTypeRadiance.h -// Created by: drose (17Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - -#ifndef PNMFILETYPERADIANCE_H -#define PNMFILETYPERADIANCE_H - -#include - -#include -#include -#include - -//////////////////////////////////////////////////////////////////// -// Class : PNMFileTypeRadiance -// Description : For reading and Radiance native image files. -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDA PNMFileTypeRadiance : public PNMFileType { -public: - PNMFileTypeRadiance(); - - virtual string get_name() const; - - virtual int get_num_extensions() const; - virtual string get_extension(int n) const; - virtual string get_suggested_extension() const; - - virtual bool has_magic_number() const; - virtual bool matches_magic_number(const string &magic_number) const; - - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, - const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); - -public: - class Reader : public PNMReader { - public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); - - virtual bool supports_read_row() const; - virtual bool read_row(xel *array, xelval *alpha); - }; - - class Writer : public PNMWriter { - public: - Writer(PNMFileType *type, FILE *file, bool owns_file); - - virtual bool supports_write_row() const; - virtual bool write_header(); - virtual bool write_row(xel *array, xelval *alpha); - }; - - - // The TypedWritable interface follows. -public: - static void register_with_read_factory(); - -protected: - static TypedWritable *make_PNMFileTypeRadiance(const FactoryParams ¶ms); - -public: - static TypeHandle get_class_type() { - return _type_handle; - } - static void init_type() { - PNMFileType::init_type(); - register_type(_type_handle, "PNMFileTypeRadiance", - PNMFileType::get_class_type()); - } - virtual TypeHandle get_type() const { - return get_class_type(); - } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - -private: - static TypeHandle _type_handle; -}; - -#endif - - diff --git a/panda/src/pnmimagetypes/pnmFileTypeSGI.cxx b/panda/src/pnmimagetypes/pnmFileTypeSGI.cxx index af4b3c3c11..e8d25fb84d 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSGI.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeSGI.cxx @@ -20,13 +20,13 @@ #include "config_pnmimagetypes.h" #include "sgi.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" -static const char * const extensions_SGI[] = { +static const char * const extensions_sgi[] = { "rgb", "rgba", "sgi" }; -static const int num_extensions_SGI = sizeof(extensions_SGI) / sizeof(const char *); +static const int num_extensions_sgi = sizeof(extensions_sgi) / sizeof(const char *); TypeHandle PNMFileTypeSGI::_type_handle; @@ -53,11 +53,11 @@ get_name() const { // Function: PNMFileTypeSGI::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_SGI associated with this particular file type. +// extensions associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeSGI:: get_num_extensions() const { - return num_extensions_SGI; + return num_extensions_sgi; } //////////////////////////////////////////////////////////////////// @@ -69,8 +69,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeSGI:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_SGI, string()); - return extensions_SGI[n]; + nassertr(n >= 0 && n < num_extensions_sgi, string()); + return extensions_sgi[n]; } //////////////////////////////////////////////////////////////////// @@ -120,7 +120,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeSGI:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -133,7 +133,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeSGI:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeSGI.h b/panda/src/pnmimagetypes/pnmFileTypeSGI.h index 59d87e2245..0abccadbfa 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSGI.h +++ b/panda/src/pnmimagetypes/pnmFileTypeSGI.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPESGI_H #define PNMFILETYPESGI_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeSGI @@ -42,14 +42,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual ~Reader(); virtual bool supports_read_row() const; @@ -69,7 +69,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual ~Writer(); virtual bool supports_write_row() const; @@ -94,7 +94,7 @@ public: void write_rgb_header(const char *imagename); void write_table(); - void write_channels(ScanLine channel[], void (*put)(FILE *, short)); + void write_channels(ScanLine channel[], void (*put)(ostream *, short)); void build_scanline(ScanLine output[], xel *row_data, xelval *alpha_data); ScanElem *compress(ScanElem *temp, ScanLine &output); int rle_compress(ScanElem *inbuf, int size); diff --git a/panda/src/pnmimagetypes/pnmFileTypeSGIReader.cxx b/panda/src/pnmimagetypes/pnmFileTypeSGIReader.cxx index 74195e865a..2c7bf7c9d6 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSGIReader.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeSGIReader.cxx @@ -20,10 +20,10 @@ #include "config_pnmimagetypes.h" #include "sgi.h" -#include -#include +#include "pnmImage.h" +#include "pnmReader.h" -#include +#include "notify.h" // Much code in this file is borrowed from Netpbm, specifically sgitopnm.c. @@ -52,18 +52,18 @@ typedef short ScanElem; typedef ScanElem * ScanLine; /* prototypes */ -static unsigned char get_byte ( FILE* f ); -static long get_big_long (FILE *f); -static short get_big_short (FILE *f); -static short get_byte_as_short (FILE *f); -static int readerr (FILE *f); +static unsigned char get_byte ( istream* f ); +static long get_big_long (istream *f); +static short get_big_short (istream *f); +static short get_byte_as_short (istream *f); +static int readerr (istream *f); static void * xmalloc (int bytes); #define MALLOC(n, type) (type *)xmalloc((n) * sizeof(type)) static char * compression_name (char compr); -static void read_bytes (FILE *ifp, int n, char *buf); -static bool read_header(FILE *ifp, Header *head, const string &magic_number); -static TabEntry * read_table (FILE *ifp, int tablen); -static void read_channel (FILE *ifp, int xsize, int ysize, +static void read_bytes (istream *ifp, int n, char *buf); +static bool read_header(istream *ifp, Header *head, const string &magic_number); +static TabEntry * read_table (istream *ifp, int tablen); +static void read_channel (istream *ifp, int xsize, int ysize, int zsize, int bpc, TabEntry *table, ScanElem *channel_data, long table_start, int channel, int row); @@ -86,7 +86,7 @@ static bool eof_err = false; // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeSGI::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { eof_err = false; @@ -119,7 +119,7 @@ Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : _maxval = (xelval)pixmax; - table_start = ftell(file); + table_start = file->tellg(); if( head.storage != STORAGE_VERBATIM ) table = read_table(file, head.ysize * head.zsize); @@ -230,7 +230,7 @@ read_row(xel *row_data, xelval *alpha_data) { static bool -read_header(FILE *ifp, Header *head, const string &magic_number) { +read_header(istream *ifp, Header *head, const string &magic_number) { nassertr(magic_number.size() == 4, false); head->magic = ((unsigned char)magic_number[0] << 8) | @@ -318,7 +318,7 @@ read_header(FILE *ifp, Header *head, const string &magic_number) { static TabEntry * -read_table(FILE *ifp, int tablen) { +read_table(istream *ifp, int tablen) { TabEntry *table; int i; @@ -337,7 +337,7 @@ read_table(FILE *ifp, int tablen) { static void -read_channel(FILE *ifp, +read_channel(istream *ifp, int xsize, int ysize, int, int bpc, TabEntry *table, ScanElem *channel_data, long table_start, @@ -346,7 +346,7 @@ read_channel(FILE *ifp, int sgi_index, i; long offset, length; - short (*func)(FILE *); + short (*func)(istream *); func = (bpc==1) ? get_byte_as_short : get_big_short; if ( table ) { @@ -359,7 +359,7 @@ read_channel(FILE *ifp, length = table[sgi_index].length; if( bpc == 2 ) length /= 2; /* doc says length is in bytes, we are reading words */ - if( fseek(ifp, offset, SEEK_SET) != 0 ) + if(!ifp->seekg(offset)) pm_error("seek error for offset %ld", offset); nassertv(length <= WORSTCOMPR(xsize)); @@ -370,7 +370,7 @@ read_channel(FILE *ifp, } else { offset = sgi_index * xsize + table_start; - if( fseek(ifp, offset, SEEK_SET) != 0 ) + if(!ifp->seekg(offset)) pm_error("seek error for offset %ld", offset); for( i = 0; i < xsize; i++ ) channel_data[i] = (*func)(ifp); @@ -420,7 +420,7 @@ rle_decompress(ScanElem *src, /* basic I/O functions, taken from ilbmtoppm.c */ static short -get_big_short(FILE *ifp) { +get_big_short(istream *ifp) { short s; if( pm_readbigshort(ifp, &s) == -1 ) @@ -430,7 +430,7 @@ get_big_short(FILE *ifp) { } static long -get_big_long(FILE *ifp) { +get_big_long(istream *ifp) { long l; if( pm_readbiglong(ifp, &l) == -1 ) @@ -440,10 +440,10 @@ get_big_long(FILE *ifp) { } static unsigned char -get_byte(FILE *ifp) { +get_byte(istream *ifp) { int i; - i = getc(ifp); + i = ifp->get(); if( i == EOF ) i = readerr(ifp); @@ -452,13 +452,15 @@ get_byte(FILE *ifp) { static int -readerr(FILE *f) { - // This will return only if the error is EOF. - if( ferror(f) ) - pm_error("read error"); - +readerr(istream *f) { if (!eof_err) { - fprintf(stderr, "Warning: premature EOF on file\n"); + if (!f->eof()) { + pnmimage_sgi_cat.warning() + << "Read error on file.\n"; + } else { + pnmimage_sgi_cat.warning() + << "Premature EOF on file.\n"; + } eof_err = true; } @@ -467,12 +469,13 @@ readerr(FILE *f) { static void -read_bytes(FILE *ifp, +read_bytes(istream *ifp, int n, char *buf) { int r; - r = fread((void *)buf, 1, n, ifp); + ifp->read(buf, n); + r = ifp->gcount(); if( r != n ) { readerr(ifp); memset(buf+r, 0, n-r); @@ -481,7 +484,7 @@ read_bytes(FILE *ifp, static short -get_byte_as_short(FILE *ifp) { +get_byte_as_short(istream *ifp) { return (short)get_byte(ifp); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeSGIWriter.cxx b/panda/src/pnmimagetypes/pnmFileTypeSGIWriter.cxx index 6d6e4f5931..5d28dfa04b 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSGIWriter.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeSGIWriter.cxx @@ -20,8 +20,8 @@ #include "config_pnmimagetypes.h" #include "sgi.h" -#include -#include +#include "pnmImage.h" +#include "pnmWriter.h" // Much code in this file originally came from from Netpbm, // specifically pnmtosgi.c. It has since been fairly heavily @@ -53,26 +53,26 @@ #define MAXVAL_WORD 65535 inline void -put_byte(FILE *out_file, unsigned char b) { - putc(b, out_file); +put_byte(ostream *out_file, unsigned char b) { + out_file->put(b); } static void -put_big_short(FILE *out_file, short s) { +put_big_short(ostream *out_file, short s) { if ( pm_writebigshort( out_file, s ) == -1 ) pm_error( "write error" ); } static void -put_big_long(FILE *out_file, long l) { +put_big_long(ostream *out_file, long l) { if ( pm_writebiglong( out_file, l ) == -1 ) pm_error( "write error" ); } static void -put_short_as_byte(FILE *out_file, short s) { +put_short_as_byte(ostream *out_file, short s) { put_byte(out_file, (unsigned char)s); } @@ -83,7 +83,7 @@ put_short_as_byte(FILE *out_file, short s) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeSGI::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } @@ -97,7 +97,7 @@ PNMFileTypeSGI::Writer:: ~Writer() { if (table!=NULL) { // Rewrite the table with the correct values in it. - fseek(_file, table_start, SEEK_SET); + _file->seekp(table_start); write_table(); delete[] table; } @@ -171,7 +171,7 @@ write_header() { write_rgb_header(sgi_imagename.c_str()); if (table!=NULL) { - table_start = ftell(_file); + table_start = _file->tellp(); // The first time we write the table, it has zeroes. We'll correct // this later. @@ -257,11 +257,11 @@ write_table() { void PNMFileTypeSGI::Writer:: -write_channels(ScanLine channel[], void (*put)(FILE *, short)) { +write_channels(ScanLine channel[], void (*put)(ostream *, short)) { int i, col; for( i = 0; i < _num_channels; i++ ) { - Table(i).start = ftell(_file); + Table(i).start = _file->tellp(); Table(i).length = channel[i].length * bpc; for( col = 0; col < channel[i].length; col++ ) { diff --git a/panda/src/pnmimagetypes/pnmFileTypeSoftImage.cxx b/panda/src/pnmimagetypes/pnmFileTypeSoftImage.cxx index 8d036a2e00..170a3bdaf5 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSoftImage.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeSoftImage.cxx @@ -19,8 +19,8 @@ #include "pnmFileTypeSoftImage.h" #include "config_pnmimagetypes.h" -#include -#include +#include "pnmFileTypeRegistry.h" +#include "bamReader.h" static const float imageVersionNumber = 3.0; static const int imageCommentLength = 80; @@ -39,15 +39,15 @@ static const char imageComment[imageCommentLength+1] = #define SOFTIMAGE_MAGIC1 0x5380 #define SOFTIMAGE_MAGIC2 0xf634 -static const char * const extensions_SI[] = { +static const char * const extensions_softimage[] = { "pic", "soft" }; -static const int num_extensions_SI = sizeof(extensions_SI) / sizeof(const char *); +static const int num_extensions_softimage = sizeof(extensions_softimage) / sizeof(const char *); TypeHandle PNMFileTypeSoftImage::_type_handle; inline float -read_float(FILE *file) { +read_float(istream *file) { long l; if (pm_readbiglong(file, &l)==0) { @@ -58,42 +58,42 @@ read_float(FILE *file) { } inline unsigned short -read_ushort_SI(FILE *file) { +read_ushort_SI(istream *file) { unsigned short x; return pm_readbigshort(file, (short *)&x)==0 ? x : 0; } inline unsigned char -read_uchar_SI(FILE *file) { +read_uchar_SI(istream *file) { int x; - x = getc(file); + x = file->get(); return (x!=EOF) ? (unsigned char)x : 0; } inline void -write_ushort_SI(FILE *file, unsigned short x) { +write_ushort_SI(ostream *file, unsigned short x) { pm_writebigshort(file, (short)x); } inline void -write_uchar_SI(FILE *file, unsigned char x) { - putc(x, file); +write_uchar_SI(ostream *file, unsigned char x) { + file->put(x); } inline void -write_float(FILE *file, float x) { +write_float(ostream *file, float x) { pm_writebiglong(file, *(long *)&x); } static int -read_channel_pkt(FILE *file, +read_channel_pkt(istream *file, int &chained, int &size, int &type, int &channel) { chained = read_uchar_SI(file); size = read_uchar_SI(file); type = read_uchar_SI(file); channel = read_uchar_SI(file); - if (feof(file)) { + if (file->eof() || file->fail()) { return false; } @@ -107,7 +107,7 @@ read_channel_pkt(FILE *file, } static void -read_rgb(xel *row_data, xelval *, FILE *file, int x, int repeat) { +read_rgb(xel *row_data, xelval *, istream *file, int x, int repeat) { xelval red, grn, blu; red = read_uchar_SI(file); grn = read_uchar_SI(file); @@ -121,7 +121,7 @@ read_rgb(xel *row_data, xelval *, FILE *file, int x, int repeat) { } static void -read_alpha(xel *, xelval *alpha_data, FILE *file, int x, int repeat) { +read_alpha(xel *, xelval *alpha_data, istream *file, int x, int repeat) { xelval alpha = read_uchar_SI(file); while (repeat>0) { @@ -132,7 +132,7 @@ read_alpha(xel *, xelval *alpha_data, FILE *file, int x, int repeat) { } static void -read_rgba(xel *row_data, xelval *alpha_data, FILE *file, int x, int repeat) { +read_rgba(xel *row_data, xelval *alpha_data, istream *file, int x, int repeat) { xelval red, grn, blu, alpha; red = read_uchar_SI(file); grn = read_uchar_SI(file); @@ -149,8 +149,8 @@ read_rgba(xel *row_data, xelval *alpha_data, FILE *file, int x, int repeat) { static int -read_scanline(xel *row_data, xelval *alpha_data, int cols, FILE *file, - void (*read_data)(xel *row_data, xelval *alpha_data, FILE *file, +read_scanline(xel *row_data, xelval *alpha_data, int cols, istream *file, + void (*read_data)(xel *row_data, xelval *alpha_data, istream *file, int x, int repeat), int ctype) { if (ctype==UNCOMPRESSED) { @@ -174,7 +174,7 @@ read_scanline(xel *row_data, xelval *alpha_data, int cols, FILE *file, } while (num>0) { read_data(row_data, alpha_data, file, x, 1); - if (feof(file)) { + if (file->eof() || file->fail()) { return false; } x++; @@ -191,7 +191,7 @@ read_scanline(xel *row_data, xelval *alpha_data, int cols, FILE *file, return false; } read_data(row_data, alpha_data, file, x, num); - if (feof(file)) { + if (file->eof() || file->fail()) { return false; } x += num; @@ -225,11 +225,11 @@ get_name() const { // Function: PNMFileTypeSoftImage::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_SI associated with this particular file type. +// extensions_softimage associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeSoftImage:: get_num_extensions() const { - return num_extensions_SI; + return num_extensions_softimage; } //////////////////////////////////////////////////////////////////// @@ -241,8 +241,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeSoftImage:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_SI, string()); - return extensions_SI[n]; + nassertr(n >= 0 && n < num_extensions_softimage, string()); + return extensions_softimage[n]; } //////////////////////////////////////////////////////////////////// @@ -292,7 +292,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeSoftImage:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -305,7 +305,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeSoftImage:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } @@ -317,7 +317,7 @@ make_writer(FILE *file, bool owns_file) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeSoftImage::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { if (!read_magic_number(_file, magic_number, 4)) { @@ -346,10 +346,11 @@ Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : read_float(_file); // Skip comment - fseek(_file, imageCommentLength, SEEK_CUR); + _file->seekg(imageCommentLength, ios::cur); char pict_id[4]; - if (fread(pict_id, 1, 4, _file) < 4) { + _file->read(pict_id, 4); + if (_file->gcount() < 4) { _is_valid = false; return; } @@ -492,7 +493,7 @@ read_row(xel *row_data, xelval *alpha_data) { static void -write_channel_pkt(FILE *file, +write_channel_pkt(ostream *file, int chained, int size, int type, int channel) { write_uchar_SI(file, chained); write_uchar_SI(file, size); @@ -501,7 +502,7 @@ write_channel_pkt(FILE *file, } static void -write_rgb(xel *row_data, xelval *, FILE *file, int x) { +write_rgb(xel *row_data, xelval *, ostream *file, int x) { write_uchar_SI(file, PPM_GETR(row_data[x])); write_uchar_SI(file, PPM_GETG(row_data[x])); write_uchar_SI(file, PPM_GETB(row_data[x])); @@ -513,7 +514,7 @@ compare_rgb(xel *row_data, xelval *, int x1, int x2) { } static void -write_gray(xel *row_data, xelval *, FILE *file, int x) { +write_gray(xel *row_data, xelval *, ostream *file, int x) { write_uchar_SI(file, PPM_GETB(row_data[x])); write_uchar_SI(file, PPM_GETB(row_data[x])); write_uchar_SI(file, PPM_GETB(row_data[x])); @@ -525,7 +526,7 @@ compare_gray(xel *row_data, xelval *, int x1, int x2) { } static void -write_alpha(xel *, xelval *alpha_data, FILE *file, int x) { +write_alpha(xel *, xelval *alpha_data, ostream *file, int x) { write_uchar_SI(file, alpha_data[x]); } @@ -535,8 +536,8 @@ compare_alpha(xel *, xelval *alpha_data, int x1, int x2) { } static void -write_diff(xel *row_data, xelval *alpha_data, FILE *file, - void (*write_data)(xel *row_data, xelval *alpha_data, FILE *file, +write_diff(xel *row_data, xelval *alpha_data, ostream *file, + void (*write_data)(xel *row_data, xelval *alpha_data, ostream *file, int x), int tox, int length) { if (length>0) { @@ -551,8 +552,8 @@ write_diff(xel *row_data, xelval *alpha_data, FILE *file, } static void -write_same(xel *row_data, xelval *alpha_data, FILE *file, - void (*write_data)(xel *row_data, xelval *alpha_data, FILE *file, +write_same(xel *row_data, xelval *alpha_data, ostream *file, + void (*write_data)(xel *row_data, xelval *alpha_data, ostream *file, int x), int tox, int length) { if (length==1) { @@ -571,11 +572,11 @@ write_same(xel *row_data, xelval *alpha_data, FILE *file, static void -write_scanline(xel *row_data, xelval *alpha_data, int cols, FILE *file, +write_scanline(xel *row_data, xelval *alpha_data, int cols, ostream *file, int (*compare_data)(xel *row_data, xelval *alpha_data, int x1, int x2), void (*write_data)(xel *row_data, xelval *alpha_data, - FILE *file, int x)) { + ostream *file, int x)) { int run_length = 0; int x = 0; @@ -666,7 +667,7 @@ write_scanline(xel *row_data, xelval *alpha_data, int cols, FILE *file, // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeSoftImage::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } @@ -706,8 +707,8 @@ write_header() { write_ushort_SI(_file, SOFTIMAGE_MAGIC2); write_float(_file, imageVersionNumber); - fwrite(imageComment, 1, imageCommentLength, _file); - fwrite("PICT", 1, 4, _file); + _file->write(imageComment, imageCommentLength); + _file->write("PICT", 4); write_ushort_SI(_file, _x_size); write_ushort_SI(_file, _y_size); @@ -757,7 +758,7 @@ write_row(xel *row_data, xelval *alpha_data) { write_scanline(row_data, alpha_data, _x_size, _file, compare_alpha, write_alpha); } - return !ferror(_file); + return !_file->fail(); } diff --git a/panda/src/pnmimagetypes/pnmFileTypeSoftImage.h b/panda/src/pnmimagetypes/pnmFileTypeSoftImage.h index 36c7194797..1e4f0a7f2f 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeSoftImage.h +++ b/panda/src/pnmimagetypes/pnmFileTypeSoftImage.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPESOFTIMAGE_H #define PNMFILETYPESOFTIMAGE_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" //////////////////////////////////////////////////////////////////// // Class : PNMFileTypeSoftImage @@ -42,14 +42,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual bool supports_read_row() const; virtual bool read_row(xel *array, xelval *alpha); @@ -61,7 +61,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual bool supports_write_row() const; virtual bool write_header(); diff --git a/panda/src/pnmimagetypes/pnmFileTypeTGA.cxx b/panda/src/pnmimagetypes/pnmFileTypeTGA.cxx index 13ad29324a..7d966a7449 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeTGA.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeTGA.cxx @@ -55,10 +55,10 @@ #include -static const char * const extensions_TGA[] = { +static const char * const extensions_tga[] = { "tga" }; -static const int num_extensions_TGA = sizeof(extensions_TGA) / sizeof(const char *); +static const int num_extensions_tga = sizeof(extensions_tga) / sizeof(const char *); TypeHandle PNMFileTypeTGA::_type_handle; @@ -123,11 +123,11 @@ get_name() const { // Function: PNMFileTypeTGA::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_TGA associated with this particular file type. +// extensions_tga associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeTGA:: get_num_extensions() const { - return num_extensions_TGA; + return num_extensions_tga; } //////////////////////////////////////////////////////////////////// @@ -139,8 +139,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeTGA:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_TGA, string()); - return extensions_TGA[n]; + nassertr(n >= 0 && n < num_extensions_tga, string()); + return extensions_tga[n]; } //////////////////////////////////////////////////////////////////// @@ -163,7 +163,7 @@ get_suggested_extension() const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeTGA:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -176,7 +176,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeTGA:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } @@ -188,7 +188,7 @@ make_writer(FILE *file, bool owns_file) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeTGA::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { tga_head = new ImageHeader; @@ -369,7 +369,7 @@ read_data(xel *array, xelval *alpha) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeTGA::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { tgaHeader = new ImageHeader; @@ -538,14 +538,14 @@ write_data(xel *array, xelval *) { { if ( runlength[col] > 0 ) { - fputc( 0x80 + runlength[col] - 1, _file ); + _file->put( 0x80 + runlength[col] - 1 ); put_pixel(&(array[realrow * cols + col]), tgaHeader->ImgType, _maxval, cht ); col += runlength[col]; } else if ( runlength[col] < 0 ) { - fputc( -runlength[col] - 1, _file ); + _file->put( -runlength[col] - 1 ); for ( i = 0; i < -runlength[col]; ++i ) put_pixel(&(array[realrow * cols + (col + i)]), tgaHeader->ImgType, _maxval, cht ); @@ -597,7 +597,7 @@ make_PNMFileTypeTGA(const FactoryParams ¶ms) { } void PNMFileTypeTGA::Reader:: -readtga( FILE *ifp, struct ImageHeader *tgaP, const string &magic_number ) { +readtga( istream *ifp, struct ImageHeader *tgaP, const string &magic_number ) { unsigned char flags; ImageIDField junk; @@ -641,11 +641,11 @@ readtga( FILE *ifp, struct ImageHeader *tgaP, const string &magic_number ) { tgaP->IntrLve = ( flags & 0xc0 ) >> 6; if ( tgaP->IDLength != 0 ) - fread( junk, 1, (int) tgaP->IDLength, ifp ); + ifp->read(junk, (int) tgaP->IDLength); } void PNMFileTypeTGA::Reader:: -get_map_entry( FILE *ifp, pixel *Value, int Size, gray *Alpha ) { +get_map_entry( istream *ifp, pixel *Value, int Size, gray *Alpha ) { unsigned char j, k, r, g, b, a; /* Read appropriate number of bytes, break into rgb & put in map. */ @@ -687,7 +687,7 @@ get_map_entry( FILE *ifp, pixel *Value, int Size, gray *Alpha ) { void PNMFileTypeTGA::Reader:: -get_pixel( FILE *ifp, pixel *dest, int Size, gray *alpha_p) { +get_pixel( istream *ifp, pixel *dest, int Size, gray *alpha_p) { static pixval Red, Grn, Blu; static pixval Alpha; unsigned char j, k; @@ -769,10 +769,11 @@ PixEncode: unsigned char PNMFileTypeTGA::Reader:: -getbyte( FILE *ifp ) { +getbyte( istream *ifp ) { unsigned char c; - if ( fread( (char*) &c, 1, 1, ifp ) != 1 ) + c = ifp->get(); + if (ifp->fail() || ifp->eof()) pm_error( "EOF / read error" ); return c; @@ -783,28 +784,28 @@ writetga( struct ImageHeader *tgaP, char *id ) { unsigned char flags; - fputc( tgaP->IDLength, _file ); - fputc( tgaP->CoMapType, _file ); - fputc( tgaP->ImgType, _file ); - fputc( tgaP->Index_lo, _file ); - fputc( tgaP->Index_hi, _file ); - fputc( tgaP->Length_lo, _file ); - fputc( tgaP->Length_hi, _file ); - fputc( tgaP->CoSize, _file ); - fputc( tgaP->X_org_lo, _file ); - fputc( tgaP->X_org_hi, _file ); - fputc( tgaP->Y_org_lo, _file ); - fputc( tgaP->Y_org_hi, _file ); - fputc( tgaP->Width_lo, _file ); - fputc( tgaP->Width_hi, _file ); - fputc( tgaP->Height_lo, _file ); - fputc( tgaP->Height_hi, _file ); - fputc( tgaP->PixelSize, _file ); + _file->put( tgaP->IDLength ); + _file->put( tgaP->CoMapType ); + _file->put( tgaP->ImgType ); + _file->put( tgaP->Index_lo ); + _file->put( tgaP->Index_hi ); + _file->put( tgaP->Length_lo ); + _file->put( tgaP->Length_hi ); + _file->put( tgaP->CoSize ); + _file->put( tgaP->X_org_lo ); + _file->put( tgaP->X_org_hi ); + _file->put( tgaP->Y_org_lo ); + _file->put( tgaP->Y_org_hi ); + _file->put( tgaP->Width_lo ); + _file->put( tgaP->Width_hi ); + _file->put( tgaP->Height_lo ); + _file->put( tgaP->Height_hi ); + _file->put( tgaP->PixelSize ); flags = ( tgaP->AttBits & 0xf ) | ( ( tgaP->Rsrvd & 0x1 ) << 4 ) | ( ( tgaP->OrgBit & 0x1 ) << 5 ) | ( ( tgaP->OrgBit & 0x3 ) << 6 ); - fputc( flags, _file ); + _file->put( flags ); if ( tgaP->IDLength ) - fwrite( id, 1, (int) tgaP->IDLength, _file ); + _file->write( id, (int) tgaP->IDLength ); } void PNMFileTypeTGA::Writer:: @@ -824,8 +825,8 @@ put_map_entry( pixel* valueP, int size, pixval maxval ) PPM_DEPTH( p, *valueP, maxval, 31 ); j = (int) PPM_GETB( p ) | ( (int) PPM_GETG( p ) << 5 ) | ( (int) PPM_GETR( p ) << 10 ); - fputc( j % 256, _file ); - fputc( j / 256, _file ); + _file->put( j % 256 ); + _file->put( j / 256 ); break; case 32: @@ -907,25 +908,25 @@ put_mono( pixel* pP, pixval maxval ) { pixel p; PPM_DEPTH( p, *pP, maxval, (pixval) 255 ); - fputc( PPM_GETB( p ), _file ); + _file->put( PPM_GETB( p ) ); } void PNMFileTypeTGA::Writer:: put_map( pixel *pP, colorhash_table cht ) { - fputc( ppm_lookupcolor( cht, pP ), _file ); + _file->put( ppm_lookupcolor( cht, pP ) ); } void PNMFileTypeTGA::Writer:: put_rgb( pixel* pP, pixval maxval ) { pixel p; PPM_DEPTH( p, *pP, maxval, (pixval) 255 ); - fputc( PPM_GETB( p ), _file ); + _file->put( PPM_GETB( p ) ); if (is_grayscale()) { - fputc( PPM_GETB( p ), _file ); - fputc( PPM_GETB( p ), _file ); + _file->put( PPM_GETB( p ) ); + _file->put( PPM_GETB( p ) ); } else { - fputc( PPM_GETG( p ), _file ); - fputc( PPM_GETR( p ), _file ); + _file->put( PPM_GETG( p ) ); + _file->put( PPM_GETR( p ) ); } } diff --git a/panda/src/pnmimagetypes/pnmFileTypeTGA.h b/panda/src/pnmimagetypes/pnmFileTypeTGA.h index 2c73c9a6e6..49a651ff98 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeTGA.h +++ b/panda/src/pnmimagetypes/pnmFileTypeTGA.h @@ -47,24 +47,24 @@ public: virtual string get_extension(int n) const; virtual string get_suggested_extension() const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual ~Reader(); virtual int read_data(xel *array, xelval *alpha); private: - void readtga ( FILE* ifp, struct ImageHeader* tgaP, const string &magic_number ); - void get_map_entry ( FILE* ifp, pixel* Value, int Size, + void readtga ( istream* ifp, struct ImageHeader* tgaP, const string &magic_number ); + void get_map_entry ( istream* ifp, pixel* Value, int Size, gray* Alpha); - void get_pixel ( FILE* ifp, pixel* dest, int Size, gray* alpha_p); - unsigned char getbyte ( FILE* ifp ); + void get_pixel ( istream* ifp, pixel* dest, int Size, gray* alpha_p); + unsigned char getbyte ( istream* ifp ); int rows, cols, rlencoded, mapped; struct ImageHeader *tga_head; @@ -75,7 +75,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual ~Writer(); virtual int write_data(xel *array, xelval *alpha); diff --git a/panda/src/pnmimagetypes/pnmFileTypeTIFF.cxx b/panda/src/pnmimagetypes/pnmFileTypeTIFF.cxx index 249ddeb1f3..f248416cec 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeTIFF.cxx +++ b/panda/src/pnmimagetypes/pnmFileTypeTIFF.cxx @@ -32,10 +32,10 @@ extern "C" { #include } -static const char * const extensions_TIFF[] = { +static const char * const extensions_tiff[] = { "tiff", "tif" }; -static const int num_extensions_TIFF = sizeof(extensions_TIFF) / sizeof(const char *); +static const int num_extensions_tiff = sizeof(extensions_tiff) / sizeof(const char *); // These are configurable parameters to specify TIFF details on // output. See tiff.h or type man pnmtotiff for a better explanation @@ -80,57 +80,115 @@ long tiff_rowsperstrip = 0; #define PHOTOMETRIC_DEPTH 32768 #endif -// Here's a number of functions to support the stdio-FILE interface +// Here's a number of functions to support the iostream interface // via the TIFF library. static tsize_t -stdio_read(thandle_t fd, tdata_t buf, tsize_t size) { - return ((tsize_t)fread((void *)buf, 1, (size_t) size, (FILE *)fd)); +istream_read(thandle_t fd, tdata_t buf, tsize_t size) { + istream *in = (istream *)fd; + in->read((char *)buf, size); + return in->gcount(); } static tsize_t -stdio_write(thandle_t fd, tdata_t buf, tsize_t size) { - return ((tsize_t)fwrite((void *)buf, 1, (size_t) size, (FILE *)fd)); +ostream_write(thandle_t fd, tdata_t buf, tsize_t size) { + ostream *out = (ostream *)fd; + out->write((char *)buf, size); + return out->fail() ? (tsize_t)0 : size; } static tsize_t -stdio_dont_read(thandle_t, tdata_t, tsize_t) { - // This no-op variant of stdio_read() is passed in when we open the +ostream_dont_read(thandle_t, tdata_t, tsize_t) { + // This no-op variant of istream_read() is passed in when we open the // file for writing only. Shouldn't mix reads and writes. return 0; } static tsize_t -stdio_dont_write(thandle_t, tdata_t, tsize_t) { - // This no-op variant of stdio_write() is passed in when we open the +istream_dont_write(thandle_t, tdata_t, tsize_t) { + // This no-op variant of ostream_write() is passed in when we open the // file for reading only. Shouldn't mix reads and writes. return 0; } static toff_t -stdio_seek(thandle_t fd, off_t off, int whence) { - fseek((FILE *)fd, (long)off, whence); - return (toff_t)ftell((FILE *)fd); +istream_seek(thandle_t fd, off_t off, int whence) { + istream *in = (istream *)fd; + + ios::seek_dir dir; + switch (whence) { + case SEEK_SET: + dir = ios::beg; + break; + + case SEEK_END: + dir = ios::end; + break; + + case SEEK_CUR: + dir = ios::cur; + break; + + default: + return in->tellg(); + } + + in->seekg(off, dir); + return in->tellg(); +} + +static toff_t +ostream_seek(thandle_t fd, off_t off, int whence) { + ostream *out = (ostream *)fd; + + ios::seek_dir dir; + switch (whence) { + case SEEK_SET: + dir = ios::beg; + break; + + case SEEK_END: + dir = ios::end; + break; + + case SEEK_CUR: + dir = ios::cur; + break; + + default: + return out->tellp(); + } + + out->seekp(off, dir); + return out->tellp(); } static int -stdio_dont_close(thandle_t) { +iostream_dont_close(thandle_t) { // We don't actually close the file; we'll leave that to PNMReader. return true; } static toff_t -stdio_size(thandle_t fd) { - fseek((FILE *)fd, 0, SEEK_END); - return (toff_t)ftell((FILE *)fd); +istream_size(thandle_t fd) { + istream *in = (istream *)fd; + in->seekg(0, ios::end); + return in->tellg(); +} + +static toff_t +ostream_size(thandle_t fd) { + ostream *out = (ostream *)fd; + out->seekp(0, ios::end); + return out->tellp(); } static int -stdio_map(thandle_t, tdata_t*, toff_t*) { +iostream_map(thandle_t, tdata_t*, toff_t*) { return (0); } static void -stdio_unmap(thandle_t, tdata_t, toff_t) { +iostream_unmap(thandle_t, tdata_t, toff_t) { } TypeHandle PNMFileTypeTIFF::_type_handle; @@ -158,11 +216,11 @@ get_name() const { // Function: PNMFileTypeTIFF::get_num_extensions // Access: Public, Virtual // Description: Returns the number of different possible filename -// extensions_TIFF associated with this particular file type. +// extensions associated with this particular file type. //////////////////////////////////////////////////////////////////// int PNMFileTypeTIFF:: get_num_extensions() const { - return num_extensions_TIFF; + return num_extensions_tiff; } //////////////////////////////////////////////////////////////////// @@ -174,8 +232,8 @@ get_num_extensions() const { //////////////////////////////////////////////////////////////////// string PNMFileTypeTIFF:: get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_TIFF, string()); - return extensions_TIFF[n]; + nassertr(n >= 0 && n < num_extensions_tiff, string()); + return extensions_tiff[n]; } //////////////////////////////////////////////////////////////////// @@ -225,7 +283,7 @@ matches_magic_number(const string &magic_number) const { // from this file type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMReader *PNMFileTypeTIFF:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { +make_reader(istream *file, bool owns_file, const string &magic_number) { init_pnm(); return new Reader(this, file, owns_file, magic_number); } @@ -238,7 +296,7 @@ make_reader(FILE *file, bool owns_file, const string &magic_number) { // files of this type is not supported, returns NULL. //////////////////////////////////////////////////////////////////// PNMWriter *PNMFileTypeTIFF:: -make_writer(FILE *file, bool owns_file) { +make_writer(ostream *file, bool owns_file) { init_pnm(); return new Writer(this, file, owns_file); } @@ -250,7 +308,7 @@ make_writer(FILE *file, bool owns_file) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeTIFF::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : +Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) : PNMReader(type, file, owns_file) { bool grayscale; @@ -264,18 +322,25 @@ Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : for (string::reverse_iterator mi = magic_number.rbegin(); mi != magic_number.rend(); mi++) { - ungetc(*mi, _file); + _file->putback(*mi); + } + if (_file->fail()) { + pnmimage_tiff_cat.error() + << "Unable to put back magic number.\n"; + _is_valid = false; } - tif = TIFFClientOpen("TIFF file", "r", - (thandle_t) _file, - stdio_read, stdio_dont_write, - (TIFFSeekProc)stdio_seek, - stdio_dont_close, stdio_size, - stdio_map, stdio_unmap); + if (_is_valid) { + tif = TIFFClientOpen("TIFF file", "r", + (thandle_t) _file, + istream_read, istream_dont_write, + (TIFFSeekProc)istream_seek, + iostream_dont_close, istream_size, + iostream_map, iostream_unmap); - if ( tif == NULL ) { - _is_valid = false; + if ( tif == NULL ) { + _is_valid = false; + } } if (_is_valid) { @@ -551,7 +616,7 @@ read_row(xel *row_data, xelval *alpha_data) { // Description: //////////////////////////////////////////////////////////////////// PNMFileTypeTIFF::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : +Writer(PNMFileType *type, ostream *file, bool owns_file) : PNMWriter(type, file, owns_file) { } @@ -645,10 +710,10 @@ write_data(xel *array, xelval *alpha) { /* Open output file. */ tif = TIFFClientOpen("TIFF file", "w", (thandle_t) _file, - stdio_dont_read, stdio_write, - (TIFFSeekProc)stdio_seek, - stdio_dont_close, stdio_size, - stdio_map, stdio_unmap); + ostream_dont_read, ostream_write, + (TIFFSeekProc)ostream_seek, + iostream_dont_close, ostream_size, + iostream_map, iostream_unmap); if ( tif == NULL ) { return false; } diff --git a/panda/src/pnmimagetypes/pnmFileTypeTIFF.h b/panda/src/pnmimagetypes/pnmFileTypeTIFF.h index 0b3cf255f2..172934cc97 100644 --- a/panda/src/pnmimagetypes/pnmFileTypeTIFF.h +++ b/panda/src/pnmimagetypes/pnmFileTypeTIFF.h @@ -19,11 +19,11 @@ #ifndef PNMFILETYPETIFF_H #define PNMFILETYPETIFF_H -#include +#include "pandabase.h" -#include -#include -#include +#include "pnmFileType.h" +#include "pnmReader.h" +#include "pnmWriter.h" #define TIFF_COLORMAP_MAXCOLORS 1024 @@ -44,14 +44,14 @@ public: virtual bool has_magic_number() const; virtual bool matches_magic_number(const string &magic_number) const; - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, + virtual PNMReader *make_reader(istream *file, bool owns_file = true, const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); + virtual PNMWriter *make_writer(ostream *file, bool owns_file = true); public: class Reader : public PNMReader { public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); + Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number); virtual ~Reader(); virtual bool supports_read_row() const; @@ -68,7 +68,7 @@ public: class Writer : public PNMWriter { public: - Writer(PNMFileType *type, FILE *file, bool owns_file); + Writer(PNMFileType *type, ostream *file, bool owns_file); virtual int write_data(xel *array, xelval *alpha); }; diff --git a/panda/src/pnmimagetypes/pnmFileTypeYUV.cxx b/panda/src/pnmimagetypes/pnmFileTypeYUV.cxx deleted file mode 100644 index 43139dd1ef..0000000000 --- a/panda/src/pnmimagetypes/pnmFileTypeYUV.cxx +++ /dev/null @@ -1,428 +0,0 @@ -// Filename: pnmFileTypeYUV.cxx -// Created by: drose (19Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - - -// Much code in this file is borrowed from Netpbm, specifically yuvtoppm.c -// and ppmtoyuv.c. - -/* yuvtoppm.c - convert Abekas YUV bytes into a portable pixmap -** -** by Marc Boucher -** Internet: marc@PostImage.cxxOM -** -** Based on Example Conversion Program, A60/A64 Digital Video Interface -** Manual, page 69 -** -** Uses integer arithmetic rather than floating point for better performance -** -** Copyright (C) 1991 by DHD PostImage Inc. -** Copyright (C) 1987 by Abekas Video Systems Inc. -** Copyright (C) 1991 by Jef Poskanzer. -** -** Permission to use, copy, modify, and distribute this software and its -** documentation for any purpose and without fee is hereby granted, provided -** that the above copyright notice appear in all copies and that both that -** copyright notice and this permission notice appear in supporting -** documentation. This software is provided "as is" without express or -** implied warranty. -*/ - -/* ppmtoyuv.c - convert a portable pixmap into an Abekas YUV file -** -** by Marc Boucher -** Internet: marc@PostImage.cxxOM -** -** Based on Example Conversion Program, A60/A64 Digital Video Interface -** Manual, page 69. -** -** Copyright (C) 1991 by DHD PostImage Inc. -** Copyright (C) 1987 by Abekas Video Systems Inc. -** -** Permission to use, copy, modify, and distribute this software and its -** documentation for any purpose and without fee is hereby granted, provided -** that the above copyright notice appear in all copies and that both that -** copyright notice and this permission notice appear in supporting -** documentation. This software is provided "as is" without express or -** implied warranty. -*/ - -#include "pnmFileTypeYUV.h" -#include "config_pnmimagetypes.h" - -#include -#include - -/* x must be signed for the following to work correctly */ -#define limit(x) (xelval)(((x>0xffffff)?0xff0000:((x<=0xffff)?0:x&0xff0000))>>16) - -static const char * const extensions_YUV[] = { - "yuv" -}; -static const int num_extensions_YUV = sizeof(extensions_YUV) / sizeof(const char *); - -TypeHandle PNMFileTypeYUV::_type_handle; - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeYUV:: -PNMFileTypeYUV() { -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::get_name -// Access: Public, Virtual -// Description: Returns a few words describing the file type. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeYUV:: -get_name() const { - return "Abekas YUV"; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::get_num_extensions -// Access: Public, Virtual -// Description: Returns the number of different possible filename -// extensions_YUV associated with this particular file type. -//////////////////////////////////////////////////////////////////// -int PNMFileTypeYUV:: -get_num_extensions() const { - return num_extensions_YUV; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::get_extension -// Access: Public, Virtual -// Description: Returns the nth possible filename extension -// associated with this particular file type, without a -// leading dot. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeYUV:: -get_extension(int n) const { - nassertr(n >= 0 && n < num_extensions_YUV, string()); - return extensions_YUV[n]; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::get_suggested_extension -// Access: Public, Virtual -// Description: Returns a suitable filename extension (without a -// leading dot) to suggest for files of this type, or -// empty string if no suggestions are available. -//////////////////////////////////////////////////////////////////// -string PNMFileTypeYUV:: -get_suggested_extension() const { - return "yuv"; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::make_reader -// Access: Public, Virtual -// Description: Allocates and returns a new PNMReader suitable for -// reading from this file type, if possible. If reading -// from this file type is not supported, returns NULL. -//////////////////////////////////////////////////////////////////// -PNMReader *PNMFileTypeYUV:: -make_reader(FILE *file, bool owns_file, const string &magic_number) { - init_pnm(); - return new Reader(this, file, owns_file, magic_number); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::make_writer -// Access: Public, Virtual -// Description: Allocates and returns a new PNMWriter suitable for -// reading from this file type, if possible. If writing -// files of this type is not supported, returns NULL. -//////////////////////////////////////////////////////////////////// -PNMWriter *PNMFileTypeYUV:: -make_writer(FILE *file, bool owns_file) { - init_pnm(); - return new Writer(this, file, owns_file); -} - - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Reader::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeYUV::Reader:: -Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number) : - PNMReader(type, file, owns_file) -{ - yuvbuf = NULL; - - // Hope we can ungetc() more than one character. - for (string::reverse_iterator mi = magic_number.rbegin(); - mi != magic_number.rend(); - mi++) { - ungetc(*mi, _file); - } - - _x_size = yuv_xsize; - _y_size = yuv_ysize; - _num_channels = 3; - - if (_x_size <= 0 || _y_size <= 0) { - _is_valid = false; - return; - } - - nassertv(255 <= PGM_MAXMAXVAL); - - yuvbuf = (unsigned char *) pm_allocrow(_x_size, 2); - - _maxval = 255; - - if (pnmimage_yuv_cat.is_debug()) { - pnmimage_yuv_cat.debug() - << "Reading YUV " << *this << "\n"; - } -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Reader::Destructor -// Access: Public, Virtual -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeYUV::Reader:: -~Reader() { - if (yuvbuf!=NULL) { - pm_freerow((char *)yuvbuf); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Reader::supports_read_row -// Access: Public, Virtual -// Description: Returns true if this particular PNMReader supports a -// streaming interface to reading the data: that is, it -// is capable of returning the data one row at a time, -// via repeated calls to read_row(). Returns false if -// the only way to read from this file is all at once, -// via read_data(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeYUV::Reader:: -supports_read_row() const { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Reader::read_row -// Access: Public, Virtual -// Description: If supports_read_row(), above, returns true, this -// function may be called repeatedly to read the image, -// one horizontal row at a time, beginning from the top. -// Returns true if the row is successfully read, false -// if there is an error or end of file. -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeYUV::Reader:: -read_row(xel *row_data, xelval *) { - long y, u, v, y1, r, g, b; - unsigned char *yuvptr; - int col; - - if (fread(yuvbuf, _x_size * 2, 1, _file) != 1) { - // Short file--perhaps it's just a field instead of a full frame. - // Since the YUV format does not include a length designation, we'll - // have to assume this is not a problem and just truncate here. - return false; - } - - yuvptr = yuvbuf; - for (col = 0; col < _x_size; col += 2) { - u = (int)yuvptr[0] - 128; - y = (int)yuvptr[1] - 16; - if (y < 0) y = 0; - - v = (int)yuvptr[2] - 128; - y1 = (int)yuvptr[3] - 16; - if (y1 < 0) y1 = 0; - - r = 104635 * v; - g = -25690 * u + -53294 * v; - b = 132278 * u; - - y*=76310; y1*=76310; - - PPM_ASSIGN(row_data[col], limit(r+y), limit(g+y), limit(b+y)); - PPM_ASSIGN(row_data[col+1], limit(r+y1), limit(g+y1), limit(b+y1)); - - yuvptr += 4; - } - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Writer::Constructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeYUV::Writer:: -Writer(PNMFileType *type, FILE *file, bool owns_file) : - PNMWriter(type, file, owns_file) -{ - yuvbuf = NULL; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Writer::Destructor -// Access: Public -// Description: -//////////////////////////////////////////////////////////////////// -PNMFileTypeYUV::Writer:: -~Writer() { - if (yuvbuf!=NULL) { - pm_freerow((char *)yuvbuf); - } -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Writer::supports_write_row -// Access: Public, Virtual -// Description: Returns true if this particular PNMWriter supports a -// streaming interface to writing the data: that is, it -// is capable of writing the image one row at a time, -// via repeated calls to write_row(). Returns false if -// the only way to write from this file is all at once, -// via write_data(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeYUV::Writer:: -supports_write_row() const { - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Writer::write_header -// Access: Public, Virtual -// Description: If supports_write_row(), above, returns true, this -// function may be called to write out the image header -// in preparation to writing out the image data one row -// at a time. Returns true if the header is -// successfully written, false if there is an error. -// -// It is the user's responsibility to fill in the header -// data via calls to set_x_size(), set_num_channels(), -// etc., or copy_header_from(), before calling -// write_header(). -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeYUV::Writer:: -write_header() { - if (yuvbuf!=NULL) { - pm_freerow((char *)yuvbuf); - } - - yuvbuf = (unsigned char *) pm_allocrow( _x_size, 2 ); - - return true; -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::Writer::write_row -// Access: Public, Virtual -// Description: If supports_write_row(), above, returns true, this -// function may be called repeatedly to write the image, -// one horizontal row at a time, beginning from the top. -// Returns true if the row is successfully written, -// false if there is an error. -// -// You must first call write_header() before writing the -// individual rows. It is also important to delete the -// PNMWriter class after successfully writing the last -// row. Failing to do this may result in some data not -// getting flushed! -//////////////////////////////////////////////////////////////////// -bool PNMFileTypeYUV::Writer:: -write_row(xel *row_data, xelval *) { - int col; - unsigned long y1, y2=0, u=0, v=0, u0=0, u1, u2, v0=0, v1, v2; - static const int max_byte = 255; - - unsigned char *yuvptr; - - for (col = 0, yuvptr=yuvbuf; col < _x_size; col += 2) { - pixval r, g, b; - - /* first pixel gives Y and 0.5 of chroma */ - r = (pixval)(max_byte * PPM_GETR(row_data[col])/_maxval); - g = (pixval)(max_byte * PPM_GETG(row_data[col])/_maxval); - b = (pixval)(max_byte * PPM_GETB(row_data[col])/_maxval); - - y1 = 16829 * r + 33039 * g + 6416 * b + (0xffff & y2); - u1 = -4853 * r - 9530 * g + 14383 * b; - v1 = 14386 * r - 12046 * g - 2340 * b; - - /* second pixel just yields a Y and 0.25 U, 0.25 V */ - r = (pixval)(max_byte * PPM_GETR(row_data[col])/_maxval); - g = (pixval)(max_byte * PPM_GETG(row_data[col])/_maxval); - b = (pixval)(max_byte * PPM_GETB(row_data[col])/_maxval); - - y2 = 16829 * r + 33039 * g + 6416 * b + (0xffff & y1); - u2 = -2426 * r - 4765 * g + 7191 * b; - v2 = 7193 * r - 6023 * g - 1170 * b; - - /* filter the chroma */ - u = u0 + u1 + u2 + (0xffff & u); - v = v0 + v1 + v2 + (0xffff & v); - - u0 = u2; - v0 = v2; - - *yuvptr++ = (unsigned char)((u >> 16) + 128); - *yuvptr++ = (unsigned char)((y1 >> 16) + 16); - *yuvptr++ = (unsigned char)((v >> 16) + 128); - *yuvptr++ = (unsigned char)((y2 >> 16) + 16); - } - fwrite(yuvbuf, _x_size*2, 1, _file); - - return true; -} - - - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::register_with_read_factory -// Access: Public, Static -// Description: Registers the current object as something that can be -// read from a Bam file. -//////////////////////////////////////////////////////////////////// -void PNMFileTypeYUV:: -register_with_read_factory() { - BamReader::get_factory()-> - register_factory(get_class_type(), make_PNMFileTypeYUV); -} - -//////////////////////////////////////////////////////////////////// -// Function: PNMFileTypeYUV::make_PNMFileTypeYUV -// Access: Protected, Static -// Description: This method is called by the BamReader when an object -// of this type is encountered in a Bam file; it should -// allocate and return a new object with all the data -// read. -// -// In the case of the PNMFileType objects, since these -// objects are all shared, we just pull the object from -// the registry. -//////////////////////////////////////////////////////////////////// -TypedWritable *PNMFileTypeYUV:: -make_PNMFileTypeYUV(const FactoryParams ¶ms) { - return PNMFileTypeRegistry::get_ptr()->get_type_by_handle(get_class_type()); -} diff --git a/panda/src/pnmimagetypes/pnmFileTypeYUV.h b/panda/src/pnmimagetypes/pnmFileTypeYUV.h deleted file mode 100644 index 67b0bd0652..0000000000 --- a/panda/src/pnmimagetypes/pnmFileTypeYUV.h +++ /dev/null @@ -1,100 +0,0 @@ -// Filename: pnmFileTypeYUV.h -// Created by: drose (17Jun00) -// -//////////////////////////////////////////////////////////////////// -// -// PANDA 3D SOFTWARE -// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved -// -// All use of this software is subject to the terms of the Panda 3d -// Software license. You should have received a copy of this license -// along with this source code; you will also find a current copy of -// the license at http://www.panda3d.org/license.txt . -// -// To contact the maintainers of this program write to -// panda3d@yahoogroups.com . -// -//////////////////////////////////////////////////////////////////// - -#ifndef PNMFILETYPEYUV_H -#define PNMFILETYPEYUV_H - -#include - -#include -#include -#include - -//////////////////////////////////////////////////////////////////// -// Class : PNMFileTypeYUV -// Description : For reading and writing Abekas YUV files. -//////////////////////////////////////////////////////////////////// -class EXPCL_PANDA PNMFileTypeYUV : public PNMFileType { -public: - PNMFileTypeYUV(); - - virtual string get_name() const; - - virtual int get_num_extensions() const; - virtual string get_extension(int n) const; - virtual string get_suggested_extension() const; - - virtual PNMReader *make_reader(FILE *file, bool owns_file = true, - const string &magic_number = string()); - virtual PNMWriter *make_writer(FILE *file, bool owns_file = true); - -public: - class Reader : public PNMReader { - public: - Reader(PNMFileType *type, FILE *file, bool owns_file, string magic_number); - virtual ~Reader(); - - virtual bool supports_read_row() const; - virtual bool read_row(xel *array, xelval *alpha); - - private: - unsigned char *yuvbuf; - }; - - class Writer : public PNMWriter { - public: - Writer(PNMFileType *type, FILE *file, bool owns_file); - virtual ~Writer(); - - virtual bool supports_write_row() const; - virtual bool write_header(); - virtual bool write_row(xel *array, xelval *alpha); - - private: - unsigned char *yuvbuf; - }; - - - // The TypedWritable interface follows. -public: - static void register_with_read_factory(); - -protected: - static TypedWritable *make_PNMFileTypeYUV(const FactoryParams ¶ms); - -public: - static TypeHandle get_class_type() { - return _type_handle; - } - static void init_type() { - PNMFileType::init_type(); - register_type(_type_handle, "PNMFileTypeYUV", - PNMFileType::get_class_type()); - } - virtual TypeHandle get_type() const { - return get_class_type(); - } - virtual TypeHandle force_init_type() {init_type(); return get_class_type();} - -private: - static TypeHandle _type_handle; -}; - -#endif - - diff --git a/panda/src/pnmimagetypes/pnmimagetypes_composite1.cxx b/panda/src/pnmimagetypes/pnmimagetypes_composite1.cxx index 4d03234b41..ade632ae04 100644 --- a/panda/src/pnmimagetypes/pnmimagetypes_composite1.cxx +++ b/panda/src/pnmimagetypes/pnmimagetypes_composite1.cxx @@ -5,6 +5,5 @@ #include "pnmFileTypeBMPWriter.cxx" #include "pnmFileTypeIMG.cxx" #include "pnmFileTypeBMP.cxx" -#include "pnmFileTypeRadiance.cxx" diff --git a/panda/src/pnmimagetypes/pnmimagetypes_composite2.cxx b/panda/src/pnmimagetypes/pnmimagetypes_composite2.cxx index 6f81166721..1126e6f060 100644 --- a/panda/src/pnmimagetypes/pnmimagetypes_composite2.cxx +++ b/panda/src/pnmimagetypes/pnmimagetypes_composite2.cxx @@ -4,4 +4,3 @@ #include "pnmFileTypeSGIWriter.cxx" #include "pnmFileTypeSoftImage.cxx" #include "pnmFileTypeTGA.cxx" -#include "pnmFileTypeYUV.cxx" diff --git a/panda/src/pnmimagetypes/resolu.c b/panda/src/pnmimagetypes/resolu.c deleted file mode 100644 index 42b91a751a..0000000000 --- a/panda/src/pnmimagetypes/resolu.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Filename: resolu.c - * Created by: - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * PANDA 3D SOFTWARE - * Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved - * - * All use of this software is subject to the terms of the Panda 3d - * Software license. You should have received a copy of this license - * along with this source code; you will also find a current copy of - * the license at http://www.panda3d.org/license.txt . - * - * To contact the maintainers of this program write to - * panda3d@yahoogroups.com . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Read and write image resolutions. - */ - -#include -#include - -#include "resolu.h" - - -char resolu_buf[RESOLU_BUFLEN]; /* resolution line buffer */ - -int str2resolu(register RESOLU *, char *); -char *resolu2str(char *, register RESOLU *); - -void -fputresolu(int ord, int sl, int ns, FILE *fp) /* put out picture dimensions */ -{ - RESOLU rs; - - if ((rs.orient = ord) & YMAJOR) { - rs.xr = sl; - rs.yr = ns; - } else { - rs.xr = ns; - rs.yr = sl; - } - fputsresolu(&rs, fp); -} - - -int -fgetresolu(int *sl, int *ns, FILE *fp) /* get picture dimensions */ -{ - RESOLU rs; - - if (!fgetsresolu(&rs, fp)) - return(-1); - if (rs.orient & YMAJOR) { - *sl = rs.xr; - *ns = rs.yr; - } else { - *sl = rs.yr; - *ns = rs.xr; - } - return(rs.orient); -} - - -char * -resolu2str(char *buf, register RESOLU *rp) /* convert resolution struct to line */ -{ - if (rp->orient&YMAJOR) - sprintf(buf, "%cY %d %cX %d\n", - rp->orient&YDECR ? '-' : '+', rp->yr, - rp->orient&XDECR ? '-' : '+', rp->xr); - else - sprintf(buf, "%cX %d %cY %d\n", - rp->orient&XDECR ? '-' : '+', rp->xr, - rp->orient&YDECR ? '-' : '+', rp->yr); - return(buf); -} - - -int str2resolu(register RESOLU *rp, char *buf) /* convert resolution line to struct */ -{ - register char *xndx, *yndx; - register char *cp; - - if (buf == NULL) - return(0); - xndx = yndx = NULL; - for (cp = buf; *cp; cp++) - if (*cp == 'X') - xndx = cp; - else if (*cp == 'Y') - yndx = cp; - if (xndx == NULL || yndx == NULL) - return(0); - rp->orient = 0; - if (xndx > yndx) rp->orient |= YMAJOR; - if (xndx[-1] == '-') rp->orient |= XDECR; - if (yndx[-1] == '-') rp->orient |= YDECR; - if ((rp->xr = atoi(xndx+1)) <= 0) - return(0); - if ((rp->yr = atoi(yndx+1)) <= 0) - return(0); - return(1); -} diff --git a/panda/src/pnmimagetypes/resolu.h b/panda/src/pnmimagetypes/resolu.h deleted file mode 100644 index a39a634452..0000000000 --- a/panda/src/pnmimagetypes/resolu.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Filename: resolu.h - * Created by: - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * - * PANDA 3D SOFTWARE - * Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved - * - * All use of this software is subject to the terms of the Panda 3d - * Software license. You should have received a copy of this license - * along with this source code; you will also find a current copy of - * the license at http://www.panda3d.org/license.txt . - * - * To contact the maintainers of this program write to - * panda3d@yahoogroups.com . - * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* SCCSid "@(#)resolu.h 2.2 6/4/93 LBL" */ - -/* - * Definitions for resolution line in image file. - * - * True image orientation is defined by an xy coordinate system - * whose origin is at the lower left corner of the image, with - * x increasing to the right and y increasing in the upward direction. - * This true orientation is independent of how the pixels are actually - * ordered in the file, which is indicated by the resolution line. - * This line is of the form "{+-}{XY} xyres {+-}{YX} yxres\n". - * A typical line for a 1024x600 image might be "-Y 600 +X 1024\n", - * indicating that the scanlines are in English text order (PIXSTANDARD). - */ - - /* flags for scanline ordering */ -#define XDECR 1 -#define YDECR 2 -#define YMAJOR 4 - - /* standard scanline ordering */ -#define PIXSTANDARD (YMAJOR|YDECR) -#define PIXSTDFMT "-Y %d +X %d\n" - - /* structure for image dimensions */ -typedef struct { - int orient; /* orientation (from flags above) */ - int xr, yr; /* x and y resolution */ -} RESOLU; - - /* macros to get scanline length and number */ -#define scanlen(rs) ((rs)->or & YMAJOR ? (rs)->xr : (rs)->yr) -#define numscans(rs) ((rs)->or & YMAJOR ? (rs)->yr : (rs)->xr) - - /* resolution string buffer and its size */ -#define RESOLU_BUFLEN 32 -extern char resolu_buf[RESOLU_BUFLEN]; - - /* macros for reading/writing resolution struct */ -#define fputsresolu(rs,fp) fputs(resolu2str(resolu_buf,rs),fp) -#define fgetsresolu(rs,fp) str2resolu(rs, \ - fgets(resolu_buf,RESOLU_BUFLEN,fp)) - - /* reading/writing of standard ordering */ -#define fprtresolu(sl,ns,fp) fprintf(fp,PIXSTDFMT,ns,sl) -#define fscnresolu(sl,ns,fp) (fscanf(fp,PIXSTDFMT,ns,sl)==2) - -extern char *resolu2str();