316 lines
7.5 KiB
C
316 lines
7.5 KiB
C
/*++
|
|
|
|
Copyright (c) 1996-1997 Microsoft Corporation.
|
|
Copyright (c) 1996-1997 Cirrus Logic, Inc.,
|
|
|
|
Module Name:
|
|
|
|
C L G A M M A . C
|
|
|
|
Abstract:
|
|
|
|
This routine accesses Gamma correction information from the following
|
|
NT 4.0 registry.
|
|
|
|
Registry subdirectory : System\CurrentControlSet\Services\cirrus\Device0
|
|
Keys : "G Gamma", and "G Contrast"
|
|
|
|
Environment:
|
|
|
|
Kernel mode only
|
|
|
|
Notes:
|
|
*
|
|
* chu01 12-16-96 : Color correction start coding.
|
|
*
|
|
*
|
|
--*/
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// HEADER FILES
|
|
//---------------------------------------------------------------------------
|
|
|
|
//#include <ntddk.h>
|
|
#include <dderror.h>
|
|
#include <devioctl.h>
|
|
#include <miniport.h> // I added
|
|
#include "clmini.h"
|
|
|
|
#include <ntddvdeo.h>
|
|
#include <video.h>
|
|
#include "cirrus.h"
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
// FUNCTION PROTOTYPE
|
|
//---------------------------------------------------------------------------
|
|
|
|
VP_STATUS
|
|
VgaGetGammaFactor(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PGAMMA_VALUE value,
|
|
ULONG ValueLength,
|
|
PULONG OutputSize
|
|
);
|
|
|
|
VP_STATUS
|
|
VgaGetContrastFactor(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PCONTRAST_VALUE value,
|
|
ULONG ValueLength,
|
|
PULONG OutputSize
|
|
);
|
|
|
|
VP_STATUS GetGammaKeyInfoFromReg(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
) ;
|
|
|
|
VP_STATUS GetContrastKeyInfoFromReg(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
) ;
|
|
|
|
VP_STATUS GetGammaCorrectInfoCallBack (
|
|
PVOID HwDeviceExtension,
|
|
PVOID Context,
|
|
PWSTR ValueName,
|
|
PVOID ValueData,
|
|
ULONG ValueLength
|
|
) ;
|
|
|
|
#if defined(ALLOC_PRAGMA)
|
|
#pragma alloc_text(PAGE,GetGammaKeyInfoFromReg)
|
|
#pragma alloc_text(PAGE,GetContrastKeyInfoFromReg)
|
|
#pragma alloc_text(PAGE,GetGammaCorrectInfoCallBack)
|
|
#pragma alloc_text(PAGE,VgaGetGammaFactor)
|
|
#pragma alloc_text(PAGE,VgaGetContrastFactor)
|
|
#endif
|
|
|
|
UCHAR GammaInfo[4] ;
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function: Get Gamma factor
|
|
//
|
|
// Input:
|
|
// None
|
|
//
|
|
// Output:
|
|
// NO_ERROR: successful; otherwise: fail
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VP_STATUS VgaGetGammaFactor(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PGAMMA_VALUE value,
|
|
ULONG ValueLength,
|
|
PULONG OutputSize
|
|
)
|
|
{
|
|
|
|
VP_STATUS status ;
|
|
int i ;
|
|
|
|
VideoDebugPrint((2, "VgaGetGammaFactor\n")) ;
|
|
|
|
if ( ValueLength < (*OutputSize = sizeof(PGAMMA_VALUE)) )
|
|
return ERROR_INSUFFICIENT_BUFFER;
|
|
|
|
status = GetGammaKeyInfoFromReg(HwDeviceExtension) ;
|
|
|
|
if (status == NO_ERROR)
|
|
{
|
|
for (i = 0; i < 4; i++)
|
|
value->value[i] = GammaInfo[i] ;
|
|
}
|
|
else if (status == ERROR_INVALID_PARAMETER)
|
|
{
|
|
//
|
|
// If no subkey exists, we assign the default value. Otherwise the
|
|
// system would fail.
|
|
//
|
|
for (i = 0; i < 4; i++)
|
|
value->value[i] = 0x7f ;
|
|
status = NO_ERROR ;
|
|
}
|
|
|
|
VideoDebugPrint((1, "Gamma value = %lx\n", *value)) ;
|
|
|
|
return status ;
|
|
|
|
} // VgaGetGammaFactor
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function: Get Contrast factor
|
|
//
|
|
// Input:
|
|
// None
|
|
//
|
|
// Output:
|
|
// NO_ERROR: successful; otherwise: fail
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VP_STATUS VgaGetContrastFactor(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension,
|
|
PCONTRAST_VALUE value,
|
|
ULONG ValueLength,
|
|
PULONG OutputSize
|
|
)
|
|
{
|
|
|
|
VP_STATUS status ;
|
|
int i ;
|
|
|
|
VideoDebugPrint((2, "VgaGetContrastFactor\n")) ;
|
|
|
|
if ( ValueLength < (*OutputSize = sizeof(PCONTRAST_VALUE)) ) {
|
|
|
|
return ERROR_INSUFFICIENT_BUFFER;
|
|
|
|
}
|
|
|
|
status = GetContrastKeyInfoFromReg(HwDeviceExtension) ;
|
|
|
|
if (status == NO_ERROR)
|
|
{
|
|
for (i = 0; i < 4; i++)
|
|
value->value[i] = GammaInfo[i] ;
|
|
}
|
|
else if (status == ERROR_INVALID_PARAMETER)
|
|
{
|
|
//
|
|
// If no subkey exists, we assign the default value. Otherwise the
|
|
// system would fail.
|
|
//
|
|
for (i = 0; i < 4; i++)
|
|
value->value[i] = 0x80 ;
|
|
status = NO_ERROR ;
|
|
}
|
|
|
|
VideoDebugPrint((1, "Contrast value = %lx\n", *value)) ;
|
|
return status ;
|
|
|
|
|
|
} // VgaGetContrastFactor
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function: Get Gamma Key information from data registry.
|
|
//
|
|
// Input:
|
|
// None
|
|
//
|
|
// Output:
|
|
// NO_ERROR: successful; otherwise: fail
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VP_STATUS GetGammaKeyInfoFromReg(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
)
|
|
{
|
|
|
|
VP_STATUS status ;
|
|
|
|
VideoDebugPrint((2, "GetGammaKeyInfoFromReg\n")) ;
|
|
|
|
status = VideoPortGetRegistryParameters(HwDeviceExtension,
|
|
L"G Gamma",
|
|
FALSE,
|
|
GetGammaCorrectInfoCallBack,
|
|
NULL) ;
|
|
if (status != NO_ERROR)
|
|
{
|
|
VideoDebugPrint((1, "Fail to access Gamma key info from registry\n"));
|
|
}
|
|
|
|
return status ;
|
|
|
|
|
|
} // GetGammaKeyInfoFromReg
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function: Get Contrast Key information from data registry.
|
|
//
|
|
// Input:
|
|
// None
|
|
//
|
|
// Output:
|
|
// NO_ERROR: successful; otherwise: fail
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VP_STATUS GetContrastKeyInfoFromReg(
|
|
PHW_DEVICE_EXTENSION HwDeviceExtension
|
|
)
|
|
{
|
|
VP_STATUS status ;
|
|
VideoDebugPrint((2, "GetContrastKeyInfoFromReg\n")) ;
|
|
|
|
status = VideoPortGetRegistryParameters(HwDeviceExtension,
|
|
L"G Contrast",
|
|
FALSE,
|
|
GetGammaCorrectInfoCallBack,
|
|
NULL) ;
|
|
if (status != NO_ERROR)
|
|
{
|
|
VideoDebugPrint((1, "Fail to access Contrast key info from registry\n"));
|
|
}
|
|
return status ;
|
|
|
|
} // GetContrastKeyInfoFromReg
|
|
|
|
|
|
//---------------------------------------------------------------------------
|
|
//
|
|
// Function: Get Gamma coorrection information from data registry.
|
|
//
|
|
// Input:
|
|
// None
|
|
//
|
|
// Output:
|
|
// NO_ERROR: successful ; otherwise: fail
|
|
//
|
|
//---------------------------------------------------------------------------
|
|
VP_STATUS
|
|
GetGammaCorrectInfoCallBack (
|
|
PVOID HwDeviceExtension,
|
|
PVOID Context,
|
|
PWSTR ValueName,
|
|
PVOID ValueData,
|
|
ULONG ValueLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
This routine get the desired info from data registry.
|
|
|
|
Arguments:
|
|
HwDeviceExtension - Supplies a pointer to the miniport's device extension.
|
|
Context - Context value passed to the get registry paramters routine.
|
|
ValueName - Name of the value requested.
|
|
ValueData - Pointer to the requested data.
|
|
ValueLength - Length of the requested data.
|
|
|
|
Return Value:
|
|
returns NO_ERROR if the paramter was TRUE.
|
|
returns ERROR_INVALID_PARAMETER otherwise.
|
|
|
|
--*/
|
|
|
|
{
|
|
VideoDebugPrint((2, "GetGammaCorrectInfoCallBack\n"));
|
|
|
|
if (ValueLength == 0x04)
|
|
{
|
|
VideoPortMoveMemory (GammaInfo, ValueData, ValueLength) ;
|
|
return NO_ERROR ;
|
|
}
|
|
else
|
|
{
|
|
return ERROR_INVALID_PARAMETER ;
|
|
}
|
|
|
|
} // GetGammaCorrectInfoCallBack
|