39 QImage::Format format,
43 memset(&bmi, 0,
sizeof(bmi));
44 bmi.bmiHeader.biSize =
sizeof(BITMAPINFOHEADER);
45 bmi.bmiHeader.biWidth = width;
46 bmi.bmiHeader.biHeight = -height;
47 bmi.bmiHeader.biPlanes = 1;
48 bmi.bmiHeader.biSizeImage = 0;
50 if (format == QImage::Format_RGB16) {
51 bmi.bmiHeader.biBitCount = 16;
52 bmi.bmiHeader.biCompression = BI_BITFIELDS;
54 bmi.greenMask = 0x07E0;
55 bmi.blueMask = 0x001F;
57 bmi.bmiHeader.biBitCount = 32;
58 bmi.bmiHeader.biCompression = BI_RGB;
64 uchar *bits =
nullptr;
65 HBITMAP bitmap = CreateDIBSection(hdc,
reinterpret_cast<BITMAPINFO *>(&bmi),
66 DIB_RGB_COLORS,
reinterpret_cast<
void **>(&bits), 0, 0);
67 if (Q_UNLIKELY(!bitmap || !bits)) {
68 qFatal(
"%s: CreateDIBSection failed (%dx%d, format: %d)",
__FUNCTION__,
69 width, height,
int(format));
76QWindowsNativeImage::QWindowsNativeImage(
int width,
int height,
77 QImage::Format format) :
80 if (width != 0 && height != 0) {
82 m_bitmap = createDIB(m_hdc, width, height, format, &bits);
83 m_null_bitmap =
static_cast<HBITMAP>(SelectObject(m_hdc, m_bitmap));
84 m_image = QImage(bits, width, height, format);
85 Q_ASSERT(m_image.paintEngine()->type() == QPaintEngine::Raster);
86 static_cast<QRasterPaintEngine *>(m_image.paintEngine())->setDC(m_hdc);
88 m_image = QImage(width, height, format);
106QImage::Format QWindowsNativeImage::systemFormat()
108 static int depth = -1;
110 if (HDC defaultDC = GetDC(0)) {
111 depth = GetDeviceCaps(defaultDC, BITSPIXEL);
112 ReleaseDC(0, defaultDC);
119 return depth == 16 ? QImage::Format_RGB16 : QImage::Format_RGB32;