From c6f61a75069e1747b4ca89d2d2435b65cb5022db Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 01:57:03 +0400 Subject: [PATCH 1/6] Added C# bindings for SKFontManager --- binding/Binding/Binding.projitems | 1 + binding/Binding/SKFontManager.cs | 79 +++++++++++++++++++ binding/Binding/SkiaApi.cs | 13 +++ externals/skia | 2 +- .../libSkiaSharp_android/jni/SkiaSharp.mk | 1 + .../project.pbxproj | 2 + .../project.pbxproj | 2 + native-builds/libSkiaSharp_linux/Makefile | 1 + .../libSkiaSharp.xcodeproj/project.pbxproj | 2 + .../project.pbxproj | 2 + .../libSkiaSharp_uwp/libSkiaSharp.vcxproj | 12 +-- .../libSkiaSharp_windows/libSkiaSharp.vcxproj | 8 +- 12 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 binding/Binding/SKFontManager.cs diff --git a/binding/Binding/Binding.projitems b/binding/Binding/Binding.projitems index 8271e0fb9e..721a1b245f 100644 --- a/binding/Binding/Binding.projitems +++ b/binding/Binding/Binding.projitems @@ -35,6 +35,7 @@ + diff --git a/binding/Binding/SKFontManager.cs b/binding/Binding/SKFontManager.cs new file mode 100644 index 0000000000..78fdf66138 --- /dev/null +++ b/binding/Binding/SKFontManager.cs @@ -0,0 +1,79 @@ +// +// Bindings for SKTypeface +// +// Author: +// Miguel de Icaza +// +// Copyright 2016 Xamarin Inc +// +using System; +using System.Runtime.InteropServices; + +namespace SkiaSharp +{ + public class SKFontManager : SKObject + { + [Preserve] + internal SKFontManager (IntPtr handle, bool owns) + : base (handle, owns) + { + } + + protected override void Dispose (bool disposing) + { + if (Handle != IntPtr.Zero && OwnsHandle) { + SkiaApi.sk_fontmgr_unref (Handle); + } + + base.Dispose (disposing); + } + + public static SKFontManager Default => GetObject (SkiaApi.sk_fontmgr_ref_default ()); + + public int FontFamilyCount => SkiaApi.sk_fontmgr_count_families (Handle); + + public string GetFamilyName (int index) + { + using (var str = new SKString ()) { + SkiaApi.sk_fontmgr_get_family_name (Handle, index, str.Handle); + return (string)str; + } + } + + public string[] GetFontFamilies () + { + var count = FontFamilyCount; + var families = new string [count]; + for (int i = 0; i < count; i++) { + families [i] = GetFamilyName (i); + } + return families; + } + + public SKTypeface MatchFamilyStyleCharacter (string familyName, string[] bcp47, char character) + { + return MatchFamilyStyleCharacter (familyName, (int)SKFontStyleWeight.Normal, (int)SKFontStyleWidth.Normal, SKFontStyleSlant.Upright, bcp47, (int)character); + } + + public SKTypeface MatchFamilyStyleCharacter (string familyName, string[] bcp47, int character) + { + return MatchFamilyStyleCharacter (familyName, (int)SKFontStyleWeight.Normal, (int)SKFontStyleWidth.Normal, SKFontStyleSlant.Upright, bcp47, character); + } + + public SKTypeface MatchFamilyStyleCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, char character) + { + return MatchFamilyStyleCharacter (familyName, (int)weight, (int)width, slant, bcp47, (int)character); + } + + public SKTypeface MatchFamilyStyleCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, int character) + { + return MatchFamilyStyleCharacter (familyName, (int)weight, (int)width, slant, bcp47, character); + } + + public SKTypeface MatchFamilyStyleCharacter (string familyName, int weight, int width, SKFontStyleSlant slant, string[] bcp47, int character) + { + return GetObject (SkiaApi.sk_fontmgr_match_family_style_character (Handle, familyName, weight, width, slant, bcp47, bcp47?.Length ?? 0, character)); + } + } +} + diff --git a/binding/Binding/SkiaApi.cs b/binding/Binding/SkiaApi.cs index 6f3f80068d..13f91df634 100755 --- a/binding/Binding/SkiaApi.cs +++ b/binding/Binding/SkiaApi.cs @@ -24,6 +24,7 @@ using sk_string_t = System.IntPtr; using sk_picture_recorder_t = System.IntPtr; using sk_typeface_t = System.IntPtr; +using sk_fontmgr_t = System.IntPtr; using sk_font_table_tag_t = System.UInt32; using sk_stream_t = System.IntPtr; using sk_stream_filestream_t = System.IntPtr; @@ -885,6 +886,18 @@ internal static class SkiaApi [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] public extern static SKTypefaceStyle sk_typeface_get_style(sk_typeface_t typeface); + // FontMgr + [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] + public extern static sk_fontmgr_t sk_fontmgr_ref_default(); + [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] + public extern static void sk_fontmgr_unref(sk_fontmgr_t fontmgr); + [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] + public extern static int sk_fontmgr_count_families(sk_fontmgr_t fontmgr); + [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] + public extern static void sk_fontmgr_get_family_name(sk_fontmgr_t fontmgr, int index, sk_string_t familyName); + [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] + public extern static sk_typeface_t sk_fontmgr_match_family_style_character(sk_fontmgr_t fontmgr, [MarshalAs(UnmanagedType.LPStr)] string familyName, int weight, int width, SKFontStyleSlant slant, [In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] string[] bcp47, int bcp47Count, int character); + // Streams [DllImport(SKIA, CallingConvention = CallingConvention.Cdecl)] public extern static void sk_memorystream_destroy(sk_stream_memorystream_t stream); diff --git a/externals/skia b/externals/skia index 33ccbca77e..31d83c5349 160000 --- a/externals/skia +++ b/externals/skia @@ -1 +1 @@ -Subproject commit 33ccbca77e22e5684a39b966c84baed7f384c987 +Subproject commit 31d83c5349acda431d76f22216390b49251ba182 diff --git a/native-builds/libSkiaSharp_android/jni/SkiaSharp.mk b/native-builds/libSkiaSharp_android/jni/SkiaSharp.mk index 2d3d8c0e89..1f7dead71b 100644 --- a/native-builds/libSkiaSharp_android/jni/SkiaSharp.mk +++ b/native-builds/libSkiaSharp_android/jni/SkiaSharp.mk @@ -64,6 +64,7 @@ LOCAL_C_INCLUDES := ../../externals/skia/src/c \ ../../externals/skia/include/xml \ ../../externals/skia/include/svg \ ../../externals/skia/include/utils \ + ../../externals/skia/include/ports \ ../../externals/skia/include/images LOCAL_CFLAGS := -DSK_INTERNAL -DSK_GAMMA_APPLY_TO_A8 \ diff --git a/native-builds/libSkiaSharp_ios/libSkiaSharp_arm.xcodeproj/project.pbxproj b/native-builds/libSkiaSharp_ios/libSkiaSharp_arm.xcodeproj/project.pbxproj index b5a5564a50..7380b9b885 100644 --- a/native-builds/libSkiaSharp_ios/libSkiaSharp_arm.xcodeproj/project.pbxproj +++ b/native-builds/libSkiaSharp_ios/libSkiaSharp_arm.xcodeproj/project.pbxproj @@ -1976,6 +1976,7 @@ ../../externals/skia/include/utils, ../../externals/skia/include/gpu, ../../externals/skia/include/config, + ../../externals/skia/include/ports, ../../externals/skia/include/xml, ../../externals/skia/include/svg, ); @@ -2016,6 +2017,7 @@ ../../externals/skia/include/utils, ../../externals/skia/include/gpu, ../../externals/skia/include/config, + ../../externals/skia/include/ports, ../../externals/skia/include/xml, ../../externals/skia/include/svg, ); diff --git a/native-builds/libSkiaSharp_ios/libSkiaSharp_x86.xcodeproj/project.pbxproj b/native-builds/libSkiaSharp_ios/libSkiaSharp_x86.xcodeproj/project.pbxproj index a8269fc8d8..34109fa072 100644 --- a/native-builds/libSkiaSharp_ios/libSkiaSharp_x86.xcodeproj/project.pbxproj +++ b/native-builds/libSkiaSharp_ios/libSkiaSharp_x86.xcodeproj/project.pbxproj @@ -2059,6 +2059,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, @@ -2099,6 +2100,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, diff --git a/native-builds/libSkiaSharp_linux/Makefile b/native-builds/libSkiaSharp_linux/Makefile index 2bd5caed3e..ef444e727c 100644 --- a/native-builds/libSkiaSharp_linux/Makefile +++ b/native-builds/libSkiaSharp_linux/Makefile @@ -28,6 +28,7 @@ include_dirs = \ ../../externals/skia/include/gpu \ ../../externals/skia/include/config \ ../../externals/skia/include/utils \ + ../../externals/skia/include/ports \ ../../externals/skia/include/images \ ../../externals/skia/include/svg \ ../../externals/skia/include/xml diff --git a/native-builds/libSkiaSharp_osx/libSkiaSharp.xcodeproj/project.pbxproj b/native-builds/libSkiaSharp_osx/libSkiaSharp.xcodeproj/project.pbxproj index 8f09402ad8..a8cfbda9a3 100644 --- a/native-builds/libSkiaSharp_osx/libSkiaSharp.xcodeproj/project.pbxproj +++ b/native-builds/libSkiaSharp_osx/libSkiaSharp.xcodeproj/project.pbxproj @@ -1714,6 +1714,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, @@ -1746,6 +1747,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, diff --git a/native-builds/libSkiaSharp_tvos/libSkiaSharp_arm.xcodeproj/project.pbxproj b/native-builds/libSkiaSharp_tvos/libSkiaSharp_arm.xcodeproj/project.pbxproj index ce6b6ac7ca..086231e90c 100644 --- a/native-builds/libSkiaSharp_tvos/libSkiaSharp_arm.xcodeproj/project.pbxproj +++ b/native-builds/libSkiaSharp_tvos/libSkiaSharp_arm.xcodeproj/project.pbxproj @@ -1982,6 +1982,7 @@ ../../externals/skia/include/effects, ../../externals/skia/include/pathops, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/gpu, ../../externals/skia/include/config, ../../externals/skia/include/xml, @@ -2022,6 +2023,7 @@ ../../externals/skia/include/effects, ../../externals/skia/include/pathops, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/gpu, ../../externals/skia/include/config, ../../externals/skia/include/xml, diff --git a/native-builds/libSkiaSharp_uwp/libSkiaSharp.vcxproj b/native-builds/libSkiaSharp_uwp/libSkiaSharp.vcxproj index 045f33f4e9..e4b13fd392 100644 --- a/native-builds/libSkiaSharp_uwp/libSkiaSharp.vcxproj +++ b/native-builds/libSkiaSharp_uwp/libSkiaSharp.vcxproj @@ -143,7 +143,7 @@ Disabled _DEBUG;SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;SK_DEVELOPER=1;;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console @@ -163,7 +163,7 @@ true SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console @@ -181,7 +181,7 @@ Disabled _DEBUG;SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;SK_DEVELOPER=1;;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console @@ -202,7 +202,7 @@ true SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console @@ -223,7 +223,7 @@ Disabled _DEBUG;SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;SK_DEVELOPER=1;;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console @@ -244,7 +244,7 @@ true SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;SK_BUILD_FOR_WINRT;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;;NDEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Console diff --git a/native-builds/libSkiaSharp_windows/libSkiaSharp.vcxproj b/native-builds/libSkiaSharp_windows/libSkiaSharp.vcxproj index 5cafcf3a65..46c18e8c2b 100644 --- a/native-builds/libSkiaSharp_windows/libSkiaSharp.vcxproj +++ b/native-builds/libSkiaSharp_windows/libSkiaSharp.vcxproj @@ -94,7 +94,7 @@ Disabled _DEBUG;SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;SK_DEVELOPER=1;;WIN32;_DEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Windows @@ -110,7 +110,7 @@ Disabled _DEBUG;SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;SK_DEVELOPER=1;;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Windows @@ -128,7 +128,7 @@ true SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;;WIN32;NDEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Windows @@ -148,7 +148,7 @@ true SK_INTERNAL;SK_GAMMA_SRGB;SK_GAMMA_APPLY_TO_A8;SK_ALLOW_STATIC_GLOBAL_INITIALIZERS=1;SK_SUPPORT_GPU=1;SK_SUPPORT_OPENCL=0;SK_FORCE_DISTANCE_FIELD_TEXT=0;SK_BUILD_FOR_WIN32;_CRT_SECURE_NO_WARNINGS;GR_GL_FUNCTION_TYPE=__stdcall;_HAS_EXCEPTIONS=0;;NDEBUG;_WINDOWS;_USRDLL;LIBSKIA_WINDOWS_EXPORTS;%(PreprocessorDefinitions) true - ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) + ..\..\externals\skia\include\c;..\..\externals\skia\include\config;..\..\externals\skia\include\ports;..\..\externals\skia\include\core;..\..\externals\skia\include\effects;..\..\externals\skia\include\xml;..\..\skia\include\svg;..\..\externals\skia\include\pathops;..\..\externals\skia\include\codec;..\..\externals\skia\include\pathops;..\..\externals\skia\include\pipe;..\..\externals\skia\include\ports;..\..\externals\skia\include\private;..\..\externals\skia\include\utils;..\..\externals\skia\include\images;..\..\externals\skia\src\c;..\..\externals\skia\src\core;..\..\externals\skia\src\sfnt;..\..\externals\skia\src\image;..\..\externals\skia\src\opts;..\..\externals\skia\src\utils;..\..\gyp\config\win;..\..\externals\skia\include\gpu;..\..\externals\skia\src\gpu;%(AdditionalIncludeDirectories) Windows From 0b9e084d7ee0461bbd101d661e2ec9ee2d994e82 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 16:12:55 +0400 Subject: [PATCH 2/6] Added better Unicode support --- binding/Binding/SKCanvas.cs | 66 +++++++++++++++++++++++++--- binding/Binding/SKFontManager.cs | 38 ++++++++++++---- binding/Binding/SKPaint.cs | 74 ++++++++++++++++++++++++-------- binding/Binding/SKString.cs | 4 +- binding/Binding/Util.cs | 40 ++++++++++++++--- 5 files changed, 180 insertions(+), 42 deletions(-) diff --git a/binding/Binding/SKCanvas.cs b/binding/Binding/SKCanvas.cs index 93e0ff6627..50e5e040c6 100644 --- a/binding/Binding/SKCanvas.cs +++ b/binding/Binding/SKCanvas.cs @@ -381,8 +381,18 @@ public void DrawText (string text, float x, float y, SKPaint paint) if (paint == null) throw new ArgumentNullException (nameof (paint)); - var bytes = Util.GetEncodedText (text, paint.TextEncoding); - SkiaApi.sk_canvas_draw_text (Handle, bytes, bytes.Length, x, y, paint.Handle); + var bytes = StringUtilities.GetEncodedText (text, paint.TextEncoding); + DrawText (bytes, x, y, paint); + } + + public void DrawText (byte[] text, float x, float y, SKPaint paint) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + if (paint == null) + throw new ArgumentNullException (nameof (paint)); + + SkiaApi.sk_canvas_draw_text (Handle, text, text.Length, x, y, paint.Handle); } [Obsolete ("Use DrawPositionedText instead.")] @@ -400,11 +410,29 @@ public void DrawPositionedText (string text, SKPoint [] points, SKPaint paint) if (points == null) throw new ArgumentNullException (nameof (points)); - var bytes = Util.GetEncodedText (text, paint.TextEncoding); - SkiaApi.sk_canvas_draw_pos_text (Handle, bytes, bytes.Length, points, paint.Handle); + var bytes = StringUtilities.GetEncodedText (text, paint.TextEncoding); + DrawPositionedText (bytes, points, paint); } + public void DrawPositionedText (byte[] text, SKPoint [] points, SKPaint paint) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + if (paint == null) + throw new ArgumentNullException (nameof (paint)); + if (points == null) + throw new ArgumentNullException (nameof (points)); + + SkiaApi.sk_canvas_draw_pos_text (Handle, text, text.Length, points, paint.Handle); + } + + [Obsolete ("Use DrawTextOnPath instead.")] public void DrawText (IntPtr buffer, int length, SKPath path, float hOffset, float vOffset, SKPaint paint) + { + DrawTextOnPath (buffer, length, path, hOffset, vOffset, paint); + } + + public void DrawTextOnPath (IntPtr buffer, int length, SKPath path, float hOffset, float vOffset, SKPaint paint) { if (buffer == IntPtr.Zero) throw new ArgumentNullException (nameof (buffer)); @@ -444,7 +472,32 @@ public void DrawPositionedText (IntPtr buffer, int length, SKPoint[] points, SKP SkiaApi.sk_canvas_draw_pos_text (Handle, buffer, length, points, paint.Handle); } + [Obsolete ("Use DrawTextOnPath instead.")] public void DrawText (string text, SKPath path, float hOffset, float vOffset, SKPaint paint) + { + DrawTextOnPath (text, path, hOffset, vOffset, paint); + } + + public void DrawTextOnPath (string text, SKPath path, float hOffset, float vOffset, SKPaint paint) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + if (paint == null) + throw new ArgumentNullException (nameof (paint)); + if (paint == null) + throw new ArgumentNullException (nameof (paint)); + + var bytes = StringUtilities.GetEncodedText (text, paint.TextEncoding); + DrawTextOnPath (bytes, path, hOffset, vOffset, paint); + } + + [Obsolete ("Use DrawTextOnPath instead.")] + public void DrawText (byte[] text, SKPath path, float hOffset, float vOffset, SKPaint paint) + { + DrawTextOnPath (text, path, hOffset, vOffset, paint); + } + + public void DrawTextOnPath (byte[] text, SKPath path, float hOffset, float vOffset, SKPaint paint) { if (text == null) throw new ArgumentNullException (nameof (text)); @@ -453,8 +506,7 @@ public void DrawText (string text, SKPath path, float hOffset, float vOffset, SK if (paint == null) throw new ArgumentNullException (nameof (paint)); - var bytes = Util.GetEncodedText (text, paint.TextEncoding); - SkiaApi.sk_canvas_draw_text_on_path (Handle, bytes, bytes.Length, path.Handle, hOffset, vOffset, paint.Handle); + SkiaApi.sk_canvas_draw_text_on_path (Handle, text, text.Length, path.Handle, hOffset, vOffset, paint.Handle); } public void Flush () @@ -464,7 +516,7 @@ public void Flush () public void DrawAnnotation (SKRect rect, string key, SKData value) { - SkiaApi.sk_canvas_draw_annotation (Handle, ref rect, Util.GetEncodedText (key, SKTextEncoding.Utf8), value == null ? IntPtr.Zero : value.Handle); + SkiaApi.sk_canvas_draw_annotation (Handle, ref rect, StringUtilities.GetEncodedText (key, SKTextEncoding.Utf8), value == null ? IntPtr.Zero : value.Handle); } public void DrawUrlAnnotation (SKRect rect, SKData value) diff --git a/binding/Binding/SKFontManager.cs b/binding/Binding/SKFontManager.cs index 78fdf66138..91f23740f9 100644 --- a/binding/Binding/SKFontManager.cs +++ b/binding/Binding/SKFontManager.cs @@ -50,27 +50,47 @@ public string[] GetFontFamilies () return families; } - public SKTypeface MatchFamilyStyleCharacter (string familyName, string[] bcp47, char character) + public SKTypeface MatchCharacter (char character) { - return MatchFamilyStyleCharacter (familyName, (int)SKFontStyleWeight.Normal, (int)SKFontStyleWidth.Normal, SKFontStyleSlant.Upright, bcp47, (int)character); + return MatchCharacter ((int)character); } - public SKTypeface MatchFamilyStyleCharacter (string familyName, string[] bcp47, int character) + public SKTypeface MatchCharacter (int character) { - return MatchFamilyStyleCharacter (familyName, (int)SKFontStyleWeight.Normal, (int)SKFontStyleWidth.Normal, SKFontStyleSlant.Upright, bcp47, character); + return MatchCharacter (null, character); } - public SKTypeface MatchFamilyStyleCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, char character) + public SKTypeface MatchCharacter (string familyName, char character) { - return MatchFamilyStyleCharacter (familyName, (int)weight, (int)width, slant, bcp47, (int)character); + return MatchCharacter (familyName, (int)character); } - public SKTypeface MatchFamilyStyleCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, int character) + public SKTypeface MatchCharacter (string familyName, int character) { - return MatchFamilyStyleCharacter (familyName, (int)weight, (int)width, slant, bcp47, character); + return MatchCharacter (familyName, null, character); } - public SKTypeface MatchFamilyStyleCharacter (string familyName, int weight, int width, SKFontStyleSlant slant, string[] bcp47, int character) + public SKTypeface MatchCharacter (string familyName, string[] bcp47, char character) + { + return MatchCharacter (familyName, bcp47, (int)character); + } + + public SKTypeface MatchCharacter (string familyName, string[] bcp47, int character) + { + return MatchCharacter (familyName, SKFontStyleWeight.Normal, SKFontStyleWidth.Normal, SKFontStyleSlant.Upright, bcp47, character); + } + + public SKTypeface MatchCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, char character) + { + return MatchCharacter (familyName, weight, width, slant, bcp47, (int)character); + } + + public SKTypeface MatchCharacter (string familyName, SKFontStyleWeight weight, SKFontStyleWidth width, SKFontStyleSlant slant, string[] bcp47, int character) + { + return MatchCharacter (familyName, (int)weight, (int)width, slant, bcp47, character); + } + + public SKTypeface MatchCharacter (string familyName, int weight, int width, SKFontStyleSlant slant, string[] bcp47, int character) { return GetObject (SkiaApi.sk_fontmgr_match_family_style_character (Handle, familyName, weight, width, slant, bcp47, bcp47?.Length ?? 0, character)); } diff --git a/binding/Binding/SKPaint.cs b/binding/Binding/SKPaint.cs index d8c1615716..9f049acb72 100644 --- a/binding/Binding/SKPaint.cs +++ b/binding/Binding/SKPaint.cs @@ -350,8 +350,16 @@ public float MeasureText (string text) if (text == null) throw new ArgumentNullException (nameof (text)); - var bytes = Util.GetEncodedText (text, TextEncoding); - return SkiaApi.sk_paint_measure_text (Handle, bytes, (IntPtr) bytes.Length, IntPtr.Zero); + var bytes = StringUtilities.GetEncodedText (text, TextEncoding); + return MeasureText (bytes); + } + + public float MeasureText (byte[] text) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + + return SkiaApi.sk_paint_measure_text (Handle, text, (IntPtr)text.Length, IntPtr.Zero); } public float MeasureText (IntPtr buffer, IntPtr length) @@ -367,8 +375,16 @@ public float MeasureText (string text, ref SKRect bounds) if (text == null) throw new ArgumentNullException (nameof (text)); - var bytes = Util.GetEncodedText (text, TextEncoding); - return SkiaApi.sk_paint_measure_text(Handle, bytes, (IntPtr) bytes.Length, ref bounds); + var bytes = StringUtilities.GetEncodedText (text, TextEncoding); + return MeasureText (bytes, ref bounds); + } + + public float MeasureText (byte[] text, ref SKRect bounds) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + + return SkiaApi.sk_paint_measure_text (Handle, text, (IntPtr)text.Length, ref bounds); } public float MeasureText (IntPtr buffer, IntPtr length, ref SKRect bounds) @@ -389,48 +405,68 @@ public long BreakText (string text, float maxWidth, out float measuredWidth) { if (text == null) throw new ArgumentNullException (nameof (text)); - var bytes = Util.GetEncodedText (text, TextEncoding); + var bytes = StringUtilities.GetEncodedText (text, TextEncoding); return (long) SkiaApi.sk_paint_break_text (Handle, bytes, (IntPtr) bytes.Length, maxWidth, out measuredWidth); } + public long BreakText (byte[] text, float maxWidth, out float measuredWidth) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + return (long) SkiaApi.sk_paint_break_text (Handle, text, (IntPtr) text.Length, maxWidth, out measuredWidth); + } public long BreakText (IntPtr buffer, IntPtr length, float maxWidth, out float measuredWidth) { if (buffer == IntPtr.Zero) throw new ArgumentNullException (nameof (buffer)); - return (long)SkiaApi.sk_paint_break_text (Handle, buffer, length, maxWidth, out measuredWidth); + return (long) SkiaApi.sk_paint_break_text (Handle, buffer, length, maxWidth, out measuredWidth); } - public SKPath GetTextPath(string text, float x, float y) + public SKPath GetTextPath (string text, float x, float y) { if (text == null) - throw new ArgumentNullException(nameof(text)); - var bytes = Util.GetEncodedText (text, TextEncoding); - return GetObject(SkiaApi.sk_paint_get_text_path(Handle, bytes, (IntPtr) bytes.Length, x, y)); + throw new ArgumentNullException (nameof (text)); + var bytes = StringUtilities.GetEncodedText (text, TextEncoding); + return GetTextPath (bytes, x, y); + } + + public SKPath GetTextPath (byte[] text, float x, float y) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + return GetObject (SkiaApi.sk_paint_get_text_path(Handle, text, (IntPtr) text.Length, x, y)); } - public SKPath GetTextPath(IntPtr buffer, IntPtr length, float x, float y) + public SKPath GetTextPath (IntPtr buffer, IntPtr length, float x, float y) { if (buffer == IntPtr.Zero) - throw new ArgumentNullException(nameof(buffer)); - return GetObject(SkiaApi.sk_paint_get_text_path(Handle, buffer, length, x, y)); + throw new ArgumentNullException (nameof (buffer)); + return GetObject (SkiaApi.sk_paint_get_text_path (Handle, buffer, length, x, y)); } - public SKPath GetTextPath(string text, SKPoint[] points) + public SKPath GetTextPath (string text, SKPoint[] points) { if (text == null) throw new ArgumentNullException(nameof(text)); - var bytes = Util.GetEncodedText (text, TextEncoding); - return GetObject(SkiaApi.sk_paint_get_pos_text_path(Handle, bytes, (IntPtr) bytes.Length, points)); + var bytes = StringUtilities.GetEncodedText (text, TextEncoding); + return GetObject (SkiaApi.sk_paint_get_pos_text_path (Handle, bytes, (IntPtr) bytes.Length, points)); } - public SKPath GetTextPath(IntPtr buffer, IntPtr length, SKPoint[] points) + public SKPath GetTextPath(byte[] text, SKPoint[] points) + { + if (text == null) + throw new ArgumentNullException (nameof (text)); + return GetObject (SkiaApi.sk_paint_get_pos_text_path (Handle, text, (IntPtr) text.Length, points)); + } + + public SKPath GetTextPath (IntPtr buffer, IntPtr length, SKPoint[] points) { if (buffer == IntPtr.Zero) - throw new ArgumentNullException(nameof(buffer)); - return GetObject(SkiaApi.sk_paint_get_pos_text_path(Handle, buffer, length, points)); + throw new ArgumentNullException (nameof (buffer)); + return GetObject (SkiaApi.sk_paint_get_pos_text_path (Handle, buffer, length, points)); } public bool GetFillPath(SKPath src, SKPath dst, SKRect cullRect, float resScale = 1) diff --git a/binding/Binding/SKString.cs b/binding/Binding/SKString.cs index a8ce81148e..d5508778ee 100644 --- a/binding/Binding/SKString.cs +++ b/binding/Binding/SKString.cs @@ -41,7 +41,7 @@ public SKString (byte [] src) } public SKString (string str) - : this (Util.GetEncodedText (str, SKTextEncoding.Utf8)) + : this (StringUtilities.GetEncodedText (str, SKTextEncoding.Utf8)) { } @@ -49,7 +49,7 @@ public override string ToString () { var cstr = SkiaApi.sk_string_get_c_str (Handle); var clen = SkiaApi.sk_string_get_size (Handle); - return Util.GetString (cstr, (int)clen, SKTextEncoding.Utf8); + return StringUtilities.GetString (cstr, (int)clen, SKTextEncoding.Utf8); } public static explicit operator string (SKString skString) diff --git a/binding/Binding/Util.cs b/binding/Binding/Util.cs index 5ffa4da259..dce9069863 100644 --- a/binding/Binding/Util.cs +++ b/binding/Binding/Util.cs @@ -5,8 +5,31 @@ namespace SkiaSharp { - static class Util + public static class StringUtilities { + private static int GetUnicodeStringLength(SKTextEncoding encoding) + { + switch (encoding) + { + case SKTextEncoding.Utf8: + case SKTextEncoding.Utf16: + return 1; + case SKTextEncoding.Utf32: + return 2; + default: + throw new ArgumentOutOfRangeException(nameof(encoding), $"Encoding {encoding} is not supported."); + } + } + + public static int GetUnicodeCharacterCode(string character, SKTextEncoding encoding) + { + if (GetUnicodeStringLength(encoding) != character.Length) + throw new ArgumentException(nameof(character), $"Only a single character can be specified."); + + var bytes = GetEncodedText(character, encoding); + return BitConverter.ToInt32(bytes, 0); + } + public static byte[] GetEncodedText(string text, SKTextEncoding encoding) { switch (encoding) @@ -24,17 +47,24 @@ public static byte[] GetEncodedText(string text, SKTextEncoding encoding) public static string GetString(IntPtr data, int dataLength, SKTextEncoding encoding) { - if (data == IntPtr.Zero || dataLength <= 0) return ""; + if (data == IntPtr.Zero || dataLength <= 0) + return ""; + byte[] result = new byte[dataLength]; Marshal.Copy(data, result, 0, dataLength); + return GetString(result, encoding); + } + + public static string GetString(byte[] data, SKTextEncoding encoding) + { switch (encoding) { case SKTextEncoding.Utf8: - return Encoding.UTF8.GetString(result); + return Encoding.UTF8.GetString(data); case SKTextEncoding.Utf16: - return Encoding.Unicode.GetString(result); + return Encoding.Unicode.GetString(data); case SKTextEncoding.Utf32: - return Encoding.UTF32.GetString(result); + return Encoding.UTF32.GetString(data); default: throw new ArgumentOutOfRangeException(nameof(encoding), $"Encoding {encoding} is not supported."); } From ca4aa79555be32324c946d26105e4838ad15e4da Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 16:13:44 +0400 Subject: [PATCH 3/6] Improved the Unicode sample --- .../Samples/UnicodeTextSample.cs | 67 ++++++++++++++----- 1 file changed, 51 insertions(+), 16 deletions(-) diff --git a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs index 5f116457c4..530d05a3aa 100644 --- a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs +++ b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs @@ -16,29 +16,64 @@ public UnicodeTextSample() protected override void OnDrawSample(SKCanvas canvas, int width, int height) { - // stops at 0x530 on Android - string text = "\u03A3 and \u0750"; + canvas.DrawColor(SKColors.White); - using (var paint = new SKPaint()) - using (var tf = SKTypeface.FromFamilyName("Tahoma")) + var basePaint = new SKPaint(); + basePaint.IsAntialias = true; + basePaint.TextSize = 60; + + // first, we can just use a font (system default if not exists) + using (var paint = basePaint.Clone()) + using (var courier = SKTypeface.FromFamilyName("Courier New")) { - canvas.DrawColor(SKColors.White); + paint.Typeface = courier; + canvas.DrawText("'A' and 'ݐ' and '年'", 40, 100, paint); + } + + // the font manager finds fonts + var fontManager = SKFontManager.Default; - paint.IsAntialias = true; - paint.TextSize = 60; - paint.Typeface = tf; - canvas.DrawText(text, 50, 100, paint); + // or, we can try and make sure (fallback to default font) + using (var paint = basePaint.Clone()) + using (var courier = fontManager.MatchCharacter("Courier New", 'ݐ')) + { + paint.Typeface = courier; + canvas.DrawText("'A' and 'ݐ' and '年'", 40, 200, paint); } - using (var paint = new SKPaint()) - using (var tf = SKTypeface.FromFamilyName("Times New Roman")) + // if we know the font doesn't have the character, or don't want to fall back + using (var paint = basePaint.Clone()) + using (var courier = SKTypeface.FromFamilyName("Courier New")) + using (var japanese = fontManager.MatchCharacter("Courier New", '年')) { - paint.Color = SampleMedia.Colors.XamarinDarkBlue; + var first = "'A' and 'ݐ' and '"; + var mid = "年"; + var last = "'"; + + float x = 40; - paint.IsAntialias = true; - paint.TextSize = 60; - paint.Typeface = tf; - canvas.DrawText(text, 50, 200, paint); + // draw the first bit + paint.Typeface = courier; + canvas.DrawText(first, x, 300, paint); + x += paint.MeasureText(first); + + // the japanese character + paint.Typeface = japanese; + canvas.DrawText(mid, x, 300, paint); + x += paint.MeasureText(mid); + + // the end + paint.Typeface = courier; + canvas.DrawText(last, x, 300, paint); + } + + // let's draw some emojis (UTF-32 characters) + var emojiChar = StringUtilities.GetUnicodeCharacterCode("🚀", SKTextEncoding.Utf32); + using (var paint = basePaint.Clone()) + using (var emoji = fontManager.MatchCharacter(emojiChar)) + { + paint.Typeface = emoji; + canvas.DrawText("🌐 🍪 🍕 🚀", 40, 400, paint); } } } From 33883435bd897d1f5f328b85e081ba102638f741 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 17:41:10 +0400 Subject: [PATCH 4/6] Added a test for SKFontManager.MatchCharacter --- binding/Binding/SKFontManager.cs | 6 ++++++ .../Samples/UnicodeTextSample.cs | 8 ++++---- tests/Tests/SKTypefaceTest.cs | 17 +++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/binding/Binding/SKFontManager.cs b/binding/Binding/SKFontManager.cs index 91f23740f9..630c2b6a61 100644 --- a/binding/Binding/SKFontManager.cs +++ b/binding/Binding/SKFontManager.cs @@ -92,6 +92,12 @@ public SKTypeface MatchCharacter (string familyName, SKFontStyleWeight weight, S public SKTypeface MatchCharacter (string familyName, int weight, int width, SKFontStyleSlant slant, string[] bcp47, int character) { + // TODO: work around for https://bugs.chromium.org/p/skia/issues/detail?id=6196 + if (familyName == null) + { + familyName = string.Empty; + } + return GetObject (SkiaApi.sk_fontmgr_match_family_style_character (Handle, familyName, weight, width, slant, bcp47, bcp47?.Length ?? 0, character)); } } diff --git a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs index 530d05a3aa..3377f3dc87 100644 --- a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs +++ b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs @@ -27,7 +27,7 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) using (var courier = SKTypeface.FromFamilyName("Courier New")) { paint.Typeface = courier; - canvas.DrawText("'A' and 'ݐ' and '年'", 40, 100, paint); + canvas.DrawText("'A', 'ݐ', '年'", 40, 100, paint); } // the font manager finds fonts @@ -38,7 +38,7 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) using (var courier = fontManager.MatchCharacter("Courier New", 'ݐ')) { paint.Typeface = courier; - canvas.DrawText("'A' and 'ݐ' and '年'", 40, 200, paint); + canvas.DrawText("'A', 'ݐ', '年'", 40, 200, paint); } // if we know the font doesn't have the character, or don't want to fall back @@ -46,7 +46,7 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) using (var courier = SKTypeface.FromFamilyName("Courier New")) using (var japanese = fontManager.MatchCharacter("Courier New", '年')) { - var first = "'A' and 'ݐ' and '"; + var first = "'A', 'ݐ', '"; var mid = "年"; var last = "'"; @@ -73,7 +73,7 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) using (var emoji = fontManager.MatchCharacter(emojiChar)) { paint.Typeface = emoji; - canvas.DrawText("🌐 🍪 🍕 🚀", 40, 400, paint); + canvas.DrawText("🌐 🍪 🍕 🚀", 40, 400, paint); } } } diff --git a/tests/Tests/SKTypefaceTest.cs b/tests/Tests/SKTypefaceTest.cs index 2bff947bec..e17e275ae9 100644 --- a/tests/Tests/SKTypefaceTest.cs +++ b/tests/Tests/SKTypefaceTest.cs @@ -97,6 +97,23 @@ public void TestGetTableData() } } + [Fact] + public void TestFontManagerMatchCharacter() + { + var fonts = SKFontManager.Default; + var emoji = "🚀"; + var emojiChar = StringUtilities.GetUnicodeCharacterCode(emoji, SKTextEncoding.Utf32); + using (var typeface = fonts.MatchCharacter(emojiChar)) + { + if (IsLinux) + Assert.Equal("", typeface.FamilyName); // see issue #225 + else if (IsMac) + Assert.Equal("Apple Color Emoji", typeface.FamilyName); + else if (IsWindows) + Assert.Equal("Segoe UI Emoji", typeface.FamilyName); + } + } + [Fact] public void ExceptionInInvalidGetTableData() { From e0aa403f2c8005745e2f4201e8a4e15ca12fbf36 Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 09:09:08 -0500 Subject: [PATCH 5/6] Fixed the x86 tvOS project --- .../libSkiaSharp_x86.xcodeproj/project.pbxproj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/native-builds/libSkiaSharp_tvos/libSkiaSharp_x86.xcodeproj/project.pbxproj b/native-builds/libSkiaSharp_tvos/libSkiaSharp_x86.xcodeproj/project.pbxproj index b74ece3e95..10cc83b2e6 100644 --- a/native-builds/libSkiaSharp_tvos/libSkiaSharp_x86.xcodeproj/project.pbxproj +++ b/native-builds/libSkiaSharp_tvos/libSkiaSharp_x86.xcodeproj/project.pbxproj @@ -2054,6 +2054,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, @@ -2094,6 +2095,7 @@ ../../externals/skia/include/pathops, ../../externals/skia/include/gpu, ../../externals/skia/include/utils, + ../../externals/skia/include/ports, ../../externals/skia/include/config, ../../externals/skia/include/xml, ../../externals/skia/include/svg, From ba5af9bdc7c8b65f61fcc93cb63158b8b0dfdf7c Mon Sep 17 00:00:00 2001 From: Matthew Leibowitz Date: Sat, 4 Feb 2017 09:22:31 -0500 Subject: [PATCH 6/6] Improved the Unicode sample a bit more --- .../Samples/UnicodeTextSample.cs | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs index 3377f3dc87..ec7a5321e5 100644 --- a/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs +++ b/samples/SkiaSharpSample.Shared/Samples/UnicodeTextSample.cs @@ -33,7 +33,7 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) // the font manager finds fonts var fontManager = SKFontManager.Default; - // or, we can try and make sure (fallback to default font) + // or, we can try and make sure that we have the character, and hope it has the others using (var paint = basePaint.Clone()) using (var courier = fontManager.MatchCharacter("Courier New", 'ݐ')) { @@ -44,10 +44,13 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) // if we know the font doesn't have the character, or don't want to fall back using (var paint = basePaint.Clone()) using (var courier = SKTypeface.FromFamilyName("Courier New")) + using (var arabic = fontManager.MatchCharacter("Courier New", 'ݐ')) using (var japanese = fontManager.MatchCharacter("Courier New", '年')) { - var first = "'A', 'ݐ', '"; - var mid = "年"; + var first = "'A', '"; + var arabChar = "ݐ"; + var mid = "', '"; + var japChar = "年"; var last = "'"; float x = 40; @@ -57,11 +60,21 @@ protected override void OnDrawSample(SKCanvas canvas, int width, int height) canvas.DrawText(first, x, 300, paint); x += paint.MeasureText(first); - // the japanese character - paint.Typeface = japanese; + // the arab character + paint.Typeface = arabic; + canvas.DrawText(arabChar, x, 300, paint); + x += paint.MeasureText(arabChar); + + // draw the next bit + paint.Typeface = courier; canvas.DrawText(mid, x, 300, paint); x += paint.MeasureText(mid); + // the japanese character + paint.Typeface = japanese; + canvas.DrawText(japChar, x, 300, paint); + x += paint.MeasureText(japChar); + // the end paint.Typeface = courier; canvas.DrawText(last, x, 300, paint);