00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 #ifndef PNMIMAGE_BASE_H
00020 #define PNMIMAGE_BASE_H
00021 
00022 
00023 
00024 
00025 #include "pandabase.h"
00026 
00027 #include <string>
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 #define PGM_BIGGRAYS
00036 
00037 #ifdef PGM_BIGGRAYS
00038 typedef unsigned short gray;
00039 #define PGM_MAXMAXVAL 65535
00040 #else  // PGM_BIGGRAYS
00041 typedef unsigned char gray;
00042 #define PGM_MAXMAXVAL 255
00043 #endif  // PGM_BIGGRAYS
00044 
00045 #define PNM_MAXMAXVAL PGM_MAXMAXVAL
00046 
00047 struct pixel {
00048   gray r, g, b;
00049 };
00050 
00051 typedef gray pixval;
00052 typedef pixel xel;
00053 typedef gray xelval;
00054 
00055 
00056 
00057 #define PPM_GETR(p) ((p).r)
00058 #define PPM_GETG(p) ((p).g)
00059 #define PPM_GETB(p) ((p).b)
00060 
00061 #define PPM_PUTR(p,red) ((p).r = (red))
00062 #define PPM_PUTG(p,grn) ((p).g = (grn))
00063 #define PPM_PUTB(p,blu) ((p).b = (blu))
00064 
00065 #define PPM_ASSIGN(p,red,grn,blu) { (p).r = (red); (p).g = (grn); (p).b = (blu); }
00066 #define PPM_EQUAL(p,q) ( (p).r == (q).r && (p).g == (q).g && (p).b == (q).b )
00067 #define PNM_ASSIGN1(x,v) PPM_ASSIGN(x,0,0,v)
00068 
00069 #define PPM_DEPTH(newp,p,oldmaxval,newmaxval) \
00070     PPM_ASSIGN( (newp), \
00071         ( (int) PPM_GETR(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval), \
00072         ( (int) PPM_GETG(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval), \
00073         ( (int) PPM_GETB(p) * (newmaxval) + (oldmaxval) / 2 ) / (oldmaxval) )
00074 
00075 
00076 
00077 
00078 EXPCL_PANDA void pm_message(const char *format, ...);
00079 EXPCL_PANDA void pm_error(const char *format, ...);  
00080 
00081 EXPCL_PANDA int pm_maxvaltobits(int maxval);
00082 EXPCL_PANDA int pm_bitstomaxval(int bits);
00083 
00084 EXPCL_PANDA char *pm_allocrow(int cols, int size);
00085 EXPCL_PANDA void pm_freerow(char *itrow);
00086 
00087 EXPCL_PANDA int pm_readbigshort(istream *in, short *sP);
00088 EXPCL_PANDA int pm_writebigshort(ostream *out, short s);
00089 EXPCL_PANDA int pm_readbiglong(istream *in, long *lP);
00090 EXPCL_PANDA int pm_writebiglong(ostream *out, long l);
00091 EXPCL_PANDA int pm_readlittleshort(istream *in, short *sP);
00092 EXPCL_PANDA int pm_writelittleshort(ostream *out, short s);
00093 EXPCL_PANDA int pm_readlittlelong(istream *in, long *lP);
00094 EXPCL_PANDA int pm_writelittlelong(ostream *out, long l);
00095 
00096 
00097 
00098 
00099 static const double lumin_red = 0.299;
00100 static const double lumin_grn = 0.587;
00101 static const double lumin_blu = 0.114;
00102 
00103 
00104 #endif