Unverified Commit 7e9e0beb authored by Shagen Ogandzhanian's avatar Shagen Ogandzhanian Committed by GitHub

Commonization - leftovers (#404)

parent 0428658f
...@@ -537,7 +537,15 @@ class Font : Managed { ...@@ -537,7 +537,15 @@ class Font : Managed {
fun getPaths(glyphs: ShortArray?): Array<Path> { fun getPaths(glyphs: ShortArray?): Array<Path> {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetPaths(_ptr, glyphs) arrayDecoderScope({
ArrayDecoder(
interopScope { _nGetPaths(_ptr, toInterop(glyphs), glyphs?.size ?: 0) }, Path_nGetFinalizer()
)
}) { arrayDecoder ->
(0 until arrayDecoder.size).map { i->
Path(arrayDecoder.release(i))
}.toTypedArray()
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -702,7 +710,7 @@ private external fun _nGetXPositions(ptr: NativePointer, glyphs: InteropPointer, ...@@ -702,7 +710,7 @@ private external fun _nGetXPositions(ptr: NativePointer, glyphs: InteropPointer,
private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetPaths") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetPaths")
private external fun _nGetPaths(ptr: NativePointer, glyphs: ShortArray?): Array<Path> private external fun _nGetPaths(ptr: NativePointer, glyphs: InteropPointer, count: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetMetrics") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetMetrics")
private external fun _nGetMetrics(ptr: NativePointer, metrics: InteropPointer) private external fun _nGetMetrics(ptr: NativePointer, metrics: InteropPointer)
......
...@@ -45,7 +45,7 @@ class FontFeature(val _tag: Int, val value: Int, val start: UInt, val end: UInt) ...@@ -45,7 +45,7 @@ class FontFeature(val _tag: Int, val value: Int, val start: UInt, val end: UInt)
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (other === this) return true if (other === this) return true
if (other !is FontFeature) return false if (other !is FontFeature) return false
if (this.tag != other) return false if (this.tag != other.tag) return false
if (value != other.value) return false if (value != other.value) return false
if (start != other.start) return false if (start != other.start) return false
return end == other.end return end == other.end
......
...@@ -2164,7 +2164,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol ...@@ -2164,7 +2164,7 @@ class Path internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHol
@ExternalSymbolName("org_jetbrains_skia_Path__1nGetFinalizer") @ExternalSymbolName("org_jetbrains_skia_Path__1nGetFinalizer")
private external fun Path_nGetFinalizer(): NativePointer internal external fun Path_nGetFinalizer(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Path__1nMake") @ExternalSymbolName("org_jetbrains_skia_Path__1nMake")
private external fun Path_nMake(): NativePointer private external fun Path_nMake(): NativePointer
......
...@@ -33,7 +33,7 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -33,7 +33,7 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) {
*/ */
fun makeFromName(name: String?, style: FontStyle): Typeface { fun makeFromName(name: String?, style: FontStyle): Typeface {
Stats.onNativeCall() Stats.onNativeCall()
return Typeface(_nMakeFromName(name, style._value)) return interopScope { Typeface(_nMakeFromName(toInterop(name), style._value)) }
} }
/** /**
...@@ -395,7 +395,9 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -395,7 +395,9 @@ class Typeface internal constructor(ptr: NativePointer) : RefCnt(ptr) {
val bounds: Rect val bounds: Rect
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
Typeface_nGetBounds(_ptr) Rect.fromInteropPointer {
Typeface_nGetBounds(_ptr, it)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -422,7 +424,7 @@ private external fun Typeface_nGetUTF32Glyphs( ...@@ -422,7 +424,7 @@ private external fun Typeface_nGetUTF32Glyphs(
private external fun Typeface_nGetUTF32Glyph(ptr: NativePointer, unichar: Int): Short private external fun Typeface_nGetUTF32Glyph(ptr: NativePointer, unichar: Int): Short
@ExternalSymbolName("org_jetbrains_skia_Typeface__1nGetBounds") @ExternalSymbolName("org_jetbrains_skia_Typeface__1nGetBounds")
private external fun Typeface_nGetBounds(ptr: NativePointer): Rect private external fun Typeface_nGetBounds(ptr: NativePointer, bounds: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Typeface__1nGetFontStyle") @ExternalSymbolName("org_jetbrains_skia_Typeface__1nGetFontStyle")
private external fun _nGetFontStyle(ptr: NativePointer): Int private external fun _nGetFontStyle(ptr: NativePointer): Int
...@@ -443,7 +445,7 @@ private external fun _nGetVariationAxesCount(ptr: NativePointer): Int ...@@ -443,7 +445,7 @@ private external fun _nGetVariationAxesCount(ptr: NativePointer): Int
private external fun _nGetVariationAxes(ptr: NativePointer, axisData: InteropPointer, axisCount: Int) private external fun _nGetVariationAxes(ptr: NativePointer, axisData: InteropPointer, axisCount: Int)
@ExternalSymbolName("org_jetbrains_skia_Typeface__1nMakeFromName") @ExternalSymbolName("org_jetbrains_skia_Typeface__1nMakeFromName")
private external fun _nMakeFromName(name: String?, fontStyle: Int): NativePointer private external fun _nMakeFromName(name: InteropPointer, fontStyle: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_Typeface__1nMakeFromFile") @ExternalSymbolName("org_jetbrains_skia_Typeface__1nMakeFromFile")
internal external fun _nMakeFromFile(path: InteropPointer, index: Int): NativePointer internal external fun _nMakeFromFile(path: InteropPointer, index: Int): NativePointer
......
...@@ -16,7 +16,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -16,7 +16,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
Stats.onNativeCall() Stats.onNativeCall()
} }
val fontManagersCount: NativePointer val fontManagersCount: Int
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetFontManagersCount(_ptr) _nGetFontManagersCount(_ptr)
...@@ -104,7 +104,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -104,7 +104,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
fun defaultFallback(unicode: Int, style: FontStyle, locale: String?): Typeface? { fun defaultFallback(unicode: Int, style: FontStyle, locale: String?): Typeface? {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
val ptr = _nDefaultFallbackChar(_ptr, unicode, style._value, locale) val ptr = interopScope { _nDefaultFallbackChar(_ptr, unicode, style._value, toInterop(locale)) }
if (ptr == NullPointer) null else Typeface(ptr) if (ptr == NullPointer) null else Typeface(ptr)
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
...@@ -140,7 +140,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) { ...@@ -140,7 +140,7 @@ class FontCollection internal constructor(ptr: NativePointer) : RefCnt(ptr) {
private external fun _nMake(): NativePointer private external fun _nMake(): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nGetFontManagersCount") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nGetFontManagersCount")
private external fun _nGetFontManagersCount(ptr: NativePointer): NativePointer private external fun _nGetFontManagersCount(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nSetAssetFontManager")
private external fun _nSetAssetFontManager(ptr: NativePointer, fontManagerPtr: NativePointer): NativePointer private external fun _nSetAssetFontManager(ptr: NativePointer, fontManagerPtr: NativePointer): NativePointer
...@@ -161,7 +161,7 @@ private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer ...@@ -161,7 +161,7 @@ private external fun _nGetFallbackManager(ptr: NativePointer): NativePointer
private external fun _nFindTypefaces(ptr: NativePointer, familyNames: InteropPointer, len: Int, fontStyle: Int): NativePointer private external fun _nFindTypefaces(ptr: NativePointer, familyNames: InteropPointer, len: Int, fontStyle: Int): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar")
private external fun _nDefaultFallbackChar(ptr: NativePointer, unicode: Int, fontStyle: Int, locale: String?): NativePointer private external fun _nDefaultFallbackChar(ptr: NativePointer, unicode: Int, fontStyle: Int, locale: InteropPointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallback") @ExternalSymbolName("org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallback")
private external fun _nDefaultFallback(ptr: NativePointer): NativePointer private external fun _nDefaultFallback(ptr: NativePointer): NativePointer
......
package org.jetbrains.skia.paragraph package org.jetbrains.skia.paragraph
import org.jetbrains.skia.Point import org.jetbrains.skia.Point
import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.InteropScope
import org.jetbrains.skia.impl.withResult
class Shadow(val color: Int, val offsetX: Float, val offsetY: Float, val blurSigma: Double) { class Shadow(val color: Int, val offsetX: Float, val offsetY: Float, val blurSigma: Double) {
...@@ -48,4 +51,13 @@ class Shadow(val color: Int, val offsetX: Float, val offsetY: Float, val blurSig ...@@ -48,4 +51,13 @@ class Shadow(val color: Int, val offsetX: Float, val offsetY: Float, val blurSig
fun withBlurSigma(_blurSigma: Double): Shadow { fun withBlurSigma(_blurSigma: Double): Shadow {
return if (blurSigma == _blurSigma) this else Shadow(color, offsetX, offsetY, _blurSigma) return if (blurSigma == _blurSigma) this else Shadow(color, offsetX, offsetY, _blurSigma)
} }
companion object
}
fun Shadow.Companion.fromInteropPointer(shadowsCount: Int, block: InteropScope.(InteropPointer) -> Unit): Array<Shadow> {
return withResult(IntArray(shadowsCount * 5), block).toList().chunked(5).map { (color, offsetX, offsetY, blurSigmaA, blurSigmaB) ->
val blurSigma = (blurSigmaA.toLong() shl 32) or (blurSigmaB.toLong() and 0xFFFFFFFFL)
Shadow(color, Float.fromBits(offsetX), Float.fromBits(offsetY), Double.fromBits(blurSigma))
}.toTypedArray()
} }
\ No newline at end of file
...@@ -154,10 +154,12 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -154,10 +154,12 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
return this return this
} }
val shadows: Array<org.jetbrains.skia.paragraph.Shadow> val shadows: Array<Shadow>
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetShadows(_ptr) Shadow.fromInteropPointer(_nGetShadowsCount(_ptr)) {
_nGetShadows(_ptr, it)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -195,7 +197,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -195,7 +197,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
fun addFontFeature(f: FontFeature): TextStyle { fun addFontFeature(f: FontFeature): TextStyle {
Stats.onNativeCall() Stats.onNativeCall()
_nAddFontFeature(_ptr, f.tag, f.value) interopScope {
_nAddFontFeature(_ptr, toInterop(f.tag), f.value)
}
return this return this
} }
...@@ -230,7 +234,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz ...@@ -230,7 +234,9 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
var fontFamilies: Array<String> var fontFamilies: Array<String>
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
TextStyle_nGetFontFamilies(_ptr) arrayDecoderScope({ ArrayDecoder(TextStyle_nGetFontFamilies(_ptr), ManagedString_nGetFinalizer()) }) { arrayDecoder ->
(0 until arrayDecoder.size).map { i -> withStringResult(arrayDecoder.release(i)) }
}.toTypedArray()
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -434,7 +440,7 @@ private external fun TextStyle_nGetFontSize(ptr: NativePointer): Float ...@@ -434,7 +440,7 @@ private external fun TextStyle_nGetFontSize(ptr: NativePointer): Float
private external fun TextStyle_nSetFontSize(ptr: NativePointer, size: Float) private external fun TextStyle_nSetFontSize(ptr: NativePointer, size: Float)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies")
private external fun TextStyle_nGetFontFamilies(ptr: NativePointer): Array<String> private external fun TextStyle_nGetFontFamilies(ptr: NativePointer): NativePointer
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetHeight") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetHeight")
private external fun TextStyle_nGetHeight(ptr: NativePointer): Float private external fun TextStyle_nGetHeight(ptr: NativePointer): Float
...@@ -484,8 +490,11 @@ private external fun _nSetDecorationStyle( ...@@ -484,8 +490,11 @@ private external fun _nSetDecorationStyle(
thicknessMultiplier: Float thicknessMultiplier: Float
) )
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetShadowsCount")
private external fun _nGetShadowsCount(ptr: NativePointer): Int
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetShadows") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetShadows")
private external fun _nGetShadows(ptr: NativePointer): Array<Shadow> private external fun _nGetShadows(ptr: NativePointer, res: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nAddShadow") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nAddShadow")
private external fun _nAddShadow(ptr: NativePointer, color: Int, offsetX: Float, offsetY: Float, blurSigma: Double) private external fun _nAddShadow(ptr: NativePointer, color: Int, offsetX: Float, offsetY: Float, blurSigma: Double)
...@@ -500,7 +509,7 @@ private external fun _nGetFontFeatures(ptr: NativePointer, resultIntsArray: Inte ...@@ -500,7 +509,7 @@ private external fun _nGetFontFeatures(ptr: NativePointer, resultIntsArray: Inte
private external fun _nGetFontFeaturesSize(ptr: NativePointer): Int 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: InteropPointer, value: Int)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nClearFontFeatures") @ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nClearFontFeatures")
private external fun _nClearFontFeatures(ptr: NativePointer) private external fun _nClearFontFeatures(ptr: NativePointer)
......
...@@ -51,6 +51,8 @@ class FontTests { ...@@ -51,6 +51,8 @@ class FontTests {
10e-3f 10e-3f
) )
assertContentEquals(font.getPath(glyphs[0])!!.points, font.getPaths(glyphs)[0].points)
assertContentCloseEnough( assertContentCloseEnough(
arrayOf( arrayOf(
Point(0f, 0f), Point(0f, 0f),
......
...@@ -4,11 +4,8 @@ import org.jetbrains.skia.FontMgr ...@@ -4,11 +4,8 @@ import org.jetbrains.skia.FontMgr
import org.jetbrains.skia.FontStyle import org.jetbrains.skia.FontStyle
import org.jetbrains.skia.Typeface import org.jetbrains.skia.Typeface
import org.jetbrains.skia.impl.use import org.jetbrains.skia.impl.use
import org.jetbrains.skia.paragraph.FontCollection
import org.jetbrains.skia.paragraph.TypefaceFontProvider
import org.jetbrains.skia.tests.makeFromResource import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.tests.SkipJsTarget import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.tests.SkipNativeTarget
import org.jetbrains.skiko.tests.runTest import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test import kotlin.test.Test
import kotlin.test.assertContentEquals import kotlin.test.assertContentEquals
...@@ -17,7 +14,7 @@ import kotlin.test.assertEquals ...@@ -17,7 +14,7 @@ import kotlin.test.assertEquals
class FontCollectionTest { class FontCollectionTest {
@Test @Test
fun fontCollectionTest() = runTest { fun familyNameTest() = runTest {
val fm = TypefaceFontProvider() val fm = TypefaceFontProvider()
val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf", 0) val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf", 0)
fm.registerTypeface(jbMono) fm.registerTypeface(jbMono)
...@@ -28,8 +25,71 @@ class FontCollectionTest { ...@@ -28,8 +25,71 @@ class FontCollectionTest {
typefaces.first()!!.let { typeface -> typefaces.first()!!.let { typeface ->
assertEquals("JetBrains Mono", typeface.familyName) assertEquals("JetBrains Mono", typeface.familyName)
assertEquals(FontStyle.NORMAL, typeface.fontStyle) assertEquals(FontStyle.NORMAL, typeface.fontStyle)
} }
} }
} }
@Test
fun fontCollectionTest() = runTest {
val fm = TypefaceFontProvider()
val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf", 0)
fm.registerTypeface(jbMono)
val inter = Typeface.makeFromResource("./fonts/Inter-Hinted-Regular.ttf", 0)
fm.registerTypeface(inter, "Interface")
// FontCollection
val fontCollection = FontCollection()
fontCollection.setAssetFontManager(fm)
assertEquals(1, fontCollection.fontManagersCount)
assertEquals(2, jbMono.refCount)
fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL)[0]!!.use { jbMono2 ->
assertEquals(4, jbMono.refCount)
assertEquals(4, jbMono2.refCount)
fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL)[0]!!.use { jbMono3 ->
assertEquals(5, jbMono.refCount)
assertEquals(5, jbMono2.refCount)
assertEquals(5, jbMono3.refCount)
}
assertEquals(4, jbMono.refCount)
assertEquals(4, jbMono2.refCount)
}
//TODO: commented out assertions seem not to be isolated and are turned off till further investigation
assertContentEquals(arrayOf(), fontCollection.findTypefaces(arrayOf("No Such Font"), FontStyle.NORMAL))
assertContentEquals(arrayOf(jbMono), fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL))
assertContentEquals(arrayOf(), fontCollection.findTypefaces(arrayOf("Inter"), FontStyle.NORMAL))
assertContentEquals(arrayOf(inter), fontCollection.findTypefaces(arrayOf("Interface"), FontStyle.NORMAL))
assertContentEquals(
arrayOf(jbMono, inter),
fontCollection.findTypefaces(arrayOf("JetBrains Mono", "Interface"), FontStyle.NORMAL)
)
val defaultFM = FontMgr.default
fontCollection.setDefaultFontManager(defaultFM)
assertEquals(2, fontCollection.fontManagersCount)
fontCollection.fallbackManager!!.use { ffm ->
//assertEquals(4, defaultFM.refCount)
assertEquals(defaultFM, ffm)
}
if (kotlinBackend.isNotJs()) {
fontCollection.defaultFallback(65 /* A */, FontStyle.NORMAL, "en-US")!!.use { t1 ->
val refCnt: Int = t1.refCount
fontCollection.defaultFallback(65 /* A */, FontStyle.NORMAL, "en-US")!!.use { t2 ->
assertEquals(refCnt + 1, t1.refCount)
assertEquals(refCnt + 1, t2.refCount)
assertEquals(t1, t2)
}
}
}
}
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import org.jetbrains.skia.FontMetrics ...@@ -5,6 +5,7 @@ import org.jetbrains.skia.FontMetrics
import org.jetbrains.skia.Matrix33 import org.jetbrains.skia.Matrix33
import org.jetbrains.skia.Point import org.jetbrains.skia.Point
import org.jetbrains.skia.Rect import org.jetbrains.skia.Rect
import org.jetbrains.skia.paragraph.Shadow
import org.jetbrains.skia.paragraph.TextBox import org.jetbrains.skia.paragraph.TextBox
import org.jetbrains.skiko.KotlinBackend import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend import org.jetbrains.skiko.kotlinBackend
...@@ -14,11 +15,17 @@ import kotlin.test.assertTrue ...@@ -14,11 +15,17 @@ import kotlin.test.assertTrue
private val EPSILON = if (kotlinBackend == KotlinBackend.JS) 0.00001f else 0.00000001f private val EPSILON = if (kotlinBackend == KotlinBackend.JS) 0.00001f else 0.00000001f
private inline fun Float?.isCloseEnoughTo(b: Float?, epsilon: Float) = private inline fun Float?.isCloseEnoughTo(b: Float?, epsilon: Float) =
if (this == null) b == null else if (b == null) false else abs(this - b) < epsilon if (this == null) b == null else if (b == null) false else if (epsilon == 0f) this == b else abs(this - b) < epsilon
private inline fun Point.isCloseEnoughTo(b: Point, epsilon: Float) = private inline fun Point.isCloseEnoughTo(b: Point, epsilon: Float) =
x.isCloseEnoughTo(b.x, epsilon) && y.isCloseEnoughTo(b.y, epsilon) x.isCloseEnoughTo(b.x, epsilon) && y.isCloseEnoughTo(b.y, epsilon)
private inline fun Shadow.isCloseEnoughTo(b: Shadow, epsilon: Float) =
(color == b.color)
&& (offsetX.isCloseEnoughTo(b.offsetX, epsilon))
&& (offsetY.isCloseEnoughTo(b.offsetY, epsilon))
&& (blurSigma == b.blurSigma)
private inline fun Color4f.isCloseEnoughTo(otherColor: Color4f, epsilon: Float) = private inline fun Color4f.isCloseEnoughTo(otherColor: Color4f, epsilon: Float) =
r.isCloseEnoughTo(otherColor.r, epsilon) && g.isCloseEnoughTo( r.isCloseEnoughTo(otherColor.r, epsilon) && g.isCloseEnoughTo(
otherColor.g, otherColor.g,
...@@ -120,3 +127,7 @@ internal fun assertContentCloseEnough(expected: List<Point>, actual: List<Point> ...@@ -120,3 +127,7 @@ internal fun assertContentCloseEnough(expected: List<Point>, actual: List<Point>
internal fun assertContentCloseEnough(expected: Array<TextBox>, actual: Array<TextBox>, epsilon: Float = EPSILON) { internal fun assertContentCloseEnough(expected: Array<TextBox>, actual: Array<TextBox>, epsilon: Float = EPSILON) {
assertContentEquivalent(expected.iterator(), actual.iterator()) { a, b -> a.isCloseEnoughTo(b, epsilon) } assertContentEquivalent(expected.iterator(), actual.iterator()) { a, b -> a.isCloseEnoughTo(b, epsilon) }
} }
internal fun assertContentCloseEnough(expected: Array<Shadow>, actual: Array<Shadow>, epsilon: Float = EPSILON) {
assertContentEquivalent(expected.iterator(), actual.iterator()) { a, b -> a.isCloseEnoughTo(b, epsilon) }
}
package org.jetbrains.skiko package org.jetbrains.skiko
import org.jetbrains.skia.* import org.jetbrains.skia.*
import org.jetbrains.skia.tests.assertCloseEnough
import org.jetbrains.skia.tests.makeFromResource import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.tests.SkipJsTarget import org.jetbrains.skiko.tests.SkipJsTarget
import org.jetbrains.skiko.tests.SkipNativeTarget import org.jetbrains.skiko.tests.SkipNativeTarget
...@@ -36,6 +37,8 @@ class TypefaceTest { ...@@ -36,6 +37,8 @@ class TypefaceTest {
assertTrue(inter.getTableData("loca")!!.size > 0) assertTrue(inter.getTableData("loca")!!.size > 0)
assertEquals(2816, inter.unitsPerEm) assertEquals(2816, inter.unitsPerEm)
assertCloseEnough(Rect(left=-0.7386364f, top=-1.0909091f, right=2.5830965f, bottom=0.31960228f), inter.bounds, 10e-4f)
} }
@Test @Test
......
package org.jetbrains.skiko.paragraph package org.jetbrains.skiko.paragraph
import org.jetbrains.skia.Color import org.jetbrains.skia.Color
import org.jetbrains.skia.FontFeature
import org.jetbrains.skia.impl.use import org.jetbrains.skia.impl.use
import org.jetbrains.skia.paragraph.DecorationLineStyle import org.jetbrains.skia.paragraph.DecorationLineStyle
import org.jetbrains.skia.paragraph.DecorationStyle import org.jetbrains.skia.paragraph.DecorationStyle
import org.jetbrains.skia.paragraph.Shadow
import org.jetbrains.skia.paragraph.TextStyle import org.jetbrains.skia.paragraph.TextStyle
import org.jetbrains.skia.paragraph.TextStyleAttribute import org.jetbrains.skia.paragraph.TextStyleAttribute
import org.jetbrains.skia.tests.assertContentCloseEnough
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.kotlinBackend
import kotlin.test.* import kotlin.test.*
class TextStyleTest { class TextStyleTest {
...@@ -45,6 +50,7 @@ class TextStyleTest { ...@@ -45,6 +50,7 @@ class TextStyleTest {
ts1.fontFamilies = arrayOf("foo", "qux") ts1.fontFamilies = arrayOf("foo", "qux")
ts2.fontFamilies = arrayOf("foo", "qux") ts2.fontFamilies = arrayOf("foo", "qux")
assertEquals(ts1, ts2) assertEquals(ts1, ts2)
assertContentEquals(ts1.fontFamilies, ts2.fontFamilies)
ts1.fontFamilies = arrayOf("foo", "qux") ts1.fontFamilies = arrayOf("foo", "qux")
ts2.fontFamilies = arrayOf("bar", "zig") ts2.fontFamilies = arrayOf("bar", "zig")
assertNotEquals(ts1, ts2) assertNotEquals(ts1, ts2)
...@@ -52,6 +58,19 @@ class TextStyleTest { ...@@ -52,6 +58,19 @@ class TextStyleTest {
} }
} }
@Test
fun textStyleAddFontFeatureTest() {
TextStyle().use { textStyle ->
textStyle.addFontFeature(FontFeature("FONT", true))
textStyle.addFontFeatures(arrayOf(FontFeature("TONF", true), FontFeature("IDDI", false)))
assertContentEquals(arrayOf(
FontFeature(84, 1, 0u, 4294967295u),
FontFeature(70, 1, 0u, 4294967295u),
FontFeature(73, 0, 0u, 4294967295u),
), textStyle.fontFeatures)
}
}
@Test @Test
fun textStyleLocaleTest() { fun textStyleLocaleTest() {
TextStyle().use { textStyle -> TextStyle().use { textStyle ->
...@@ -97,6 +116,22 @@ class TextStyleTest { ...@@ -97,6 +116,22 @@ class TextStyleTest {
} }
@Test @Test
fun textShadowsTest() {
TextStyle().use { textStyle ->
textStyle.addShadow(Shadow(200, 0.2f, 0.4f, 1.4))
textStyle.addShadows(arrayOf(Shadow(100, 0.3f, 0.1f, 2.0)))
assertContentCloseEnough(
arrayOf(
Shadow(200, 0.2f, 0.4f, 1.4),
Shadow(100, 0.3f, 0.1f, 2.0)
), textStyle.shadows, if (kotlinBackend == KotlinBackend.JS) 0.00001f else 0f
)
}
}
fun textStyleBaselineTest() { fun textStyleBaselineTest() {
TextStyle().use { textStyle -> TextStyle().use { textStyle ->
assertEquals(0.0f, textStyle.baselineShift) assertEquals(0.0f, textStyle.baselineShift)
......
...@@ -310,33 +310,27 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_FontKt__1nGetPath ...@@ -310,33 +310,27 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_FontKt__1nGetPath
return reinterpret_cast<jlong>(path); return reinterpret_cast<jlong>(path);
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetPaths extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_FontKt__1nGetPaths
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr) { (JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jint count) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
int count = env->GetArrayLength(glyphsArr);
jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
struct Ctx { struct Ctx {
jobjectArray paths; std::vector<jlong>* paths;
jsize idx; } ctx = { new std::vector<jlong>() };
JNIEnv* env;
} ctx = { env->NewObjectArray(count, skija::Path::cls, nullptr), 0, env };
instance->getPaths(reinterpret_cast<SkGlyphID*>(glyphs), count, [](const SkPath* orig, const SkMatrix& mx, void* voidCtx) { instance->getPaths(reinterpret_cast<SkGlyphID*>(glyphs), count, [](const SkPath* orig, const SkMatrix& mx, void* voidCtx) {
Ctx* ctx = static_cast<Ctx*>(voidCtx); Ctx* ctx = static_cast<Ctx*>(voidCtx);
if (orig) { if (orig) {
SkPath* path = new SkPath(); SkPath* path = new SkPath();
orig->transform(mx, path); orig->transform(mx, path);
jobject pathObj = ctx->env->NewObject(skija::Path::cls, skija::Path::ctor, reinterpret_cast<jlong>(path)); ctx->paths->push_back(reinterpret_cast<jlong>(path));
ctx->env->SetObjectArrayElement(ctx->paths, ctx->idx, pathObj);
ctx->env->DeleteLocalRef(pathObj);
++ctx->idx;
} }
}, &ctx); }, &ctx);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return ctx.paths; return reinterpret_cast<jlong>(ctx.paths);
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetMetrics extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetMetrics
......
...@@ -78,8 +78,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nMakeFro ...@@ -78,8 +78,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nMakeFro
SkString name = skString(env, nameStr); SkString name = skString(env, nameStr);
SkFontStyle style = skija::FontStyle::fromJava(styleValue); SkFontStyle style = skija::FontStyle::fromJava(styleValue);
sk_sp<SkTypeface> instance = SkTypeface::MakeFromName(name.c_str(), style); sk_sp<SkTypeface> instance = SkTypeface::MakeFromName(name.c_str(), style);
SkTypeface* ptr = instance.release(); return reinterpret_cast<jlong>(instance.release());
return reinterpret_cast<jlong>(ptr);
} }
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nMakeFromFile extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nMakeFromFile
...@@ -222,8 +221,10 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nGetFami ...@@ -222,8 +221,10 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_TypefaceKt__1nGetFami
return reinterpret_cast<jlong>(new SkString(name)); return reinterpret_cast<jlong>(new SkString(name));
} }
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_TypefaceKt_Typeface_1nGetBounds extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_TypefaceKt_Typeface_1nGetBounds
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr, jfloatArray res) {
SkTypeface* instance = reinterpret_cast<SkTypeface*>(static_cast<uintptr_t>(ptr)); SkTypeface* instance = reinterpret_cast<SkTypeface*>(static_cast<uintptr_t>(ptr));
return skija::Rect::fromSkRect(env, instance->getBounds()); SkRect b = instance->getBounds();
float r[4] = {b.left(), b.top(), b.right(), b.bottom()};
env->SetFloatArrayRegion(res, 0, 4, r);
} }
\ No newline at end of file
...@@ -400,6 +400,15 @@ static inline jint rawBits(jfloat f) { ...@@ -400,6 +400,15 @@ static inline jint rawBits(jfloat f) {
return u.i; return u.i;
} }
static inline jlong rawBits(jdouble d) {
union {
jdouble d;
jlong l;
} u;
u.d = d;
return u.l;
}
static inline jfloat fromBits(jint i) { static inline jfloat fromBits(jint i) {
union { union {
jfloat f; jfloat f;
......
...@@ -13,7 +13,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollect ...@@ -13,7 +13,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollect
return reinterpret_cast<jlong>(ptr); return reinterpret_cast<jlong>(ptr);
} }
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nGetFontManagersCount extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_paragraph_FontCollectionKt__1nGetFontManagersCount
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
FontCollection* instance = reinterpret_cast<FontCollection*>(static_cast<uintptr_t>(ptr)); FontCollection* instance = reinterpret_cast<FontCollection*>(static_cast<uintptr_t>(ptr));
return instance->getFontManagersCount(); return instance->getFontManagersCount();
......
...@@ -144,17 +144,23 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_ ...@@ -144,17 +144,23 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_
instance->setFontStyle(skija::FontStyle::fromJava(fontStyleValue)); instance->setFontStyle(skija::FontStyle::fromJava(fontStyleValue));
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetShadows extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetShadowsCount
(JNIEnv* env, jclass jclass, jlong ptr) { (JNIEnv* env, jclass jclass, jlong ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
return static_cast<jint>(instance->getShadows().size());
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetShadows
(JNIEnv* env, jclass jclass, jlong ptr, jintArray res) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr)); TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
std::vector<TextShadow> shadows = instance->getShadows(); std::vector<TextShadow> shadows = instance->getShadows();
jobjectArray shadowsArr = env->NewObjectArray((jsize) shadows.size(), skija::paragraph::Shadow::cls, nullptr);
for (int i = 0; i < shadows.size(); ++i) { for (int i = 0; i < shadows.size(); ++i) {
const TextShadow& s = shadows[i]; const TextShadow& s = shadows[i];
skija::AutoLocal<jobject> shadowObj(env, env->NewObject(skija::paragraph::Shadow::cls, skija::paragraph::Shadow::ctor, s.fColor, s.fOffset.fX, s.fOffset.fY, s.fBlurSigma)); jlong blurSigma = rawBits(s.fBlurSigma);
env->SetObjectArrayElement(shadowsArr, i, shadowObj.get()); jint r[5] = {static_cast<jint>(s.fColor), rawBits(s.fOffset.fX), rawBits(s.fOffset.fY), (jint)(blurSigma >> 32), (jint)blurSigma };
env->SetIntArrayRegion(res, 5 * i, 5, r);
} }
return shadowsArr;
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nAddShadow extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nAddShadow
...@@ -210,10 +216,14 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_ ...@@ -210,10 +216,14 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_
instance->setFontSize(size); instance->setFontSize(size);
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nGetFontFamilies extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nGetFontFamilies
(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));
return javaStringArray(env, instance->getFontFamilies()); std::vector<jlong>* res = new std::vector<jlong>();
for (auto& f : instance->getFontFamilies()) {
res->push_back(reinterpret_cast<jlong>(new SkString(f)));
}
return reinterpret_cast<jlong>(res);
} }
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nSetFontFamilies extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nSetFontFamilies
......
package org.jetbrains.skiko.paragraph
import org.jetbrains.skia.FontMgr
import org.jetbrains.skia.FontStyle
import org.jetbrains.skia.Typeface
import org.jetbrains.skia.paragraph.FontCollection
import org.jetbrains.skia.paragraph.TypefaceFontProvider
import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals
class FontCollectionTest {
@Test
fun fontCollectionTest() = runTest {
val fm = TypefaceFontProvider()
val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf", 0)
fm.registerTypeface(jbMono)
val inter = Typeface.makeFromResource("./fonts/Inter-Hinted-Regular.ttf", 0)
fm.registerTypeface(inter, "Interface")
// FontCollection
val fontCollection = FontCollection()
fontCollection.setAssetFontManager(fm)
assertEquals(1L, fontCollection.fontManagersCount)
assertEquals(2, jbMono.refCount)
fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL)[0]!!.use { jbMono2 ->
assertEquals(4, jbMono.refCount)
assertEquals(4, jbMono2.refCount)
fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL)[0]!!.use { jbMono3 ->
assertEquals(5, jbMono.refCount)
assertEquals(5, jbMono2.refCount)
assertEquals(5, jbMono3.refCount)
}
assertEquals(4, jbMono.refCount)
assertEquals(4, jbMono2.refCount)
}
//TODO: commented out assertions seem not to be isolated and are turned off till further investigation
// assertEquals(3, jbMono.refCount)
assertContentEquals(arrayOf(), fontCollection.findTypefaces(arrayOf("No Such Font"), FontStyle.NORMAL))
assertContentEquals(arrayOf(jbMono), fontCollection.findTypefaces(arrayOf("JetBrains Mono"), FontStyle.NORMAL))
assertContentEquals(arrayOf(), fontCollection.findTypefaces(arrayOf("Inter"), FontStyle.NORMAL))
assertContentEquals(arrayOf(inter), fontCollection.findTypefaces(arrayOf("Interface"), FontStyle.NORMAL))
assertContentEquals(
arrayOf(jbMono, inter),
fontCollection.findTypefaces(arrayOf("JetBrains Mono", "Interface"), FontStyle.NORMAL)
)
val defaultFM = FontMgr.default
fontCollection.setDefaultFontManager(defaultFM)
assertEquals(2L, fontCollection.fontManagersCount)
// assertEquals(3, defaultFM.refCount)
fontCollection.fallbackManager.use { ffm ->
//assertEquals(4, defaultFM.refCount)
assertEquals(defaultFM, ffm)
}
// assertEquals(3, defaultFM.refCount)
fontCollection.defaultFallback(65 /* A */, FontStyle.NORMAL, "en-US")!!.use { t1 ->
val refCnt: Int = t1.refCount
fontCollection.defaultFallback(65 /* A */, FontStyle.NORMAL, "en-US")!!.use { t2 ->
assertEquals(refCnt + 1, t1.refCount)
assertEquals(refCnt + 1, t2.refCount)
assertEquals(t1, t2)
}
}
}
}
\ No newline at end of file
...@@ -303,42 +303,25 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetPath ...@@ -303,42 +303,25 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetPath
} }
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetPaths
(KNativePointer ptr, KShort* glyphsArr) { (KNativePointer ptr, KShort* glyphs, KInt count) {
TODO("implement org_jetbrains_skia_Font__1nGetPaths");
}
#if 0
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths
(KNativePointer ptr, KShort* glyphsArr) {
SkFont* instance = reinterpret_cast<SkFont*>(ptr); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
int count = env->GetArrayLength(glyphsArr);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
struct Ctx { struct Ctx {
KInteropPointerArray paths; std::vector<KNativePointer>* paths;
jsize idx; } ctx = { new std::vector<KNativePointer>() };
JNIEnv* env;
} ctx = { env->NewObjectArray(count, skija::Path::cls, nullptr), 0, env };
instance->getPaths(reinterpret_cast<SkGlyphID*>(glyphs), count, [](const SkPath* orig, const SkMatrix& mx, void* voidCtx) { instance->getPaths(reinterpret_cast<SkGlyphID*>(glyphs), count, [](const SkPath* orig, const SkMatrix& mx, void* voidCtx) {
Ctx* ctx = static_cast<Ctx*>(voidCtx); Ctx* ctx = static_cast<Ctx*>(voidCtx);
if (orig) { if (orig) {
SkPath* path = new SkPath(); SkPath* path = new SkPath();
orig->transform(mx, path); orig->transform(mx, path);
KInteropPointer pathObj = ctx->env->NewObject(skija::Path::cls, skija::Path::ctor, reinterpret_cast<KNativePointer>(path)); ctx->paths->push_back(reinterpret_cast<KNativePointer>(path));
ctx->env->SetObjectArrayElement(ctx->paths, ctx->idx, pathObj);
ctx->env->DeleteLocalRef(pathObj);
++ctx->idx;
} }
}, &ctx); }, &ctx);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); return reinterpret_cast<KNativePointer>(ctx.paths);
return ctx.paths;
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetMetrics SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetMetrics
(KNativePointer ptr, KFloat* fontMetrics) { (KNativePointer ptr, KFloat* fontMetrics) {
......
...@@ -62,25 +62,6 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_FontMgr__1nMatchFamilyStyleCharac ...@@ -62,25 +62,6 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_FontMgr__1nMatchFamilyStyleCharac
return reinterpret_cast<KNativePointer>(typeface); return reinterpret_cast<KNativePointer>(typeface);
} }
#if 0
SKIKO_EXPORT KNativePointer org_jetbrains_skia_FontMgr__1nMatchFamilyStyleCharacter
(KNativePointer ptr, KInteropPointer familyNameStr, KInt fontStyle, KInteropPointerArray bcp47Array, KInt character) {
SkFontMgr* instance = reinterpret_cast<SkFontMgr*>((ptr));
SkString familyName = skString(env, familyNameStr);
std::vector<SkString> bcp47Strings = skStringVector(env, bcp47Array);
std::vector<const char*> bcp47(bcp47Strings.size());
for (int i = 0; i < bcp47.size(); ++i)
bcp47[i] = bcp47Strings[i].c_str();
SkTypeface* typeface = instance->matchFamilyStyleCharacter(familyName.c_str(), skija::FontStyle::fromJava(fontStyle), bcp47.data(), (int) bcp47.size(), character);
return reinterpret_cast<KNativePointer>(typeface);
}
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_FontMgr__1nMakeFromData SKIKO_EXPORT KNativePointer org_jetbrains_skia_FontMgr__1nMakeFromData
(KNativePointer ptr, KNativePointer dataPtr, KInt ttcIndex) { (KNativePointer ptr, KNativePointer dataPtr, KInt ttcIndex) {
SkFontMgr* instance = reinterpret_cast<SkFontMgr*>((ptr)); SkFontMgr* instance = reinterpret_cast<SkFontMgr*>((ptr));
......
...@@ -80,7 +80,10 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeDefault ...@@ -80,7 +80,10 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeDefault
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeFromName SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeFromName
(KInteropPointer nameStr, KInt styleValue) { (KInteropPointer nameStr, KInt styleValue) {
TODO("implement org_jetbrains_skia_Typeface__1nMakeFromName"); SkString name = skString(nameStr);
SkFontStyle style = skija::FontStyle::fromKotlin(styleValue);
sk_sp<SkTypeface> instance = SkTypeface::MakeFromName(name.c_str(), style);
return reinterpret_cast<KNativePointer>(instance.release());
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeFromFile SKIKO_EXPORT KNativePointer org_jetbrains_skia_Typeface__1nMakeFromFile
...@@ -214,16 +217,12 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Typeface__1nGetFamilyName ...@@ -214,16 +217,12 @@ SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Typeface__1nGetFamilyName
return new SkString(name); return new SkString(name);
} }
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Typeface__1nGetBounds SKIKO_EXPORT void org_jetbrains_skia_Typeface__1nGetBounds
(KNativePointer ptr) { (KNativePointer ptr, KFloat* bounds) {
TODO("implement org_jetbrains_skia_Typeface__1nGetBounds"); SkTypeface* instance = reinterpret_cast<SkTypeface*>(ptr);
} SkRect b = instance->getBounds();
bounds[0] = b.left();
#if 0 bounds[1] = b.top();
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Typeface__1nGetBounds bounds[2] = b.right();
(KNativePointer ptr) { bounds[3] = b.bottom();
SkTypeface* instance = reinterpret_cast<SkTypeface*>((ptr));
return skija::Rect::fromSkRect(env, instance->getBounds());
} }
#endif
...@@ -145,6 +145,15 @@ static inline KInt rawBits(KFloat f) { ...@@ -145,6 +145,15 @@ static inline KInt rawBits(KFloat f) {
return u.i; return u.i;
} }
static inline KLong rawBits(KDouble d) {
union {
KDouble d;
KLong l;
} u;
u.d = d;
return u.l;
}
static inline KFloat fromBits(KInt i) { static inline KFloat fromBits(KInt i) {
union { union {
KFloat f; KFloat f;
......
...@@ -79,7 +79,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nFindT ...@@ -79,7 +79,8 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nFindT
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar
(KNativePointer ptr, KInt unicode, KInt fontStyle, KInteropPointer locale) { (KNativePointer ptr, KInt unicode, KInt fontStyle, KInteropPointer locale) {
TODO("implement org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallbackChar"); FontCollection* instance = reinterpret_cast<FontCollection*>(ptr);
return reinterpret_cast<KNativePointer>(instance->defaultFallback(unicode, skija::FontStyle::fromKotlin(fontStyle), skString(locale)).release());
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallback SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_FontCollection__1nDefaultFallback
......
...@@ -141,26 +141,27 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle ...@@ -141,26 +141,27 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontStyle
instance->setFontStyle(skija::FontStyle::fromKotlin(fontStyleValue)); instance->setFontStyle(skija::FontStyle::fromKotlin(fontStyleValue));
} }
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows SKIKO_EXPORT KInt org_jetbrains_skia_paragraph_TextStyle__1nGetShadowsCount
(KNativePointer ptr) { (KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetShadows"); TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
return static_cast<KInt>(instance->getShadows().size());
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nGetShadows
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetShadows (KNativePointer ptr, KInt* res) {
(KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr); TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
std::vector<TextShadow> shadows = instance->getShadows(); std::vector<TextShadow> shadows = instance->getShadows();
KInteropPointerArray shadowsArr = env->NewObjectArray((jsize) shadows.size(), skija::paragraph::Shadow::cls, nullptr);
for (int i = 0; i < shadows.size(); ++i) { for (int i = 0; i < shadows.size(); ++i) {
const TextShadow& s = shadows[i]; const TextShadow& s = shadows[i];
skija::AutoLocal<KInteropPointer> shadowObj(env, env->NewObject(skija::paragraph::Shadow::cls, skija::paragraph::Shadow::ctor, s.fColor, s.fOffset.fX, s.fOffset.fY, s.fBlurSigma)); KLong blurSigma = rawBits(s.fBlurSigma);
env->SetObjectArrayElement(shadowsArr, i, shadowObj.get()); res[5*i] = s.fColor;
res[5*i + 1] = rawBits(s.fOffset.fX);
res[5*i + 2] = rawBits(s.fOffset.fY);
res[5*i + 3] = (KInt)(blurSigma >> 32);
res[5*i + 4] = (KInt)blurSigma;
} }
return shadowsArr;
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddShadow SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddShadow
(KNativePointer ptr, KInt color, KFloat offsetX, KFloat offsetY, KDouble blurSigma) { (KNativePointer ptr, KInt color, KFloat offsetX, KFloat offsetY, KDouble blurSigma) {
...@@ -189,19 +190,11 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures ...@@ -189,19 +190,11 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nGetFontFeatures
} }
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature
(KNativePointer ptr, KInteropPointer nameStr, KInt value) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nAddFontFeature");
}
#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);
instance->addFontFeature(skString(env, nameStr), value); instance->addFontFeature(skString(nameStr), value);
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nClearFontFeatures SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nClearFontFeatures
(KNativePointer ptr) { (KNativePointer ptr) {
...@@ -222,19 +215,15 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontSize ...@@ -222,19 +215,15 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontSize
} }
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies SKIKO_EXPORT KNativePointer org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies
(KNativePointer ptr) {
TODO("implement org_jetbrains_skia_paragraph_TextStyle__1nGetFontFamilies");
}
#if 0
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);
return javaStringArray(env, instance->getFontFamilies()); std::vector<KNativePointer>* res = new std::vector<KNativePointer>();
for (auto& f : instance->getFontFamilies()) {
res->push_back(reinterpret_cast<KNativePointer>(new SkString(f)));
}
return reinterpret_cast<KNativePointer>(res);
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies
...@@ -244,7 +233,6 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies ...@@ -244,7 +233,6 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetFontFamilies
} }
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetHeight SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetHeight
(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