BitmapImage clVflip(ClCmdQueue& queue, cl::KernelFunctor& vflip, BitmapImage& srcImg) throw (cl::Error) { BitmapImage outImg = srcImg; // Create the input, output image, and filter buffers! cl::Image2D srcBuf = queue.makeImage(srcImg.getRow(0), srcImg.getWidth(), srcImg.getHeight(), queue.ROFlags); cl::Image2D outBuf = queue.makeImage(outImg.getRow(0), outImg.getWidth(), outImg.getHeight(), queue.WOFlags); // Setup sampler for source image to control sampler cl::Sampler sampler(queue.getContext(), CL_FALSE, CL_ADDRESS_CLAMP, CL_FILTER_NEAREST); // Now use the OpenCl kernel to perform convolution vflip(srcBuf, outBuf, srcImg.getWidth(), srcImg.getHeight(), sampler); // Copy result image back from the device to host. queue.enqueueMapImage(outBuf); // Return the resulting image back to the caller. return outImg; }
BitmapImage clRotate(ClCmdQueue& queue, cl::KernelFunctor& vrotate, BitmapImage& srcImg, float theta) throw (cl::Error) { // Create a new bitmap and scale it BitmapImage outImg = srcImg; float imgMax = sqrt(pow(srcImg.getWidth(),2) + pow(srcImg.getHeight(),2)); outImg.resize(imgMax, imgMax); // Create the input, output image, and filter buffers! cl::Image2D srcBuf = queue.makeImage(srcImg.getRow(0), srcImg.getWidth(), srcImg.getHeight(), queue.ROFlags); cl::Image2D outBuf = queue.makeImage(outImg.getRow(0), outImg.getWidth(), outImg.getHeight(), queue.WOFlags); // Setup sampler for source image to control sampler cl::Sampler sampler(queue.getContext(), CL_FALSE, CL_ADDRESS_CLAMP, CL_FILTER_NEAREST); // Now use the OpenCl kernel to perform convolution vrotate(srcBuf, outBuf, outImg.getWidth(), outImg.getHeight(), sampler, (float)cos(theta), (float)sin(theta)); // Copy result image back from the device to host. queue.enqueueMapImage(outBuf); // Return the resulting image back to the caller. return outImg; }