本文整理汇总了C++中imagebuf::ConstIterator::done方法的典型用法代码示例。如果您正苦于以下问题:C++ ConstIterator::done方法的具体用法?C++ ConstIterator::done怎么用?C++ ConstIterator::done使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类imagebuf::ConstIterator
的用法示例。
在下文中一共展示了ConstIterator::done方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: a
static bool
compare_ (const ImageBuf &A, const ImageBuf &B,
float failthresh, float warnthresh,
ImageBufAlgo::CompareResults &result,
ROI roi, int nthreads)
{
imagesize_t npels = roi.npixels();
imagesize_t nvals = npels * roi.nchannels();
int Achannels = A.nchannels(), Bchannels = B.nchannels();
// Compare the two images.
//
double totalerror = 0;
double totalsqrerror = 0;
result.maxerror = 0;
result.maxx=0, result.maxy=0, result.maxz=0, result.maxc=0;
result.nfail = 0, result.nwarn = 0;
float maxval = 1.0; // max possible value
ImageBuf::ConstIterator<Atype> a (A, roi, ImageBuf::WrapBlack);
ImageBuf::ConstIterator<Btype> b (B, roi, ImageBuf::WrapBlack);
bool deep = A.deep();
// Break up into batches to reduce cancelation errors as the error
// sums become too much larger than the error for individual pixels.
const int batchsize = 4096; // As good a guess as any
for ( ; ! a.done(); ) {
double batcherror = 0;
double batch_sqrerror = 0;
if (deep) {
for (int i = 0; i < batchsize && !a.done(); ++i, ++a, ++b) {
bool warned = false, failed = false; // For this pixel
for (int c = roi.chbegin; c < roi.chend; ++c)
for (int s = 0, e = a.deep_samples(); s < e; ++s) {
compare_value (a, c, a.deep_value(c,s),
b.deep_value(c,s), result, maxval,
batcherror, batch_sqrerror,
failed, warned, failthresh, warnthresh);
}
}
} else { // non-deep
for (int i = 0; i < batchsize && !a.done(); ++i, ++a, ++b) {
bool warned = false, failed = false; // For this pixel
for (int c = roi.chbegin; c < roi.chend; ++c)
compare_value (a, c, c < Achannels ? a[c] : 0.0f,
c < Bchannels ? b[c] : 0.0f,
result, maxval, batcherror, batch_sqrerror,
failed, warned, failthresh, warnthresh);
}
}
totalerror += batcherror;
totalsqrerror += batch_sqrerror;
}
result.meanerror = totalerror / nvals;
result.rms_error = sqrt (totalsqrerror / nvals);
result.PSNR = 20.0 * log10 (maxval / result.rms_error);
return result.nfail == 0;
}
示例2: constval
static inline bool
isConstantColor_ (const ImageBuf &src, float *color,
ROI roi, int nthreads)
{
// Iterate using the native typing (for speed).
std::vector<T> constval (roi.nchannels());
ImageBuf::ConstIterator<T,T> s (src, roi);
for (int c = roi.chbegin; c < roi.chend; ++c)
constval[c] = s[c];
// Loop over all pixels ...
for ( ; ! s.done(); ++s) {
for (int c = roi.chbegin; c < roi.chend; ++c)
if (constval[c] != s[c])
return false;
}
if (color) {
ImageBuf::ConstIterator<T,float> s (src, roi);
for (int c = 0; c < roi.chbegin; ++c)
color[c] = 0.0f;
for (int c = roi.chbegin; c < roi.chend; ++c)
color[c] = s[c];
for (int c = roi.chend; c < src.nchannels(); ++c)
color[c] = 0.0f;
}
return true;
}
示例3: s
static bool
paste_ (ImageBuf &dst, ROI dstroi,
const ImageBuf &src, ROI srcroi, int nthreads)
{
// N.B. Punt on parallelizing because of the subtle interplay
// between srcroi and dstroi, the parallel_image idiom doesn't
// handle that especially well. And it's not worth customizing for
// this function which is inexpensive and not commonly used, and so
// would benefit little from parallelizing. We can always revisit
// this later. But in the mean time, we maintain the 'nthreads'
// parameter for uniformity with the rest of IBA.
int src_nchans = src.nchannels ();
int dst_nchans = dst.nchannels ();
ImageBuf::ConstIterator<S,D> s (src, srcroi);
ImageBuf::Iterator<D,D> d (dst, dstroi);
for ( ; ! s.done(); ++s, ++d) {
if (! d.exists())
continue; // Skip paste-into pixels that don't overlap dst's data
for (int c = srcroi.chbegin, c_dst = dstroi.chbegin;
c < srcroi.chend; ++c, ++c_dst) {
if (c_dst >= 0 && c_dst < dst_nchans)
d[c_dst] = c < src_nchans ? s[c] : D(0);
}
}
return true;
}
示例4: s
static bool
circular_shift_ (ImageBuf &dst, const ImageBuf &src,
int xshift, int yshift, int zshift,
ROI dstroi, ROI roi, int nthreads)
{
if (nthreads != 1 && roi.npixels() >= 1000) {
// Possible multiple thread case -- recurse via parallel_image
ImageBufAlgo::parallel_image (
boost::bind(circular_shift_<DSTTYPE,SRCTYPE>,
boost::ref(dst), boost::cref(src),
xshift, yshift, zshift,
dstroi, _1 /*roi*/, 1 /*nthreads*/),
roi, nthreads);
return true;
}
// Serial case
int width = dstroi.width(), height = dstroi.height(), depth = dstroi.depth();
ImageBuf::ConstIterator<SRCTYPE,DSTTYPE> s (src, roi);
ImageBuf::Iterator<DSTTYPE,DSTTYPE> d (dst);
for ( ; ! s.done(); ++s) {
int dx = s.x() + xshift; OIIO::wrap_periodic (dx, dstroi.xbegin, width);
int dy = s.y() + yshift; OIIO::wrap_periodic (dy, dstroi.ybegin, height);
int dz = s.z() + zshift; OIIO::wrap_periodic (dz, dstroi.zbegin, depth);
d.pos (dx, dy, dz);
if (! d.exists())
continue;
for (int c = roi.chbegin; c < roi.chend; ++c)
d[c] = s[c];
}
return true;
}
示例5: ALLOCA
static bool
convolve_ (ImageBuf &dst, const ImageBuf &src, const ImageBuf &kernel,
bool normalize, ROI roi, int nthreads)
{
if (nthreads != 1 && roi.npixels() >= 1000) {
// Lots of pixels and request for multi threads? Parallelize.
ImageBufAlgo::parallel_image (
boost::bind(convolve_<DSTTYPE,SRCTYPE>, boost::ref(dst),
boost::cref(src), boost::cref(kernel), normalize,
_1 /*roi*/, 1 /*nthreads*/),
roi, nthreads);
return true;
}
// Serial case
float scale = 1.0f;
if (normalize) {
scale = 0.0f;
for (ImageBuf::ConstIterator<float> k (kernel); ! k.done(); ++k)
scale += k[0];
scale = 1.0f / scale;
}
float *sum = ALLOCA (float, roi.chend);
ROI kroi = get_roi (kernel.spec());
ImageBuf::Iterator<DSTTYPE> d (dst, roi);
ImageBuf::ConstIterator<SRCTYPE> s (src, roi, ImageBuf::WrapClamp);
for ( ; ! d.done(); ++d) {
for (int c = roi.chbegin; c < roi.chend; ++c)
sum[c] = 0.0f;
for (ImageBuf::ConstIterator<float> k (kernel, kroi); !k.done(); ++k) {
float kval = k[0];
s.pos (d.x() + k.x(), d.y() + k.y(), d.z() + k.z());
for (int c = roi.chbegin; c < roi.chend; ++c)
sum[c] += kval * s[c];
}
for (int c = roi.chbegin; c < roi.chend; ++c)
d[c] = scale * sum[c];
}
return true;
}
示例6: s
static bool
transpose_ (ImageBuf &dst, const ImageBuf &src,
ROI roi, int nthreads)
{
ImageBufAlgo::parallel_image (roi, nthreads, [&](ROI roi){
ImageBuf::ConstIterator<SRCTYPE,DSTTYPE> s (src, roi);
ImageBuf::Iterator<DSTTYPE,DSTTYPE> d (dst);
for ( ; ! s.done(); ++s) {
d.pos (s.y(), s.x(), s.z());
if (! d.exists())
continue;
for (int c = roi.chbegin; c < roi.chend; ++c)
d[c] = s[c];
}
});
return true;
}
示例7: sizeof
static inline void
get_pixel_channels_ (const ImageBuf &buf, int xbegin, int xend,
int ybegin, int yend, int zbegin, int zend,
int chbegin, int chend, D *r,
stride_t xstride, stride_t ystride, stride_t zstride)
{
int w = (xend-xbegin), h = (yend-ybegin);
int nchans = chend - chbegin;
ImageSpec::auto_stride (xstride, ystride, zstride, sizeof(D), nchans, w, h);
for (ImageBuf::ConstIterator<S,D> p (buf, xbegin, xend, ybegin, yend, zbegin, zend);
!p.done(); ++p) {
imagesize_t offset = (p.z()-zbegin)*zstride + (p.y()-ybegin)*ystride
+ (p.x()-xbegin)*xstride;
D *rc = (D *)((char *)r + offset);
for (int c = 0; c < nchans; ++c)
rc[c] = p[c+chbegin];
}
}
示例8: if
static bool
histogram_impl (const ImageBuf &A, int channel,
std::vector<imagesize_t> &histogram, int bins,
float min, float max, imagesize_t *submin,
imagesize_t *supermax, ROI roi)
{
// Double check A's type.
if (A.spec().format != BaseTypeFromC<Atype>::value) {
A.error ("Unsupported pixel data format '%s'", A.spec().format);
return false;
}
// Initialize.
ImageBuf::ConstIterator<Atype, float> a (A, roi);
float ratio = bins / (max-min);
int bins_minus_1 = bins-1;
bool submin_ok = submin != NULL;
bool supermax_ok = supermax != NULL;
if (submin_ok)
*submin = 0;
if (supermax_ok)
*supermax = 0;
histogram.assign(bins, 0);
// Compute histogram.
for ( ; ! a.done(); a++) {
float c = a[channel];
if (c >= min && c < max) {
// Map range min->max to 0->(bins-1).
histogram[ (int) ((c-min) * ratio) ]++;
} else if (c == max) {
histogram[bins_minus_1]++;
} else {
if (submin_ok && c < min)
(*submin)++;
else if (supermax_ok)
(*supermax)++;
}
}
return true;
}
示例9: ALLOCA
static bool
color_count_ (const ImageBuf &src, atomic_ll *count,
int ncolors, const float *color, const float *eps,
ROI roi, int nthreads)
{
if (nthreads != 1 && roi.npixels() >= 1000) {
// Lots of pixels and request for multi threads? Parallelize.
ImageBufAlgo::parallel_image (
boost::bind(color_count_<T>, boost::ref(src),
count, ncolors, color, eps,
_1 /*roi*/, 1 /*nthreads*/),
roi, nthreads);
return true;
}
// Serial case
int nchannels = src.nchannels();
long long *n = ALLOCA (long long, ncolors);
for (int col = 0; col < ncolors; ++col)
n[col] = 0;
for (ImageBuf::ConstIterator<T> p (src, roi); !p.done(); ++p) {
int coloffset = 0;
for (int col = 0; col < ncolors; ++col, coloffset += nchannels) {
int match = 1;
for (int c = roi.chbegin; c < roi.chend; ++c) {
if (fabsf(p[c] - color[coloffset+c]) > eps[c]) {
match = 0;
break;
}
}
n[col] += match;
}
}
for (int col = 0; col < ncolors; ++col)
count[col] += n[col];
return true;
}
示例10: scanline
static bool
colorconvert_impl (ImageBuf &R, const ImageBuf &A,
const ColorProcessor* processor, bool unpremult,
ROI roi, int nthreads)
{
if (nthreads != 1 && roi.npixels() >= 1000) {
// Possible multiple thread case -- recurse via parallel_image
ImageBufAlgo::parallel_image (
OIIO::bind(colorconvert_impl<Rtype,Atype>,
OIIO::ref(R), OIIO::cref(A), processor, unpremult,
_1 /*roi*/, 1 /*nthreads*/),
roi, nthreads);
return true;
}
// Serial case
int width = roi.width();
// Temporary space to hold one RGBA scanline
std::vector<float> scanline(width*4, 0.0f);
// Only process up to, and including, the first 4 channels. This
// does let us process images with fewer than 4 channels, which is
// the intent.
// FIXME: Instead of loading the first 4 channels, obey
// Rspec.alpha_channel index (but first validate that the
// index is set properly for normal formats)
int channelsToCopy = std::min (4, roi.nchannels());
// Walk through all data in our buffer. (i.e., crop or overscan)
// FIXME: What about the display window? Should this actually promote
// the datawindow to be union of data + display? This is useful if
// the color of black moves. (In which case non-zero sections should
// now be promoted). Consider the lin->log of a roto element, where
// black now moves to non-black.
float * dstPtr = NULL;
const float fltmin = std::numeric_limits<float>::min();
// If the processor has crosstalk, and we'll be using it, we should
// reset the channels to 0 before loading each scanline.
bool clearScanline = (channelsToCopy<4 &&
(processor->hasChannelCrosstalk() || unpremult));
ImageBuf::ConstIterator<Atype> a (A, roi);
ImageBuf::Iterator<Rtype> r (R, roi);
for (int k = roi.zbegin; k < roi.zend; ++k) {
for (int j = roi.ybegin; j < roi.yend; ++j) {
// Clear the scanline
if (clearScanline)
memset (&scanline[0], 0, sizeof(float)*scanline.size());
// Load the scanline
dstPtr = &scanline[0];
a.rerange (roi.xbegin, roi.xend, j, j+1, k, k+1);
for ( ; !a.done(); ++a, dstPtr += 4)
for (int c = 0; c < channelsToCopy; ++c)
dstPtr[c] = a[c];
// Optionally unpremult
if ((channelsToCopy >= 4) && unpremult) {
for (int i = 0; i < width; ++i) {
float alpha = scanline[4*i+3];
if (alpha > fltmin) {
scanline[4*i+0] /= alpha;
scanline[4*i+1] /= alpha;
scanline[4*i+2] /= alpha;
}
}
}
// Apply the color transformation in place
processor->apply (&scanline[0], width, 1, 4,
sizeof(float), 4*sizeof(float),
width*4*sizeof(float));
// Optionally premult
if ((channelsToCopy >= 4) && unpremult) {
for (int i = 0; i < width; ++i) {
float alpha = scanline[4*i+3];
if (alpha > fltmin) {
scanline[4*i+0] *= alpha;
scanline[4*i+1] *= alpha;
scanline[4*i+2] *= alpha;
}
}
}
// Store the scanline
dstPtr = &scanline[0];
r.rerange (roi.xbegin, roi.xend, j, j+1, k, k+1);
for ( ; !r.done(); ++r, dstPtr += 4)
for (int c = 0; c < channelsToCopy; ++c)
r[c] = dstPtr[c];
}
}
return true;
}
示例11: float
//.........这里部分代码省略.........
// If using separable filters, our vertical set of filter tap
// weights will be the same for the whole scanline we're on. Just
// compute and normalize them once.
float totalweight_y = 0.0f;
if (separable) {
for (int j = 0; j < ytaps; ++j) {
float w = filter->yfilt (yratio * (j-radj-(src_yf_frac-0.5f)));
yfiltval[j] = w;
totalweight_y += w;
}
for (int i = 0; i <= ytaps; ++i)
yfiltval[i] /= totalweight_y;
}
for (int x = roi.xbegin; x < roi.xend; ++x) {
float s = (x-dstfx+0.5f)*dstpixelwidth;
float src_xf = srcfx + s * srcfw;
int src_x;
float src_xf_frac = floorfrac (src_xf, &src_x);
for (int c = 0; c < nchannels; ++c)
pel[c] = 0.0f;
if (separable) {
// Cache and normalize the horizontal filter tap weights
// just once for this (x,y) position, reuse for all vertical
// taps.
float totalweight_x = 0.0f;
for (int i = 0; i < xtaps; ++i) {
float w = filter->xfilt (xratio * (i-radi-(src_xf_frac-0.5f)));
xfiltval[i] = w;
totalweight_x += w;
}
if (totalweight_x != 0.0f) {
for (int i = 0; i < xtaps; ++i) // normalize x filter
xfiltval[i] /= totalweight_x; // weights
ImageBuf::ConstIterator<SRCTYPE> srcpel (src, src_x-radi, src_x+radi+1,
src_y-radj, src_y+radj+1,
0, 1, ImageBuf::WrapClamp);
for (int j = -radj; j <= radj; ++j) {
float wy = yfiltval[j+radj];
if (wy == 0.0f) {
// 0 weight for this y tap -- move to next line
srcpel.pos (srcpel.x(), srcpel.y()+1, srcpel.z());
continue;
}
for (int i = 0; i < xtaps; ++i, ++srcpel) {
float w = wy * xfiltval[i];
for (int c = 0; c < nchannels; ++c)
pel[c] += w * srcpel[c];
}
}
}
// Copy the pixel value (already normalized) to the output.
DASSERT (out.x() == x && out.y() == y);
if (totalweight_y == 0.0f) {
// zero it out
for (int c = 0; c < nchannels; ++c)
out[c] = 0.0f;
} else {
for (int c = 0; c < nchannels; ++c)
out[c] = pel[c];
}
} else {
// Non-separable
float totalweight = 0.0f;
ImageBuf::ConstIterator<SRCTYPE> srcpel (src, src_x-radi, src_x+radi+1,
src_y-radi, src_y+radi+1,
0, 1, ImageBuf::WrapClamp);
for (int j = -radj; j <= radj; ++j) {
for (int i = -radi; i <= radi; ++i, ++srcpel) {
float w = (*filter)(xratio * (i-(src_xf_frac-0.5f)),
yratio * (j-(src_yf_frac-0.5f)));
totalweight += w;
if (w == 0.0f)
continue;
DASSERT (! srcpel.done());
for (int c = 0; c < nchannels; ++c)
pel[c] += w * srcpel[c];
}
}
DASSERT (srcpel.done());
// Rescale pel to normalize the filter and write it to the
// output image.
DASSERT (out.x() == x && out.y() == y);
if (totalweight == 0.0f) {
// zero it out
for (int c = 0; c < nchannels; ++c)
out[c] = 0.0f;
} else {
for (int c = 0; c < nchannels; ++c)
out[c] = pel[c] / totalweight;
}
}
++out;
}
}
return true;
}