From c177c15c8f6271b9b0b03fb7d8abea9481f06855 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 22 Apr 2025 01:04:49 +0200 Subject: [PATCH 1/9] feat: Add TextMetrics to API --- build/Build.LibAlphaSkia.cs | 4 +- lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs | 10 +- lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs | 73 ++++++ lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs | 2 +- lib/dotnet/AlphaSkia/GlobalUsings.cs | 3 +- lib/dotnet/AlphaSkia/NativeMethods.cs | 56 +++- .../alphaTab_alphaSkia_AlphaSkiaCanvas.h | 6 +- .../alphaTab_alphaSkia_AlphaSkiaTextMetrics.h | 117 +++++++++ lib/java/jni/src/AlphaSkiaCanvas.cpp | 40 ++- lib/java/jni/src/AlphaSkiaTextMetrics.cpp | 124 +++++++++ lib/java/jni/src/AlphaSkiaTextStyle.cpp | 6 +- .../alphaTab/alphaSkia/AlphaSkiaCanvas.java | 10 +- .../alphaSkia/AlphaSkiaTextMetrics.java | 75 ++++++ lib/node/addon/addon.cpp | 242 ++++++++++++++++-- lib/node/alphaskia/src/AlphaSkiaCanvas.ts | 13 +- .../alphaskia/src/AlphaSkiaTextMetrics.ts | 100 ++++++++ lib/node/alphaskia/src/addon.ts | 17 +- wrapper/include/AlphaSkiaCanvas.h | 48 +++- wrapper/include/alphaskia.h | 33 ++- wrapper/src/AlphaSkiaCanvas.cpp | 28 +- wrapper/src/alphaskia_canvas.cpp | 11 +- wrapper/src/alphaskia_text_metrics.cpp | 61 +++++ ...textstyle.cpp => alphaskia_text_style.cpp} | 26 +- 23 files changed, 1008 insertions(+), 97 deletions(-) create mode 100644 lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs create mode 100644 lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextMetrics.h create mode 100644 lib/java/jni/src/AlphaSkiaTextMetrics.cpp create mode 100644 lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextMetrics.java create mode 100644 lib/node/alphaskia/src/AlphaSkiaTextMetrics.ts create mode 100644 wrapper/src/alphaskia_text_metrics.cpp rename wrapper/src/{alphaskia_textstyle.cpp => alphaskia_text_style.cpp} (72%) diff --git a/build/Build.LibAlphaSkia.cs b/build/Build.LibAlphaSkia.cs index fbc0273..b2801e7 100644 --- a/build/Build.LibAlphaSkia.cs +++ b/build/Build.LibAlphaSkia.cs @@ -85,7 +85,8 @@ partial class Build "../../wrapper/src/alphaskia_canvas.cpp", "../../wrapper/src/alphaskia_image.cpp", "../../wrapper/src/alphaskia_typeface.cpp", - "../../wrapper/src/alphaskia_textstyle.cpp", + "../../wrapper/src/alphaskia_text_style.cpp", + "../../wrapper/src/alphaskia_text_metrics.cpp", "../../wrapper/src/alphaskia_data.cpp", "../../wrapper/src/alphaskia_string.cpp" ] @@ -158,6 +159,7 @@ partial class Build "../../lib/java/jni/src/AlphaSkiaData.cpp", "../../lib/java/jni/src/AlphaSkiaImage.cpp", "../../lib/java/jni/src/AlphaSkiaTextStyle.cpp", + "../../lib/java/jni/src/AlphaSkiaTextMetrics.cpp", "../../lib/java/jni/src/AlphaSkiaTypeface.cpp" ] } diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs index 3d214e1..154b8f4 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaCanvas.cs @@ -296,16 +296,18 @@ public void FillText(string text, AlphaSkiaTextStyle textStyle, float fontSize, } /// - /// Measures the given text. + /// Returns a object that contains information about the measured text (such as its width, for example). /// /// The text to measure. /// The text style to use for measuring the text. /// The font size to use when measuring the text. - /// The horizontal width of the text when it would be drawn. - public float MeasureText(string text, AlphaSkiaTextStyle textStyle, float fontSize) + /// How to align the text at the given position horizontally. + /// How to align the text at the given position vertically. + /// The text metrics. + public AlphaSkiaTextMetrics MeasureText(string text, AlphaSkiaTextStyle textStyle, float fontSize, AlphaSkiaTextAlign textAlign, AlphaSkiaTextBaseline baseline) { CheckDisposed(); - return NativeMethods.alphaskia_canvas_measure_text(Handle, text, text.Length, textStyle.Handle, fontSize); + return new AlphaSkiaTextMetrics(NativeMethods.alphaskia_canvas_measure_text(Handle, text, text.Length, textStyle.Handle, fontSize, textAlign, baseline)); } /// diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs b/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs new file mode 100644 index 0000000..9044ec9 --- /dev/null +++ b/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs @@ -0,0 +1,73 @@ +namespace AlphaSkia; + +/// +/// The TextMetrics interface represents the dimensions of a piece of text in the canvas; +/// A TextMetrics instance can be retrieved using the method. +/// +public sealed class AlphaSkiaTextMetrics : AlphaSkiaNative +{ + private AlphaSkiaTextMetrics(IntPtr handle) + : base(handle, NativeMethods.alphaskia_text_metrics_free) + { + } + + /// + /// Returns the width of a segment of inline text in pixels. It takes into account the current font of the context. + /// + public float Width => NativeMethods.alphaskia_text_metrics_get_width(Handle); + + /// + /// Distance parallel to the baseline from the alignment point given by the textAlign parameter to the left side of the bounding rectangle of the given text, in pixels; positive numbers indicating a distance going left from the given alignment point. + /// + public float ActualBoundingBoxLeft => NativeMethods.alphaskia_text_metrics_get_actual_bounding_box_left(Handle); + + /// + /// Returns the distance from the alignment point given by the textAlign parameter to the right side of the bounding rectangle of the given text, in pixels. The distance is measured parallel to the baseline. + /// + public float ActualBoundingBoxRight => NativeMethods.alphaskia_text_metrics_get_actual_bounding_box_right(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the highest bounding rectangle of all the fonts used to render the text, in pixels. + /// + public float FontBoundingBoxAscent => NativeMethods.alphaskia_text_metrics_get_font_bounding_box_ascent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle of all the fonts used to render the text, in pixels. + /// + public float FontBoundingBoxDescent => NativeMethods.alphaskia_text_metrics_get_font_bounding_box_descent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the bounding rectangle used to render the text, in pixels. + /// + public float ActualBoundingBoxAscent => NativeMethods.alphaskia_text_metrics_get_actual_bounding_box_ascent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle used to render the text, in pixels. + /// + public float ActualBoundingBoxDescent => NativeMethods.alphaskia_text_metrics_get_actual_bounding_box_descent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the em square in the line box, in pixels. + /// + public float EmHeightAscent => NativeMethods.alphaskia_text_metrics_get_em_height_ascent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the em square in the line box, in pixels. + /// + public float EmHeightDescent => NativeMethods.alphaskia_text_metrics_get_em_height_descent(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the hanging baseline of the line box, in pixels. + /// + public float HangingBaseline => NativeMethods.alphaskia_text_metrics_get_hanging_baseline(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the alphabetic baseline of the line box, in pixels. + /// + public float AlphabeticBaseline => NativeMethods.alphaskia_text_metrics_get_hanging_baseline(Handle); + + /// + /// Returns the distance from the horizontal line indicated by the textBaseline parameter to the ideographic baseline of the line box, in CSS pixels. + /// + public float IdeographicBaseline => NativeMethods.alphaskia_text_metrics_get_ideographic_baseline(Handle); +} \ No newline at end of file diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs b/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs index aca3875..05f1ae5 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaTextStyle.cs @@ -33,7 +33,7 @@ public sealed class AlphaSkiaTextStyle : AlphaSkiaNative /// The font weight typefaces should have. /// Whether typefaces should be italic. public AlphaSkiaTextStyle(string[] fontFamilies, ushort weight, bool isItalic) - : base(NativeMethods.alphaskia_textstyle_new((byte)fontFamilies.Length, fontFamilies, weight, isItalic ? (byte)1 : (byte)0), NativeMethods.alphaskia_textstyle_free) + : base(NativeMethods.alphaskia_text_style_new((byte)fontFamilies.Length, fontFamilies, weight, isItalic ? (byte)1 : (byte)0), NativeMethods.alphaskia_text_style_free) { FontFamilies = fontFamilies; Weight = weight; diff --git a/lib/dotnet/AlphaSkia/GlobalUsings.cs b/lib/dotnet/AlphaSkia/GlobalUsings.cs index 6ff5c50..db08941 100644 --- a/lib/dotnet/AlphaSkia/GlobalUsings.cs +++ b/lib/dotnet/AlphaSkia/GlobalUsings.cs @@ -3,4 +3,5 @@ global using alphaskia_canvas_t = System.IntPtr; global using alphaskia_data_t = System.IntPtr; global using alphaskia_string_t = System.IntPtr; -global using alphaskia_textstyle_t = System.IntPtr; \ No newline at end of file +global using alphaskia_text_style_t = System.IntPtr; +global using alphaskia_text_metrics_t = System.IntPtr; \ No newline at end of file diff --git a/lib/dotnet/AlphaSkia/NativeMethods.cs b/lib/dotnet/AlphaSkia/NativeMethods.cs index 9c89ce3..4dde57e 100644 --- a/lib/dotnet/AlphaSkia/NativeMethods.cs +++ b/lib/dotnet/AlphaSkia/NativeMethods.cs @@ -49,17 +49,17 @@ internal static class NativeMethods public static extern void alphaskia_typeface_free(alphaskia_typeface_t type_face); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern alphaskia_textstyle_t alphaskia_textstyle_new(byte family_name_count, string[] family_names, ushort weight, byte italic); + public static extern alphaskia_text_style_t alphaskia_text_style_new(byte family_name_count, string[] family_names, ushort weight, byte italic); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern byte alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle); + public static extern byte alphaskia_text_style_get_family_name_count(alphaskia_text_style_t text_style); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, byte index); + public static extern alphaskia_string_t alphaskia_text_style_get_family_name(alphaskia_text_style_t text_style, byte index); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern ushort alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle); + public static extern ushort alphaskia_text_style_get_weight(alphaskia_text_style_t text_style); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern byte alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle); + public static extern byte alphaskia_text_style_is_italic(alphaskia_text_style_t text_style); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle); + public static extern void alphaskia_text_style_free(alphaskia_text_style_t text_style); [DllImport(AlphaSkiaNativeLibName)] public static extern alphaskia_typeface_t alphaskia_typeface_make_from_name( @@ -168,7 +168,7 @@ public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, int text_length, - alphaskia_textstyle_t textstyle, float font_size, float x, float y, AlphaSkiaTextAlign text_align, + alphaskia_text_style_t text_style, float font_size, float x, float y, AlphaSkiaTextAlign text_align, AlphaSkiaTextBaseline baseline); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] @@ -176,7 +176,8 @@ public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canv [MarshalAs(UnmanagedType.LPWStr)] string text, int text_length, - alphaskia_textstyle_t textstyle, float font_size); + alphaskia_text_style_t text_style, float font_size, AlphaSkiaTextAlign text_align, + AlphaSkiaTextBaseline baseline); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, @@ -188,4 +189,43 @@ public static extern void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canva [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] public static extern void alphaskia_canvas_draw_image(alphaskia_canvas_t canvas, alphaskia_image_t image, float x, float y, float w, float h); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_width(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_actual_bounding_box_left(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_actual_bounding_box_right(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_font_bounding_box_ascent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_font_bounding_box_descent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_actual_bounding_box_ascent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_actual_bounding_box_descent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_em_height_ascent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_em_height_descent(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_hanging_baseline(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_alphabetic_baseline(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern float alphaskia_text_metrics_get_ideographic_baseline(alphaskia_text_metrics_t text_metrics); + + [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] + public static extern void alphaskia_text_metrics_free(alphaskia_text_metrics_t text_metrics); } \ No newline at end of file diff --git a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h index 386c56c..42fd39b 100644 --- a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h +++ b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaCanvas.h @@ -178,10 +178,10 @@ JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_fillText /* * Class: alphaTab_alphaSkia_AlphaSkiaCanvas * Method: measureText - * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTextStyle;F)F + * Signature: (Ljava/lang/String;LalphaTab/alphaSkia/AlphaSkiaTextStyle;FLalphaTab/alphaSkia/AlphaSkiaTextAlign;LalphaTab/alphaSkia/AlphaSkiaTextBaseline;)LalphaTab/alphaSkia/AlphaSkiaTextMetrics; */ -JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_measureText - (JNIEnv *, jobject, jstring, jobject, jfloat); +JNIEXPORT jobject JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_measureText + (JNIEnv *, jobject, jstring, jobject, jfloat, jobject, jobject); /* * Class: alphaTab_alphaSkia_AlphaSkiaCanvas diff --git a/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextMetrics.h b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextMetrics.h new file mode 100644 index 0000000..dab2d24 --- /dev/null +++ b/lib/java/jni/include/alphaTab_alphaSkia_AlphaSkiaTextMetrics.h @@ -0,0 +1,117 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class alphaTab_alphaSkia_AlphaSkiaTextMetrics */ + +#ifndef _Included_alphaTab_alphaSkia_AlphaSkiaTextMetrics +#define _Included_alphaTab_alphaSkia_AlphaSkiaTextMetrics +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getWidth + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getWidth + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getActualBoundingBoxLeft + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxLeft + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getActualBoundingBoxRight + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxRight + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getFontBoundingBoxAscent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getFontBoundingBoxAscent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getFontBoundingBoxDescent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getFontBoundingBoxDescent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getActualBoundingBoxAscent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxAscent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getActualBoundingBoxDescent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxDescent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getEmHeightAscent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getEmHeightAscent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getEmHeightDescent + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getEmHeightDescent + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getHangingBaseline + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getHangingBaseline + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getAlphabeticBaseline + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getAlphabeticBaseline + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: getIdeographicBaseline + * Signature: ()F + */ +JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getIdeographicBaseline + (JNIEnv *, jobject); + +/* + * Class: alphaTab_alphaSkia_AlphaSkiaTextMetrics + * Method: close + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_close + (JNIEnv *, jobject); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/lib/java/jni/src/AlphaSkiaCanvas.cpp b/lib/java/jni/src/AlphaSkiaCanvas.cpp index 481f395..9590a1a 100644 --- a/lib/java/jni/src/AlphaSkiaCanvas.cpp +++ b/lib/java/jni/src/AlphaSkiaCanvas.cpp @@ -172,7 +172,7 @@ extern "C" const jchar *nativeStr = env->GetStringChars(str, nullptr); - alphaskia_textstyle_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); + alphaskia_text_style_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); CHECK_HANDLE(nativeTextStyle) jmethodID textAlignGetValue = env->GetMethodID(env->GetObjectClass(text_align), "getValue", "()I"); @@ -204,20 +204,46 @@ extern "C" env->ReleaseStringChars(str, nativeStr); } - JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_measureText(JNIEnv *env, jobject instance, jstring str, jobject typeface, jfloat font_size) + + JNIEXPORT jobject JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_measureText(JNIEnv *env, jobject instance, jstring str, jobject typeface, jfloat font_size, jobject text_align, jobject baseline) { alphaskia_canvas_t canvas = reinterpret_cast(get_handle(env, instance)); - CHECK_HANDLE_RETURN(canvas, 0.0f) + CHECK_HANDLE_RETURN(canvas, nullptr) const jchar *nativeStr = env->GetStringChars(str, nullptr); - alphaskia_textstyle_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); - CHECK_HANDLE_RETURN(nativeTextStyle, 0.0f) + alphaskia_text_style_t nativeTextStyle = reinterpret_cast(get_handle(env, typeface)); + CHECK_HANDLE_RETURN(nativeTextStyle, nullptr) - float width = alphaskia_canvas_measure_text(canvas, reinterpret_cast(nativeStr), static_cast(env->GetStringLength(str)), nativeTextStyle, static_cast(font_size)); + jmethodID textAlignGetValue = env->GetMethodID(env->GetObjectClass(text_align), "getValue", "()I"); + if (!textAlignGetValue) + { + if (!env->ExceptionCheck()) + { + env->ThrowNew(env->FindClass("java/lang/IllegalStateException"), "Could not find 'int getValue' on text align"); + } + return; + } + + jmethodID baselineGetValue = env->GetMethodID(env->GetObjectClass(baseline), "getValue", "()I"); + if (!baselineGetValue) + { + if (!env->ExceptionCheck()) + { + env->ThrowNew(env->FindClass("java/lang/IllegalStateException"), "Could not find 'int getValue' on text baseline"); + } + return; + } + + alphaskia_text_align_t nativeTextAlign = static_cast(env->CallIntMethod(text_align, textAlignGetValue)); + alphaskia_text_baseline_t nativeBaseline = static_cast(env->CallIntMethod(baseline, baselineGetValue)); + + auto text_metrics = alphaskia_canvas_measure_text(canvas, reinterpret_cast(nativeStr), static_cast(env->GetStringLength(str)), nativeTextStyle, static_cast(font_size), nativeTextAlign, nativeBaseline); env->ReleaseStringChars(str, nativeStr); - return static_cast(width); + jclass cls = env->FindClass("alphaTab/alphaSkia/AlphaSkiaTextMetrics"); + jmethodID ctor = env->GetMethodID(cls, "", "(J)V"); + return env->NewObject(cls, ctor, static_cast(reinterpret_cast(text_metrics))); } JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaCanvas_beginRotate(JNIEnv *env, jobject instance, jfloat x, jfloat y, jfloat angle) diff --git a/lib/java/jni/src/AlphaSkiaTextMetrics.cpp b/lib/java/jni/src/AlphaSkiaTextMetrics.cpp new file mode 100644 index 0000000..1ebde69 --- /dev/null +++ b/lib/java/jni/src/AlphaSkiaTextMetrics.cpp @@ -0,0 +1,124 @@ +#include "../include/alphaTab_alphaSkia_AlphaSkiaTextMetrics.h" +#include "../include/JniHelper.h" +#include "../../../../wrapper/include/alphaskia.h" + +extern "C" +{ + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getWidth(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_width(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxLeft(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_actual_bounding_box_left(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxRight(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_actual_bounding_box_right(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getFontBoundingBoxAscent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_font_bounding_box_ascent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getFontBoundingBoxDescent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_font_bounding_box_descent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxAscent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_actual_bounding_box_ascent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getActualBoundingBoxDescent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_actual_bounding_box_descent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getEmHeightAscent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_em_height_ascent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getEmHeightDescent(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_em_height_descent(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getHangingBaseline(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_hanging_baseline(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getAlphabeticBaseline(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_alphabetic_baseline(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT jfloat JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_getIdeographicBaseline(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE_RETURN(handle, static_cast(0)) + + uint16_t value = alphaskia_text_metrics_get_ideographic_baseline(reinterpret_cast(handle)); + return static_cast(value); + } + + JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextMetrics_close(JNIEnv *env, jobject instance) + { + jlong handle = get_handle(env, instance); + CHECK_HANDLE(handle) + + alphaskia_text_metrics_t data = reinterpret_cast(handle); + alphaskia_text_metrics_free(data); + set_handle(env, instance, 0); + } +} \ No newline at end of file diff --git a/lib/java/jni/src/AlphaSkiaTextStyle.cpp b/lib/java/jni/src/AlphaSkiaTextStyle.cpp index 6ebfe0f..e56c105 100644 --- a/lib/java/jni/src/AlphaSkiaTextStyle.cpp +++ b/lib/java/jni/src/AlphaSkiaTextStyle.cpp @@ -17,7 +17,7 @@ extern "C" nativeFamilyNames[i] = env->GetStringUTFChars(familyName, nullptr); } - alphaskia_textstyle_t canvas = alphaskia_textstyle_new( + alphaskia_text_style_t canvas = alphaskia_text_style_new( familyNameLength, &nativeFamilyNames[0], static_cast(weight), @@ -33,10 +33,10 @@ extern "C" JNIEXPORT void JNICALL Java_alphaTab_alphaSkia_AlphaSkiaTextStyle_close(JNIEnv *env, jobject instance) { - alphaskia_textstyle_t textStyle = reinterpret_cast(get_handle(env, instance)); + alphaskia_text_style_t textStyle = reinterpret_cast(get_handle(env, instance)); CHECK_HANDLE(textStyle) - alphaskia_textstyle_free(textStyle); + alphaskia_text_style_free(textStyle); set_handle(env, instance, 0); } } \ No newline at end of file diff --git a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java index 829a21b..cc77717 100644 --- a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java +++ b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaCanvas.java @@ -218,14 +218,18 @@ public native void fillText(String text, AlphaSkiaTextStyle textStyle, float fon AlphaSkiaTextBaseline baseline); /** - * Measures the given text. + * Returns a {@see AlphaSkiaTextMetrics} object that contains information about the measured text (such as its width, for example). * * @param text The text to measure. * @param textStyle The text style to use for measuring the text. * @param fontSize The font size to use when measuring the text. - * @return The horizontal width of the text when it would be drawn. + * @param textAlign How to align the text at the given position horizontally. + * @param baseline How to align the text at the given position vertically. + * @return The text metrics. */ - public native float measureText(String text, AlphaSkiaTextStyle textStyle, float fontSize); + public native AlphaSkiaTextMetrics measureText(String text, AlphaSkiaTextStyle textStyle, float fontSize, + AlphaSkiaTextAlign textAlign, + AlphaSkiaTextBaseline baseline); /** * Rotates the canvas allowing angled drawing diff --git a/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextMetrics.java b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextMetrics.java new file mode 100644 index 0000000..8ce6c30 --- /dev/null +++ b/lib/java/main/src/main/java/alphaTab/alphaSkia/AlphaSkiaTextMetrics.java @@ -0,0 +1,75 @@ +package alphaTab.alphaSkia; + +/** + * The TextMetrics interface represents the dimensions of a piece of text in the canvas; + * A TextMetrics instance can be retrieved using the {@see AlphaSkiaCanvas.measureText} method. + */ +public class AlphaSkiaTextMetrics extends AlphaSkiaNative { + + /** + * Returns the width of a segment of inline text in pixels. It takes into account the current font of the context. + */ + public native float getWidth(); + + /** + * Distance parallel to the baseline from the alignment point given by the textAlign parameter to the left side of the bounding rectangle of the given text, in pixels; positive numbers indicating a distance going left from the given alignment point. + */ + public native float getActualBoundingBoxLeft(); + + /** + * Returns the distance from the alignment point given by the textAlign parameter to the right side of the bounding rectangle of the given text, in pixels. The distance is measured parallel to the baseline. + */ + public native float getActualBoundingBoxRight(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the highest bounding rectangle of all the fonts used to render the text, in pixels. + */ + public native float getFontBoundingBoxAscent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle of all the fonts used to render the text, in pixels. + */ + public native float getFontBoundingBoxDescent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the bounding rectangle used to render the text, in pixels. + */ + public native float getActualBoundingBoxAscent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle used to render the text, in pixels. + */ + public native float getActualBoundingBoxDescent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the em square in the line box, in pixels. + */ + public native float getEmHeightAscent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the em square in the line box, in pixels. + */ + public native float getEmHeightDescent(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the hanging baseline of the line box, in pixels. + */ + public native float getHangingBaseline(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the alphabetic baseline of the line box, in pixels. + */ + public native float getAlphabeticBaseline(); + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the ideographic baseline of the line box, in CSS pixels. + */ + public native float getIdeographicBaseline(); + + AlphaSkiaTextMetrics(long handle) { + super(handle); + } + + @Override + public native void close(); +} \ No newline at end of file diff --git a/lib/node/addon/addon.cpp b/lib/node/addon/addon.cpp index 106ae0a..bfa146e 100644 --- a/lib/node/addon/addon.cpp +++ b/lib/node/addon/addon.cpp @@ -21,7 +21,8 @@ static const napi_type_tag alphaskia_data_t_tag = {0x6a960ece6a0c4caf, 0xad61688 static const napi_type_tag alphaskia_typeface_t_tag = {0x0068df0314224b96, 0x8048b968915995f1}; static const napi_type_tag alphaskia_image_t_tag = {0x9372c0f8e8de466f, 0x96a04b6ee0a9394b}; static const napi_type_tag alphaskia_canvas_t_tag = {0xaa77c76772a34052, 0x88ac80d4dc474395}; -static const napi_type_tag alphaskia_textstyle_t_tag = {0x8f2bc41a57024cf4, 0x8b5e1cd26ded5245}; +static const napi_type_tag alphaskia_text_style_t_tag = {0x8f2bc41a57024cf4, 0x8b5e1cd26ded5245}; +static const napi_type_tag alphaskia_text_metrics_t_tag = {0x85fbe8d4da634b51, 0x970a89efa0ef13ff}; #define RETURN_UNDEFINED() \ { \ @@ -345,7 +346,7 @@ static napi_value node_alphaskia_typeface_is_italic(napi_env env, napi_callback_ return node_is_italic; } -static napi_value node_alphaskia_textstyle_new(napi_env env, napi_callback_info info) +static napi_value node_alphaskia_text_style_new(napi_env env, napi_callback_info info) { napi_status status(napi_ok); @@ -395,19 +396,203 @@ static napi_value node_alphaskia_textstyle_new(napi_env env, napi_callback_info GET_ARGUMENT_INT32(1, weight); GET_ARGUMENT_BOOL(2, italic); - alphaskia_textstyle_t textstyle = alphaskia_textstyle_new(static_cast(familyNamesLength), &familyNamesRaw[0], static_cast(weight), italic ? 1 : 0); - WRAP_HANDLE(alphaskia_textstyle_t, wrapped, textstyle); + alphaskia_text_style_t text_style = alphaskia_text_style_new(static_cast(familyNamesLength), &familyNamesRaw[0], static_cast(weight), italic ? 1 : 0); + WRAP_HANDLE(alphaskia_text_style_t, wrapped, text_style); return wrapped; } -static napi_value node_alphaskia_textstyle_free(napi_env env, napi_callback_info info) +static napi_value node_alphaskia_text_style_free(napi_env env, napi_callback_info info) { napi_status status(napi_ok); CHECK_ARGS(1); - GET_ARGUMENT_HANDLE(0, alphaskia_textstyle_t, textstyle); + GET_ARGUMENT_HANDLE(0, alphaskia_text_style_t, text_style); + + alphaskia_text_style_free(text_style); + void *old; + status = napi_remove_wrap(env, node_argv[0], &old); + ASSERT_STATUS(); + + RETURN_UNDEFINED(); +} + +static napi_value node_alphaskia_text_metrics_get_width(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_width(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_actual_bounding_box_left(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_actual_bounding_box_right(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_font_bounding_box_ascent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_font_bounding_box_descent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_actual_bounding_box_ascent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_actual_bounding_box_descent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_em_height_ascent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_em_height_ascent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_em_height_descent(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_em_height_descent(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_hanging_baseline(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_hanging_baseline(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_alphabetic_baseline(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_alphabetic_baseline(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_get_ideographic_baseline(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + float value = alphaskia_text_metrics_get_ideographic_baseline(text_metrics); + napi_value node_value; + status = napi_create_double(env, static_cast(value), &node_value); + ASSERT_STATUS(); + return node_value; +} + +static napi_value node_alphaskia_text_metrics_free(napi_env env, napi_callback_info info) +{ + napi_status status(napi_ok); + + CHECK_ARGS(1); + GET_ARGUMENT_HANDLE(0, alphaskia_text_metrics_t, text_metrics); + + alphaskia_text_metrics_free(text_metrics); - alphaskia_textstyle_free(textstyle); void *old; status = napi_remove_wrap(env, node_argv[0], &old); ASSERT_STATUS(); @@ -843,14 +1028,14 @@ static napi_value node_alphaskia_canvas_fill_text(napi_env env, napi_callback_in CHECK_ARGS(8); GET_ARGUMENT_HANDLE(0, alphaskia_canvas_t, canvas); GET_ARGUMENT_UTF16_STRING(1, text); - GET_ARGUMENT_HANDLE(2, alphaskia_textstyle_t, textstyle); + GET_ARGUMENT_HANDLE(2, alphaskia_text_style_t, text_style); GET_ARGUMENT_FLOAT(3, font_size); GET_ARGUMENT_FLOAT(4, x); GET_ARGUMENT_FLOAT(5, y); GET_ARGUMENT_INT32(6, text_align); GET_ARGUMENT_INT32(7, baseline); - alphaskia_canvas_fill_text(canvas, text.c_str(), text.length(), textstyle, font_size, x, y, static_cast(text_align), static_cast(baseline)); + alphaskia_canvas_fill_text(canvas, text.c_str(), text.length(), text_style, font_size, x, y, static_cast(text_align), static_cast(baseline)); RETURN_UNDEFINED(); } @@ -862,15 +1047,14 @@ static napi_value node_alphaskia_canvas_measure_text(napi_env env, napi_callback CHECK_ARGS(4); GET_ARGUMENT_HANDLE(0, alphaskia_canvas_t, canvas); GET_ARGUMENT_UTF16_STRING(1, text); - GET_ARGUMENT_HANDLE(2, alphaskia_textstyle_t, textstyle); + GET_ARGUMENT_HANDLE(2, alphaskia_text_style_t, text_style); GET_ARGUMENT_FLOAT(3, font_size); + GET_ARGUMENT_INT32(4, text_align); + GET_ARGUMENT_INT32(5, baseline); - float width = alphaskia_canvas_measure_text(canvas, text.c_str(), text.length(), textstyle, font_size); - napi_value width_node; - status = napi_create_double(env, width, &width_node); - ASSERT_STATUS(); - - return width_node; + auto text_metrics = alphaskia_canvas_measure_text(canvas, text.c_str(), text.length(), text_style, font_size, static_cast(text_align), static_cast(baseline)); + WRAP_HANDLE(alphaskia_text_metrics_t, wrapped, text_metrics); + return wrapped; } static napi_value node_alphaskia_canvas_begin_rotate(napi_env env, napi_callback_info info) @@ -928,12 +1112,26 @@ napi_value init(napi_env env, napi_value exports) EXPORT_NODE_FUNCTION(alphaskia_typeface_get_weight); EXPORT_NODE_FUNCTION(alphaskia_typeface_is_italic); - EXPORT_NODE_FUNCTION(alphaskia_textstyle_new); - // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_family_name_count); - // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_family_name); - // EXPORT_NODE_FUNCTION(alphaskia_textstyle_get_weight); - // EXPORT_NODE_FUNCTION(alphaskia_textstyle_is_italic); - EXPORT_NODE_FUNCTION(alphaskia_textstyle_free); + EXPORT_NODE_FUNCTION(alphaskia_text_style_new); + // EXPORT_NODE_FUNCTION(alphaskia_text_style_get_family_name_count); + // EXPORT_NODE_FUNCTION(alphaskia_text_style_get_family_name); + // EXPORT_NODE_FUNCTION(alphaskia_text_style_get_weight); + // EXPORT_NODE_FUNCTION(alphaskia_text_style_is_italic); + EXPORT_NODE_FUNCTION(alphaskia_text_style_free); + + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_width); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_actual_bounding_box_left); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_actual_bounding_box_right); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_font_bounding_box_ascent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_font_bounding_box_descent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_actual_bounding_box_ascent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_actual_bounding_box_descent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_em_height_ascent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_em_height_descent); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_hanging_baseline); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_alphabetic_baseline); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_get_ideographic_baseline); + EXPORT_NODE_FUNCTION(alphaskia_text_metrics_free); EXPORT_NODE_FUNCTION(alphaskia_image_get_width); EXPORT_NODE_FUNCTION(alphaskia_image_get_height); diff --git a/lib/node/alphaskia/src/AlphaSkiaCanvas.ts b/lib/node/alphaskia/src/AlphaSkiaCanvas.ts index d37a262..8d1e66c 100644 --- a/lib/node/alphaskia/src/AlphaSkiaCanvas.ts +++ b/lib/node/alphaskia/src/AlphaSkiaCanvas.ts @@ -1,5 +1,6 @@ import { AlphaSkiaImage } from './AlphaSkiaImage'; import { AlphaSkiaNative } from './AlphaSkiaNative'; +import { AlphaSkiaTextMetrics } from './AlphaSkiaTextMetrics'; import { AlphaSkiaTextStyle } from './AlphaSkiaTextStyle'; import { AlphaSkiaTextBaseline, AlphaSkiaCanvasHandle, AlphaSkiaColorType, AlphaSkiaTextAlign, loadAddon } from './addon'; @@ -38,7 +39,7 @@ export class AlphaSkiaCanvas extends AlphaSkiaNative { public static switchToFreeTypeFonts(): void { loadAddon().alphaskia_switch_to_freetype_fonts(); } - + /** * Gets the color to use for drawing operations in the native canvas. * See also {@link rgbaToColor} @@ -287,16 +288,18 @@ export class AlphaSkiaCanvas extends AlphaSkiaNative { } /** - * Measures the given text. + * Returns a {@link AlphaSkiaTextMetrics} object that contains information about the measured text (such as its width, for example). * * @param text The text to measure. * @param typeface The typeface to use for drawing the text. * @param fontSize The font size to use when drawing the text. - * @return The horizontal width of the text when it would be drawn. + * @param textAlign How to align the text at the given position horizontally. + * @param baseline How to align the text at the given position vertically. + * @return The text metrics. */ - public measureText(text: string, textStyle: AlphaSkiaTextStyle, fontSize: number): number { + public measureText(text: string, textStyle: AlphaSkiaTextStyle, fontSize: number, textAlign: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): AlphaSkiaTextMetrics { this.checkDisposed(); - return loadAddon().alphaskia_canvas_measure_text(this.handle!, text, textStyle.handle!, fontSize); + return new AlphaSkiaTextMetrics(loadAddon().alphaskia_canvas_measure_text(this.handle!, text, textStyle.handle!, fontSize, textAlign as number, baseline as number)); } /** diff --git a/lib/node/alphaskia/src/AlphaSkiaTextMetrics.ts b/lib/node/alphaskia/src/AlphaSkiaTextMetrics.ts new file mode 100644 index 0000000..302f6bd --- /dev/null +++ b/lib/node/alphaskia/src/AlphaSkiaTextMetrics.ts @@ -0,0 +1,100 @@ +import { AlphaSkiaNative } from './AlphaSkiaNative'; +import { AlphaSkiaTextMetricsHandle, loadAddon } from './addon'; + +/** + * Represents a typeface to draw text. + */ +export class AlphaSkiaTextMetrics extends AlphaSkiaNative { + + + /** + * Returns the width of a segment of inline text in pixels. It takes into account the current font of the context. + */ + public get width(): number { + return loadAddon().alphaskia_text_metrics_get_width(this.handle!); + } + + /** + * Distance parallel to the baseline from the alignment point given by the textAlign parameter to the left side of the bounding rectangle of the given text, in pixels; positive numbers indicating a distance going left from the given alignment point. + */ + public get actualBoundingBoxLeft(): number { + return loadAddon().alphaskia_text_metrics_get_actual_bounding_box_left(this.handle!); + } + + /** + * Returns the distance from the alignment point given by the textAlign parameter to the right side of the bounding rectangle of the given text, in pixels. The distance is measured parallel to the baseline. + */ + public get actualBoundingBoxRight(): number { + return loadAddon().alphaskia_text_metrics_get_actual_bounding_box_right(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the highest bounding rectangle of all the fonts used to render the text, in pixels. + */ + public get fontBoundingBoxAscent(): number { + return loadAddon().alphaskia_text_metrics_get_font_bounding_box_ascent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle of all the fonts used to render the text, in pixels. + */ + public get fontBoundingBoxDescent(): number { + return loadAddon().alphaskia_text_metrics_get_font_bounding_box_descent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the bounding rectangle used to render the text, in pixels. + */ + public get actualBoundingBoxAscent(): number { + return loadAddon().alphaskia_text_metrics_get_actual_bounding_box_ascent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the bounding rectangle used to render the text, in pixels. + */ + public get actualBoundingBoxDescent(): number { + return loadAddon().alphaskia_text_metrics_get_actual_bounding_box_descent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the top of the em square in the line box, in pixels. + */ + public get emHeightAscent(): number { + return loadAddon().alphaskia_text_metrics_get_em_height_ascent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the bottom of the em square in the line box, in pixels. + */ + public get emHeightDescent(): number { + return loadAddon().alphaskia_text_metrics_get_em_height_descent(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the hanging baseline of the line box, in pixels. + */ + public get hangingBaseline(): number { + return loadAddon().alphaskia_text_metrics_get_hanging_baseline(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the alphabetic baseline of the line box, in pixels. + */ + public get alphabeticBaseline(): number { + return loadAddon().alphaskia_text_metrics_get_alphabetic_baseline(this.handle!); + } + + /** + * Returns the distance from the horizontal line indicated by the textBaseline parameter to the ideographic baseline of the line box, in CSS pixels. + */ + public get ideographicBaseline(): number { + return loadAddon().alphaskia_text_metrics_get_ideographic_baseline(this.handle!); + } + + /** + * @internal + */ + public constructor(handle: AlphaSkiaTextMetricsHandle) { + super(handle, loadAddon().alphaskia_text_metrics_free); + } +} \ No newline at end of file diff --git a/lib/node/alphaskia/src/addon.ts b/lib/node/alphaskia/src/addon.ts index b01ec9d..14fca06 100644 --- a/lib/node/alphaskia/src/addon.ts +++ b/lib/node/alphaskia/src/addon.ts @@ -7,6 +7,7 @@ export interface AlphaSkiaTypefaceHandle { } export interface AlphaSkiaImageHandle { } export interface AlphaSkiaCanvasHandle { } export interface AlphaSkiaTextStyleHandle { } +export interface AlphaSkiaTextMetricsHandle { } /** * Lists all text alignments which can be used to draw text. @@ -126,9 +127,23 @@ export interface AlphaSkiaNodeAddon { alphaskia_canvas_draw_image(canvas: AlphaSkiaCanvasHandle, image: AlphaSkiaImageHandle, x: number, y: number, w: number, h: number): void; alphaskia_canvas_fill_text(canvas: AlphaSkiaCanvasHandle, text: string, textStyle: AlphaSkiaTextStyleHandle, font_size: number, x: number, y: number, text_align: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void; - alphaskia_canvas_measure_text(canvas: AlphaSkiaCanvasHandle, text: string, textStyle: AlphaSkiaTextStyleHandle, font_size: number): number; + alphaskia_canvas_measure_text(canvas: AlphaSkiaCanvasHandle, text: string, textStyle: AlphaSkiaTextStyleHandle, font_size: number, text_align: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): number; alphaskia_canvas_begin_rotate(canvas: AlphaSkiaCanvasHandle, center_x: number, center_y: number, angle: number): void; alphaskia_canvas_end_rotate(canvas: AlphaSkiaCanvasHandle): void; + + alphaskia_text_metrics_get_width(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_em_height_ascent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_em_height_descent(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_hanging_baseline(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_alphabetic_baseline(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_get_ideographic_baseline(text_metrics: AlphaSkiaTextMetricsHandle): number; + alphaskia_text_metrics_free(text_metrics: AlphaSkiaTextMetricsHandle): void; } const require = createRequire(import.meta.url); diff --git a/wrapper/include/AlphaSkiaCanvas.h b/wrapper/include/AlphaSkiaCanvas.h index f5c6486..3d5aa3b 100644 --- a/wrapper/include/AlphaSkiaCanvas.h +++ b/wrapper/include/AlphaSkiaCanvas.h @@ -12,6 +12,48 @@ #include +class AlphaSkiaTextMetrics +{ +public: + AlphaSkiaTextMetrics( + float width, + float actual_bounding_box_left, + float actual_bounding_box_right, + float font_bounding_box_ascent, + float font_bounding_box_descent, + float em_height_ascent, + float em_height_descent, + float hanging_baseline, + float alphabetic_baseline, + float ideographic_baseline) + : width_(width), actual_bounding_box_left_(actual_bounding_box_left), actual_bounding_box_right_(actual_bounding_box_right), font_bounding_box_ascent_(font_bounding_box_ascent), font_bounding_box_descent_(font_bounding_box_descent), em_height_ascent_(em_height_ascent), em_height_descent_(em_height_descent), hanging_baseline_(hanging_baseline), alphabetic_baseline_(alphabetic_baseline), ideographic_baseline_(ideographic_baseline) + { + } + + float get_width() const { return width_; } + float get_actual_bounding_box_left() const { return actual_bounding_box_left_; } + float get_actual_bounding_box_right() const { return actual_bounding_box_right_; } + float get_font_bounding_box_ascent() const { return font_bounding_box_ascent_; } + float get_font_bounding_box_descent() const { return font_bounding_box_descent_; } + float get_em_height_ascent() const { return em_height_ascent_; } + float get_em_height_descent() const { return em_height_descent_; } + float get_hanging_baseline() const { return hanging_baseline_; } + float get_alphabetic_baseline() const { return alphabetic_baseline_; } + float get_ideographic_baseline() const { return ideographic_baseline_; } + +private: + float width_; + float actual_bounding_box_left_; + float actual_bounding_box_right_; + float font_bounding_box_ascent_; + float font_bounding_box_descent_; + float em_height_ascent_; + float em_height_descent_; + float hanging_baseline_; + float alphabetic_baseline_; + float ideographic_baseline_; +}; + class AlphaSkiaTextStyle { public: @@ -72,14 +114,14 @@ class AlphaSkiaCanvas void stroke(); void draw_image(sk_sp image, float x, float y, float w, float h); - void fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); - float measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size); + void fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); + AlphaSkiaTextMetrics* measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); void begin_rotate(float center_x, float center_y, float angle); void end_rotate(); private: SkPaint create_paint(); - std::unique_ptr build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, alphaskia_text_align_t text_align); + std::unique_ptr build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align); static float get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline); SkColor color_; diff --git a/wrapper/include/alphaskia.h b/wrapper/include/alphaskia.h index a7d3e87..3b1a78a 100644 --- a/wrapper/include/alphaskia.h +++ b/wrapper/include/alphaskia.h @@ -43,13 +43,13 @@ extern "C" AS_API uint16_t alphaskia_typeface_get_weight(alphaskia_typeface_t typeface); AS_API uint8_t alphaskia_typeface_is_italic(alphaskia_typeface_t typeface); - typedef AS_API void *alphaskia_textstyle_t; - AS_API alphaskia_textstyle_t alphaskia_textstyle_new(uint8_t family_name_count, const char** family_names, uint16_t weight, uint8_t italic); - AS_API uint8_t alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle); - AS_API alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, uint8_t index); - AS_API uint16_t alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle); - AS_API uint8_t alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle); - AS_API void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle); + typedef AS_API void *alphaskia_text_style_t; + AS_API alphaskia_text_style_t alphaskia_text_style_new(uint8_t family_name_count, const char** family_names, uint16_t weight, uint8_t italic); + AS_API uint8_t alphaskia_text_style_get_family_name_count(alphaskia_text_style_t text_style); + AS_API alphaskia_string_t alphaskia_text_style_get_family_name(alphaskia_text_style_t text_style, uint8_t index); + AS_API uint16_t alphaskia_text_style_get_weight(alphaskia_text_style_t text_style); + AS_API uint8_t alphaskia_text_style_is_italic(alphaskia_text_style_t text_style); + AS_API void alphaskia_text_style_free(alphaskia_text_style_t text_style); typedef AS_API void *alphaskia_image_t; AS_API int32_t alphaskia_image_get_width(alphaskia_image_t image); @@ -60,6 +60,21 @@ extern "C" AS_API alphaskia_image_t alphaskia_image_from_pixels(int32_t width, int32_t height, const uint8_t *pixels); AS_API void alphaskia_image_free(alphaskia_image_t image); + typedef AS_API void *alphaskia_text_metrics_t; + AS_API float alphaskia_text_metrics_get_width(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_actual_bounding_box_left(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_actual_bounding_box_right(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_font_bounding_box_ascent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_font_bounding_box_descent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_actual_bounding_box_ascent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_actual_bounding_box_descent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_em_height_ascent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_em_height_descent(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_hanging_baseline(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_alphabetic_baseline(alphaskia_text_metrics_t text_metrics); + AS_API float alphaskia_text_metrics_get_ideographic_baseline(alphaskia_text_metrics_t text_metrics); + AS_API void alphaskia_text_metrics_free(alphaskia_text_metrics_t text_metrics); + typedef AS_API void *alphaskia_canvas_t; AS_API alphaskia_canvas_t alphaskia_canvas_new(); AS_API void alphaskia_canvas_free(alphaskia_canvas_t canvas); @@ -100,9 +115,9 @@ extern "C" alphaskia_text_baseline_middle = 2, alphaskia_text_baseline_bottom = 3 } alphaskia_text_baseline_t; - AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); + AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_text_style_t text_style, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); - AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size); + AS_API alphaskia_text_metrics_t alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_text_style_t text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline); AS_API void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, float angle); AS_API void alphaskia_canvas_end_rotate(alphaskia_canvas_t canvas); } \ No newline at end of file diff --git a/wrapper/src/AlphaSkiaCanvas.cpp b/wrapper/src/AlphaSkiaCanvas.cpp index 519f58f..da59364 100644 --- a/wrapper/src/AlphaSkiaCanvas.cpp +++ b/wrapper/src/AlphaSkiaCanvas.cpp @@ -154,7 +154,7 @@ void AlphaSkiaCanvas::stroke() path_.reset(); } -std::unique_ptr AlphaSkiaCanvas::build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, alphaskia_text_align_t text_align) +std::unique_ptr AlphaSkiaCanvas::build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align) { skia::textlayout::TextStyle style; @@ -162,8 +162,8 @@ std::unique_ptr AlphaSkiaCanvas::build_paragraph(co foregroundColor.setColor(color_); style.setForegroundColor(foregroundColor); - style.setFontFamilies(std::vector(textstyle.get_family_names())); - style.setFontStyle(textstyle.get_font_style()); + style.setFontFamilies(std::vector(text_style.get_family_names())); + style.setFontStyle(text_style.get_font_style()); style.setFontSize(font_size); skia::textlayout::ParagraphStyle paraStyle; @@ -189,9 +189,9 @@ std::unique_ptr AlphaSkiaCanvas::build_paragraph(co return builder->Build(); } -void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) +void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { - auto paragraph(build_paragraph(text, text_length, textstyle, font_size, text_align)); + auto paragraph(build_paragraph(text, text_length, text_style, font_size, text_align)); // layout with enough space for our text to definitely fit const float layoutWidth = surface_->width() * 2; @@ -217,13 +217,25 @@ void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const Alp paragraph->paint(surface_->getCanvas(), x, y); } -float AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &textstyle, float font_size) +AlphaSkiaTextMetrics* AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { - auto paragraph(build_paragraph(text, text_length, textstyle, font_size, alphaskia_text_align_t::alphaskia_text_align_left)); + auto paragraph(build_paragraph(text, text_length, text_style, font_size, alphaskia_text_align_t::alphaskia_text_align_left)); paragraph->layout(10000); - return static_cast(paragraph->getMaxIntrinsicWidth()); + return new AlphaSkiaTextMetrics( + static_cast(paragraph->getMaxIntrinsicWidth()), + // TODO + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ); } void AlphaSkiaCanvas::begin_rotate(float center_x, float center_y, float angle) diff --git a/wrapper/src/alphaskia_canvas.cpp b/wrapper/src/alphaskia_canvas.cpp index cbb0df3..78e7938 100644 --- a/wrapper/src/alphaskia_canvas.cpp +++ b/wrapper/src/alphaskia_canvas.cpp @@ -130,16 +130,17 @@ extern "C" reinterpret_cast(canvas)->stroke(); } - AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) + AS_API void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_text_style_t text_style, float font_size, float x, float y, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); reinterpret_cast(canvas)->fill_text(text, text_length, *skTextstyle, font_size, x, y, text_align, baseline); } - AS_API float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_textstyle_t textstyle, float font_size) + AS_API alphaskia_text_metrics_t alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, const char16_t *text, int text_length, alphaskia_text_style_t text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); - return reinterpret_cast(canvas)->measure_text(text, text_length, *skTextstyle, font_size); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); + auto text_metrics = reinterpret_cast(canvas)->measure_text(text, text_length, *skTextstyle, font_size, text_align, baseline); + return reinterpret_cast(text_metrics); } AS_API void alphaskia_canvas_begin_rotate(alphaskia_canvas_t canvas, float center_x, float center_y, float angle) diff --git a/wrapper/src/alphaskia_text_metrics.cpp b/wrapper/src/alphaskia_text_metrics.cpp new file mode 100644 index 0000000..00be095 --- /dev/null +++ b/wrapper/src/alphaskia_text_metrics.cpp @@ -0,0 +1,61 @@ +#include "../include/alphaskia.h" +#include "../include/AlphaSkiaCanvas.h" + +extern "C" +{ + AS_API float alphaskia_text_metrics_get_width(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_width(); + } + + AS_API float alphaskia_text_metrics_get_actual_bounding_box_left(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_actual_bounding_box_left(); + } + + AS_API float alphaskia_text_metrics_get_actual_bounding_box_right(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_actual_bounding_box_right(); + } + + AS_API float alphaskia_text_metrics_get_font_bounding_box_ascent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_font_bounding_box_ascent(); + } + + AS_API float alphaskia_text_metrics_get_font_bounding_box_descent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_font_bounding_box_descent(); + } + + AS_API float alphaskia_text_metrics_get_em_height_ascent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_em_height_ascent(); + } + + AS_API float alphaskia_text_metrics_get_em_height_descent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_em_height_descent(); + } + + AS_API float alphaskia_text_metrics_get_hanging_baseline(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_hanging_baseline(); + } + + AS_API float alphaskia_text_metrics_get_alphabetic_baseline(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_alphabetic_baseline(); + } + + AS_API float alphaskia_text_metrics_get_ideographic_baseline(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_ideographic_baseline(); + } + + AS_API void alphaskia_text_metrics_free(alphaskia_text_metrics_t text_metrics) + { + auto alphaSkiaTextMetrics = reinterpret_cast(text_metrics); + delete text_metrics; + } +} \ No newline at end of file diff --git a/wrapper/src/alphaskia_textstyle.cpp b/wrapper/src/alphaskia_text_style.cpp similarity index 72% rename from wrapper/src/alphaskia_textstyle.cpp rename to wrapper/src/alphaskia_text_style.cpp index 487face..b58190b 100644 --- a/wrapper/src/alphaskia_textstyle.cpp +++ b/wrapper/src/alphaskia_text_style.cpp @@ -3,7 +3,7 @@ extern "C" { - AS_API alphaskia_textstyle_t alphaskia_textstyle_new(uint8_t family_name_count, const char **family_names, uint16_t weight, uint8_t italic) + AS_API alphaskia_text_style_t alphaskia_text_style_new(uint8_t family_name_count, const char **family_names, uint16_t weight, uint8_t italic) { SkFontStyle::Weight skWeight; switch (weight) @@ -36,18 +36,18 @@ extern "C" skTextStyle->get_family_names().emplace_back(SkString(family_names[i])); } - return reinterpret_cast(skTextStyle); + return reinterpret_cast(skTextStyle); } - AS_API uint8_t alphaskia_textstyle_get_family_name_count(alphaskia_textstyle_t textstyle) + AS_API uint8_t alphaskia_text_style_get_family_name_count(alphaskia_text_style_t text_style) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); return static_cast(skTextstyle->get_family_names().size()); } - AS_API alphaskia_string_t alphaskia_textstyle_get_family_name(alphaskia_textstyle_t textstyle, uint8_t index) + AS_API alphaskia_string_t alphaskia_text_style_get_family_name(alphaskia_text_style_t text_style, uint8_t index) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); if (index >= skTextstyle->get_family_names().size()) { @@ -58,26 +58,26 @@ extern "C" return reinterpret_cast(skFamilyName); } - AS_API uint16_t alphaskia_textstyle_get_weight(alphaskia_textstyle_t textstyle) + AS_API uint16_t alphaskia_text_style_get_weight(alphaskia_text_style_t text_style) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); return static_cast(skTextstyle->get_font_style().weight()); } - AS_API uint8_t alphaskia_textstyle_is_italic(alphaskia_textstyle_t textstyle) + AS_API uint8_t alphaskia_text_style_is_italic(alphaskia_text_style_t text_style) { - AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextstyle = reinterpret_cast(text_style); return skTextstyle->get_font_style().slant() == SkFontStyle::Slant::kItalic_Slant ? 1 : 0; } - AS_API void alphaskia_textstyle_free(alphaskia_textstyle_t textstyle) + AS_API void alphaskia_text_style_free(alphaskia_text_style_t text_style) { - if (!textstyle) + if (!text_style) { return; } - AlphaSkiaTextStyle *skTextStyle = reinterpret_cast(textstyle); + AlphaSkiaTextStyle *skTextStyle = reinterpret_cast(text_style); delete skTextStyle; } } \ No newline at end of file From 315b936951392c10e2806684ce7d50d733e4c757 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 22 Apr 2025 01:52:29 +0200 Subject: [PATCH 2/9] feat: base implementation for measureText --- test/native/src/main.cpp | 51 +++++- wrapper/include/AlphaSkiaCanvas.h | 8 +- wrapper/src/AlphaSkiaCanvas.cpp | 243 +++++++++++++++---------- wrapper/src/alphaskia_text_metrics.cpp | 10 + 4 files changed, 213 insertions(+), 99 deletions(-) diff --git a/test/native/src/main.cpp b/test/native/src/main.cpp index e2518b8..b7f971b 100644 --- a/test/native/src/main.cpp +++ b/test/native/src/main.cpp @@ -84,8 +84,8 @@ bool write_data_to_file_and_free(alphaskia_data_t data, std::string path) return true; } - -void empty_image_test() { +void empty_image_test() +{ // https://github.com/CoderLine/alphaSkia/issues/53 auto canvas = alphaskia_canvas_new(); alphaskia_canvas_begin_render(canvas, 0, 0, 1); @@ -97,6 +97,47 @@ void empty_image_test() { alphaskia_canvas_free(canvas); } +void measure_test() +{ + // https://github.com/CoderLine/alphaSkia/issues/53 + auto canvas = alphaskia_canvas_new(); + + std::vector familyNames({"Noto Sans"}); + + auto text_style = alphaskia_text_style_new( + familyNames.size(), + const_cast(familyNames.data()), + 400, + 0); + + auto text_metrics = alphaskia_canvas_measure_text( + canvas, + u"Hello World", + 11, + text_style, + 18, + alphaskia_text_align_center, + alphaskia_text_baseline_alphabetic); + + std::cout << "Hello World (Noto Sans 18px) Text Metrics" << std::endl; + std::cout << " get_width: " << alphaskia_text_metrics_get_width(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_left: " << alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_right: " << alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics) << std::endl; + std::cout << " get_font_bounding_box_ascent: " << alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics) << std::endl; + std::cout << " get_font_bounding_box_descent: " << alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_ascent: " << alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_descent: " << alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics) << std::endl; + std::cout << " get_em_height_ascent: " << alphaskia_text_metrics_get_em_height_ascent(text_metrics) << std::endl; + std::cout << " get_em_height_descent: " << alphaskia_text_metrics_get_em_height_descent(text_metrics) << std::endl; + std::cout << " get_hanging_baseline: " << alphaskia_text_metrics_get_hanging_baseline(text_metrics) << std::endl; + std::cout << " get_alphabetic_baseline: " << alphaskia_text_metrics_get_alphabetic_baseline(text_metrics) << std::endl; + std::cout << " get_ideographic_baseline: " << alphaskia_text_metrics_get_ideographic_baseline(text_metrics) << std::endl; + + alphaskia_text_metrics_free(text_metrics); + alphaskia_text_style_free(text_style); + + alphaskia_canvas_free(canvas); +} int main(int argc, char **argv) { @@ -124,6 +165,10 @@ int main(int argc, char **argv) empty_image_test(); std::cout << "Image worked" << std::endl; + std::cout << "Measure Test" << std::endl; + measure_test(); + std::cout << "Measure Test Done" << std::endl; + // Load all fonts for rendering std::cout << "Loading fonts" << std::endl; std::filesystem::path test_data_path = repository_root / "test" / "test-data"; @@ -132,7 +177,7 @@ int main(int argc, char **argv) auto music_typeface_weight = alphaskia_typeface_get_weight(music_typeface); auto music_typeface_italic = alphaskia_typeface_is_italic(music_typeface); auto music_typeface_name_raw = alphaskia_string_get_utf8(music_typeface_name); - music_text_style = alphaskia_textstyle_new(1, &music_typeface_name_raw, music_typeface_weight, music_typeface_italic); + music_text_style = alphaskia_text_style_new(1, &music_typeface_name_raw, music_typeface_weight, music_typeface_italic); alphaskia_string_free(music_typeface_name); alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Regular.otf").generic_string()); diff --git a/wrapper/include/AlphaSkiaCanvas.h b/wrapper/include/AlphaSkiaCanvas.h index 3d5aa3b..f71dbdc 100644 --- a/wrapper/include/AlphaSkiaCanvas.h +++ b/wrapper/include/AlphaSkiaCanvas.h @@ -21,12 +21,14 @@ class AlphaSkiaTextMetrics float actual_bounding_box_right, float font_bounding_box_ascent, float font_bounding_box_descent, + float actual_bounding_box_ascent, + float actual_bounding_box_descent, float em_height_ascent, float em_height_descent, float hanging_baseline, float alphabetic_baseline, float ideographic_baseline) - : width_(width), actual_bounding_box_left_(actual_bounding_box_left), actual_bounding_box_right_(actual_bounding_box_right), font_bounding_box_ascent_(font_bounding_box_ascent), font_bounding_box_descent_(font_bounding_box_descent), em_height_ascent_(em_height_ascent), em_height_descent_(em_height_descent), hanging_baseline_(hanging_baseline), alphabetic_baseline_(alphabetic_baseline), ideographic_baseline_(ideographic_baseline) + : width_(width), actual_bounding_box_left_(actual_bounding_box_left), actual_bounding_box_right_(actual_bounding_box_right), font_bounding_box_ascent_(font_bounding_box_ascent), font_bounding_box_descent_(font_bounding_box_descent), actual_bounding_box_ascent_(actual_bounding_box_ascent), actual_bounding_box_descent_(actual_bounding_box_descent), em_height_ascent_(em_height_ascent), em_height_descent_(em_height_descent), hanging_baseline_(hanging_baseline), alphabetic_baseline_(alphabetic_baseline), ideographic_baseline_(ideographic_baseline) { } @@ -35,6 +37,8 @@ class AlphaSkiaTextMetrics float get_actual_bounding_box_right() const { return actual_bounding_box_right_; } float get_font_bounding_box_ascent() const { return font_bounding_box_ascent_; } float get_font_bounding_box_descent() const { return font_bounding_box_descent_; } + float get_actual_bounding_box_ascent() const { return actual_bounding_box_ascent_; } + float get_actual_bounding_box_descent() const { return actual_bounding_box_descent_; } float get_em_height_ascent() const { return em_height_ascent_; } float get_em_height_descent() const { return em_height_descent_; } float get_hanging_baseline() const { return hanging_baseline_; } @@ -47,6 +51,8 @@ class AlphaSkiaTextMetrics float actual_bounding_box_right_; float font_bounding_box_ascent_; float font_bounding_box_descent_; + float actual_bounding_box_ascent_; + float actual_bounding_box_descent_; float em_height_ascent_; float em_height_descent_; float hanging_baseline_; diff --git a/wrapper/src/AlphaSkiaCanvas.cpp b/wrapper/src/AlphaSkiaCanvas.cpp index da59364..f5b4ee9 100644 --- a/wrapper/src/AlphaSkiaCanvas.cpp +++ b/wrapper/src/AlphaSkiaCanvas.cpp @@ -13,12 +13,95 @@ #include "../../externals/skia/include/core/SkRefCnt.h" #include "../../externals/skia/modules/skparagraph/include/FontCollection.h" #include "../../externals/skia/modules/skparagraph/include/ParagraphBuilder.h" +#include "../../externals/skia/modules/skparagraph/src/ParagraphImpl.h" #include #include #include #include +#define kHangingAsPercentOfAscent 80 + +float float_ascent(const SkFontMetrics &metrics) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.h;l=49?q=FloatAscent&ss=chromium%2Fchromium%2Fsrc + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=131;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.cc;l=112;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1 + return SkScalarRoundToScalar(-metrics.fAscent); +} + +float float_descent(const SkFontMetrics &metrics) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.cc;l=112;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1 + return SkScalarRoundToScalar(metrics.fDescent); +} + +std::pair typo_ascender_and_descender(SkTypeface *typeface) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=388;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d?q=TypoAscenderAndDescender&sq=&ss=chromium%2Fchromium%2Fsrc + uint8_t buffer[4]; + size_t size = typeface->getTableData(SkSetFourByteTag('O', 'S', '/', '2'), 68, + sizeof(buffer), buffer); + if (size == sizeof(buffer)) + { + return std::make_pair( + (int16_t)((buffer[0] << 8) | buffer[1]), + -(int16_t)((buffer[2] << 8) | buffer[3])); + } + + return std::make_pair(0, 0); +} + +const uint32_t layoutUnitFractionalBits_ = 6; +const int fixedPointDenominator_ = 1 << layoutUnitFractionalBits_; + +int float_to_layout_unit(float value) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&ss=chromium%2Fchromium%2Fsrc + return static_cast(roundf(value * fixedPointDenominator_)); +} + +float layout_unit_to_float(int value) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&sq=&ss=chromium%2Fchromium%2Fsrc return static_cast(roundf(value * kFixedPointDenominator)) + return static_cast(value) / fixedPointDenominator_; +} + +bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=422;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc + const float height = typo_ascent + typo_descent; + if (height <= 0 || typo_ascent < 0 || typo_descent > height) + { + return false; + } + + ascent = float_to_layout_unit(typo_ascent * em_height / height); + descent = float_to_layout_unit(em_height) - ascent; + return true; +} + +void normalized_typo_ascent_and_descent(const SkFont &font, int &ascent, int &descent) +{ + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=366;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc + SkTypeface *typeface = font.getTypeface(); + auto [typo_ascender, typo_descender] = typo_ascender_and_descender(typeface); + + if (typo_ascender > 0 && + try_set_normalized_typo_ascent_and_descent(font.getSize(), typo_ascender, typo_descender, ascent, descent)) + { + return; + } + + // As the last resort, compute em height metrics from our ascent/descent. + SkFontMetrics metrics; + font.getMetrics(&metrics); + if (try_set_normalized_typo_ascent_and_descent(font.getSize(), float_ascent(metrics), float_descent(metrics), ascent, descent)) + { + return; + } +} + AlphaSkiaCanvas::AlphaSkiaCanvas() : color_(SK_ColorWHITE), line_width_(1.0f) { @@ -217,25 +300,76 @@ void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const Alp paragraph->paint(surface_->getCanvas(), x, y); } -AlphaSkiaTextMetrics* AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) +AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { auto paragraph(build_paragraph(text, text_length, text_style, font_size, alphaskia_text_align_t::alphaskia_text_align_left)); - paragraph->layout(10000); + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc;l=1290 + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/text_metrics.cc + + // the original HTML5 canvas doesn't really support newlines, we simply calculate everything with the + // first line + + skia::textlayout::ParagraphImpl *paragraphImpl = reinterpret_cast(paragraph.get()); + auto &line0 = paragraphImpl->lines()[0]; + + float width = static_cast(paragraph->getMaxIntrinsicWidth()); + + auto text_align_dx_ = 0.0f; + if (text_align == alphaskia_text_align_t::alphaskia_text_align_center) + { + text_align_dx_ = width / 2.0f; + } + else if (text_align == alphaskia_text_align_t::alphaskia_text_align_right) + { + text_align_dx_ = width; + } + else + { + text_align_dx_ = 0; + } + + auto lineOffset = line0.offset(); + float actual_bounding_box_left = -lineOffset.fX + text_align_dx_; + float actual_bounding_box_right = (lineOffset.fX + line0.width()) - text_align_dx_; + + SkFont font = paragraph->getFontAt(0); + + SkFontMetrics font_metrics; + font.getMetrics(&font_metrics); + const float ascent = float_ascent(font_metrics); + const float descent = float_descent(font_metrics); + const float baseline_y = get_font_baseline(font, baseline); + + float font_bounding_box_ascent = ascent - baseline_y; + float font_bounding_box_descent = descent + baseline_y; + float actual_bounding_box_ascent = -lineOffset.fY - baseline_y; + float actual_bounding_box_descent = (lineOffset.fY + line0.height()) + baseline_y; + + int normalizedAscent = 0; + int normalizedDescent = 0; + normalized_typo_ascent_and_descent(font, normalizedAscent, normalizedDescent); + float em_height_ascent = normalizedAscent - baseline_y; + float em_height_descent = normalizedDescent + baseline_y; + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/text_metrics.cc;l=174;drc=1d737975521c1d4191937c2c659bd78d9f1681f4;bpv=0;bpt=1 + float hanging_baseline = ascent * kHangingAsPercentOfAscent / 100.0f - baseline_y; + float alphabetic_baseline = line0.alphabeticBaseline(); + float ideographic_baseline = line0.ideographicBaseline(); + return new AlphaSkiaTextMetrics( - static_cast(paragraph->getMaxIntrinsicWidth()), - // TODO - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ); + width, + actual_bounding_box_left, + actual_bounding_box_right, + font_bounding_box_ascent, + font_bounding_box_descent, + actual_bounding_box_ascent, + actual_bounding_box_descent, + em_height_ascent, + em_height_descent, + hanging_baseline, + alphabetic_baseline, + ideographic_baseline); } void AlphaSkiaCanvas::begin_rotate(float center_x, float center_y, float angle) @@ -256,86 +390,6 @@ void AlphaSkiaCanvas::draw_image(sk_sp image, float x, float y, float w surface_->getCanvas()->drawImageRect(image, SkRect::MakeXYWH(x, y, w, h), sampling); } -float float_ascent(const SkFontMetrics &metrics) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.h;l=49?q=FloatAscent&ss=chromium%2Fchromium%2Fsrc - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=131;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.cc;l=112;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1 - return SkScalarRoundToScalar(-metrics.fAscent); -} - -float float_descent(const SkFontMetrics &metrics) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/font_metrics.cc;l=112;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1 - return SkScalarRoundToScalar(metrics.fDescent); -} - -std::pair typo_ascender_and_descender(SkTypeface *typeface) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=388;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d?q=TypoAscenderAndDescender&sq=&ss=chromium%2Fchromium%2Fsrc - uint8_t buffer[4]; - size_t size = typeface->getTableData(SkSetFourByteTag('O', 'S', '/', '2'), 68, - sizeof(buffer), buffer); - if (size == sizeof(buffer)) - { - return std::make_pair( - (int16_t)((buffer[0] << 8) | buffer[1]), - -(int16_t)((buffer[2] << 8) | buffer[3])); - } - - return std::make_pair(0, 0); -} - -const uint32_t layoutUnitFractionalBits_ = 6; -const int fixedPointDenominator_ = 1 << layoutUnitFractionalBits_; - -int float_to_layout_unit(float value) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&ss=chromium%2Fchromium%2Fsrc - return static_cast(roundf(value * fixedPointDenominator_)); -} - -float layout_unit_to_float(int value) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&sq=&ss=chromium%2Fchromium%2Fsrc return static_cast(roundf(value * kFixedPointDenominator)) - return static_cast(value) / fixedPointDenominator_; -} - -bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=422;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc - const float height = typo_ascent + typo_descent; - if (height <= 0 || typo_ascent < 0 || typo_descent > height) - { - return false; - } - - ascent = float_to_layout_unit(typo_ascent * em_height / height); - descent = float_to_layout_unit(em_height) - ascent; - return true; -} - -void normalized_typo_ascent_and_descent(const SkFont &font, int &ascent, int &descent) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=366;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc - SkTypeface *typeface = font.getTypeface(); - auto [typo_ascender, typo_descender] = typo_ascender_and_descender(typeface); - - if (typo_ascender > 0 && - try_set_normalized_typo_ascent_and_descent(font.getSize(), typo_ascender, typo_descender, ascent, descent)) - { - return; - } - - // As the last resort, compute em height metrics from our ascent/descent. - SkFontMetrics metrics; - font.getMetrics(&metrics); - if (try_set_normalized_typo_ascent_and_descent(font.getSize(), float_ascent(metrics), float_descent(metrics), ascent, descent)) - { - return; - } -} - float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline) { // https://github.com/chromium/chromium/blob/99314be8152e688bafbbf9a615536bdbb289ea87/third_party/blink/renderer/core/html/canvas/text_metrics.cc#L14 @@ -352,7 +406,6 @@ float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_base baselineOffset = 0; break; case alphaskia_text_baseline_top: // kHangingTextBaseline -#define kHangingAsPercentOfAscent 80 baselineOffset = float_ascent(metrics) * kHangingAsPercentOfAscent / 100.0f; break; case alphaskia_text_baseline_middle: // kMiddleTextBaseline diff --git a/wrapper/src/alphaskia_text_metrics.cpp b/wrapper/src/alphaskia_text_metrics.cpp index 00be095..53557df 100644 --- a/wrapper/src/alphaskia_text_metrics.cpp +++ b/wrapper/src/alphaskia_text_metrics.cpp @@ -28,6 +28,16 @@ extern "C" return reinterpret_cast(text_metrics)->get_font_bounding_box_descent(); } + AS_API float alphaskia_text_metrics_get_actual_bounding_box_ascent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_actual_bounding_box_ascent(); + } + + AS_API float alphaskia_text_metrics_get_actual_bounding_box_descent(alphaskia_text_metrics_t text_metrics) + { + return reinterpret_cast(text_metrics)->get_actual_bounding_box_descent(); + } + AS_API float alphaskia_text_metrics_get_em_height_ascent(alphaskia_text_metrics_t text_metrics) { return reinterpret_cast(text_metrics)->get_em_height_ascent(); From f80efb6bed2c622a5c256175e25eaf668a3f525c Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 22 Apr 2025 02:16:55 +0200 Subject: [PATCH 3/9] test: prepare for correct text measurement --- test/native/include/AlphaSkiaTestBridge.h | 6 ++-- test/native/src/AlphaSkiaTestBridge.cpp | 22 +++++++----- test/native/src/main.cpp | 41 +++++++++++++++++------ wrapper/include/AlphaSkiaCanvas.h | 2 +- wrapper/src/AlphaSkiaCanvas.cpp | 34 +++++++++++-------- wrapper/src/alphaskia_text_metrics.cpp | 2 +- 6 files changed, 69 insertions(+), 38 deletions(-) diff --git a/test/native/include/AlphaSkiaTestBridge.h b/test/native/include/AlphaSkiaTestBridge.h index 6a59534..6f64f49 100644 --- a/test/native/include/AlphaSkiaTestBridge.h +++ b/test/native/include/AlphaSkiaTestBridge.h @@ -15,14 +15,14 @@ typedef std::function render_function_t; extern alphaskia_text_align_t text_align; extern alphaskia_text_baseline_t text_baseline; -extern alphaskia_textstyle_t text_style; -extern alphaskia_textstyle_t music_text_style; +extern alphaskia_text_style_t text_style; +extern alphaskia_text_style_t music_text_style; extern float music_font_size; extern float font_size; extern float render_scale; extern int32_t total_width; extern int32_t total_height; -alphaskia_textstyle_t alphaskia_get_text_style(const std::vector& family_names, uint16_t weight, bool is_italic); +alphaskia_text_style_t alphaskia_get_text_style(const std::vector& family_names, uint16_t weight, bool is_italic); alphaskia_typeface_t alphaskia_load_typeface(std::string file_path); void read_file(std::string file_path, std::vector &data); \ No newline at end of file diff --git a/test/native/src/AlphaSkiaTestBridge.cpp b/test/native/src/AlphaSkiaTestBridge.cpp index 0d3a6ae..887fc68 100644 --- a/test/native/src/AlphaSkiaTestBridge.cpp +++ b/test/native/src/AlphaSkiaTestBridge.cpp @@ -8,15 +8,15 @@ alphaskia_text_align_t text_align = alphaskia_text_align_left; alphaskia_text_baseline_t text_baseline = alphaskia_text_baseline_top; -alphaskia_textstyle_t text_style = nullptr; -alphaskia_textstyle_t music_text_style = nullptr; +alphaskia_text_style_t text_style = nullptr; +alphaskia_text_style_t music_text_style = nullptr; float music_font_size = 34; float render_scale = 1; float font_size = 12.0f; -static std::map custom_text_styles; +static std::map custom_text_styles; -std::string custom_textstyle_key(const std::vector &family_names, uint16_t weight, bool is_italic) +std::string custom_text_style_key(const std::vector &family_names, uint16_t weight, bool is_italic) { std::stringstream s; for (auto &name : family_names) @@ -29,13 +29,13 @@ std::string custom_textstyle_key(const std::vector &family_names, return s.str(); } -alphaskia_textstyle_t alphaskia_get_text_style(const std::vector &family_names, uint16_t weight, bool is_italic) +alphaskia_text_style_t alphaskia_get_text_style(const std::vector &family_names, uint16_t weight, bool is_italic) { - auto key = custom_textstyle_key(family_names, weight, is_italic); + auto key = custom_text_style_key(family_names, weight, is_italic); auto it = custom_text_styles.find(key); if (it == custom_text_styles.end()) { - alphaskia_textstyle_t new_text_style = alphaskia_textstyle_new( + alphaskia_text_style_t new_text_style = alphaskia_text_style_new( static_cast(family_names.size()), const_cast(&family_names[0]), weight, @@ -83,10 +83,16 @@ alphaskia_typeface_t alphaskia_load_typeface(std::string file_path) std::cerr << "Could not create typeface from data " << file_path << std::endl; return nullptr; } + + alphaskia_string_t family_name = alphaskia_typeface_get_family_name(typeface); + std::cout << "Typeface " - << alphaskia_typeface_get_family_name(typeface) + << alphaskia_string_get_utf8(typeface) << "weight: " << alphaskia_typeface_get_weight(typeface) << " italic: " << (alphaskia_typeface_is_italic(typeface) ? "yes" : "no") << " loaded" << std::endl; + + alphaskia_string_free(family_name); + return typeface; } \ No newline at end of file diff --git a/test/native/src/main.cpp b/test/native/src/main.cpp index b7f971b..9661f6f 100644 --- a/test/native/src/main.cpp +++ b/test/native/src/main.cpp @@ -116,22 +116,41 @@ void measure_test() 11, text_style, 18, - alphaskia_text_align_center, + alphaskia_text_align_left, alphaskia_text_baseline_alphabetic); + + // in chrome we get: + // + // x = new OffscreenCanvas(100, 100) + // ctx = x.getContext('2d') + // ctx.font = '18px "Noto Sans"' + // ctx.measureText('Hello World') + // + // Output: + // actualBoundingBoxAscent: 13 + // actualBoundingBoxDescent: 0 + // actualBoundingBoxLeft: 1 + // actualBoundingBoxRight: 90.033203125 + // alphabeticBaseline: -0 + // fontBoundingBoxAscent: 16 + // fontBoundingBoxDescent: 4 + // hangingBaseline: 12.800000190734863 + // ideographicBaseline: -4 + // width: 89.033203125 std::cout << "Hello World (Noto Sans 18px) Text Metrics" << std::endl; - std::cout << " get_width: " << alphaskia_text_metrics_get_width(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_ascent: " << alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_descent: " << alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics) << std::endl; std::cout << " get_actual_bounding_box_left: " << alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics) << std::endl; std::cout << " get_actual_bounding_box_right: " << alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics) << std::endl; + std::cout << " get_alphabetic_baseline: " << alphaskia_text_metrics_get_alphabetic_baseline(text_metrics) << std::endl; std::cout << " get_font_bounding_box_ascent: " << alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics) << std::endl; std::cout << " get_font_bounding_box_descent: " << alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics) << std::endl; - std::cout << " get_actual_bounding_box_ascent: " << alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) << std::endl; - std::cout << " get_actual_bounding_box_descent: " << alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics) << std::endl; + std::cout << " get_ideographic_baseline: " << alphaskia_text_metrics_get_ideographic_baseline(text_metrics) << std::endl; + std::cout << " get_hanging_baseline: " << alphaskia_text_metrics_get_hanging_baseline(text_metrics) << std::endl; + std::cout << " get_width: " << alphaskia_text_metrics_get_width(text_metrics) << std::endl; std::cout << " get_em_height_ascent: " << alphaskia_text_metrics_get_em_height_ascent(text_metrics) << std::endl; std::cout << " get_em_height_descent: " << alphaskia_text_metrics_get_em_height_descent(text_metrics) << std::endl; - std::cout << " get_hanging_baseline: " << alphaskia_text_metrics_get_hanging_baseline(text_metrics) << std::endl; - std::cout << " get_alphabetic_baseline: " << alphaskia_text_metrics_get_alphabetic_baseline(text_metrics) << std::endl; - std::cout << " get_ideographic_baseline: " << alphaskia_text_metrics_get_ideographic_baseline(text_metrics) << std::endl; alphaskia_text_metrics_free(text_metrics); alphaskia_text_style_free(text_style); @@ -165,10 +184,6 @@ int main(int argc, char **argv) empty_image_test(); std::cout << "Image worked" << std::endl; - std::cout << "Measure Test" << std::endl; - measure_test(); - std::cout << "Measure Test Done" << std::endl; - // Load all fonts for rendering std::cout << "Loading fonts" << std::endl; std::filesystem::path test_data_path = repository_root / "test" / "test-data"; @@ -194,6 +209,10 @@ int main(int argc, char **argv) std::cout << "Fonts loaded" << std::endl; + std::cout << "Measure Test" << std::endl; + measure_test(); + std::cout << "Measure Test Done" << std::endl; + // render full image std::cout << "Rendering image" << std::endl; alphaskia_image_t actual_image = render_full_image(); diff --git a/wrapper/include/AlphaSkiaCanvas.h b/wrapper/include/AlphaSkiaCanvas.h index f71dbdc..98bc798 100644 --- a/wrapper/include/AlphaSkiaCanvas.h +++ b/wrapper/include/AlphaSkiaCanvas.h @@ -128,7 +128,7 @@ class AlphaSkiaCanvas private: SkPaint create_paint(); std::unique_ptr build_paragraph(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align); - static float get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline); + static float get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline, bool correctSkParagraphBaseline); SkColor color_; float line_width_; diff --git a/wrapper/src/AlphaSkiaCanvas.cpp b/wrapper/src/AlphaSkiaCanvas.cpp index f5b4ee9..b7f2e99 100644 --- a/wrapper/src/AlphaSkiaCanvas.cpp +++ b/wrapper/src/AlphaSkiaCanvas.cpp @@ -281,7 +281,7 @@ void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const Alp paragraph->layout(surface_->width() * 2); // NOTE: SkParagraph has no support for font/line specific baselines, first font is better than nothing - y += get_font_baseline(paragraph->getFontAt(0), baseline); + y += get_font_baseline(paragraph->getFontAt(0), baseline, true); switch (text_align) { @@ -303,7 +303,8 @@ void AlphaSkiaCanvas::fill_text(const char16_t *text, int text_length, const Alp AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int text_length, const AlphaSkiaTextStyle &text_style, float font_size, alphaskia_text_align_t text_align, alphaskia_text_baseline_t baseline) { auto paragraph(build_paragraph(text, text_length, text_style, font_size, alphaskia_text_align_t::alphaskia_text_align_left)); - paragraph->layout(10000); + const float layoutWidth = 10000; + paragraph->layout(layoutWidth); // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/modules/canvas/canvas2d/base_rendering_context_2d.cc;l=1290 // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/text_metrics.cc @@ -317,17 +318,20 @@ AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int te float width = static_cast(paragraph->getMaxIntrinsicWidth()); auto text_align_dx_ = 0.0f; - if (text_align == alphaskia_text_align_t::alphaskia_text_align_center) + switch (text_align) { + case alphaskia_text_align_left: + // doesn't matter + break; + case alphaskia_text_align_center: text_align_dx_ = width / 2.0f; - } - else if (text_align == alphaskia_text_align_t::alphaskia_text_align_right) - { + text_align_dx_ -= layoutWidth / 2; + break; + case alphaskia_text_align_right: + // text is aligned at layoutWidth, shift it left text_align_dx_ = width; - } - else - { - text_align_dx_ = 0; + text_align_dx_ -= layoutWidth; + break; } auto lineOffset = line0.offset(); @@ -340,7 +344,7 @@ AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int te font.getMetrics(&font_metrics); const float ascent = float_ascent(font_metrics); const float descent = float_descent(font_metrics); - const float baseline_y = get_font_baseline(font, baseline); + const float baseline_y = get_font_baseline(font, baseline, true); float font_bounding_box_ascent = ascent - baseline_y; float font_bounding_box_descent = descent + baseline_y; @@ -390,7 +394,7 @@ void AlphaSkiaCanvas::draw_image(sk_sp image, float x, float y, float w surface_->getCanvas()->drawImageRect(image, SkRect::MakeXYWH(x, y, w, h), sampling); } -float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline) +float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_baseline_t baseline, bool correctSkParagraphBaseline) { // https://github.com/chromium/chromium/blob/99314be8152e688bafbbf9a615536bdbb289ea87/third_party/blink/renderer/core/html/canvas/text_metrics.cc#L14 SkFontMetrics metrics; @@ -424,8 +428,10 @@ float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_base // SkParagraph defines its baseline() as (fLeading / 2 - fAscent) // see: Run.h -> InternalLineMetrics::baseline() // we reset this here - const float skParagraphBaseline = metrics.fLeading / 2 + float_ascent(metrics); - baselineOffset -= skParagraphBaseline; + if(correctSkParagraphBaseline) { + const float skParagraphBaseline = metrics.fLeading / 2 + float_ascent(metrics); + baselineOffset -= skParagraphBaseline; + } return baselineOffset; } \ No newline at end of file diff --git a/wrapper/src/alphaskia_text_metrics.cpp b/wrapper/src/alphaskia_text_metrics.cpp index 53557df..94f9585 100644 --- a/wrapper/src/alphaskia_text_metrics.cpp +++ b/wrapper/src/alphaskia_text_metrics.cpp @@ -66,6 +66,6 @@ extern "C" AS_API void alphaskia_text_metrics_free(alphaskia_text_metrics_t text_metrics) { auto alphaSkiaTextMetrics = reinterpret_cast(text_metrics); - delete text_metrics; + delete alphaSkiaTextMetrics; } } \ No newline at end of file From 99f8a9c0a2dc31545fc68c7eb7c954fe785042df Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 29 Apr 2025 13:18:10 +0200 Subject: [PATCH 4/9] test: update native test structure --- test/native/src/main.cpp | 484 +++++++++++++----- .../reference/measure-linux-chrome.png | Bin 0 -> 51037 bytes .../reference/measure-linux-firefox.png | Bin 0 -> 52111 bytes .../reference/measure-win-chrome.png | Bin 0 -> 47397 bytes .../reference/measure-win-firefox.png | Bin 0 -> 37142 bytes 5 files changed, 357 insertions(+), 127 deletions(-) create mode 100644 test/test-data/reference/measure-linux-chrome.png create mode 100644 test/test-data/reference/measure-linux-firefox.png create mode 100644 test/test-data/reference/measure-win-chrome.png create mode 100644 test/test-data/reference/measure-win-firefox.png diff --git a/test/native/src/main.cpp b/test/native/src/main.cpp index 9661f6f..e403da3 100644 --- a/test/native/src/main.cpp +++ b/test/native/src/main.cpp @@ -7,6 +7,7 @@ #include #include +#include #ifndef ALPHASKIA_TEST_RID #error "Missing alphaSkia runtime identifier, please specify ALPHASKIA_TEST_RID"; @@ -15,6 +16,8 @@ #define STRINGIFY(s) _STRINGIFY(s) #define _STRINGIFY(s) #s +const double tolerance_percent = 1; + std::filesystem::path find_repository_root(std::filesystem::path current, bool &success) { if (std::filesystem::exists(current / ".nuke")) @@ -84,9 +87,10 @@ bool write_data_to_file_and_free(alphaskia_data_t data, std::string path) return true; } -void empty_image_test() +bool empty_image_test() { // https://github.com/CoderLine/alphaSkia/issues/53 + std::cout << "BEGIN: empty_image_test" << std::endl; auto canvas = alphaskia_canvas_new(); alphaskia_canvas_begin_render(canvas, 0, 0, 1); @@ -95,143 +99,30 @@ void empty_image_test() alphaskia_image_free(empty); alphaskia_canvas_free(canvas); + std::cout << "SUCCESS: empty_image_test" << std::endl; + return true; } -void measure_test() -{ - // https://github.com/CoderLine/alphaSkia/issues/53 - auto canvas = alphaskia_canvas_new(); - - std::vector familyNames({"Noto Sans"}); - - auto text_style = alphaskia_text_style_new( - familyNames.size(), - const_cast(familyNames.data()), - 400, - 0); - - auto text_metrics = alphaskia_canvas_measure_text( - canvas, - u"Hello World", - 11, - text_style, - 18, - alphaskia_text_align_left, - alphaskia_text_baseline_alphabetic); - - // in chrome we get: - // - // x = new OffscreenCanvas(100, 100) - // ctx = x.getContext('2d') - // ctx.font = '18px "Noto Sans"' - // ctx.measureText('Hello World') - // - // Output: - // actualBoundingBoxAscent: 13 - // actualBoundingBoxDescent: 0 - // actualBoundingBoxLeft: 1 - // actualBoundingBoxRight: 90.033203125 - // alphabeticBaseline: -0 - // fontBoundingBoxAscent: 16 - // fontBoundingBoxDescent: 4 - // hangingBaseline: 12.800000190734863 - // ideographicBaseline: -4 - // width: 89.033203125 - - std::cout << "Hello World (Noto Sans 18px) Text Metrics" << std::endl; - std::cout << " get_actual_bounding_box_ascent: " << alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) << std::endl; - std::cout << " get_actual_bounding_box_descent: " << alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics) << std::endl; - std::cout << " get_actual_bounding_box_left: " << alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics) << std::endl; - std::cout << " get_actual_bounding_box_right: " << alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics) << std::endl; - std::cout << " get_alphabetic_baseline: " << alphaskia_text_metrics_get_alphabetic_baseline(text_metrics) << std::endl; - std::cout << " get_font_bounding_box_ascent: " << alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics) << std::endl; - std::cout << " get_font_bounding_box_descent: " << alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics) << std::endl; - std::cout << " get_ideographic_baseline: " << alphaskia_text_metrics_get_ideographic_baseline(text_metrics) << std::endl; - std::cout << " get_hanging_baseline: " << alphaskia_text_metrics_get_hanging_baseline(text_metrics) << std::endl; - std::cout << " get_width: " << alphaskia_text_metrics_get_width(text_metrics) << std::endl; - std::cout << " get_em_height_ascent: " << alphaskia_text_metrics_get_em_height_ascent(text_metrics) << std::endl; - std::cout << " get_em_height_descent: " << alphaskia_text_metrics_get_em_height_descent(text_metrics) << std::endl; - - alphaskia_text_metrics_free(text_metrics); - alphaskia_text_style_free(text_style); - - alphaskia_canvas_free(canvas); -} - -int main(int argc, char **argv) +bool reference_image_test(const std::filesystem::path &repository_root, + const std::filesystem::path &test_data_path, + bool isFreeType, + alphaskia_image_t actual_image, + const std::string &test_file_name) { - bool isFreeType = false; - - for (int i = 0; i < argc; i++) - { - if (strcmp(argv[i], "--freetype") == 0) - { - isFreeType = true; - std::cout << "Switching to FreeType Fonts" << std::endl; - alphaskia_switch_to_freetype_fonts(); - } - } - - const double tolerance_percent = 1; - bool found(false); - std::filesystem::path repository_root = find_repository_root(std::filesystem::current_path(), found); - if (!found) - { - return 1; - } - - std::cout << "Empty image" << std::endl; - empty_image_test(); - std::cout << "Image worked" << std::endl; - - // Load all fonts for rendering - std::cout << "Loading fonts" << std::endl; - std::filesystem::path test_data_path = repository_root / "test" / "test-data"; - auto music_typeface = alphaskia_load_typeface((test_data_path / "font" / "bravura" / "Bravura.otf").generic_string()); - auto music_typeface_name = alphaskia_typeface_get_family_name(music_typeface); - auto music_typeface_weight = alphaskia_typeface_get_weight(music_typeface); - auto music_typeface_italic = alphaskia_typeface_is_italic(music_typeface); - auto music_typeface_name_raw = alphaskia_string_get_utf8(music_typeface_name); - music_text_style = alphaskia_text_style_new(1, &music_typeface_name_raw, music_typeface_weight, music_typeface_italic); - alphaskia_string_free(music_typeface_name); - - alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Regular.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Bold.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Italic.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-BoldItalic.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Regular.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Bold.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Italic.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-music" / "NotoMusic-Regular.otf").generic_string()); - alphaskia_load_typeface((test_data_path / "font" / "noto-color-emoji" / "NotoColorEmoji_WindowsCompatible.ttf").generic_string()); - - std::cout << "Fonts loaded" << std::endl; - - std::cout << "Measure Test" << std::endl; - measure_test(); - std::cout << "Measure Test Done" << std::endl; - - // render full image - std::cout << "Rendering image" << std::endl; - alphaskia_image_t actual_image = render_full_image(); - std::cout << "Image rendered" << std::endl; - // save png for future reference std::cout << "Saving image as PNG" << std::endl; std::filesystem::path test_output_path = repository_root / "test" / "test-outputs" / "native"; std::filesystem::create_directories(test_output_path); - std::string test_output_file_base = isFreeType ? "freetype" : STRINGIFY(ALPHASKIA_TEST_RID); + std::string test_output_file_base = test_file_name + (isFreeType ? "freetype" : STRINGIFY(ALPHASKIA_TEST_RID)); std::filesystem::path test_output_file = test_output_path / (test_output_file_base + ".png"); alphaskia_data_t png_data = alphaskia_image_encode_png(actual_image); if (!png_data) { std::cerr << "Failed to encode final image to png" << std::endl; - return 1; + return false; } write_data_to_file_and_free(png_data, test_output_file.generic_string()); std::cout << "Image saved to " << test_output_file.generic_string() << std::endl; @@ -245,7 +136,7 @@ int main(int argc, char **argv) if (!expected_image) { std::cerr << "Failed to decode reference image" << std::endl; - return 1; + return false; } std::cout << "Reference image loaded" << std::endl; @@ -259,7 +150,7 @@ int main(int argc, char **argv) if (actual_width != expected_width || actual_height != expected_height) { std::cerr << "Image sizes do not match: Actual[" << actual_width << "x" << actual_height << "] Expected[" << expected_width << "x" << actual_height << "]" << std::endl; - return 1; + return false; } std::vector actual_pixels; @@ -308,9 +199,348 @@ int main(int argc, char **argv) write_data_to_file_and_free(old_image_png_data, old_output_path.generic_string()); std::cout << "Error old image saved to " << old_output_path.generic_string() << std::endl; - return 1; + return false; } std::cout << "Images match. Total Pixels: " << compare_result.total_pixels << ", Transparent Pixels: " << compare_result.transparent_pixels << ", Percent difference:" << percentDifference << "%" << std::endl; - return 0; + return true; +} + +bool music_sheet_test(const std::filesystem::path &repository_root, const std::filesystem::path &test_data_path, bool isFreeType) +{ + std::cout << "BEGIN: music_sheet_test" << std::endl; + + // render full image + std::cout << "Rendering image" << std::endl; + alphaskia_image_t actual_image = render_full_image(); + std::cout << "Image rendered" << std::endl; + + if (!reference_image_test(repository_root, test_data_path, isFreeType, actual_image, "")) + { + std::cout << "FAILED: music_sheet_test" << std::endl; + return false; + } + + std::cout << "SUCCESS: music_sheet_test" << std::endl; + return true; +} + +void measure_text_draw(alphaskia_canvas_t canvas, + alphaskia_text_style_t text_style, + const std::vector &baselines, + size_t &index) +{ + static std::wstring_convert, char16_t> convert{}; + + for (auto &baseline : baselines) + { + std::u16string text = std::u16string(u"Abcdefghijklmnop (") + baseline + u")"; + + auto text_metrics = alphaskia_canvas_measure_text( + canvas, + text.c_str(), + static_cast(text.length()), + text_style, + 18, + alphaskia_text_align_left, + alphaskia_text_baseline_alphabetic); + + std::cout << convert.to_bytes(text.data()) << std::endl; + std::cout << " get_actual_bounding_box_ascent: " << alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_descent: " << alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_left: " << alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics) << std::endl; + std::cout << " get_actual_bounding_box_right: " << alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics) << std::endl; + std::cout << " get_alphabetic_baseline: " << alphaskia_text_metrics_get_alphabetic_baseline(text_metrics) << std::endl; + std::cout << " get_font_bounding_box_ascent: " << alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics) << std::endl; + std::cout << " get_font_bounding_box_descent: " << alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics) << std::endl; + std::cout << " get_ideographic_baseline: " << alphaskia_text_metrics_get_ideographic_baseline(text_metrics) << std::endl; + std::cout << " get_hanging_baseline: " << alphaskia_text_metrics_get_hanging_baseline(text_metrics) << std::endl; + std::cout << " get_width: " << alphaskia_text_metrics_get_width(text_metrics) << std::endl; + std::cout << " get_em_height_ascent: " << alphaskia_text_metrics_get_em_height_ascent(text_metrics) << std::endl; + std::cout << " get_em_height_descent: " << alphaskia_text_metrics_get_em_height_descent(text_metrics) << std::endl; + + const int y = 50 + (index++) * 50; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(0, 0, 0, 255)); + alphaskia_canvas_fill_text( + canvas, + text.c_str(), + static_cast(text.length()), + text_style, + 18, + 0, y, + alphaskia_text_align_left, + alphaskia_text_baseline_alphabetic); + + float baselineMetricValue = 0; + bool aboveAlphabetic = false; + if (baseline == u"fontBoundingBoxAscent") + { + baselineMetricValue = alphaskia_text_metrics_get_font_bounding_box_ascent(text_metrics) * -1; + aboveAlphabetic = true; + } + else if (baseline == u"actualBoundingBoxAscent") + { + baselineMetricValue = alphaskia_text_metrics_get_actual_bounding_box_ascent(text_metrics) * -1; + aboveAlphabetic = true; + } + else if (baseline == u"emHeightAscent") + { + baselineMetricValue = alphaskia_text_metrics_get_em_height_ascent(text_metrics) * -1; + aboveAlphabetic = true; + } + else if (baseline == u"hangingBaseline") + { + baselineMetricValue = alphaskia_text_metrics_get_hanging_baseline(text_metrics) * -1; + aboveAlphabetic = true; + } + else if (baseline == u"ideographicBaseline") + { + baselineMetricValue = std::abs(alphaskia_text_metrics_get_ideographic_baseline(text_metrics)); + } + else if (baseline == u"emHeightDescent") + { + baselineMetricValue = alphaskia_text_metrics_get_em_height_descent(text_metrics); + } + else if (baseline == u"actualBoundingBoxDescent") + { + baselineMetricValue = alphaskia_text_metrics_get_actual_bounding_box_descent(text_metrics); + } + else if (baseline == u"fontBoundingBoxDescent") + { + baselineMetricValue = alphaskia_text_metrics_get_font_bounding_box_descent(text_metrics); + } + else if (baseline == u"alphabeticBaseline") + { + baselineMetricValue = alphaskia_text_metrics_get_alphabetic_baseline(text_metrics); + } + + const float lineY = y + baselineMetricValue; + alphaskia_canvas_set_color(canvas, alphaskia_rgba_to_color(255, 0, 0, 255)); + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics), y); + alphaskia_canvas_line_to(canvas, alphaskia_text_metrics_get_actual_bounding_box_left(text_metrics), lineY); + alphaskia_canvas_line_to(canvas, alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics), lineY); + alphaskia_canvas_line_to(canvas, alphaskia_text_metrics_get_actual_bounding_box_right(text_metrics), y); + alphaskia_canvas_stroke(canvas); + + const float widthLineY = aboveAlphabetic ? lineY - 5 : lineY + 5; + alphaskia_canvas_begin_path(canvas); + alphaskia_canvas_move_to(canvas, 0, widthLineY); + alphaskia_canvas_line_to(canvas, alphaskia_text_metrics_get_width(text_metrics), widthLineY); + alphaskia_canvas_stroke(canvas); + + alphaskia_text_metrics_free(text_metrics); + } +} + +bool isDebug() +{ + std::string var; + size_t requiredSize; + + getenv_s(&requiredSize, nullptr, 0, "ALPHASKIA_TEST_DEBUG"); + if (requiredSize == 0) + { + return false; + } + + return true; +} + +int measure_test(const std::filesystem::path &repository_root, const std::filesystem::path &test_data_path, bool isFreeType) +{ + std::cout << "BEGIN: measure_test" << std::endl; + + // https://jsfiddle.net/danielku15/j23dn09x/ + /* +async function run() { + const notoSans = + "https://cdn.jsdelivr.net/gh/notofonts/notofonts.github.io/fonts/NotoSans/unhinted/otf/NotoSans-Regular.otf" + const font = new FontFace("Noto Sans", `url(${notoSans})`) + document.fonts.add(font) + await font.load() + + const canvas = document.createElement("canvas") + canvas.width = 550 + canvas.height = 500 + document.body.appendChild(canvas) + + const ctx = canvas.getContext("2d") + ctx.font = '18px "Noto Sans"' + ctx.strokeStyle = "red" + + const baselinesAboveAlphabetic = [ + "fontBoundingBoxAscent", + "actualBoundingBoxAscent", + "emHeightAscent", + "hangingBaseline" + ] + const baselinesBelowAlphabetic = [ + "ideographicBaseline", + "emHeightDescent", + "actualBoundingBoxDescent", + "fontBoundingBoxDescent", + "alphabeticBaseline" + ] + const baselines = [...baselinesAboveAlphabetic, ...baselinesBelowAlphabetic] + baselines.forEach((baseline, index) => { + const text = `Abcdefghijklmnop (${baseline})` + const textMetrics = ctx.measureText(text) + + console.log(text); + console.log(` get_actual_bounding_box_ascent: ${textMetrics.actualBoundingBoxAscent}`); + console.log(` get_actual_bounding_box_descent: ${textMetrics.actualBoundingBoxDescent}`); + console.log(` get_actual_bounding_box_left: ${textMetrics.actualBoundingBoxLeft}`); + console.log(` get_actual_bounding_box_right: ${textMetrics.actualBoundingBoxRight}`); + console.log(` get_alphabetic_baseline: ${textMetrics.alphabeticBaseline}`); + console.log(` get_font_bounding_box_ascent: ${textMetrics.fontBoundingBoxAscent}`); + console.log(` get_font_bounding_box_descent: ${textMetrics.fontBoundingBoxDescent}`); + console.log(` get_ideographic_baseline: ${textMetrics.ideographicBaseline}`); + console.log(` get_hanging_baseline: ${textMetrics.hangingBaseline}`); + console.log(` get_width: ${textMetrics.width}`); + console.log(` get_em_height_ascent: ${textMetrics.emHeightAscent}`); + console.log(` get_em_height_descent: ${textMetrics.emHeightDescent}`); + + const y = 50 + index * 50 + ctx.fillText(text, 0, y) + + const baselineMetricValue = textMetrics[baseline] + if (baselineMetricValue === undefined) { + return + } + + const lineY = baselinesBelowAlphabetic.includes(baseline) + ? y + Math.abs(baselineMetricValue) + : y - Math.abs(baselineMetricValue) + ctx.beginPath() + ctx.moveTo(textMetrics.actualBoundingBoxLeft, y) + ctx.lineTo(textMetrics.actualBoundingBoxLeft, lineY) + ctx.lineTo(textMetrics.actualBoundingBoxRight, lineY) + ctx.lineTo(textMetrics.actualBoundingBoxRight, y) + ctx.stroke() + + const widthLineY = baselinesBelowAlphabetic.includes(baseline) + ? y + Math.abs(baselineMetricValue) + 5 + : y - Math.abs(baselineMetricValue) - 5 + + ctx.beginPath() + ctx.lineTo(0, widthLineY) + ctx.lineTo(textMetrics.width, widthLineY) + ctx.stroke() +}) +} + +run(); + */ + auto canvas = alphaskia_canvas_new(); + + alphaskia_canvas_begin_render(canvas, 550, 500, 1); + + std::vector familyNames({"Noto Sans"}); + auto text_style = alphaskia_text_style_new( + familyNames.size(), + const_cast(familyNames.data()), + 400, + 0); + + std::vector baselines({ + u"fontBoundingBoxAscent", + u"actualBoundingBoxAscent", + u"emHeightAscent", + u"hangingBaseline", + u"ideographicBaseline", + u"emHeightDescent", + u"actualBoundingBoxDescent", + u"fontBoundingBoxDescent", + u"alphabeticBaseline" + }); + + size_t index = 0; + + measure_text_draw(canvas, text_style, baselines, index); + + alphaskia_image_t actual_image = alphaskia_canvas_end_render(canvas); + + alphaskia_canvas_free(canvas); + + if (!reference_image_test(repository_root, test_data_path, isFreeType, actual_image, "measure-")) + { + std::cout << "FAILED: measure_test" << std::endl; + return false; + } + + std::cout << "SUCCESS: measure_test" << std::endl; + return true; +} + +int main(int argc, char **argv) +{ + bool isFreeType = false; + + for (int i = 0; i < argc; i++) + { + if (strcmp(argv[i], "--freetype") == 0) + { + isFreeType = true; + std::cout << "Switching to FreeType Fonts" << std::endl; + alphaskia_switch_to_freetype_fonts(); + } + } + + bool found(false); + std::filesystem::path repository_root = find_repository_root(std::filesystem::current_path(), found); + if (!found) + { + return 1; + } + + if (isDebug()) + { + std::cout << "Hit [ENTER] to continue, attach debugger now" << std::endl; + std::string line; + std::getline(std::cin, line); + } + + // Load all fonts for rendering + std::cout << "Loading fonts" << std::endl; + std::filesystem::path test_data_path = repository_root / "test" / "test-data"; + auto music_typeface = alphaskia_load_typeface((test_data_path / "font" / "bravura" / "Bravura.otf").generic_string()); + auto music_typeface_name = alphaskia_typeface_get_family_name(music_typeface); + auto music_typeface_weight = alphaskia_typeface_get_weight(music_typeface); + auto music_typeface_italic = alphaskia_typeface_is_italic(music_typeface); + auto music_typeface_name_raw = alphaskia_string_get_utf8(music_typeface_name); + music_text_style = alphaskia_text_style_new(1, &music_typeface_name_raw, music_typeface_weight, music_typeface_italic); + alphaskia_string_free(music_typeface_name); + + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Bold.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-Italic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-sans" / "NotoSans-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Bold.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-Italic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-serif" / "NotoSerif-BoldItalic.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-music" / "NotoMusic-Regular.otf").generic_string()); + alphaskia_load_typeface((test_data_path / "font" / "noto-color-emoji" / "NotoColorEmoji_WindowsCompatible.ttf").generic_string()); + + std::cout << "Fonts loaded" << std::endl; + + bool error = false; + if (!music_sheet_test(repository_root, test_data_path, isFreeType)) + { + error = true; + } + + if (!empty_image_test()) + { + error = true; + } + + if (!measure_test(repository_root, test_data_path, isFreeType)) + { + error = true; + } + + return error ? 1 : 0; } \ No newline at end of file diff --git a/test/test-data/reference/measure-linux-chrome.png b/test/test-data/reference/measure-linux-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..d02b13378947cf141e9e315696c1bb282e551409 GIT binary patch literal 51037 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

