diff --git a/src/Libraries/AvalonDock/AlignedImage.cs b/src/Libraries/AvalonDock/AlignedImage.cs index 9c322bbccf..a41303b2d9 100644 --- a/src/Libraries/AvalonDock/AlignedImage.cs +++ b/src/Libraries/AvalonDock/AlignedImage.cs @@ -36,6 +36,8 @@ namespace AvalonDock { public class AlignedImage : Decorator { + /* + * Disabled because we use WPF 4.0 layout rounding instead. public AlignedImage() { this.LayoutUpdated += new EventHandler(OnLayoutUpdated); @@ -183,6 +185,6 @@ namespace AvalonDock double delta = value1 - value2; return ((delta < 1.53E-06) && (delta > -1.53E-06)); } - + */ } } diff --git a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs b/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs index b0f7403433..2668e842f2 100644 --- a/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs +++ b/src/Main/Base/Project/Src/Commands/MenuItemBuilders.cs @@ -463,7 +463,7 @@ namespace ICSharpCode.SharpDevelop.Commands var item = new System.Windows.Controls.MenuItem(); item.Header = ICSharpCode.Core.Presentation.MenuService.ConvertLabel(StringParser.Parse(padContent.Title)); if (!string.IsNullOrEmpty(padContent.Icon)) { - item.Icon = PresentationResourceService.GetPixelSnappedImage(padContent.Icon); + item.Icon = PresentationResourceService.GetImage(padContent.Icon); } item.Command = new BringPadToFrontCommand(padContent); if (!string.IsNullOrEmpty(padContent.Shortcut)) { diff --git a/src/Main/Base/Project/Src/Gui/App.xaml b/src/Main/Base/Project/Src/Gui/App.xaml index 76e88653e0..3016f64868 100644 --- a/src/Main/Base/Project/Src/Gui/App.xaml +++ b/src/Main/Base/Project/Src/Gui/App.xaml @@ -14,6 +14,7 @@ \ No newline at end of file diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs index 478a0d30bb..6bf0152111 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonPadContent.cs @@ -35,7 +35,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.SetValueToExtension(TitleProperty, new StringParseExtension(descriptor.Title)); placeholder = new TextBlock { Text = this.Title }; this.Content = placeholder; - this.Icon = PresentationResourceService.GetPixelSnappedImage(descriptor.Icon); + this.Icon = PresentationResourceService.GetImage(descriptor.Icon); placeholder.IsVisibleChanged += AvalonPadContent_IsVisibleChanged; } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs index 57d44b23f4..b20c7a69ee 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs @@ -416,7 +416,7 @@ namespace ICSharpCode.SharpDevelop.Gui set { if (icon != value) { icon = value; - base.Icon = new PixelSnapper(new Image { Source = value }); + base.Icon = new Image { Source = value }; } } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml index a90acb6d54..1fe311e3c8 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml +++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.xaml @@ -6,6 +6,7 @@ WindowStartupLocation = "Manual" Background = "{DynamicResource {x:Static SystemColors.ControlBrushKey}}" AllowDrop = "True" + UseLayoutRounding = "True" > diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 1d1d39f7f1..d30c09d565 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -376,9 +376,10 @@ namespace ICSharpCode.SharpDevelop /// /// Creates a new image for the image source. /// + [ObsoleteAttribute("Use layout rounding instead")] public static UIElement CreatePixelSnappedImage(this IImage image) { - return new PixelSnapper(CreateImage(image)); + return CreateImage(image); } /// diff --git a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj index 9c68e55a3a..75520b1d4e 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj +++ b/src/Main/ICSharpCode.Core.Presentation/ICSharpCode.Core.Presentation.csproj @@ -1,4 +1,5 @@ - + + {7E4A7172-7FF5-48D0-B719-7CD959DD1AC9} Debug @@ -85,7 +86,6 @@ - diff --git a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs index da2ebd7a12..daca662116 100644 --- a/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs +++ b/src/Main/ICSharpCode.Core.Presentation/Menu/CoreMenuItem.cs @@ -36,7 +36,7 @@ namespace ICSharpCode.Core.Presentation try { var image = PresentationResourceService.GetImage(codon.Properties["icon"]); image.Height = 16; - this.Icon = new PixelSnapper(image); + this.Icon = image; } catch (ResourceNotFoundException) {} } UpdateText(); diff --git a/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs b/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs deleted file mode 100644 index cb50b670f2..0000000000 --- a/src/Main/ICSharpCode.Core.Presentation/PixelSnapper.cs +++ /dev/null @@ -1,174 +0,0 @@ -// -// -// -// -// $Revision$ -// -using System; -using System.Threading; -using System.Windows; -using System.Windows.Media; -using System.Windows.Media.Imaging; -using System.Windows.Threading; - -namespace ICSharpCode.Core.Presentation -{ - /// - /// A WPF control that aligns its content on pixel boundaries. - /// - public class PixelSnapper : UIElement - { - public PixelSnapper() - { - } - - public PixelSnapper(UIElement visualChild) - : this() - { - this.Child = visualChild; - } - - UIElement _visualChild; - - /// - /// Gets/sets the visual child. - /// - public UIElement Child { - get { return _visualChild; } - set { - RemoveVisualChild(_visualChild); - _visualChild = value; - AddVisualChild(_visualChild); - InvalidateMeasure(); - } - } - - /// - /// Gets the visual child. - /// - protected override Visual GetVisualChild(int index) - { - if (index == 0 && _visualChild != null) - return _visualChild; - else - throw new ArgumentOutOfRangeException("index"); - } - - /// - /// Gets the number of visual children. - /// - protected override int VisualChildrenCount { - get { return _visualChild != null ? 1 : 0; } - } - - /// - /// Measure the visual child. - /// - protected override Size MeasureCore(Size availableSize) - { - if (_visualChild != null) { - _visualChild.Measure(availableSize); - return _visualChild.DesiredSize; - } else { - return base.MeasureCore(availableSize); - } - } - - protected override void ArrangeCore(Rect finalRect) - { - base.ArrangeCore(finalRect); - if (_visualChild != null) { - _pixelOffset = GetPixelOffset(); - //LoggingService.Debug("Arrange, Pixel Offset=" + _pixelOffset); - _visualChild.Arrange(new Rect(new Point(_pixelOffset.X, _pixelOffset.Y), finalRect.Size)); - - // check again after the whole layout pass has finished, maybe we need to move - Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new ThreadStart(CheckLayout)); - } - } - - private void CheckLayout() - { - Point pixelOffset = GetPixelOffset(); - if (!AreClose(pixelOffset, _pixelOffset)) { - InvalidateArrange(); - } - } - - // Gets the matrix that will convert a point from "above" the - // coordinate space of a visual into the the coordinate space - // "below" the visual. - static Matrix GetVisualTransform(Visual v) - { - if (v != null) { - Matrix m = Matrix.Identity; - - Transform transform = VisualTreeHelper.GetTransform(v); - if (transform != null) { - m *= transform.Value; - } - - Vector offset = VisualTreeHelper.GetOffset(v); - m.Translate(offset.X, offset.Y); - - return m; - } - - return Matrix.Identity; - } - - static Point ApplyVisualTransform(Point point, Visual v, bool inverse) - { - if (v != null) { - Matrix visualTransform = GetVisualTransform(v); - if (inverse) - visualTransform.Invert(); - point = visualTransform.Transform(point); - } - return point; - } - - private Point GetPixelOffset() - { - Point pixelOffset = new Point(); - - PresentationSource ps = PresentationSource.FromVisual(this); - if (ps != null) { - Visual rootVisual = ps.RootVisual; - - // Transform (0,0) from this element up to pixels. - pixelOffset = this.TransformToAncestor(rootVisual).Transform(pixelOffset); - pixelOffset = ApplyVisualTransform(pixelOffset, rootVisual, false); - pixelOffset = ps.CompositionTarget.TransformToDevice.Transform(pixelOffset); - - // Round the origin to the nearest whole pixel. - pixelOffset.X = Math.Round(pixelOffset.X); - pixelOffset.Y = Math.Round(pixelOffset.Y); - - // Transform the whole-pixel back to this element. - pixelOffset = ps.CompositionTarget.TransformFromDevice.Transform(pixelOffset); - pixelOffset = ApplyVisualTransform(pixelOffset, rootVisual, true); - pixelOffset = rootVisual.TransformToDescendant(this).Transform(pixelOffset); - } - - return pixelOffset; - } - - static bool AreClose(Point point1, Point point2) - { - return AreClose(point1.X, point2.X) && AreClose(point1.Y, point2.Y); - } - - static bool AreClose(double value1, double value2) - { - if (value1 == value2) - { - return true; - } - double delta = value1 - value2; - return ((delta < 1.53E-06) && (delta > -1.53E-06)); - } - - private Point _pixelOffset; - } -} diff --git a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs index 5881acb044..88fbe4594c 100644 --- a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs +++ b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs @@ -61,9 +61,13 @@ namespace ICSharpCode.Core.Presentation /// /// Is thrown when the GlobalResource manager can't find a requested resource. /// - public static PixelSnapper GetPixelSnappedImage(string name) + [Obsolete("Use layout rounding instead")] + public static System.Windows.Controls.Image GetPixelSnappedImage(string name) { - return new PixelSnapper(GetImage(name)); + return new System.Windows.Controls.Image { + Source = GetBitmapSource(name), + UseLayoutRounding = true + }; } /// diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs index 405a4ac65c..5e29a9ef3e 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarButton.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.Core.Presentation var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"])); image.Height = 16; image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey); - this.Content = new PixelSnapper(image); + this.Content = image; } else { this.Content = codon.Id; } diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs index b551500e4f..beed72af33 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarCheckBox.cs @@ -38,7 +38,7 @@ namespace ICSharpCode.Core.Presentation var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"])); image.Height = 16; image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey); - this.Content = new PixelSnapper(image); + this.Content = image; } else { this.Content = codon.Id; } diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs index 8eb79ec3a0..5aa31d8390 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarDropDownButton.cs @@ -31,7 +31,7 @@ namespace ICSharpCode.Core.Presentation var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"])); image.Height = 16; image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey); - this.Content = new PixelSnapper(image); + this.Content = image; } else { this.Content = codon.Id; } diff --git a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs index d5bf6319fb..9360da646d 100644 --- a/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs +++ b/src/Main/ICSharpCode.Core.Presentation/ToolBar/ToolBarSplitButton.cs @@ -32,7 +32,7 @@ namespace ICSharpCode.Core.Presentation var image = PresentationResourceService.GetImage(StringParser.Parse(codon.Properties["icon"])); image.Height = 16; image.SetResourceReference(StyleProperty, ToolBarService.ImageStyleKey); - this.Content = new PixelSnapper(image); + this.Content = image; } else { this.Content = codon.Id; }