diff --git a/piet-direct2d/src/d2d.rs b/piet-direct2d/src/d2d.rs index 185b1205..a0bce997 100644 --- a/piet-direct2d/src/d2d.rs +++ b/piet-direct2d/src/d2d.rs @@ -784,7 +784,7 @@ impl DeviceContext { &mut self, width: usize, height: usize, - alpha_mode: D2D1_ALPHA_MODE, + dpi_scale: f32, ) -> Result { // Maybe using TryInto would be more Rust-like. // Note: value is set so that multiplying by 4 (for pitch) is valid. @@ -794,18 +794,17 @@ impl DeviceContext { width: width as u32, height: height as u32, }; - let format = D2D1_PIXEL_FORMAT { - format: DXGI_FORMAT_R8G8B8A8_UNORM, - alphaMode: alpha_mode, - }; - let props = D2D1_BITMAP_PROPERTIES1 { - pixelFormat: format, - dpiX: 96.0, - dpiY: 96.0, - bitmapOptions: D2D1_BITMAP_OPTIONS_NONE, - colorContext: null_mut(), - }; + unsafe { + let pixel_format = self.0.GetPixelFormat(); + let props = D2D1_BITMAP_PROPERTIES1 { + pixelFormat: pixel_format, + dpiX: dpi_scale * 96.0, + dpiY: dpi_scale * 96.0, + bitmapOptions: D2D1_BITMAP_OPTIONS_TARGET, + colorContext: null_mut(), + }; + let mut ptr = null_mut(); let hr = self .0 diff --git a/piet-direct2d/src/lib.rs b/piet-direct2d/src/lib.rs index 39ae845c..e0faa364 100644 --- a/piet-direct2d/src/lib.rs +++ b/piet-direct2d/src/lib.rs @@ -481,15 +481,26 @@ impl<'a> RenderContext for D2DRenderContext<'a> { let mut target_bitmap = self.rt.create_blank_bitmap( device_size.width as usize, device_size.height as usize, - D2D1_ALPHA_MODE_PREMULTIPLIED, + dpi_scale as f32, )?; let src_rect = Rect::from_origin_size(device_origin, device_size); let d2d_dest_point = to_point2u((0.0f32, 0.0f32)); let d2d_src_rect = rect_to_rectu(src_rect); + + // Clear layers from the render target + for _ in 0..self.layers.len() { + self.rt.pop_layer(); + } + target_bitmap.copy_from_render_target(d2d_dest_point, self.rt, d2d_src_rect); + // Restore cleared layers + for (mask, layer) in self.layers.iter() { + self.rt.push_layer_mask(mask, layer); + } + Ok(target_bitmap) }