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