QPixmap::QPixmap( const QPixmap &pixmap ) : QPaintDevice( QInternal::Pixmap ) { if ( pixmap.paintingActive() ) { // make a deep copy data = 0; operator=( pixmap.copy() ); } else { data = pixmap.data; data->ref(); devFlags = pixmap.devFlags; // copy QPaintDevice flags #if defined(Q_WS_WIN) hdc = pixmap.hdc; // copy Windows device context #elif defined(Q_WS_X11) hd = pixmap.hd; // copy X11 drawable rendhd = pixmap.rendhd; copyX11Data( &pixmap ); // copy x11Data #elif defined(Q_WS_MAC) hd = pixmap.hd; #endif } }
GLuint QOpenGLTextureCache::bindTexture(QOpenGLContext *context, const QPixmap &pixmap, BindOptions options) { if (pixmap.isNull()) return 0; QMutexLocker locker(&m_mutex); qint64 key = pixmap.cacheKey(); // A QPainter is active on the image - take the safe route and replace the texture. if (!pixmap.paintingActive()) { QOpenGLCachedTexture *entry = m_cache.object(key); if (entry && entry->options() == options) { context->functions()->glBindTexture(GL_TEXTURE_2D, entry->id()); return entry->id(); } } GLuint id = bindTexture(context, key, pixmap.toImage(), options); if (id > 0) QImagePixmapCleanupHooks::enableCleanupHooks(pixmap); return id; }