[VBEMP]
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 23 Dec 2010 12:11:19 +0000 (12:11 +0000)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 23 Dec 2010 12:11:19 +0000 (12:11 +0000)
Fix rounding error when calculating display size
Loosely based on patch by neoman.
Fixes gdi32_winetest:mapping

See issue #5790 for more details.

svn path=/trunk/; revision=50112

reactos/drivers/video/miniport/vbe/vbemp.c

index b8ee6e1..dc251da 100644 (file)
@@ -847,6 +847,7 @@ VBEQueryMode(
    ULONG VideoModeId)
 {
    PVBE_MODEINFO VBEMode = &DeviceExtension->ModeInfo[VideoModeId];
+   ULONG dpi;
 
    VideoMode->Length = sizeof(VIDEO_MODE_INFORMATION);
    VideoMode->ModeIndex = VideoModeId;
@@ -860,9 +861,10 @@ VBEQueryMode(
    VideoMode->BitsPerPlane = VBEMode->BitsPerPixel / VBEMode->NumberOfPlanes;
    VideoMode->Frequency = 1;
 
-   /* Assume 96DPI and 25.4 millimeters per inch */
-   VideoMode->XMillimeter = VBEMode->XResolution * 254 / 960;
-   VideoMode->YMillimeter = VBEMode->YResolution * 254 / 960;
+   /* Assume 96DPI and 25.4 millimeters per inch, round to nearest */
+   dpi = 96;
+   VideoMode->XMillimeter = ((ULONGLONG)VBEMode->XResolution * 254 + (dpi * 5)) / (dpi * 10);
+   VideoMode->YMillimeter = ((ULONGLONG)VBEMode->YResolution * 254 + (dpi * 5)) / (dpi * 10);
 
    if (VBEMode->BitsPerPixel > 8)
    {