26 #define INSANE_SIZE 20000    32 static const char * 
const extensions_img[] = {
    35 static const int num_extensions_img = 
sizeof(extensions_img) / 
sizeof(
const char *);
    49 string PNMFileTypeIMG::
    51   return "Raw binary RGB";
    59 get_num_extensions()
 const {
    60   return num_extensions_img;
    67 string PNMFileTypeIMG::
    68 get_extension(
int n)
 const {
    69   nassertr(n >= 0 && n < num_extensions_img, 
string());
    70   return extensions_img[n];
    77 string PNMFileTypeIMG::
    78 get_suggested_extension()
 const {
    88 make_reader(istream *file, 
bool owns_file, 
const string &magic_number) {
    90   return new Reader(
this, file, owns_file, magic_number);
    99 make_writer(ostream *file, 
bool owns_file) {
   101   return new Writer(
this, file, owns_file);
   106 read_ulong(istream *file) {
   108   return pm_readbiglong(file, (
long *)&x)==0 ? x : 0;
   111 inline unsigned short   112 read_ushort_IMG(istream *file) {
   114   return pm_readbigshort(file, (
short *)&x)==0 ? x : 0;
   118 read_uchar_IMG(istream *file) {
   121   return (x!=EOF) ? (
unsigned char)x : 0;
   125 write_ulong(ostream *file, 
unsigned long x) {
   126   pm_writebiglong(file, (
long)x);
   130 write_ushort_IMG(ostream *file, 
unsigned long x) {
   131   pm_writebigshort(file, (
short)(
long)x);
   135 write_uchar_IMG(ostream *file, 
unsigned char x) {
   142 PNMFileTypeIMG::Reader::
   143 Reader(
PNMFileType *type, istream *file, 
bool owns_file, 
string magic_number) :
   146   if (img_header_type == IHT_long) {
   147     if (!read_magic_number(_file, magic_number, 8)) {
   150       if (pnmimage_img_cat.is_debug()) {
   151         pnmimage_img_cat.debug()
   152           << 
"IMG image file appears to be empty.\n";
   159       ((
unsigned char)magic_number[0] << 24) |
   160       ((
unsigned char)magic_number[1] << 16) |
   161       ((
unsigned char)magic_number[2] << 8) |
   162       ((
unsigned char)magic_number[3]);
   165       ((
unsigned char)magic_number[4] << 24) |
   166       ((
unsigned char)magic_number[5] << 16) |
   167       ((
unsigned char)magic_number[6] << 8) |
   168       ((
unsigned char)magic_number[7]);
   170   } 
else if (img_header_type == IHT_short) {
   171     if (!read_magic_number(_file, magic_number, 4)) {
   172       if (pnmimage_img_cat.is_debug()) {
   173         pnmimage_img_cat.debug()
   174           << 
"IMG image file appears to be empty.\n";
   181       ((
unsigned char)magic_number[0] << 8) |
   182       ((
unsigned char)magic_number[1]);
   185       ((
unsigned char)magic_number[2] << 8) |
   186       ((
unsigned char)magic_number[3]);
   189     _x_size = img_size[0];
   190     _y_size = img_size[1];
   193   if (_x_size == 0 || _y_size == 0 ||
   194       _x_size > INSANE_SIZE || _y_size > INSANE_SIZE) {
   196     if (img_header_type == IHT_none) {
   197       pnmimage_img_cat.error()
   198         << 
"Must specify img-xsize and img-ysize to load headerless raw files.\n";
   200       pnmimage_img_cat.debug()
   201         << 
"IMG file does not have a valid xsize,ysize header.\n";
   209   if (pnmimage_img_cat.is_debug()) {
   210     pnmimage_img_cat.debug()
   211       << 
"Reading IMG " << *
this << 
"\n";
   221 bool PNMFileTypeIMG::Reader::
   222 supports_read_row()
 const {
   232 bool PNMFileTypeIMG::Reader::
   233 read_row(
xel *row_data, xelval *, 
int x_size, 
int) {
   235   xelval red, grn, blu;
   236   for (x = 0; x < x_size; x++) {
   237     red = read_uchar_IMG(_file);
   238     grn = read_uchar_IMG(_file);
   239     blu = read_uchar_IMG(_file);
   241     PPM_ASSIGN(row_data[x], red, grn, blu);
   250 PNMFileTypeIMG::Writer::
   251 Writer(
PNMFileType *type, ostream *file, 
bool owns_file) :
   262 bool PNMFileTypeIMG::Writer::
   263 supports_write_row()
 const {
   277 bool PNMFileTypeIMG::Writer::
   279   if (img_header_type == IHT_long) {
   280     write_ulong(_file, _x_size);
   281     write_ulong(_file, _y_size);
   282   } 
else if (img_header_type == IHT_short) {
   283     write_ushort_IMG(_file, _x_size);
   284     write_ushort_IMG(_file, _y_size);
   300 bool PNMFileTypeIMG::Writer::
   301 write_row(
xel *row_data, xelval *) {
   303   for (x = 0; x < _x_size; x++) {
   304     write_uchar_IMG(_file, (
unsigned char)(255*PPM_GETR(row_data[x])/_maxval));
   305     write_uchar_IMG(_file, (
unsigned char)(255*PPM_GETG(row_data[x])/_maxval));
   306     write_uchar_IMG(_file, (
unsigned char)(255*PPM_GETB(row_data[x])/_maxval));
   317 void PNMFileTypeIMG::
   318 register_with_read_factory() {
   320     register_factory(get_class_type(), make_PNMFileTypeIMG);
 PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
Base class for objects that can be written to and read from Bam files.
 
This is the base class of a family of classes that represent particular image file types that PNMImag...
 
static PNMFileTypeRegistry * get_global_ptr()
Returns a pointer to the global PNMFileTypeRegistry object.
 
An instance of this class is passed to the Factory when requesting it to do its business and construc...
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
PNMFileType * get_type_by_handle(TypeHandle handle) const
Returns the PNMFileType instance stored in the registry for the given TypeHandle, e....
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
This is an abstract base class that defines the interface for reading image files of various types.
 
This is an abstract base class that defines the interface for writing image files of various types.
 
static WritableFactory * get_factory()
Returns the global WritableFactory for generating TypedWritable objects.
 
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
 
TypeHandle is the identifier used to differentiate C++ class types.