#pragma once
#include "ofConstants.h"
#include "ofUtils.h"
#include "ofColor.h"
#include "ofLog.h"
#include "ofMath.h"
#include <limits>
enum ofInterpolationMethod {
OF_INTERPOLATE_NEAREST_NEIGHBOR =1,
OF_INTERPOLATE_BILINEAR =2,
OF_INTERPOLATE_BICUBIC =3
};
enum ofPixelFormat: short{
OF_PIXELS_GRAY = 0,
OF_PIXELS_GRAY_ALPHA = 1,
OF_PIXELS_RGB=2,
OF_PIXELS_BGR=3,
OF_PIXELS_RGBA=4,
OF_PIXELS_BGRA=5,
OF_PIXELS_RGB565=6,
OF_PIXELS_NV12=7,
OF_PIXELS_NV21=8,
OF_PIXELS_YV12=9,
OF_PIXELS_I420=10,
OF_PIXELS_YUY2=11,
OF_PIXELS_UYVY=12,
OF_PIXELS_Y,
OF_PIXELS_U,
OF_PIXELS_V,
OF_PIXELS_UV,
OF_PIXELS_VU,
OF_PIXELS_NUM_FORMATS,
OF_PIXELS_UNKNOWN=-1,
OF_PIXELS_NATIVE=-2
};
#define OF_PIXELS_MONO OF_PIXELS_GRAY
#define OF_PIXELS_R OF_PIXELS_GRAY
#define OF_PIXELS_RG OF_PIXELS_GRAY_ALPHA
template<typename T>
std::string ofToString(const T & v);
template<>
std::string ofToString(const ofPixelFormat & pixelType);
enum ofImageType: short;
template <typename PixelType>
class ofPixels_ {
public:
ofPixels_();
~ofPixels_();
ofPixels_(const ofPixels_<PixelType> & mom);
ofPixels_(ofPixels_<PixelType> && mom);
template<typename SrcType>
ofPixels_(const ofPixels_<SrcType> & mom);
void allocate(size_t w, size_t h, size_t channels);
void allocate(size_t w, size_t h, ofPixelFormat pixelFormat);
void allocate(size_t w, size_t h, ofImageType imageType);
bool isAllocated() const;
void clear();
ofPixels_<PixelType>& operator=(const ofPixels_<PixelType> & mom);
ofPixels_<PixelType>& operator=(ofPixels_<PixelType> && mom);
template<typename SrcType>
ofPixels_<PixelType>& operator=(const ofPixels_<SrcType> & mom);
void set(PixelType val);
void set(size_t channel,PixelType val);
void setFromPixels(const PixelType * newPixels,size_t w, size_t h, size_t channels);
void setFromPixels(const PixelType * newPixels,size_t w, size_t h, ofPixelFormat pixelFormat);
void setFromPixels(const PixelType * newPixels,size_t w, size_t h, ofImageType type);
void setFromExternalPixels(PixelType * newPixels,size_t w, size_t h, size_t channels);
void setFromExternalPixels(PixelType * newPixels,size_t w, size_t h, ofPixelFormat pixelFormat);
void setFromAlignedPixels(const PixelType * newPixels, size_t width, size_t height, size_t channels, size_t stride);
void setFromAlignedPixels(const PixelType * newPixels, size_t width, size_t height, ofPixelFormat pixelFormat, size_t stride);
void setFromAlignedPixels(const PixelType * newPixels, size_t width, size_t height, ofPixelFormat pixelFormat, std::vector<size_t> strides);
void swap(ofPixels_<PixelType> & pix);
void crop(size_t x, size_t y, size_t width, size_t height);
void cropTo(ofPixels_<PixelType> &toPix, size_t x, size_t y, size_t width, size_t height) const;
void rotate90(int nClockwiseRotations);
void rotate90To(ofPixels_<PixelType> & dst, int nClockwiseRotations) const;
void mirrorTo(ofPixels_<PixelType> & dst, bool vertically, bool horizontal) const;
void mirror(bool vertically, bool horizontal);
bool resize(size_t dstWidth, size_t dstHeight, ofInterpolationMethod interpMethod=OF_INTERPOLATE_NEAREST_NEIGHBOR);
bool resizeTo(ofPixels_<PixelType> & dst, ofInterpolationMethod interpMethod=OF_INTERPOLATE_NEAREST_NEIGHBOR) const;
bool pasteInto(ofPixels_<PixelType> &dst, size_t x, size_t y) const;
bool blendInto(ofPixels_<PixelType> &dst, size_t x, size_t y) const;
void swapRgb();
PixelType * getData();
const PixelType * getData() const;
OF_DEPRECATED_MSG("Use getData instead",PixelType * getPixels());
OF_DEPRECATED_MSG("Use getData instead",const PixelType * getPixels() const);
size_t getPixelIndex(size_t x, size_t y) const;
ofColor_<PixelType> getColor(size_t x, size_t y) const;
ofColor_<PixelType> getColor(size_t index) const;
void setColor(size_t x, size_t y, const ofColor_<PixelType>& color);
void setColor(size_t index, const ofColor_<PixelType>& color);
void setColor(const ofColor_<PixelType>& color);
const PixelType& operator[](size_t pos) const;
PixelType& operator[](size_t pos);
size_t getWidth() const;
size_t getHeight() const;
size_t getBytesPerPixel() const;
size_t getBitsPerPixel() const;
size_t getBytesPerChannel() const;
size_t getBitsPerChannel() const;
size_t getBytesStride() const;
size_t getNumChannels() const;
size_t getTotalBytes() const;
size_t getNumPlanes() const;
ofPixels_<PixelType> getPlane(size_t plane);
ofPixels_<PixelType> getChannel(size_t channel) const;
ofPixelFormat getPixelFormat() const;
size_t size() const;
ofImageType getImageType() const;
void setChannel(size_t channel, const ofPixels_<PixelType> channelPixels);
void setImageType(ofImageType imageType);
void setNumChannels(size_t numChannels);
static size_t pixelBitsFromPixelFormat(ofPixelFormat format);
static size_t bytesFromPixelFormat(size_t w, size_t h, ofPixelFormat format);
typedef PixelType * iterator;
typedef const PixelType * const_iterator;
typedef PixelType * reverse_iterator;
typedef const PixelType * const_reverse_iterator;
iterator begin();
iterator end();
const_iterator begin() const;
const_iterator end() const;
reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;
struct ConstPixel: public std::iterator<std::forward_iterator_tag,ConstPixel>{
ConstPixel(const PixelType * pixel, size_t bytesPerPixel, ofPixelFormat pixelFormat);
const ConstPixel& operator*() const;
const ConstPixel* operator->() const;
ConstPixel& operator++();
ConstPixel operator++(int);
ConstPixel operator+(size_t) const;
ConstPixel operator-(size_t) const;
ConstPixel operator+=(size_t);
bool operator!=(ConstPixel const& rhs) const;
bool operator<(ConstPixel const& rhs) const;
const PixelType & operator[](size_t idx) const;
size_t getComponentsPerPixel() const;
ofPixelFormat getPixelFormat() const;
ofColor_<PixelType> getColor() const;
private:
const PixelType * pixel;
size_t componentsPerPixel;
ofPixelFormat pixelFormat;
};
struct Pixel: public std::iterator<std::forward_iterator_tag,Pixel>{
Pixel(PixelType * pixel, size_t bytesPerPixel, ofPixelFormat pixelFormat);
const Pixel& operator*() const;
const Pixel* operator->() const;
Pixel& operator++();
Pixel operator++(int);
Pixel& operator--();
Pixel operator--(int);
Pixel operator+(size_t) const;
Pixel operator-(size_t) const;
Pixel operator+=(size_t);
bool operator!=(Pixel const& rhs) const;
bool operator<(Pixel const& rhs) const;
Pixel & operator=(Pixel const& rhs);
Pixel & operator=(ConstPixel const& rhs);
PixelType & operator[](size_t idx);
const PixelType & operator[](size_t idx) const;
size_t getComponentsPerPixel() const;
ofPixelFormat getPixelFormat() const;
ofColor_<PixelType> getColor() const;
private:
PixelType * pixel;
size_t componentsPerPixel;
ofPixelFormat pixelFormat;
};
struct Pixels{
Pixels(PixelType * begin, PixelType * end, size_t componentsPerPixel, ofPixelFormat pixelFormat);
Pixels(Pixel begin, Pixel end);
Pixel begin();
Pixel end();
private:
PixelType * _begin;
PixelType * _end;
size_t componentsPerPixel;
ofPixelFormat pixelFormat;
};
struct Line: public std::iterator<std::forward_iterator_tag,Line>{
Line(PixelType * _begin, size_t stride, size_t componentsPerPixel, size_t lineNum, ofPixelFormat pixelFormat);
const Line& operator*() const;
const Line* operator->() const;
Line& operator++();
Line operator++(int);
Line& operator--();
Line operator--(int);
Line operator+(size_t) const;
Line operator+=(size_t);
bool operator!=(Line const& rhs) const;
bool operator<(Line const& rhs) const;
bool operator>(Line const& rhs) const;
bool operator>=(Line const& rhs) const;
PixelType * begin();
PixelType * end();
const PixelType * begin() const;
const PixelType * end() const;
size_t getLineNum() const;
ofPixels_<PixelType> asPixels();
const ofPixels_<PixelType> asPixels() const;
size_t getStride() const;
Pixel getPixel(size_t pixel);
Pixels getPixels();
Pixels getPixels(size_t first, size_t numPixels);
private:
PixelType * _begin;
PixelType * _end;
size_t stride;
size_t componentsPerPixel;
size_t lineNum;
ofPixelFormat pixelFormat;
};
struct Lines{
Lines(PixelType * _begin, PixelType * _end, size_t stride, size_t componentsPerPixel, size_t lines, ofPixelFormat pixelFormat);
Line begin();
Line end();
private:
PixelType * _begin;
PixelType * _end;
size_t stride;
size_t componentsPerPixel;
size_t lines;
ofPixelFormat pixelFormat;
};
struct ConstPixels{
ConstPixels(const PixelType * begin, const PixelType * end, size_t componentsPerPixel, ofPixelFormat pixelFormat);
ConstPixels(const ConstPixel & begin, const ConstPixel & end);
ConstPixel begin() const;
ConstPixel end() const;
private:
const PixelType * _begin;
const PixelType * _end;
size_t componentsPerPixel;
ofPixelFormat pixelFormat;
};
struct ConstLine: public std::iterator<std::forward_iterator_tag,Line>{
ConstLine(const PixelType * _begin, size_t stride, size_t componentsPerPixel, size_t lineNum, ofPixelFormat pixelFormat);
const ConstLine& operator*() const;
const ConstLine* operator->() const;
ConstLine& operator++();
ConstLine operator++(int);
ConstLine operator+(size_t) const;
ConstLine operator+=(size_t);
bool operator!=(ConstLine const& rhs) const;
bool operator<(ConstLine const& rhs) const;
const PixelType * begin() const;
const PixelType * end() const;
size_t getLineNum() const;
size_t getStride() const;
ConstPixel getPixel(size_t pixel) const;
ConstPixels getPixels() const;
ConstPixels getPixels(size_t first, size_t numPixels) const;
private:
const PixelType * _begin;
const PixelType * _end;
size_t stride;
size_t componentsPerPixel;
size_t lineNum;
ofPixelFormat pixelFormat;
};
struct ConstLines{
ConstLines(const PixelType * _begin, const PixelType * _end, size_t stride, size_t componentsPerPixel, size_t lines, ofPixelFormat pixelFormat);
ConstLine begin() const;
ConstLine end() const;
private:
const PixelType * _begin;
const PixelType * _end;
size_t stride;
size_t componentsPerPixel;
size_t lines;
ofPixelFormat pixelFormat;
};
Line getLine(size_t line);
Lines getLines();
Lines getLines(size_t first, size_t numLines);
Pixels getPixelsIter();
ConstLine getConstLine(size_t line) const;
ConstLines getConstLines() const;
ConstLines getConstLines(size_t first, size_t numLines) const;
ConstPixels getConstPixelsIter() const;
private:
static float bicubicInterpolate(const float *patch, float x,float y, float x2,float y2, float x3,float y3);
void copyFrom( const ofPixels_<PixelType>& mom );
template<typename SrcType>
void copyFrom( const ofPixels_<SrcType>& mom );
PixelType * pixels = nullptr;
size_t width = 0;
size_t height = 0;
size_t pixelsSize = 0;
bool bAllocated = false;
bool pixelsOwner = true;
ofPixelFormat pixelFormat = OF_PIXELS_UNKNOWN;
};
typedef ofPixels_<unsigned char> ofPixels;
typedef ofPixels_<float> ofFloatPixels;
typedef ofPixels_<unsigned short> ofShortPixels;
typedef ofPixels& ofPixelsRef;
typedef ofFloatPixels& ofFloatPixelsRef;
typedef ofShortPixels& ofShortPixelsRef;
template<typename PixelType>
template<typename SrcType>
ofPixels_<PixelType>::ofPixels_(const ofPixels_<SrcType> & mom){
bAllocated = false;
pixelsOwner = false;
pixelsSize = 0;
pixels = nullptr;
width = 0;
height = 0;
pixelFormat = OF_PIXELS_UNKNOWN;
copyFrom( mom );
}
template<typename PixelType>
template<typename SrcType>
ofPixels_<PixelType>& ofPixels_<PixelType>::operator=(const ofPixels_<SrcType> & mom){
copyFrom( mom );
return *this;
}
template<typename PixelType>
template<typename SrcType>
void ofPixels_<PixelType>::copyFrom(const ofPixels_<SrcType> & mom){
if(mom.isAllocated()){
allocate(mom.getWidth(),mom.getHeight(),mom.getNumChannels());
const float srcMax = ( (sizeof(SrcType) == sizeof(float) ) ? 1.f : std::numeric_limits<SrcType>::max() );
const float dstMax = ( (sizeof(PixelType) == sizeof(float) ) ? 1.f : std::numeric_limits<PixelType>::max() );
const float factor = dstMax / srcMax;
if(sizeof(SrcType) == sizeof(float)) {
for(size_t i = 0; i < mom.size(); i++){
pixels[i] = ofClamp(mom[i], 0, 1) * factor;
}
} else{
for(size_t i = 0; i < mom.size(); i++){
pixels[i] = mom[i] * factor;
}
}
}
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::iterator ofPixels_<PixelType>::begin(){
return pixels;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::iterator ofPixels_<PixelType>::end(){
return pixels + size();
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::begin() const{
return pixels;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::end() const{
return pixels + size();
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::reverse_iterator ofPixels_<PixelType>::rbegin(){
return pixels + (size() - 1);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::reverse_iterator ofPixels_<PixelType>::rend(){
return pixels - 1;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_reverse_iterator ofPixels_<PixelType>::rbegin() const{
return pixels + (size() - 1);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_reverse_iterator ofPixels_<PixelType>::rend() const{
return pixels - 1;
}
template<typename PixelType>
inline ofPixels_<PixelType>::Pixel::Pixel(PixelType * pixel, size_t componentsPerPixel, ofPixelFormat pixelFormat)
:pixel(pixel)
,componentsPerPixel(componentsPerPixel)
,pixelFormat(pixelFormat){
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::Pixel& ofPixels_<PixelType>::Pixel::operator*() const{
return *this;
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::Pixel* ofPixels_<PixelType>::Pixel::operator->() const{
return this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel& ofPixels_<PixelType>::Pixel::operator++(){
pixel += componentsPerPixel;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixel::operator++(int){
Pixel tmp(*this);
operator++();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel& ofPixels_<PixelType>::Pixel::operator--(){
pixel -= componentsPerPixel;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixel::operator--(int){
Pixel tmp(*this);
operator--();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixel::operator+(size_t i) const{
return Pixel(pixel + componentsPerPixel * i, componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixel::operator-(size_t i) const{
return Pixel(pixel - componentsPerPixel * i, componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixel::operator+=(size_t i){
pixel += componentsPerPixel * i;
return *this;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Pixel::operator!=(Pixel const& rhs) const{
return pixel != rhs.pixel;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Pixel::operator<(Pixel const& rhs) const{
return pixel < rhs.pixel;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel & ofPixels_<PixelType>::Pixel::operator=(Pixel const& rhs){
for(size_t i=0;i<componentsPerPixel;++i){
pixel[i] = rhs[i];
}
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel & ofPixels_<PixelType>::Pixel::operator=(ConstPixel const& rhs){
for(size_t i=0;i<componentsPerPixel;++i){
pixel[i] = rhs[i];
}
return *this;
}
template<typename PixelType>
inline PixelType & ofPixels_<PixelType>::Pixel::operator[](size_t idx){
return pixel[idx];
}
template<typename PixelType>
inline const PixelType & ofPixels_<PixelType>::Pixel::operator[](size_t idx) const{
return pixel[idx];
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::Pixel::getComponentsPerPixel() const{
return componentsPerPixel;
}
template<typename PixelType>
inline ofPixelFormat ofPixels_<PixelType>::Pixel::getPixelFormat() const{
return pixelFormat;
}
template<typename PixelType>
ofColor_<PixelType> ofPixels_<PixelType>::Pixel::getColor() const{
ofColor_<PixelType> c;
switch(pixelFormat){
case OF_PIXELS_RGB:
c.set( pixel[0], pixel[1], pixel[2] );
break;
case OF_PIXELS_BGR:
c.set( pixel[2], pixel[1], pixel[0] );
break;
case OF_PIXELS_RGBA:
c.set( pixel[0], pixel[1], pixel[2], pixel[3] );
break;
case OF_PIXELS_BGRA:
c.set( pixel[2], pixel[1], pixel[0], pixel[3] );
break;
case OF_PIXELS_GRAY:
c.set( pixel[0] );
break;
case OF_PIXELS_GRAY_ALPHA:
c.set( pixel[0], pixel[0], pixel[0], pixel[1] );
break;
case OF_PIXELS_RGB565:
case OF_PIXELS_NV12:
case OF_PIXELS_NV21:
case OF_PIXELS_YV12:
case OF_PIXELS_I420:
case OF_PIXELS_YUY2:
case OF_PIXELS_UYVY:
case OF_PIXELS_Y:
case OF_PIXELS_U:
case OF_PIXELS_V:
case OF_PIXELS_UV:
case OF_PIXELS_VU:
case OF_PIXELS_UNKNOWN:
default:
ofLogWarning() << "returning color not supported yet for " << ofToString(pixelFormat) << " format";
return 0;
break;
}
return c;
}
template<typename PixelType>
inline ofPixels_<PixelType>::Pixels::Pixels(PixelType * begin, PixelType * end, size_t componentsPerPixel, ofPixelFormat pixelFormat)
:_begin(begin)
,_end(end)
,componentsPerPixel(componentsPerPixel)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline ofPixels_<PixelType>::Pixels::Pixels(Pixel begin, Pixel end)
:_begin(&begin[0])
,_end(&end[0])
,componentsPerPixel(begin.getComponentsPerPixel())
,pixelFormat(begin.getPixelFormat()){}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixels::begin(){
return Pixel(_begin,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Pixels::end(){
return Pixel(_end,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline ofPixels_<PixelType>::Line::Line(PixelType * _begin, size_t stride, size_t componentsPerPixel, size_t lineNum, ofPixelFormat pixelFormat)
:_begin(_begin)
,_end(_begin+stride)
,stride(stride)
,componentsPerPixel(componentsPerPixel)
,lineNum(lineNum)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::Line& ofPixels_<PixelType>::Line::operator*() const{
return *this;
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::Line* ofPixels_<PixelType>::Line::operator->() const{
return this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line& ofPixels_<PixelType>::Line::operator++(){
_begin = _end;
_end = _begin + stride;
++lineNum;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Line::operator++(int) {
Line tmp(*this);
operator++();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line& ofPixels_<PixelType>::Line::operator--(){
_end = _begin;
_begin = _end - stride;
--lineNum;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Line::operator--(int) {
Line tmp(*this);
operator--();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Line::operator+(size_t i) const{
return Line(_begin+stride*i,stride,componentsPerPixel,lineNum+i,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Line::operator+=(size_t i){
_begin = _begin+stride*i;
_end = _begin + stride;
lineNum += i;
return *this;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Line::operator!=(typename ofPixels_<PixelType>::Line const& rhs) const{
return rhs._begin != _begin || rhs._end != _end || rhs.stride != stride || rhs.lineNum!=lineNum;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Line::operator<(typename ofPixels_<PixelType>::Line const& rhs) const{
return _begin < rhs._begin;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Line::operator>(typename ofPixels_<PixelType>::Line const& rhs) const{
return _begin > rhs._begin;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::Line::operator>=(typename ofPixels_<PixelType>::Line const& rhs) const{
return _begin >= rhs._begin;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::iterator ofPixels_<PixelType>::Line::begin(){
return _begin;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::iterator ofPixels_<PixelType>::Line::end(){
return _end;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::Line::begin() const{
return _begin;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::Line::end() const{
return _end;
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::Line::getLineNum() const{
return lineNum;
}
template<typename PixelType>
inline ofPixels_<PixelType> ofPixels_<PixelType>::Line::asPixels(){
ofPixels_<PixelType> pixels;
pixels.setFromExternalPixels(_begin,stride/componentsPerPixel,1,pixelFormat);
return pixels;
}
template<typename PixelType>
inline const ofPixels_<PixelType> ofPixels_<PixelType>::Line::asPixels() const{
ofPixels_<PixelType> pixels;
pixels.setFromExternalPixels(_begin,stride/componentsPerPixel,1,pixelFormat);
return pixels;
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::Line::getStride() const{
return stride;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixel ofPixels_<PixelType>::Line::getPixel(size_t pixel){
return Pixel(_begin + (pixel*componentsPerPixel), componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixels ofPixels_<PixelType>::Line::getPixels(){
return Pixels(_begin,_end,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixels ofPixels_<PixelType>::Line::getPixels(size_t first, size_t numPixels){
return Pixels(&getPixel(first)[0], &getPixel(first+numPixels)[0], componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline ofPixels_<PixelType>::Lines::Lines(PixelType * _begin, PixelType * _end, size_t stride, size_t componentsPerPixel, size_t lines, ofPixelFormat pixelFormat)
:_begin(_begin)
,_end(_end)
,stride(stride)
,componentsPerPixel(componentsPerPixel)
,lines(lines)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Lines::begin(){
return Line(_begin,stride,componentsPerPixel,0,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::Lines::end(){
return Line(_end,stride,componentsPerPixel,lines,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Line ofPixels_<PixelType>::getLine(size_t line){
return Line(pixels+(width*getNumChannels()*line), width*getNumChannels(), getNumChannels(), line,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Lines ofPixels_<PixelType>::getLines(){
return Lines(begin(),end(),width*getNumChannels(),getNumChannels(),getHeight(),pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Lines ofPixels_<PixelType>::getLines(size_t first, size_t numLines){
return Lines(getLine(first).begin(),getLine(first+numLines).begin(),width*getNumChannels(),getNumChannels(),numLines,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::Pixels ofPixels_<PixelType>::getPixelsIter(){
return Pixels(begin(),end(),getNumChannels(),pixelFormat);
}
template<typename PixelType>
inline ofPixels_<PixelType>::ConstPixel::ConstPixel(const PixelType * pixel, size_t componentsPerPixel, ofPixelFormat pixelFormat)
:pixel(pixel)
,componentsPerPixel(componentsPerPixel)
,pixelFormat(pixelFormat){
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::ConstPixel& ofPixels_<PixelType>::ConstPixel::operator*() const{
return *this;
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::ConstPixel* ofPixels_<PixelType>::ConstPixel::operator->() const{
return this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel& ofPixels_<PixelType>::ConstPixel::operator++(){
pixel += componentsPerPixel;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixel::operator++(int){
ConstPixel tmp(*this);
operator++();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixel::operator+(size_t i) const{
return ConstPixel(pixel + componentsPerPixel * i, componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixel::operator-(size_t i) const{
return ConstPixel(pixel - componentsPerPixel * i, componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixel::operator+=(size_t i){
pixel += componentsPerPixel * i;
return *this;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::ConstPixel::operator!=(ConstPixel const& rhs) const{
return pixel != rhs.pixel;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::ConstPixel::operator<(ConstPixel const& rhs) const{
return pixel < rhs.pixel;
}
template<typename PixelType>
inline const PixelType & ofPixels_<PixelType>::ConstPixel::operator[](size_t idx) const{
return pixel[idx];
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::ConstPixel::getComponentsPerPixel() const{
return componentsPerPixel;
}
template<typename PixelType>
inline ofPixelFormat ofPixels_<PixelType>::ConstPixel::getPixelFormat() const{
return pixelFormat;
}
template<typename PixelType>
ofColor_<PixelType> ofPixels_<PixelType>::ConstPixel::getColor() const{
ofColor_<PixelType> c;
switch(pixelFormat){
case OF_PIXELS_RGB:
c.set( pixel[0], pixel[1], pixel[2] );
break;
case OF_PIXELS_BGR:
c.set( pixel[2], pixel[1], pixel[0] );
break;
case OF_PIXELS_RGBA:
c.set( pixel[0], pixel[1], pixel[2], pixel[3] );
break;
case OF_PIXELS_BGRA:
c.set( pixel[2], pixel[1], pixel[0], pixel[3] );
break;
case OF_PIXELS_GRAY:
c.set( pixel[0] );
break;
case OF_PIXELS_GRAY_ALPHA:
c.set( pixel[0], pixel[0], pixel[0], pixel[1] );
break;
case OF_PIXELS_RGB565:
case OF_PIXELS_NV12:
case OF_PIXELS_NV21:
case OF_PIXELS_YV12:
case OF_PIXELS_I420:
case OF_PIXELS_YUY2:
case OF_PIXELS_UYVY:
case OF_PIXELS_Y:
case OF_PIXELS_U:
case OF_PIXELS_V:
case OF_PIXELS_UV:
case OF_PIXELS_VU:
case OF_PIXELS_UNKNOWN:
default:
ofLogWarning() << "returning color not supported yet for " << ofToString(pixelFormat) << " format";
return 0;
break;
}
return c;
}
template<typename PixelType>
inline ofPixels_<PixelType>::ConstPixels::ConstPixels(const PixelType * begin, const PixelType * end, size_t componentsPerPixel, ofPixelFormat pixelFormat)
:_begin(begin)
,_end(end)
,componentsPerPixel(componentsPerPixel)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline ofPixels_<PixelType>::ConstPixels::ConstPixels(const ConstPixel & begin, const ConstPixel & end)
:_begin(&begin[0])
,_end(&end[0])
,componentsPerPixel(begin.getComponentsPerPixel())
,pixelFormat(begin.getPixelFormat()){}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixels::begin() const{
return ConstPixel(_begin,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstPixels::end() const{
return ConstPixel(_end,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline ofPixels_<PixelType>::ConstLine::ConstLine(const PixelType * _begin, size_t stride, size_t componentsPerPixel, size_t lineNum, ofPixelFormat pixelFormat)
:_begin(_begin)
,_end(_begin+stride)
,stride(stride)
,componentsPerPixel(componentsPerPixel)
,lineNum(lineNum)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::ConstLine& ofPixels_<PixelType>::ConstLine::operator*() const{
return *this;
}
template<typename PixelType>
inline const typename ofPixels_<PixelType>::ConstLine* ofPixels_<PixelType>::ConstLine::operator->() const{
return this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine& ofPixels_<PixelType>::ConstLine::operator++(){
_begin = _end;
_end = _begin + stride;
++lineNum;
return *this;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::ConstLine::operator++(int) {
ConstLine tmp(*this);
operator++();
return tmp;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::ConstLine::operator+(size_t i) const{
return ConstLine(_begin+stride*i,stride,componentsPerPixel,lineNum+i,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::ConstLine::operator+=(size_t i){
_begin = _begin+stride*i;
_end = _begin + stride;
lineNum += i;
return *this;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::ConstLine::operator!=(typename ofPixels_<PixelType>::ConstLine const& rhs) const{
return rhs._begin != _begin || rhs._end != _end || rhs.stride != stride || rhs.lineNum!=lineNum;
}
template<typename PixelType>
inline bool ofPixels_<PixelType>::ConstLine::operator<(typename ofPixels_<PixelType>::ConstLine const& rhs) const{
return _begin < rhs._begin || _end < rhs._end;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::ConstLine::begin() const{
return _begin;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::const_iterator ofPixels_<PixelType>::ConstLine::end() const{
return _end;
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::ConstLine::getLineNum() const{
return lineNum;
}
template<typename PixelType>
inline size_t ofPixels_<PixelType>::ConstLine::getStride() const{
return stride;
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixel ofPixels_<PixelType>::ConstLine::getPixel(size_t pixel) const{
return ConstPixel(_begin + (pixel*componentsPerPixel), componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixels ofPixels_<PixelType>::ConstLine::getPixels() const{
return ConstPixels(_begin,_end,componentsPerPixel,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixels ofPixels_<PixelType>::ConstLine::getPixels(size_t first, size_t numPixels) const{
return ConstPixels(&getPixel(first)[0], &getPixel(first+numPixels)[0], componentsPerPixel, pixelFormat);
}
template<typename PixelType>
inline ofPixels_<PixelType>::ConstLines::ConstLines(const PixelType * _begin, const PixelType * _end, size_t stride, size_t componentsPerPixel, size_t lines, ofPixelFormat pixelFormat)
:_begin(_begin)
,_end(_end)
,stride(stride)
,componentsPerPixel(componentsPerPixel)
,lines(lines)
,pixelFormat(pixelFormat){}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::ConstLines::begin() const{
return ConstLine(_begin,stride,componentsPerPixel,0,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::ConstLines::end() const{
return ConstLine(_end,stride,componentsPerPixel,lines,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLine ofPixels_<PixelType>::getConstLine(size_t line) const{
return ConstLine(pixels+(width*getNumChannels()*line), width*getNumChannels(), getNumChannels(), line,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLines ofPixels_<PixelType>::getConstLines() const{
return ConstLines(begin(),end(),width*getNumChannels(),getNumChannels(),getHeight(),pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstLines ofPixels_<PixelType>::getConstLines(size_t first, size_t numLines) const{
return ConstLines(getConstLine(first).begin(),getConstLine(first+numLines).begin(),width*getNumChannels(),getNumChannels(),numLines,pixelFormat);
}
template<typename PixelType>
inline typename ofPixels_<PixelType>::ConstPixels ofPixels_<PixelType>::getConstPixelsIter() const{
return ConstPixels(begin(),end(),getNumChannels(),pixelFormat);
}
namespace std{
template<typename PixelType>
void swap(ofPixels_<PixelType> & src, ofPixels_<PixelType> & dst){
src.swap(dst);
}
}
Comments