From ec286936d97ed529b4c2fb75a6d4ebe8dc0e86da Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Tue, 7 Apr 2020 12:43:27 -0700 Subject: [PATCH 1/4] Fix PrinterSettings.SupportsColor to use the right PInvoke --- .../System.Drawing.Common/src/System/Drawing/Gdiplus.cs | 1 + .../src/System/Drawing/Printing/PrinterSettings.Windows.cs | 2 +- .../tests/Printing/PrinterSettingsTests.cs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs b/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs index e42459df59d1b4..2a9449435a9387 100644 --- a/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs +++ b/src/libraries/System.Drawing.Common/src/System/Drawing/Gdiplus.cs @@ -178,6 +178,7 @@ public const int DC_PAPERNAMES = 16, DC_ORIENTATION = 17, DC_COPIES = 18, + DC_COLORDEVICE = 32, PD_ALLPAGES = 0x00000000, PD_SELECTION = 0x00000001, PD_PAGENUMS = 0x00000002, diff --git a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs index 248ea747361199..adfb9b1dd789f4 100644 --- a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs +++ b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs @@ -517,7 +517,7 @@ public bool SupportsColor { get { - return GetDeviceCaps(Interop.Gdi32.DeviceCapability.BITSPIXEL, 1) > 1; + return DeviceCapabilities(SafeNativeMethods.DC_COLORDEVICE, IntPtr.Zero, 0) == 1; } } diff --git a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs index 096ad2001e8d07..b40fc562f25e44 100644 --- a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs +++ b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs @@ -437,6 +437,7 @@ public void SupportsColor_ReturnsExpected() { var printerSettings = new PrinterSettings(); bool supportsColor = printerSettings.SupportsColor; + Assert.True(supportsColor); } [Theory] From 8d120d6a41ec108bda28893ee3a0f62050daed6d Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Fri, 10 Apr 2020 15:44:27 -0700 Subject: [PATCH 2/4] PR Fedback --- .../src/System/Drawing/Printing/PrinterSettings.Windows.cs | 1 + .../tests/Printing/PrinterSettingsTests.cs | 7 +++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs index adfb9b1dd789f4..067b8041b48a7b 100644 --- a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs +++ b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs @@ -517,6 +517,7 @@ public bool SupportsColor { get { + // If the printer supports color printing, the return value is 1; otherwise, the return value is zero. The pOutput parameter is not used. return DeviceCapabilities(SafeNativeMethods.DC_COLORDEVICE, IntPtr.Zero, 0) == 1; } } diff --git a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs index b40fc562f25e44..cd0984fc82d126 100644 --- a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs +++ b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs @@ -431,13 +431,12 @@ public void IsDirectPrintingSupported_ImageNotSupported_ReturnsExpected() } } - [ActiveIssue("https://github.com/dotnet/runtime/issues/22221", TestPlatforms.AnyUnix)] + [PlatformSpecific(TestPlatforms.Windows)] [ConditionalFact(Helpers.AnyInstalledPrinters, Helpers.IsDrawingSupported)] public void SupportsColor_ReturnsExpected() { - var printerSettings = new PrinterSettings(); - bool supportsColor = printerSettings.SupportsColor; - Assert.True(supportsColor); + var printerSettings = new PrinterSettings() { PrinterName = "Microsoft Print to PDF" }; + Assert.True(printerSettings.SupportsColor); } [Theory] From 023abb19e7144276eaa7465d0101c2ce79b93dde Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Mon, 13 Apr 2020 18:27:49 -0700 Subject: [PATCH 3/4] Fix test --- .../tests/Printing/PrinterSettingsTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs index cd0984fc82d126..f755560210194b 100644 --- a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs +++ b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs @@ -432,10 +432,10 @@ public void IsDirectPrintingSupported_ImageNotSupported_ReturnsExpected() } [PlatformSpecific(TestPlatforms.Windows)] - [ConditionalFact(Helpers.AnyInstalledPrinters, Helpers.IsDrawingSupported)] + [ConditionalFact(typeof(PrinterSettingsTests), nameof(CanTestSetHdevmode_IntPtr_Success))] public void SupportsColor_ReturnsExpected() { - var printerSettings = new PrinterSettings() { PrinterName = "Microsoft Print to PDF" }; + var printerSettings = new PrinterSettings() { PrinterName = GetNameOfTestPrinterSuitableForDevModeTesting() }; Assert.True(printerSettings.SupportsColor); } From f4e3ab29f258df0703c108e834d0882c508ddd94 Mon Sep 17 00:00:00 2001 From: Santiago Fernandez Madero Date: Tue, 14 Apr 2020 13:13:07 -0700 Subject: [PATCH 4/4] PR Feedbak --- .../System/Drawing/Printing/PrinterSettings.Windows.cs | 8 ++++++-- .../tests/Printing/PrinterSettingsTests.cs | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs index 067b8041b48a7b..2210000175fad7 100644 --- a/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs +++ b/src/libraries/System.Drawing.Common/src/System/Drawing/Printing/PrinterSettings.Windows.cs @@ -517,8 +517,12 @@ public bool SupportsColor { get { - // If the printer supports color printing, the return value is 1; otherwise, the return value is zero. The pOutput parameter is not used. - return DeviceCapabilities(SafeNativeMethods.DC_COLORDEVICE, IntPtr.Zero, 0) == 1; + // If the printer supports color printing, the return value is 1; otherwise, the return value is zero. + // The pointerToBuffer parameter is not used. + return DeviceCapabilities( + capability: SafeNativeMethods.DC_COLORDEVICE, + pointerToBuffer: IntPtr.Zero, + defaultValue: 0) == 1; } } diff --git a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs index f755560210194b..58393454f54250 100644 --- a/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs +++ b/src/libraries/System.Drawing.Common/tests/Printing/PrinterSettingsTests.cs @@ -435,6 +435,8 @@ public void IsDirectPrintingSupported_ImageNotSupported_ReturnsExpected() [ConditionalFact(typeof(PrinterSettingsTests), nameof(CanTestSetHdevmode_IntPtr_Success))] public void SupportsColor_ReturnsExpected() { + // XPS and PDF printers support color. + // docs.microsoft.com/en-us/windows-hardware/drivers/print/improved-color-printing var printerSettings = new PrinterSettings() { PrinterName = GetNameOfTestPrinterSuitableForDevModeTesting() }; Assert.True(printerSettings.SupportsColor); } @@ -608,7 +610,7 @@ private static string GetNameOfTestPrinterSuitableForDevModeTesting() private static readonly string[] s_TestPrinterNames = { - // Our method of testing this api requires a printer that supports multi-copy printing, collating and duplex settings. Not all printers + // Our method of testing some apis requires a printer that supports multi-copy printing, collating, color and duplex settings. Not all printers // support these so rather than trust the machine running the test to have configured such a printer as the default, use the name of // a known compliant printer that ships with Windows 10. "Microsoft Print to PDF",