From 81c094621d64b5a6547c232c7282582339b16045 Mon Sep 17 00:00:00 2001 From: Rhys Weatherley Date: Tue, 25 Aug 2009 11:10:52 +1000 Subject: Implement the blur pixmap filter for OpenVG using vgGaussianBlur() Reviewed-by: Sarah Smith --- src/openvg/qpaintengine_vg.cpp | 2 ++ src/openvg/qpixmapfilter_vg.cpp | 59 +++++++++++++++++++++++++++++++++++++++++ src/openvg/qpixmapfilter_vg_p.h | 13 +++++++++ 3 files changed, 74 insertions(+) (limited to 'src') diff --git a/src/openvg/qpaintengine_vg.cpp b/src/openvg/qpaintengine_vg.cpp index b0e190fe1..5669f45ac 100644 --- a/src/openvg/qpaintengine_vg.cpp +++ b/src/openvg/qpaintengine_vg.cpp @@ -3112,6 +3112,8 @@ QPixmapFilter *QVGPaintEngine::createPixmapFilter(int type) const return new QVGPixmapColorizeFilter; else if (type == QPixmapFilter::DropShadowFilter) return new QVGPixmapDropShadowFilter; + else if (type == QPixmapFilter::BlurFilter) + return new QVGPixmapBlurFilter; else #endif return QPaintEngineEx::createPixmapFilter(type); diff --git a/src/openvg/qpixmapfilter_vg.cpp b/src/openvg/qpixmapfilter_vg.cpp index 2dbdf7e28..5a263a593 100644 --- a/src/openvg/qpixmapfilter_vg.cpp +++ b/src/openvg/qpixmapfilter_vg.cpp @@ -335,6 +335,65 @@ void QVGPixmapDropShadowFilter::draw(QPainter *painter, const QPointF &dest, con vgDestroyImage(dstImage); } +QVGPixmapBlurFilter::QVGPixmapBlurFilter(QObject *parent) + : QPixmapBlurFilter(parent) +{ +} + +QVGPixmapBlurFilter::~QVGPixmapBlurFilter() +{ +} + +void QVGPixmapBlurFilter::draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect) const +{ + if (src.pixmapData()->classId() != QPixmapData::OpenVGClass) { + // The pixmap data is not an instance of QVGPixmapData, so fall + // back to the default blur filter implementation. + QPixmapBlurFilter::draw(painter, dest, src, srcRect); + return; + } + + QVGPixmapData *pd = static_cast(src.pixmapData()); + + VGImage srcImage = pd->toVGImage(); + if (srcImage == VG_INVALID_HANDLE) + return; + + QSize size = pd->size(); + VGImage dstImage = vgCreateImage + (VG_sARGB_8888_PRE, size.width(), size.height(), + VG_IMAGE_QUALITY_FASTER); + if (dstImage == VG_INVALID_HANDLE) + return; + + // Clamp the radius range. We divide by 2 because the OpenVG blur + // is "too blurry" compared to the default raster implementation. + VGfloat maxRadius = VGfloat(vgGeti(VG_MAX_GAUSSIAN_STD_DEVIATION)); + VGfloat radiusF = VGfloat(radius()) / 2.0f; + if (radiusF < 0.001f) + radiusF = 0.001f; + else if (radiusF > maxRadius) + radiusF = maxRadius; + + vgGaussianBlur(dstImage, srcImage, radiusF, radiusF, VG_TILE_PAD); + + VGImage child = VG_INVALID_HANDLE; + + if (srcRect.isNull() || + (srcRect.topLeft().isNull() && srcRect.size() == size)) { + child = dstImage; + } else { + QRect src = srcRect.toRect(); + child = vgChildImage(dstImage, src.x(), src.y(), src.width(), src.height()); + } + + qt_vg_drawVGImage(painter, dest, child); + + if(child != dstImage) + vgDestroyImage(child); + vgDestroyImage(dstImage); +} + #endif QT_END_NAMESPACE diff --git a/src/openvg/qpixmapfilter_vg_p.h b/src/openvg/qpixmapfilter_vg_p.h index 6a3cc5f18..3dc0e8f20 100644 --- a/src/openvg/qpixmapfilter_vg_p.h +++ b/src/openvg/qpixmapfilter_vg_p.h @@ -63,6 +63,7 @@ QT_BEGIN_NAMESPACE class Q_OPENVG_EXPORT QVGPixmapConvolutionFilter : public QPixmapConvolutionFilter { + Q_OBJECT public: QVGPixmapConvolutionFilter(); ~QVGPixmapConvolutionFilter(); @@ -72,6 +73,7 @@ public: class Q_OPENVG_EXPORT QVGPixmapColorizeFilter : public QPixmapColorizeFilter { + Q_OBJECT public: QVGPixmapColorizeFilter(); ~QVGPixmapColorizeFilter(); @@ -86,6 +88,7 @@ private: class Q_OPENVG_EXPORT QVGPixmapDropShadowFilter : public QPixmapDropShadowFilter { + Q_OBJECT public: QVGPixmapDropShadowFilter(); ~QVGPixmapDropShadowFilter(); @@ -101,6 +104,16 @@ private: mutable QVarLengthArray kernel; }; +class Q_OPENVG_EXPORT QVGPixmapBlurFilter : public QPixmapBlurFilter +{ + Q_OBJECT +public: + QVGPixmapBlurFilter(QObject *parent = 0); + ~QVGPixmapBlurFilter(); + + void draw(QPainter *painter, const QPointF &dest, const QPixmap &src, const QRectF &srcRect = QRectF()) const; +}; + #endif QT_END_NAMESPACE -- cgit v1.2.3