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

Tekkotsu v2.2.1
Generated Tue Nov 23 16:36:39 2004 by Doxygen 1.3.9.1