summaryrefslogtreecommitdiffstats
path: root/src/plugins/platforms/direct2d/qwindowsdirect2dintegration.cpp
blob: a5fbb7ad5a1449fea50e5ba4027341650404660c (plain)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
// Copyright (C) 2016 The Qt Company Ltd.// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only#include <QtCore/qt_windows.h>#include"qwindowsdirect2dcontext.h"#include"qwindowsdirect2dintegration.h"#include"qwindowsdirect2dbackingstore.h"#include"qwindowsdirect2dplatformpixmap.h"#include"qwindowsdirect2dnativeinterface.h"#include"qwindowsdirect2dwindow.h"#include"qwindowscontext.h"#include <qplatformdefs.h>#include <QtCore/qcoreapplication.h>#include <QtCore/qversionnumber.h>#include <QtGui/private/qpixmap_raster_p.h>#include <QtGui/qpa/qwindowsysteminterface.h>#include <QVarLengthArray> QT_BEGIN_NAMESPACE class QWindowsDirect2DIntegrationPrivate {public: QWindowsDirect2DNativeInterface m_nativeInterface; QWindowsDirect2DContext m_d2dContext;};static QVersionNumber systemD2DVersion(){static const int bufSize =512; TCHAR filename[bufSize]; UINT i =GetSystemDirectory(filename, bufSize);if(i >0&& i < bufSize) {if(_tcscat_s(filename, bufSize,__TEXT("\\d2d1.dll")) ==0) { DWORD versionInfoSize =GetFileVersionInfoSize(filename,nullptr);if(versionInfoSize) { QVarLengthArray<BYTE>info(static_cast<int>(versionInfoSize));if(GetFileVersionInfo(filename,0, versionInfoSize, info.data())) { UINT size; DWORD *fi;if(VerQueryValue(info.constData(),__TEXT("\\"),reinterpret_cast<void**>(&fi), &size) && size) {constauto*verInfo =reinterpret_cast<const VS_FIXEDFILEINFO *>(fi);return QVersionNumber{HIWORD(verInfo->dwFileVersionMS),LOWORD(verInfo->dwFileVersionMS),HIWORD(verInfo->dwFileVersionLS),LOWORD(verInfo->dwFileVersionLS)};}}}}}returnQVersionNumber();}static QVersionNumber minimumD2DVersion(){// 6.2.9200.16492 corresponds to Direct2D 1.1 on Windows 7 SP1 with Platform Updateenum:int{ D2DMinVersionPart1 =6, D2DMinVersionPart2 =2, D2DMinVersionPart3 =9200, D2DMinVersionPart4 =16492};return QVersionNumber{D2DMinVersionPart1, D2DMinVersionPart2, D2DMinVersionPart3, D2DMinVersionPart4};} QWindowsDirect2DIntegration *QWindowsDirect2DIntegration::create(const QStringList &paramList){const QVersionNumber systemVersion =systemD2DVersion();const QVersionNumber minimumVersion =minimumD2DVersion();if(!systemVersion.isNull() && systemVersion < minimumVersion) { QString msg =QCoreApplication::translate("QWindowsDirect2DIntegration","Qt cannot load the direct2d platform plugin because " \ "the Direct2D version on this system is too old. The " \ "minimum system requirement for this platform plugin " \ "is Windows 7 SP1 with Platform Update.\n\n" \ "The minimum Direct2D version required is %1. " \ "The Direct2D version on this system is %2.").arg(minimumVersion.toString(), systemVersion.toString()); QString caption =QCoreApplication::translate("QWindowsDirect2DIntegration","Cannot load direct2d platform plugin");MessageBoxW(nullptr, msg.toStdWString().c_str(), caption.toStdWString().c_str(), MB_OK | MB_ICONERROR);returnnullptr;}auto*integration =newQWindowsDirect2DIntegration(paramList);if(!integration->init()) {delete integration; integration =nullptr;}return integration;}QWindowsDirect2DIntegration::~QWindowsDirect2DIntegration(){} QWindowsDirect2DIntegration *QWindowsDirect2DIntegration::instance(){return static_cast<QWindowsDirect2DIntegration *>(QWindowsIntegration::instance());} QWindowsWindow *QWindowsDirect2DIntegration::createPlatformWindowHelper(QWindow *window,const QWindowsWindowData &data)const{return newQWindowsDirect2DWindow(window, data);} QPlatformNativeInterface *QWindowsDirect2DIntegration::nativeInterface()const{return&d->m_nativeInterface;} QPlatformPixmap *QWindowsDirect2DIntegration::createPlatformPixmap(QPlatformPixmap::PixelType type)const{switch(type) {caseQPlatformPixmap::BitmapType:return newQRasterPlatformPixmap(type);break;default:return newQWindowsDirect2DPlatformPixmap(type);break;}} QPlatformBackingStore *QWindowsDirect2DIntegration::createPlatformBackingStore(QWindow *window)const{return newQWindowsDirect2DBackingStore(window);} QWindowsDirect2DContext *QWindowsDirect2DIntegration::direct2DContext()const{return&d->m_d2dContext;}QWindowsDirect2DIntegration::QWindowsDirect2DIntegration(const QStringList &paramList):QWindowsIntegration(paramList),d(new QWindowsDirect2DIntegrationPrivate){}boolQWindowsDirect2DIntegration::init(){return d->m_d2dContext.init();} QT_END_NAMESPACE 
close