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