diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/LinkLabel.cs b/src/System.Windows.Forms/src/System/Windows/Forms/LinkLabel.cs
index 123873bc7fe..c83cced2d6a 100644
--- a/src/System.Windows.Forms/src/System/Windows/Forms/LinkLabel.cs
+++ b/src/System.Windows.Forms/src/System/Windows/Forms/LinkLabel.cs
@@ -1506,7 +1506,12 @@ protected override void OnTextAlignChanged(EventArgs e)
font,
clientRectWithPadding,
brushColor,
- CreateTextFormatFlags(clientRectWithPadding.Size));
+ CreateTextFormatFlags(clientRectWithPadding.Size)
+#if DEBUG
+ // Skip the asserts in TextRenderer because the DC has been modified
+ | TextRenderer.SkipAssertFlag
+#endif
+ );
}
if (Focused && ShowFocusCues && FocusLink == link)
diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/TextFormatFlags.cs b/src/System.Windows.Forms/src/System/Windows/Forms/TextFormatFlags.cs
index eca377acecf..2bbed8686ec 100644
--- a/src/System.Windows.Forms/src/System/Windows/Forms/TextFormatFlags.cs
+++ b/src/System.Windows.Forms/src/System/Windows/Forms/TextFormatFlags.cs
@@ -15,59 +15,58 @@ namespace System.Windows.Forms
[Flags]
public enum TextFormatFlags
{
- Bottom = (int)User32.DT.BOTTOM,
- EndEllipsis = (int)User32.DT.END_ELLIPSIS,
- ExpandTabs = (int)User32.DT.EXPANDTABS,
- ExternalLeading = (int)User32.DT.EXTERNALLEADING,
- Default = (int)User32.DT.DEFAULT,
- HidePrefix = (int)User32.DT.HIDEPREFIX,
- HorizontalCenter = (int)User32.DT.CENTER,
- Internal = (int)User32.DT.INTERNAL,
+ Bottom = (int)User32.DT.BOTTOM,
+ EndEllipsis = (int)User32.DT.END_ELLIPSIS,
+ ExpandTabs = (int)User32.DT.EXPANDTABS,
+ ExternalLeading = (int)User32.DT.EXTERNALLEADING,
+ Default = (int)User32.DT.DEFAULT,
+ HidePrefix = (int)User32.DT.HIDEPREFIX,
+ HorizontalCenter = (int)User32.DT.CENTER,
+ Internal = (int)User32.DT.INTERNAL,
///
/// This is the default.
///
- Left = (int)User32.DT.LEFT,
+ Left = (int)User32.DT.LEFT,
[Obsolete("ModifyString mutates strings and should be avoided. It will be blocked in a future release.")]
- ModifyString = (int)User32.DT.MODIFYSTRING,
- NoClipping = (int)User32.DT.NOCLIP,
- NoPrefix = (int)User32.DT.NOPREFIX,
- NoFullWidthCharacterBreak = (int)User32.DT.NOFULLWIDTHCHARBREAK,
- PathEllipsis = (int)User32.DT.PATH_ELLIPSIS,
- PrefixOnly = (int)User32.DT.PREFIXONLY,
- Right = (int)User32.DT.RIGHT,
- RightToLeft = (int)User32.DT.RTLREADING,
- SingleLine = (int)User32.DT.SINGLELINE,
- TextBoxControl = (int)User32.DT.EDITCONTROL,
+ ModifyString = (int)User32.DT.MODIFYSTRING,
+ NoClipping = (int)User32.DT.NOCLIP,
+ NoPrefix = (int)User32.DT.NOPREFIX,
+ NoFullWidthCharacterBreak = (int)User32.DT.NOFULLWIDTHCHARBREAK,
+ PathEllipsis = (int)User32.DT.PATH_ELLIPSIS,
+ PrefixOnly = (int)User32.DT.PREFIXONLY,
+ Right = (int)User32.DT.RIGHT,
+ RightToLeft = (int)User32.DT.RTLREADING,
+ SingleLine = (int)User32.DT.SINGLELINE,
+ TextBoxControl = (int)User32.DT.EDITCONTROL,
///
/// This is the default.
///
- Top = (int)User32.DT.TOP,
+ Top = (int)User32.DT.TOP,
- VerticalCenter = (int)User32.DT.VCENTER,
- WordBreak = (int)User32.DT.WORDBREAK,
- WordEllipsis = (int)User32.DT.WORD_ELLIPSIS,
+ VerticalCenter = (int)User32.DT.VCENTER,
+ WordBreak = (int)User32.DT.WORDBREAK,
+ WordEllipsis = (int)User32.DT.WORD_ELLIPSIS,
- ///
/// The following flags are exclusive of TextRenderer (no Windows native flags)
/// and apply to methods receiving a Graphics as the IDeviceContext object, and
/// specify whether to reapply clipping and coordintate transformations to the hdc
/// obtained from the Graphics object, which returns a clean hdc.
- ///
- PreserveGraphicsClipping = 0x01000000,
- PreserveGraphicsTranslateTransform = 0x02000000,
+ ///
+ /// These get stripped off by TextExtensions before we call DrawText or MeasureText
+ /// (see: GdiUnsupportedFlagMask).
+
+ PreserveGraphicsClipping = 0x0100_0000,
+ PreserveGraphicsTranslateTransform = 0x0200_0000,
///
/// Adds padding related to the drawing binding box, computed according to the font size.
/// Match the System.Internal.GDI.TextPaddingOptions.
///
- ///
- /// This is the default.
- ///
- GlyphOverhangPadding = 0x00000000,
- NoPadding = 0x10000000,
- LeftAndRightPadding = 0x20000000
+ GlyphOverhangPadding = 0x0000_0000,
+ NoPadding = 0x1000_0000,
+ LeftAndRightPadding = 0x2000_0000
}
}
diff --git a/src/System.Windows.Forms/src/System/Windows/Forms/TextRenderer.cs b/src/System.Windows.Forms/src/System/Windows/Forms/TextRenderer.cs
index 05272586f8a..377f4e8206c 100644
--- a/src/System.Windows.Forms/src/System/Windows/Forms/TextRenderer.cs
+++ b/src/System.Windows.Forms/src/System/Windows/Forms/TextRenderer.cs
@@ -14,6 +14,13 @@ namespace System.Windows.Forms
///
public static class TextRenderer
{
+#if DEBUG
+ // In various cases the DC may have already been modified, and we don't pass TextFormatFlags.PreserveGraphicsClipping
+ // or TextFormatFlags.PreserveGraphicsTranslateTransform flags, that set off the asserts in GetApplyStateFlags
+ // method. This flags allows us to skip those assert for the cases we know we don't need these flags.
+ internal static TextFormatFlags SkipAssertFlag = (TextFormatFlags)0x4000_0000;
+#endif
+
internal static Gdi32.QUALITY DefaultQuality { get; } = GetDefaultFontQuality();
internal static Size MaxSize { get; } = new Size(int.MaxValue, int.MaxValue);
@@ -620,15 +627,20 @@ private static ApplyGraphicsProperties GetApplyStateFlags(IDeviceContext deviceC
apply |= ApplyGraphicsProperties.TranslateTransform;
}
- Debug.Assert(apply.HasFlag(ApplyGraphicsProperties.Clipping)
- || graphics.Clip is null
- || graphics.Clip.GetHrgn(graphics) == IntPtr.Zero,
- "Must preserve Graphics clipping region!");
-
- Debug.Assert(apply.HasFlag(ApplyGraphicsProperties.TranslateTransform)
- || graphics.Transform is null
- || graphics.Transform.IsIdentity,
- "Must preserve Graphics transformation!");
+#if DEBUG
+ if ((textFormatFlags & SkipAssertFlag) == 0)
+ {
+ Debug.Assert(apply.HasFlag(ApplyGraphicsProperties.Clipping)
+ || graphics.Clip is null
+ || graphics.Clip.GetHrgn(graphics) == IntPtr.Zero,
+ "Must preserve Graphics clipping region!");
+
+ Debug.Assert(apply.HasFlag(ApplyGraphicsProperties.TranslateTransform)
+ || graphics.Transform is null
+ || graphics.Transform.IsIdentity,
+ "Must preserve Graphics transformation!");
+ }
+#endif
return apply;
}