cgv
Loading...
Searching...
No Matches
image_view.cxx
1#include "image_view.h"
2#include <algorithm>
3
4using namespace cgv::type;
5using namespace cgv::type::info;
6
7namespace cgv {
8 namespace data {
9
10template <typename T, typename S>
11void sub_sample_2_2(const const_data_view& src, data_view& dest)
12{
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();
17
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>();
21 const T* p1 = p0+dy;
22
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 );
30 ++q;
31 ++p0;
32 ++p1;
33 }
34 p0 += dx;
35 p1 += dx;
36 }
37 p0 += 2*dy - 2*W*dx;
38 p1 += 2*dy - 2*W*dx;
39 q += Dy - W*Dx;
40 }
41}
42template <typename T>
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)
45{
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;
50 if (w == -1)
51 w = max_w;
52 if (h == -1)
53 h = max_h;
54
55 w = std::min(max_w,max_W);
56 h = std::min(max_h,max_H);
57
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;
61
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) {
68 *q = *p;
69 ++q;
70 ++p;
71 }
72 }
73 p += dy - w*dx;
74 q += Dy - w*Dx;
75 }
76}
77
78
79image_view::image_view()
80{
81}
82
83void image_view::create(const std::string& fmt_dcr, std::ptrdiff_t w, std::ptrdiff_t h)
84{
85 dv.~data_view();
86 df.set_data_format(fmt_dcr);
87 if (w != -1)
88 df.set_width(w);
89 if (h != -1)
90 df.set_height(h);
91 new (&dv) data_view(&df);
92}
93
94void* image_view::ref_void(size_t i, size_t j)
95{
96 return dv.get_ptr<unsigned char>()+dv.get_step_size(1)*i+dv.get_step_size(0)*j;
97}
98
99const void* image_view::get_void(size_t i, size_t j) const
100{
101 return dv.get_ptr<unsigned char>()+dv.get_step_size(1)*i+dv.get_step_size(0)*j;
102}
103
104void image_view::clear(double v)
105{
106 size_t n = df.get_nr_entries()*df.get_nr_components();
107 switch (df.get_component_type()) {
108 case TI_INT8 :
109 std::fill(dv.get_ptr<int8_type>(), dv.get_ptr<int8_type>()+n, (int8_type)(v*127));
110 break;
111 case TI_INT16 :
112 std::fill(dv.get_ptr<int16_type>(), dv.get_ptr<int16_type>()+n, (int16_type)(v*32767));
113 break;
114 case TI_INT32 :
115 std::fill(dv.get_ptr<int32_type>(), dv.get_ptr<int32_type>()+n, (int32_type)(v*2147483647));
116 break;
117 case TI_INT64 :
118 std::fill(dv.get_ptr<int64_type>(), dv.get_ptr<int64_type>()+n, (int64_type)(v*double(9223372036854775807)));
119 break;
120 case TI_UINT8 :
121 std::fill(dv.get_ptr<uint8_type>(), dv.get_ptr<uint8_type>()+n, (uint8_type)(v*255));
122 break;
123 case TI_UINT16 :
124 std::fill(dv.get_ptr<uint16_type>(), dv.get_ptr<uint16_type>()+n, (uint16_type)(v*65535));
125 break;
126 case TI_UINT32 :
127 std::fill(dv.get_ptr<uint32_type>(), dv.get_ptr<uint32_type>()+n, (uint32_type)(v*4294967295));
128 break;
129 case TI_UINT64 :
130 std::fill(dv.get_ptr<uint64_type>(), dv.get_ptr<uint64_type>()+n, (uint64_type)(v*double(18446744073709551615lu)));
131 break;
132 case TI_FLT32 :
133 std::fill(dv.get_ptr<flt32_type>(), dv.get_ptr<flt32_type>()+n, (flt32_type)v);
134 break;
135 case TI_FLT64 :
136 std::fill(dv.get_ptr<flt64_type>(), dv.get_ptr<flt64_type>()+n, (flt64_type)v);
137 break;
138 }
139}
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)
141{
142 switch (df.get_component_type()) {
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;
153 }
154}
155void image_view::sub_sample()
156{
157 data_format df1(df);
158 df1.set_width(df1.get_width()/2);
159 df1.set_height(df1.get_height()/2);
160 data_view dv1(&df1);
161 switch (df.get_component_type()) {
162 case TI_INT8 :
163 sub_sample_2_2<int8_type,int16_type>(const_data_view(dv),dv1);
164 break;
165 case TI_INT16 :
166 sub_sample_2_2<int16_type,int32_type>(const_data_view(dv),dv1);
167 break;
168 case TI_INT32 :
169 sub_sample_2_2<int32_type,int64_type>(const_data_view(dv),dv1);
170 break;
171 case TI_INT64 :
172 sub_sample_2_2<int64_type,int64_type>(const_data_view(dv),dv1);
173 break;
174 case TI_UINT8 :
175 sub_sample_2_2<uint8_type,uint16_type>(const_data_view(dv),dv1);
176 break;
177 case TI_UINT16 :
178 sub_sample_2_2<uint16_type,uint32_type>(const_data_view(dv),dv1);
179 break;
180 case TI_UINT32 :
181 sub_sample_2_2<uint32_type,uint64_type>(const_data_view(dv),dv1);
182 break;
183 case TI_UINT64 :
184 sub_sample_2_2<uint64_type,uint64_type>(const_data_view(dv),dv1);
185 break;
186 case TI_FLT32 :
187 sub_sample_2_2<flt32_type,flt32_type>(const_data_view(dv),dv1);
188 break;
189 case TI_FLT64 :
190 sub_sample_2_2<flt64_type,flt64_type>(const_data_view(dv),dv1);
191 break;
192 }
193 df = df1;
194 dv = dv1;
195 dv.set_format(&df);
196}
197
198 }
199}
cgv::type::info::TypeId get_component_type() const
return the component type
unsigned int get_nr_components() const
return the number of components
void set_height(size_t _height)
set the resolution in the second dimension, add dimensions if necessary
void set_width(size_t _width)
set the resolution in the first dimension, add dimensions if necessary
size_t get_nr_entries() const
return the total number of data entries
bool set_data_format(const std::string &description)
Set data format from description string, which adds information to the description string of the comp...
size_t get_step_size(unsigned int dim) const
return the step size in bytes in the i-th dimension
Definition data_view.cxx:89
void set_format(const data_format *_format)
set a new data format
Definition data_view.cxx:78
cgv::type::func::transfer_const< P, S * >::type get_ptr() const
return a data pointer to type S
Definition data_view.h:61
~data_view()
destruct view and delete data pointer if it is owned by the view
namespace for templates that provide type information
Definition type_access.h:9
@ TI_INT16
signed integer stored in 8 bits
Definition type_id.h:20
@ TI_INT8
boolean
Definition type_id.h:19
@ TI_INT32
signed integer stored in 16 bits
Definition type_id.h:21
@ TI_FLT32
floating point type stored in 16 bits
Definition type_id.h:28
@ TI_UINT32
unsigned integer stored in 16 bits
Definition type_id.h:25
@ TI_UINT8
signed integer stored in 64 bits
Definition type_id.h:23
@ TI_INT64
signed integer stored in 32 bits
Definition type_id.h:22
@ TI_UINT16
unsigned integer stored in 8 bits
Definition type_id.h:24
@ TI_FLT64
floating point type stored in 32 bits
Definition type_id.h:29
@ TI_UINT64
unsigned integer stored in 32 bits
Definition type_id.h:26
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
the cgv namespace
Definition print.h:11