QImage TextureFile::palette() const { if (depth() >= 16) { return QImage(); } QImage image(paletteSize(), QImage::Format_ARGB32); int x, y; const int maxWidth = image.width() - 1, maxHeight = image.height() - 1; image.fill(Qt::black); x = y = 0; foreach (const QVector<QRgb> &colorTable, exportColorTables()) { foreach (const QRgb &color, colorTable) { if (y > maxHeight) { qWarning() << "More color tables than palette height"; return image; } image.setPixel(x, y, color); if (x >= maxWidth) { x = 0; ++y; } else { ++x; } } }
GLuint QOpenGL2GradientCache::addCacheElement(quint64 hash_val, const QGradient &gradient, qreal opacity) { QOpenGLFunctions *funcs = QOpenGLContext::currentContext()->functions(); if (cache.size() == maxCacheSize()) { int elem_to_remove = qrand() % maxCacheSize(); quint64 key = cache.keys()[elem_to_remove]; // need to call glDeleteTextures on each removed cache entry: QOpenGLGradientColorTableHash::const_iterator it = cache.constFind(key); do { funcs->glDeleteTextures(1, &it.value().texId); } while (++it != cache.constEnd() && it.key() == key); cache.remove(key); // may remove more than 1, but OK } CacheInfo cache_entry(gradient.stops(), opacity, gradient.interpolationMode()); uint buffer[1024]; generateGradientColorTable(gradient, buffer, paletteSize(), opacity); funcs->glGenTextures(1, &cache_entry.texId); funcs->glBindTexture(GL_TEXTURE_2D, cache_entry.texId); funcs->glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, paletteSize(), 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); return cache.insert(hash_val, cache_entry).value().texId; }