Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
5
#
include
"qwindowsdirect2dbitmap.h"
6
#
include
"qwindowsdirect2dcontext.h"
7
#
include
"qwindowsdirect2dhelpers.h"
8
#
include
"qwindowsdirect2ddevicecontext.h"
9
10
#
include
<
QtCore
/
private
/
qcomptr_p
.
h
>
11
#
include
<
QtGui
/
qimage
.
h
>
12
#
include
<
QtGui
/
qcolor
.
h
>
13
14
QT_BEGIN_NAMESPACE
15
16
class
QWindowsDirect2DBitmapPrivate
17
{
18
public
:
19
QWindowsDirect2DBitmapPrivate
(ID2D1DeviceContext *dc =
nullptr
,
20
ID2D1Bitmap1 *bm =
nullptr
)
21
:
deviceContext
(
new
QWindowsDirect2DDeviceContext
(
dc
))
22
,
bitmap
(
bm
)
23
24
{
25
deviceContext->get()->SetTarget(bm);
26
}
27
28
D2D1_BITMAP_PROPERTIES1
bitmapProperties
()
const
29
{
30
QT_WARNING_PUSH
31
QT_WARNING_DISABLE_DEPRECATED
// see QTBUG-94043
32
FLOAT dpiX, dpiY;
33
QWindowsDirect2DContext
::
instance
(
)
->
d2dFactory
(
)
->GetDesktopDpi(&dpiX, &dpiY);
34
QT_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
102
QScopedPointer
<
QWindowsDirect2DDeviceContext
>
deviceContext
;
103
ComPtr
<
ID2D1Bitmap1
>
bitmap
;
104
};
105
106
QWindowsDirect2DBitmap
::QWindowsDirect2DBitmap()
107
: d_ptr(
new
QWindowsDirect2DBitmapPrivate)
108
{
109
}
110
111
QWindowsDirect2DBitmap
::
QWindowsDirect2DBitmap
(ID2D1Bitmap1 *bitmap, ID2D1DeviceContext *dc)
112
:
d_ptr
(
new
QWindowsDirect2DBitmapPrivate
(
dc
,
bitmap
))
113
{
114
}
115
116
QWindowsDirect2DBitmap
::~
QWindowsDirect2DBitmap
()
117
{
118
}
119
120
bool
QWindowsDirect2DBitmap
::
resize
(
int
width,
int
height)
121
{
122
Q_D(QWindowsDirect2DBitmap);
123
return
d->resize(width, height);
124
}
125
126
bool
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
135
ID2D1Bitmap1*
QWindowsDirect2DBitmap
::
bitmap
()
const
136
{
137
Q_D(
const
QWindowsDirect2DBitmap);
138
return
d->bitmap.Get();
139
}
140
141
QWindowsDirect2DDeviceContext
*
QWindowsDirect2DBitmap
::
deviceContext
()
const
142
{
143
Q_D(
const
QWindowsDirect2DBitmap);
144
return
d->deviceContext.data();
145
}
146
147
void
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
156
QImage
QWindowsDirect2DBitmap
::
toImage
(
const
QRect &rect)
157
{
158
Q_D(QWindowsDirect2DBitmap);
159
return
d->toImage(rect);
160
}
161
162
QSize
QWindowsDirect2DBitmap
::
size
()
const
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
170
QT_END_NAMESPACE
QWindowsDirect2DBitmapPrivate
Definition
qwindowsdirect2dbitmap.cpp:17
QWindowsDirect2DBitmapPrivate::bitmap
ComPtr< ID2D1Bitmap1 > bitmap
Definition
qwindowsdirect2dbitmap.cpp:103
QWindowsDirect2DBitmapPrivate::toImage
QImage toImage(const QRect &rect)
Definition
qwindowsdirect2dbitmap.cpp:64
QWindowsDirect2DBitmapPrivate::bitmapProperties
D2D1_BITMAP_PROPERTIES1 bitmapProperties() const
Definition
qwindowsdirect2dbitmap.cpp:28
QWindowsDirect2DBitmapPrivate::resize
bool resize(int width, int height, const void *data=nullptr, int pitch=0)
Definition
qwindowsdirect2dbitmap.cpp:44
QWindowsDirect2DBitmapPrivate::QWindowsDirect2DBitmapPrivate
QWindowsDirect2DBitmapPrivate(ID2D1DeviceContext *dc=nullptr, ID2D1Bitmap1 *bm=nullptr)
Definition
qwindowsdirect2dbitmap.cpp:19
QWindowsDirect2DBitmapPrivate::deviceContext
QScopedPointer< QWindowsDirect2DDeviceContext > deviceContext
Definition
qwindowsdirect2dbitmap.cpp:102
QWindowsDirect2DBitmap
Definition
qwindowsdirect2dbitmap.h:25
QWindowsDirect2DBitmap::deviceContext
QWindowsDirect2DDeviceContext * deviceContext() const
Definition
qwindowsdirect2dbitmap.cpp:141
QWindowsDirect2DBitmap::~QWindowsDirect2DBitmap
~QWindowsDirect2DBitmap()
Definition
qwindowsdirect2dbitmap.cpp:116
QWindowsDirect2DBitmap::fill
void fill(const QColor &color)
Definition
qwindowsdirect2dbitmap.cpp:147
QWindowsDirect2DBitmap::size
QSize size() const
Definition
qwindowsdirect2dbitmap.cpp:162
QWindowsDirect2DBitmap::bitmap
ID2D1Bitmap1 * bitmap() const
Definition
qwindowsdirect2dbitmap.cpp:135
QWindowsDirect2DBitmap::QWindowsDirect2DBitmap
QWindowsDirect2DBitmap(ID2D1Bitmap1 *bitmap, ID2D1DeviceContext *dc)
Definition
qwindowsdirect2dbitmap.cpp:111
QWindowsDirect2DBitmap::resize
bool resize(int width, int height)
Definition
qwindowsdirect2dbitmap.cpp:120
QWindowsDirect2DBitmap::fromImage
bool fromImage(const QImage &image, Qt::ImageConversionFlags flags)
Definition
qwindowsdirect2dbitmap.cpp:126
QWindowsDirect2DBitmap::toImage
QImage toImage(const QRect &rect=QRect())
Definition
qwindowsdirect2dbitmap.cpp:156
QWindowsDirect2DContext
Definition
qwindowsdirect2dcontext.h:22
QWindowsDirect2DContext::d2dFactory
ID2D1Factory1 * d2dFactory() const
Definition
qwindowsdirect2dcontext.cpp:154
QWindowsDirect2DContext::instance
static QWindowsDirect2DContext * instance()
Definition
qwindowsdirect2dcontext.cpp:137
QWindowsDirect2DDeviceContext
Definition
qwindowsdirect2ddevicecontext.h:39
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
qtbase
src
plugins
platforms
direct2d
qwindowsdirect2dbitmap.cpp
Generated on
for Qt by
1.18.0