Unverified Commit 73ca2ed4 authored by Oleksandr Karpovich's avatar Oleksandr Karpovich Committed by GitHub

Add toInterop for FontFeature.kt and update bindings accordingly (#329)

* Add toInterop for FontFeature.kt and update bindings accordingly

* fix: add reinterpret_cast
Co-authored-by: 's avatarOleksandr Karpovich <oleksandr.karpovich@jetbrains.com>
parent a55a6b09
package org.jetbrains.skia package org.jetbrains.skia
class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long) { import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.InteropScope
constructor(feature: String, value: Int, start: Long, end: Long) : this( class FontFeature(val _tag: Int, val value: Int, val start: UInt, val end: UInt) {
constructor(feature: String, value: Int, start: UInt, end: UInt) : this(
FourByteTag.fromString(feature), FourByteTag.fromString(feature),
value, value,
start, start,
...@@ -30,8 +33,8 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long) ...@@ -30,8 +33,8 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long)
override fun toString(): String { override fun toString(): String {
var range = "" var range = ""
if (start > 0 || end < Long.MAX_VALUE) { if (start > 0u || end < UInt.MAX_VALUE) {
range = "[" + (if (start > 0) start else "") + ":" + (if (end < Long.MAX_VALUE) end else "") + "]" range = "[" + (if (start > 0u) start else "") + ":" + (if (end < UInt.MAX_VALUE) end else "") + "]"
} }
var valuePrefix = "" var valuePrefix = ""
var valueSuffix = "" var valueSuffix = ""
...@@ -53,14 +56,25 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long) ...@@ -53,14 +56,25 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long)
var result = 1 var result = 1
result = result * PRIME + (_tag.hashCode()) result = result * PRIME + (_tag.hashCode())
result = result * PRIME + value result = result * PRIME + value
result = result * PRIME + (start ushr 32 xor start).toInt() result = result * PRIME + (start shr 16 xor start).toInt()
result = result * PRIME + (end ushr 32 xor end).toInt() result = result * PRIME + (end shr 16 xor end).toInt()
return result return result
} }
internal fun toInteropIntArray(): IntArray {
return intArrayOf(_tag, value, start.toInt(), end.toInt())
}
internal fun InteropScope.toInterop(): InteropPointer {
return toInterop(toInteropIntArray())
}
companion object { companion object {
const val GLOBAL_START: Long = 0 const val GLOBAL_START: UInt = 0u
const val GLOBAL_END = Long.MAX_VALUE // according to https://github.com/google/skia/blob/main/modules/skshaper/src/SkShaper_harfbuzz.cpp#L48
// define HB_FEATURE_GLOBAL_END ((unsigned int) -1)
const val GLOBAL_END: UInt = UInt.MAX_VALUE
val EMPTY = arrayOfNulls<FontFeature>(0) val EMPTY = arrayOfNulls<FontFeature>(0)
val _splitPattern = compilePattern("\\s+") val _splitPattern = compilePattern("\\s+")
val _featurePattern = val _featurePattern =
...@@ -71,13 +85,37 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long) ...@@ -71,13 +85,37 @@ class FontFeature(val _tag: Int, val value: Int, val start: Long, val end: Long)
require(m.matches()) { "Can’t parse FontFeature: $s" } require(m.matches()) { "Can’t parse FontFeature: $s" }
val value = if (m.group("value") != null) m.group("value")!! val value = if (m.group("value") != null) m.group("value")!!
.toInt() else if (m.group("sign") == null) 1 else if ("-" == m.group("sign")) 0 else 1 .toInt() else if (m.group("sign") == null) 1 else if ("-" == m.group("sign")) 0 else 1
val start = if (m.group("start") == null) 0 else m.group("start")!!.toLong() val start = if (m.group("start") == null) 0u else m.group("start")!!.toUInt()
val end = if (m.group("end") == null) Long.MAX_VALUE else m.group("end")!!.toLong() val end = if (m.group("end") == null) UInt.MAX_VALUE else m.group("end")!!.toUInt()
return FontFeature(m.group("tag")!!, value, start, end) return FontFeature(m.group("tag")!!, value, start, end)
} }
fun parse(str: String): Array<FontFeature?> { fun parse(str: String): Array<FontFeature?> {
return _splitPattern.split(str)?.map { s -> parseOne(s!!) }?.toTypedArray() ?: emptyArray() return _splitPattern.split(str)?.map { s -> parseOne(s!!) }?.toTypedArray() ?: emptyArray()
} }
internal fun InteropScope.toInterop(fontFeatures: Array<FontFeature>?): InteropPointer {
val ints = fontFeatures?.flatMap {
it.toInteropIntArray().toList()
}?.toIntArray()
return toInterop(ints)
}
/**
* This function can be used to convert IntArray to FontFeatures.
* Every FontFeature is represented by 2 ints (_tag, value)
*/
internal fun fromInteropEncodedBy2Ints(fontFeatures: IntArray): Array<FontFeature> {
val featuresCount = fontFeatures.size / 2
return Array(featuresCount) {
val j = it * 2
FontFeature(
fontFeatures[j], fontFeatures[j + 1],
GLOBAL_START, GLOBAL_END
)
}
}
} }
} }
\ No newline at end of file
...@@ -53,7 +53,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -53,7 +53,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setColor(value) setColor(value)
} }
fun setColor(color: Int): TextStyle { fun setColor(color: Int): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetColor(_ptr, color) _nSetColor(_ptr, color)
...@@ -71,7 +71,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -71,7 +71,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setForeground(value) setForeground(value)
} }
fun setForeground(paint: Paint?): TextStyle { fun setForeground(paint: Paint?): TextStyle {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
...@@ -120,7 +120,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -120,7 +120,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setDecorationStyle(value) setDecorationStyle(value)
} }
fun setDecorationStyle(d: DecorationStyle): TextStyle { fun setDecorationStyle(d: DecorationStyle): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetDecorationStyle( _nSetDecorationStyle(
...@@ -146,7 +146,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -146,7 +146,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setFontStyle(value) setFontStyle(value)
} }
fun setFontStyle(s: FontStyle): TextStyle { fun setFontStyle(s: FontStyle): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
TextStyle_nSetFontStyle(_ptr, s._value) TextStyle_nSetFontStyle(_ptr, s._value)
...@@ -181,7 +181,13 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -181,7 +181,13 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
val fontFeatures: Array<FontFeature> val fontFeatures: Array<FontFeature>
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetFontFeatures(_ptr)
val size = _nGetFontFeaturesSize(_ptr)
withResult(IntArray(size * 2)) {
_nGetFontFeatures(_ptr, it)
}.let {
FontFeature.fromInteropEncodedBy2Ints(it)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -213,7 +219,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -213,7 +219,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setFontSize(value) setFontSize(value)
} }
fun setFontSize(size: Float): TextStyle { fun setFontSize(size: Float): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
TextStyle_nSetFontSize(_ptr, size) TextStyle_nSetFontSize(_ptr, size)
...@@ -253,7 +259,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -253,7 +259,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setHeight(value) setHeight(value)
} }
fun setHeight(height: Float?): TextStyle { fun setHeight(height: Float?): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
if (height == null) TextStyle_nSetHeight(_ptr, false, 0f) else TextStyle_nSetHeight(_ptr, true, height) if (height == null) TextStyle_nSetHeight(_ptr, false, 0f) else TextStyle_nSetHeight(_ptr, true, height)
...@@ -287,7 +293,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -287,7 +293,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setWordSpacing(value) setWordSpacing(value)
} }
fun setWordSpacing(wordSpacing: Float): TextStyle { fun setWordSpacing(wordSpacing: Float): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetWordSpacing(_ptr, wordSpacing) _nSetWordSpacing(_ptr, wordSpacing)
...@@ -305,7 +311,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -305,7 +311,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setTypeface(value) setTypeface(value)
} }
fun setTypeface(typeface: Typeface?): TextStyle { fun setTypeface(typeface: Typeface?): TextStyle {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
...@@ -346,7 +352,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -346,7 +352,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
set(value) { set(value) {
setBaselineMode(value) setBaselineMode(value)
} }
fun setBaselineMode(baseline: BaselineMode): TextStyle { fun setBaselineMode(baseline: BaselineMode): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetBaselineMode(_ptr, baseline.ordinal) _nSetBaselineMode(_ptr, baseline.ordinal)
...@@ -457,7 +463,10 @@ private external fun _nAddShadow(ptr: NativePointer, color: Int, offsetX: Float, ...@@ -457,7 +463,10 @@ private external fun _nAddShadow(ptr: NativePointer, color: Int, offsetX: Float,
private external fun _nClearShadows(ptr: NativePointer) private external fun _nClearShadows(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures")
private external fun _nGetFontFeatures(ptr: NativePointer): Array<FontFeature> private external fun _nGetFontFeatures(ptr: NativePointer, resultIntsArray: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeaturesSize")
private external fun _nGetFontFeaturesSize(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature")
private external fun _nAddFontFeature(ptr: NativePointer, name: String?, value: Int) private external fun _nAddFontFeature(ptr: NativePointer, name: String?, value: Int)
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "shaper/interop.hh" #include "shaper/interop.hh"
#include "src/utils/SkUTF.h" #include "src/utils/SkUTF.h"
#include "paragraph/interop.hh" #include "paragraph/interop.hh"
#include "TextStyle.h"
namespace java { namespace java {
namespace io { namespace io {
...@@ -259,6 +260,43 @@ namespace skija { ...@@ -259,6 +260,43 @@ namespace skija {
} }
return features; return features;
} }
// every feature is encoded as 4 ints
std::vector<SkShaper::Feature> fromIntArray(JNIEnv* env, jintArray array, jint featuresLen) {
jint* ints = env->GetIntArrayElements(array, NULL);
std::vector<SkShaper::Feature> features(featuresLen);
for (int i = 0; i < featuresLen; ++i) {
int j = i * 4;
features[i] = {
static_cast<SkFourByteTag>(ints[j]),
static_cast<uint32_t>(ints[j + 1]),
static_cast<size_t>(ints[j + 2]),
static_cast<size_t>(ints[j + 3])
};
}
env->ReleaseIntArrayElements(array, ints, 0);
return features;
}
// every FontFeature is represented by 2 ints in resultArr
void writeToIntArray(std::vector<skia::textlayout::FontFeature> features, int* resultArr) {
for (int i = 0; i < features.size(); ++i) {
int j = i * 2;
resultArr[j] = skija::FontFeature::FourByteTag::fromString(features[i].fName);
resultArr[j + 1] = features[i].fValue;;
}
}
namespace FourByteTag {
int fromString(SkString str) {
int code1 = (int)str[0];
int code2 = (int)str[1];
int code3 = (int)str[2];
int code4 = (int)str[3];
return (code1 & 0xFF << 24) | (code2 & 0xFF << 16) | (code3 & 0xFF << 8) | (code4 & 0xFF);
}
}
} }
namespace FontMetrics { namespace FontMetrics {
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "SkShaper.h" #include "SkShaper.h"
#include "SkString.h" #include "SkString.h"
#include "SkSurfaceProps.h" #include "SkSurfaceProps.h"
#include "TextStyle.h"
namespace java { namespace java {
namespace io { namespace io {
...@@ -142,6 +143,16 @@ namespace skija { ...@@ -142,6 +143,16 @@ namespace skija {
void onLoad(JNIEnv* env); void onLoad(JNIEnv* env);
void onUnload(JNIEnv* env); void onUnload(JNIEnv* env);
std::vector<SkShaper::Feature> fromJavaArray(JNIEnv* env, jobjectArray featuresArr); std::vector<SkShaper::Feature> fromJavaArray(JNIEnv* env, jobjectArray featuresArr);
// every feature is encoded as 4 ints
std::vector<SkShaper::Feature> fromIntArray(JNIEnv* env, jintArray array, jint featuresCount);
// caller needs to ensure the resultArr size is sufficient (every feature is encoded as 2 ints)
void writeToIntArray(std::vector<skia::textlayout::FontFeature> features, int* resultArr);
namespace FourByteTag {
int fromString(SkString str);
}
} }
namespace FontMetrics { namespace FontMetrics {
......
...@@ -97,7 +97,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_paragraph_TextStyle ...@@ -97,7 +97,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_paragraph_TextStyle
d.fMode == TextDecorationMode::kGaps, d.fMode == TextDecorationMode::kGaps,
d.fColor, d.fColor,
static_cast<jint>(d.fStyle), static_cast<jint>(d.fStyle),
d.fThicknessMultiplier); d.fThicknessMultiplier);
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nSetDecorationStyle extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nSetDecorationStyle
...@@ -151,18 +151,21 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_ ...@@ -151,18 +151,21 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_
instance->resetShadows(); instance->resetShadows();
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetFontFeatures extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetFontFeaturesSize
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
std::vector<FontFeature> fontFeatures = instance->getFontFeatures(); std::vector<FontFeature> fontFeatures = instance->getFontFeatures();
jobjectArray fontFeaturesArr = env->NewObjectArray((jsize) fontFeatures.size(), skija::FontFeature::cls, nullptr); return static_cast<jint>(fontFeatures.size());
for (int i = 0; i < fontFeatures.size(); ++i) { }
const FontFeature& ff = fontFeatures[i];
auto featureObj = env->NewObject(skija::FontFeature::cls, skija::FontFeature::ctor, javaString(env, ff.fName), ff.fValue); extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetFontFeatures
env->SetObjectArrayElement(fontFeaturesArr, i, featureObj); (JNIEnv* env, jclass jclass, jlong ptr, jintArray resultArr) {
env->DeleteLocalRef(featureObj); TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
} std::vector<FontFeature> fontFeatures = instance->getFontFeatures();
return fontFeaturesArr;
jint* ints = env->GetIntArrayElements(resultArr, NULL);
skija::FontFeature::writeToIntArray(fontFeatures, reinterpret_cast<int*>(ints));
env->ReleaseIntArrayElements(resultArr, ints, 0);
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nAddFontFeature extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nAddFontFeature
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "SkShaper.h" #include "SkShaper.h"
#include "SkString.h" #include "SkString.h"
#include "SkSurfaceProps.h" #include "SkSurfaceProps.h"
#include "TextStyle.h"
#include "types.h" #include "types.h"
...@@ -68,6 +69,18 @@ namespace skija { ...@@ -68,6 +69,18 @@ namespace skija {
namespace IRect { namespace IRect {
std::unique_ptr<SkIRect> toSkIRect(KInt* rectInts); std::unique_ptr<SkIRect> toSkIRect(KInt* rectInts);
} }
namespace FontFeature {
// every feature is encoded as 4 ints
std::vector<SkShaper::Feature> fromIntArray(KInt* array, KInt featuresLen);
// caller needs to ensure the resultArr size is sufficient (every feature is encoded as 2 ints)
void writeToIntArray(std::vector<skia::textlayout::FontFeature> features, int* resultArr);
namespace FourByteTag {
int fromString(SkString str);
}
}
} }
std::unique_ptr<SkMatrix> skMatrix(KFloat* matrixArray); std::unique_ptr<SkMatrix> skMatrix(KFloat* matrixArray);
......
#include "common.h" #include "common.h"
#include "src/utils/SkUTF.h" #include "src/utils/SkUTF.h"
#include "include/core/SkImageInfo.h" #include "include/core/SkImageInfo.h"
#include "TextStyle.h"
#include <stdio.h> #include <stdio.h>
KLong packTwoInts(int32_t a, int32_t b) { KLong packTwoInts(int32_t a, int32_t b) {
...@@ -45,6 +46,40 @@ namespace skija { ...@@ -45,6 +46,40 @@ namespace skija {
} }
} }
} }
namespace FontFeature {
std::vector<SkShaper::Feature> fromIntArray(KInt* array, KInt featuresLen) {
std::vector<SkShaper::Feature> features(featuresLen);
for (int i = 0; i < featuresLen; ++i) {
int j = i * 4;
features[i] = {
static_cast<SkFourByteTag>(array[j]),
static_cast<uint32_t>(array[j + 1]),
static_cast<size_t>(array[j + 2]),
static_cast<size_t>(array[j + 3])
};
}
return features;
}
void writeToIntArray(std::vector<skia::textlayout::FontFeature> features, int* resultArr) {
for (int i = 0; i < features.size(); ++i) {
int j = i * 2;
resultArr[j] = skija::FontFeature::FourByteTag::fromString(features[i].fName);
resultArr[j + 1] = features[i].fValue;;
}
}
namespace FourByteTag {
int fromString(SkString str) {
int code1 = (int)str[0];
int code2 = (int)str[1];
int code3 = (int)str[2];
int code4 = (int)str[3];
return (code1 & 0xFF << 24) | (code2 & 0xFF << 16) | (code3 & 0xFF << 8) | (code4 & 0xFF);
}
}
}
} }
skija::UtfIndicesConverter::UtfIndicesConverter(const char* chars8, size_t len8): skija::UtfIndicesConverter::UtfIndicesConverter(const char* chars8, size_t len8):
......
...@@ -91,8 +91,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecora ...@@ -91,8 +91,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecora
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetDecorationStyle"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetDecorationStyle");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecorationStyle SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecorationStyle
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -104,7 +104,7 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecora ...@@ -104,7 +104,7 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetDecora
d.fMode == TextDecorationMode::kGaps, d.fMode == TextDecorationMode::kGaps,
d.fColor, d.fColor,
static_cast<KInt>(d.fStyle), static_cast<KInt>(d.fStyle),
d.fThicknessMultiplier); d.fThicknessMultiplier);
} }
#endif #endif
...@@ -139,8 +139,8 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetS ...@@ -139,8 +139,8 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetS
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetShadows"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetShadows");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -168,36 +168,27 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nClearShadows ...@@ -168,36 +168,27 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nClearShadows
instance->resetShadows(); instance->resetShadows();
} }
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeaturesSize
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures"); TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
std::vector<FontFeature> fontFeatures = instance->getFontFeatures();
return static_cast<KInt>(fontFeatures.size());
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures (KNativePointer ptr, KInt* resultArr) {
(KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
std::vector<FontFeature> fontFeatures = instance->getFontFeatures(); std::vector<FontFeature> fontFeatures = instance->getFontFeatures();
KInteropPointerArray fontFeaturesArr = env->NewObjectArray((jsize) fontFeatures.size(), skija::FontFeature::cls, nullptr); skija::FontFeature::writeToIntArray(fontFeatures, resultArr);
for (int i = 0; i < fontFeatures.size(); ++i) {
const FontFeature& ff = fontFeatures[i];
auto featureObj = env->NewObject(skija::FontFeature::cls, skija::FontFeature::ctor, javaString(env, ff.fName), ff.fValue);
env->SetObjectArrayElement(fontFeaturesArr, i, featureObj);
env->DeleteLocalRef(featureObj);
}
return fontFeaturesArr;
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature
(KNativePointer ptr, KInteropPointer nameStr, KInt value) { (KNativePointer ptr, KInteropPointer nameStr, KInt value) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature");
} }
#if 0 #if 0
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature
(KNativePointer ptr, KInteropPointer nameStr, KInt value) { (KNativePointer ptr, KInteropPointer nameStr, KInt value) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -229,8 +220,8 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetF ...@@ -229,8 +220,8 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetF
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -252,8 +243,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetHeight ...@@ -252,8 +243,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetHeight
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetHeight"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetHeight");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetHeight SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetHeight
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -311,8 +302,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetLocale ...@@ -311,8 +302,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetLocale
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetLocale"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetLocale");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetLocale SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetLocale
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -326,8 +317,8 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetLocale ...@@ -326,8 +317,8 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetLocale
(KNativePointer ptr, KInteropPointer locale) { (KNativePointer ptr, KInteropPointer locale) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nSetLocale"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nSetLocale");
} }
#if 0 #if 0
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetLocale SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetLocale
(KNativePointer ptr, KInteropPointer locale) { (KNativePointer ptr, KInteropPointer locale) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
...@@ -353,8 +344,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetFontMe ...@@ -353,8 +344,8 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetFontMe
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontMetrics"); TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontMetrics");
} }
#if 0 #if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetFontMetrics SKIKO_EXPORT KInteropPointer org_jetbrains_skia_paragraph_TextStyle__1nGetFontMetrics
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment