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