Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion build/Build.LibAlphaSkia.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,8 @@ partial class Build
"../../wrapper/src/alphaskia_canvas.cpp",
"../../wrapper/src/alphaskia_image.cpp",
"../../wrapper/src/alphaskia_typeface.cpp",
"../../wrapper/src/alphaskia_data.cpp"
"../../wrapper/src/alphaskia_data.cpp",
"../../wrapper/src/alphaskia_string.cpp"
]
if (is_win) {
alphaskia_wrapper_sources += [ "../../wrapper/src/alphaskia.rc" ]
Expand Down
40 changes: 38 additions & 2 deletions lib/dotnet/AlphaSkia/AlphaSkiaTypeface.cs
Original file line number Diff line number Diff line change
@@ -1,11 +1,47 @@
namespace AlphaSkia;
using System.Text;

namespace AlphaSkia;

/// <summary>
/// Represents a typeface to draw text.
/// </summary>
public sealed class AlphaSkiaTypeface : AlphaSkiaNative
{
private readonly AlphaSkiaData? _nativeData;
private string? _fontFamily;

/// <summary>
/// Gets the name of the font family of this typeface.
/// </summary>
public string FamilyName
{
get
{
if (_fontFamily == null)
{
var skFamilyName = NativeMethods.alphaskia_typeface_get_family_name(Handle);
var skFamilyChars = NativeMethods.alphaskia_string_get_utf8(skFamilyName);
var skFamilyLength = NativeMethods.alphaskia_string_get_length(skFamilyName);
unsafe
{
_fontFamily = Encoding.UTF8.GetString((byte*)skFamilyChars.ToPointer(), (int)skFamilyLength);
}
NativeMethods.alphaskia_string_free(skFamilyName);
}

return _fontFamily;
}
}

/// <summary>
/// Gets a value indicating whether the typeface is bold.
/// </summary>
public bool IsBold => NativeMethods.alphaskia_typeface_is_bold(Handle) != 0;

/// <summary>
/// Gets a value indicating whether the typeface is italic.
/// </summary>
public bool IsItalic => NativeMethods.alphaskia_typeface_is_italic(Handle) != 0;

private AlphaSkiaTypeface(IntPtr handle, AlphaSkiaData? nativeData = null)
: base(handle, NativeMethods.alphaskia_typeface_free)
Expand Down Expand Up @@ -40,7 +76,7 @@ protected override void Dispose(bool disposing)

return new AlphaSkiaTypeface(typeface, nativeData);
}

/// <summary>
/// Creates a typeface using the provided information.
/// </summary>
Expand Down
3 changes: 2 additions & 1 deletion lib/dotnet/AlphaSkia/GlobalUsings.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
global using alphaskia_typeface_t = System.IntPtr;
global using alphaskia_image_t = System.IntPtr;
global using alphaskia_canvas_t = System.IntPtr;
global using alphaskia_data_t = System.IntPtr;
global using alphaskia_data_t = System.IntPtr;
global using alphaskia_string_t = System.IntPtr;
13 changes: 13 additions & 0 deletions lib/dotnet/AlphaSkia/NativeMethods.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,22 @@ internal static class NativeMethods
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern void alphaskia_data_free(alphaskia_data_t data);

[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr alphaskia_string_get_utf8(alphaskia_string_t str);
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern ulong alphaskia_string_get_length(alphaskia_string_t str);
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern void alphaskia_string_free(alphaskia_string_t str);


[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern alphaskia_typeface_t alphaskia_typeface_register(alphaskia_data_t data);
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern alphaskia_string_t alphaskia_typeface_get_family_name(alphaskia_typeface_t typeface);
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern byte alphaskia_typeface_is_bold(alphaskia_typeface_t typeface);
[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern byte alphaskia_typeface_is_italic(alphaskia_typeface_t typeface);

[DllImport(AlphaSkiaNativeLibName, CallingConvention = CallingConvention.Cdecl)]
public static extern void alphaskia_typeface_free(alphaskia_typeface_t type_face);
Expand Down
24 changes: 24 additions & 0 deletions lib/java/jni/include/net_alphatab_alphaskia_AlphaSkiaTypeface.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions lib/java/jni/src/AlphaSkiaTypeface.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "../include/net_alphatab_alphaskia_AlphaSkiaTypeface.h"
#include "../include/JniHelper.h"
#include "../../../../wrapper/include/alphaskia.h"

extern "C"
Expand All @@ -21,4 +22,30 @@ extern "C"
env->ReleaseStringUTFChars(name, nativeName);
return static_cast<jlong>(reinterpret_cast<std::uintptr_t>(typeface));
}

JNIEXPORT jboolean JNICALL Java_net_alphatab_alphaskia_AlphaSkiaTypeface_isBold(JNIEnv *env, jobject instance)
{
jlong handle = get_handle(env, instance);
uint8_t is_bold = alphaskia_typeface_is_bold(reinterpret_cast<alphaskia_typeface_t>(handle));
return static_cast<jboolean>(is_bold != 0);
}

JNIEXPORT jboolean JNICALL Java_net_alphatab_alphaskia_AlphaSkiaTypeface_isItalic(JNIEnv *env, jobject instance)
{
jlong handle = get_handle(env, instance);
uint8_t is_italic = alphaskia_typeface_is_italic(reinterpret_cast<alphaskia_typeface_t>(handle));
return static_cast<jboolean>(is_italic != 0);
}

JNIEXPORT jstring JNICALL Java_net_alphatab_alphaskia_AlphaSkiaTypeface_loadFamilyName(JNIEnv *env, jclass, jlong handle)
{
alphaskia_string_t family_name = alphaskia_typeface_get_family_name(reinterpret_cast<alphaskia_typeface_t>(handle));

const char* family_name_chars = alphaskia_string_get_utf8(family_name);
jstring java_family_name = env->NewStringUTF(family_name_chars);

alphaskia_string_free(family_name);

return java_family_name;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,32 @@
public class AlphaSkiaTypeface extends AlphaSkiaNative {
private final AlphaSkiaData data;

private String familyName;

/**
* Gets the name of the font family of this typeface.
*
* @return The name of the font family of this typeface
*/
public String getFamilyName() {
if(this.familyName == null){
this.familyName = AlphaSkiaTypeface.loadFamilyName(this.handle);
}
return this.familyName;
}

/**
* Gets a value indicating whether the typeface is bold.
* @return true if the font is bold, otherwise false.
*/
public native boolean isBold();

/**
* Gets a value indicating whether the typeface is italic.
* @return true if the font is italic, otherwise false.
*/
public native boolean isItalic();

private AlphaSkiaTypeface(long handle, AlphaSkiaData data) {
super(handle);
this.data = data;
Expand All @@ -21,10 +47,12 @@ public void close() {
handle = 0;
}

private static native String loadFamilyName(long handle);
private native void release(long handle);

/**
* Register a new custom font from the given binary data containing the data of a font compatible with Skia (e.g. TTF).
*
* @param data The raw binary data of the font.
* @return The loaded typeface to use for text rendering or {@code null} if the loading failed.
*/
Expand All @@ -42,8 +70,9 @@ public static AlphaSkiaTypeface register(byte[] data) {

/**
* Creates a typeface using the provided information.
* @param name The name of the typeface.
* @param bold Whether the bold version of the typeface should be loaded.
*
* @param name The name of the typeface.
* @param bold Whether the bold version of the typeface should be loaded.
* @param italic Whether the italic version of the typeface should be loaded.
* @return The typeface if it can be found in the already loaded fonts or the system fonts, otherwise {@code null}.
*/
Expand Down
54 changes: 54 additions & 0 deletions lib/node/addon/addon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,56 @@ static napi_value node_alphaskia_typeface_make_from_name(napi_env env, napi_call
return wrapped;
}

static napi_value node_alphaskia_typeface_get_family_name(napi_env env, napi_callback_info info)
{
napi_status status(napi_ok);

CHECK_ARGS(1);
GET_ARGUMENT_HANDLE(0, alphaskia_typeface_t, typeface);
alphaskia_string_t string = alphaskia_typeface_get_family_name(typeface);

const char *utf8Bytes = alphaskia_string_get_utf8(string);
uint64_t stringLength = alphaskia_string_get_length(string);

napi_value family_name;
status = napi_create_string_utf8(env, utf8Bytes, stringLength, &family_name);
ASSERT_STATUS();

alphaskia_string_free(string);

return family_name;
}

static napi_value node_alphaskia_typeface_is_bold(napi_env env, napi_callback_info info)
{
napi_status status(napi_ok);

CHECK_ARGS(1);
GET_ARGUMENT_HANDLE(0, alphaskia_typeface_t, typeface);
uint8_t is_bold = alphaskia_typeface_is_bold(typeface);

napi_value node_is_bold;
status = napi_get_boolean(env, is_bold != 0, &node_is_bold);
ASSERT_STATUS();

return node_is_bold;
}

static napi_value node_alphaskia_typeface_is_italic(napi_env env, napi_callback_info info)
{
napi_status status(napi_ok);

CHECK_ARGS(1);
GET_ARGUMENT_HANDLE(0, alphaskia_typeface_t, typeface);
uint8_t is_italic = alphaskia_typeface_is_italic(typeface);

napi_value node_is_italic;
status = napi_get_boolean(env, is_italic != 0, &node_is_italic);
ASSERT_STATUS();

return node_is_italic;
}

static napi_value node_alphaskia_image_get_width(napi_env env, napi_callback_info info)
{
napi_status status(napi_ok);
Expand Down Expand Up @@ -783,6 +833,10 @@ napi_value init(napi_env env, napi_value exports)
EXPORT_NODE_FUNCTION(alphaskia_typeface_register);
EXPORT_NODE_FUNCTION(alphaskia_typeface_free);
EXPORT_NODE_FUNCTION(alphaskia_typeface_make_from_name);
EXPORT_NODE_FUNCTION(alphaskia_typeface_get_family_name);
EXPORT_NODE_FUNCTION(alphaskia_typeface_is_bold);
EXPORT_NODE_FUNCTION(alphaskia_typeface_is_italic);

EXPORT_NODE_FUNCTION(alphaskia_image_get_width);
EXPORT_NODE_FUNCTION(alphaskia_image_get_height);
EXPORT_NODE_FUNCTION(alphaskia_image_read_pixels);
Expand Down
29 changes: 28 additions & 1 deletion lib/node/alphaskia/src/AlphaSkiaTypeface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,33 @@ import { AlphaSkiaTypefaceHandle, loadAddon } from './addon';
export class AlphaSkiaTypeface extends AlphaSkiaNative<AlphaSkiaTypefaceHandle> {
#data: AlphaSkiaData | undefined;

#familyName: string | undefined = undefined;

/**
* Gets the name of the font family of this typeface.
*/
public get familyName(): string {
if (this.#familyName === undefined) {
this.#familyName = loadAddon().alphaskia_typeface_get_family_name(this.handle!);
}

return this.#familyName;
}

/**
* Gets a value indicating whether the typeface is bold.
*/
public get isBold(): boolean {
return loadAddon().alphaskia_typeface_is_bold(this.handle!);
}

/**
* Gets a value indicating whether the typeface is italic.
*/
public get isItalic(): boolean {
return loadAddon().alphaskia_typeface_is_italic(this.handle!);
}

/**
* @internal
*/
Expand Down Expand Up @@ -39,7 +66,7 @@ export class AlphaSkiaTypeface extends AlphaSkiaNative<AlphaSkiaTypefaceHandle>
loadAddon().alphaskia_data_free(nativeData);
return undefined;
}

return new AlphaSkiaTypeface(typeface, new AlphaSkiaData(nativeData));
}

Expand Down
7 changes: 5 additions & 2 deletions lib/node/alphaskia/src/addon.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,11 @@ export interface AlphaSkiaNodeAddon {
alphaskia_data_free(data: AlphaSkiaDataHandle): void;

alphaskia_typeface_register(data: AlphaSkiaDataHandle): AlphaSkiaTypefaceHandle | undefined;
alphaskia_typeface_free(type_face: AlphaSkiaTypefaceHandle): void;
alphaskia_typeface_free(typeface: AlphaSkiaTypefaceHandle): void;
alphaskia_typeface_make_from_name(name: string, bold: boolean, italic: boolean): AlphaSkiaTypefaceHandle | undefined;
alphaskia_typeface_get_family_name(typeface: AlphaSkiaTypefaceHandle): string;
alphaskia_typeface_is_bold(typeface: AlphaSkiaTypefaceHandle): boolean;
alphaskia_typeface_is_italic(typeface: AlphaSkiaTypefaceHandle): boolean;

alphaskia_image_get_width(image: AlphaSkiaImageHandle): number;
alphaskia_image_get_height(image: AlphaSkiaImageHandle): number;
Expand Down Expand Up @@ -111,7 +114,7 @@ export interface AlphaSkiaNodeAddon {
alphaskia_canvas_fill(canvas: AlphaSkiaCanvasHandle): void;
alphaskia_canvas_stroke(canvas: AlphaSkiaCanvasHandle): void;
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, typeface: AlphaSkiaTypefaceHandle, font_size: number, x: number, y: number, text_align: AlphaSkiaTextAlign, baseline: AlphaSkiaTextBaseline): void;
alphaskia_canvas_measure_text(canvas: AlphaSkiaCanvasHandle, text: string, typeface: AlphaSkiaTypefaceHandle, font_size: number): number;
alphaskia_canvas_begin_rotate(canvas: AlphaSkiaCanvasHandle, center_x: number, center_y: number, angle: number): void;
Expand Down
12 changes: 10 additions & 2 deletions wrapper/include/alphaskia.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,18 @@ extern "C"
AS_API uint64_t alphaskia_data_get_length(alphaskia_data_t data);
AS_API void alphaskia_data_free(alphaskia_data_t data);

typedef AS_API void *alphaskia_string_t;
AS_API const char* alphaskia_string_get_utf8(alphaskia_string_t string);
AS_API uint64_t alphaskia_string_get_length(alphaskia_string_t string);
AS_API void alphaskia_string_free(alphaskia_string_t string);

typedef AS_API void *alphaskia_typeface_t;
AS_API alphaskia_typeface_t alphaskia_typeface_register(alphaskia_data_t data);
AS_API void alphaskia_typeface_free(alphaskia_typeface_t type_face);
AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *name, uint8_t bold, uint8_t italic);
AS_API void alphaskia_typeface_free(alphaskia_typeface_t typeface);
AS_API alphaskia_typeface_t alphaskia_typeface_make_from_name(const char *family_name, uint8_t bold, uint8_t italic);
AS_API alphaskia_string_t alphaskia_typeface_get_family_name(alphaskia_typeface_t typeface);
AS_API uint8_t alphaskia_typeface_is_bold(alphaskia_typeface_t typeface);
AS_API uint8_t alphaskia_typeface_is_italic(alphaskia_typeface_t typeface);

typedef AS_API void *alphaskia_image_t;
AS_API int32_t alphaskia_image_get_width(alphaskia_image_t image);
Expand Down
Loading