Unverified Commit d3670fd3 authored by alexander-gorshenev's avatar alexander-gorshenev Committed by GitHub

Skiko changes needed to ramp up compose/native Text (#197)

* Skiko changes needed to ramp up compose/native Text
* Typed interop  array return on native in particular
parent e46eb30c
......@@ -50,10 +50,16 @@ namespace skija {
namespace RRect {
SkRRect toSkRRect(KFloat left, KFloat top, KFloat right, KFloat bottom, KFloat* jradii, KInt size);
}
namespace FontStyle {
SkFontStyle fromKotlin(KInt style);
KInt toKotlin(const SkFontStyle& fs);
}
}
std::unique_ptr<SkMatrix> skMatrix(KFloat* matrixArray);
std::unique_ptr<SkM44> skM44(KFloat* matrixArray);
SkString skString(KNativePointer str);
template <typename T>
inline T interopToPtr(KNativePointer ptr) {
......
......@@ -101,6 +101,15 @@ std::unique_ptr<SkM44> skM44(KFloat* matrixArray) {
}
}
SkString skString(KInteropPointer s) {
char* str = reinterpret_cast<char *>(s);
if (str == nullptr) {
return SkString();
} else {
return SkString(str);
}
}
namespace skija {
namespace RRect {
SkRRect toSkRRect(KFloat left, KFloat top, KFloat right, KFloat bottom, KFloat* radii, KInt radiiSize) {
......@@ -127,4 +136,13 @@ namespace skija {
return rrect;
}
}
namespace FontStyle {
SkFontStyle fromKotlin(KInt style) {
return SkFontStyle(style & 0xFFFF, (style >> 16) & 0xFF, static_cast<SkFontStyle::Slant>((style >> 24) & 0xFF));
}
KInt toKotlin(const SkFontStyle& fs) {
return (static_cast<int>(fs.slant()) << 24)| (fs.width() << 16) | fs.weight();
}
}
}
......@@ -13,21 +13,11 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nGetFinalizer
return reinterpret_cast<KNativePointer>((&deleteString));
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nMake
(KInteropPointer textStr) {
TODO("implement org_jetbrains_skia_ManagedString__1nMake");
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nMake
(KInteropPointer textStr) {
SkString* text = new SkString(skString(env, textStr));
SkString* text = new SkString(skString(textStr));
return reinterpret_cast<KNativePointer>(text);
}
#endif
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_ManagedString__1nToString
(KNativePointer ptr) {
......@@ -58,21 +48,11 @@ SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nInsert
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nAppend
(KNativePointer ptr, KInteropPointer s) {
TODO("implement org_jetbrains_skia_ManagedString__1nAppend");
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nAppend
(KNativePointer ptr, KInteropPointer s) {
SkString* instance = reinterpret_cast<SkString*>((ptr));
instance->append(skString(env, s));
instance->append(skString(s));
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nRemoveSuffix
(KNativePointer ptr, KInt from) {
......
......@@ -20,37 +20,38 @@ SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_FontCollection__1nGetFontManagers
return instance->getFontManagersCount();
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager");
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
FontCollection* instance = reinterpret_cast<FontCollection*>((ptr));
SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr));
instance->setAssetFontManager(sk_ref_sp(fontManager));
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetDynamicFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetDynamicFontManager");
(KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
FontCollection* instance = reinterpret_cast<FontCollection*>((ptr));
SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr));
instance->setDynamicFontManager(sk_ref_sp(fontManager));
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetTestFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetTestFontManager");
(KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
FontCollection* instance = reinterpret_cast<FontCollection*>((ptr));
SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr));
instance->setTestFontManager(sk_ref_sp(fontManager));
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager");
(KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
FontCollection* instance = reinterpret_cast<FontCollection*>((ptr));
SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr));
if (defaultFamilyNameStr == nullptr)
instance->setDefaultFontManager(sk_ref_sp(fontManager));
else {
SkString defaultFamilyName = skString(defaultFamilyNameStr);
instance->setDefaultFontManager(sk_ref_sp(fontManager), defaultFamilyName.c_str());
}
}
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nGetFallbackManager
......
#include "Paragraph.h"
using namespace std;
using namespace skia::textlayout;
#include "common.h"
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_LineMetrics__1nGetArraySize
(KNativePointer blob) {
std::vector<LineMetrics>* vect = reinterpret_cast<std::vector<LineMetrics> *>(blob);
return static_cast<KInt>(vect->size());
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_LineMetrics__1nDisposeArray
(KNativePointer blob) {
std::vector<LineMetrics>* vect = reinterpret_cast<std::vector<LineMetrics> *>(blob);
delete vect;
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_LineMetrics__1nGetArrayElement
(KNativePointer blob, KInt index, KNativePointer longArgs, KNativePointer doubleArgs) {
std::vector<LineMetrics>* vect = reinterpret_cast<std::vector<LineMetrics> *>(blob);
float* longs = reinterpret_cast<float *>(longArgs);
int* doubles = reinterpret_cast<int *>(doubleArgs);
LineMetrics lm = vect->at(index);
longs[0] = lm.fStartIndex;
longs[1] = lm.fEndIndex;
longs[2] = lm.fEndExcludingWhitespaces;
longs[3] = lm.fEndIncludingNewline;
longs[4] = lm.fHardBreak;
longs[5] = lm.fLineNumber;
doubles[0] = lm.fAscent;
doubles[1] = lm.fDescent;
doubles[2] = lm.fUnscaledAscent;
doubles[3] = lm.fHeight;
doubles[4] = lm.fWidth;
doubles[5] = lm.fLeft;
doubles[6] = lm.fBaseline;
}
......@@ -100,29 +100,12 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetR
}
#endif
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders");
}
#if 0
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders
(KNativePointer ptr) {
Paragraph* instance = reinterpret_cast<Paragraph*>((ptr));
std::vector<TextBox> rects = instance->getRectsForPlaceholders();
KInteropPointerArray rectsArray = env->NewObjectArray((jsize) rects.size(), skija::paragraph::TextBox::cls, nullptr);
for (int i = 0; i < rects.size(); ++i) {
TextBox box = rects[i];
KInteropPointer boxObj = env->NewObject(skija::paragraph::TextBox::cls, skija::paragraph::TextBox::ctor, box.rect.fLeft, box.rect.fTop, box.rect.fRight, box.rect.fBottom, static_cast<KInt>(box.direction));
env->SetObjectArrayElement(rectsArray, i, boxObj);
env->DeleteLocalRef(boxObj);
}
return rectsArray;
std::vector<TextBox> *vect = new std::vector<TextBox>(instance->getRectsForPlaceholders());
return vect;
}
#endif
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_Paragraph__1nGetGlyphPositionAtCoordinate
(KNativePointer ptr, KFloat dx, KFloat dy) {
......@@ -144,7 +127,12 @@ SKIKO_EXPORT KLong org_jetbrains_skia_paragraph_Paragraph__1nGetWordBoundary
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics
(KNativePointer ptr, KNativePointer textPtr) {
TODO("implement org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics");
Paragraph* instance = reinterpret_cast<Paragraph*>((ptr));
SkString* text = reinterpret_cast<SkString*>((textPtr));
std::vector<LineMetrics>* res = new std::vector<LineMetrics>;
instance->getLineMetrics(*res);
return res;
}
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_Paragraph__1nGetLineNumber
......
......@@ -38,21 +38,12 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nPopStyle
instance->pop();
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText
(KNativePointer ptr, KInteropPointer textString) {
TODO("implement org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText");
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText
(KNativePointer ptr, KInteropPointer textString) {
ParagraphBuilder* instance = reinterpret_cast<ParagraphBuilder*>((ptr));
SkString text = skString(env, textString);
SkString text = skString(textString);
instance->addText(text.c_str(), text.size());
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddPlaceholder
(KNativePointer ptr, KFloat width, KFloat height, KInt alignment, KInt baselinePosition, KFloat baseline) {
......
#include "Paragraph.h"
using namespace std;
using namespace skia::textlayout;
#include "common.h"
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextBox__1nGetArraySize
(KNativePointer blob) {
std::vector<TextBox>* vect = reinterpret_cast<std::vector<TextBox> *>(blob);
return static_cast<KInt>(vect->size());
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextBox__1nDisposeArray
(KNativePointer blob) {
std::vector<TextBox>* vect = reinterpret_cast<std::vector<TextBox> *>(blob);
delete vect;
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextBox__1nGetArrayElement
(KNativePointer blob, KInt index, KNativePointer rectangleArray, KNativePointer directionArray) {
std::vector<TextBox>* vect = reinterpret_cast<std::vector<TextBox> *>(blob);
float* rectangle = reinterpret_cast<float *>(rectangleArray);
int* direction = reinterpret_cast<int *>(directionArray);
TextBox box = vect->at(index);
rectangle[0] = box.rect.fLeft;
rectangle[1] = box.rect.fTop;
rectangle[2] = box.rect.fRight;
rectangle[3] = box.rect.fBottom;
direction[0] = static_cast<int>(box.direction);
}
......@@ -123,36 +123,17 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetDecorationStyle
instance->setDecorationThicknessMultiplier(thicknessMultiplier);
}
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextStyle__1nGetFontStyle
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontStyle");
}
#if 0
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextStyle__1nGetFontStyle
(KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
return skija::FontStyle::toJava(instance->getFontStyle());
return skija::FontStyle::toKotlin(instance->getFontStyle());
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle
(KNativePointer ptr, KInt fontStyleValue) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle");
}
#if 0
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle
(KNativePointer ptr, KInt fontStyleValue) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr));
instance->setFontStyle(skija::FontStyle::fromJava(fontStyleValue));
instance->setFontStyle(skija::FontStyle::fromKotlin(fontStyleValue));
}
#endif
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows
(KNativePointer ptr) {
......
......@@ -38,6 +38,7 @@ expect class InteropScope() {
fun InteropPointer.fromInterop(result: NativePointerArray)
fun toInterop(stringArray: Array<String>?): InteropPointer
fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray
inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T>
fun release()
}
......@@ -70,3 +71,9 @@ inline fun withResult(result: NativePointerArray, block: (InteropPointer) -> Uni
handle.fromInterop(result)
result
}
interface ArrayInteropDecoder<T> {
fun getArrayElement(array: InteropPointer, index: Int): T
fun getArraySize(array: InteropPointer): Int
fun disposeArray(array: InteropPointer)
}
......@@ -65,11 +65,13 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
fun setDefaultFontManager(fontMgr: FontMgr?, defaultFamilyName: String?): FontCollection {
return try {
Stats.onNativeCall()
_nSetDefaultFontManager(
_ptr,
getPtr(fontMgr),
defaultFamilyName
)
interopScope {
_nSetDefaultFontManager(
_ptr,
getPtr(fontMgr),
toInterop(defaultFamilyName)
)
}
this
} finally {
reachabilityBarrier(fontMgr)
......@@ -151,7 +153,7 @@ private external fun _nSetDynamicFontManager(ptr: NativePointer, fontManagerPtr:
private external fun _nSetTestFontManager(ptr: NativePointer, fontManagerPtr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager")
private external fun _nSetDefaultFontManager(ptr: NativePointer, fontManagerPtr: NativePointer, defaultFamilyName: String?): NativePointer
private external fun _nSetDefaultFontManager(ptr: NativePointer, fontManagerPtr: NativePointer, defaultFamilyName: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nGetFallbackManager")
private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer
......
package org.jetbrains.skia.paragraph
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.*
class LineMetrics(
/**
* The index in the text buffer the line begins.
......@@ -16,7 +19,8 @@ class LineMetrics(
/**
* The index in the text buffer the line begins.
*/
val endIncludingNewline: Long, val isHardBreak: Boolean,
val endIncludingNewline: Long,
val isHardBreak: Boolean,
/**
* The final computed ascent for the line. This can be impacted by the strut, height,
* scaling, as well as outlying runs that are very tall. The top edge is
......@@ -148,7 +152,41 @@ class LineMetrics(
return result
}
companion object : ArrayInteropDecoder<LineMetrics> {
override fun getArraySize(array: InteropPointer) = LineMetrics_nGetArraySize(array)
override fun disposeArray(array: InteropPointer) = LineMetrics_nDisposeArray(array)
override fun getArrayElement(array: InteropPointer, index: Int): LineMetrics {
val longArray = LongArray(6)
val doubleArray = DoubleArray(7)
val result = interopScope {
LineMetrics_nGetArrayElement(array, index, toInterop(longArray), toInterop(doubleArray))
}
return LineMetrics(
longArray[0],
longArray[1],
longArray[2],
longArray[3],
longArray[4] != 0L,
doubleArray[0],
doubleArray[1],
doubleArray[2],
doubleArray[3],
doubleArray[4],
doubleArray[5],
doubleArray[6],
longArray[5]
)
}
}
override fun toString(): String {
return "LineMetrics(_startIndex=$startIndex, _endIndex=$endIndex, _endExcludingWhitespaces=$endExcludingWhitespaces, _endIncludingNewline=$endIncludingNewline, _hardBreak=$isHardBreak, _ascent=$ascent, _descent=$descent, _unscaledAscent=$unscaledAscent, _height=$height, _width=$width, _left=$left, _baseline=$baseline, _lineNumber=$lineNumber)"
}
}
\ No newline at end of file
}
@ExternalSymbolName("org_jetbrains_skia_paragraph_LineMetrics__1nGetArraySize")
private external fun LineMetrics_nGetArraySize(array: InteropPointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_LineMetrics__1nDisposeArray")
private external fun LineMetrics_nDisposeArray(array: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_LineMetrics__1nGetArrayElement")
private external fun LineMetrics_nGetArrayElement(array: InteropPointer, index: Int, longArgs: InteropPointer, doubleArgs: InteropPointer)
......@@ -3,12 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.*
import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.*
class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : Managed(ptr, _FinalizerHolder.PTR) {
companion object {
......@@ -122,7 +118,9 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
val rectsForPlaceholders: Array<org.jetbrains.skia.paragraph.TextBox>
get() = try {
Stats.onNativeCall()
_nGetRectsForPlaceholders(_ptr)
interopScope {
_nGetRectsForPlaceholders(_ptr).fromInterop(TextBox)
}
} finally {
reachabilityBarrier(this)
}
......@@ -153,19 +151,21 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
private fun toIRange(p: Long) = IRange((p ushr 32).toInt(), (p and -1).toInt())
val lineMetrics: Array<LineMetrics?>
val lineMetrics: Array<LineMetrics>
get() = try {
if (_text == null) {
arrayOfNulls(0)
arrayOf<LineMetrics>()
} else {
Stats.onNativeCall()
_nGetLineMetrics(_ptr, getPtr(_text))
interopScope {
_nGetLineMetrics(_ptr, getPtr(_text)).fromInterop(LineMetrics)
}
}
} finally {
reachabilityBarrier(this)
reachabilityBarrier(_text)
}
val lineNumber: NativePointer
val lineNumber: Int
get() = try {
Stats.onNativeCall()
_nGetLineNumber(_ptr)
......@@ -310,7 +310,7 @@ private external fun _nGetRectsForRange(
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders")
private external fun _nGetRectsForPlaceholders(ptr: NativePointer): Array<TextBox>
private external fun _nGetRectsForPlaceholders(ptr: NativePointer): InteropPointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetGlyphPositionAtCoordinate")
private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Float, dy: Float): Int
......@@ -319,10 +319,10 @@ private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Floa
private external fun _nGetWordBoundary(ptr: NativePointer, offset: Int): Long
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics")
private external fun _nGetLineMetrics(ptr: NativePointer, textPtr: NativePointer): Array<LineMetrics?>
private external fun _nGetLineMetrics(ptr: NativePointer, textPtr: NativePointer): InteropPointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetLineNumber")
private external fun _nGetLineNumber(ptr: NativePointer): NativePointer
private external fun _nGetLineNumber(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nMarkDirty")
private external fun _nMarkDirty(ptr: NativePointer)
......
......@@ -3,12 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.ManagedString
import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.*
class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
Managed(_nMake(getPtr(style), getPtr(fc)), _FinalizerHolder.PTR) {
......@@ -37,7 +33,9 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
fun addText(text: String): ParagraphBuilder {
Stats.onNativeCall()
_nAddText(_ptr, text)
interopScope {
_nAddText(_ptr, toInterop(text))
}
if (_text == null) _text = ManagedString(text) else _text!!.append(text)
return this
}
......@@ -100,7 +98,7 @@ private external fun _nPushStyle(ptr: NativePointer, textStylePtr: NativePointer
private external fun _nPopStyle(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText")
private external fun _nAddText(ptr: NativePointer, text: String?)
private external fun _nAddText(ptr: NativePointer, text: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddPlaceholder")
private external fun _nAddPlaceholder(
......
......@@ -103,7 +103,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
return this
}
var maxLinesCount: NativePointer
var maxLinesCount: Int
get() = try {
Stats.onNativeCall()
_nGetMaxLinesCount(_ptr)
......@@ -114,7 +114,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
setMaxLinesCount(value)
}
fun setMaxLinesCount(count: NativePointer): ParagraphStyle {
fun setMaxLinesCount(count: Int): ParagraphStyle {
Stats.onNativeCall()
_nSetMaxLinesCount(_ptr, count)
return this
......@@ -240,10 +240,10 @@ private external fun _nGetAlignment(ptr: NativePointer): Int
private external fun _nSetAlignment(ptr: NativePointer, align: Int)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nGetMaxLinesCount")
private external fun _nGetMaxLinesCount(ptr: NativePointer): NativePointer
private external fun _nGetMaxLinesCount(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nSetMaxLinesCount")
private external fun _nSetMaxLinesCount(ptr: NativePointer, maxLines: NativePointer)
private external fun _nSetMaxLinesCount(ptr: NativePointer, maxLines: Int)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nGetEllipsis")
private external fun _nGetEllipsis(ptr: NativePointer): String
......
package org.jetbrains.skia.paragraph
import org.jetbrains.skia.*
import org.jetbrains.skia.impl.*
class TextBox(val rect: Rect, direction: Direction) {
val _direction: Direction
......@@ -47,4 +48,24 @@ class TextBox(val rect: Rect, direction: Direction) {
init {
_direction = direction
}
}
\ No newline at end of file
companion object : ArrayInteropDecoder<TextBox> {
override fun getArrayElement(array: InteropPointer, index: Int): TextBox {
val rect = FloatArray(4)
val direction = IntArray(1)
interopScope {
TextBox_nGetArrayElement(array, index, toInterop(rect), toInterop(direction))
}
return TextBox(rect[0], rect[1], rect[2], rect[3], direction[0])
}
override fun getArraySize(array: InteropPointer) = TextBox_nGetArraySize(array)
override fun disposeArray(array: InteropPointer) = TextBox_nDisposeArray(array)
}
}
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextBox__1nGetArraySize")
private external fun TextBox_nGetArraySize(array: InteropPointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextBox__1nDisposeArray")
private external fun TextBox_nDisposeArray(array: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextBox__1nGetArrayElement")
private external fun TextBox_nGetArrayElement(array: InteropPointer, index: Int, rectArray: InteropPointer, directionArray: InteropPointer)
......@@ -3,13 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.*
import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.*
class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object {
......@@ -243,7 +238,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
fun setFontFamilies(families: Array<String>?): TextStyle {
Stats.onNativeCall()
_nSetFontFamilies(_ptr, families)
interopScope {
_nSetFontFamilies(_ptr, toInterop(families))
}
return this
}
......@@ -470,7 +467,7 @@ private external fun _nAddFontFeature(ptr: NativePointer, name: String?, value:
private external fun _nClearFontFeatures(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies")
private external fun _nSetFontFamilies(ptr: NativePointer, families: Array<String>?)
private external fun _nSetFontFamilies(ptr: NativePointer, families: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetLetterSpacing")
private external fun _nGetLetterSpacing(ptr: NativePointer): Float
......
......@@ -142,6 +142,9 @@ actual class InteropScope actual constructor() {
TODO("implement wasm fromInteropNativePointerArray")
}
actual inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T> =
TODO("implement wasm fromInteropArray()")
actual fun release() {
elements.forEach {
_free(it)
......
......@@ -70,6 +70,7 @@ actual class InteropScope actual constructor() {
actual fun toInterop(stringArray: Array<String>?): InteropPointer = stringArray
actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray =
NativePointerArray((this as LongArray).size, this)
actual inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T> = this as Array<T>
actual fun release() {}
}
......
......@@ -35,7 +35,8 @@ actual fun reachabilityBarrier(obj: Any?) {
actual class InteropScope actual constructor() {
actual fun toInterop(string: String?): InteropPointer {
return if (string != null) {
val pinned = string.pin()
// encodeToByteArray encodes to utf8
val pinned = string.encodeToByteArray().pin()
elements.add(pinned)
val result = pinned.addressOf(0).rawValue
result
......@@ -152,6 +153,15 @@ actual class InteropScope actual constructor() {
return toInterop(nativePointerArray)
}
actual inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T> {
val size = decoder.getArraySize(this)
val result = Array<T>(size) {
decoder.getArrayElement(this, it)
}
decoder.disposeArray(this)
return result
}
actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray {
TODO("implement native fromInteropNativePointerArray")
}
......
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