From 61382ae58b46e2bc8161eaade234286a3ff2b992 Mon Sep 17 00:00:00 2001 From: Ivan Vizir <define-true-false@yandex.com> Date: Mon, 25 Feb 2013 11:10:21 +0200 Subject: [PATCH] Windows type conversion functions. Change-Id: Iedde8c1736bac01c1615a74b4d768eb3dc97a651 Reviewed-by: Laszlo Papp <lpapp@kde.org> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> --- .gitignore | 20 ++++ .qmake.conf | 1 + README | 0 qtwinextras.pro | 1 + src/src.pro | 2 + src/winextras/qtwinextrasglobal.h | 57 ++++++++++ src/winextras/qtwinfunctions.cpp | 170 ++++++++++++++++++++++++++++++ src/winextras/qtwinfunctions.h | 75 +++++++++++++ src/winextras/winextras.pro | 10 ++ sync.profile | 7 ++ 10 files changed, 343 insertions(+) create mode 100644 .gitignore create mode 100644 .qmake.conf create mode 100644 README create mode 100644 qtwinextras.pro create mode 100644 src/src.pro create mode 100644 src/winextras/qtwinextrasglobal.h create mode 100644 src/winextras/qtwinfunctions.cpp create mode 100644 src/winextras/qtwinfunctions.h create mode 100644 src/winextras/winextras.pro create mode 100644 sync.profile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..16b4ee5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# C++ objects and libs + +*.slo +*.lo +*.o +*.a +*.la +*.lai +*.so +*.dll +*.dylib + +# Qt-es + +*.pro.user +*.pro.user.* +moc_*.cpp +qrc_*.cpp +Makefile +*-build-* diff --git a/.qmake.conf b/.qmake.conf new file mode 100644 index 0000000..42ba8e4 --- /dev/null +++ b/.qmake.conf @@ -0,0 +1 @@ +load(qt_build_config) diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/qtwinextras.pro b/qtwinextras.pro new file mode 100644 index 0000000..58c33f2 --- /dev/null +++ b/qtwinextras.pro @@ -0,0 +1 @@ +load(qt_parts) diff --git a/src/src.pro b/src/src.pro new file mode 100644 index 0000000..7ab303c --- /dev/null +++ b/src/src.pro @@ -0,0 +1,2 @@ +TEMPLATE = subdirs +win32:SUBDIRS += winextras diff --git a/src/winextras/qtwinextrasglobal.h b/src/winextras/qtwinextrasglobal.h new file mode 100644 index 0000000..b942ee3 --- /dev/null +++ b/src/winextras/qtwinextrasglobal.h @@ -0,0 +1,57 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Ivan Vizir <define-true-false@yandex.com> + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of QtWinExtras in the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:LGPL$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and Digia. For licensing terms and + ** conditions see http://qt.digia.com/licensing. For further information + ** use the contact form at http://qt.digia.com/contact-us. + ** + ** GNU Lesser General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU Lesser + ** General Public License version 2.1 as published by the Free Software + ** Foundation and appearing in the file LICENSE.LGPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU Lesser General Public License version 2.1 requirements + ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + ** + ** In addition, as a special exception, Digia gives you certain additional + ** rights. These rights are described in the Digia Qt LGPL Exception + ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3.0 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU General Public License version 3.0 requirements will be + ** met: http://www.gnu.org/copyleft/gpl.html. + ** + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#ifndef QTWINEXTRAS_GLOBAL_H +#define QTWINEXTRAS_GLOBAL_H + +#include <QtCore/qglobal.h> + +QT_BEGIN_NAMESPACE + +#if defined(QT_BUILD_WINEXTRAS_LIB) +# define QTWINEXTRAS_EXPORT Q_DECL_EXPORT +#else +# define QTWINEXTRAS_EXPORT Q_DECL_IMPORT +#endif + +QT_END_NAMESPACE + +#endif // QTWINEXTRAS_GLOBAL_H diff --git a/src/winextras/qtwinfunctions.cpp b/src/winextras/qtwinfunctions.cpp new file mode 100644 index 0000000..67dbb50 --- /dev/null +++ b/src/winextras/qtwinfunctions.cpp @@ -0,0 +1,170 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Ivan Vizir <define-true-false@yandex.com> + ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of QtWinExtras in the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:LGPL$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and Digia. For licensing terms and + ** conditions see http://qt.digia.com/licensing. For further information + ** use the contact form at http://qt.digia.com/contact-us. + ** + ** GNU Lesser General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU Lesser + ** General Public License version 2.1 as published by the Free Software + ** Foundation and appearing in the file LICENSE.LGPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU Lesser General Public License version 2.1 requirements + ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + ** + ** In addition, as a special exception, Digia gives you certain additional + ** rights. These rights are described in the Digia Qt LGPL Exception + ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3.0 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU General Public License version 3.0 requirements will be + ** met: http://www.gnu.org/copyleft/gpl.html. + ** + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#include "qtwinfunctions.h" +#include <QPixmap> +#include <QBitmap> +#include <QImage> + +QT_BEGIN_NAMESPACE + +Q_GUI_EXPORT HBITMAP qt_createIconMask(const QBitmap &bitmap); +Q_GUI_EXPORT HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat = 0); +Q_GUI_EXPORT QPixmap qt_pixmapFromWinHBITMAP(HBITMAP bitmap, int hbitmapFormat = 0); +Q_GUI_EXPORT HICON qt_pixmapToWinHICON(const QPixmap &p); +Q_GUI_EXPORT QImage qt_imageFromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h); +Q_GUI_EXPORT QPixmap qt_pixmapFromWinHICON(HICON icon); + +namespace Qt +{ + +/*! + \since 5.1 + + Creates a \c HBITMAP equivalent of the QBitmap. + + It is the caller's responsibility to free the \c HBITMAP data after use. + + \sa toWinHBITMAP() +*/ +HBITMAP createWinIconMask(const QBitmap &bitmap) +{ + return qt_createIconMask(bitmap); +} + +/*! + \since 5.1 + + Creates a \c HBITMAP equivalent to the QPixmap, + based on the given \a format. Returns the \c HBITMAP handle. + + It is the caller's responsibility to free the \c HBITMAP data + after use. + + \sa fromWinHBITMAP() +*/ +HBITMAP toWinHBITMAP(const QPixmap &p, HBitmapFormat format) +{ + return qt_pixmapToWinHBITMAP(p, format); +} + +/*! + \since 5.1 + + Returns a QPixmap that is equivalent to the + given \a bitmap. The conversion is based on the specified \a format. + + \sa toWinHBITMAP() +*/ +QPixmap fromWinHBITMAP(HBITMAP bitmap, HBitmapFormat format) +{ + return qt_pixmapFromWinHBITMAP(bitmap, format); +} + +/*! + \since 5.1 + + Creates a \c HICON equivalent to the QPixmap. + Returns the \c HICON handle. + + It is the caller's responsibility to free the \c HICON data after use. + + \sa fromWinHICON() +*/ +HICON toWinHICON(const QPixmap &p) +{ + return qt_pixmapToWinHICON(p); +} + +/*! + \since 5.1 + + Returns a QImage that is equivalent to the + given \a bitmap. The conversion is based on the specified \c HDC context. + + \sa toWinHBITMAP() +*/ +QImage imageFromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h) +{ + return qt_imageFromWinHBITMAP(hdc, bitmap, w, h); +} + +/*! + \since 5.1 + + Returns a QPixmap that is equivalent to the given \a icon. + + \sa toWinHICON() +*/ +QPixmap fromWinHICON(HICON icon) +{ + return qt_pixmapFromWinHICON(icon); +} + +} // namespace Qt + +/*! + \enum Qt::HBitmapFormat + + \since 5.1 + + This enum defines how the conversion between \c + HBITMAP and QPixmap is performed. + + \warning This enum is only available on Windows. + + \value HBitmapNoAlpha The alpha channel is ignored and always treated as + being set to fully opaque. This is preferred if the \c HBITMAP is + used with standard GDI calls, such as \c BitBlt(). + + \value HBitmapPremultipliedAlpha The \c HBITMAP is treated as having an + alpha channel and premultiplied colors. This is preferred if the + \c HBITMAP is accessed through the \c AlphaBlend() GDI function. + + \value HBitmapAlpha The \c HBITMAP is treated as having a plain alpha + channel. This is the preferred format if the \c HBITMAP is going + to be used as an application icon or systray icon. + + \sa fromWinHBITMAP(), toWinHBITMAP() +*/ + +QT_END_NAMESPACE diff --git a/src/winextras/qtwinfunctions.h b/src/winextras/qtwinfunctions.h new file mode 100644 index 0000000..e56a9ea --- /dev/null +++ b/src/winextras/qtwinfunctions.h @@ -0,0 +1,75 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Ivan Vizir <define-true-false@yandex.com> + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of QtWinExtras in the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:LGPL$ + ** Commercial License Usage + ** Licensees holding valid commercial Qt licenses may use this file in + ** accordance with the commercial license agreement provided with the + ** Software or, alternatively, in accordance with the terms contained in + ** a written agreement between you and Digia. For licensing terms and + ** conditions see http://qt.digia.com/licensing. For further information + ** use the contact form at http://qt.digia.com/contact-us. + ** + ** GNU Lesser General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU Lesser + ** General Public License version 2.1 as published by the Free Software + ** Foundation and appearing in the file LICENSE.LGPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU Lesser General Public License version 2.1 requirements + ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. + ** + ** In addition, as a special exception, Digia gives you certain additional + ** rights. These rights are described in the Digia Qt LGPL Exception + ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. + ** + ** GNU General Public License Usage + ** Alternatively, this file may be used under the terms of the GNU + ** General Public License version 3.0 as published by the Free Software + ** Foundation and appearing in the file LICENSE.GPL included in the + ** packaging of this file. Please review the following information to + ** ensure the GNU General Public License version 3.0 requirements will be + ** met: http://www.gnu.org/copyleft/gpl.html. + ** + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#ifndef QWINFUNCTIONS_H +#define QWINFUNCTIONS_H + +#include <QtWinExtras/qtwinextrasglobal.h> +#include <QtCore/qt_windows.h> + +QT_BEGIN_NAMESPACE + +class QPixmap; +class QImage; +class QBitmap; + +namespace Qt +{ + +enum HBitmapFormat +{ + HBitmapNoAlpha, + HBitmapPremultipliedAlpha, + HBitmapAlpha +}; + +HBITMAP QTWINEXTRAS_EXPORT createWinIconMask(const QBitmap &bitmap); +HBITMAP QTWINEXTRAS_EXPORT toWinHBITMAP(const QPixmap &p, HBitmapFormat format = HBitmapNoAlpha); +QPixmap QTWINEXTRAS_EXPORT fromWinHBITMAP(HBITMAP bitmap, HBitmapFormat format = HBitmapNoAlpha); +HICON QTWINEXTRAS_EXPORT toWinHICON(const QPixmap &p); +QImage QTWINEXTRAS_EXPORT imageFromWinHBITMAP(HDC hdc, HBITMAP bitmap, int w, int h); +QPixmap QTWINEXTRAS_EXPORT fromWinHICON(HICON icon); + +} + +QT_END_NAMESPACE + +#endif // QWINFUNCTIONS_H diff --git a/src/winextras/winextras.pro b/src/winextras/winextras.pro new file mode 100644 index 0000000..7c070f1 --- /dev/null +++ b/src/winextras/winextras.pro @@ -0,0 +1,10 @@ +TARGET = QtWinExtras + +load(qt_module) + +SOURCES += \ + qtwinfunctions.cpp + +HEADERS += \ + qtwinfunctions.h \ + qtwinextrasglobal.h diff --git a/sync.profile b/sync.profile new file mode 100644 index 0000000..eb2060f --- /dev/null +++ b/sync.profile @@ -0,0 +1,7 @@ +%modules = ( + "QtWinExtras" => "$basedir/src/winextras", +); + +%dependencies = ( + qtbase => "refs/heads/stable" +); -- GitLab