1 /**************************************************************************** 2 ** 3 ** Copyright (C) 2016 The Qt Company Ltd. 4 ** Contact: https://www.qt.io/licensing/ 5 ** 6 ** This file is part of the QtGui module of the Qt Toolkit. 7 ** 8 ** $QT_BEGIN_LICENSE:LGPL$ 9 ** Commercial License Usage 10 ** Licensees holding valid commercial Qt licenses may use this file in 11 ** accordance with the commercial license agreement provided with the 12 ** Software or, alternatively, in accordance with the terms contained in 13 ** a written agreement between you and The Qt Company. For licensing terms 14 ** and conditions see https://www.qt.io/terms-conditions. For further 15 ** information use the contact form at https://www.qt.io/contact-us. 16 ** 17 ** GNU Lesser General Public License Usage 18 ** Alternatively, this file may be used under the terms of the GNU Lesser 19 ** General Public License version 3 as published by the Free Software 20 ** Foundation and appearing in the file LICENSE.LGPL3 included in the 21 ** packaging of this file. Please review the following information to 22 ** ensure the GNU Lesser General Public License version 3 requirements 23 ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. 24 ** 25 ** GNU General Public License Usage 26 ** Alternatively, this file may be used under the terms of the GNU 27 ** General Public License version 2.0 or (at your option) the GNU General 28 ** Public license version 3 or any later version approved by the KDE Free 29 ** Qt Foundation. The licenses are as published by the Free Software 30 ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 31 ** included in the packaging of this file. Please review the following 32 ** information to ensure the GNU General Public License requirements will 33 ** be met: https://www.gnu.org/licenses/gpl-2.0.html and 34 ** https://www.gnu.org/licenses/gpl-3.0.html. 35 ** 36 ** $QT_END_LICENSE$ 37 ** 38 ****************************************************************************/ 39 40 #include "qimagepixmapcleanuphooks_p.h" 41 #include <qpa/qplatformpixmap.h> 42 #include "private/qimage_p.h" 43 44 45 QT_BEGIN_NAMESPACE 46 Q_GLOBAL_STATIC(QImagePixmapCleanupHooks,qt_image_and_pixmap_cleanup_hooks)47Q_GLOBAL_STATIC(QImagePixmapCleanupHooks, qt_image_and_pixmap_cleanup_hooks) 48 49 QImagePixmapCleanupHooks *QImagePixmapCleanupHooks::instance() 50 { 51 return qt_image_and_pixmap_cleanup_hooks(); 52 } 53 addPlatformPixmapModificationHook(_qt_pixmap_cleanup_hook_pmd hook)54void QImagePixmapCleanupHooks::addPlatformPixmapModificationHook(_qt_pixmap_cleanup_hook_pmd hook) 55 { 56 pixmapModificationHooks.append(hook); 57 } 58 addPlatformPixmapDestructionHook(_qt_pixmap_cleanup_hook_pmd hook)59void QImagePixmapCleanupHooks::addPlatformPixmapDestructionHook(_qt_pixmap_cleanup_hook_pmd hook) 60 { 61 pixmapDestructionHooks.append(hook); 62 } 63 64 addImageHook(_qt_image_cleanup_hook_64 hook)65void QImagePixmapCleanupHooks::addImageHook(_qt_image_cleanup_hook_64 hook) 66 { 67 imageHooks.append(hook); 68 } 69 removePlatformPixmapModificationHook(_qt_pixmap_cleanup_hook_pmd hook)70void QImagePixmapCleanupHooks::removePlatformPixmapModificationHook(_qt_pixmap_cleanup_hook_pmd hook) 71 { 72 pixmapModificationHooks.removeAll(hook); 73 } 74 removePlatformPixmapDestructionHook(_qt_pixmap_cleanup_hook_pmd hook)75void QImagePixmapCleanupHooks::removePlatformPixmapDestructionHook(_qt_pixmap_cleanup_hook_pmd hook) 76 { 77 pixmapDestructionHooks.removeAll(hook); 78 } 79 removeImageHook(_qt_image_cleanup_hook_64 hook)80void QImagePixmapCleanupHooks::removeImageHook(_qt_image_cleanup_hook_64 hook) 81 { 82 imageHooks.removeAll(hook); 83 } 84 executePlatformPixmapModificationHooks(QPlatformPixmap * pmd)85void QImagePixmapCleanupHooks::executePlatformPixmapModificationHooks(QPlatformPixmap* pmd) 86 { 87 const QImagePixmapCleanupHooks *h = qt_image_and_pixmap_cleanup_hooks(); 88 // the global destructor for the pixmap and image hooks might have 89 // been called already if the app is "leaking" global 90 // pixmaps/images 91 if (!h) 92 return; 93 for (auto hook : h->pixmapModificationHooks) 94 hook(pmd); 95 } 96 executePlatformPixmapDestructionHooks(QPlatformPixmap * pmd)97void QImagePixmapCleanupHooks::executePlatformPixmapDestructionHooks(QPlatformPixmap* pmd) 98 { 99 const QImagePixmapCleanupHooks *h = qt_image_and_pixmap_cleanup_hooks(); 100 // the global destructor for the pixmap and image hooks might have 101 // been called already if the app is "leaking" global 102 // pixmaps/images 103 if (!h) 104 return; 105 for (auto hook : h->pixmapDestructionHooks) 106 hook(pmd); 107 } 108 executeImageHooks(qint64 key)109void QImagePixmapCleanupHooks::executeImageHooks(qint64 key) 110 { 111 const QImagePixmapCleanupHooks *h = qt_image_and_pixmap_cleanup_hooks(); 112 // the global destructor for the pixmap and image hooks might have 113 // been called already if the app is "leaking" global 114 // pixmaps/images 115 if (!h) 116 return; 117 for (auto hook : h->imageHooks) 118 hook(key); 119 } 120 121 enableCleanupHooks(QPlatformPixmap * handle)122void QImagePixmapCleanupHooks::enableCleanupHooks(QPlatformPixmap *handle) 123 { 124 handle->is_cached = true; 125 } 126 enableCleanupHooks(const QPixmap & pixmap)127void QImagePixmapCleanupHooks::enableCleanupHooks(const QPixmap &pixmap) 128 { 129 enableCleanupHooks(const_cast<QPixmap &>(pixmap).data_ptr().data()); 130 } 131 enableCleanupHooks(const QImage & image)132void QImagePixmapCleanupHooks::enableCleanupHooks(const QImage &image) 133 { 134 const_cast<QImage &>(image).data_ptr()->is_cached = true; 135 } 136 isImageCached(const QImage & image)137bool QImagePixmapCleanupHooks::isImageCached(const QImage &image) 138 { 139 return const_cast<QImage &>(image).data_ptr()->is_cached; 140 } 141 isPixmapCached(const QPixmap & pixmap)142bool QImagePixmapCleanupHooks::isPixmapCached(const QPixmap &pixmap) 143 { 144 return const_cast<QPixmap&>(pixmap).data_ptr().data()->is_cached; 145 } 146 147 148 149 QT_END_NAMESPACE 150