[feature] Improve Performance By RenderTransform.

This commit is contained in:
Dubi906w 2024-05-16 02:35:44 +08:00
parent 3534936f7f
commit 8d94d2fa12
2 changed files with 152 additions and 20 deletions

View File

@ -111,13 +111,25 @@
ManipulationStarting="inkCanvas_ManipulationStarting"
ManipulationStarted="inkCanvas_ManipulationStarted"
SelectionChanged="inkCanvas_SelectionChanged"
StrokeCollected="inkCanvas_StrokeCollected"/>
StrokeCollected="inkCanvas_StrokeCollected" ClipToBounds="False" />
<InkCanvas x:Name="FakeInkCanvas" Background="Transparent" IsHitTestVisible="False" ClipToBounds="False" Strokes="{Binding ElementName=inkCanvas, Path=Strokes}">
<InkCanvas.RenderTransform>
<TransformGroup>
<ScaleTransform CenterX="0" CenterY="0" ScaleX="1" ScaleY="1" x:Name="FakeICScaleTransform"/>
<RotateTransform Angle="0" CenterX="0" CenterY="0" x:Name="FakeICRotateTransform"/>
<TranslateTransform X="0" Y="0" x:Name="FakeICTranslateTransform"/>
</TransformGroup>
</InkCanvas.RenderTransform>
</InkCanvas>
<Canvas IsHitTestVisible="False">
<ui:SimpleStackPanel Canvas.Left="25" Canvas.Top="15" Orientation="Vertical">
<TextBlock Text="{Binding nowTime}" Name="WaterMarkTime" Visibility="Collapsed" FontSize="30" FontWeight="Bold" Foreground="White" Opacity="0.6"/>
<TextBlock Text="{Binding nowDate}" Name="WaterMarkDate" Visibility="Collapsed" Margin="2,0,0,0" FontSize="16" Foreground="White" Opacity="0.45"/>
</ui:SimpleStackPanel>
<TextBlock Canvas.Right="25" Canvas.Top="15" Text="多一份理解,少一份抱怨" Name="BlackBoardWaterMark" Visibility="Collapsed" FontSize="30" FontWeight="Bold" Foreground="White" Opacity="0.5"/>
<TextBlock Canvas.Right="25" Canvas.Top="15" Text="test transform" Name="TTT" FontSize="30" FontWeight="Bold" Foreground="Red" Opacity="0.5"/>
</Canvas>
<Grid Visibility="{Binding ElementName=inkCanvas, Path=Visibility}">
<Grid Name="GridInkCanvasSelectionCover"

View File