b`(Poyc&5Fp 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 literal 0 HcmV?d00001 diff --git a/test/test-data/reference/measure-win-chrome.png b/test/test-data/reference/measure-win-chrome.png new file mode 100644 index 0000000000000000000000000000000000000000..7b9d854cc4c8df9724530bd818be018e33b1e503 GIT binary patch literal 47397 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

wN38_;NoQLGA>?2thUrD5)UJ`vJfu;~LsyR|Lwl z=)C}AR9VZQ4Z4t%-hmc9B7aj_Ff+pJX-?aTLgU@|V!Y9=x?%<8d{Q+=gY`hNo^ikE zFrVm4`Y%@h0{kUOL7T;RS^`$p;Ybp4DWVMSijCVr{Nwrd4kCq;;iwd{)9xlU}hz64z)DZaGsJU8+IS1%ie#Er);*u3<4+x!yhu%_gQQxwaArK zcqj)Cydek_TipZd&$!g1r=VB$XDvTiMoD<@2%3Mt)Zj*4g%vye!pW1fnTNao;V~r* z`O=+N_8sVhk^Yk*Bb%P5)PlWHhSOgB`u;>VbXSSRTT1^Di}zU|)^WXwP2r5K+~z|- zhH4t&&c>dWS!Q^|7)CT0S`^j$sp4VoDv8{+u#vP%e7xV%mwZzC>Wy4ZfOmzs<8$AV zU-s6aA7s;hY@gkn|A0g9#xBt`SII2`7d8ar&>?;kAi6%%yfO2ZX1J!O^>i5L3NBBf_=PZ*p5e4d;g>9@Fs&L8$a~(UertsYtxmY)789_y^eFa_2H*^tq*QpFaviQlN%ib(% zl3Gq3wZ$U%7UU(@wTcJo_X~g^sF|*_`eVw^sld2}-txitth4Y@&m>!@C7pd}%*vo_qqsPC?0{-H{Y7 z+0#+JFW!y!0F~-cEEOg7wosk~99&p7_MB6LGZuEJQW9IfApsA5lQgrB0cHI>w=R2+ z8<(k`0v8S?2Tq{(x3eGMfFVJt#!B&9Ar^~_H?{Vig@Qi|h4TyC?U?93e9Ni^}+PG`BNTd}aUDw(CE}yOsmI z-z7omL5B=Qiw62y@<|0m@_ocr*~@(u^QO$IJg3A(Hm0x!fDb~rO%J7h$-X612`#K` z=0RFgTqRwon1kBp!JOz9>)XSiCo4~R(Loec2wz=c`n*or{E4UEb%TWZt{T43p-{bD z`k@i(=)^8TbxO*G$lq2MEYr{7-igA~z3n{`l}B|lA$)(M^+5i z;)ZBh&OW2A{+TTaL6y5m01}o znJ$%U*_pc(8E|%<@3XtuP~DU`(+Q;YpBu5hZWo+8Q#7bZxhMi&VOeo4Q@)r6aeF$i zpn)%V?eqRR15xJDbOQa&JNHy^b{=az8YQ?Hbw!l+_VmT7U6!tzxg23<^xE6n77?Jp z>iTfqZ(xgU><5mz&G~MTy8~4M%ait?YgUNJ9$qPs<+|@PQ`qTz_Dq&*|F5`vV`TPp z^}Sczg-_WGX!-BdM{Vpcw$;VC4KSVe<5rnO_VNZbXe|x+rq4tqG2;loF)h>%e1jpv z2Hk*fQrdnw?jL<~H_w{!Nbn+Z2BTa*(P5SGaKQ4L?tg?4`@$)2cnLV;;++JnvCrRY zYYdS+rgKUJ)Gplrrgn|qED?rT>)imEo$VNS-rb?gk52-(0@8nVK33zrtbIQe^-{)I z0W-06d3o<^C5exE_b+YR@f+y=%YZ`fGq5A+>SrF+JXk8c_emL9{Vc|wj$8E#B-Vg~ z3uE^&T}jOhUr5qDPvYKplfKla=V#b%94XUcJ9j*aqYc*G)Uo|g1}`c~CRG0jTkU%6 z`J-m@;RqwH+RB6iru*y5ZKfmChZoPj`6T3kUH6`^V$T2-^|Y&>@2E!PJivV8-xM*j zlvzEp0fxZpx^G=wfl{$K#}>CzC3FJ*(v*)1qCxi^7W1fKJ*B5^|cVT@o~Ks;r!gjQ*7XV z$8i64FWq&voy#dn!t(X#*Tgcac#&AQMJ>#EJPRX#Sa^*)d0mbh0>+|HD$SEoaAJtNeXMl=*BV$ZQ z0lj|pKnY(bOon@Xq;tZ8m|Z;1voBKdEx`XB>Dy4^nUt(qfCSypx6PALZjaLxnXn3cy5 zM$|d{ixwomso#x5f3#X^kLCfJsEh<4rzLrg*!Y%+eVz@yIn62!N&{ zbm4=Ji3H#TPK4l(B6`C({7pxgI5yc^vBs% za14UIqxY2Ek!MvOX)64JJ~t2-E|zi-oVM-AxB3hDjB|AvInA-Ufox7}cH_8eivpfN z-?l}=xAe<@E9g}$W-Q01(UixQ^NJ;{=#JMkxmwTUsEydOo8%u)?b_xx>5V+Zja-UT z*8kMoKd{kZ^TciO5wa9Go^^xPJF31P&{EMhX9^?TBd-=zkfQJO8A@}zYz@!0Ihq_F zl#Rc0I~^}Ebi4Ju{{67!o$w#0zl>iVt3z~HbSNO&D9w%TqUTP0tD9LR(7JbMF?HY9 z=xQi^q0!NEN zP!?tfo$X@7s6V>zhh$7~mBK5T#jrbJf8bpL5!AW#;hL`mKic6&KD)Co&CI)}L*ns- z6=pPo^MyZ*fxx3HZosN;dO%_Ka|%=2r|`3syqC~V6-c~&m>m_epvf3l)fY~{b|zXk zee#@F2ti#;&6vbsqx@67zlhz6cz%gynhZ)}t|8z$Y@5bp8rq+N5{ zQN&vg;?g`}uYZP`>8;09#zF#yJ)FBVwSRC)%9HZ$$P8dUlst1>U}0jM%Wrt-+SzTh z)1nkR&hJ_1BeP;H94CM|w?&p_$_FFpYI|tr@5tLNV$V%l7F--S2gw3KBD1`$cevraOdWEPmy66YQw@mve65VNw2# z`GrcKn1`W0vP_*}O;dLUaW1kvfxUkD{`}n}Q=JiF|0VK_j?v(S;dukttmS`yK>lGM-`& zDQI!IB)6EW8_L_H-A>+vI^W8bjw1a2T_Xep89i#XEl8}AtE+V(6PeNKO6={l=p#8m zPFfL|%WvWCJ|$X<&?6y!W;UgS#WR;TL0r*eb`5pLYc@*U-tsB<(9Ey>dRU_+wOA^haJ?9?M+2|dT`6xjJ z)U^+S652jebsrr4&V^`_%&ubOBfuI z=(vaKsO@^jqE;Rk`B0R`hoPr4pJam6Vae^w&FBimpq~mk=>)bS&w^*eWbHSxL3;-w z(U@&yEa`p>r=W6ELeKIIPYSvi>g*G>EH2JvgLFqrjrL>^aRJANmvvByhqUdHjE%~p zt?Br@iogp&umz<-q&6z9oQ(38o^2B^->Gm;9O&(^s9;MAED}aN&Yu6Np={9xHl_N! zSMTS#WXX(*Oj5i>k!qq3e&u{xg+g4?l}e|IY=m zRJ`?&9eN2{Z!nPU6M8Bc)s(L0;u~w?m)AUWx_HKYu(NIDy&Cb#b=TW@FVYnrZ8iSD z)KQt3rQ=p^tTWvgmG@a47JI_=T@QI7)@?2a+K{2)hJ#k{)%bRdv;RkJ=AHZ(%Clw;SS?=?%WS1u2-rg9{s3}f|7D4 zZ-*J6O$D-k?I$N66FhIv4#l-N?YI4uEItH@k}xnGrAwfss~s`zXj%*b(RO%R-pRN$ zHZLouW0?w{sCnh0JgJ!#qegMYN%2$V>byni_C!Xb@Q(PY(x4d2p0c9YpPEU^29I(1;?++iCAmG4k3j_}Qje z$0yQ-h=**Yz`@XT31iTnzFb=`WoD50$wqa{IQ+p(c`7%jxtqQp08 zANP|(sxgRi47^_)ubrVc!$-oK)TQFis|DeH(BVE_GRygljaCgl1(lvWmrIz+b%-E; z)^Z@hT`>6Ti9M zCzHnKqY*V}HA0vzmR>jV{b+0p(dX9Ujf0*zF+Dh~0W074cO)708pF&jF%vbS=H!mb zJ7!sXixUBF61RndLuBzNJO>eC-ZpqKPuS-wD9mlhB?-S5I&O`+wkrSdVn}dQgT8#` zea-nY+&t>J3-vM_xl!uHW6@CEd+$y`FuQd7t?UR_yY4XihE0|>L^;-wLWlXryt~}! zOE_wA%XKTx*SS%YnzsUsF<{|E%bbaOn76ZGPEL3fGL=fk& zHmjtIvcX|oA+@h1ojm1@RhhSc1I43ZcMO&cOEPjaKI|@sN3!$ zr1uKfP1?{0s9Bss5(kj?JNW=RjxJXyt4g>Ii9CUBNO~AZEF|WQBk-RwdN)Wa%8x=i z#zn1|cSDZiDARGBO#{>Tpp~#3|9}b}hG_ILEV8z-r+8m5CZjai z&BngxcwcwkwY=8FtMT-kORw2t>AX)EoF?8t+nhZ2<%H%3ngQ@b?*Y3ubnj=13l^e| z5QS{|BVqqO{=|v%*J1ePYM$>m_zlZdMXg)s86;|d;`@mDd@2wCB5JNjejCQ$sMe6c z@4+3l;^j~}Wq7|>KA%Jc*pWk6%0bOOKN0jKjr5BbDRr)}LUmM%1SFPhO(#6pl}=rX zZJUk!?WLIdK=&9Kmem*4czsQSv^K;^mu<$LeEDpS;;{khz=+lVi!#V8L^RByK-$HQ zRUXEo(YJH`$kK08N;!mjnxv8OrMj4teeDXHFevYHcdhnF zc2Q;y-Z%J^6La)40`H7kRyvrEbY6wm>5)M#D>@Ul*t;a=y%-ZF z6D8`3p|-vcyqR`h|AGhbb>q@eBE`&g!*y9T6j9>R3V!oV7THMst~>km_0nzZT1!wZ z)ED+`v9J04(`@k|aHMm@^$qrD$(Tlnllm4!A@}R@yEuJegeI#*=64ZS z0}K6IZVc0l^3F&BEd`~=NG^5ptPamT&AntVM@EVbe9^al3Gl^u_omIdC+~M(Agppt&B&SLDI|W7phYSd!oI(Z1bdEjxJ%e|e|?`7OXQ)5gZ~V?T`XB(pW4PA-#Pz! zP@BZzJ+xOsUqDM>IDL_@B5@HOTmfy3XNyHVGE);0>6W*zz)D$VfL-L8+ z9lAg9GSBM#BH&Rj@m>(%YG*1|$3jdA&;ZF=ovITjdfmn)Pef*K?E|ZaDWF*FslvKEFsdz=D^vP2t^ok<>gWjJ4Enf+o z8a4f7TjrAVZp_?AxP}k(Duv+>6)@pFTHMdW0XuO^?h2)ZUgH*s$GcNBiCW||0`bMt zh+gEwXK7FWi?|~62z{vhFn4gG7q2-KM69D-8~T7Hf?>7w88X{|AHpZfdm9IpRs5}Qg_7+*M{RI!@6(hMvX({%e~X5 z+DcNl_VP4dWVAfU8rhzAsIJk^USXxiz9A2z`}+OhIn#!o?$%kBzDRXpzPB1mqj&Fht~@zQq1c_>-2Kbig)Av{SsZ4ky0;Z3A1k(&_QK8l8lf?d> z-(}FG%l^uK0vMKMH=o-!NqeVNWuVN&D|2bjYl=xcY-fL2I0_2J!e;bt!O$BssXl7=V^FBtE;C4EW= zLLKUfaB$8q*wa0$MY{B=z`RU*YUg$t=hC{q!eMt!F``ZxmKW0nZHOAOPi<0zrD+D< z7h92nAAWc|%Dz@dxo8Rs;qW3Bpeq308{2|TBvYsYGt~{Kf>BimOmoGLos6E(B!=}? z;%V1ra}!XIlSD-Af zE=jJ&C$JaYbHqA6Fy4a?@XW?g(ZaPbXsdclj2Fa(fz#0+{k}a9os*DU^TXt>1NACu zQwtMQ^SaG&&G8)q9?G!X-oc0=`U&pXsf|ZfVNuexYPVarDj;_EN14Fl(GCBf1j>lMuUCf zcH4#~td8jS^MY5&4Q7>czJx8O<;4btMd611=CCb#0LbOVSy&`=;j-CNXu0+e*TMi? z+x3OIH0m#|)yM^K?P5gG^*{6$)#80cfQtl-DgF^)7;sFzq}Ol!0m9JWT~IlcM*DFs zHuV0&vVixy{a+|Mt0eg@|RaiT)7d7VIts0QkcE=Q988a}hX8 z8Uc9VKl~S9$PvInd1Kl{{xRg@EIc>10k|pC>G4*Zv(8 z;}v9HB^>{^a1d=^pa1_`2s1|W${4iDD+ufg=T2ldsMQyvSKyeh^g|LK&=K(ZaI^wP zlkNx)d(P)7-rPW7R%_}(PW-lmz^X9v0+~w6Q)=eU06&HMZomDW@IFOsu}&(h(s0_7 z8%~<)jsurTJ#d9@Pw_qyidXCYZXMhFR5T$W_5C}v2?qnq>aokcFV$C+Unn>eT33!9 zQpXgc{n^h;uDL&f0|R3lve7bc*;>R@>od?m)^53FC0lcZlbuCtI-O{z2r0Mqh;ry- zD3Dvm$o8k#q#gLeKP0>FzxU2H8KEBWDrH{<0fQP4D1`~B!k3NBLz~~?D`q}ap~uyx z;3JzH=RRXL)Oo*7gOOS+tJmN*IsO+8a3&KM%hKGn2hxW}$Z5#xAUw9T*2qnYe|f7F zSt>)}uQJ%tW63UMI06Ll7P;M0r!LixkOx2eHY2r`Nkh(mUUU-I@83h3CM!O>Q0f35 zZdoInA+}#$=!wl_k)00IC2;II>DHedE>S()&xHE4Ik-woS09War<*eflE1xDS}5r~ z{`AG?zd>K?hkYI&-vfUc*^SiTP;E7T1fIWkeV7tbiKyZz&F8Mutk+@cfjInwY8zK` zzzz7eHlrkhpIZLlHvHfMf`9y&#BW;pyD0_4n<6h27Bk%Z>-D49Kv9|*HByO}?69bY zL0Hz~6!$_8a^J{l(pQ=!bhlu|#w&3DsB5qCwlhSn*E`MF`rgGkE;Hmlb)Yacp4#fi zR+f7~38{6L$%XJxWZ?U~nS8eP*w9goIsp!D&3Y2^L+2-Ot&vyx2lZBko!_~m{Y7q) zKexdw;Ryfw&M#?a>c*8YTV39!AQlb08`FZ%Z?Ysl{Dj?~%8c88~2do<||e8phrxeWthFtTb(lBezI-Sqxy14{+15EOeY=0>qK(gK*sDPJG}8)blK*LgQY( zbXjhVQohx8WbU0u;7<~6E~b1mF--Rm_!c+<*BPhAO=j$Ba#yIgV0SxekTHs_!33M#AEaUDubVd9Ay7~9DIGraa>Ln2#%=lj zvH93XO%HoI(vuxLQif*%dw~Y*Aa(@RQ_GEKA2WZcOXU8R&XXrk^g z?jlpoKb1B&`;o`WBpuB2YD4lK#uCea^472e-iM)=J*TW?+(+NP8jPXR{o_qoHQFXx zBq8BGZe=^z$1*I7i{5r!z z?7etm#BOg!u!KK3b?rkk2^Njw?NI&F>qmN9KFP%=p5*^ed-vVd#M=G~TmdB!qy;I` zTL5VRlp;+6h=CA9EFd)$0ciqC5s(%HOsJtm2p|wdw$f2Sdgw)vvZbTcNH0MtQqJ(~ z?X%YTt+UPxIP35?Gr4Cn$xJ@?_qwl(AbO5{sa{`n+B*=$TMNd8Tw~7Xz34k%iKV;i zeb&wicg@zTsUrb)V-j|)D#L}D44wFvPk0lMYS4_^)WtRaIE~;%H+Gdf(-W&+rgoT>$~0Tr@j6Vkh*7jO7qYtF^4xSB-Lf z;(upp{63?aZyD#yGBIX~eua~j8;3!)A6wZKG}|ngBbq}+S0Yq*l=50na5r0izEIFj z;+SU9Tnp9rN`u+h4wNc7{EHP@nGz&apAn^As5twg`dS=oAIa01GaTeAubl4vCR{Qr zx8uy>MQpVif6g_&8@zqXrNeH>o9lfK=2Pv<<&?S4INn@{ko+BcqW zU~hVx+6;zFSKAdUgt&;%&^JB*o|A1x8pnY9L~uIcS7_Ee3Yh{z6qHKUr006%lpf$b z7vyPDVtIFNhA8RvaJJEhOL`jPWk|eZSgR&%$61g?vzeWxVtpBNFh#+)(%lVzP>W00 zc~CY|os_{GW=SAQwfc{i+0WfvZV8HMwN`Xo9V~}gB6|qi$kd7VMiWV$9l4EkYJ+a& z)>1OB#Q1#GCnC}?laj{^@Cn;@1OO_?t9^0tt)Q|5o}3^dCJ};o@$+3fukSv-!b2L$ z(tB&lbTl<4IHa`1%3W6X105z^BjjT+gz>!fMc=OhR?dNV7+SeiI65jCYsEwZbSgDj zSf9=XZXJH;o-PG)Y%fZl4BZUg*IdU_3ot_=;w2Xjzufkyr*&*96f0^Y*e7`u`o`aP^zs}PYjmCm)^_^mLVz1D z%Lba+KyA34W9Ev3y8PV^zjNcd1cn@lePD;B2haGBd>8p_^SQv~ZaSspYqH3-4BW%$ z7qIdbYigtzqb9AUZ}ogj+ypzv6%Iy5lR-=?E&K;)9jr#I68;wX$OwcV>Bo#~t;Ke> zhPN=$M%;oxx#)d`xY#*fjr=r0eU=fR$qC}G@$k(RtzJ+YJD@YpfC=GRaxEcZ?qoVn zZzIw2jrmp8Co{b>Yz*!&;dhazn%=T1+w(I6L?L>o|q1 zjSsAMyNz!q_dVn(@bauIiH8*$-EQF!7KA^Qum8cU?%U8^&u;%*bo57a00uE^hCyI{ zbsZ4Br{`~@@a-g}215@WimCcr2Sn!PW0o!<(dH|plIrZT?n3^3nm*2)dr6v`ByZrI z$S*i2CnOyAmZ*s4DUI!sTsb{utMugCTgFsp;7Xq}_qQUH?XEsew-m3tyUXcWS`2trtGrJ!yaA495+bX6T_!}870-JPajbsejodPK zpS{d>KMI7ejl&tm<;?zS4;Gk8G$dvEj2c&Re!M!1uLqZ@#KR=xi_`2`O~xJ*vssw4 zrx6U=lcLBsKKLDplgsk`kxq-(WuiRXEZWpW`istf`lmKYNG*@$F@9gX?Y;oOw8~rB z8yH)g4wEKRE>3IP+MC<-Lc&>5AEO%jkB`%8F|6bjgP=Z*AayCNN1=eo-WFJ!w_K9~ z`X6gdru55vyGbL2w1dy27g^N~V)z7W>Xae`iUWK#xa##V;GYub{iF#1yrLd{KVwTF zlZpe7&o2(VKJ(NB4Ihs)6e7S{fbu=EsPO|5@h3ZU+WZ{zJ)S|Xdn;_NWYS`bVbS`Y zMTVEYZpB80YgK<#c(ac}d@-cyie!fLN(qS&$E^lOVm&K4QcZt`8WP3f{ z^fZh*1L~@ZGS(HqB+kv9_Haj?Z@nN4HHP;5zEt0Bcbng^L}o1U%{?CD&3C(Q8XD04 z=Ud!!>j`PCF{A+*{;6|Y$ukvD^eu+!Z9Z(`NDtLck@aU$q#!3N6!@@=&sfTSz&K>M z>5mRq#zP$ZgFCTg-|vNu85cZpYi!U&NaT5}!-BI-k=FQ%Oz<^lA}37}g$yk!(n!9L zrOahHkjc zu!VyQd+|-XnRO)h%=A9)sXSVTfT_u{a;eJAXdJ>IxWw5!B(c6}H1ARm#^yDhZZU)B zF@{QPLFPSMb7R1JhNDgT&4Oy_ncel{@u2o;n zCAP}$2Yyv2i)!()&*px93qgFrEP(QxVld7eIo=-MTZJqWqxAB!tF=P>^xe*GeQ~fs z!_5-%I%{pjj7LZs(OOHx;(IB-Yv8KDnZm<5AtT_~o5pa*9;#+A-)z$C(1=8>qknIQ zKG_G}Pzi>RMKSX~@(v!~cZ&n5rs_x6Fe*%Yc_(x{2@`qZ7MQ0ruXl8JI3ov`zk6Ty zS@C7}5O#vt(YO3CLrXdAiCCz1w3Ty!v4QQiH*T42IxHY;6O$Zwc38&eN$%a*&Og8|RC*`at; z>%s+ra<9`^=MLlf#&D&w-C5P1=Cfr!`ajZqA~vkD61d@~J$Q}h-zZyOXX9Or2*7}a zUqX0md$TF>J7(WiHQ+VE!;ajlCzs{wZ4~j5-E_MWW~bEC24W57fmCa5BMxHaZ+Hje zuGHS>Q6@{PXH**>qbV%2(Gd8smtKfR+CF5Re_m0RMVgmM5KNd*ccU-3xW`+q&z zJo?()QhB7;Cy+_ocmiT;VN%SE#IieARI1G@j2vrI3NQN1P+g3TXHX7<(lFk?t#SSB zD$o-*)NVutt!;UsIm#ma%!{4aNAjbie3U%_q`z+{S9Dc;pd_{xi=FjDJ_KNupPi9T ze!SLW#e?PYp3feWtmTwcW1>be6b;Xi|H>t`)Ye*a)r=4=Po4OQdiL2*chAJp`dv#n zPP+^5kpbL?Gt@ah%ZDLi6@iYe$hH|i>*O~U7#PblFL@M8h`Uy!S-q`H{W$xAZPWDw zTT4M<|O9E5QOm**0NhM_H)FU|~sBgVI^9*;Y_3yx4t|$JpDxX_ME4ihEBQ3K^vQ0lsDp5zULO!$-bNA{0MoBIq2&?Ug1VE z#euIc*G*k%FH#2m?)jHRdj`a*2P?CVopKADxiRwcx`fJDck7R#objsI_IQ!6^+?-h zu-kjdL)qTDuIu**6!K)}TGAvp7CsnnTZV1S>})`+{3Vt&Es5SLAMY`q99l|A8>SqU z<90PeoWi$gqO2Ow_8{=4eJ-4Ye+{%dv=5gwyG#_OI0r}fPe#MQcUybd(ye`m!Cm9Fen$`_4z zXJ4eQX#u6iE}xg3(dF~M_8ttD1Efh7i#|K?u1aq-@q63c4XFUO#35BraW&m-#g_@J(>&yrb_>8} zVYvU;tms=-<6f%O4^BAq9O02}nIta|>e^DdIvsfc6mJKG_|!N7$Km5zvHaVHW?3V< z=cyjRb9d>+;ul3($aHe28&Y5~%PKC*BKdqrqN_o~%GI?2bj^)+w|mAxJS}q)E;SLR z9l!h3EVr^@)&VB1gkK{jSAFFc6WmezzCAJ@COt+%!0#wQ3X~MK?=6#tnfB$k z7M__!HpX~9i={JzDEt#Hl?^+?q>bcEx2S(ivlqWBQ}>9|`Crfj98U-E7RH?UK%+ly z_%#J!!A~R>E53(>g$s*>e%7>*FRy@HzywYmzpK_9}iUm=+R}T z!QxLMHt!@6``6kd$3NUT2E6d=$zzYYKZ)2Ez_8zZYEJp1nJy=q`Tqw2frb4a&IAz5 zuoBf!ct5k46ldAaF?nY|PfWvjpk%?nw^~dCIdDZ3SnDu03Fu~l$#UF0=r(v-NLqg! zw{kVjH;-{jR8-wI%lQgcq^KG zz2(c5=f(}j?hLRd#R=@svwpM5keUy===Ia;3NW^S{~3Lqc1qn&+5Xs#*l(_7Uf-ZFsy&?Y66CEE$9I5U;B=GuGtutDXBGO5Z*m5g$Z zAiUwd+C+>jGtzGUg<{TOjV5g%-`b+uz0^ZzH({C|Q=JxSx)O3Vva)@2Py|4z!>QY7 zL|@|L-j^0T4=Xm>rz*hv5ielc@4lY|QXsx}pr7g#Yx&o4`SXK|Zjo(My`$LyJ?Z<3`rx~JIeA0#E zI--;1`JP?Xw=#@%+AsffvFAGs+MBx~6lCGi1FgPU)ekK-IAO>iXq=Z#5)dhk(r(J{ z1|p@>XKMFmfTtVbeID_V1?TE-S3$I>d@hW@xmRurN+(k#fA~d%T6e$>8{fV&Q zw&ujhR5bWyuSt;r@t2wI_7@3i{w9#+o%X|ZE6p2Cu9Bpt5^8Yn3nGZ|xi6OLo7bxP zIV+2x$X~>=qZ#RsOKAuUES@#ykwb4nmC?~?<^Y#HZR7Rl*ns0W(KlSf(Y*WaHA5V2 z53H5P$V72WyT4;zv;XuZia}9H&Ayy~R5JI6H!)9e4I8`_VNG$3%v(Y9Wpu0#6jM%OvHsLLJ!r7HSJ0FUwxUBXn$I!WF+&u zSX1=o`b3AX120<}Q~RPT5`XW%A^sdX^}3H{_m95PEly$S3ebU$E3{T4-ht zC5ycA%rWhAF0UOnlRq~$WaRJR7Tq*hfCroK%0ucWj3DrQ-h68IJUJp1K*dP~02PH^ zvD~ptY&-y3%cXa{T3un369b2}33GfaSf^^LhImtt)dGrs00~fg`MincUO0>Y=`N`@ zUhBVta9#rNXem_J7vP%MkM_lzO|%hOF@dv}Ijxm2Vj=OQH6i5luZ4XFDmpWrmiD+o z8%uz{oc1qpfWWl`M~MQtwud}!A(I3IT!j>iUgwviG} zV8H)=eN#XBh5FZYIUxIIJF#UYduQQTD-+HjeI)&GW#(JD%y-AZjnL9ra$tB>w3M$* zm9-AR_Oe%hn#Zx3Z9S3kl3G_fOsF~@#(0*6wlAEEvqrK7VMIvoYcBdszLDfgT;Q6K z|JMqK3OeoKD!EX$&8fLnu%9~CUfQ84Ix; z%KL96Ppd9r{2hT*fMuGgc=YreCx9M}zaN?Nm`^O)>_(PylSwWHN`C|A@0y^HH0x%7 zRi2e}l7A&vUvMO1oJ%eeJo~D4!}dwYSjZT@v(x9NfCwZv*t6=Xmk2}w zy%U<_W~d^~>E`Qh)o!1`hAiaaKSjPEgq*RS8ch&bb?6_J;jUvjcLhC=y26z`Z7r*D zvO=P5Xge^c3rEocA zwo&Hpey`SDcob96tSrD~zn0YR3ocxL7r8BrsS#JAZw`5E?8Vf0wd06pMD zWMigY&)r*Kr4oarIDSu9Tz5X_DKU=^ffG`$3a{x9SoQ^zBRJVjw#wOG9~wP08;YfD zq@Pyz^qRiYx_mKMQI{|j7no*$^{4^+r1r=*FUhl@=3@0cGy#NxfsN_Umie-p#+kWh zz`(-?#slGX(Xbr;`9h)@4AI!amBML#N}U_@MxFt(WJDueOC?4*_uWJ%F^G2k6R+HO z^j-!dU%Wy18w1W=IlO>|??zcEhQF+3K*fA1@V@}+?2$qmthceC%Wq`n+GH%y2Z2me zII$8_q>jENNSC=TVdFrZ9rH1C!!2vLmEl~cWV1b4z2$9ERN5OU_*O{8ocEfDLrYr} z@iOMzx^-bd$Hvog`TKI{f!3?F>KssOsF7_1$QF|hS2D?0xxy-x#R7HQ4gI}Y`u#64 zOE~VLC%tw2Kv9;mG6xoPzQt+!Y5OD}KfdZ?eBgU1a?JbUL##8NVrvo)etwbG*qh(_ z6zb~So-&UNa!dtcFirgtVFqeQ@kWeHwqFoF=>qZ=w|NqxL}}^rvjlJiXc~e3R^NFo zlWh9@Y%^^;q6EabeE~YeT+)|tRmSz%W$@=lbJ;ygT%>_Wmp{MYu$hu+Akv;*Af3@ zHdUNH(xC&Oy6@JI7e?3z>O7m{?e^iO;mZ|^x`u)o@XkKr?bW1bbP8PTt7k7y6u4B zRu;2RZE@P7%((qP+LKbsZPt=gAlBu-$v_RF9*}S>!%M`U(Z4|ck_hVv*IVI6!|lYL zC;MrYUSo}izD6!+?rf5!eH&J8j#%Lh8$B}Su4;<&f9_RN#_-ZYSrhy?5^l7^^#jVj zmyNI9~?7Y}0auQR*y5wmV2(ttAwH^QA}xuXgL_Oo6wP&gdkc z*VaVqT)9rpaPgQ#|1Y2t3@nUK-xU0@G1=i^T#^El*<;s|mnAY)0TN*_nwW}YzCI@T zZbYt9Ja|WMa!=D9qTMyq;pL6G_46k|(15EQ1O0t+(|A>MkO~PG9`RD3Z_+8I7k)vM zTboTeobzuCQw_DHSo^01SZ=fC2*HKrwN(3`-;5CVd7%WX%y7eD9_VpV7NVYp!Luat zQpCd8(dXz}?#(qNWM~ga^YAKh&xM-sPfYg^+ff@Hyj!CxaOC91^=T`+yinWeJzR<- z1HS$pw{qf$VMaII@r9QUwA$!i8-{l7_lqNbPw76LjQl#~>Q%mcZIPUf_wbcnbRACC zJbt?9QG=k*zIF8%=YXSf5jW~?d~=CN-EZO1ap7Yj_rTD~zCMyvOR&q^gZFChVi<-# z%dV&VQVUw;qZhY!N@N<-zPfa8Ky2$1pP0K}XrMst#0HK(X9kB3Aij!K84U{-W4ZQ6WJ=9owY_f<~Ml|G6@45U|MtoF3ULC$bqAivU z-gz<*OQrCOX3lF2WcsB(&5ws93-*?fA4)6Z&n|M);JpVqVT10h>Q|5uua&(N4%yv1C!nqkRa_+$CD0L|B2 zvo@)}4&FV^oBhh>3k)miC`f$q{J3Geq9&6~pj;RvRSJRP0`5hWy) z4tG9!oz>bhbIAbI=|c)?Gk>Bvo39`4Qt_O44qZ;~49*r%K#3dg^5p^$bs_v`{^7YXS z-dWE!aPp6OoMx5(ZOVL1OP3Z{#EgGNbv~Q}sMM=2-j`9hzUT36FN~l9ADi}fS%&(0 z^?_ZO+=plHmFEF<(|IxaJ<3a`x?ej{sO8Hqqrc^mOcfqHw0Cv>wq4f{dnLQ>&Zn<^ z`Q29LPlxLli-tL%!HfHv5HnzPPJVo=;drfKqfzhjHs@Y{1Myn+T;u1Ak^8H^i8L;* zPPLD*3A*>Dv<0j+jryaK)?I|Z3v5zHU}5K>Fg>(4B{}07FENOFW>@r__tQ{IOmt-5 z_?4>O&0h(;Hx7t&7AVo=^-C{59+U-p0`qKv9g4zH;Y5hH)WbcA;Bj~KKw9#;6qsd9 ztS>f*GwvhBv;K+<;2alN3Aw;SUYzcAYnBunqWbhan%C2Mu3*X@O>#qV%{NF@ttyccILZ-2Kv+T(KF<0WdFW#PAfn z+ayP)#@q3EvPN5ACw4civOR8~ED#ZutSa%gnA(>=`AmG(_wM2s>bt{Uyd1lp>wbjBF2D}oF}@dY z_=B2X^cu+|Y=V~ZpV6Cf1DcqU^DE+CJZz-<1Z?w|b&K-f(F5&|(d7z5&l3LZ_8KR! zjV%0V;?L-99Zv-J`55y*tO^AB{{Klq{=aup!j9>?U(ZGdp4p~31^glOP`br%+wlJd Du-X6% literal 0 HcmV?d00001 diff --git a/test/test-data/reference/measure-win-firefox.png b/test/test-data/reference/measure-win-firefox.png new file mode 100644 index 0000000000000000000000000000000000000000..006f241d0bf1572ce27487464d04f2857d4fb3f5 GIT binary patch literal 37142 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 Date: Tue, 29 Apr 2025 13:18:43 +0200 Subject: [PATCH 5/9] feat: Implement correct calculation of all text metrics --- test/test-data/reference/measure-freetype.png | Bin 0 -> 36235 bytes test/test-data/reference/measure-win.png | Bin 0 -> 28470 bytes wrapper/src/AlphaSkiaCanvas.cpp | 77 +++++++++++------- 3 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 test/test-data/reference/measure-freetype.png create mode 100644 test/test-data/reference/measure-win.png diff --git a/test/test-data/reference/measure-freetype.png b/test/test-data/reference/measure-freetype.png new file mode 100644 index 0000000000000000000000000000000000000000..0eb2ecf4a2eb43746ff4bfd89ed28768caf8acbb GIT binary patch literal 36235 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 literal 0 HcmV?d00001 diff --git a/test/test-data/reference/measure-win.png b/test/test-data/reference/measure-win.png new file mode 100644 index 0000000000000000000000000000000000000000..7299f3e3a70948aa7713e56fa608a6db915c2b51 GIT binary patch literal 28470 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 literal 0 HcmV?d00001 diff --git a/wrapper/src/AlphaSkiaCanvas.cpp b/wrapper/src/AlphaSkiaCanvas.cpp index b7f2e99..737b421 100644 --- a/wrapper/src/AlphaSkiaCanvas.cpp +++ b/wrapper/src/AlphaSkiaCanvas.cpp @@ -52,21 +52,6 @@ std::pair typo_ascender_and_descender(SkTypeface *typeface) return std::make_pair(0, 0); } -const uint32_t layoutUnitFractionalBits_ = 6; -const int fixedPointDenominator_ = 1 << layoutUnitFractionalBits_; - -int float_to_layout_unit(float value) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&ss=chromium%2Fchromium%2Fsrc - return static_cast(roundf(value * fixedPointDenominator_)); -} - -float layout_unit_to_float(int value) -{ - // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/geometry/layout_unit.h;l=147;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=FromFloatRound&sq=&ss=chromium%2Fchromium%2Fsrc return static_cast(roundf(value * kFixedPointDenominator)) - return static_cast(value) / fixedPointDenominator_; -} - bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_ascent, float typo_descent, int &ascent, int &descent) { // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=422;drc=5a2e12875a8fe207bfe6f0febc782b6297788b6d;bpv=1;bpt=1?q=NormalizedTypoAscentAndDescent&ss=chromium%2Fchromium%2Fsrc @@ -76,8 +61,8 @@ bool try_set_normalized_typo_ascent_and_descent(float em_height, float typo_asce return false; } - ascent = float_to_layout_unit(typo_ascent * em_height / height); - descent = float_to_layout_unit(em_height) - ascent; + ascent = typo_ascent * em_height / height; + descent = em_height - ascent; return true; } @@ -334,22 +319,51 @@ AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int te break; } - auto lineOffset = line0.offset(); - float actual_bounding_box_left = -lineOffset.fX + text_align_dx_; - float actual_bounding_box_right = (lineOffset.fX + line0.width()) - text_align_dx_; - SkFont font = paragraph->getFontAt(0); - SkFontMetrics font_metrics; font.getMetrics(&font_metrics); + const float ascent = float_ascent(font_metrics); const float descent = float_descent(font_metrics); - const float baseline_y = get_font_baseline(font, baseline, true); + float baseline_y = get_font_baseline(font, baseline, false); + + auto lineOffsetX = line0.offset().fX; + + float actual_bounding_box_ascent = 0; + float actual_bounding_box_descent = 0; + + line0.iterateThroughVisualRuns( + false, + [&](const skia::textlayout::Run *run, SkScalar runOffsetInLine, skia::textlayout::TextRange textRange, SkScalar *runWidthInLine) + { + if (run->size() > 0) + { + std::vector bounds; + bounds.resize(run->size()); + run->font().getBounds(&run->glyphs()[0], run->size(), bounds.data(), nullptr); + + for (size_t i = 0; i < run->size(); i++) + { + if(bounds[i].fTop < actual_bounding_box_ascent) { + actual_bounding_box_ascent = bounds[i].fTop; + } + + if(bounds[i].fBottom > actual_bounding_box_descent) { + actual_bounding_box_descent = bounds[i].fBottom; + } + + } + } + return true; + }); + + actual_bounding_box_ascent = std::abs(actual_bounding_box_ascent); + + float actual_bounding_box_left = -lineOffsetX + text_align_dx_; + float actual_bounding_box_right = (lineOffsetX + line0.width()) - text_align_dx_; float font_bounding_box_ascent = ascent - baseline_y; float font_bounding_box_descent = descent + baseline_y; - float actual_bounding_box_ascent = -lineOffset.fY - baseline_y; - float actual_bounding_box_descent = (lineOffset.fY + line0.height()) + baseline_y; int normalizedAscent = 0; int normalizedDescent = 0; @@ -358,8 +372,10 @@ AlphaSkiaTextMetrics *AlphaSkiaCanvas::measure_text(const char16_t *text, int te float em_height_descent = normalizedDescent + baseline_y; // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/html/canvas/text_metrics.cc;l=174;drc=1d737975521c1d4191937c2c659bd78d9f1681f4;bpv=0;bpt=1 float hanging_baseline = ascent * kHangingAsPercentOfAscent / 100.0f - baseline_y; - float alphabetic_baseline = line0.alphabeticBaseline(); - float ideographic_baseline = line0.ideographicBaseline(); + + // TODO: Read baselines value from OpenType Table. https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/fonts/simple_font_data.cc;l=229;drc=73bcf25e4b0c06b1a86422a2fc30023c7b850f33;bpv=1;bpt=1 + float alphabetic_baseline = -baseline_y; + float ideographic_baseline = -descent - baseline_y; return new AlphaSkiaTextMetrics( width, @@ -415,20 +431,21 @@ float AlphaSkiaCanvas::get_font_baseline(const SkFont &font, alphaskia_text_base case alphaskia_text_baseline_middle: // kMiddleTextBaseline { normalized_typo_ascent_and_descent(font, ascent, descent); - auto middle = (layout_unit_to_float(ascent) - layout_unit_to_float(descent)) / 2.0f; + auto middle = (ascent - descent) / 2.0f; baselineOffset = middle; break; } case alphaskia_text_baseline_bottom: // kBottomTextBaseline normalized_typo_ascent_and_descent(font, ascent, descent); - baselineOffset = -layout_unit_to_float(descent); + baselineOffset = -descent; break; } // SkParagraph defines its baseline() as (fLeading / 2 - fAscent) // see: Run.h -> InternalLineMetrics::baseline() // we reset this here - if(correctSkParagraphBaseline) { + if (correctSkParagraphBaseline) + { const float skParagraphBaseline = metrics.fLeading / 2 + float_ascent(metrics); baselineOffset -= skParagraphBaseline; } From a884fe44b466f5aa2e1d6463b040464dcdd40ed5 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 29 Apr 2025 13:33:42 +0200 Subject: [PATCH 6/9] build: Linux getenv --- test/native/src/main.cpp | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/native/src/main.cpp b/test/native/src/main.cpp index e403da3..b4b3671 100644 --- a/test/native/src/main.cpp +++ b/test/native/src/main.cpp @@ -335,16 +335,7 @@ void measure_text_draw(alphaskia_canvas_t canvas, bool isDebug() { - std::string var; - size_t requiredSize; - - getenv_s(&requiredSize, nullptr, 0, "ALPHASKIA_TEST_DEBUG"); - if (requiredSize == 0) - { - return false; - } - - return true; + return getenv("ALPHASKIA_TEST_DEBUG"); } int measure_test(const std::filesystem::path &repository_root, const std::filesystem::path &test_data_path, bool isFreeType) From 1d77b7d94c2f51451472a12791b960738b5225db Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 29 Apr 2025 13:41:29 +0200 Subject: [PATCH 7/9] build: fix JNI compilation --- lib/java/jni/src/AlphaSkiaCanvas.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/java/jni/src/AlphaSkiaCanvas.cpp b/lib/java/jni/src/AlphaSkiaCanvas.cpp index 9590a1a..7355827 100644 --- a/lib/java/jni/src/AlphaSkiaCanvas.cpp +++ b/lib/java/jni/src/AlphaSkiaCanvas.cpp @@ -221,7 +221,7 @@ extern "C" { env->ThrowNew(env->FindClass("java/lang/IllegalStateException"), "Could not find 'int getValue' on text align"); } - return; + return nullptr; } jmethodID baselineGetValue = env->GetMethodID(env->GetObjectClass(baseline), "getValue", "()I"); @@ -231,7 +231,7 @@ extern "C" { env->ThrowNew(env->FindClass("java/lang/IllegalStateException"), "Could not find 'int getValue' on text baseline"); } - return; + return nullptr; } alphaskia_text_align_t nativeTextAlign = static_cast(env->CallIntMethod(text_align, textAlignGetValue)); From 45195569d10e645bba37261dd35e50ddaa8c2e27 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 29 Apr 2025 13:41:37 +0200 Subject: [PATCH 8/9] test: update linux and macos reference image --- test/test-data/reference/measure-linux.png | Bin 0 -> 36242 bytes test/test-data/reference/measure-macos.png | Bin 0 -> 34165 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/test-data/reference/measure-linux.png create mode 100644 test/test-data/reference/measure-macos.png diff --git a/test/test-data/reference/measure-linux.png b/test/test-data/reference/measure-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..3c702f31a2ea575a44a182df4d536a4e7ced1a2a GIT binary patch literal 36242 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 DcnF+n literal 0 HcmV?d00001 From b98592d6a429e3e7f8660ad49d4dbe74332a98c9 Mon Sep 17 00:00:00 2001 From: Danielku15 Date: Tue, 29 Apr 2025 13:52:33 +0200 Subject: [PATCH 9/9] build: fix c# and node errors --- lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs | 2 +- lib/dotnet/AlphaSkia/NativeMethods.cs | 2 +- lib/node/alphaskia/src/AlphaSkiaTextStyle.ts | 4 ++-- lib/node/alphaskia/src/addon.ts | 12 ++++++------ 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs b/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs index 9044ec9..52bc354 100644 --- a/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs +++ b/lib/dotnet/AlphaSkia/AlphaSkiaTextMetrics.cs @@ -6,7 +6,7 @@ namespace AlphaSkia; ///

public sealed class AlphaSkiaTextMetrics : AlphaSkiaNative { - private AlphaSkiaTextMetrics(IntPtr handle) + internal AlphaSkiaTextMetrics(IntPtr handle) : base(handle, NativeMethods.alphaskia_text_metrics_free) { } diff --git a/lib/dotnet/AlphaSkia/NativeMethods.cs b/lib/dotnet/AlphaSkia/NativeMethods.cs index 4dde57e..67d0666 100644 --- a/lib/dotnet/AlphaSkia/NativeMethods.cs +++ b/lib/dotnet/AlphaSkia/NativeMethods.cs @@ -172,7 +172,7 @@ public static extern void alphaskia_canvas_fill_text(alphaskia_canvas_t canvas, AlphaSkiaTextBaseline baseline); [DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)] - public static extern float alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, + public static extern alphaskia_text_metrics_t alphaskia_canvas_measure_text(alphaskia_canvas_t canvas, [MarshalAs(UnmanagedType.LPWStr)] string text, int text_length, diff --git a/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts b/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts index c947125..9eea5be 100644 --- a/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts +++ b/lib/node/alphaskia/src/AlphaSkiaTextStyle.ts @@ -30,8 +30,8 @@ export class AlphaSkiaTextStyle extends AlphaSkiaNative