10template <
typename T,
typename S>
11void sub_sample_2_2(
const const_data_view& src, data_view& dest)
13 size_t w = src.get_format()->get_width();
14 size_t h = src.get_format()->get_height();
15 size_t W = dest.get_format()->get_width();
16 size_t H = dest.get_format()->get_height();
18 size_t dx = src.get_step_size(1)/
sizeof(T);
19 size_t dy = src.get_step_size(0)/
sizeof(T);
20 const T* p0 = src.get_ptr<T>();
23 T* q = dest.get_ptr<T>();
24 size_t Dx = dest.get_step_size(1)/
sizeof(T);
25 size_t Dy = dest.get_step_size(0)/
sizeof(T);
26 for (
size_t i=0; i<H;++i) {
27 for (
size_t j=0; j<W;++j) {
28 for (
size_t k=0; k<dx; ++k) {
29 *q = (T) ( ( (S)p0[0] + p1[0] + p0[dx] + p1[dx] ) / 4 );
43void copy_sub_view(
const const_data_view& src, std::ptrdiff_t x, std::ptrdiff_t y, std::ptrdiff_t w, std::ptrdiff_t h,
44 data_view& dst, std::ptrdiff_t X, std::ptrdiff_t Y)
46 std::ptrdiff_t max_w = src.get_format()->get_width() - x;
47 std::ptrdiff_t max_h = src.get_format()->get_height() - y;
48 std::ptrdiff_t max_W = dst.get_format()->get_width() - X;
49 std::ptrdiff_t max_H = dst.get_format()->get_height() - Y;
55 w = std::min(max_w,max_W);
56 h = std::min(max_h,max_H);
58 size_t dx = src.get_step_size(1)/
sizeof(T);
59 size_t dy = src.get_step_size(0)/
sizeof(T);
60 const T* p = src.get_ptr<T>()+x*dx+y*dy;
62 size_t Dx = dst.get_step_size(1)/
sizeof(T);
63 size_t Dy = dst.get_step_size(0)/
sizeof(T);
64 T* q = dst.get_ptr<T>()+X*Dx+Y*Dy;
65 for (
size_t i=0; i<size_t(h);++i) {
66 for (
size_t j=0; j<size_t(w);++j) {
67 for (
size_t k=0; k<dx;++k) {
79image_view::image_view()
83void image_view::create(
const std::string& fmt_dcr, std::ptrdiff_t w, std::ptrdiff_t h)
91 new (&dv) data_view(&df);
94void* image_view::ref_void(
size_t i,
size_t j)
99const void* image_view::get_void(
size_t i,
size_t j)
const
104void image_view::clear(
double v)
140void image_view::copy_rectangle(
const image_view& src, std::ptrdiff_t X, std::ptrdiff_t Y, std::ptrdiff_t x, std::ptrdiff_t y, std::ptrdiff_t w, std::ptrdiff_t h)
143 case TI_INT8 : copy_sub_view<int8_type>(src.dv, x, y, w, h, dv, X, Y);
break;
144 case TI_INT16 : copy_sub_view<int16_type>(src.dv, x, y, w, h, dv, X, Y);
break;
145 case TI_INT32 : copy_sub_view<int32_type>(src.dv, x, y, w, h, dv, X, Y);
break;
146 case TI_INT64 : copy_sub_view<int64_type>(src.dv, x, y, w, h, dv, X, Y);
break;
147 case TI_UINT8 : copy_sub_view<uint8_type>(src.dv, x, y, w, h, dv, X, Y);
break;
148 case TI_UINT16 : copy_sub_view<uint16_type>(src.dv, x, y, w, h, dv, X, Y);
break;
149 case TI_UINT32 : copy_sub_view<uint32_type>(src.dv, x, y, w, h, dv, X, Y);
break;
150 case TI_UINT64 : copy_sub_view<uint64_type>(src.dv, x, y, w, h, dv, X, Y);
break;
151 case TI_FLT32 : copy_sub_view<flt32_type>(src.dv, x, y, w, h, dv, X, Y);
break;
152 case TI_FLT64 : copy_sub_view<flt64_type>(src.dv, x, y, w, h, dv, X, Y);
break;
155void image_view::sub_sample()
158 df1.set_width(df1.get_width()/2);
159 df1.set_height(df1.get_height()/2);
163 sub_sample_2_2<int8_type,int16_type>(const_data_view(dv),dv1);
166 sub_sample_2_2<int16_type,int32_type>(const_data_view(dv),dv1);
169 sub_sample_2_2<int32_type,int64_type>(const_data_view(dv),dv1);
172 sub_sample_2_2<int64_type,int64_type>(const_data_view(dv),dv1);
175 sub_sample_2_2<uint8_type,uint16_type>(const_data_view(dv),dv1);
178 sub_sample_2_2<uint16_type,uint32_type>(const_data_view(dv),dv1);
181 sub_sample_2_2<uint32_type,uint64_type>(const_data_view(dv),dv1);
184 sub_sample_2_2<uint64_type,uint64_type>(const_data_view(dv),dv1);
187 sub_sample_2_2<flt32_type,flt32_type>(const_data_view(dv),dv1);
190 sub_sample_2_2<flt64_type,flt64_type>(const_data_view(dv),dv1);
size_t get_step_size(unsigned int dim) const
return the step size in bytes in the i-th dimension
void set_format(const data_format *_format)
set a new data format
cgv::type::func::transfer_const< P, S * >::type get_ptr() const
return a data pointer to type S
~data_view()
destruct view and delete data pointer if it is owned by the view
namespace for templates that provide type information
@ TI_INT16
signed integer stored in 8 bits
@ TI_INT32
signed integer stored in 16 bits
@ TI_FLT32
floating point type stored in 16 bits
@ TI_UINT32
unsigned integer stored in 16 bits
@ TI_UINT8
signed integer stored in 64 bits
@ TI_INT64
signed integer stored in 32 bits
@ TI_UINT16
unsigned integer stored in 8 bits
@ TI_FLT64
floating point type stored in 32 bits
@ TI_UINT64
unsigned integer stored in 32 bits
namespace for compile time type information
double flt64_type
this type provides a 64 bit floating point type
signed char int8_type
this type provides an 8 bit signed integer type
int int32_type
this type provides an 32 bit signed integer type
short int16_type
this type provides an 16 bit signed integer type
unsigned short uint16_type
this type provides an 16 bit unsigned integer type
unsigned long long uint64_type
this type provides an 64 bit unsigned integer type
unsigned int uint32_type
this type provides an 32 bit unsigned integer type
long long int64_type
this type provides an 64 bit signed integer type
float flt32_type
this type provides a 32 bit floating point type
unsigned char uint8_type
this type provides an 8 bit unsigned integer type