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
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);
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
00122 unsigned char *
00123 RLEGenerator::createImageCache(unsigned int layer, unsigned int ) const {
00124 return reinterpret_cast<unsigned char*>(new run[maxRuns[layer]]);
00125 }
00126
00127
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;
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
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157