1 /*M/////////////////////////////////////////////////////////////////////////////////////// 2 // 3 // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. 4 // 5 // By downloading, copying, installing or using the software you agree to this license. 6 // If you do not agree to this license, do not download, install, 7 // copy or use the software. 8 // 9 // 10 // License Agreement 11 // For Open Source Computer Vision Library 12 // 13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. 14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved. 15 // Copyright (C) 2013, OpenCV Foundation, all rights reserved. 16 // Third party copyrights are property of their respective owners. 17 // 18 // Redistribution and use in source and binary forms, with or without modification, 19 // are permitted provided that the following conditions are met: 20 // 21 // * Redistribution's of source code must retain the above copyright notice, 22 // this list of conditions and the following disclaimer. 23 // 24 // * Redistribution's in binary form must reproduce the above copyright notice, 25 // this list of conditions and the following disclaimer in the documentation 26 // and/or other materials provided with the distribution. 27 // 28 // * The name of the copyright holders may not be used to endorse or promote products 29 // derived from this software without specific prior written permission. 30 // 31 // This software is provided by the copyright holders and contributors "as is" and 32 // any express or implied warranties, including, but not limited to, the implied 33 // warranties of merchantability and fitness for a particular purpose are disclaimed. 34 // In no event shall the Intel Corporation or contributors be liable for any direct, 35 // indirect, incidental, special, exemplary, or consequential damages 36 // (including, but not limited to, procurement of substitute goods or services; 37 // loss of use, data, or profits; or business interruption) however caused 38 // and on any theory of liability, whether in contract, strict liability, 39 // or tort (including negligence or otherwise) arising in any way out of 40 // the use of this software, even if advised of the possibility of such damage. 41 // 42 //M*/ 43 44 #pragma once 45 46 #ifndef __OPENCV_CUDEV_UTIL_VEC_TRAITS_HPP__ 47 #define __OPENCV_CUDEV_UTIL_VEC_TRAITS_HPP__ 48 49 #include "../common.hpp" 50 51 namespace cv { namespace cudev { 52 53 //! @addtogroup cudev 54 //! @{ 55 56 // MakeVec 57 58 template<typename T, int CN> struct MakeVec; 59 60 #define CV_CUDEV_MAKE_VEC_INST(elem_type) \ 61 template<> struct MakeVec<elem_type, 1> { typedef elem_type type; }; \ 62 template<> struct MakeVec<elem_type, 2> { typedef elem_type ## 2 type; }; \ 63 template<> struct MakeVec<elem_type, 3> { typedef elem_type ## 3 type; }; \ 64 template<> struct MakeVec<elem_type, 4> { typedef elem_type ## 4 type; }; 65 66 CV_CUDEV_MAKE_VEC_INST(uchar) 67 CV_CUDEV_MAKE_VEC_INST(ushort) 68 CV_CUDEV_MAKE_VEC_INST(short) 69 CV_CUDEV_MAKE_VEC_INST(int) 70 CV_CUDEV_MAKE_VEC_INST(uint) 71 CV_CUDEV_MAKE_VEC_INST(float) 72 CV_CUDEV_MAKE_VEC_INST(double) 73 74 #undef CV_CUDEV_MAKE_VEC_INST 75 76 template<> struct MakeVec<schar, 1> { typedef schar type; }; 77 template<> struct MakeVec<schar, 2> { typedef char2 type; }; 78 template<> struct MakeVec<schar, 3> { typedef char3 type; }; 79 template<> struct MakeVec<schar, 4> { typedef char4 type; }; 80 81 template<> struct MakeVec<bool, 1> { typedef uchar type; }; 82 template<> struct MakeVec<bool, 2> { typedef uchar2 type; }; 83 template<> struct MakeVec<bool, 3> { typedef uchar3 type; }; 84 template<> struct MakeVec<bool, 4> { typedef uchar4 type; }; 85 86 // VecTraits 87 88 template<typename T> struct VecTraits; 89 90 #define CV_CUDEV_VEC_TRAITS_INST(type) \ 91 template <> struct VecTraits<type> \ 92 { \ 93 typedef type elem_type; \ 94 enum {cn=1}; \ 95 __host__ __device__ __forceinline__ static type all(type v) {return v;} \ 96 __host__ __device__ __forceinline__ static type make(type x) {return x;} \ 97 __host__ __device__ __forceinline__ static type make(const type* v) {return *v;} \ 98 }; \ 99 template <> struct VecTraits<type ## 1> \ 100 { \ 101 typedef type elem_type; \ 102 enum {cn=1}; \ 103 __host__ __device__ __forceinline__ static type ## 1 all(type v) {return make_ ## type ## 1(v);} \ 104 __host__ __device__ __forceinline__ static type ## 1 make(type x) {return make_ ## type ## 1(x);} \ 105 __host__ __device__ __forceinline__ static type ## 1 make(const type* v) {return make_ ## type ## 1(*v);} \ 106 }; \ 107 template <> struct VecTraits<type ## 2> \ 108 { \ 109 typedef type elem_type; \ 110 enum {cn=2}; \ 111 __host__ __device__ __forceinline__ static type ## 2 all(type v) {return make_ ## type ## 2(v, v);} \ 112 __host__ __device__ __forceinline__ static type ## 2 make(type x, type y) {return make_ ## type ## 2(x, y);} \ 113 __host__ __device__ __forceinline__ static type ## 2 make(const type* v) {return make_ ## type ## 2(v[0], v[1]);} \ 114 }; \ 115 template <> struct VecTraits<type ## 3> \ 116 { \ 117 typedef type elem_type; \ 118 enum {cn=3}; \ 119 __host__ __device__ __forceinline__ static type ## 3 all(type v) {return make_ ## type ## 3(v, v, v);} \ 120 __host__ __device__ __forceinline__ static type ## 3 make(type x, type y, type z) {return make_ ## type ## 3(x, y, z);} \ 121 __host__ __device__ __forceinline__ static type ## 3 make(const type* v) {return make_ ## type ## 3(v[0], v[1], v[2]);} \ 122 }; \ 123 template <> struct VecTraits<type ## 4> \ 124 { \ 125 typedef type elem_type; \ 126 enum {cn=4}; \ 127 __host__ __device__ __forceinline__ static type ## 4 all(type v) {return make_ ## type ## 4(v, v, v, v);} \ 128 __host__ __device__ __forceinline__ static type ## 4 make(type x, type y, type z, type w) {return make_ ## type ## 4(x, y, z, w);} \ 129 __host__ __device__ __forceinline__ static type ## 4 make(const type* v) {return make_ ## type ## 4(v[0], v[1], v[2], v[3]);} \ 130 }; 131 132 CV_CUDEV_VEC_TRAITS_INST(uchar) 133 CV_CUDEV_VEC_TRAITS_INST(ushort) 134 CV_CUDEV_VEC_TRAITS_INST(short) 135 CV_CUDEV_VEC_TRAITS_INST(int) 136 CV_CUDEV_VEC_TRAITS_INST(uint) 137 CV_CUDEV_VEC_TRAITS_INST(float) 138 CV_CUDEV_VEC_TRAITS_INST(double) 139 140 #undef CV_CUDEV_VEC_TRAITS_INST 141 142 template<> struct VecTraits<schar> 143 { 144 typedef schar elem_type; 145 enum {cn=1}; 146 __host__ __device__ __forceinline__ static schar all(schar v) {return v;} 147 __host__ __device__ __forceinline__ static schar make(schar x) {return x;} 148 __host__ __device__ __forceinline__ static schar make(const schar* x) {return *x;} 149 }; 150 template<> struct VecTraits<char1> 151 { 152 typedef schar elem_type; 153 enum {cn=1}; 154 __host__ __device__ __forceinline__ static char1 all(schar v) {return make_char1(v);} 155 __host__ __device__ __forceinline__ static char1 make(schar x) {return make_char1(x);} 156 __host__ __device__ __forceinline__ static char1 make(const schar* v) {return make_char1(v[0]);} 157 }; 158 template<> struct VecTraits<char2> 159 { 160 typedef schar elem_type; 161 enum {cn=2}; 162 __host__ __device__ __forceinline__ static char2 all(schar v) {return make_char2(v, v);} 163 __host__ __device__ __forceinline__ static char2 make(schar x, schar y) {return make_char2(x, y);} 164 __host__ __device__ __forceinline__ static char2 make(const schar* v) {return make_char2(v[0], v[1]);} 165 }; 166 template<> struct VecTraits<char3> 167 { 168 typedef schar elem_type; 169 enum {cn=3}; 170 __host__ __device__ __forceinline__ static char3 all(schar v) {return make_char3(v, v, v);} 171 __host__ __device__ __forceinline__ static char3 make(schar x, schar y, schar z) {return make_char3(x, y, z);} 172 __host__ __device__ __forceinline__ static char3 make(const schar* v) {return make_char3(v[0], v[1], v[2]);} 173 }; 174 template<> struct VecTraits<char4> 175 { 176 typedef schar elem_type; 177 enum {cn=4}; 178 __host__ __device__ __forceinline__ static char4 all(schar v) {return make_char4(v, v, v, v);} 179 __host__ __device__ __forceinline__ static char4 make(schar x, schar y, schar z, schar w) {return make_char4(x, y, z, w);} 180 __host__ __device__ __forceinline__ static char4 make(const schar* v) {return make_char4(v[0], v[1], v[2], v[3]);} 181 }; 182 183 //! @} 184 185 }} 186 187 // DataType 188 189 namespace cv { 190 191 template <> class DataType<uint> 192 { 193 public: 194 typedef uint value_type; 195 typedef value_type work_type; 196 typedef value_type channel_type; 197 typedef value_type vec_type; 198 enum { generic_type = 0, 199 depth = CV_32S, 200 channels = 1, 201 fmt = (int)'i', 202 type = CV_MAKE_TYPE(depth, channels) 203 }; 204 }; 205 206 #define CV_CUDEV_DATA_TYPE_INST(_depth_type, _channel_num) \ 207 template <> class DataType< _depth_type ## _channel_num > \ 208 { \ 209 public: \ 210 typedef _depth_type ## _channel_num value_type; \ 211 typedef value_type work_type; \ 212 typedef _depth_type channel_type; \ 213 typedef value_type vec_type; \ 214 enum { generic_type = 0, \ 215 depth = DataType<channel_type>::depth, \ 216 channels = _channel_num, \ 217 fmt = DataType<channel_type>::fmt + ((channels - 1) << 8), \ 218 type = CV_MAKE_TYPE(depth, channels) \ 219 }; \ 220 }; 221 222 CV_CUDEV_DATA_TYPE_INST(uchar, 1) 223 CV_CUDEV_DATA_TYPE_INST(uchar, 2) 224 CV_CUDEV_DATA_TYPE_INST(uchar, 3) 225 CV_CUDEV_DATA_TYPE_INST(uchar, 4) 226 227 CV_CUDEV_DATA_TYPE_INST(ushort, 1) 228 CV_CUDEV_DATA_TYPE_INST(ushort, 2) 229 CV_CUDEV_DATA_TYPE_INST(ushort, 3) 230 CV_CUDEV_DATA_TYPE_INST(ushort, 4) 231 232 CV_CUDEV_DATA_TYPE_INST(short, 1) 233 CV_CUDEV_DATA_TYPE_INST(short, 2) 234 CV_CUDEV_DATA_TYPE_INST(short, 3) 235 CV_CUDEV_DATA_TYPE_INST(short, 4) 236 237 CV_CUDEV_DATA_TYPE_INST(int, 1) 238 CV_CUDEV_DATA_TYPE_INST(int, 2) 239 CV_CUDEV_DATA_TYPE_INST(int, 3) 240 CV_CUDEV_DATA_TYPE_INST(int, 4) 241 242 CV_CUDEV_DATA_TYPE_INST(uint, 1) 243 CV_CUDEV_DATA_TYPE_INST(uint, 2) 244 CV_CUDEV_DATA_TYPE_INST(uint, 3) 245 CV_CUDEV_DATA_TYPE_INST(uint, 4) 246 247 CV_CUDEV_DATA_TYPE_INST(float, 1) 248 CV_CUDEV_DATA_TYPE_INST(float, 2) 249 CV_CUDEV_DATA_TYPE_INST(float, 3) 250 CV_CUDEV_DATA_TYPE_INST(float, 4) 251 252 CV_CUDEV_DATA_TYPE_INST(double, 1) 253 CV_CUDEV_DATA_TYPE_INST(double, 2) 254 CV_CUDEV_DATA_TYPE_INST(double, 3) 255 CV_CUDEV_DATA_TYPE_INST(double, 4) 256 257 #undef CV_CUDEV_DATA_TYPE_INST 258 259 template<> class DataType<char1> 260 { 261 public: 262 typedef char1 value_type; 263 typedef value_type work_type; 264 typedef schar channel_type; 265 typedef value_type vec_type; 266 267 enum { generic_type = 0, 268 depth = DataType<channel_type>::depth, 269 channels = 1, 270 fmt = DataType<channel_type>::fmt + ((channels - 1) << 8), 271 type = CV_MAKE_TYPE(depth, channels) 272 }; 273 }; 274 275 template<> class DataType<char2> 276 { 277 public: 278 typedef char2 value_type; 279 typedef value_type work_type; 280 typedef schar channel_type; 281 typedef value_type vec_type; 282 283 enum { generic_type = 0, 284 depth = DataType<channel_type>::depth, 285 channels = 2, 286 fmt = DataType<channel_type>::fmt + ((channels - 1) << 8), 287 type = CV_MAKE_TYPE(depth, channels) 288 }; 289 }; 290 291 template<> class DataType<char3> 292 { 293 public: 294 typedef char3 value_type; 295 typedef value_type work_type; 296 typedef schar channel_type; 297 typedef value_type vec_type; 298 299 enum { generic_type = 0, 300 depth = DataType<channel_type>::depth, 301 channels = 3, 302 fmt = DataType<channel_type>::fmt + ((channels - 1) << 8), 303 type = CV_MAKE_TYPE(depth, channels) 304 }; 305 }; 306 307 template<> class DataType<char4> 308 { 309 public: 310 typedef char4 value_type; 311 typedef value_type work_type; 312 typedef schar channel_type; 313 typedef value_type vec_type; 314 315 enum { generic_type = 0, 316 depth = DataType<channel_type>::depth, 317 channels = 4, 318 fmt = DataType<channel_type>::fmt + ((channels - 1) << 8), 319 type = CV_MAKE_TYPE(depth, channels) 320 }; 321 }; 322 323 } 324 325 #endif 326