18#include "fimCoord.hpp"
37 std::vector<T> m_image;
39 void init(
int wid,
int hgt);
40 void init(
int wid,
int hgt,T fill);
47 FimImgT() : m_width(0), m_height(0) {}
48 FimImgT(
int width,
int height) {init(width,height); }
49 FimImgT(
int width,
int height,T fill) {init(width,height,fill); }
50 void resize(uint w,uint h) {init(w,h); }
51 void resize(uint w,uint h,T fill) {init(w,h,fill); }
52 void clear() {m_width = m_height = 0; m_image.clear(); }
58 T* operator[](
size_t i) {
return &m_image[i*width()]; }
59 T
const* operator[](
size_t i)
const {
return &m_image[i*width()]; }
60 T* imageData() {
return (m_image.size() > 0) ? &m_image[0] : NULL; }
61 T
const* imageData()
const {
return (m_image.size() > 0) ? &m_image[0] : NULL; }
63 typedef typename std::vector<T>::const_iterator const_iterator;
64 typedef typename std::vector<T>::iterator iterator;
67 const_iterator begin()
const {
return m_image.begin(); }
68 const_iterator end()
const {
return m_image.end(); }
69 iterator begin() {
return m_image.begin(); }
70 iterator end() {
return m_image.end(); }
72 uint width()
const {
return m_width; }
73 uint height()
const {
return m_height; }
74 uint widthStepType()
const {
return width(); }
75 uint widthStepByte()
const {
return width() *
sizeof(T); }
76 bool imageAllocated()
const {
return (m_image.size() > 0); }
82 {
return fimRcsToOics(p,width(),height());}
89 void operator*=(T scalar);
98 void setFromShrinkInt(
const FimImgT<T>&,uint ws,uint hs);
101 bool empty()
const {
return m_width==0 || m_height==0; }
107 FGASSERT((wid > 0) && (hgt > 0));
110 m_image.resize(wid*hgt);
113void FimImgT<T>::init(
int wid,
int hgt,T fill)
115 FGASSERT((wid > 0) && (hgt > 0));
118 m_image.resize(wid*hgt,fill);
124inline FutVect2FC FimImgT<T>::rcsToOxcs(FutVect2FC pos)
const
126 return FutVect2FC((pos.x1 + 0.5f) / width(),
127 1.0f - (pos.x2 + 0.5f) / height());
130inline FutVect2FC FimImgT<T>::oxcsToRcs(FutVect2FC pos)
const
132 return FutVect2FC(width() * pos.x1 - 0.5f,
133 height() * (1.0f - pos.x2) - 0.5f);
136FimImgT<T> FimImgT<T>::operator+(
const FimImgT<T>& operand)
const
138 FGASSERT((width() == operand.width()) && (height() == operand.height()));
139 FimImgT<T> retval(width(),height());
140 for (uint ii=0; ii<m_image.size(); ii++)
141 retval.m_image[ii] = m_image[ii] + operand.m_image[ii];
145FimImgT<T> FimImgT<T>::operator-(
const FimImgT<T>& operand)
const
147 FGASSERT((width() == operand.width()) && (height() == operand.height()));
148 FimImgT<T> retval(width(),height());
149 for (uint ii=0; ii<m_image.size(); ii++)
150 retval.m_image[ii] = m_image[ii] - operand.m_image[ii];
154FimImgT<T> FimImgT<T>::operator*(T scalar)
const
156 FimImgT<T> retval(width(),height());
157 for (uint ii=0; ii<m_image.size(); ii++)
158 retval.m_image[ii] = m_image[ii] * scalar;
162void FimImgT<T>::operator*=(T scalar)
164 for (uint ii=0; ii<m_image.size(); ii++)
165 m_image[ii] *= scalar;
169void FimImgT<T>::fill(T val)
171 for (uint ii=0; ii<m_image.size(); ii++)
182FimImgT<T>::setFromShrinkInt(
183 const FimImgT<T> &src,
189 FGASSERT(width() == src.width() / sx);
190 FGASSERT(height() == src.height() / sy);
191 FGASSERT((width() > 0) && (height() > 0));
193 T
const *srcPtr = (T
const *) src.imageData();
194 T *dstPtr = (T *) imageData();
196 uint srcStep = src.widthStepType();
197 uint dstStep = widthStepType();
199 uint xd,yd,xs,ys,off;
201 invArea = 1.0 / (double)(sx * sy);
203 for (yd=0; yd<height(); yd++)
205 for (xd=0; xd<width(); xd++)
207 off = yd * sy * srcStep + xd * sx;
209 for (ys=0; ys<sy; ys++)
211 for (xs=0; xs<sx; xs++)
213 acc += srcPtr[off + xs];
219 futConvert(acc * invArea,dstPtr[xd]);
226FimImgT<T> FimImgT<T>::shrinkInt(
230 FGASSERT(imageAllocated());
234 if ((sx == 1) && (sy == 1))
237 int newWidth = m_width / sx;
238 int newHeight = m_height / sy;
240 FGASSERT(newWidth > 0);
241 FGASSERT(newHeight > 0);
243 FimImgT<T> retval(newWidth,newHeight);
245 retval.setFromShrinkInt(*
this,sx,sy);
254typedef FimImgT<uchar> FimImgUbC;
255typedef FimImgT<schar> FimImgSbC;
256typedef FimImgT<short> FimImgSsC;
257typedef FimImgT<long> FimImgSlC;
258typedef FimImgT<int> FimImgIC;
259typedef FimImgT<float> FimImgFC;
261typedef FimImgT<FimRgbaUbC> FimImgRgbaUbC;
262typedef FimImgT<FimRgbaSbC> FimImgRgbaSbC;
263typedef FimImgT<FimRgbaUsC> FimImgRgbaUsC;
264typedef FimImgT<FimRgbaSsC> FimImgRgbaSsC;
265typedef FimImgT<FimRgbaFC> FimImgRgbaFC;