private static TextFormattingRunProperties Apply( TextFormattingRunProperties formatting, Classification classification, TextFormattingRunProperties defaultFormatting) { // NOTE: avoid creating a new instance for fields that weren't changed formatting = ApplyTypeFace(formatting, classification, defaultFormatting); if (formatting.Bold != classification.IsBold) { formatting = formatting.SetBold(classification.IsBold); } if (classification.FontRenderingSizeWasReset) { /// NOTE: we should not try to set property of <param name="defaultFormatting" /> if it's marked as empty /// to avoid set which will mark property of <param name="formatting" /> as non empty formatting = defaultFormatting.FontRenderingEmSizeEmpty ? formatting.ClearFontRenderingEmSize() : formatting.SetFontHintingEmSize(defaultFormatting.FontRenderingEmSize); } else if (Math.Abs(formatting.FontRenderingEmSize - classification.FontRenderingSize) > 0.001) { formatting = formatting.SetFontRenderingEmSize(classification.FontRenderingSize); } if (classification.BackgroundWasReset) { /// NOTE: we should not try to set a some of value from <param name="defaultFormatting" /> if it's marked as empty /// to avoid set that will mark value from <param name="formatting" /> as non empty formatting = defaultFormatting.BackgroundBrushEmpty ? formatting.ClearBackgroundBrush() : formatting.SetBackground(defaultFormatting.BackgroundBrush.GetColor()); } else if (!(formatting.BackgroundBrush is SolidColorBrush backgroundBrush) || !backgroundBrush.Color.Equals(classification.Background)) { formatting = formatting.SetBackgroundBrush(new SolidColorBrush(classification.Background)); } if (classification.ForegroundWasReset) { // NOTE: Foreground always is set, just look at // https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.text.classification.iclassificationformatmap.defaulttextproperties?view=visualstudiosdk-2017#remarks formatting = formatting.SetForeground(defaultFormatting.ForegroundBrush.GetColor()); } else if (!(formatting.ForegroundBrush is SolidColorBrush foregroundBrush) || !foregroundBrush.Color.Equals(classification.Foreground)) { formatting = formatting.SetForegroundBrush(new SolidColorBrush(classification.Foreground)); } formatting = ApplyDecoration(formatting, classification.IsOverline, TextDecorations.OverLine[0]); formatting = ApplyDecoration(formatting, classification.IsUnderline, TextDecorations.Underline[0]); formatting = ApplyDecoration(formatting, classification.IsStrikethrough, TextDecorations.Strikethrough[0]); formatting = ApplyDecoration(formatting, classification.IsBaseline, TextDecorations.Baseline[0]); return(formatting); }