@ -8,6 +8,7 @@ using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using static System.Windows.Forms.AxHost;
using Point = System.Windows.Point;
namespace Ink_Canvas
@ -355,6 +356,48 @@ namespace Ink_Canvas
{
if (forceEraser) return;
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
if (FakeICTranslateTransform.X != 0 && FakeICTranslateTransform.Y != 0)
{
Matrix m1 = new Matrix();
//Matrix m2 = new Matrix();
Matrix m3 = new Matrix();
m1.Translate(FakeICTranslateTransform.X, FakeICTranslateTransform.Y);
//m2.RotateAt(FakeICRotateTransform.Angle, FakeICRotateTransform.CenterX, FakeICRotateTransform.CenterY);
m3.ScaleAt(FakeICScaleTransform.ScaleX, FakeICScaleTransform.ScaleY, FakeICScaleTransform.CenterX, FakeICScaleTransform.CenterY);
inkCanvas.Strokes.Transform(m1, false);
//inkCanvas.Strokes.Transform(m2, false);
inkCanvas.Strokes.Transform(m3, false);
foreach (Stroke stroke in inkCanvas.Strokes)
{
try
{
stroke.DrawingAttributes.Width *= FakeICScaleTransform.ScaleX;
stroke.DrawingAttributes.Height *= FakeICScaleTransform.ScaleY;
}
catch { }
};
FakeICTranslateTransform.X = 0;
FakeICTranslateTransform.Y = 0;
//FakeICRotateTransform.Angle = 0;
//FakeICRotateTransform.CenterX = 0;
//FakeICRotateTransform.CenterY = 0;
FakeICScaleTransform.ScaleX = 1;
FakeICScaleTransform.ScaleY = 1;
FakeICScaleTransform.CenterX = 0;
FakeICScaleTransform.CenterY = 0;
TTT.Text = $"tx:{FakeICTranslateTransform.X}\n" +
$"ty:{FakeICTranslateTransform.Y}\n" +
$"ssx:{FakeICScaleTransform.ScaleX}\n" +
$"ssy:{FakeICScaleTransform.ScaleY}\n" +
$"scx:{FakeICScaleTransform.CenterX}\n" +
$"scy:{FakeICScaleTransform.CenterY}";
inkCanvas.Opacity = 1;
}
}
}
@ -374,6 +417,7 @@ namespace Ink_Canvas
originalStrokes.Replace(originalStrokes, targetStrokes);
}
_currentCommitType = CommitReason.UserInput;
}
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e)
@ -381,6 +425,12 @@ namespace Ink_Canvas
if (isInMultiTouchMode || !Settings.Gesture.IsEnableTwoFingerGesture) return;
if ((dec.Count >= 2 && (Settings.PowerPointSettings.IsEnableTwoFingerGestureInPresentationMode || StackPanelPPTControls.Visibility != Visibility.Visible || StackPanelPPTButtons.Visibility == Visibility.Collapsed)) || isSingleFingerDragMode)
{
if (inkCanvas.Opacity != 0)
{
inkCanvas.Opacity = 0;
}
ManipulationDelta md = e.DeltaManipulation;
Vector trans = md.Translation; // 获得位移矢量
@ -410,7 +460,7 @@ namespace Ink_Canvas
{
foreach (Stroke stroke in strokes)
{
stroke.Transform(m, false);
stroke.Transform(m, true);
foreach (Circle circle in circles)
{
@ -427,8 +477,8 @@ namespace Ink_Canvas
{
try
{
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
//stroke.DrawingAttributes.Width *= md.Scale.X;
//stroke.DrawingAttributes.Height *= md.Scale.Y;
}
catch { }
}
@ -436,25 +486,77 @@ namespace Ink_Canvas
}
else
{
if (Settings.Gesture.IsEnableTwoFingerZoom)
//if (Settings.Gesture.IsEnableTwoFingerZoom)
//{
//foreach (Stroke stroke in inkCanvas.Strokes)
//{
// try
// {
// stroke.DrawingAttributes.Width *= md.Scale.X;
// stroke.DrawingAttributes.Height *= md.Scale.Y;
// }
// catch { }
//};
// inkCanvas.Strokes.Transform(m, true);
//MatrixTransform mt = new MatrixTransform(m);
//inkCanvas.RenderTransform = mt;
//}
//else
//{
//foreach (Stroke stroke in inkCanvas.Strokes)
//{
// stroke.Transform(m, false);
//};
// inkCanvas.Strokes.Transform(m, true);
//TranslateTransform tt = new TranslateTransform(trans.X,trans.Y);
//inkCanvas.RenderTransform = tt;
//TTT.Text = "transX:" + trans.X + ",transY:" + trans.Y + "!";
//}
if (Settings.Gesture.IsEnableTwoFingerTranslate)
{
foreach (Stroke stroke in inkCanvas.Strokes)
{
stroke.Transform(m, false);
try
{
stroke.DrawingAttributes.Width *= md.Scale.X;
stroke.DrawingAttributes.Height *= md.Scale.Y;
}
catch { }
};
FakeICTranslateTransform.X = Math.Round(FakeICTranslateTransform.X + trans.X,4);
FakeICTranslateTransform.Y = Math.Round(FakeICTranslateTransform.Y + trans.Y, 4);
}
else
if (Settings.Gesture.IsEnableTwoFingerGestureTranslateOrRotation)
{
foreach (Stroke stroke in inkCanvas.Strokes)
double rotate = md.Rotation; // 获得旋转角度
Vector scale = md.Scale; // 获得缩放倍数
// Find center of element and then transform to get current location of center
FrameworkElement fe = e.Source as FrameworkElement;
Point center = new Point(fe.ActualWidth / 2, fe.ActualHeight / 2);
center = m.Transform(center); // 转换为矩阵缩放和旋转的中心点
if (Settings.Gesture.IsEnableTwoFingerRotation)
{
stroke.Transform(m, false);
};
FakeICRotateTransform.Angle = Math.Round(FakeICRotateTransform.Angle+rotate,4);
FakeICRotateTransform.CenterX = Math.Round(FakeICRotateTransform.CenterX+center.X,4);
FakeICRotateTransform.CenterY = Math.Round(FakeICRotateTransform.CenterY + center.Y, 4);
}
if (Settings.Gesture.IsEnableTwoFingerZoom)
{
FakeICScaleTransform.ScaleX = Math.Round(FakeICScaleTransform.ScaleX+ scale.X -1,4);
FakeICScaleTransform.ScaleY = Math.Round(FakeICScaleTransform.ScaleY + scale.Y - 1, 4);
FakeICScaleTransform.CenterX = Math.Round(center.X,4);
FakeICScaleTransform.CenterY = Math.Round(center.Y, 4);
}
TTT.Text = $"tx:{FakeICTranslateTransform.X}\n" +
$"ty:{FakeICTranslateTransform.Y}\n" +
$"ssx:{FakeICScaleTransform.ScaleX}\n" +
$"ssy:{FakeICScaleTransform.ScaleY}\n" +
$"scx:{FakeICScaleTransform.CenterX}\n" +
$"scy:{FakeICScaleTransform.CenterY}";
}
foreach (Circle circle in circles)
@ -466,7 +568,25 @@ namespace Ink_Canvas
);
};
}
}
}
//else
//{
// Matrix m = new Matrix();
// m.Translate(FakeICTranslateTransform.X, FakeICTranslateTransform.Y);
// m.RotateAt(FakeICRotateTransform.Angle,FakeICRotateTransform.CenterX,FakeICRotateTransform.CenterY);
// m.ScaleAt(FakeICScaleTransform.ScaleX,FakeICScaleTransform.ScaleY,FakeICScaleTransform.CenterX,FakeICScaleTransform.CenterY);
// inkCanvas.Strokes.Transform(m, false);
// FakeICTranslateTransform.X = 0;
// FakeICTranslateTransform.Y = 0;
// FakeICRotateTransform.Angle = 0;
// FakeICRotateTransform.CenterX = 0;
// FakeICRotateTransform.CenterY = 0;
// FakeICScaleTransform.ScaleX = 0;
// FakeICScaleTransform.ScaleY = 0;
// FakeICScaleTransform.CenterX = 1;
// FakeICScaleTransform.CenterY = 1;
//}
}
}
}