From bb6498e5ff6a8a8af8c06300dac051659a37e89b Mon Sep 17 00:00:00 2001 From: Tim Redfern Date: Thu, 22 May 2014 08:36:24 +0100 Subject: NT figuring out type system --- NT/src/cvimage.cpp | 252 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 NT/src/cvimage.cpp (limited to 'NT/src/cvimage.cpp') diff --git a/NT/src/cvimage.cpp b/NT/src/cvimage.cpp new file mode 100644 index 0000000..b255848 --- /dev/null +++ b/NT/src/cvimage.cpp @@ -0,0 +1,252 @@ +#include "cvimage.h" + +using namespace std; + +namespace Rotor { + //space out to 32 bit RGB padding for cairo + void Image::convert24(){ + cv::cvtColor(rgb,rgb, CV_RGBA2RGB); + } + void Image::convert32(){ + cv::cvtColor(rgb,rgb, CV_RGB2RGBA); + } + Image & Image::operator+=(const Image &other) { + if (other.w!=w||other.h!=h) { + cerr<<"Rotor: cannot add images with different sizes! (wanted "< ichans,ochans; + vector compchans; + cv::split(rgb,ichans); + cv::split(other.rgb,ochans); + uint8_t b=0xFF; + cv::Mat iA=b-other.alpha; + for (int i=0;i<3;i++) { + compchans.push_back(ichans[i].mul(iA,1.0/255.0)+ochans[i].mul(other.alpha,1.0/255.0)); + } + merge(compchans,rgb); + //rgb+=other.rgb; + //for (int i=0;i>8)+((((int)other.rgb.data[i])*((int)other.alpha.data[i/3]))>>8)); + //} + } + + return *this; + } + Image & Image::alpha_blend(const Image &other) { + if (other.w!=w||other.h!=h) { + cerr<<"Rotor: cannot blend images with different sizes! (wanted "<>8)+((((int)other.rgb.data[i])*((int)other.alpha.data[i/3]))>>8)); + } + } + return *this; + } + Image & Image::alpha_merge(const Image &other) { + //converts the incoming image to monochrome and inserts it into the alpha channel of this image + if (other.w!=w||other.h!=h) { + cerr<<"Rotor: cannot merge alpha with different size! (wanted "<rgb=rgb*amount; + return other; + } + Image * Image::operator+(const double &amount) { + uint8_t amt=(uint8_t)(amount*255.0); + Image *other=new Image(w,h); + other->rgb=rgb+amt; + return other; + } + Image * Image::operator-(const double &amount) { + uint8_t amt=(uint8_t)(amount*255.0); + Image *other=new Image(w,h); + other->rgb=rgb-amt; + return other; + } + Image * Image::operator/(const double &amount) { + Image *other=new Image(w,h); + other->rgb=rgb/amount; + return other; + } + cv::Mat& Image::get_mipmap(int level){ + if (mipmaps.find(level)!=mipmaps.end()) return mipmaps[level]; + //levels start at 1 + int nw=std::max(1.0,w/pow(2,level)); + int nh=std::max(1.0,h/pow(2,level)); + cv::Mat mip;; + cv::resize(rgb,mip,cv::Size(nw,nh),0,0,cv::INTER_AREA ); + mipmaps[level]=mip; + return mipmaps[level]; + + } +} -- cgit v1.2.3