mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-01 01:07:51 -04:00
integrate pfm files more tightly with other image file types
This commit is contained in:
parent
36f909b2bf
commit
c64a59d62e
@ -26,6 +26,7 @@
|
|||||||
multitexReducer.I multitexReducer.h multitexReducer.cxx \
|
multitexReducer.I multitexReducer.h multitexReducer.cxx \
|
||||||
nodeVertexTransform.I nodeVertexTransform.h \
|
nodeVertexTransform.I nodeVertexTransform.h \
|
||||||
pfmFile.I pfmFile.h \
|
pfmFile.I pfmFile.h \
|
||||||
|
pnmFileTypePfm.h \
|
||||||
rigidBodyCombiner.I rigidBodyCombiner.h
|
rigidBodyCombiner.I rigidBodyCombiner.h
|
||||||
|
|
||||||
#define INCLUDED_SOURCES \
|
#define INCLUDED_SOURCES \
|
||||||
@ -41,6 +42,7 @@
|
|||||||
heightfieldTesselator.cxx \
|
heightfieldTesselator.cxx \
|
||||||
nodeVertexTransform.cxx \
|
nodeVertexTransform.cxx \
|
||||||
pfmFile.cxx \
|
pfmFile.cxx \
|
||||||
|
pnmFileTypePfm.cxx \
|
||||||
pipeOcclusionCullTraverser.cxx \
|
pipeOcclusionCullTraverser.cxx \
|
||||||
lineSegs.cxx \
|
lineSegs.cxx \
|
||||||
rigidBodyCombiner.cxx
|
rigidBodyCombiner.cxx
|
||||||
@ -59,6 +61,7 @@
|
|||||||
multitexReducer.I multitexReducer.h \
|
multitexReducer.I multitexReducer.h \
|
||||||
nodeVertexTransform.I nodeVertexTransform.h \
|
nodeVertexTransform.I nodeVertexTransform.h \
|
||||||
pfmFile.I pfmFile.h \
|
pfmFile.I pfmFile.h \
|
||||||
|
pnmFileTypePfm.h \
|
||||||
rigidBodyCombiner.I rigidBodyCombiner.h
|
rigidBodyCombiner.I rigidBodyCombiner.h
|
||||||
|
|
||||||
#define IGATESCAN all
|
#define IGATESCAN all
|
||||||
|
@ -24,6 +24,8 @@
|
|||||||
#include "nodeVertexTransform.h"
|
#include "nodeVertexTransform.h"
|
||||||
#include "rigidBodyCombiner.h"
|
#include "rigidBodyCombiner.h"
|
||||||
#include "pipeOcclusionCullTraverser.h"
|
#include "pipeOcclusionCullTraverser.h"
|
||||||
|
#include "pnmFileTypePfm.h"
|
||||||
|
#include "pnmFileTypeRegistry.h"
|
||||||
|
|
||||||
#include "dconfig.h"
|
#include "dconfig.h"
|
||||||
|
|
||||||
@ -132,5 +134,10 @@ init_libgrutil() {
|
|||||||
TexturePool *ts = TexturePool::get_global_ptr();
|
TexturePool *ts = TexturePool::get_global_ptr();
|
||||||
ts->register_texture_type(MovieTexture::make_texture, "avi mov mpg mpeg mp4 wmv asf flv nut ogm mkv");
|
ts->register_texture_type(MovieTexture::make_texture, "avi mov mpg mpeg mp4 wmv asf flv nut ogm mkv");
|
||||||
#endif // HAVE_FFMPEG
|
#endif // HAVE_FFMPEG
|
||||||
|
|
||||||
|
PNMFileTypeRegistry *tr = PNMFileTypeRegistry::get_global_ptr();
|
||||||
|
PNMFileTypePfm::init_type();
|
||||||
|
PNMFileTypePfm::register_with_read_factory();
|
||||||
|
tr->register_type(new PNMFileTypePfm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,3 +5,4 @@
|
|||||||
#include "meshDrawer.cxx"
|
#include "meshDrawer.cxx"
|
||||||
#include "meshDrawer2D.cxx"
|
#include "meshDrawer2D.cxx"
|
||||||
#include "pfmFile.cxx"
|
#include "pfmFile.cxx"
|
||||||
|
#include "pnmFileTypePfm.cxx"
|
||||||
|
@ -26,6 +26,9 @@
|
|||||||
#include "geomPoints.h"
|
#include "geomPoints.h"
|
||||||
#include "geomTriangles.h"
|
#include "geomTriangles.h"
|
||||||
#include "geomVertexWriter.h"
|
#include "geomVertexWriter.h"
|
||||||
|
#include "pnmImage.h"
|
||||||
|
#include "pnmWriter.h"
|
||||||
|
#include "string_utils.h"
|
||||||
#include "lens.h"
|
#include "lens.h"
|
||||||
#include "look_at.h"
|
#include "look_at.h"
|
||||||
|
|
||||||
@ -118,6 +121,10 @@ clear(int x_size, int y_size, int num_channels) {
|
|||||||
// Access: Published
|
// Access: Published
|
||||||
// Description: Reads the PFM data from the indicated file, returning
|
// Description: Reads the PFM data from the indicated file, returning
|
||||||
// true on success, false on failure.
|
// true on success, false on failure.
|
||||||
|
//
|
||||||
|
// This can also handle reading a standard image file
|
||||||
|
// supported by PNMImage; it will be quietly converted
|
||||||
|
// to a floating-point type.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool PfmFile::
|
bool PfmFile::
|
||||||
read(const Filename &fullpath) {
|
read(const Filename &fullpath) {
|
||||||
@ -138,7 +145,7 @@ read(const Filename &fullpath) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
istream *in = file->open_read_file(true);
|
istream *in = file->open_read_file(true);
|
||||||
bool success = read(*in);
|
bool success = read(*in, fullpath);
|
||||||
vfs->close_read_file(in);
|
vfs->close_read_file(in);
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
@ -149,22 +156,41 @@ read(const Filename &fullpath) {
|
|||||||
// Access: Published
|
// Access: Published
|
||||||
// Description: Reads the PFM data from the indicated stream,
|
// Description: Reads the PFM data from the indicated stream,
|
||||||
// returning true on success, false on failure.
|
// returning true on success, false on failure.
|
||||||
|
//
|
||||||
|
// This can also handle reading a standard image file
|
||||||
|
// supported by PNMImage; it will be quietly converted
|
||||||
|
// to a floating-point type.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool PfmFile::
|
bool PfmFile::
|
||||||
read(istream &in) {
|
read(istream &in, const Filename &fullpath, const string &magic_number) {
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
string identifier;
|
string identifier = magic_number;
|
||||||
in >> identifier;
|
PNMImageHeader::read_magic_number(&in, identifier, 2);
|
||||||
|
|
||||||
if (identifier == "PF") {
|
if (identifier == "PF") {
|
||||||
_num_channels = 3;
|
_num_channels = 3;
|
||||||
} else if (identifier == "Pf") {
|
} else if (identifier == "Pf") {
|
||||||
_num_channels = 1;
|
_num_channels = 1;
|
||||||
} else {
|
} else {
|
||||||
grutil_cat.error()
|
// Not a PFM file. Maybe it's a more conventional image file that
|
||||||
<< "Not a pfm file.\n";
|
// we can read into a PFM.
|
||||||
return false;
|
PNMImage pnm;
|
||||||
|
PNMReader *reader = pnm.make_reader
|
||||||
|
(&in, false, fullpath, identifier, NULL, false);
|
||||||
|
if (reader == (PNMReader *)NULL) {
|
||||||
|
grutil_cat.error()
|
||||||
|
<< "Not a PFM file or known image file type: " << fullpath << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pnm.read(reader)) {
|
||||||
|
grutil_cat.error()
|
||||||
|
<< "Invalid image file: " << fullpath << "\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return load(pnm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int width, height;
|
int width, height;
|
||||||
@ -172,7 +198,7 @@ read(istream &in) {
|
|||||||
in >> width >> height >> scale;
|
in >> width >> height >> scale;
|
||||||
if (!in) {
|
if (!in) {
|
||||||
grutil_cat.error()
|
grutil_cat.error()
|
||||||
<< "Error parsing pfm header.\n";
|
<< "Error parsing PFM header: " << fullpath << "\n";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,9 +273,21 @@ read(istream &in) {
|
|||||||
// Access: Published
|
// Access: Published
|
||||||
// Description: Writes the PFM data to the indicated file, returning
|
// Description: Writes the PFM data to the indicated file, returning
|
||||||
// true on success, false on failure.
|
// true on success, false on failure.
|
||||||
|
//
|
||||||
|
// This can also handle writing a standard image file
|
||||||
|
// supported by PNMImage, if the filename extension is
|
||||||
|
// some image type's extension fother than "pfm"; it
|
||||||
|
// will be quietly converted to the appropriate integer
|
||||||
|
// type.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool PfmFile::
|
bool PfmFile::
|
||||||
write(const Filename &fullpath) {
|
write(const Filename &fullpath) {
|
||||||
|
if (!is_valid()) {
|
||||||
|
grutil_cat.error()
|
||||||
|
<< "PFM file is invalid.\n";
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
Filename filename = Filename::binary_filename(fullpath);
|
Filename filename = Filename::binary_filename(fullpath);
|
||||||
pofstream out;
|
pofstream out;
|
||||||
if (!filename.open_write(out)) {
|
if (!filename.open_write(out)) {
|
||||||
@ -258,12 +296,27 @@ write(const Filename &fullpath) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string extension = downcase(fullpath.get_extension());
|
||||||
|
if (extension != "pfm") {
|
||||||
|
// Maybe we're trying to write a different kind of image file.
|
||||||
|
PNMImage pnm;
|
||||||
|
PNMWriter *writer = pnm.make_writer(&out, false, fullpath, NULL);
|
||||||
|
if (writer != (PNMWriter *)NULL) {
|
||||||
|
// Yep.
|
||||||
|
if (store(pnm)) {
|
||||||
|
return pnm.write(writer);
|
||||||
|
}
|
||||||
|
// Couldn't make an image. Carry on directly.
|
||||||
|
delete writer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (grutil_cat.is_debug()) {
|
if (grutil_cat.is_debug()) {
|
||||||
grutil_cat.debug()
|
grutil_cat.debug()
|
||||||
<< "Writing PFM file " << filename << "\n";
|
<< "Writing PFM file " << filename << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
return write(out);
|
return write(out, fullpath);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -273,7 +326,7 @@ write(const Filename &fullpath) {
|
|||||||
// returning true on success, false on failure.
|
// returning true on success, false on failure.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
bool PfmFile::
|
bool PfmFile::
|
||||||
write(ostream &out) {
|
write(ostream &out, const Filename &fullpath) {
|
||||||
nassertr(is_valid(), false);
|
nassertr(is_valid(), false);
|
||||||
|
|
||||||
if (_num_channels == 1) {
|
if (_num_channels == 1) {
|
||||||
@ -310,6 +363,70 @@ write(ostream &out) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PfmFile::load
|
||||||
|
// Access: Published
|
||||||
|
// Description: Fills the PfmFile with the data from the indicated
|
||||||
|
// PNMImage, converted to floating-point values.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool PfmFile::
|
||||||
|
load(const PNMImage &pnmimage) {
|
||||||
|
if (!pnmimage.is_valid()) {
|
||||||
|
clear();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get the number of channels, ignoring alpha.
|
||||||
|
int num_channels;
|
||||||
|
if (pnmimage.get_num_channels() >= 3) {
|
||||||
|
num_channels = 3;
|
||||||
|
} else {
|
||||||
|
num_channels = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear(pnmimage.get_x_size(), pnmimage.get_y_size(), num_channels);
|
||||||
|
if (num_channels == 1) {
|
||||||
|
for (int yi = 0; yi < pnmimage.get_y_size(); ++yi) {
|
||||||
|
for (int xi = 0; xi < pnmimage.get_x_size(); ++xi) {
|
||||||
|
double gray = pnmimage.get_gray(xi, yi);
|
||||||
|
set_point(xi, yi, LVecBase3(gray, gray, gray));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (int yi = 0; yi < pnmimage.get_y_size(); ++yi) {
|
||||||
|
for (int xi = 0; xi < pnmimage.get_x_size(); ++xi) {
|
||||||
|
LRGBColord xel = pnmimage.get_xel(xi, yi);
|
||||||
|
set_point(xi, yi, LVecBase3(xel[0], xel[1], xel[2]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PfmFile::store
|
||||||
|
// Access: Published
|
||||||
|
// Description: Copies the data to the indicated PNMImage, converting
|
||||||
|
// to RGB values.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool PfmFile::
|
||||||
|
store(PNMImage &pnmimage) const {
|
||||||
|
if (!is_valid()) {
|
||||||
|
pnmimage.clear();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pnmimage.clear(get_x_size(), get_y_size(), get_num_channels(), PGM_MAXMAXVAL);
|
||||||
|
for (int yi = 0; yi < get_y_size(); ++yi) {
|
||||||
|
for (int xi = 0; xi < get_x_size(); ++xi) {
|
||||||
|
LPoint3 point = get_point(xi, yi);
|
||||||
|
pnmimage.set_xel(xi, yi, point[0], point[1], point[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: PfmFile::calc_average_point
|
// Function: PfmFile::calc_average_point
|
||||||
// Access: Published
|
// Access: Published
|
||||||
|
@ -39,9 +39,13 @@ PUBLISHED:
|
|||||||
void clear(int x_size, int y_size, int num_channels);
|
void clear(int x_size, int y_size, int num_channels);
|
||||||
|
|
||||||
BLOCKING bool read(const Filename &fullpath);
|
BLOCKING bool read(const Filename &fullpath);
|
||||||
BLOCKING bool read(istream &in);
|
BLOCKING bool read(istream &in, const Filename &fullpath = Filename(),
|
||||||
|
const string &magic_number = string());
|
||||||
BLOCKING bool write(const Filename &fullpath);
|
BLOCKING bool write(const Filename &fullpath);
|
||||||
BLOCKING bool write(ostream &out);
|
BLOCKING bool write(ostream &out, const Filename &fullpath = Filename());
|
||||||
|
|
||||||
|
BLOCKING bool load(const PNMImage &pnmimage);
|
||||||
|
BLOCKING bool store(PNMImage &pnmimage) const;
|
||||||
|
|
||||||
INLINE bool is_valid() const;
|
INLINE bool is_valid() const;
|
||||||
|
|
||||||
|
258
panda/src/grutil/pnmFileTypePfm.cxx
Normal file
258
panda/src/grutil/pnmFileTypePfm.cxx
Normal file
@ -0,0 +1,258 @@
|
|||||||
|
// Filename: pnmFileTypePfm.cxx
|
||||||
|
// Created by: drose (04Apr98)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the revised BSD
|
||||||
|
// license. You should have received a copy of this license along
|
||||||
|
// with this source code in a file named "LICENSE."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#include "pnmFileTypePfm.h"
|
||||||
|
#include "config_grutil.h"
|
||||||
|
|
||||||
|
#include "pnmFileTypeRegistry.h"
|
||||||
|
#include "bamReader.h"
|
||||||
|
|
||||||
|
TypeHandle PNMFileTypePfm::_type_handle;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
PNMFileTypePfm::
|
||||||
|
PNMFileTypePfm() {
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::get_name
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns a few words describing the file type.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string PNMFileTypePfm::
|
||||||
|
get_name() const {
|
||||||
|
return "Portable Float Map";
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::get_num_extensions
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns the number of different possible filename
|
||||||
|
// extensions associated with this particular file type.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int PNMFileTypePfm::
|
||||||
|
get_num_extensions() const {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::get_extension
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns the nth possible filename extension
|
||||||
|
// associated with this particular file type, without a
|
||||||
|
// leading dot.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
string PNMFileTypePfm::
|
||||||
|
get_extension(int n) const {
|
||||||
|
return "pfm";
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::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 PNMFileTypePfm::
|
||||||
|
get_suggested_extension() const {
|
||||||
|
return "pfm";
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::has_magic_number
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Returns true if this particular file type uses a
|
||||||
|
// magic number to identify it, false otherwise.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool PNMFileTypePfm::
|
||||||
|
has_magic_number() const {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::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 PNMFileTypePfm::
|
||||||
|
matches_magic_number(const string &magic_number) const {
|
||||||
|
return (magic_number.size() >= 2) &&
|
||||||
|
magic_number[0] == 'P' &&
|
||||||
|
(magic_number[1] == 'F' || magic_number[1] == 'f');
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::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 *PNMFileTypePfm::
|
||||||
|
make_reader(istream *file, bool owns_file, const string &magic_number) {
|
||||||
|
return new Reader(this, file, owns_file, magic_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::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 *PNMFileTypePfm::
|
||||||
|
make_writer(ostream *file, bool owns_file) {
|
||||||
|
return new Writer(this, file, owns_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::Reader::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
PNMFileTypePfm::Reader::
|
||||||
|
Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number) :
|
||||||
|
PNMReader(type, file, owns_file)
|
||||||
|
{
|
||||||
|
PfmFile pfm;
|
||||||
|
if (!pfm.read(*file, Filename(), magic_number)) {
|
||||||
|
_is_valid = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pfm.store(_image);
|
||||||
|
PNMImageHeader::operator = (_image);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::Reader::read_data
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Reads in an entire image all at once, storing it in
|
||||||
|
// the pre-allocated _x_size * _y_size array and alpha
|
||||||
|
// pointers. (If the image type has no alpha channel,
|
||||||
|
// alpha is ignored.) Returns the number of rows
|
||||||
|
// correctly read.
|
||||||
|
//
|
||||||
|
// Derived classes need not override this if they
|
||||||
|
// instead provide supports_read_row() and read_row(),
|
||||||
|
// below.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int PNMFileTypePfm::Reader::
|
||||||
|
read_data(xel *array, xelval *alpha) {
|
||||||
|
if (!is_valid()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nassertr(_image.get_x_size() == get_x_size() &&
|
||||||
|
_image.get_y_size() == get_y_size(), 0);
|
||||||
|
memcpy(array, _image[0], get_x_size() * get_y_size() * sizeof(xel));
|
||||||
|
nassertr(!has_alpha(), 0);
|
||||||
|
return get_y_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::Writer::Constructor
|
||||||
|
// Access: Public
|
||||||
|
// Description:
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
PNMFileTypePfm::Writer::
|
||||||
|
Writer(PNMFileType *type, ostream *file, bool owns_file) :
|
||||||
|
PNMWriter(type, file, owns_file)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::write_data
|
||||||
|
// Access: Public, Virtual
|
||||||
|
// Description: Writes out an entire image all at once, including the
|
||||||
|
// header, based on the image data stored in the given
|
||||||
|
// _x_size * _y_size array and alpha pointers. (If the
|
||||||
|
// image type has no alpha channel, alpha is ignored.)
|
||||||
|
// Returns the number of rows correctly written.
|
||||||
|
//
|
||||||
|
// 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_data().
|
||||||
|
//
|
||||||
|
// It is important to delete the PNMWriter class after
|
||||||
|
// successfully writing the data. Failing to do this
|
||||||
|
// may result in some data not getting flushed!
|
||||||
|
//
|
||||||
|
// Derived classes need not override this if they
|
||||||
|
// instead provide supports_streaming() and write_row(),
|
||||||
|
// below.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int PNMFileTypePfm::Writer::
|
||||||
|
write_data(xel *array, xelval *alpha) {
|
||||||
|
if (_x_size <= 0 || _y_size <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PNMImage image;
|
||||||
|
image.copy_header_from(*this);
|
||||||
|
nassertr(image.get_x_size() == get_x_size() &&
|
||||||
|
image.get_y_size() == get_y_size(), 0);
|
||||||
|
memcpy(image[0], array, get_x_size() * get_y_size() * sizeof(xel));
|
||||||
|
nassertr(!has_alpha(), 0);
|
||||||
|
|
||||||
|
PfmFile pfm;
|
||||||
|
if (!pfm.load(image)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!pfm.write(*_file)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_y_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::register_with_read_factory
|
||||||
|
// Access: Public, Static
|
||||||
|
// Description: Registers the current object as something that can be
|
||||||
|
// read from a Bam file.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void PNMFileTypePfm::
|
||||||
|
register_with_read_factory() {
|
||||||
|
BamReader::get_factory()->
|
||||||
|
register_factory(get_class_type(), make_PNMFileTypePfm);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: PNMFileTypePfm::make_PNMFileTypePfm
|
||||||
|
// 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 *PNMFileTypePfm::
|
||||||
|
make_PNMFileTypePfm(const FactoryParams ¶ms) {
|
||||||
|
return PNMFileTypeRegistry::get_global_ptr()->get_type_by_handle(get_class_type());
|
||||||
|
}
|
92
panda/src/grutil/pnmFileTypePfm.h
Normal file
92
panda/src/grutil/pnmFileTypePfm.h
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
// Filename: pnmFileTypePfm.h
|
||||||
|
// Created by: drose (17Jun00)
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// PANDA 3D SOFTWARE
|
||||||
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
||||||
|
//
|
||||||
|
// All use of this software is subject to the terms of the revised BSD
|
||||||
|
// license. You should have received a copy of this license along
|
||||||
|
// with this source code in a file named "LICENSE."
|
||||||
|
//
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
#ifndef PNMFILETYPEPFM_H
|
||||||
|
#define PNMFILETYPEPFM_H
|
||||||
|
|
||||||
|
#include "pandabase.h"
|
||||||
|
|
||||||
|
#include "pnmFileType.h"
|
||||||
|
#include "pnmReader.h"
|
||||||
|
#include "pnmWriter.h"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Class : PNMFileTypePfm
|
||||||
|
// Description : For reading and writing PFM files using the basic
|
||||||
|
// PNMImage interface, as if they were basic RGB files.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
class EXPCL_PANDA_GRUTIL PNMFileTypePfm : public PNMFileType {
|
||||||
|
public:
|
||||||
|
PNMFileTypePfm();
|
||||||
|
|
||||||
|
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(istream *file, bool owns_file = true,
|
||||||
|
const string &magic_number = string());
|
||||||
|
virtual PNMWriter *make_writer(ostream *file, bool owns_file = true);
|
||||||
|
|
||||||
|
public:
|
||||||
|
class Reader : public PNMReader {
|
||||||
|
public:
|
||||||
|
Reader(PNMFileType *type, istream *file, bool owns_file, string magic_number);
|
||||||
|
|
||||||
|
virtual int read_data(xel *array, xelval *alpha);
|
||||||
|
|
||||||
|
private:
|
||||||
|
PNMImage _image;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Writer : public PNMWriter {
|
||||||
|
public:
|
||||||
|
Writer(PNMFileType *type, ostream *file, bool owns_file);
|
||||||
|
|
||||||
|
virtual int write_data(xel *array, xelval *alpha);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// The TypedWritable interface follows.
|
||||||
|
public:
|
||||||
|
static void register_with_read_factory();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
static TypedWritable *make_PNMFileTypePfm(const FactoryParams ¶ms);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static TypeHandle get_class_type() {
|
||||||
|
return _type_handle;
|
||||||
|
}
|
||||||
|
static void init_type() {
|
||||||
|
PNMFileType::init_type();
|
||||||
|
register_type(_type_handle, "PNMFileTypePfm",
|
||||||
|
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
|
||||||
|
|
||||||
|
|
@ -2,7 +2,8 @@
|
|||||||
p3imagebase p3progbase
|
p3imagebase p3progbase
|
||||||
|
|
||||||
#define OTHER_LIBS \
|
#define OTHER_LIBS \
|
||||||
p3pipeline:c p3event:c p3pstatclient:c panda:m \
|
p3pipeline:c p3event:c p3pstatclient:c p3grutil:c \
|
||||||
|
panda:m \
|
||||||
p3pandabase:c p3pnmimage:c p3pnmimagetypes:c \
|
p3pandabase:c p3pnmimage:c p3pnmimagetypes:c \
|
||||||
p3mathutil:c p3linmath:c p3putil:c p3express:c \
|
p3mathutil:c p3linmath:c p3putil:c p3express:c \
|
||||||
pandaexpress:m \
|
pandaexpress:m \
|
||||||
|
Loading…
x
Reference in New Issue
Block a user