Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qqnxbuffer.cpp
Go to the documentation of this file.
1// Copyright (C) 2011 - 2012 Research In Motion
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#include "qqnxglobal.h"
6
7#include "qqnxbuffer.h"
8
9#include <QtCore/QDebug>
10
11#include <errno.h>
12#include <sys/mman.h>
13
15
16Q_LOGGING_CATEGORY(lcQpaScreenBuffer, "qt.qpa.screen.buffer");
17
19 : m_buffer(0)
20{
21 qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO << "Empty";
22}
23
24QQnxBuffer::QQnxBuffer(screen_buffer_t buffer)
26{
27 qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO << "Normal";
28
29 // Get size of buffer
30 int size[2];
31 Q_SCREEN_CRITICALERROR(screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_BUFFER_SIZE, size),
32 "Failed to query buffer size");
33
34 // Get stride of buffer
35 int stride;
36 Q_SCREEN_CHECKERROR(screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_STRIDE, &stride),
37 "Failed to query buffer stride");
38
39 // Get access to buffer's data
40 errno = 0;
41 uchar *dataPtr = nullptr;
43 screen_get_buffer_property_pv(buffer, SCREEN_PROPERTY_POINTER, (void **)&dataPtr),
44 "Failed to query buffer pointer");
45
46 if (Q_UNLIKELY(!dataPtr))
47 qFatal("QQNX: buffer pointer is NULL, errno=%d", errno);
48
49 // Get format of buffer
50 int screenFormat;
52 screen_get_buffer_property_iv(buffer, SCREEN_PROPERTY_FORMAT, &screenFormat),
53 "Failed to query buffer format");
54
55 // Convert screen format to QImage format
56 QImage::Format imageFormat = QImage::Format_Invalid;
57 switch (screenFormat) {
58 case SCREEN_FORMAT_RGBX4444:
59 imageFormat = QImage::Format_RGB444;
60 break;
61 case SCREEN_FORMAT_RGBA4444:
62 imageFormat = QImage::Format_ARGB4444_Premultiplied;
63 break;
64 case SCREEN_FORMAT_RGBX5551:
65 imageFormat = QImage::Format_RGB555;
66 break;
67 case SCREEN_FORMAT_RGB565:
68 imageFormat = QImage::Format_RGB16;
69 break;
70 case SCREEN_FORMAT_RGBX8888:
71 imageFormat = QImage::Format_RGB32;
72 break;
73 case SCREEN_FORMAT_RGBA8888:
74 imageFormat = QImage::Format_ARGB32_Premultiplied;
75 break;
76 default:
77 qFatal(lcQpaScreenBuffer, "QQNX: unsupported buffer format, format=%d", screenFormat);
78 }
79
80 // wrap buffer in an image
81 m_image = QImage(dataPtr, size[0], size[1], stride, imageFormat);
82}
83
87{
88 qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO << "Copy";
89}
90
92{
93 qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO;
94}
95
97{
98 qCDebug(lcQpaScreenBuffer) << Q_FUNC_INFO;
99
100 // Verify native buffer exists
101 if (Q_UNLIKELY(!m_buffer))
102 qFatal(lcQpaScreenBuffer, "QQNX: can't invalidate cache for null buffer");
103
104 // Evict buffer's data from cache
105 errno = 0;
106 int result = msync(m_image.bits(), m_image.height() * m_image.bytesPerLine(), MS_INVALIDATE | MS_CACHE_ONLY);
107 if (Q_UNLIKELY(result != 0))
108 qFatal(lcQpaScreenBuffer, "QQNX: failed to invalidate cache, errno=%d", errno);
109}
110
111QT_END_NAMESPACE
virtual ~QQnxBuffer()
void invalidateInCache()
QQnxBuffer(const QQnxBuffer &other)
QQnxBuffer(screen_buffer_t buffer)
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")
#define Q_SCREEN_CRITICALERROR(x, message)
Definition qqnxglobal.h:20
#define Q_SCREEN_CHECKERROR(x, message)
Definition qqnxglobal.h:17