#ifndef ROTOR_CVIMAGE #define ROTOR_CVIMAGE #include #include #include #include //converting to use a cv image... //cv::Mat supports most of what we want here //need to think //http://answers.opencv.org/question/8202/using-external-image-data-in-a-cvmat/ //all access to the image is presently through a pointer to the data //cv::Mat supports this //how will copying work? //Rotor::Image will contain a cv::Mat object which may own its data or inherit it //cv::Mat should take care of reference counting //can cv::Mat namespace Rotor { class pixeltables{ //handy pixel arithmetic lookup tables as nested arrays //so - pixels.add[0x78][0x66]; will give the precalculated result of adding with saturation // pixels.mono_weights[0][0x100]; will give the red component to convert to mono public: pixeltables(){ add=new uint8_t*[256]; multiply=new uint8_t*[256]; overlay=new uint8_t*[256]; min=new uint8_t*[256]; max=new uint8_t*[256]; for (int i=0;i<256;i++){ add[i]=new uint8_t[256]; multiply[i]=new uint8_t[256]; overlay[i]=new uint8_t[256]; min[i]=new uint8_t[256]; max[i]=new uint8_t[256]; for (int j=0;j<256;j++){ add[i][j]=(uint8_t)std::min(i+j,0xFF); multiply[i][j]=(uint8_t)(((double)i)*(((double)j)/255.0)); overlay[i][j]=j<128?(uint8_t)((i*j)>>7):255-(((0xFF-i)*(0xFF-j))>>7); min[i][j]=ji?j:i; } } mono_weights=new uint8_t*[3]; double weights[3]={0.2989, 0.5870, 0.1140}; for (int i=0;i<3;i++) { mono_weights[i]=new uint8_t[256]; for (int j=0;j<256;j++){ mono_weights[i][j]=(uint8_t)(((double)j)*weights[i]); } } } virtual ~pixeltables(){ for (int i=0;i<256;i++){ delete[] add[i]; delete[] multiply[i]; delete[] overlay[i]; delete[] min[i]; delete[] max[i]; } delete[] add; delete[] multiply; delete[] overlay; delete[] min; delete[] max; for (int i=0;i<3;i++) { delete[] mono_weights[i]; } delete[] mono_weights; } uint8_t **add; uint8_t **multiply; uint8_t **overlay; uint8_t **mono_weights; uint8_t **max; uint8_t **min; }; static pixeltables pixels; class Image{ //transform should be a method of image public: Image(){ zero(); }; Image(int _w,int _h){ zero(); setup(_w,_h); }; Image(const Image &mom) { // copy constructor zero(); rgb=mom.rgb.clone(); w=mom.w; h=mom.h; RGBdata=rgb.data; //can move to use the bare pointer eventually ownsRGBdata=false; //always just deallocate cv::Mat from stack } ~Image() { free(); }; void free(){ if (RGBdata&&ownsRGBdata) delete[] RGBdata; if (Adata&&ownsAdata) delete[] Adata; if (Zdata&&ownsZdata) delete[] Zdata; rgb.release(); alpha.release(); zero(); } void zero(){ RGBdata=nullptr; Adata=nullptr; Zdata=nullptr; w=0; h=0; ownsRGBdata=ownsAdata=ownsZdata=false; } //space out to 32 bit RGB padding for cairo void convert24(); void convert32(); int getStride(){ return w*3; } bool clear(){ rgb.setTo(0); return true; }; bool setup(int _w,int _h){ //set up with internal data if (_w==0||_h==0) { std::cerr<<"Error! cvimage: request to set up image at "<<_w<<"x"<<_h<rgb=rgb.clone(); t->w=w; t->h=h; t->RGBdata=t->rgb.data; //can move to use the bare pointer eventually t->ownsRGBdata=false; //always just deallocate cv::Mat from stack /* for (int i=0;iRGBdata[i]=RGBdata[i]; } */ return t; } void crop(int _w,int _h){ //change borders, crop/ extend, centred cv::Mat source; int X,Y,W,H; //do crop part if ( _w mipmaps; cv::Mat& get_mipmap(int level); }; } #endif