Panda3D
 All Classes Functions Variables Enumerations
pnmimage_base.cxx
00001 // Filename: pnmimage_base.cxx
00002 // Created by:  drose (04Aug02)
00003 //
00004 ////////////////////////////////////////////////////////////////////
00005 //
00006 // PANDA 3D SOFTWARE
00007 // Copyright (c) Carnegie Mellon University.  All rights reserved.
00008 //
00009 // All use of this software is subject to the terms of the revised BSD
00010 // license.  You should have received a copy of this license along
00011 // with this source code in a file named "LICENSE."
00012 //
00013 ////////////////////////////////////////////////////////////////////
00014 
00015 #include "pnmimage_base.h"
00016 #include "streamReader.h"
00017 #include "streamWriter.h"
00018 #include "config_pnmimage.h"
00019 
00020 #include <stdarg.h>
00021 #include <stdio.h>   // for sprintf()
00022 
00023 
00024 ////////////////////////////////////////////////////////////////////
00025 //     Function: pm_message
00026 //  Description: Outputs the given printf-style message to the user
00027 //               and returns.
00028 ////////////////////////////////////////////////////////////////////
00029 void
00030 pm_message(const char *format, ...) {
00031   va_list ap;
00032   va_start(ap, format);
00033 
00034   static const size_t buffer_size = 1024;
00035   char buffer[buffer_size];
00036 #if defined(WIN32_VC) || defined(WIN64_VC)
00037   // Windows doesn't define vsnprintf().  Hope we don't overflow.
00038   vsprintf(buffer, format, ap);
00039 #else
00040   vsnprintf(buffer, buffer_size, format, ap);
00041 #endif
00042   nassertv(strlen(buffer) < buffer_size);
00043 
00044   pnmimage_cat.info() << buffer << "\n";
00045 
00046   va_end(ap);
00047 }
00048 
00049 ////////////////////////////////////////////////////////////////////
00050 //     Function: pm_error
00051 //  Description: Outputs the given printf-style message to the user
00052 //               and terminates messily.  Minimize use of this
00053 //               function.
00054 ////////////////////////////////////////////////////////////////////
00055 void
00056 pm_error(const char *format, ...) {
00057   va_list ap;
00058   va_start(ap, format);
00059 
00060   static const size_t buffer_size = 1024;
00061   char buffer[buffer_size];
00062 #if defined(WIN32_VC) || defined(WIN64_VC)
00063   // Windows doesn't define vsnprintf().  Hope we don't overflow.
00064   vsprintf(buffer, format, ap);
00065 #else
00066   vsnprintf(buffer, buffer_size, format, ap);
00067 #endif
00068   nassertv(strlen(buffer) < buffer_size);
00069 
00070   pnmimage_cat.error() << buffer << "\n";
00071 
00072   va_end(ap);
00073 
00074   // Now we're supposed to exit.  Inconvenient if we were running
00075   // Panda interactively, but that's the way it is.
00076   exit(1);
00077 }
00078 
00079 ////////////////////////////////////////////////////////////////////
00080 //     Function: pm_maxvaltobits
00081 //  Description: Returns the number of bits sufficient to hold the
00082 //               indicated maxval value.
00083 ////////////////////////////////////////////////////////////////////
00084 int
00085 pm_maxvaltobits(int maxval) {
00086   int bits = 1;
00087   while (maxval > pm_bitstomaxval(bits)) {
00088     bits++;
00089     nassertr(bits != 0, 16);
00090   }
00091   return bits;
00092 }
00093 
00094 ////////////////////////////////////////////////////////////////////
00095 //     Function: pm_bitstomaxval
00096 //  Description: Returns the highest maxval that can be represented in
00097 //               the indicated number of bits.
00098 ////////////////////////////////////////////////////////////////////
00099 int
00100 pm_bitstomaxval(int bits) {
00101   return ( 1 << bits ) - 1;
00102 }
00103 
00104 ////////////////////////////////////////////////////////////////////
00105 //     Function: pm_allocrow
00106 //  Description: Allocates a row of cols * size bytes.
00107 ////////////////////////////////////////////////////////////////////
00108 char *
00109 pm_allocrow(int cols, int size) {
00110   return (char *)PANDA_MALLOC_ARRAY(cols * size);
00111 }
00112 
00113 ////////////////////////////////////////////////////////////////////
00114 //     Function: pm_freerow
00115 //  Description: Frees the row previously allocated withm pm_allocrow().
00116 ////////////////////////////////////////////////////////////////////
00117 void
00118 pm_freerow(char *itrow) {
00119   PANDA_FREE_ARRAY(itrow);
00120 }
00121 
00122 
00123 /* Endian I/O.
00124 */
00125 
00126 int
00127 pm_readbigshort(istream *in, short *sP) {
00128   StreamReader reader(in, false);
00129   *sP = reader.get_be_int16();
00130   return (!in->eof() && !in->fail()) ? 0 : -1;
00131 }
00132 
00133 int
00134 pm_writebigshort(ostream *out, short s) {
00135   StreamWriter writer(out, false);
00136   writer.add_be_int16(s);
00137   return (!out->fail()) ? 0 : -1;
00138 }
00139 
00140 int
00141 pm_readbiglong(istream *in, long *lP) {
00142   StreamReader reader(in, false);
00143   *lP = reader.get_be_int32();
00144   return (!in->eof() && !in->fail()) ? 0 : -1;
00145 }
00146 
00147 int
00148 pm_writebiglong(ostream *out, long l) {
00149   StreamWriter writer(out, false);
00150   writer.add_be_int32(l);
00151   return (!out->fail()) ? 0 : -1;
00152 }
00153 
00154 int
00155 pm_readlittleshort(istream *in, short *sP) {
00156   StreamReader reader(in, false);
00157   *sP = reader.get_int16();
00158   return (!in->eof() && !in->fail()) ? 0 : -1;
00159 }
00160 
00161 int
00162 pm_writelittleshort(ostream *out, short s) {
00163   StreamWriter writer(out, false);
00164   writer.add_int16(s);
00165   return (!out->fail()) ? 0 : -1;
00166 }
00167 
00168 int
00169 pm_readlittlelong(istream *in, long *lP) {
00170   StreamReader reader(in, false);
00171   *lP = reader.get_int32();
00172   return (!in->eof() && !in->fail()) ? 0 : -1;
00173 }
00174 
00175 int
00176 pm_writelittlelong(ostream *out, long l) {
00177   StreamWriter writer(out, false);
00178   writer.add_int32(l);
00179   return (!out->fail()) ? 0 : -1;
00180 }
 All Classes Functions Variables Enumerations