From 73812409b45ba2afb4d1e3f93f08030b1c5a1a37 Mon Sep 17 00:00:00 2001 From: Filip Navara Date: Mon, 3 May 2004 17:15:14 +0000 Subject: [PATCH] =?UTF-8?q?-=20Implementation=20of=20IOCTL=5FVIDEO=5FQUERY?= =?UTF-8?q?=5FCURRENT=5FMODE.=20Based=20on=20patch=20by=20Herv=EF=BF=BD=20?= =?UTF-8?q?Poussineau.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/; revision=9296 --- reactos/drivers/video/miniport/vbe/vbemp.c | 148 ++++++++++++++------- reactos/drivers/video/miniport/vbe/vbemp.h | 6 + 2 files changed, 105 insertions(+), 49 deletions(-) diff --git a/reactos/drivers/video/miniport/vbe/vbemp.c b/reactos/drivers/video/miniport/vbe/vbemp.c index 1d40c57643d..44ab1191fc6 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.c +++ b/reactos/drivers/video/miniport/vbe/vbemp.c @@ -442,7 +442,8 @@ VBEStartIO( break; case IOCTL_VIDEO_UNMAP_VIDEO_MEMORY: - Result = VBEUnmapVideoMemory((PVBE_DEVICE_EXTENSION)HwDeviceExtension, + Result = VBEUnmapVideoMemory( + (PVBE_DEVICE_EXTENSION)HwDeviceExtension, RequestPacket->StatusBlock); break; @@ -482,6 +483,17 @@ VBEStartIO( break; case IOCTL_VIDEO_QUERY_CURRENT_MODE: + if (RequestPacket->OutputBufferLength < sizeof(VIDEO_MODE_INFORMATION)) + { + RequestPacket->StatusBlock->Status = ERROR_INSUFFICIENT_BUFFER; + return TRUE; + } + Result = VBEQueryCurrentMode( + (PVBE_DEVICE_EXTENSION)HwDeviceExtension, + (PVIDEO_MODE_INFORMATION)RequestPacket->OutputBuffer, + RequestPacket->StatusBlock); + break; + default: RequestPacket->StatusBlock->Status = STATUS_NOT_IMPLEMENTED; return FALSE; @@ -651,6 +663,69 @@ VBEQueryNumAvailModes( return TRUE; } +/* + * VBEQueryMode + * + * Returns information about one particular video mode. + */ + +VOID FASTCALL +VBEQueryMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoMode, + ULONG VideoModeId) +{ + PVBE_MODEINFO VBEMode = &DeviceExtension->ModeInfo[VideoModeId]; + + VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION); + VideoMode->ModeIndex = VideoModeId; + VideoMode->VisScreenWidth = VBEMode->XResolution; + VideoMode->VisScreenHeight = VBEMode->YResolution; + VideoMode->ScreenStride = VBEMode->BytesPerScanLine; + VideoMode->NumberOfPlanes = VBEMode->NumberOfPlanes; + VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes; + VideoMode->Frequency = 0; /* FIXME */ + VideoMode->XMillimeter = 0; /* FIXME */ + VideoMode->YMillimeter = 0; /* FIXME */ + if (VBEMode->BitsPerPixel > 8) + { + if (DeviceExtension->VBEVersion < 0x300) + { + VideoMode->NumberRedBits = VBEMode->RedMaskSize; + VideoMode->NumberGreenBits = VBEMode->GreenMaskSize; + VideoMode->NumberBlueBits = VBEMode->BlueMaskSize; + VideoMode->RedMask = ((1 << VBEMode->RedMaskSize) - 1) << VBEMode->RedFieldPosition; + VideoMode->GreenMask = ((1 << VBEMode->GreenMaskSize) - 1) << VBEMode->GreenFieldPosition; + VideoMode->BlueMask = ((1 << VBEMode->BlueMaskSize) - 1) << VBEMode->BlueFieldPosition; + } + else + { + VideoMode->NumberRedBits = VBEMode->LinRedMaskSize; + VideoMode->NumberGreenBits = VBEMode->LinGreenMaskSize; + VideoMode->NumberBlueBits = VBEMode->LinBlueMaskSize; + VideoMode->RedMask = ((1 << VBEMode->LinRedMaskSize) - 1) << VBEMode->LinRedFieldPosition; + VideoMode->GreenMask = ((1 << VBEMode->LinGreenMaskSize) - 1) << VBEMode->LinGreenFieldPosition; + VideoMode->BlueMask = ((1 << VBEMode->LinBlueMaskSize) - 1) << VBEMode->LinBlueFieldPosition; + } + } + else + { + VideoMode->NumberRedBits = + VideoMode->NumberGreenBits = + VideoMode->NumberBlueBits = 6; + VideoMode->RedMask = + VideoMode->GreenMask = + VideoMode->BlueMask = 0; + } + VideoMode->VideoMemoryBitmapWidth = VBEMode->XResolution; + VideoMode->VideoMemoryBitmapHeight = VBEMode->YResolution; + VideoMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | + VIDEO_MODE_NO_OFF_SCREEN; + if (VideoMode->BitsPerPlane <= 8) + VideoMode->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN; + VideoMode->DriverSpecificAttributeFlags = 0; +} + /* * VBEQueryAvailModes * @@ -672,54 +747,7 @@ VBEQueryAvailModes( CurrentModeId < DeviceExtension->ModeCount; CurrentModeId++, CurrentMode++, CurrentVBEMode++) { - CurrentMode->Length = sizeof(VIDEO_MODE_INFORMATION); - CurrentMode->ModeIndex = CurrentModeId; - CurrentMode->VisScreenWidth = CurrentVBEMode->XResolution; - CurrentMode->VisScreenHeight = CurrentVBEMode->YResolution; - CurrentMode->ScreenStride = CurrentVBEMode->BytesPerScanLine; - CurrentMode->NumberOfPlanes = CurrentVBEMode->NumberOfPlanes; - CurrentMode->BitsPerPlane = CurrentVBEMode->BitsPerPixel / - CurrentVBEMode->NumberOfPlanes; - CurrentMode->Frequency = 0; /* FIXME */ - CurrentMode->XMillimeter = 0; /* FIXME */ - CurrentMode->YMillimeter = 0; /* FIXME */ - if (CurrentVBEMode->BitsPerPixel > 8) - { - if (DeviceExtension->VBEVersion < 0x300) - { - CurrentMode->NumberRedBits = CurrentVBEMode->RedMaskSize; - CurrentMode->NumberGreenBits = CurrentVBEMode->GreenMaskSize; - CurrentMode->NumberBlueBits = CurrentVBEMode->BlueMaskSize; - CurrentMode->RedMask = ((1 << CurrentVBEMode->RedMaskSize) - 1) << CurrentVBEMode->RedFieldPosition; - CurrentMode->GreenMask = ((1 << CurrentVBEMode->GreenMaskSize) - 1) << CurrentVBEMode->GreenFieldPosition; - CurrentMode->BlueMask = ((1 << CurrentVBEMode->BlueMaskSize) - 1) << CurrentVBEMode->BlueFieldPosition; - } - else - { - CurrentMode->NumberRedBits = CurrentVBEMode->LinRedMaskSize; - CurrentMode->NumberGreenBits = CurrentVBEMode->LinGreenMaskSize; - CurrentMode->NumberBlueBits = CurrentVBEMode->LinBlueMaskSize; - CurrentMode->RedMask = ((1 << CurrentVBEMode->LinRedMaskSize) - 1) << CurrentVBEMode->LinRedFieldPosition; - CurrentMode->GreenMask = ((1 << CurrentVBEMode->LinGreenMaskSize) - 1) << CurrentVBEMode->LinGreenFieldPosition; - CurrentMode->BlueMask = ((1 << CurrentVBEMode->LinBlueMaskSize) - 1) << CurrentVBEMode->LinBlueFieldPosition; - } - } - else - { - CurrentMode->NumberRedBits = - CurrentMode->NumberGreenBits = - CurrentMode->NumberBlueBits = 6; - CurrentMode->RedMask = - CurrentMode->GreenMask = - CurrentMode->BlueMask = 0; - } - CurrentMode->VideoMemoryBitmapWidth = CurrentVBEMode->XResolution; - CurrentMode->VideoMemoryBitmapHeight = CurrentVBEMode->YResolution; - CurrentMode->AttributeFlags = VIDEO_MODE_GRAPHICS | VIDEO_MODE_COLOR | - VIDEO_MODE_NO_OFF_SCREEN; - if (CurrentMode->BitsPerPlane <= 8) - CurrentMode->AttributeFlags |= VIDEO_MODE_PALETTE_DRIVEN; - CurrentMode->DriverSpecificAttributeFlags = 0; + VBEQueryMode(DeviceExtension, CurrentMode, CurrentModeId); } StatusBlock->Information = @@ -728,6 +756,28 @@ VBEQueryAvailModes( return TRUE; } +/* + * VBEQueryCurrentMode + * + * Returns information about current video mode. + */ + +BOOL FASTCALL +VBEQueryCurrentMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoModeInfo, + PSTATUS_BLOCK StatusBlock) +{ + StatusBlock->Information = sizeof(VIDEO_MODE_INFORMATION); + + VBEQueryMode( + DeviceExtension, + VideoModeInfo, + DeviceExtension->CurrentMode); + + return TRUE; +} + /* * VBESetColorRegisters * diff --git a/reactos/drivers/video/miniport/vbe/vbemp.h b/reactos/drivers/video/miniport/vbe/vbemp.h index 36842a7e291..6753733cb9a 100644 --- a/reactos/drivers/video/miniport/vbe/vbemp.h +++ b/reactos/drivers/video/miniport/vbe/vbemp.h @@ -215,6 +215,12 @@ VBEQueryAvailModes( PVIDEO_MODE_INFORMATION ReturnedModes, PSTATUS_BLOCK StatusBlock); +BOOL FASTCALL +VBEQueryCurrentMode( + PVBE_DEVICE_EXTENSION DeviceExtension, + PVIDEO_MODE_INFORMATION VideoModeInfo, + PSTATUS_BLOCK StatusBlock); + BOOL FASTCALL VBESetColorRegisters( PVBE_DEVICE_EXTENSION DeviceExtension,