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