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 { ...@@ -50,10 +50,16 @@ namespace skija {
namespace RRect { namespace RRect {
SkRRect toSkRRect(KFloat left, KFloat top, KFloat right, KFloat bottom, KFloat* jradii, KInt size); 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<SkMatrix> skMatrix(KFloat* matrixArray);
std::unique_ptr<SkM44> skM44(KFloat* matrixArray); std::unique_ptr<SkM44> skM44(KFloat* matrixArray);
SkString skString(KNativePointer str);
template <typename T> template <typename T>
inline T interopToPtr(KNativePointer ptr) { inline T interopToPtr(KNativePointer ptr) {
......
...@@ -101,6 +101,15 @@ std::unique_ptr<SkM44> skM44(KFloat* matrixArray) { ...@@ -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 skija {
namespace RRect { namespace RRect {
SkRRect toSkRRect(KFloat left, KFloat top, KFloat right, KFloat bottom, KFloat* radii, KInt radiiSize) { SkRRect toSkRRect(KFloat left, KFloat top, KFloat right, KFloat bottom, KFloat* radii, KInt radiiSize) {
...@@ -127,4 +136,13 @@ namespace skija { ...@@ -127,4 +136,13 @@ namespace skija {
return rrect; 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 ...@@ -13,21 +13,11 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nGetFinalizer
return reinterpret_cast<KNativePointer>((&deleteString)); return reinterpret_cast<KNativePointer>((&deleteString));
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nMake SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nMake
(KInteropPointer textStr) { (KInteropPointer textStr) {
TODO("implement org_jetbrains_skia_ManagedString__1nMake"); SkString* text = new SkString(skString(textStr));
}
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_ManagedString__1nMake
(KInteropPointer textStr) {
SkString* text = new SkString(skString(env, textStr));
return reinterpret_cast<KNativePointer>(text); return reinterpret_cast<KNativePointer>(text);
} }
#endif
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_ManagedString__1nToString SKIKO_EXPORT KInteropPointer org_jetbrains_skia_ManagedString__1nToString
(KNativePointer ptr) { (KNativePointer ptr) {
...@@ -58,21 +48,11 @@ SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nInsert ...@@ -58,21 +48,11 @@ SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nInsert
} }
#endif #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 SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nAppend
(KNativePointer ptr, KInteropPointer s) { (KNativePointer ptr, KInteropPointer s) {
SkString* instance = reinterpret_cast<SkString*>((ptr)); SkString* instance = reinterpret_cast<SkString*>((ptr));
instance->append(skString(env, s)); instance->append(skString(s));
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nRemoveSuffix SKIKO_EXPORT void org_jetbrains_skia_ManagedString__1nRemoveSuffix
(KNativePointer ptr, KInt from) { (KNativePointer ptr, KInt from) {
......
...@@ -20,37 +20,38 @@ SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_FontCollection__1nGetFontManagers ...@@ -20,37 +20,38 @@ SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_FontCollection__1nGetFontManagers
return instance->getFontManagersCount(); 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 SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) { (KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) {
FontCollection* instance = reinterpret_cast<FontCollection*>((ptr)); FontCollection* instance = reinterpret_cast<FontCollection*>((ptr));
SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr)); SkFontMgr* fontManager = reinterpret_cast<SkFontMgr*>((fontManagerPtr));
instance->setAssetFontManager(sk_ref_sp(fontManager)); instance->setAssetFontManager(sk_ref_sp(fontManager));
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetDynamicFontManager SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetDynamicFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) { (KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetDynamicFontManager"); 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 SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetTestFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) { (KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetTestFontManager"); 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 SKIKO_EXPORT void org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager
(KNativePointer ptr, KNativePointer fontManagerPtr, KInteropPointer defaultFamilyNameStr) { (KNativePointer ptr, KNativePointer fontManagerPtr, KNativePointer defaultFamilyNameStr) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager"); 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 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 ...@@ -100,29 +100,12 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetR
} }
#endif #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 SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders
(KNativePointer ptr) { (KNativePointer ptr) {
Paragraph* instance = reinterpret_cast<Paragraph*>((ptr)); Paragraph* instance = reinterpret_cast<Paragraph*>((ptr));
std::vector<TextBox> rects = instance->getRectsForPlaceholders(); std::vector<TextBox> *vect = new std::vector<TextBox>(instance->getRectsForPlaceholders());
KInteropPointerArray rectsArray = env->NewObjectArray((jsize) rects.size(), skija::paragraph::TextBox::cls, nullptr); return vect;
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;
} }
#endif
SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_Paragraph__1nGetGlyphPositionAtCoordinate SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_Paragraph__1nGetGlyphPositionAtCoordinate
(KNativePointer ptr, KFloat dx, KFloat dy) { (KNativePointer ptr, KFloat dx, KFloat dy) {
...@@ -144,7 +127,12 @@ SKIKO_EXPORT KLong org_jetbrains_skia_paragraph_Paragraph__1nGetWordBoundary ...@@ -144,7 +127,12 @@ SKIKO_EXPORT KLong org_jetbrains_skia_paragraph_Paragraph__1nGetWordBoundary
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics
(KNativePointer ptr, KNativePointer textPtr) { (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 SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_Paragraph__1nGetLineNumber
......
...@@ -38,21 +38,12 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nPopStyle ...@@ -38,21 +38,12 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nPopStyle
instance->pop(); 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 SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText
(KNativePointer ptr, KInteropPointer textString) { (KNativePointer ptr, KInteropPointer textString) {
ParagraphBuilder* instance = reinterpret_cast<ParagraphBuilder*>((ptr)); ParagraphBuilder* instance = reinterpret_cast<ParagraphBuilder*>((ptr));
SkString text = skString(env, textString); SkString text = skString(textString);
instance->addText(text.c_str(), text.size()); instance->addText(text.c_str(), text.size());
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddPlaceholder SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddPlaceholder
(KNativePointer ptr, KFloat width, KFloat height, KInt alignment, KInt baselinePosition, KFloat baseline) { (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 ...@@ -123,36 +123,17 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetDecorationStyle
instance->setDecorationThicknessMultiplier(thicknessMultiplier); 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 SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextStyle__1nGetFontStyle
(KNativePointer ptr) { (KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>((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 SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle
(KNativePointer ptr, KInt fontStyleValue) { (KNativePointer ptr, KInt fontStyleValue) {
TextStyle* instance = reinterpret_cast<TextStyle*>((ptr)); 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 SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows
(KNativePointer ptr) { (KNativePointer ptr) {
......
...@@ -38,6 +38,7 @@ expect class InteropScope() { ...@@ -38,6 +38,7 @@ expect class InteropScope() {
fun InteropPointer.fromInterop(result: NativePointerArray) fun InteropPointer.fromInterop(result: NativePointerArray)
fun toInterop(stringArray: Array<String>?): InteropPointer fun toInterop(stringArray: Array<String>?): InteropPointer
fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray
inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T>
fun release() fun release()
} }
...@@ -70,3 +71,9 @@ inline fun withResult(result: NativePointerArray, block: (InteropPointer) -> Uni ...@@ -70,3 +71,9 @@ inline fun withResult(result: NativePointerArray, block: (InteropPointer) -> Uni
handle.fromInterop(result) handle.fromInterop(result)
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) { ...@@ -65,11 +65,13 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
fun setDefaultFontManager(fontMgr: FontMgr?, defaultFamilyName: String?): FontCollection { fun setDefaultFontManager(fontMgr: FontMgr?, defaultFamilyName: String?): FontCollection {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
interopScope {
_nSetDefaultFontManager( _nSetDefaultFontManager(
_ptr, _ptr,
getPtr(fontMgr), getPtr(fontMgr),
defaultFamilyName toInterop(defaultFamilyName)
) )
}
this this
} finally { } finally {
reachabilityBarrier(fontMgr) reachabilityBarrier(fontMgr)
...@@ -151,7 +153,7 @@ private external fun _nSetDynamicFontManager(ptr: NativePointer, fontManagerPtr: ...@@ -151,7 +153,7 @@ private external fun _nSetDynamicFontManager(ptr: NativePointer, fontManagerPtr:
private external fun _nSetTestFontManager(ptr: NativePointer, fontManagerPtr: NativePointer): NativePointer private external fun _nSetTestFontManager(ptr: NativePointer, fontManagerPtr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nSetDefaultFontManager") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nGetFallbackManager")
private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer
......
package org.jetbrains.skia.paragraph package org.jetbrains.skia.paragraph
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.*
class LineMetrics( class LineMetrics(
/** /**
* The index in the text buffer the line begins. * The index in the text buffer the line begins.
...@@ -16,7 +19,8 @@ class LineMetrics( ...@@ -16,7 +19,8 @@ class LineMetrics(
/** /**
* The index in the text buffer the line begins. * 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, * 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 * scaling, as well as outlying runs that are very tall. The top edge is
...@@ -148,7 +152,41 @@ class LineMetrics( ...@@ -148,7 +152,41 @@ class LineMetrics(
return result 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 { 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)" 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)"
} }
} }
@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 ...@@ -3,12 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.* 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.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.getPtr
class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : Managed(ptr, _FinalizerHolder.PTR) { class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : Managed(ptr, _FinalizerHolder.PTR) {
companion object { companion object {
...@@ -122,7 +118,9 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -122,7 +118,9 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) :
val rectsForPlaceholders: Array<org.jetbrains.skia.paragraph.TextBox> val rectsForPlaceholders: Array<org.jetbrains.skia.paragraph.TextBox>
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetRectsForPlaceholders(_ptr) interopScope {
_nGetRectsForPlaceholders(_ptr).fromInterop(TextBox)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -153,19 +151,21 @@ class Paragraph internal constructor(ptr: NativePointer, text: ManagedString?) : ...@@ -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()) private fun toIRange(p: Long) = IRange((p ushr 32).toInt(), (p and -1).toInt())
val lineMetrics: Array<LineMetrics?> val lineMetrics: Array<LineMetrics>
get() = try { get() = try {
if (_text == null) { if (_text == null) {
arrayOfNulls(0) arrayOf<LineMetrics>()
} else { } else {
Stats.onNativeCall() Stats.onNativeCall()
_nGetLineMetrics(_ptr, getPtr(_text)) interopScope {
_nGetLineMetrics(_ptr, getPtr(_text)).fromInterop(LineMetrics)
}
} }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(_text) reachabilityBarrier(_text)
} }
val lineNumber: NativePointer val lineNumber: Int
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetLineNumber(_ptr) _nGetLineNumber(_ptr)
...@@ -310,7 +310,7 @@ private external fun _nGetRectsForRange( ...@@ -310,7 +310,7 @@ private external fun _nGetRectsForRange(
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetRectsForPlaceholders") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetGlyphPositionAtCoordinate")
private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Float, dy: Float): Int private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Float, dy: Float): Int
...@@ -319,10 +319,10 @@ private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Floa ...@@ -319,10 +319,10 @@ private external fun _nGetGlyphPositionAtCoordinate(ptr: NativePointer, dx: Floa
private external fun _nGetWordBoundary(ptr: NativePointer, offset: Int): Long private external fun _nGetWordBoundary(ptr: NativePointer, offset: Int): Long
@ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nGetLineMetrics") @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") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_Paragraph__1nMarkDirty")
private external fun _nMarkDirty(ptr: NativePointer) private external fun _nMarkDirty(ptr: NativePointer)
......
...@@ -3,12 +3,8 @@ package org.jetbrains.skia.paragraph ...@@ -3,12 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.ManagedString 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.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.getPtr
class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) : class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
Managed(_nMake(getPtr(style), getPtr(fc)), _FinalizerHolder.PTR) { Managed(_nMake(getPtr(style), getPtr(fc)), _FinalizerHolder.PTR) {
...@@ -37,7 +33,9 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) : ...@@ -37,7 +33,9 @@ class ParagraphBuilder(style: ParagraphStyle?, fc: FontCollection?) :
fun addText(text: String): ParagraphBuilder { fun addText(text: String): ParagraphBuilder {
Stats.onNativeCall() Stats.onNativeCall()
_nAddText(_ptr, text) interopScope {
_nAddText(_ptr, toInterop(text))
}
if (_text == null) _text = ManagedString(text) else _text!!.append(text) if (_text == null) _text = ManagedString(text) else _text!!.append(text)
return this return this
} }
...@@ -100,7 +98,7 @@ private external fun _nPushStyle(ptr: NativePointer, textStylePtr: NativePointer ...@@ -100,7 +98,7 @@ private external fun _nPushStyle(ptr: NativePointer, textStylePtr: NativePointer
private external fun _nPopStyle(ptr: NativePointer) private external fun _nPopStyle(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddText") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphBuilder__1nAddPlaceholder")
private external fun _nAddPlaceholder( private external fun _nAddPlaceholder(
......
...@@ -103,7 +103,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) { ...@@ -103,7 +103,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
return this return this
} }
var maxLinesCount: NativePointer var maxLinesCount: Int
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetMaxLinesCount(_ptr) _nGetMaxLinesCount(_ptr)
...@@ -114,7 +114,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) { ...@@ -114,7 +114,7 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
setMaxLinesCount(value) setMaxLinesCount(value)
} }
fun setMaxLinesCount(count: NativePointer): ParagraphStyle { fun setMaxLinesCount(count: Int): ParagraphStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetMaxLinesCount(_ptr, count) _nSetMaxLinesCount(_ptr, count)
return this return this
...@@ -240,10 +240,10 @@ private external fun _nGetAlignment(ptr: NativePointer): Int ...@@ -240,10 +240,10 @@ private external fun _nGetAlignment(ptr: NativePointer): Int
private external fun _nSetAlignment(ptr: NativePointer, align: Int) private external fun _nSetAlignment(ptr: NativePointer, align: Int)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nGetMaxLinesCount") @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") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nGetEllipsis")
private external fun _nGetEllipsis(ptr: NativePointer): String private external fun _nGetEllipsis(ptr: NativePointer): String
......
package org.jetbrains.skia.paragraph package org.jetbrains.skia.paragraph
import org.jetbrains.skia.* import org.jetbrains.skia.*
import org.jetbrains.skia.impl.*
class TextBox(val rect: Rect, direction: Direction) { class TextBox(val rect: Rect, direction: Direction) {
val _direction: Direction val _direction: Direction
...@@ -47,4 +48,24 @@ class TextBox(val rect: Rect, direction: Direction) { ...@@ -47,4 +48,24 @@ class TextBox(val rect: Rect, direction: Direction) {
init { init {
_direction = direction _direction = direction
} }
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 ...@@ -3,13 +3,8 @@ package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.* 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.ExternalSymbolName
import org.jetbrains.skia.impl.NativePointer import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.getPtr
class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) { class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object { companion object {
...@@ -243,7 +238,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -243,7 +238,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
fun setFontFamilies(families: Array<String>?): TextStyle { fun setFontFamilies(families: Array<String>?): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nSetFontFamilies(_ptr, families) interopScope {
_nSetFontFamilies(_ptr, toInterop(families))
}
return this return this
} }
...@@ -470,7 +467,7 @@ private external fun _nAddFontFeature(ptr: NativePointer, name: String?, value: ...@@ -470,7 +467,7 @@ private external fun _nAddFontFeature(ptr: NativePointer, name: String?, value:
private external fun _nClearFontFeatures(ptr: NativePointer) private external fun _nClearFontFeatures(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies") @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") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetLetterSpacing")
private external fun _nGetLetterSpacing(ptr: NativePointer): Float private external fun _nGetLetterSpacing(ptr: NativePointer): Float
......
...@@ -142,6 +142,9 @@ actual class InteropScope actual constructor() { ...@@ -142,6 +142,9 @@ actual class InteropScope actual constructor() {
TODO("implement wasm fromInteropNativePointerArray") TODO("implement wasm fromInteropNativePointerArray")
} }
actual inline fun <reified T> InteropPointer.fromInterop(decoder: ArrayInteropDecoder<T>): Array<T> =
TODO("implement wasm fromInteropArray()")
actual fun release() { actual fun release() {
elements.forEach { elements.forEach {
_free(it) _free(it)
......
...@@ -70,6 +70,7 @@ actual class InteropScope actual constructor() { ...@@ -70,6 +70,7 @@ actual class InteropScope actual constructor() {
actual fun toInterop(stringArray: Array<String>?): InteropPointer = stringArray actual fun toInterop(stringArray: Array<String>?): InteropPointer = stringArray
actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray = actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray =
NativePointerArray((this as LongArray).size, this) 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() {} actual fun release() {}
} }
......
...@@ -35,7 +35,8 @@ actual fun reachabilityBarrier(obj: Any?) { ...@@ -35,7 +35,8 @@ actual fun reachabilityBarrier(obj: Any?) {
actual class InteropScope actual constructor() { actual class InteropScope actual constructor() {
actual fun toInterop(string: String?): InteropPointer { actual fun toInterop(string: String?): InteropPointer {
return if (string != null) { return if (string != null) {
val pinned = string.pin() // encodeToByteArray encodes to utf8
val pinned = string.encodeToByteArray().pin()
elements.add(pinned) elements.add(pinned)
val result = pinned.addressOf(0).rawValue val result = pinned.addressOf(0).rawValue
result result
...@@ -152,6 +153,15 @@ actual class InteropScope actual constructor() { ...@@ -152,6 +153,15 @@ actual class InteropScope actual constructor() {
return toInterop(nativePointerArray) 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 { actual fun InteropPointer.fromInteropNativePointerArray(): NativePointerArray {
TODO("implement native fromInteropNativePointerArray") 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