Homepage Demos Overview Downloads Tutorials Reference
Credits

RLEGenerator.cc

Go to the documentation of this file.
00001 #include "RLEGenerator.h"
00002 #include "Events/EventRouter.h"
00003 #include "Events/SegmentedColorFilterBankEvent.h"
00004 #include "Wireless/Wireless.h"
00005 #include "Shared/WorldState.h"
00006 
00007 #include "Shared/debuget.h"
00008 
00009 RLEGenerator::RLEGenerator(EventBase::EventGeneratorID_t gid, unsigned int sid, unsigned int mysid)
00010   : FilterBankGenerator("RLEGenerator",gid,sid,EventBase::visRLEEGID,mysid), numRuns(NULL), maxRuns(NULL)
00011 { }
00012 
00013 void
00014 RLEGenerator::processEvent(const EventBase& event) {
00015   FilterBankGenerator::processEvent(event);
00016   if(const SegmentedColorFilterBankEvent * segsrc=dynamic_cast<const SegmentedColorFilterBankEvent *>(&event))
00017     erouter->postEvent(new SegmentedColorFilterBankEvent(this,getGeneratorID(),getSourceID(),*segsrc));
00018   else
00019     erouter->postEvent(new FilterBankEvent(this,getGeneratorID(),getSourceID()));
00020 }
00021 
00022 unsigned int
00023 RLEGenerator::getBinSize() const {
00024   unsigned int used=FilterBankGenerator::getBinSize();
00025   used+=strlen("RLEImage")+LoadSave::stringpad;
00026   used+=sizeof(unsigned int);
00027   if(imageValids[selectedSaveLayer][selectedSaveChannel])
00028     used+=XMIT_BYTES_PER_RUN*numRuns[selectedSaveLayer][selectedSaveChannel];
00029   else
00030     used+=XMIT_BYTES_PER_RUN*maxRuns[selectedSaveLayer];
00031   return used;
00032 }
00033 
00034 /*! this isn't really tested, don't rely on it working without a little debugging... specifically, doesn't set parent or next fields*/
00035 unsigned int
00036 RLEGenerator::LoadBuffer(const char buf[], unsigned int len) {
00037   unsigned int origlen=len;
00038   unsigned int used;
00039   std::string tmp;
00040   if(0==(used=FilterBankGenerator::LoadBuffer(buf,len))) return 0;
00041   len-=used; buf+=used;
00042   if(0==(used=decode(tmp,buf,len))) return 0;
00043   len-=used; buf+=used;
00044   if(tmp!="RLEImage") {
00045     serr->printf("Unhandled image type for RLEGenerator: %s",tmp.c_str());
00046     return 0;
00047   } else {
00048     if(0==(used=decode(numRuns[selectedSaveLayer][selectedSaveChannel],buf,len))) return 0;
00049     len-=used; buf+=used;
00050     if(maxRuns[selectedSaveLayer]<numRuns[selectedSaveLayer][selectedSaveChannel])
00051       return 0;
00052     if(images[selectedSaveLayer][selectedSaveChannel]==NULL)
00053       images[selectedSaveLayer][selectedSaveChannel]=createImageCache(selectedSaveLayer,selectedSaveChannel);
00054     run * runs=reinterpret_cast<run*>(images[selectedSaveLayer][selectedSaveChannel]);
00055     if(runs==NULL)
00056       return 0;
00057     unsigned int y=0;
00058     for(unsigned int i=0; i<numRuns[selectedSaveLayer][selectedSaveChannel]; i++) {
00059       if(0==(used=decode(runs[i].color,buf,len))) return 0;
00060       len-=used; buf+=used;
00061       if(0==(used=decode(runs[i].x,buf,len))) return 0;
00062       len-=used; buf+=used;
00063       if(0==(used=decode(runs[i].width,buf,len))) return 0;
00064       len-=used; buf+=used;
00065       if((unsigned int)(runs[i].x+runs[i].width)>=getWidth(selectedSaveLayer))
00066         y++;
00067       runs[i].y=y;
00068     }
00069     imageValids[selectedSaveLayer][selectedSaveChannel]=true;
00070     return origlen-len; 
00071   }
00072 }
00073 
00074 unsigned int
00075 RLEGenerator::SaveBuffer(char buf[], unsigned int len) const {
00076   unsigned int origlen=len;
00077   unsigned int used;
00078   if(0==(used=FilterBankGenerator::SaveBuffer(buf,len))) return 0;
00079   len-=used; buf+=used;
00080   if(0==(used=encode("RLEImage",buf,len))) return 0;
00081   len-=used; buf+=used;
00082   
00083   run * runs=reinterpret_cast<run*>(getImage(selectedSaveLayer,selectedSaveChannel));
00084   if(runs==NULL)
00085     return 0;
00086   if(0==(used=encode(numRuns[selectedSaveLayer][selectedSaveChannel],buf,len))) return 0;
00087   len-=used; buf+=used;
00088   for(unsigned int i=0; i<numRuns[selectedSaveLayer][selectedSaveChannel]; i++) {
00089     if(0==(used=encode(runs[i].color,buf,len))) return 0;
00090     len-=used; buf+=used;
00091     if(0==(used=encode(runs[i].x,buf,len))) return 0;
00092     len-=used; buf+=used;
00093     if(0==(used=encode(runs[i].width,buf,len))) return 0;
00094     len-=used; buf+=used;
00095   }
00096   return origlen-len;
00097 }
00098 
00099 void
00100 RLEGenerator::setDimensions() {
00101   FilterBankGenerator::setDimensions();
00102   for(unsigned int i=0; i<numLayers; i++)
00103     maxRuns[i]=calcExpMaxRuns(i);
00104 }
00105 
00106 void
00107 RLEGenerator::setNumImages(unsigned int nLayers, unsigned int nChannels) {
00108   if(nLayers==numLayers && nChannels==numChannels)
00109     return;
00110   FilterBankGenerator::setNumImages(nLayers,nChannels); //calls destruct()...
00111   maxRuns=new unsigned int[numLayers];
00112   numRuns=new unsigned int*[numLayers];
00113   for(unsigned int i=0; i<numLayers; i++) {
00114     maxRuns[i]=calcExpMaxRuns(i);
00115     numRuns[i]=new unsigned int[numChannels];
00116   }
00117 }
00118 
00119 //! simply creates a new data region and returns it
00120 unsigned char *
00121 RLEGenerator::createImageCache(unsigned int layer, unsigned int /*chan*/) const {
00122   return reinterpret_cast<unsigned char*>(new run[maxRuns[layer]]);
00123 }
00124 
00125 //! a single call to the CMVision library to do the work, and we're done.
00126 void
00127 RLEGenerator::calcImage(unsigned int layer, unsigned int chan) const {
00128   PROFSECTION("RLEGenerator::calcImage(...)",state->mainProfile);
00129   numRuns[layer][chan] = CMVision::EncodeRuns(reinterpret_cast<run*>(images[layer][chan]),src->getImage(layer,chan),getWidth(layer),getHeight(layer),maxRuns[layer]);
00130   imageValids[layer][chan]=true; // <--- don't forget to do this, otherwise you'll recompute on every access, even if the cache is still valid
00131 }
00132 
00133 void
00134 RLEGenerator::destruct() {
00135   FilterBankGenerator::destruct();
00136   for(unsigned int i=0; i<numLayers; i++)
00137     delete [] numRuns[i];
00138   delete [] numRuns;
00139   numRuns=NULL;
00140   delete [] maxRuns;
00141   maxRuns=NULL;
00142 }
00143 
00144 /*! @file
00145  * @brief Implements RLEGenerator, which generates RLE compressed FilterBankEvents (generally from indexed color images from, say, SegmentedColorGenerator)
00146  * @author alokl (Creator)
00147  * @author ejt (reorganized)
00148  *
00149  * $Author: ejt $
00150  * $Name: tekkotsu-2_1 $
00151  * $Revision: 1.7 $
00152  * $State: Exp $
00153  * $Date: 2004/02/18 21:13:32 $
00154  */
00155 

Tekkotsu v2.1
Generated Tue Mar 16 23:19:15 2004 by Doxygen 1.3.5