41 #ifndef _ncv_pixel_operations_hpp_
42 #define _ncv_pixel_operations_hpp_
47 template<
typename TBase>
inline __host__ __device__ TBase _pixMaxVal();
48 template<>
inline __host__ __device__ Ncv8u _pixMaxVal<Ncv8u>() {
return std::numeric_limits<unsigned char>::max();}
49 template<>
inline __host__ __device__ Ncv16u _pixMaxVal<Ncv16u>() {
return std::numeric_limits<unsigned short>::max();}
50 template<>
inline __host__ __device__ Ncv32u _pixMaxVal<Ncv32u>() {
return std::numeric_limits<unsigned int>::max();}
51 template<>
inline __host__ __device__ Ncv8s _pixMaxVal<Ncv8s>() {
return std::numeric_limits<signed char>::max();}
52 template<>
inline __host__ __device__ Ncv16s _pixMaxVal<Ncv16s>() {
return std::numeric_limits<short>::max();}
53 template<>
inline __host__ __device__ Ncv32s _pixMaxVal<Ncv32s>() {
return std::numeric_limits<int>::max();}
54 template<>
inline __host__ __device__ Ncv32f _pixMaxVal<Ncv32f>() {
return std::numeric_limits<float>::max();}
55 template<>
inline __host__ __device__ Ncv64f _pixMaxVal<Ncv64f>() {
return std::numeric_limits<double>::max();}
57 template<
typename TBase>
inline __host__ __device__ TBase _pixMinVal();
58 template<>
inline __host__ __device__ Ncv8u _pixMinVal<Ncv8u>() {
return 0;}
59 template<>
inline __host__ __device__ Ncv16u _pixMinVal<Ncv16u>() {
return 0;}
60 template<>
inline __host__ __device__ Ncv32u _pixMinVal<Ncv32u>() {
return 0;}
61 template<>
inline __host__ __device__ Ncv8s _pixMinVal<Ncv8s>() {
return std::numeric_limits<signed char>::min();}
62 template<>
inline __host__ __device__ Ncv16s _pixMinVal<Ncv16s>() {
return std::numeric_limits<short>::min();}
63 template<>
inline __host__ __device__ Ncv32s _pixMinVal<Ncv32s>() {
return std::numeric_limits<int>::min();}
64 template<>
inline __host__ __device__ Ncv32f _pixMinVal<Ncv32f>() {
return std::numeric_limits<float>::min();}
65 template<>
inline __host__ __device__ Ncv64f _pixMinVal<Ncv64f>() {
return std::numeric_limits<double>::min();}
84 #define NC(T) (sizeof(T) / sizeof(TConvVec2Base<T>::TBase))
104 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampZ(Tin &a, Ncv8u &out) {out = (Ncv8u)CLAMP_0_255(a);};
105 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampZ(Tin &a, Ncv16u &out) {out = (Ncv16u)CLAMP(a, 0, std::numeric_limits<unsigned short>::max());}
106 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampZ(Tin &a, Ncv32u &out) {out = (Ncv32u)CLAMP(a, 0, std::numeric_limits<unsigned int>::max());}
107 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampZ(Tin &a, Ncv32f &out) {out = (Ncv32f)a;}
110 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampNN(Tin &a, Ncv8u &out) {out = (Ncv8u)CLAMP_0_255(a+0.5f);}
111 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampNN(Tin &a, Ncv16u &out) {out = (Ncv16u)CLAMP(a+0.5f, 0, std::numeric_limits<unsigned short>::max());}
112 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampNN(Tin &a, Ncv32u &out) {out = (Ncv32u)CLAMP(a+0.5f, 0, std::numeric_limits<unsigned int>::max());}
113 template<
typename Tin>
static inline __host__ __device__
void _TDemoteClampNN(Tin &a, Ncv32f &out) {out = (Ncv32f)a;}
115 template<
typename Tout>
inline Tout _pixMakeZero();
116 template<>
inline __host__ __device__ uchar1 _pixMakeZero<uchar1>() {
return make_uchar1(0);}
117 template<>
inline __host__ __device__ uchar3 _pixMakeZero<uchar3>() {
return make_uchar3(0,0,0);}
118 template<>
inline __host__ __device__ uchar4 _pixMakeZero<uchar4>() {
return make_uchar4(0,0,0,0);}
119 template<>
inline __host__ __device__ ushort1 _pixMakeZero<ushort1>() {
return make_ushort1(0);}
120 template<>
inline __host__ __device__ ushort3 _pixMakeZero<ushort3>() {
return make_ushort3(0,0,0);}
121 template<>
inline __host__ __device__ ushort4 _pixMakeZero<ushort4>() {
return make_ushort4(0,0,0,0);}
122 template<>
inline __host__ __device__ uint1 _pixMakeZero<uint1>() {
return make_uint1(0);}
123 template<>
inline __host__ __device__ uint3 _pixMakeZero<uint3>() {
return make_uint3(0,0,0);}
124 template<>
inline __host__ __device__ uint4 _pixMakeZero<uint4>() {
return make_uint4(0,0,0,0);}
125 template<>
inline __host__ __device__ float1 _pixMakeZero<float1>() {
return make_float1(0.f);}
126 template<>
inline __host__ __device__ float3 _pixMakeZero<float3>() {
return make_float3(0.f,0.f,0.f);}
127 template<>
inline __host__ __device__ float4 _pixMakeZero<float4>() {
return make_float4(0.f,0.f,0.f,0.f);}
128 template<>
inline __host__ __device__ double1 _pixMakeZero<double1>() {
return make_double1(0.);}
129 template<>
inline __host__ __device__ double3 _pixMakeZero<double3>() {
return make_double3(0.,0.,0.);}
130 template<>
inline __host__ __device__ double4 _pixMakeZero<double4>() {
return make_double4(0.,0.,0.,0.);}
132 static inline __host__ __device__ uchar1 _pixMake(Ncv8u x) {
return make_uchar1(x);}
133 static inline __host__ __device__ uchar3 _pixMake(Ncv8u x, Ncv8u y, Ncv8u z) {
return make_uchar3(x,y,z);}
134 static inline __host__ __device__ uchar4 _pixMake(Ncv8u x, Ncv8u y, Ncv8u z, Ncv8u w) {
return make_uchar4(x,y,z,w);}
135 static inline __host__ __device__ ushort1 _pixMake(Ncv16u x) {
return make_ushort1(x);}
136 static inline __host__ __device__ ushort3 _pixMake(Ncv16u x, Ncv16u y, Ncv16u z) {
return make_ushort3(x,y,z);}
137 static inline __host__ __device__ ushort4 _pixMake(Ncv16u x, Ncv16u y, Ncv16u z, Ncv16u w) {
return make_ushort4(x,y,z,w);}
138 static inline __host__ __device__ uint1 _pixMake(Ncv32u x) {
return make_uint1(x);}
139 static inline __host__ __device__ uint3 _pixMake(Ncv32u x, Ncv32u y, Ncv32u z) {
return make_uint3(x,y,z);}
140 static inline __host__ __device__ uint4 _pixMake(Ncv32u x, Ncv32u y, Ncv32u z, Ncv32u w) {
return make_uint4(x,y,z,w);}
141 static inline __host__ __device__ float1 _pixMake(Ncv32f x) {
return make_float1(x);}
142 static inline __host__ __device__ float3 _pixMake(Ncv32f x, Ncv32f y, Ncv32f z) {
return make_float3(x,y,z);}
143 static inline __host__ __device__ float4 _pixMake(Ncv32f x, Ncv32f y, Ncv32f z, Ncv32f w) {
return make_float4(x,y,z,w);}
144 static inline __host__ __device__ double1 _pixMake(Ncv64f x) {
return make_double1(x);}
145 static inline __host__ __device__ double3 _pixMake(Ncv64f x, Ncv64f y, Ncv64f z) {
return make_double3(x,y,z);}
146 static inline __host__ __device__ double4 _pixMake(Ncv64f x, Ncv64f y, Ncv64f z, Ncv64f w) {
return make_double4(x,y,z,w);}
155 _TDemoteClampZ(pix.x, out.x);
163 _TDemoteClampZ(pix.x, out.x);
164 _TDemoteClampZ(pix.y, out.y);
165 _TDemoteClampZ(pix.z, out.z);
173 _TDemoteClampZ(pix.x, out.x);
174 _TDemoteClampZ(pix.y, out.y);
175 _TDemoteClampZ(pix.z, out.z);
176 _TDemoteClampZ(pix.w, out.w);
180 template<
typename Tin,
typename Tout>
static inline __host__ __device__ Tout _pixDemoteClampZ(Tin &pix)
192 _TDemoteClampNN(pix.x, out.x);
200 _TDemoteClampNN(pix.x, out.x);
201 _TDemoteClampNN(pix.y, out.y);
202 _TDemoteClampNN(pix.z, out.z);
210 _TDemoteClampNN(pix.x, out.x);
211 _TDemoteClampNN(pix.y, out.y);
212 _TDemoteClampNN(pix.z, out.z);
213 _TDemoteClampNN(pix.w, out.w);
217 template<
typename Tin,
typename Tout>
static inline __host__ __device__ Tout _pixDemoteClampNN(Tin &pix)
223 template<
typename Tin,
typename Tout,
typename Tw, Ncv32u CN>
struct __pixScale_CN {
static __host__ __device__ Tout
_pixScale_CN(Tin &pix, Tw w);};
225 template<
typename Tin,
typename Tout,
typename Tw>
struct __pixScale_CN<Tin, Tout, Tw, 1> {
230 out.x = (TBout)(pix.x * w);
234 template<
typename Tin,
typename Tout,
typename Tw>
struct __pixScale_CN<Tin, Tout, Tw, 3> {
239 out.x = (TBout)(pix.x * w);
240 out.y = (TBout)(pix.y * w);
241 out.z = (TBout)(pix.z * w);
245 template<
typename Tin,
typename Tout,
typename Tw>
struct __pixScale_CN<Tin, Tout, Tw, 4> {
250 out.x = (TBout)(pix.x * w);
251 out.y = (TBout)(pix.y * w);
252 out.z = (TBout)(pix.z * w);
253 out.w = (TBout)(pix.w * w);
257 template<
typename Tin,
typename Tout,
typename Tw>
static __host__ __device__ Tout _pixScale(Tin &pix, Tw w)
263 template<
typename Tin,
typename Tout, Ncv32u CN>
struct __pixAdd_CN {
static __host__ __device__ Tout
_pixAdd_CN(Tout &pix1, Tin &pix2);};
265 template<
typename Tin,
typename Tout>
struct __pixAdd_CN<Tin, Tout, 1> {
266 static __host__ __device__ Tout
_pixAdd_CN(Tout &pix1, Tin &pix2)
269 out.x = pix1.x + pix2.x;
273 template<
typename Tin,
typename Tout>
struct __pixAdd_CN<Tin, Tout, 3> {
274 static __host__ __device__ Tout
_pixAdd_CN(Tout &pix1, Tin &pix2)
277 out.x = pix1.x + pix2.x;
278 out.y = pix1.y + pix2.y;
279 out.z = pix1.z + pix2.z;
283 template<
typename Tin,
typename Tout>
struct __pixAdd_CN<Tin, Tout, 4> {
284 static __host__ __device__ Tout
_pixAdd_CN(Tout &pix1, Tin &pix2)
287 out.x = pix1.x + pix2.x;
288 out.y = pix1.y + pix2.y;
289 out.z = pix1.z + pix2.z;
290 out.w = pix1.w + pix2.w;
294 template<
typename Tin,
typename Tout>
static __host__ __device__ Tout _pixAdd(Tout &pix1, Tin &pix2)
300 template<
typename Tin,
typename Tout, Ncv32u CN>
struct __pixDist_CN {
static __host__ __device__ Tout
_pixDist_CN(Tin &pix1, Tin &pix2);};
302 template<
typename Tin,
typename Tout>
struct __pixDist_CN<Tin, Tout, 1> {
305 return Tout(SQR(pix1.x - pix2.x));
308 template<
typename Tin,
typename Tout>
struct __pixDist_CN<Tin, Tout, 3> {
311 return Tout(SQR(pix1.x - pix2.x) + SQR(pix1.y - pix2.y) + SQR(pix1.z - pix2.z));
314 template<
typename Tin,
typename Tout>
struct __pixDist_CN<Tin, Tout, 4> {
317 return Tout(SQR(pix1.x - pix2.x) + SQR(pix1.y - pix2.y) + SQR(pix1.z - pix2.z) + SQR(pix1.w - pix2.w));
320 template<
typename Tin,
typename Tout>
static __host__ __device__ Tout _pixDist(Tin &pix1, Tin &pix2)
348 #endif //_ncv_pixel_operations_hpp_
static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2)
static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2)
static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2)
static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix)
static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2)
static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w)
static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2)
static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix)
static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2)
static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix)
static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix)
static __host__ __device__ Tout _pixDemoteClampZ_CN(Tin &pix)
static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w)
static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w)
static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix)
static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix)
static __host__ __device__ Tout _pixDemoteClampNN_CN(Tin &pix)
static __host__ __device__ Tout _pixDist_CN(Tin &pix1, Tin &pix2)
static __host__ __device__ Tout _pixScale_CN(Tin &pix, Tw w)
static __host__ __device__ Tout _pixAdd_CN(Tout &pix1, Tin &pix2)