summaryrefslogtreecommitdiffstats
path: root/src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Merge remote branch 'origin/4.7' into qt-4.8-from-4.7Jani Hautakangas2011-06-221-24/+4
|\ | | | | | | | | | | | | Conflicts: src/opengl/qgl.cpp src/opengl/qpixmapdata_symbiangl.cpp src/opengl/qwindowsurface_gl.cpp
| * Simplify texture pooling logic in GL graphics system.Jani Hautakangas2011-06-091-24/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | Remove ugly TemporarilyCachedBindOption and use QGLTexture objects as texture pool entries instead of QGLPixmapData. Make texture pooling totally Symbian specific, remove VG like texture pooling code and use common texture binding path which is used on other platforms also on Symbian. QGLPixmapData should be only used to bind SgImage based textures (will be implemented by another commit). Task-number: QTBUG-19180 Reviewed-by: Samuel Rødal
| * Update licenseheader text in source filesJyri Tahtela2011-05-131-17/+17
| | | | | | | | | | | | | | Updated version of LGPL and FDL licenseheaders. Apply release phase licenseheaders for all source files. Reviewed-by: Trust Me
* | Adding debug output for not supported gl featuresIan2011-06-201-0/+33
| | | | | | | | | | | | in the gl2 paintengine Reviewed-by: Samuel
* | Merge remote branch 'qt/4.8' into fire-masterPaul Olav Tvete2011-06-061-17/+17
|\ \ | | | | | | | | | | | | | | | | | | | | | Conflicts: src/plugins/platforms/wayland/qwaylandclipboard.cpp src/plugins/platforms/wayland/qwaylandclipboard.h src/plugins/platforms/wayland/qwaylanddisplay.cpp src/s60installs/eabi/QtOpenGLu.def
| * | Update licenseheader text in source files for qt4.8Jyri Tahtela2011-05-131-17/+17
| | | | | | | | | | | | | | | | | | | | | Updated version of LGPL and FDL licenseheaders. Apply release phase licenseheaders for all source files. Reviewed-by: Trust Me
* | | Fall back to using paths for large fonts in drawStaticText()Eskil Abrahamsen Blomfeldt2011-05-181-11/+22
|/ / | | | | | | | | | | | | | | | | | | | | | | | | QStaticText had an implicit risk which meant you had to make sure the text size did not grow unreasonably large. This was intended to avoid hiding the performance impact of using QStaticText for such a purpose, but it's too inconvenient. Thus, the same fall back as in drawTextItem() has been introduced. This will also fix a bug recently introduced when we started using the FT cache to draw static text in the raster engine, since this will fail for large fonts. Task-number: QTBUG-19084, QTBUG-19370 Reviewed-by: Jiang Jiang
* | Support gamma correction of text on GLEskil Abrahamsen Blomfeldt2011-05-031-2/+29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If the SRGB framebuffer extension in GL is available, we can support gamma correction of text with a gamma of 2.1. On Mac this is sufficient for gamma correcting subpixel antialiased text. Gray antialiasing should not be gamma corrected on Mac. On Windows, the user can potentially set the gamma value to anything between 1.0 and 2.2 (or something like that). We support anything that resembles 1.0 closely enough by pushing the text out without any correction (like before). We also support anything that resembles 2.1 (the gamma hardcoded in GL's SRGB extension) by turning on the extension before blending the text. In between the two, we'll use gray antialiasing to avoid differing too much from the raster engine (which is our reference in this.) For gray antialiasing on Windows, we use a constant gamma of 2.3 which has been determined by experimentation. Since this is close enough to 2.1 we do gamma correction with SRGB extension. The distance limit of 0.2 is determined by some experimentation. Reviewed-by: Samuel
* | Added support for six-parameter radial gradients.Samuel Rødal2011-04-131-1/+7
| | | | | | | | | | | | | | | | The extended radial gradients conform to the radial gradient specification in HTML 5 canvas. Task-number: QTBUG-14075 Reviewed-by: Andreas Kling
* | Made extension resolving work with Core profile.Samuel Rødal2011-04-051-18/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The Core profile was introduced in OpenGL 3.2 and if chosen removes all deprecated functionality from the OpenGL API. In the Core profile glGetString(GL_EXTENSIONS) is unsupported, so instead we need to use glGetStringi(GL_EXTENSIONS, index) together with glGetIntegerv(GL_NUM_EXTENSIONS). Also optimized the QGLExtensionMatcher to not have to recompute the split positions all the time. Preliminary support to prevent non-core-functions to be called in the GL 2 engine has also been added. Reviewed-by: Kim
* | opengl2: Make maximum cached glyph size configurableSami Kyöstilä2011-03-311-1/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | As the DPI of displays continues to rise, especially on mobile devices, the maximum glyph size of 64 pixels for the glyph cache has become a limitation. This problem is made worse by the fact that when the maximum glyph size is exceeded, the OpenGL paint engine falls back to using rasterized geometry for glyph rendering. This does not produce acceptable quality if the OpenGL rendering surface lacks support for multisampling. This patch offers a solution to the problem by making the cached glyph size configurable at build time. This way the limit can be set according to the capabilities of the target hardware. Signed-off-by: Sami Kyöstilä <sami.kyostila@nokia.com> Merge-request: 1131 Reviewed-by: Samuel Rødal <samuel.rodal@nokia.com>
* | Merge branch 'master' of scm.dev.nokia.troll.no:qt/qt-fire-staging into ↵Qt Continuous Integration System2011-03-281-2/+7
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | master-integration * 'master' of scm.dev.nokia.troll.no:qt/qt-fire-staging: Fix crash and infinite recursion caused by previous commits Fix remaining regressions in QWS Take Xft.hintstyle by default to match the behavior of GTK+ Fixed remaining issues in subpixel positioning with FreeType Fix QTransform debug output qFloor the decoration line width before painting Let QTextLine decide its own x position in QPainter Avoid repeatedly trying to load unloadable plugins, causing slowness Reset GL glyph cache when texture limit is reached unlockFace was put in the wrong place in previous patch Implement subpixel positioning with FreeType
| * | Reset GL glyph cache when texture limit is reachedEskil Abrahamsen Blomfeldt2011-03-231-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a port of 72f161739b270b01807f97cd853030440f0fd430 which was reverted in integration to master, since it was incompatible with the refactored glyph cache. When the GL glyph cache reached its texture limit, we have to reset it and start over. Added a new cleanup() function in QGLContextGroupResourceBase which deletes the resource for a given context and removes itself from that context group. Task-number: QTBUG-13784 Reviewed-by: Samuel
* | | Merge remote-tracking branch 'origin/4.7' into qt-master-from-4.7Thiago Macieira2011-03-241-4/+0
|\ \ \ | |/ / |/| / | |/ | | Conflicts: src/opengl/qwindowsurface_gl.cpp
| * Change Symbian to use destroyed swap behaviour in GLJani Hautakangas2011-03-221-4/+0
| | | | | | | | | | | | | | | | Destroyed swap behaviour is a little bit faster than preserved swap with heavily animated UIs like QML. Task-number: QTBUG-18270 Reviewed-by: Samuel Rødal
* | Merge remote-tracking branch 'origin/4.7' into HEADThiago Macieira2011-03-161-4/+24
|\ \ | |/ | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: configure mkspecs/symbian-gcce/qmake.conf qmake/generators/metamakefile.cpp qmake/generators/win32/mingw_make.cpp src/corelib/global/global.pri src/corelib/global/qglobal.h src/opengl/qgl.cpp src/opengl/qwindowsurface_gl.cpp src/plugins/platforms/wayland/qwaylandbuffer.h tests/auto/qnetworkreply/tst_qnetworkreply.cpp tools/designer/src/components/formeditor/qdesigner_resource.cpp
| * Initial implementation of GLES2.0 resource poolingJani Hautakangas2011-03-151-4/+24
| | | | | | | | | | | | | | | | | | Keep the implementation in separate qpixmapdata_poolgl.cpp file until the pooling has been verified and confirmed to work ok. Task-number: QTBUG-15253 QTBUG-17850 Reviewed-by: Samuel Rødal
* | Fix static text item positioning GL2 paint engineJiang Jiang2011-03-111-2/+2
| | | | | | | | Reviewed-by: Eskil
* | Merge remote-tracking branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2011-02-031-4/+7
|\ \ | |/ | | | | | | | | | | Conflicts: src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h
| * Fixed missing text when using static text items in GL 2 engine.Samuel Rødal2011-02-021-5/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the context is destroyed and recreated, we end up with a new glyph cache, but we only recreate the vertex arrays for the very first static text item. We need to keep track of the glyph cache in each text item, so that we can recreate the vertex arrays and re-populate the cache accordingly. As the pointer might be the same after the glyph cache is recreated, we need to use serial numbers instead. We also need to re-create the cache when the context pointer has been invalidated, so that the static text items also get invalidated, and the texture glyph cache gets repopulated. Reviewed-by: Eskil Abrahamsen Blomfeldt
* | Merge branch 'staging-master' of scm.dev.nokia.troll.no:qt/qt-lighthouse ↵Qt Continuous Integration System2011-01-271-3/+18
|\ \ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | into master-integration * 'staging-master' of scm.dev.nokia.troll.no:qt/qt-lighthouse: (69 commits) Lighthouse: License headers to new files in testlite Make sure we blit the fbo on flush in QGLWindowSurface Lighthouse: Wayland. Make the wayland integration closer to Lighthosue Lighthouse: Wayland, only make one fbo for the WaylandPaintDevice Making clearer separation between responsibility of different classes Make it possible to vertically mirror gl painting Lighthouse:Wayland Moving some logic into files Fix Wayland plugin to work with Wayland after some interfaces changed Make QGLContext::fromPlatformGLContext show correct sharing Remove Lighthouse specific code from QGLWindowSurface Fix X11 clipboard bug. Fix for uninitialized member in QWaylandCursor wayland: use pkgconfig for libdrm in wayland.pro wayland: remove non-public header from config.tests wayland: fix SOURCES to point to wayland.cpp in config.tests Wayland: request rbg and premultiplied argb visuals as needed Wayland: clamp window resizes to screen size Wayland: split GL code into separate files Wayland: use correct viewport for swapBuffers and correct coords Wayland: fix geometry of swapBuffers ...
| * \ Merge branch 'master' into lighthouse-masterJørgen Lind2011-01-261-9/+13
| |\ \
| * | | Make it possible to vertically mirror gl paintingJørgen Lind2011-01-261-3/+18
| | | | | | | | | | | | | | | | | | | | | | | | | | | | The GLPaintDevice gets a flip property. If this is set, the pvr matrix is altered to paint "upside down" Reviewed-by: sroedal
* | | | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2011-01-251-2/+2
|\ \ \ \ | |_|/ / |/| | / | | |/ | |/| | | | Conflicts: configure src/network/bearer/bearer.pri
| * | Fix static build on Windows with MinGW.Mark Brand2011-01-171-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Q_DECL_IMPORT is still __declspec(dllimport), which is unsuitable for static code. Commit edbc656b changed Q_DECL_IMPORT_IMPORT to Q_CORE_EXPORT when declaring QtCore functions in svg. Now we change Q_DECL_IMPORT to Q_GUI_EXPORT when declaring QtGui functions into opengl and openvg. Also removed the redundant keyword "extern" from the function declarations. Merge-request: 2540 Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Reviewed-by: mariusSO
* | | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2011-01-171-1/+1
|\ \ \ | |/ / | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: examples/webkit/imageanalyzer/imageanalyzer.h examples/webkit/imageanalyzer/mainwindow.h mkspecs/unsupported/qws/linux-x86-openkode-g++/qplatformdefs.h src/corelib/io/qfsfileengine_iterator_unix.cpp src/corelib/io/qfsfileengine_iterator_win.cpp src/corelib/kernel/qcoreapplication.cpp src/network/access/qnetworkaccessdatabackend.cpp src/plugins/bearer/connman/qconnmanservice_linux.cpp src/plugins/platforms/openvglite/qwindowsurface_vglite.h src/s60installs/bwins/QtCoreu.def src/s60installs/eabi/QtCoreu.def src/s60installs/s60installs.pro tools/assistant/tools/assistant/helpviewer_qwv.h tools/qdoc3/test/qt-html-templates.qdocconf
| * | Update copyright year to 2011.Jason McDonald2011-01-101-1/+1
| | | | | | | | | | | | Reviewed-by: Trust Me
* | | Merge branch 'qt-graphics-team-text-master'Eskil Abrahamsen Blomfeldt2011-01-101-8/+12
|\ \ \ | |_|/ |/| |
| * | Optimize texture glyph cacheEskil Abrahamsen Blomfeldt2010-12-211-8/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | To avoid calling the bounding box function for the same non-printable characters in every call, we cache them as empty in the coords table and bail out before painting them. This patch also fixes some possible reads of uninitialized memory (reference to return value) and reference to a default constructed object consisting of uninitialized pods. Reviewed-by: Samuel
* | | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2010-12-201-5/+47
|\ \ \ | |/ / |/| / | |/ | | | | | | | | | | | | Conflicts: demos/declarative/minehunt/minehunt.pro src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp src/plugins/phonon/mmf/mmf.pro src/s60installs/s60installs.pro tests/auto/qapplication/test/test.pro tests/auto/qgraphicsview/tst_qgraphicsview.cpp
| * Fixed GL 2 engine rendering of images / pixmaps above max texture size.Samuel Rødal2010-12-131-5/+47
| | | | | | | | | | | | | | | | Down-scale images or pixmaps that are above the max texture size. Not optimal performance-wise, but better than failing. Task-number: QTBUG-16033 Reviewed-by: Eskil Abrahamsen Blomfeldt
* | Fixed stroke / fill inconsistencies in GL 2 paint engine.Samuel Rødal2010-12-141-40/+0
| | | | | | | | | | | | | | | | Get rid of the aliased coordinate delta, like we already did in the raster paint engine. Task-number: QTBUG-16043 Reviewed-by: Gunnar Sletta
* | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2010-12-131-5/+19
|\ \ | |/ | | | | | | | | | | | | | | | | | | | | Conflicts: configure src/gui/graphicsview/qgraphicslayout.cpp src/gui/text/qfontengine_s60.cpp src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp src/opengl/qwindowsurface_gl.cpp src/s60installs/bwins/QtGuiu.def src/s60installs/eabi/QtGuiu.def tests/auto/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
| * Missing glyphs in GL when scaling QStaticText and QML text itemsEskil Abrahamsen Blomfeldt2010-12-101-5/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | Since scaled text is backed by an A8 glyph cache, it needs to repopulate even if it has previously populated the cache for the unscaled text. This means that we need to record in the userData that the type of the cache is not the same as the last time. Otherwise the A8 version of the cache will only be updated when it's created and when the text actually changes, leading to glyphs missing on screen when zooming text using a scale. Task-number: QTBUG-16012 Reviewed-by: Gunnar
| * Try using pure scissor clip in GL 2 engine for rotations.Samuel Rødal2010-12-091-1/+5
| | | | | | | | | | | | | | | | As long as the final clip area is rectangular and axis aligned we can use a scissor clip. This prevents performance problems when doing 90-degree rotated rectangle clips. Reviewed-by: Bjørn Erik Nilsen
| * Fixed missing text in GL 2 engine after recreating a context.Samuel Rødal2010-12-091-1/+3
| | | | | | | | | | | | If we recreate the texture glyph cache, we also need to repopulate. Reviewed-by: Eskil Abrahamsen Blomfeldt
* | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2010-11-251-0/+5
|\ \ | |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: qmake/generators/symbian/symmake.cpp src/corelib/global/qglobal.h src/gui/kernel/qwidget_p.h src/gui/painting/qtextureglyphcache.cpp src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp src/opengl/gl2paintengineex/qtextureglyphcache_gl.cpp src/opengl/gl2paintengineex/qtextureglyphcache_gl_p.h src/plugins/qpluginbase.pri src/qbase.pri tests/auto/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp tests/auto/qthread/tst_qthread.cpp tests/auto/selftests/expected_cmptest.txt tests/auto/selftests/expected_crashes_3.txt tests/auto/selftests/expected_longstring.txt tests/auto/selftests/expected_maxwarnings.txt tests/auto/selftests/expected_skip.txt tools/assistant/tools/assistant/doc/assistant.qdocconf tools/qdoc3/test/assistant.qdocconf tools/qdoc3/test/designer.qdocconf tools/qdoc3/test/linguist.qdocconf tools/qdoc3/test/qdeclarative.qdocconf tools/qdoc3/test/qmake.qdocconf tools/qdoc3/test/qt-build-docs.qdocconf tools/qdoc3/test/qt-build-docs_ja_JP.qdocconf tools/qdoc3/test/qt-build-docs_zh_CN.qdocconf tools/qdoc3/test/qt.qdocconf tools/qdoc3/test/qt_ja_JP.qdocconf tools/qdoc3/test/qt_zh_CN.qdocconf
| * Fix possible corrupted text when gl glyph cache becomes fullEskil Abrahamsen Blomfeldt2010-11-191-2/+7
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | When the OpenGL glyph cache filled up (the max texture size on the hardware was exceeded) the characters would be drawn as black blocks instead. As a work-around for this, the cache will now be cleared and repopulated whenever this happens, meaning that once in a while (when a lot of different glyphs have been drawn in a font) there will be a performance hit. A more complete solution is described in QTBUG-13784, but this requires so much refactoring that it was deemed too risky for a patch release. This patch fixes the problem with a small penalty and low risk. Task-number: QT-3971 Reviewed-by: Samuel
| * Prevent crash in GL 2 engine when stroking null rectangle.Samuel Rødal2010-11-171-0/+3
| | | | | | | | | | Task-number: QTBUG-15320 Reviewed-by: Kim
| * Fix possible missing glyphs in text when using GL engineEskil Abrahamsen Blomfeldt2010-11-161-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | If you create/destroy gl contexts a lot, you may sometimes get a new context with the same pointer as a destroyed context. When you look up the glyph cache in the font engine using the context pointer as a key, you will then get a glyph cache which contains no valid data. We need to reset the glyph cache completely in this case and set up bindings for the new context so that the glyph cache can be repopulated and reused. Note that there is a different solution for this in Qt 4.8, so this is temporary solution for the Qt 4.7.x series. Task-number: QT-4162 Reviewed-by: Fabien Freling
* | Fix compilation after merge.Olivier Goffart2010-11-121-1/+1
| | | | | | | | Also fix a warning
* | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2010-11-121-12/+12
|\ \ | |/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Conflicts: configure doc/src/snippets/code/doc_src_qmake-manual.qdoc mkspecs/features/symbian/application_icon.prf mkspecs/features/symbian/default_post.prf mkspecs/features/symbian/symbian_building.prf qmake/generators/symbian/initprojectdeploy_symbian.cpp src/multimedia/audio/audio.pri src/network/access/qnetworkaccessmanager.cpp src/opengl/gl2paintengineex/qpaintengineex_opengl2.cpp src/opengl/qgl_p.h src/plugins/bearer/corewlan/qcorewlanengine.mm src/plugins/phonon/mmf/mmf.pro tests/auto/qscriptvalue/tst_qscriptvalue.cpp tests/auto/qscriptvalue/tst_qscriptvalue.h tools/qdoc3/doc/qdoc-manual.qdocconf
| * Fix possible crash in QStaticText and QDeclarativeTextLayoutEskil Abrahamsen Blomfeldt2010-10-291-12/+12
| | | | | | | | | | | | | | | | | | | | | | | | | | The QStaticTextItem held an uncounted reference to QFontEngine. The pointer would dangle in some cases where there was no font object referencing the engine and the cache was cleaned out (e.g. when a new application font is added.) Properly count the reference, and also add reference counting to userData to make it harder to shoot yourself in the foot, since the QStaticTextItem class is now being used in different places, Task-number: QTBUG-14446 Reviewed-by: Martin Jones
* | Merge branch 'lancelot'aavit2010-11-021-1/+2
|\ \ | | | | | | | | | | | | | | | | | | First iteration of the Lancelot graphics regression autotest system. Reviewed-by: Trond Reviewed-by: aavit
| * | Fixes unstability caused by a dangling pointer in GL text renderingTrond Kjernåsen2010-10-271-1/+2
| | | | | | | | | | | | Reviewed-by: eskil
* | | Fixed index type after reapplying commit 89cbb165.Kim Motoyoshi Kalland2010-11-021-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | Made the code added with commit 89cbb165 use ushort indices on systems which don't support uint indices, like commit 207d9239 did with the rest of the GL paint engine. Reviewed-by: Samuel
* | | Reapply "Fixed painter path drawing on FBO without stencil buffer."Kim Motoyoshi Kalland2010-11-021-0/+26
| | | | | | | | | | | | This reverts commit 4035ec3e9ed5ef904dd6f22adaf5e9deb24e9455.
* | | Merge remote branch 'origin/4.7' into qt-master-from-4.7Olivier Goffart2010-10-251-5/+5
|\ \ \ | |/ / |/| / | |/ | | | | | | | | | | | | Conflicts: demos/declarative/snake/snake.qml qmake/generators/symbian/symbiancommon.cpp src/network/access/qnetworkaccessmanager.cpp src/s60installs/s60installs.pro tests/auto/qitemselectionmodel/tst_qitemselectionmodel.cpp tests/auto/qnetworkreply/tst_qnetworkreply.cpp
| * Functions that are externally defined to QtOpenGL needs to be imported.Jani Hautakangas2010-10-211-1/+1
| | | | | | | | | | | | This is needed for RVCT4 Reviewed-by: Jason Barron
| * Fix GL_OES_element_index_uint and add GL_OES_depth24 detection.Jani Hautakangas2010-10-201-4/+4
| | | | | | | | | | | | | | | | | | GL_OES_element_index_uint detection was not working because EGL config wasn't yet resolved. In addition QFrameBufferObject should use 24bit depth render buffer if extension is available. Task-number: QTBUG-14542 Reviewed-by: Gunnar