00001
00002 #ifndef __scanliner_hpp__
00003 #define __scanliner_hpp__
00004
00005 #include <deque>
00006
00007 #include <crbn/basic/vec3.hpp>
00008
00009 class Scanline
00010 {
00011 public:
00012 Scanline( int w, int h ) {
00013 _array = new vec3 [ w ];
00014 _remaining = w;
00015 _height = h;
00016 }
00017 ~Scanline() {
00018 delete [] _array;
00019 _array = 0;
00020 }
00021 int height() { return _height; }
00022 bool filled() { return (_remaining == 0); }
00023
00024 void put( int x, vec3& col ) {
00025 _array[ x ] = col;
00026 --_remaining;
00027 }
00028
00029 vec3* get() {
00030 return _array;
00031 }
00032 private:
00033 vec3* _array;
00034 int _remaining;
00035 int _height;
00036 };
00037
00038 typedef std::deque<Scanline*> scanlineq;
00039
00040 class Scanliner
00041 {
00042 public:
00043
00044 Scanliner( int w, int h ) {
00045 _scanlines.clear();
00046 _scanlines.push_back( new Scanline( w, 0 ) );
00047 _w = w;
00048 _h = h;
00049 }
00050
00051 ~Scanliner() {
00052 for( unsigned i = 0; i < _scanlines.size(); ++i ) {
00053 delete _scanlines[ i ];
00054 }
00055 _scanlines.clear();
00056 }
00057
00058
00059 void put( int x, int y, vec3& col ) {
00060 Scanline* scanline = 0;
00061 if( _scanlines.empty() ) {
00062 scanline = new Scanline( _w, y );
00063 scanline -> put( x, col );
00064 _scanlines.push_back( scanline );
00065 } else {
00066 unsigned decal = y - _scanlines[ 0 ] -> height();
00067 if( decal >= _scanlines.size() ) {
00068 scanline = new Scanline( _w, y );
00069 scanline -> put( x, col );
00070 _scanlines.push_back( scanline );
00071 } else {
00072 _scanlines[ decal ] -> put( x, col );
00073 }
00074 }
00075 }
00076
00077
00078 vec3* get() {
00079 if( _scanlines.empty() )
00080 return 0;
00081 if( !( _scanlines[ 0 ] -> filled()) )
00082 return 0;
00083 return _scanlines[ 0 ] -> get();
00084 }
00085
00086
00087 void clear_first() {
00088 if( !_scanlines.empty() ) {
00089 delete _scanlines[ 0 ];
00090 _scanlines.pop_front();
00091 }
00092 }
00093 private:
00094 int _w, _h;
00095 scanlineq _scanlines;
00096 };
00097
00098 #endif // __scanliner_hpp__