Merged gamma files into monitor files.

This commit is contained in:
Camilla Berglund
2014-08-18 12:31:48 +02:00
parent 626dbf6057
commit 59d1aa52f2
11 changed files with 277 additions and 466 deletions
+81
View File
@@ -27,6 +27,7 @@
#include "internal.h"
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
@@ -184,6 +185,23 @@ void _glfwFreeMonitor(_GLFWmonitor* monitor)
free(monitor);
}
void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size)
{
ramp->red = calloc(size, sizeof(unsigned short));
ramp->green = calloc(size, sizeof(unsigned short));
ramp->blue = calloc(size, sizeof(unsigned short));
ramp->size = size;
}
void _glfwFreeGammaArrays(GLFWgammaramp* ramp)
{
free(ramp->red);
free(ramp->green);
free(ramp->blue);
memset(ramp, 0, sizeof(GLFWgammaramp));
}
void _glfwFreeMonitors(_GLFWmonitor** monitors, int count)
{
int i;
@@ -359,3 +377,66 @@ GLFWAPI const GLFWvidmode* glfwGetVideoMode(GLFWmonitor* handle)
return &monitor->currentMode;
}
GLFWAPI void glfwSetGamma(GLFWmonitor* handle, float gamma)
{
int i;
unsigned short values[256];
GLFWgammaramp ramp;
_GLFW_REQUIRE_INIT();
if (gamma <= 0.f)
{
_glfwInputError(GLFW_INVALID_VALUE,
"Gamma value must be greater than zero");
return;
}
for (i = 0; i < 256; i++)
{
double value;
// Calculate intensity
value = i / 255.0;
// Apply gamma curve
value = pow(value, 1.0 / gamma) * 65535.0 + 0.5;
// Clamp to value range
if (value > 65535.0)
value = 65535.0;
values[i] = (unsigned short) value;
}
ramp.red = values;
ramp.green = values;
ramp.blue = values;
ramp.size = 256;
glfwSetGammaRamp(handle, &ramp);
}
GLFWAPI const GLFWgammaramp* glfwGetGammaRamp(GLFWmonitor* handle)
{
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
_GLFW_REQUIRE_INIT_OR_RETURN(NULL);
_glfwFreeGammaArrays(&monitor->currentRamp);
_glfwPlatformGetGammaRamp(monitor, &monitor->currentRamp);
return &monitor->currentRamp;
}
GLFWAPI void glfwSetGammaRamp(GLFWmonitor* handle, const GLFWgammaramp* ramp)
{
_GLFWmonitor* monitor = (_GLFWmonitor*) handle;
_GLFW_REQUIRE_INIT();
if (!monitor->originalRamp.size)
_glfwPlatformGetGammaRamp(monitor, &monitor->originalRamp);
_glfwPlatformSetGammaRamp(monitor, ramp);
}