From 8f29ff8a63d59a14549757f9a1ff5229666fbc82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=B0=8F=E7=99=BD?= <364772080@qq.com> Date: Wed, 10 Jul 2024 03:06:14 +0800 Subject: [PATCH] windows: Fix font clipping issue (#13854) Closes #12737 . Left before this PR, right after. ![Screenshot 2024-07-05 180308](https://github.com/zed-industries/zed/assets/14981363/437baec3-2672-4b19-8595-17a6c564506e) Release Notes: - Fixed font rendering clipping issue on Windows.(#12737 ) --- .../gpui/src/platform/windows/direct_write.rs | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/crates/gpui/src/platform/windows/direct_write.rs b/crates/gpui/src/platform/windows/direct_write.rs index f3823d9357f8fcbc98823cea093fcda18034b953..c63568c6c23ec002918d58b8c5f1cc042c8b5e5b 100644 --- a/crates/gpui/src/platform/windows/direct_write.rs +++ b/crates/gpui/src/platform/windows/direct_write.rs @@ -49,7 +49,8 @@ struct DirectWriteComponent { struct GlyphRenderContext { params: IDWriteRenderingParams3, - dc_target: ID2D1DeviceContext4, + normal_dc_target: ID2D1DeviceContext4, + emoji_dc_target: ID2D1DeviceContext4, } // All use of the IUnknown methods should be "thread-safe". @@ -127,7 +128,16 @@ impl GlyphRenderContext { DWRITE_RENDERING_MODE1_NATURAL_SYMMETRIC, grid_fit_mode, )?; - let dc_target = { + let normal_dc_target = { + let target = d2d1_factory.CreateDCRenderTarget(&get_render_target_property( + DXGI_FORMAT_A8_UNORM, + D2D1_ALPHA_MODE_STRAIGHT, + ))?; + let target = target.cast::()?; + target.SetTextRenderingParams(¶ms); + target + }; + let emoji_dc_target = { let target = d2d1_factory.CreateDCRenderTarget(&get_render_target_property( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED, @@ -137,7 +147,11 @@ impl GlyphRenderContext { target }; - Ok(Self { params, dc_target }) + Ok(Self { + params, + normal_dc_target, + emoji_dc_target, + }) } } } @@ -557,7 +571,11 @@ impl DirectWriteState { } fn raster_bounds(&self, params: &RenderGlyphParams) -> Result> { - let render_target = &self.components.render_context.dc_target; + let render_target = if params.is_emoji { + &self.components.render_context.emoji_dc_target + } else { + &self.components.render_context.normal_dc_target + }; unsafe { render_target.SetUnitMode(D2D1_UNIT_MODE_DIPS); render_target.SetDpi(96.0 * params.scale_factor, 96.0 * params.scale_factor);