summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/qnx/qqnxbuffer.cpp
blob: 4d3b5256b24cd84ea4de8f237f05624f282176d6 (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
// Copyright (C) 2011 - 2012 Research In Motion// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include"qqnxglobal.h"#include"qqnxbuffer.h"#include <QtCore/QDebug>#include <errno.h>#include <sys/mman.h> QT_BEGIN_NAMESPACE Q_LOGGING_CATEGORY(lcQpaScreenBuffer,"qt.qpa.screen.buffer");QQnxBuffer::QQnxBuffer():m_buffer(0){qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO <<"Empty";}QQnxBuffer::QQnxBuffer(screen_buffer_t buffer):m_buffer(buffer){qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO <<"Normal";// Get size of bufferint size[2];Q_SCREEN_CRITICALERROR(screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_BUFFER_SIZE, size),"Failed to query buffer size");// Get stride of bufferint stride;Q_SCREEN_CHECKERROR(screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_STRIDE, &stride),"Failed to query buffer stride");// Get access to buffer's data errno =0; uchar *dataPtr =nullptr;Q_SCREEN_CRITICALERROR(screen_get_buffer_property_pv(buffer, SCREEN_PROPERTY_POINTER, (void**)&dataPtr),"Failed to query buffer pointer");if(Q_UNLIKELY(!dataPtr))qFatal("QQNX: buffer pointer is NULL, errno=%d", errno);// Get format of bufferint screenFormat;Q_SCREEN_CHECKERROR(screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_FORMAT, &screenFormat),"Failed to query buffer format");// Convert screen format to QImage formatQImage::Format imageFormat =QImage::Format_Invalid;switch(screenFormat) {case SCREEN_FORMAT_RGBX4444: imageFormat =QImage::Format_RGB444;break;case SCREEN_FORMAT_RGBA4444: imageFormat =QImage::Format_ARGB4444_Premultiplied;break;case SCREEN_FORMAT_RGBX5551: imageFormat =QImage::Format_RGB555;break;case SCREEN_FORMAT_RGB565: imageFormat =QImage::Format_RGB16;break;case SCREEN_FORMAT_RGBX8888: imageFormat =QImage::Format_RGB32;break;case SCREEN_FORMAT_RGBA8888: imageFormat =QImage::Format_ARGB32_Premultiplied;break;default:qFatal(lcQpaScreenBuffer,"QQNX: unsupported buffer format, format=%d", screenFormat);}// wrap buffer in an image m_image =QImage(dataPtr, size[0], size[1], stride, imageFormat);}QQnxBuffer::QQnxBuffer(const QQnxBuffer &other):m_buffer(other.m_buffer),m_image(other.m_image){qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO <<"Copy";}QQnxBuffer::~QQnxBuffer(){qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO;}voidQQnxBuffer::invalidateInCache(){qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO;// Verify native buffer existsif(Q_UNLIKELY(!m_buffer))qFatal(lcQpaScreenBuffer,"QQNX: can't invalidate cache for null buffer");// Evict buffer's data from cache errno =0;int result =msync(m_image.bits(), m_image.height() * m_image.bytesPerLine(), MS_INVALIDATE | MS_CACHE_ONLY);if(Q_UNLIKELY(result !=0))qFatal(lcQpaScreenBuffer,"QQNX: failed to invalidate cache, errno=%d", errno);} QT_END_NAMESPACE 
close