summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/compute/example/qimage_blur.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/compute/example/qimage_blur.cpp')
-rw-r--r--src/boost/libs/compute/example/qimage_blur.cpp145
1 files changed, 145 insertions, 0 deletions
diff --git a/src/boost/libs/compute/example/qimage_blur.cpp b/src/boost/libs/compute/example/qimage_blur.cpp
new file mode 100644
index 00000000..cbfa3145
--- /dev/null
+++ b/src/boost/libs/compute/example/qimage_blur.cpp
@@ -0,0 +1,145 @@
+//---------------------------------------------------------------------------//
+// Copyright (c) 2014 Kyle Lutz <kyle.r.lutz@gmail.com>
+//
+// Distributed under the Boost Software License, Version 1.0
+// See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt
+//
+// See http://boostorg.github.com/compute for more information.
+//---------------------------------------------------------------------------//
+
+#include <iostream>
+#include <algorithm>
+
+#include <QtGlobal>
+#if QT_VERSION >= 0x050000
+#include <QtWidgets>
+#else
+#include <QtGui>
+#endif
+
+#ifndef Q_MOC_RUN
+#include <boost/compute/system.hpp>
+#include <boost/compute/image/image2d.hpp>
+#include <boost/compute/interop/qt.hpp>
+#include <boost/compute/utility/dim.hpp>
+#include <boost/compute/utility/source.hpp>
+#endif // Q_MOC_RUN
+
+namespace compute = boost::compute;
+
+inline void box_filter_image(const compute::image2d &input,
+ compute::image2d &output,
+ compute::uint_ box_height,
+ compute::uint_ box_width,
+ compute::command_queue &queue)
+{
+ using compute::dim;
+
+ const compute::context &context = queue.get_context();
+
+ // simple box filter kernel source
+ const char source[] = BOOST_COMPUTE_STRINGIZE_SOURCE(
+ __kernel void box_filter(__read_only image2d_t input,
+ __write_only image2d_t output,
+ uint box_height,
+ uint box_width)
+ {
+ int x = get_global_id(0);
+ int y = get_global_id(1);
+ int h = get_image_height(input);
+ int w = get_image_width(input);
+ int k = box_width;
+ int l = box_height;
+
+ if(x < k/2 || y < l/2 || x >= w-(k/2) || y >= h-(l/2)){
+ write_imagef(output, (int2)(x, y), (float4)(0, 0, 0, 1));
+ }
+ else {
+ const sampler_t sampler = CLK_ADDRESS_NONE | CLK_FILTER_NEAREST;
+
+ float4 sum = { 0, 0, 0, 0 };
+ for(int i = 0; i < k; i++){
+ for(int j = 0; j < l; j++){
+ sum += read_imagef(input, sampler, (int2)(x+i-k, y+j-l));
+ }
+ }
+ sum /= (float) k * l;
+ float4 value = (float4)( sum.x, sum.y, sum.z, 1.f );
+ write_imagef(output, (int2)(x, y), value);
+ }
+ }
+ );
+
+ // build box filter program
+ compute::program program =
+ compute::program::create_with_source(source, context);
+ program.build();
+
+ // setup box filter kernel
+ compute::kernel kernel(program, "box_filter");
+ kernel.set_arg(0, input);
+ kernel.set_arg(1, output);
+ kernel.set_arg(2, box_height);
+ kernel.set_arg(3, box_width);
+
+ // execute the box filter kernel
+ queue.enqueue_nd_range_kernel(kernel, dim(0, 0), input.size(), dim(1, 1));
+}
+
+// this example shows how to load an image using Qt, apply a simple
+// box blur filter, and then display it in a Qt window.
+int main(int argc, char *argv[])
+{
+ QApplication app(argc, argv);
+
+ // check command line
+ if(argc < 2){
+ std::cout << "usage: qimage_blur [FILENAME]" << std::endl;
+ return -1;
+ }
+
+ // load image using Qt
+ QString fileName = argv[1];
+ QImage qimage(fileName);
+
+ size_t height = qimage.height();
+ size_t width = qimage.width();
+ size_t bytes_per_line = qimage.bytesPerLine();
+
+ qDebug() << "height:" << height
+ << "width:" << width
+ << "bytes per line:" << bytes_per_line
+ << "depth:" << qimage.depth()
+ << "format:" << qimage.format();
+
+ // create compute context
+ compute::device gpu = compute::system::default_device();
+ compute::context context(gpu);
+ compute::command_queue queue(context, gpu);
+ std::cout << "device: " << gpu.name() << std::endl;
+
+ // get the opencl image format for the qimage
+ compute::image_format format =
+ compute::qt_qimage_format_to_image_format(qimage.format());
+
+ // create input and output images on the gpu
+ compute::image2d input_image(context, width, height, format);
+ compute::image2d output_image(context, width, height, format);
+
+ // copy host qimage to gpu image
+ compute::qt_copy_qimage_to_image2d(qimage, input_image, queue);
+
+ // apply box filter
+ box_filter_image(input_image, output_image, 7, 7, queue);
+
+ // copy gpu blurred image from to host qimage
+ compute::qt_copy_image2d_to_qimage(output_image, qimage, queue);
+
+ // show image as a pixmap
+ QLabel label;
+ label.setPixmap(QPixmap::fromImage(qimage));
+ label.show();
+
+ return app.exec();
+}