Example #1
0
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;
}