feat(dxgi): expose DPI information

This commit is contained in:
ArcticLampyrid committed 2026-10-18 08:47:56 +08:00
1 parent 50930cdbc0
commit 9819158331
1 file changed
+12 -9
+12 -9
View File
@@ -64,7 +64,7 @@ pub enum DxgiPrintContextError {
FailedToClosePrintControl(#[source] windows::core::Error), FailedToClosePrintControl(#[source] windows::core::Error),
} }
const DEFAULT_DPI: i16 = 300; const DEFAULT_DPI: u32 = 300;
/// Represents a print context during printing via DXGI. /// Represents a print context during printing via DXGI.
#[allow(missing_docs)] #[allow(missing_docs)]
@@ -80,6 +80,7 @@ pub struct DxgiPrintContext {
pub document_target: IPrintDocumentPackageTarget, pub document_target: IPrintDocumentPackageTarget,
pub print_control: ID2D1PrintControl, pub print_control: ID2D1PrintControl,
pub completion_waiter: PrintCompletionWaiter, pub completion_waiter: PrintCompletionWaiter,
pub dpi: (u32, u32),
// The last field will be dropped last, according to the drop order. // The last field will be dropped last, according to the drop order.
_com_initializer: ComInitializer, _com_initializer: ComInitializer,
} }
@@ -97,27 +98,27 @@ impl DxgiPrintContext {
let dev_mode = options let dev_mode = options
.to_dev_mode(device) .to_dev_mode(device)
.map_err(DxgiPrintContextError::PrintTicketError)?; .map_err(DxgiPrintContextError::PrintTicketError)?;
let raster_dpi = { let dpi = {
let dev_mode = &*(dev_mode.as_ptr() as *const DEVMODEW); let dev_mode = &*(dev_mode.as_ptr() as *const DEVMODEW);
let dpi_x = if (dev_mode.dmFields & windows::Win32::Graphics::Gdi::DM_PRINTQUALITY) let dpi_x = if (dev_mode.dmFields & windows::Win32::Graphics::Gdi::DM_PRINTQUALITY)
.0 .0
!= 0 != 0
{ {
Some(dev_mode.Anonymous1.Anonymous1.dmPrintQuality) Some(dev_mode.Anonymous1.Anonymous1.dmPrintQuality).filter(|x| *x > 0)
} else { } else {
None None
}; };
let dpi_y = let dpi_y =
if (dev_mode.dmFields & windows::Win32::Graphics::Gdi::DM_YRESOLUTION).0 != 0 { if (dev_mode.dmFields & windows::Win32::Graphics::Gdi::DM_YRESOLUTION).0 != 0 {
Some(dev_mode.dmYResolution) Some(dev_mode.dmYResolution).filter(|y| *y > 0)
} else { } else {
None None
}; };
match (dpi_x, dpi_y) { match (dpi_x, dpi_y) {
(Some(x), Some(y)) => max(x, y), (Some(x), Some(y)) => (x as u32, y as u32),
(Some(x), None) => x, (Some(x), None) => (x as u32, x as u32),
(None, Some(y)) => y, (None, Some(y)) => (y as u32, y as u32),
(None, None) => DEFAULT_DPI, (None, None) => (DEFAULT_DPI, DEFAULT_DPI),
} }
}; };
let mut d3d_device: Option<ID3D11Device> = None; let mut d3d_device: Option<ID3D11Device> = None;
@@ -157,6 +158,7 @@ impl DxgiPrintContext {
let d2d_context = d2d_device let d2d_context = d2d_device
.CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE) .CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE)
.map_err(DxgiPrintContextError::InitializeDirectX)?; .map_err(DxgiPrintContextError::InitializeDirectX)?;
d2d_context.SetDpi(dpi.0 as f32, dpi.1 as f32);
let wic_factory: IWICImagingFactory2 = let wic_factory: IWICImagingFactory2 =
CoCreateInstance(&CLSID_WICImagingFactory2, None, CLSCTX_ALL) CoCreateInstance(&CLSID_WICImagingFactory2, None, CLSCTX_ALL)
@@ -176,7 +178,7 @@ impl DxgiPrintContext {
) )
.map_err(DxgiPrintContextError::FailedToStartJob)?; .map_err(DxgiPrintContextError::FailedToStartJob)?;
let print_control_options = D2D1_PRINT_CONTROL_PROPERTIES { let print_control_options = D2D1_PRINT_CONTROL_PROPERTIES {
rasterDPI: raster_dpi as f32, rasterDPI: max(dpi.0, dpi.1) as f32,
..Default::default() ..Default::default()
}; };
let print_control = d2d_device let print_control = d2d_device
@@ -211,6 +213,7 @@ impl DxgiPrintContext {
document_target, document_target,
print_control, print_control,
completion_waiter, completion_waiter,
dpi,
_com_initializer, _com_initializer,
}) })
} }