source: 3DVCSoftware/branches/0.1-poznan-univ/source/Lib/TLibRenderer/TRenImagePlane.cpp @ 47

Last change on this file since 47 was 2, checked in by hhi, 13 years ago

inital import

  • Property svn:eol-style set to native
File size: 11.8 KB
Line 
1
2
3#include "TRenImagePlane.h"
4#include "TRenFilter.h"
5/////// TRenImagePlane ///////
6
7template<class T>
8TRenImagePlane<T>::TRenImagePlane() { m_bClean = true; }
9
10template<class T>
11TRenImagePlane<T>::TRenImagePlane(UInt uiWidth, UInt uiHeight, UInt uiPad)
12: m_uiWidth(uiWidth), m_uiHeight(uiHeight), m_uiStride(uiWidth+2*uiPad), m_uiWidthOrg(uiWidth+2*uiPad), m_uiHeightOrg(uiHeight+2*uiPad), m_uiPad(uiPad)
13{
14  m_pcDataOrg = new T[ m_uiWidthOrg * m_uiHeightOrg ];
15  m_pcData    = m_pcDataOrg + m_uiPad * m_uiStride + m_uiPad;
16  m_bClean    = true;
17}
18
19template<class T>
20TRenImagePlane<T>::TRenImagePlane(TRenImagePlane* pcPlane)
21: m_uiWidth   (pcPlane->getWidth   ())
22, m_uiHeight  (pcPlane->getHeight  ())
23, m_uiStride  (pcPlane->getStride  ())
24, m_uiWidthOrg(pcPlane->getWidthOrg())
25, m_uiHeightOrg(pcPlane->getHeightOrg())
26, m_uiPad     (pcPlane->getPad     ())
27{
28  m_pcData = new T[m_uiWidthOrg*m_uiHeightOrg];
29  m_bClean = true;
30  assign( pcPlane );
31}
32
33template<typename T>
34TRenImagePlane<T>::TRenImagePlane( T* pcDataOrg, UInt uiWidthOrg, UInt uiHeightOrg, UInt uiStride, UInt uiPad )
35: m_pcData     (pcDataOrg + uiStride * uiPad + uiPad )
36, m_uiWidth    (uiWidthOrg  - 2* uiPad )
37, m_uiHeight   (uiHeightOrg - 2* uiPad )
38, m_uiStride   (uiStride   )
39, m_pcDataOrg  (pcDataOrg  )
40, m_uiWidthOrg (uiWidthOrg )
41, m_uiHeightOrg(uiHeightOrg)
42, m_uiPad      (uiPad      )
43, m_bClean     (false      )
44{
45
46}
47
48template<typename T>
49Void TRenImagePlane<T>::setData( T* pDataOrg, UInt uiWidthOrg, UInt uiHeightOrg, UInt uiStride, UInt uiPad, Bool bClean /*= false*/ )
50{
51  deleteData();
52  m_uiPad       = uiPad;
53  m_pcDataOrg   = pDataOrg;
54  m_uiWidthOrg  = uiWidthOrg;
55  m_uiHeightOrg = uiHeightOrg;
56  m_uiWidth     = uiWidthOrg  - 2* uiPad;
57  m_uiHeight    = uiHeightOrg - 2* uiPad;
58  m_uiStride    = uiStride;
59  m_pcData      = m_pcDataOrg + uiPad * m_uiStride + uiPad;
60  m_bClean      = bClean;
61}
62
63template<typename T>
64Void TRenImagePlane<T>::setData( TRenImagePlane<T>* pcInPlane, Bool bClean )
65{
66  deleteData();
67  m_uiPad       = pcInPlane->getPad();
68  m_pcDataOrg   = pcInPlane->getPlaneDataOrg();
69  m_uiWidthOrg  = pcInPlane->getWidthOrg();
70  m_uiHeightOrg = pcInPlane->getHeightOrg();
71  m_uiWidth     = pcInPlane->getWidth();
72  m_uiHeight    = pcInPlane->getHeight();
73  m_uiStride    = pcInPlane->getStride();
74  m_pcData      = pcInPlane->getPlaneData();
75  m_bClean      = bClean;
76  pcInPlane->setClean( !m_bClean );
77}
78
79template<typename T>
80Void TRenImagePlane<T>::setClean( Bool bClean )
81{
82  m_bClean = bClean;
83}
84
85template<class T>
86T* TRenImagePlane<T>::getPlaneData()
87{
88  return m_pcData;
89}
90
91
92template<class T>
93T* TRenImagePlane<T>::getPlaneDataOrg()
94{
95  return m_pcDataOrg;
96}
97
98
99template<class T>
100Void TRenImagePlane<T>::assign(Pel* pcSourceData, UInt uiSourceStride )
101{
102  T* pcTargetData = m_pcDataOrg;
103  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
104  {
105    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
106    {
107      pcTargetData[uiXPos] = (T) pcSourceData[uiXPos];
108    }
109    pcTargetData += m_uiStride;
110    pcSourceData += uiSourceStride;
111  }
112}
113
114template<class T>
115Void TRenImagePlane<T>::assign(Pel cData)
116{
117  T* pcTargetData = m_pcDataOrg;
118  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
119  {
120    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
121    {
122      pcTargetData[uiXPos] = (T) cData;
123    }
124    pcTargetData  += m_uiStride;
125  }
126}
127
128template<class T>
129Void TRenImagePlane<T>::assign(Double* pdData, UInt uiSourceStride )
130{
131  T* pcTargetData = m_pcDataOrg;
132  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
133  {
134    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
135    {
136      pcTargetData[uiXPos] = (T) pdData[uiXPos];
137    }
138    pcTargetData += m_uiStride;
139    pdData       +=  uiSourceStride;
140
141  }
142}
143
144template<class T>
145Void TRenImagePlane<T>::assign(Double dData)
146{
147  T* pcTargetData = m_pcDataOrg;
148  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
149  {
150    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
151    {
152      pcTargetData[uiXPos] = (T) dData;
153    }
154    pcTargetData  += m_uiStride;
155  }
156}
157
158
159template<class T>
160Void TRenImagePlane<T>::assign(Bool* pbData, UInt uiSourceStride )
161{
162  T* pcTargetData = m_pcDataOrg;
163  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
164  {
165    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
166    {
167      pcTargetData[uiXPos] = (T) pbData[uiXPos];
168    }
169    pcTargetData += m_uiStride;
170    pbData       += uiSourceStride;
171  }
172}
173
174template<class T>
175Void TRenImagePlane<T>::assign(Int iData)
176{
177  T* pcTargetData = m_pcDataOrg;
178  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
179  {
180    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
181    {
182      pcTargetData[uiXPos] = (T) iData;
183    }
184    pcTargetData += m_uiStride;
185  }
186}
187
188template<class T>
189Void TRenImagePlane<T>::assign(Int* piData, UInt uiSourceStride )
190{
191  T* pcTargetData = m_pcDataOrg;
192  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
193  {
194    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
195    {
196      pcTargetData[uiXPos] = (T) piData[uiXPos];
197    }
198    pcTargetData += m_uiStride;
199    piData       += uiSourceStride;
200  }
201}
202
203template<class T>
204Void TRenImagePlane<T>::assign(Bool data)
205{
206  T* pcTargetData = m_pcDataOrg;
207  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
208  {
209    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
210    {
211      pcTargetData[uiXPos] = (T) data;
212    }
213    pcTargetData += m_uiStride;
214  }
215}
216
217// Assignments to Bool
218
219template<>
220Void TRenImagePlane<Bool>::assign(Int* piData, UInt uiSourceStride )
221{
222  Bool* pcTargetData = m_pcDataOrg;
223  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
224  {
225    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
226    {
227      pcTargetData[uiXPos] = (piData[uiXPos] == 0);
228    }
229    pcTargetData  += m_uiStride;
230    piData        += uiSourceStride;
231
232  }
233}
234
235template<>
236Void TRenImagePlane<Bool>::assign(Int iData)
237{
238  Bool* pcTargetData = m_pcDataOrg;
239  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
240  {
241    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
242    {
243      pcTargetData[uiXPos] = (iData == 0);
244    }
245    pcTargetData += m_uiStride;
246  }
247}
248
249template<>
250Void TRenImagePlane<Bool>::assign(Pel* pcData, UInt uiSourceStride )
251{
252  Bool* pcTargetData = m_pcDataOrg;
253  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
254  {
255    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
256    {
257      pcTargetData[uiXPos] = (pcData[uiXPos] == 0);
258    }
259    pcTargetData += m_uiStride;
260    pcData       +=  uiSourceStride;
261
262  }
263}
264
265template<>
266Void TRenImagePlane<Bool>::assign(Pel cData)
267{
268  Bool* pcTargetData = m_pcDataOrg;
269  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
270  {
271    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
272    {
273      pcTargetData[uiXPos] = (cData == 0);
274    }
275    pcTargetData += m_uiStride;
276  }
277}
278
279template<>
280Void TRenImagePlane<Bool>::assign(Double* pdData, UInt uiSourceStride )
281{
282  Bool* pcTargetData = m_pcDataOrg;
283  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
284  {
285    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
286    {
287      pcTargetData[uiXPos] = ( pdData[uiXPos] == 0);
288    }
289    pcTargetData += m_uiStride;
290    pdData       += uiSourceStride;
291
292  }
293}
294
295
296
297template<>
298Void TRenImagePlane<Bool>::assign(Double dData)
299{
300  Bool* pcTargetData = m_pcDataOrg;
301  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
302  {
303    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
304    {
305      pcTargetData [uiXPos] = (dData == 0);
306    }
307    pcTargetData  += m_uiStride;
308  }
309}
310
311
312// Assignments to Pel
313template<>
314Void TRenImagePlane<Pel>::assign(Double* pdData, UInt uiSourceStride )
315{
316  Pel* pcTargetData = m_pcDataOrg;
317  for (UInt uiYPos = 0; uiYPos < m_uiHeightOrg; uiYPos++)
318  {
319    for (UInt uiXPos = 0; uiXPos < m_uiWidthOrg; uiXPos++)
320    {
321      pcTargetData[uiXPos] = (Pel) ( pdData[uiXPos] + pdData[uiXPos] < 0 ? -0.5 : 0.5 ) ;
322    }
323    pcTargetData += m_uiStride;
324    pdData       += uiSourceStride;
325  }
326}
327
328template<class T>
329Void TRenImagePlane<T>::assign(TRenImagePlane<T>* pcPlane)
330{
331  assign(pcPlane->getPlaneDataOrg(), pcPlane->getStride());
332}
333
334template<class T>
335Void TRenImagePlane<T>::assign(TRenImagePlane<T>* pcPlane, UInt uiRow, UInt uiStartOffset, UInt uiEndOffset)
336{
337  T* pcTargetData = m_pcData                + uiRow * m_uiStride;
338  T* pcSourceData = pcPlane->getPlaneData() + uiRow * pcPlane->getStride();
339
340  for (UInt uiPosX = uiStartOffset; uiPosX <= uiEndOffset; uiPosX++)
341  {
342    pcTargetData[uiPosX] = pcSourceData[uiPosX];
343  }
344
345}
346
347template<class T>
348Void TRenImagePlane<T>::assign(TRenImagePlane<T>* pcSourcePlane, UInt uiSourceRowStart, UInt uiSourceColStart, UInt uiWidth, UInt uiHeight)
349{
350  T* acSourceData;
351  T* acDestData;
352
353  acSourceData = pcSourcePlane->getPlaneData();
354  acSourceData += uiSourceRowStart * pcSourcePlane->getStride() + uiSourceColStart;
355  acDestData    = m_pcData;
356
357  for (UInt uiPosY = 0; uiPosY < uiHeight ; uiPosY++)
358  {
359    for (UInt uiPosX = 0; uiPosX < uiWidth ; uiPosX++)
360    {
361      acDestData[uiPosX] = acSourceData[uiPosX];
362    }
363    acSourceData += pcSourcePlane->getStride();
364    acDestData   += this        ->getStride();
365  };
366}
367
368
369
370template<class T>
371Void TRenImagePlane<T>::assign( T data , UInt uiRow, UInt uiStartOffset, UInt uiEndOffset)
372{
373  T* pcTargetData = m_pcData + uiRow * m_uiStride;
374  for (UInt uiPosX = uiStartOffset; uiPosX <= uiEndOffset; uiPosX++)
375  {
376    pcTargetData[uiPosX] = data;
377  }
378}
379
380
381template<class T>
382Void TRenImagePlane<T>::devide( Double dDevisor )
383{
384  T* pcTargetData = m_pcDataOrg;
385  for (UInt uiPosY = 0; uiPosY < (m_uiHeightOrg); uiPosY++)
386  {
387    for (UInt uiPosX = 0; uiPosX < m_uiWidthOrg; uiPosX++)
388    {
389      pcTargetData[uiPosX] = (T)  ( ( Double )pcTargetData[uiPosX] / dDevisor );
390    }
391    pcTargetData += m_uiStride;
392  }
393};
394
395template<class T>
396Void TRenImagePlane<T>::multiply( Double dMultiplier ) {
397  T* pcTargetData = m_pcDataOrg;
398  for (UInt uiPosY = 0; uiPosY < (m_uiHeightOrg); uiPosY++)
399  {
400    for (UInt uiPosX = 0; uiPosX < m_uiWidthOrg; uiPosX++)
401    {
402      pcTargetData[uiPosX] = (T)  ( ( Double )pcTargetData[uiPosX] * dMultiplier );
403    }
404    pcTargetData += m_uiStride;
405  }
406};
407
408
409template<>
410Void TRenImagePlane<Bool>::devide( Double dDevisor )
411{
412  assert(0);
413};
414
415template<>
416Void TRenImagePlane<Bool>::multiply( Double dMultiplier )
417{
418  assert(0);
419};
420
421
422template<class T>
423Void TRenImagePlane<T>::deleteData()
424{
425  if (m_bClean)
426  {
427    if (m_pcDataOrg)
428    {
429      delete[] m_pcDataOrg;
430    };
431  }
432}
433
434template<class T>
435TRenImagePlane<T>::~TRenImagePlane()
436{
437  deleteData();
438}
439
440
441template<typename T>
442Void TRenImagePlane<T>::extendMargin()
443{
444  Int iPad = (Int) m_uiPad;
445  T* pcData = m_pcData;
446
447  for ( Int iPosY = 0; iPosY < (Int) m_uiHeight; iPosY++)
448  {
449    for ( Int iPosX = 0; iPosX < (Int) iPad; iPosX++ )
450    {
451      pcData[ -iPad + iPosX ]  = pcData[0];
452      pcData[m_uiWidth + iPosX ]  = pcData[m_uiWidth -1 ];
453    }
454    pcData += m_uiStride;
455  }
456
457
458  pcData -= (m_uiStride + iPad);
459  for ( Int iPosY = 0; iPosY < iPad; iPosY++ )
460  {
461    ::memcpy( pcData + (iPosY+1)*m_uiStride, pcData, sizeof(T)*(m_uiWidth + (iPad<<1)) );
462  }
463
464  pcData -= ((m_uiHeight-1) * m_uiStride);
465  for ( Int iPosY = 0; iPosY < iPad; iPosY++ )
466  {
467    ::memcpy( pcData - (iPosY+1)*m_uiStride, pcData, sizeof(T)*(m_uiWidth + (iPad<<1)) );
468  }
469}
470
471template class TRenImagePlane<Pel>;
472template class TRenImagePlane<Double>;
473template class TRenImagePlane<Bool>;
474template class TRenImagePlane<Int>;
475
476/////// TRenImagePlanePart ///////
477
478template<typename T>
479TRenImagePlanePart<T>::TRenImagePlanePart( TRenImagePlane<T>* pPlane, UInt uHorOff, UInt uVerOff, UInt uWidth, UInt uHeight )
480: TRenImagePlane<T>( pPlane->getPlaneData() + uHorOff + uVerOff * pPlane->getStride(), uWidth, uHeight, pPlane->getStride(),0)
481{
482
483}
484
485template<typename T>
486TRenImagePlanePart<T>::~TRenImagePlanePart()
487{
488  this->m_pcData = NULL;
489}
490
491template class TRenImagePlanePart<Pel>;
492template class TRenImagePlanePart<Double>;
493template class TRenImagePlanePart<Bool>;
494template class TRenImagePlanePart<Int>;
Note: See TracBrowser for help on using the repository browser.