Пример #1
0
bool
DeepData::copy_deep_pixel (int pixel, const DeepData &src, int srcpixel)
{
    if (pixel < 0 || pixel >= pixels()) {
        // std::cout << "dst pixel was " << pixel << "\n";
        DASSERT (0 && "Out of range pixel index");
        return false;
    }
    if (srcpixel < 0 || srcpixel >= src.pixels()) {
        // Copying empty pixel -- set samples to 0 and we're done
        // std::cout << "Source pixel was " << srcpixel << "\n";
        set_samples (pixel, 0);
        return true;
    }
    int nchans = channels();
    if (nchans != src.channels()) {
        DASSERT (0 && "Number of channels don't match.");
        return false;
    }
    int nsamples = src.samples(srcpixel);
    set_samples (pixel, nsamples);
    if (nsamples == 0)
        return true;
    bool sametypes = samplesize() == src.samplesize();
    if (sametypes)
        for (int c = 0; c < nchans; ++c)
            sametypes &= (channeltype(c) == src.channeltype(c));
    if (sametypes)
        memcpy (data_ptr (pixel, 0, 0), src.data_ptr (srcpixel, 0, 0),
                samplesize()*nsamples);
    else {
        for (int c = 0; c < nchans; ++c) {
            if (channeltype(c) == TypeDesc::UINT32 && src.channeltype(c) == TypeDesc::UINT32)
                for (int s = 0; s < nsamples; ++s)
                    set_deep_value (pixel, c, s,
                                    src.deep_value_uint (srcpixel, c, s));
            else
                for (int s = 0; s < nsamples; ++s)
                    set_deep_value (pixel, c, s,
                                    src.deep_value (srcpixel, c, s));
        }
    }
    return true;
}
Пример #2
0
bool
DeepData::copy_deep_sample (int pixel, int sample,
                            const DeepData &src, int srcpixel, int srcsample)
{
    const void *srcdata = src.data_ptr (srcpixel, 0, srcsample);
    int nchans = channels();
    if (! srcdata || nchans != src.channels())
        return false;
    int nsamples = src.samples(srcpixel);
    set_samples (pixel, std::max (samples(pixel), nsamples));
    for (int c = 0; c < m_nchannels; ++c) {
        if (channeltype(c) == TypeDesc::UINT32 && src.channeltype(c) == TypeDesc::UINT32)
            set_deep_value (pixel, c, sample,
                            src.deep_value_uint (srcpixel, c, srcsample));
        else
            set_deep_value (pixel, c, sample,
                            src.deep_value (srcpixel, c, srcsample));
    }
    return true;
}