void TestTransferFunctionColorWidget::initWithTestData()
{
	vtkImageDataPtr dummyImageData = cx::Image::createDummyImageData(2, 1);
	cx::ImagePtr dummyImage(new cx::Image("DummyImage", dummyImageData));
	cx::ImageTFDataPtr transferFunction;
	transferFunction = dummyImage->getTransferFunctions3D();
	this->setData(dummyImage, transferFunction);
}
StelQGLTextureBackend* StelQGLTextureBackend::fromViewport
	(StelQGLRenderer* renderer, const QSize viewportSize, const QGLFormat& viewportFormat)
{
	// This function should only be used as a fallback for when FBOs aren't supported.


	const int r = viewportFormat.redBufferSize();
	const int g = viewportFormat.greenBufferSize();
	const int b = viewportFormat.blueBufferSize();
	const int a = viewportFormat.alpha() ? viewportFormat.alphaBufferSize() : 0;

	// Creating a texture from a dummy image.
	QImage dummyImage(64, 64, QImage::Format_Mono);
	const TextureParams params = TextureParams();

	StelQGLTextureBackend* result = 
		new StelQGLTextureBackend(renderer, QString(), params);

	// Get image and GL pixel format matching viewport format.
	int glFormat;

	if(r == 8 && g == 8 && b == 8 && a == 8)     
	{
		glFormat           = GL_RGBA8;
		result->pixelBytes = 4.0f;
	}
	else if(r == 8 && g == 8 && b == 8 && a == 0)
	{
		glFormat           = GL_RGB8;
		result->pixelBytes = 3.0f;
	}
	else if(r == 5 && g == 6 && b == 5 && a == 0)
	{
		glFormat           = GL_RGB5;
		result->pixelBytes = 2.0f;
	}
	else
	{
		// This is extremely unlikely, but we can't rule it out.
		Q_ASSERT_X(false, Q_FUNC_INFO,
		           "Unknown screen vertex format when getting texture from viewport. "
		           "Switching to OpenGL2, disabling viewport effects or "
		           "chaning video mode bit depth might help");
		// Invalid value to avoid warnings.
		glFormat = -1;
	}

	QGLContext* context = result->prepareContextForLoading();
	const GLuint glTextureID = 
	    context->bindTexture(dummyImage, GL_TEXTURE_2D, glFormat,
	                         getTextureBindOptions(params));

	// Need a power-of-two texture (as this is used mainly with GL1)
	const QSize size = 
		StelUtils::smallestPowerOfTwoSizeGreaterOrEqualTo(viewportSize);

	// Set viewport so it matches the size of the texture
	glViewport(0, 0, size.width(), size.height());
	// Copy viewport to texture (this overrides texture size - we must use POT for GL1)
	glCopyTexImage2D(GL_TEXTURE_2D, 0, glFormat, 0, 0, size.width(), size.height(), 0);
	// Restore viewport
	glViewport(0, 0, viewportSize.width(), viewportSize.height());

	// Will need change if different screen bit depths are ever supported
	renderer->getStatistics()[ESTIMATED_TEXTURE_MEMORY]
		+= size.width() * size.height() * result->pixelBytes;

	result->startedLoading();
	result->glTextureID = glTextureID;
	result->finishedLoading(size);

	return result;
}