From 19bae967d30a00d2767921b1842087321dae624b Mon Sep 17 00:00:00 2001 From: jgcodes2020 Date: Sun, 9 Jul 2023 18:09:48 -0400 Subject: [PATCH 1/6] Rename ImportCompeted into ImportCompleted --- .../Composition/CompositionExternalMemory.cs | 11 +++++++++-- .../Rendering/Composition/CompositionInterop.cs | 6 +++--- .../Server/ServerCompositionDrawingSurface.cs | 6 +++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs index ce728f86a2..476e15c47f 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs @@ -84,14 +84,21 @@ public enum CompositionGpuImportedImageSynchronizationCapabilities /// /// An imported GPU object that's usable by composition APIs /// +[NotClientImplementable] public interface ICompositionGpuImportedObject : IAsyncDisposable { /// /// Tracks the import status of the object. Once the task is completed, /// the user code is allowed to free the resource owner in case when a non-owning - /// sharing handle was used + /// sharing handle was used. /// - Task ImportCompeted { get; } + Task ImportCompleted { get; } + + /// + /// ImportCompleted (recommended replacement) + [Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")] + Task ImportCompeted => ImportCompleted; + /// /// Indicates if the device context this instance is associated with is no longer available /// diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs index 1643ec6e8d..9eea228e84 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs @@ -67,18 +67,18 @@ abstract class CompositionGpuImportedObjectBase : ICompositionGpuImportedObject Context = context; Feature = feature; - ImportCompeted = Compositor.InvokeServerJobAsync(Import); + ImportCompleted = Compositor.InvokeServerJobAsync(Import); } protected abstract void Import(); public abstract void Dispose(); - public Task ImportCompeted { get; } + public Task ImportCompleted { get; } public bool IsLost => Context.IsLost; public ValueTask DisposeAsync() => new(Compositor.InvokeServerJobAsync(() => { - if (ImportCompeted.Status == TaskStatus.RanToCompletion) + if (ImportCompleted.Status == TaskStatus.RanToCompletion) Dispose(); })); } diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionDrawingSurface.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionDrawingSurface.cs index da24b3812a..f58403f0bc 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionDrawingSurface.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionDrawingSurface.cs @@ -31,12 +31,12 @@ internal class ServerCompositionDrawingSurface : ServerCompositionSurface, IDisp throw new PlatformGraphicsContextLostException(); // This should never happen, but check for it anyway to avoid a deadlock - if (!image.ImportCompeted.IsCompleted) + if (!image.ImportCompleted.IsCompleted) throw new InvalidOperationException("The import operation is not completed yet"); // Rethrow the import here exception - if (image.ImportCompeted.IsFaulted) - image.ImportCompeted.GetAwaiter().GetResult(); + if (image.ImportCompleted.IsFaulted) + image.ImportCompleted.GetAwaiter().GetResult(); } void Update(IBitmapImpl newImage, IPlatformRenderInterfaceContext context) From 1e5975d4ded724c362e11e28894fef1d834ac8d3 Mon Sep 17 00:00:00 2001 From: jgcodes2020 Date: Sun, 9 Jul 2023 22:04:58 -0400 Subject: [PATCH 2/6] Hide ImportCompeted from smart completion (to avoid confusion) --- .../Rendering/Composition/CompositionExternalMemory.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs index 476e15c47f..236cb89fcd 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Threading.Tasks; using Avalonia.Metadata; using Avalonia.Platform; @@ -97,6 +98,7 @@ public interface ICompositionGpuImportedObject : IAsyncDisposable /// /// ImportCompleted (recommended replacement) [Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")] + [EditorBrowsable(EditorBrowsableState.Never)] Task ImportCompeted => ImportCompleted; /// From aa7a2a27644b974b06da0f4108c5a30d3c7368e9 Mon Sep 17 00:00:00 2001 From: startewho Date: Thu, 13 Jul 2023 17:11:07 +0800 Subject: [PATCH 3/6] fix 12161 --- src/Avalonia.Controls/Utils/StringUtils.cs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/Avalonia.Controls/Utils/StringUtils.cs b/src/Avalonia.Controls/Utils/StringUtils.cs index 2ea47b442a..b664687650 100644 --- a/src/Avalonia.Controls/Utils/StringUtils.cs +++ b/src/Avalonia.Controls/Utils/StringUtils.cs @@ -76,7 +76,7 @@ namespace Avalonia.Controls.Utils } var codepoint = new Codepoint(text[index]); - + if (!codepoint.IsWhiteSpace) { return false; @@ -85,12 +85,16 @@ namespace Avalonia.Controls.Utils // preceeded by lwsp. if (index > 0) { - var nextCodePoint = new Codepoint(text[index + 1]); - - if (nextCodePoint.IsBreakChar) + if (index + 1 < text.Length) { - return true; + var nextCodePoint = new Codepoint(text[index + 1]); + + if (nextCodePoint.IsBreakChar) + { + return true; + } } + return true; } switch (codepoint.GeneralCategory) @@ -125,7 +129,7 @@ namespace Avalonia.Controls.Utils } cursor = Math.Min(cursor, text.Length); - + int begin; int i; int cr; @@ -181,7 +185,7 @@ namespace Avalonia.Controls.Utils { return cursor; } - + if (cr < text.Length && text[cr] == '\r' && cr + 1 < text.Length && text[cr + 1] == '\n') { lf = cr + 1; @@ -214,9 +218,9 @@ namespace Avalonia.Controls.Utils { return i; } - + var cc = GetCharClass(text[i]); - + // skip over the word, punctuation, or run of whitespace while (i < cr && GetCharClass(text[i]) == cc) { From e25995f3c94e2f8a9781c8d93afe3e9ee5d229cf Mon Sep 17 00:00:00 2001 From: jgcodes2020 Date: Thu, 13 Jul 2023 10:25:58 -0400 Subject: [PATCH 4/6] Implement @maxkatz6's suggestions --- .../Rendering/Composition/CompositionExternalMemory.cs | 4 +++- src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs index 236cb89fcd..31cbaf2a29 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionExternalMemory.cs @@ -6,6 +6,8 @@ using Avalonia.Metadata; using Avalonia.Platform; namespace Avalonia.Rendering.Composition; + +[NotClientImplementable] public interface ICompositionGpuInterop { /// @@ -99,7 +101,7 @@ public interface ICompositionGpuImportedObject : IAsyncDisposable /// ImportCompleted (recommended replacement) [Obsolete("Please use ICompositionGpuImportedObject.ImportCompleted instead")] [EditorBrowsable(EditorBrowsableState.Never)] - Task ImportCompeted => ImportCompleted; + Task ImportCompeted { get; } /// /// Indicates if the device context this instance is associated with is no longer available diff --git a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs index 9eea228e84..12a252ed96 100644 --- a/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs +++ b/src/Avalonia.Base/Rendering/Composition/CompositionInterop.cs @@ -74,6 +74,8 @@ abstract class CompositionGpuImportedObjectBase : ICompositionGpuImportedObject public abstract void Dispose(); public Task ImportCompleted { get; } + + public Task ImportCompeted => ImportCompleted; public bool IsLost => Context.IsLost; public ValueTask DisposeAsync() => new(Compositor.InvokeServerJobAsync(() => From 081803b292ce66c179441bfc9017019871271c98 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 13 Jul 2023 17:20:23 -0400 Subject: [PATCH 5/6] Add api change suppression for ImportCompleted --- api/Avalonia.nupkg.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 api/Avalonia.nupkg.xml diff --git a/api/Avalonia.nupkg.xml b/api/Avalonia.nupkg.xml new file mode 100644 index 0000000000..6a7d53544e --- /dev/null +++ b/api/Avalonia.nupkg.xml @@ -0,0 +1,10 @@ + + + + + CP0006 + P:Avalonia.Rendering.Composition.ICompositionGpuImportedObject.ImportCompleted + baseline/netstandard2.0/Avalonia.Base.dll + target/netstandard2.0/Avalonia.Base.dll + + \ No newline at end of file From 4c1d7b4a204e437ac0f1e648361522753d650800 Mon Sep 17 00:00:00 2001 From: startewho Date: Fri, 14 Jul 2023 08:38:00 +0800 Subject: [PATCH 6/6] Update StringUtils.cs --- src/Avalonia.Controls/Utils/StringUtils.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Utils/StringUtils.cs b/src/Avalonia.Controls/Utils/StringUtils.cs index b664687650..0ae1ef0b97 100644 --- a/src/Avalonia.Controls/Utils/StringUtils.cs +++ b/src/Avalonia.Controls/Utils/StringUtils.cs @@ -94,7 +94,11 @@ namespace Avalonia.Controls.Utils return true; } } - return true; + else + { + return true; + } + } switch (codepoint.GeneralCategory)