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
qwindowsdirect2dbitmap.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
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
9
10#include <QtCore/private/qcomptr_p.h>
11#include <QtGui/qimage.h>
12#include <QtGui/qcolor.h>
13
15
17{
18public:
19 QWindowsDirect2DBitmapPrivate(ID2D1DeviceContext *dc = nullptr,
20 ID2D1Bitmap1 *bm = nullptr)
22 , bitmap(bm)
23
24 {
25 deviceContext->get()->SetTarget(bm);
26 }
27
29 {
30QT_WARNING_PUSH
31QT_WARNING_DISABLE_DEPRECATED // see QTBUG-94043
32 FLOAT dpiX, dpiY;
33 QWindowsDirect2DContext::instance()->d2dFactory()->GetDesktopDpi(&dpiX, &dpiY);
34QT_WARNING_POP
35
36 return D2D1::BitmapProperties1(
37 D2D1_BITMAP_OPTIONS_TARGET,
38 D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
39 D2D1_ALPHA_MODE_PREMULTIPLIED),
40 dpiX, dpiY);
41
42 }
43
44 bool resize(int width, int height, const void *data = nullptr, int pitch = 0)
45 {
46 deviceContext->get()->SetTarget(nullptr);
47 bitmap.Reset();
48
49 D2D1_SIZE_U size = {
50 UINT32(width), UINT32(height)
51 };
52
53 HRESULT hr = deviceContext->get()->CreateBitmap(size, data, UINT32(pitch),
54 bitmapProperties(),
55 bitmap.ReleaseAndGetAddressOf());
56 if (SUCCEEDED(hr))
57 deviceContext->get()->SetTarget(bitmap.Get());
58 else
59 qWarning("%s: Could not create bitmap: %#lx", __FUNCTION__, hr);
60
61 return SUCCEEDED(hr);
62 }
63
64 QImage toImage(const QRect &rect)
65 {
66 if (!bitmap)
67 return QImage();
68
69 ComPtr<ID2D1Bitmap1> mappingCopy;
70
71 HRESULT hr = S_OK;
72 D2D1_SIZE_U size = bitmap->GetPixelSize();
73
74 D2D1_BITMAP_PROPERTIES1 properties = bitmapProperties();
75 properties.bitmapOptions = D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_CPU_READ;
76
77 hr = deviceContext->get()->CreateBitmap(size, nullptr, 0,
78 properties, &mappingCopy);
79 if (FAILED(hr)) {
80 qWarning("%s: Could not create bitmap: %#lx", __FUNCTION__, hr);
81 return QImage();
82 }
83
84 hr = mappingCopy->CopyFromBitmap(nullptr, bitmap.Get(), nullptr);
85 if (FAILED(hr)) {
86 qWarning("%s: Could not copy from bitmap: %#lx", __FUNCTION__, hr);
87 return QImage();
88 }
89
90 D2D1_MAPPED_RECT mappedRect;
91 hr = mappingCopy->Map(D2D1_MAP_OPTIONS_READ, &mappedRect);
92 if (FAILED(hr)) {
93 qWarning("%s: Could not map: %#lx", __FUNCTION__, hr);
94 return QImage();
95 }
96
97 return QImage(static_cast<const uchar *>(mappedRect.bits),
98 int(size.width), int(size.height), int(mappedRect.pitch),
99 QImage::Format_ARGB32_Premultiplied).copy(rect);
100 }
101
104};
105
106QWindowsDirect2DBitmap::QWindowsDirect2DBitmap()
107 : d_ptr(new QWindowsDirect2DBitmapPrivate)
108{
109}
110
111QWindowsDirect2DBitmap::QWindowsDirect2DBitmap(ID2D1Bitmap1 *bitmap, ID2D1DeviceContext *dc)
113{
114}
115
119
120bool QWindowsDirect2DBitmap::resize(int width, int height)
121{
122 Q_D(QWindowsDirect2DBitmap);
123 return d->resize(width, height);
124}
125
126bool QWindowsDirect2DBitmap::fromImage(const QImage &image, Qt::ImageConversionFlags flags)
127{
128 Q_D(QWindowsDirect2DBitmap);
129
130 QImage converted = image.convertToFormat(QImage::Format_ARGB32_Premultiplied, flags);
131 return d->resize(converted.width(), converted.height(),
132 converted.constBits(), converted.bytesPerLine());
133}
134
135ID2D1Bitmap1* QWindowsDirect2DBitmap::bitmap() const
136{
137 Q_D(const QWindowsDirect2DBitmap);
138 return d->bitmap.Get();
139}
140
142{
143 Q_D(const QWindowsDirect2DBitmap);
144 return d->deviceContext.data();
145}
146
147void QWindowsDirect2DBitmap::fill(const QColor &color)
148{
149 Q_D(QWindowsDirect2DBitmap);
150
151 d->deviceContext->begin();
152 d->deviceContext->get()->Clear(to_d2d_color_f(color));
153 d->deviceContext->end();
154}
155
156QImage QWindowsDirect2DBitmap::toImage(const QRect &rect)
157{
158 Q_D(QWindowsDirect2DBitmap);
159 return d->toImage(rect);
160}
161
163{
164 Q_D(const QWindowsDirect2DBitmap);
165
166 D2D1_SIZE_U size = d->bitmap->GetPixelSize();
167 return QSize(int(size.width), int(size.height));
168}
169
170QT_END_NAMESPACE
D2D1_BITMAP_PROPERTIES1 bitmapProperties() const
bool resize(int width, int height, const void *data=nullptr, int pitch=0)
QWindowsDirect2DBitmapPrivate(ID2D1DeviceContext *dc=nullptr, ID2D1Bitmap1 *bm=nullptr)
QScopedPointer< QWindowsDirect2DDeviceContext > deviceContext
QWindowsDirect2DDeviceContext * deviceContext() const
void fill(const QColor &color)
ID2D1Bitmap1 * bitmap() const
QWindowsDirect2DBitmap(ID2D1Bitmap1 *bitmap, ID2D1DeviceContext *dc)
bool resize(int width, int height)
bool fromImage(const QImage &image, Qt::ImageConversionFlags flags)
QImage toImage(const QRect &rect=QRect())
ID2D1Factory1 * d2dFactory() const
static QWindowsDirect2DContext * instance()
Combined button and popup list for selecting options.