bool SameType(const ImageBase& Img1, const ImageBase& Img2) { return (Img1.IsFloat() == Img2.IsFloat() && Img1.IsUnsigned() == Img2.IsUnsigned() && Img1.Depth() == Img2.Depth() && Img1.NbChannels() == Img2.NbChannels()); }
void CheckCompatibility(const ImageBase& Img1, const ImageBase& Img2) { CheckSameSize(Img1, Img2); if (Img1.IsFloat() != Img2.IsFloat()) throw cl::Error(CL_INVALID_VALUE, "Different image types used"); if (Img1.IsUnsigned() != Img2.IsUnsigned()) throw cl::Error(CL_INVALID_VALUE, "Different image types used"); }
void Integral::PrepareFor(ImageBase& Source) { ImageProgram::PrepareFor(Source); // Also build float program as we will need it GetProgram(Float).Build(); SSize VerticalImgSize = {GetNbGroupsW(Source) - 1, Source.Height()}; SSize HorizontalImgSize = {Source.Width(), GetNbGroupsH(Source) - 1}; if (VerticalImgSize.Width == 0) VerticalImgSize.Width = 1; if (HorizontalImgSize.Height == 0) HorizontalImgSize.Height = 1; // Check validity of current temp buffers if (m_VerticalJunctions != nullptr && uint(VerticalImgSize.Width) <= m_VerticalJunctions->Width() && uint(VerticalImgSize.Height) <= m_VerticalJunctions->Height() && uint(HorizontalImgSize.Width) <= m_HorizontalJunctions->Width() && uint(HorizontalImgSize.Height) <= m_HorizontalJunctions->Height() && Source.IsFloat() == m_VerticalJunctions->IsFloat()) { // Buffers are good return; } // Create buffers for temporary results m_VerticalJunctions = std::make_shared<TempImage>(*m_CL, VerticalImgSize, SImage::F32); m_HorizontalJunctions = std::make_shared<TempImage>(*m_CL, HorizontalImgSize, SImage::F32); }
void CheckNotFloat(const ImageBase& Img) { if (Img.IsFloat()) throw cl::Error(CL_INVALID_VALUE, "float image used when not allowed"); }