Win32: Adder createDisplayMode helper function to display.c

This commit is contained in:
Elias Naur 2005-12-27 11:12:53 +00:00
parent cbf850fc5e
commit 7861e281c3
1 changed files with 30 additions and 19 deletions

View File

@ -48,13 +48,30 @@
#include "display.h"
#include "common_tools.h"
#define GAMMA_SIZE (3*256)
#define GAMMA_SIZE 256
static bool modeSet = false; // Whether we've done a display mode change
static WORD originalGamma[GAMMA_SIZE]; // Original gamma settings
static WORD currentGamma[GAMMA_SIZE]; // Current gamma settings
static WORD originalGamma[3*GAMMA_SIZE]; // Original gamma settings
static WORD currentGamma[3*GAMMA_SIZE]; // Current gamma settings
static DEVMODE devmode; // Now we'll remember this value for the future
static jobject createDisplayMode(JNIEnv *env, DEVMODE *devmode) {
jclass displayModeClass;
jmethodID displayModeConstructor;
displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode");
if (displayModeClass == NULL)
return NULL;
displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V");
if (displayModeConstructor == NULL)
return NULL;
return (*env)->NewObject(env, displayModeClass, displayModeConstructor,
devmode->dmPelsWidth, devmode->dmPelsHeight,
devmode->dmBitsPerPel, devmode->dmDisplayFrequency);
}
/**
* Choose displaymodes using extended codepath (multiple displaydevices)
*/
@ -62,24 +79,20 @@ jobjectArray getAvailableDisplayModes(JNIEnv * env) {
int i = 0, j = 0, n = 0;
DISPLAY_DEVICE DisplayDevice;
// DISPLAY_DEVICE DisplayDevice;
DEVMODE DevMode;
jobject *display_mode_objects = NULL;
int list_size = 0;
jclass displayModeClass;
jobjectArray ret;
jmethodID displayModeConstructor;
displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode");
ZeroMemory(&DevMode, sizeof(DEVMODE));
ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE));
// ZeroMemory(&DisplayDevice, sizeof(DISPLAY_DEVICE));
DevMode.dmSize = sizeof(DEVMODE);
DisplayDevice.cb = sizeof(DISPLAY_DEVICE);
displayModeClass = (*env)->FindClass(env, "org/lwjgl/opengl/DisplayMode");
displayModeConstructor = (*env)->GetMethodID(env, displayModeClass, "<init>", "(IIII)V");
// DisplayDevice.cb = sizeof(DISPLAY_DEVICE);
/* Multi-monitor stuff commented out since we're only really interested in the primary monitor */
/* while(EnumDisplayDevices(NULL, i++, &DisplayDevice, 0) != 0) {
@ -100,9 +113,7 @@ jobjectArray getAvailableDisplayModes(JNIEnv * env) {
if (display_mode_objects == NULL)
return NULL;
}
displayMode = (*env)->NewObject(env, displayModeClass, displayModeConstructor,
DevMode.dmPelsWidth, DevMode.dmPelsHeight,
DevMode.dmBitsPerPel, DevMode.dmDisplayFrequency);
displayMode = createDisplayMode(env, &DevMode);
display_mode_objects[n++] = displayMode;
}
}
@ -160,7 +171,7 @@ void switchDisplayMode(JNIEnv * env, jobject mode)
int getGammaRampLength(void)
{
return 256;
return GAMMA_SIZE;
}
void setGammaRamp(JNIEnv * env, jobject gammaRampBuffer)
@ -172,12 +183,12 @@ void setGammaRamp(JNIEnv * env, jobject gammaRampBuffer)
const float *gammaRamp = (const float *)(*env)->GetDirectBufferAddress(env, gammaRampBuffer);
// Turn array of floats into array of RGB WORDs
for (i = 0; i < 256; i ++) {
for (i = 0; i < GAMMA_SIZE; i ++) {
scaledRampEntry = gammaRamp[i]*0xffff;
rampEntry = (WORD)scaledRampEntry;
currentGamma[i] = rampEntry;
currentGamma[i + 256] = rampEntry;
currentGamma[i + 512] = rampEntry;
currentGamma[i + GAMMA_SIZE] = rampEntry;
currentGamma[i + 2*GAMMA_SIZE] = rampEntry;
}
screenDC = GetDC(NULL);
if (SetDeviceGammaRamp(screenDC, currentGamma) == FALSE) {
@ -219,7 +230,7 @@ jobject initDisplay(JNIEnv * env)
if (GetDeviceGammaRamp(screenDC, originalGamma) == FALSE) {
printfDebugJava(env, "Failed to get initial device gamma");
}
memcpy(currentGamma, originalGamma, sizeof(WORD)*GAMMA_SIZE);
memcpy(currentGamma, originalGamma, sizeof(WORD)*3*GAMMA_SIZE);
ReleaseDC(NULL, screenDC);
return newMode;
}