提交 6a3d5a13 编写于 作者: I Ilya Lavrenov

reorganized the resize algorithm

上级 f0598993
...@@ -1399,40 +1399,21 @@ struct DecimateAlpha ...@@ -1399,40 +1399,21 @@ struct DecimateAlpha
float alpha; float alpha;
}; };
#ifdef __APPLE__
#define HAVE_GCD
#elif defined _MSC_VER && _MSC_VER >= 1600
#define HAVE_CONCURRENCY
#endif
#if defined(HAVE_TBB) || defined(HAVE_OPENMP) || defined(HAVE_GCD) || defined(HAVE_CONCURRENCY)
#define HAVE_PARALLEL
#endif
template <typename T, typename WT> template <typename T, typename WT>
class resizeArea_Invoker : class resizeArea_Invoker :
public ParallelLoopBody public ParallelLoopBody
{ {
public: public:
resizeArea_Invoker(const Mat& _src, Mat& _dst, const DecimateAlpha* _xofs, resizeArea_Invoker(const Mat& _src, Mat& _dst, const DecimateAlpha* _xofs,
int _xofs_count, double _scale_y_ int _xofs_count, double _scale_y_, const int* _cur_dy_ofs,
#ifdef HAVE_PARALLEL const std::vector<std::pair<int, int> >& _bands) :
, const int* _cur_dy_ofs, const std::vector<std::pair<int, int> >& _bands
#endif
) :
ParallelLoopBody(), src(_src), dst(_dst), xofs(_xofs), ParallelLoopBody(), src(_src), dst(_dst), xofs(_xofs),
xofs_count(_xofs_count), scale_y_(_scale_y_) xofs_count(_xofs_count), scale_y_(_scale_y_),
#ifdef HAVE_PARALLEL cur_dy_ofs(_cur_dy_ofs), bands(_bands)
, cur_dy_ofs(_cur_dy_ofs), bands(_bands)
#endif
{ {
} }
#ifdef HAVE_PARALLEL
void resize_signle_band(const Range& range) const void resize_signle_band(const Range& range) const
#else
virtual void operator() (const Range& range) const
#endif
{ {
Size ssize = src.size(), dsize = dst.size(); Size ssize = src.size(), dsize = dst.size();
int cn = src.channels(); int cn = src.channels();
...@@ -1446,9 +1427,7 @@ public: ...@@ -1446,9 +1427,7 @@ public:
for( dx = 0; dx < dsize.width; dx++ ) for( dx = 0; dx < dsize.width; dx++ )
buf[dx] = sum[dx] = 0; buf[dx] = sum[dx] = 0;
#ifdef HAVE_PARALLEL
cur_dy = cur_dy_ofs[range.start]; cur_dy = cur_dy_ofs[range.start];
#endif
for (sy = range.start; sy < range.end; sy++) for (sy = range.start; sy < range.end; sy++)
{ {
const T* S = (const T*)(src.data + src.step*sy); const T* S = (const T*)(src.data + src.step*sy);
...@@ -1536,7 +1515,6 @@ public: ...@@ -1536,7 +1515,6 @@ public:
} }
} }
#ifdef HAVE_PARALLEL
virtual void operator() (const Range& range) const virtual void operator() (const Range& range) const
{ {
for (int i = range.start; i < range.end; ++i) for (int i = range.start; i < range.end; ++i)
...@@ -1545,7 +1523,6 @@ public: ...@@ -1545,7 +1523,6 @@ public:
resize_signle_band(band_range); resize_signle_band(band_range);
} }
} }
#endif
private: private:
const Mat src; const Mat src;
...@@ -1553,10 +1530,9 @@ private: ...@@ -1553,10 +1530,9 @@ private:
const DecimateAlpha* xofs; const DecimateAlpha* xofs;
const int xofs_count; const int xofs_count;
const double scale_y_; const double scale_y_;
#ifdef HAVE_PARALLEL
const int *cur_dy_ofs; const int *cur_dy_ofs;
std::vector<std::pair<int, int> > bands; std::vector<std::pair<int, int> > bands;
#endif
resizeArea_Invoker(const resizeArea_Invoker&); resizeArea_Invoker(const resizeArea_Invoker&);
resizeArea_Invoker& operator=(const resizeArea_Invoker&); resizeArea_Invoker& operator=(const resizeArea_Invoker&);
}; };
...@@ -1564,15 +1540,12 @@ private: ...@@ -1564,15 +1540,12 @@ private:
template <typename T, typename WT> template <typename T, typename WT>
static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, int xofs_count, double scale_y_) static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, int xofs_count, double scale_y_)
{ {
#ifdef HAVE_PARALLEL
Size ssize = src.size(), dsize = dst.size(); Size ssize = src.size(), dsize = dst.size();
AutoBuffer<int> _yofs(ssize.height); AutoBuffer<int> _yofs(ssize.height);
int *cur_dy_ofs = _yofs; int *cur_dy_ofs = _yofs;
int cur_dy = 0, index = 0; int cur_dy = 0, index = 0;
std::vector<std::pair<int, int> > bands; std::vector<std::pair<int, int> > bands;
// cur_dy_ofs - dy for the current sy
for (int sy = 0; sy < ssize.height; sy++) for (int sy = 0; sy < ssize.height; sy++)
{ {
cur_dy_ofs[sy] = cur_dy; cur_dy_ofs[sy] = cur_dy;
...@@ -1590,15 +1563,9 @@ static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, in ...@@ -1590,15 +1563,9 @@ static void resizeArea_( const Mat& src, Mat& dst, const DecimateAlpha* xofs, in
cur_dy++; cur_dy++;
} }
} }
#endif
#ifdef HAVE_PARALLEL
Range range(0, bands.size()); Range range(0, bands.size());
resizeArea_Invoker<T, WT> invoker(src, dst, xofs, xofs_count, scale_y_, cur_dy_ofs, bands); resizeArea_Invoker<T, WT> invoker(src, dst, xofs, xofs_count, scale_y_, cur_dy_ofs, bands);
#else
Range range(0, src.rows);
resizeArea_Invoker<T, WT> invoker(src, dst, xofs, xofs_count, scale_y_);
#endif
parallel_for_(range, invoker); parallel_for_(range, invoker);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册