From cad2462ece754115119fdd031ad836afa96be566 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 5 Jul 2022 20:11:42 +0800 Subject: [PATCH 1/4] Fix load the font which the name contains unicode text --- binding/Binding/SKFontManager.cs | 18 +++++++++++++----- binding/Binding/SkiaApi.generated.cs | 26 +++++++++++++------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/binding/Binding/SKFontManager.cs b/binding/Binding/SKFontManager.cs index cbee4a9bc96..6af3be8c903 100644 --- a/binding/Binding/SKFontManager.cs +++ b/binding/Binding/SKFontManager.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Text; namespace SkiaSharp { @@ -58,7 +59,11 @@ public SKFontStyleSet GetFontStyles (int index) public SKFontStyleSet GetFontStyles (string familyName) { - return SKFontStyleSet.GetObject (SkiaApi.sk_fontmgr_match_family (Handle, familyName)); + var familyNameUtf8ByteList = Encoding.UTF8.GetBytes(familyName); + fixed (byte* familyNamePointer = familyNameUtf8ByteList) + { + return SKFontStyleSet.GetObject (SkiaApi.sk_fontmgr_match_family (Handle, new IntPtr(familyNamePointer))); + } } public SKTypeface MatchFamily (string familyName) => @@ -68,10 +73,13 @@ public SKTypeface MatchFamily (string familyName, SKFontStyle style) { if (style == null) throw new ArgumentNullException (nameof (style)); - - var tf = SKTypeface.GetObject (SkiaApi.sk_fontmgr_match_family_style (Handle, familyName, style.Handle)); - tf?.PreventPublicDisposal (); - return tf; + var familyNameUtf8ByteList = Encoding.UTF8.GetBytes(familyName); + fixed (byte* familyNamePointer = familyNameUtf8ByteList) + { + var tf = SKTypeface.GetObject(SkiaApi.sk_fontmgr_match_family_style(Handle, new IntPtr(familyNamePointer), style.Handle)); + tf?.PreventPublicDisposal(); + return tf; + } } public SKTypeface MatchTypeface (SKTypeface face, SKFontStyle style) diff --git a/binding/Binding/SkiaApi.generated.cs b/binding/Binding/SkiaApi.generated.cs index 8a70b541341..9972a3ca9ee 100644 --- a/binding/Binding/SkiaApi.generated.cs +++ b/binding/Binding/SkiaApi.generated.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Runtime.InteropServices; #region Namespaces @@ -12369,33 +12369,33 @@ internal static sk_typeface_t sk_fontmgr_match_face_style (sk_fontmgr_t param0, // sk_fontstyleset_t* sk_fontmgr_match_family(sk_fontmgr_t*, const char* familyName) #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] - internal static extern sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName); - #else + internal static extern sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName); +#else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] - internal delegate sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName); + internal delegate sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName); } private static Delegates.sk_fontmgr_match_family sk_fontmgr_match_family_delegate; - internal static sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName) => + internal static sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName) => (sk_fontmgr_match_family_delegate ??= GetSymbol ("sk_fontmgr_match_family")).Invoke (param0, familyName); - #endif +#endif // sk_typeface_t* sk_fontmgr_match_family_style(sk_fontmgr_t*, const char* familyName, sk_fontstyle_t* style) - #if !USE_DELEGATES +#if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] - internal static extern sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style); - #else + internal static extern sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style); +#else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] - internal delegate sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style); + internal delegate sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style); } private static Delegates.sk_fontmgr_match_family_style sk_fontmgr_match_family_style_delegate; - internal static sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style) => + internal static sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style) => (sk_fontmgr_match_family_style_delegate ??= GetSymbol ("sk_fontmgr_match_family_style")).Invoke (param0, familyName, style); - #endif +#endif // sk_typeface_t* sk_fontmgr_match_family_style_character(sk_fontmgr_t*, const char* familyName, sk_fontstyle_t* style, const char** bcp47, int bcp47Count, int32_t character) - #if !USE_DELEGATES +#if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] internal static extern sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); #else From 9939c28ae006b03ec6b2729ef61c7886398fdd96 Mon Sep 17 00:00:00 2001 From: lindexi Date: Tue, 5 Jul 2022 20:16:42 +0800 Subject: [PATCH 2/4] Fix code format --- binding/Binding/SkiaApi.generated.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/binding/Binding/SkiaApi.generated.cs b/binding/Binding/SkiaApi.generated.cs index 9972a3ca9ee..ae76fbbd25b 100644 --- a/binding/Binding/SkiaApi.generated.cs +++ b/binding/Binding/SkiaApi.generated.cs @@ -12370,7 +12370,7 @@ internal static sk_typeface_t sk_fontmgr_match_face_style (sk_fontmgr_t param0, #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] internal static extern sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName); -#else + #else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] internal delegate sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName); @@ -12378,13 +12378,13 @@ private partial class Delegates { private static Delegates.sk_fontmgr_match_family sk_fontmgr_match_family_delegate; internal static sk_fontstyleset_t sk_fontmgr_match_family (sk_fontmgr_t param0, IntPtr familyName) => (sk_fontmgr_match_family_delegate ??= GetSymbol ("sk_fontmgr_match_family")).Invoke (param0, familyName); -#endif + #endif // sk_typeface_t* sk_fontmgr_match_family_style(sk_fontmgr_t*, const char* familyName, sk_fontstyle_t* style) -#if !USE_DELEGATES + #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] internal static extern sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style); -#else + #else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] internal delegate sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style); @@ -12392,10 +12392,10 @@ private partial class Delegates { private static Delegates.sk_fontmgr_match_family_style sk_fontmgr_match_family_style_delegate; internal static sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style) => (sk_fontmgr_match_family_style_delegate ??= GetSymbol ("sk_fontmgr_match_family_style")).Invoke (param0, familyName, style); -#endif + #endif // sk_typeface_t* sk_fontmgr_match_family_style_character(sk_fontmgr_t*, const char* familyName, sk_fontstyle_t* style, const char** bcp47, int bcp47Count, int32_t character) -#if !USE_DELEGATES + #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] internal static extern sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); #else From c4cd11e697bc4589c23393364a1c5413ed640cc3 Mon Sep 17 00:00:00 2001 From: lindexi Date: Wed, 6 Jul 2022 09:58:51 +0800 Subject: [PATCH 3/4] Fix load the font which contains unicode name in SKTypeface.FromFamilyName --- binding/Binding/SKFontManager.cs | 14 +++++++++----- binding/Binding/SKTypeface.cs | 10 +++++++--- binding/Binding/SkiaApi.generated.cs | 12 ++++++------ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/binding/Binding/SKFontManager.cs b/binding/Binding/SKFontManager.cs index 6af3be8c903..4437b9920f7 100644 --- a/binding/Binding/SKFontManager.cs +++ b/binding/Binding/SKFontManager.cs @@ -59,7 +59,7 @@ public SKFontStyleSet GetFontStyles (int index) public SKFontStyleSet GetFontStyles (string familyName) { - var familyNameUtf8ByteList = Encoding.UTF8.GetBytes(familyName); + var familyNameUtf8ByteList = StringUtilities.GetEncodedText(familyName,SKTextEncoding.Utf8, addNull: true); fixed (byte* familyNamePointer = familyNameUtf8ByteList) { return SKFontStyleSet.GetObject (SkiaApi.sk_fontmgr_match_family (Handle, new IntPtr(familyNamePointer))); @@ -73,7 +73,7 @@ public SKTypeface MatchFamily (string familyName, SKFontStyle style) { if (style == null) throw new ArgumentNullException (nameof (style)); - var familyNameUtf8ByteList = Encoding.UTF8.GetBytes(familyName); + var familyNameUtf8ByteList = StringUtilities.GetEncodedText (familyName, SKTextEncoding.Utf8, addNull: true); fixed (byte* familyNamePointer = familyNameUtf8ByteList) { var tf = SKTypeface.GetObject(SkiaApi.sk_fontmgr_match_family_style(Handle, new IntPtr(familyNamePointer), style.Handle)); @@ -190,9 +190,13 @@ public SKTypeface MatchCharacter (string familyName, SKFontStyle style, string[] if (familyName == null) familyName = string.Empty; - var tf = SKTypeface.GetObject (SkiaApi.sk_fontmgr_match_family_style_character (Handle, familyName, style.Handle, bcp47, bcp47?.Length ?? 0, character)); - tf?.PreventPublicDisposal (); - return tf; + var familyNameUtf8ByteList = StringUtilities.GetEncodedText (familyName, SKTextEncoding.Utf8, addNull: true); + fixed (byte* familyNamePointer = familyNameUtf8ByteList) + { + var tf = SKTypeface.GetObject (SkiaApi.sk_fontmgr_match_family_style_character (Handle, new IntPtr (familyNamePointer), style.Handle, bcp47, bcp47?.Length ?? 0, character)); + tf?.PreventPublicDisposal (); + return tf; + } } public static SKFontManager CreateDefault () diff --git a/binding/Binding/SKTypeface.cs b/binding/Binding/SKTypeface.cs index b12ff1ef8af..71c37c63eef 100644 --- a/binding/Binding/SKTypeface.cs +++ b/binding/Binding/SKTypeface.cs @@ -76,9 +76,13 @@ public static SKTypeface FromFamilyName (string familyName, SKFontStyle style) if (style == null) throw new ArgumentNullException (nameof (style)); - var tf = GetObject (SkiaApi.sk_typeface_create_from_name (familyName, style.Handle)); - tf?.PreventPublicDisposal (); - return tf; + var familyNameUtf8ByteList = StringUtilities.GetEncodedText (familyName, SKTextEncoding.Utf8, addNull:true); + fixed (byte* familyNamePointer = familyNameUtf8ByteList) + { + var tf = GetObject (SkiaApi.sk_typeface_create_from_name (new IntPtr (familyNamePointer), style.Handle)); + tf?.PreventPublicDisposal (); + return tf; + } } public static SKTypeface FromFamilyName (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant) diff --git a/binding/Binding/SkiaApi.generated.cs b/binding/Binding/SkiaApi.generated.cs index ae76fbbd25b..26d07109e2f 100644 --- a/binding/Binding/SkiaApi.generated.cs +++ b/binding/Binding/SkiaApi.generated.cs @@ -12397,14 +12397,14 @@ internal static sk_typeface_t sk_fontmgr_match_family_style (sk_fontmgr_t param0 // sk_typeface_t* sk_fontmgr_match_family_style_character(sk_fontmgr_t*, const char* familyName, sk_fontstyle_t* style, const char** bcp47, int bcp47Count, int32_t character) #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] - internal static extern sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); + internal static extern sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); #else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] - internal delegate sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); + internal delegate sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character); } private static Delegates.sk_fontmgr_match_family_style_character sk_fontmgr_match_family_style_character_delegate; - internal static sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, [MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character) => + internal static sk_typeface_t sk_fontmgr_match_family_style_character (sk_fontmgr_t param0, IntPtr familyName, sk_fontstyle_t style, [MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[] bcp47, Int32 bcp47Count, Int32 character) => (sk_fontmgr_match_family_style_character_delegate ??= GetSymbol ("sk_fontmgr_match_family_style_character")).Invoke (param0, familyName, style, bcp47, bcp47Count, character); #endif @@ -12677,14 +12677,14 @@ internal static sk_typeface_t sk_typeface_create_from_file (/* char */ void* pat // sk_typeface_t* sk_typeface_create_from_name(const char* familyName, const sk_fontstyle_t* style) #if !USE_DELEGATES [DllImport (SKIA, CallingConvention = CallingConvention.Cdecl)] - internal static extern sk_typeface_t sk_typeface_create_from_name ([MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style); + internal static extern sk_typeface_t sk_typeface_create_from_name (IntPtr familyName, sk_fontstyle_t style); #else private partial class Delegates { [UnmanagedFunctionPointer (CallingConvention.Cdecl)] - internal delegate sk_typeface_t sk_typeface_create_from_name ([MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style); + internal delegate sk_typeface_t sk_typeface_create_from_name (IntPtr familyName, sk_fontstyle_t style); } private static Delegates.sk_typeface_create_from_name sk_typeface_create_from_name_delegate; - internal static sk_typeface_t sk_typeface_create_from_name ([MarshalAs (UnmanagedType.LPStr)] String familyName, sk_fontstyle_t style) => + internal static sk_typeface_t sk_typeface_create_from_name (IntPtr familyName, sk_fontstyle_t style) => (sk_typeface_create_from_name_delegate ??= GetSymbol ("sk_typeface_create_from_name")).Invoke (familyName, style); #endif From 3757e22ee32813152267ad2db155698ffe0412ce Mon Sep 17 00:00:00 2001 From: lindexi Date: Sat, 9 Jul 2022 10:24:20 +0800 Subject: [PATCH 4/4] Edit the json file to fix load the font which the name contains unicode text --- binding/libSkiaSharp.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/binding/libSkiaSharp.json b/binding/libSkiaSharp.json index cf4cc509887..f11d6fa2c71 100644 --- a/binding/libSkiaSharp.json +++ b/binding/libSkiaSharp.json @@ -422,23 +422,23 @@ }, "sk_fontmgr_match_family": { "parameters": { - "1": "[MarshalAs (UnmanagedType.LPStr)] String" + "1": "IntPtr" } }, "sk_fontmgr_match_family_style": { "parameters": { - "1": "[MarshalAs (UnmanagedType.LPStr)] String" + "1": "IntPtr" } }, "sk_fontmgr_match_family_style_character": { "parameters": { - "1": "[MarshalAs (UnmanagedType.LPStr)] String", + "1": "IntPtr", "3": "[MarshalAs (UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] String[]" } }, "sk_typeface_create_from_name": { "parameters": { - "0": "[MarshalAs (UnmanagedType.LPStr)] String" + "0": "IntPtr" } }, "sk_path_parse_svg_string": {