Unverified Commit b5e2a775 authored by Shagen Ogandzhanian's avatar Shagen Ogandzhanian Committed by GitHub

Commonize Font (#382)

parent eb4bee60
import de.undercouch.gradle.tasks.download.Download import de.undercouch.gradle.tasks.download.Download
import org.gradle.crypto.checksum.Checksum import org.gradle.crypto.checksum.Checksum
import org.gradle.api.tasks.testing.AbstractTestTask
import org.jetbrains.compose.internal.publishing.MavenCentralProperties import org.jetbrains.compose.internal.publishing.MavenCentralProperties
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
plugins { plugins {
kotlin("multiplatform") version "1.5.31" kotlin("multiplatform") version "1.5.31"
...@@ -207,7 +209,6 @@ kotlin { ...@@ -207,7 +209,6 @@ kotlin {
js(IR) { js(IR) {
browser() { browser() {
testTask { testTask {
testLogging.showStandardStreams = true
dependsOn(linkWasm) dependsOn(linkWasm)
useKarma { useKarma {
useChromeHeadless() useChromeHeadless()
...@@ -1144,3 +1145,12 @@ fun registerOrGetSkiaDirProvider(os: OS, arch: Arch): Provider<File> { ...@@ -1144,3 +1145,12 @@ fun registerOrGetSkiaDirProvider(os: OS, arch: Arch): Provider<File> {
}.map { it.destinationDir.absoluteFile } }.map { it.destinationDir.absoluteFile }
} }
} }
tasks.withType<AbstractTestTask> {
testLogging {
events("FAILED", "SKIPPED")
exceptionFormat = TestExceptionFormat.FULL
showStandardStreams = true
showStackTraces = true
}
}
...@@ -2,6 +2,15 @@ package org.jetbrains.skia ...@@ -2,6 +2,15 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.* import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.Library.Companion.staticLoad import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.InteropPointer
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.impl.NativePointer
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.withResult
class Font : Managed { class Font : Managed {
companion object { companion object {
...@@ -327,8 +336,12 @@ class Font : Managed { ...@@ -327,8 +336,12 @@ class Font : Managed {
fun getUTF32Glyphs(uni: IntArray?): ShortArray { fun getUTF32Glyphs(uni: IntArray?): ShortArray {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
withResult(ShortArray(uni?.size ?: 0)) { if (uni == null) {
_nGetUTF32Glyphs(_ptr, toInterop(uni), uni?.size ?: 0, it) shortArrayOf()
} else {
withResult(ShortArray(uni.size)) {
_nGetUTF32Glyphs(_ptr, toInterop(uni), uni.size, it)
}
} }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
...@@ -353,7 +366,7 @@ class Font : Managed { ...@@ -353,7 +366,7 @@ class Font : Managed {
fun getStringGlyphsCount(s: String?): Int { fun getStringGlyphsCount(s: String?): Int {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetStringGlyphsCount(_ptr, s) interopScope { _nGetStringGlyphsCount(_ptr, toInterop(s), s?.length ?: 0) }
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -368,7 +381,9 @@ class Font : Managed { ...@@ -368,7 +381,9 @@ class Font : Managed {
fun measureText(s: String?, p: Paint? = null): Rect { fun measureText(s: String?, p: Paint? = null): Rect {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nMeasureText(_ptr, s, getPtr(p)) Rect.fromInteropPointer() {
_nMeasureText(_ptr, toInterop(s), s?.length ?: 0, getPtr(p), it)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(p) reachabilityBarrier(p)
...@@ -383,11 +398,15 @@ class Font : Managed { ...@@ -383,11 +398,15 @@ class Font : Managed {
fun measureTextWidth(s: String?, p: Paint?): Float { fun measureTextWidth(s: String?, p: Paint?): Float {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nMeasureTextWidth( interopScope {
_ptr, _nMeasureTextWidth(
s, _ptr,
getPtr(p) toInterop(s),
) s?.length ?: 0,
getPtr(p)
)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(p) reachabilityBarrier(p)
...@@ -400,7 +419,13 @@ class Font : Managed { ...@@ -400,7 +419,13 @@ class Font : Managed {
fun getWidths(glyphs: ShortArray?): FloatArray { fun getWidths(glyphs: ShortArray?): FloatArray {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetWidths(_ptr, glyphs) if (glyphs == null) {
return floatArrayOf()
} else {
withResult(FloatArray(glyphs.size)) {
_nGetWidths(_ptr, toInterop(glyphs), glyphs.size, it)
}
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -419,11 +444,20 @@ class Font : Managed { ...@@ -419,11 +444,20 @@ class Font : Managed {
fun getBounds(glyphs: ShortArray?, p: Paint?): Array<Rect> { fun getBounds(glyphs: ShortArray?, p: Paint?): Array<Rect> {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetBounds(
_ptr, if (glyphs == null) {
glyphs, emptyArray()
getPtr(p) } else {
) Rect.fromInteropPointer(glyphs.size * 4) {
_nGetBounds(
_ptr,
toInterop(glyphs),
glyphs.size,
getPtr(p),
it
)
}
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
reachabilityBarrier(p) reachabilityBarrier(p)
...@@ -434,12 +468,7 @@ class Font : Managed { ...@@ -434,12 +468,7 @@ class Font : Managed {
* Retrieves the positions for each glyph. * Retrieves the positions for each glyph.
*/ */
fun getPositions(glyphs: ShortArray?): Array<Point> { fun getPositions(glyphs: ShortArray?): Array<Point> {
return try { return getPositions(glyphs, Point(0f, 0f))
Stats.onNativeCall()
_nGetPositions(_ptr, glyphs, 0f, 0f)
} finally {
reachabilityBarrier(this)
}
} }
/** /**
...@@ -448,22 +477,26 @@ class Font : Managed { ...@@ -448,22 +477,26 @@ class Font : Managed {
fun getPositions(glyphs: ShortArray?, offset: Point): Array<Point> { fun getPositions(glyphs: ShortArray?, offset: Point): Array<Point> {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetPositions(_ptr, glyphs, offset.x, offset.y) if (glyphs == null) {
emptyArray()
} else {
val positionsData = withResult(FloatArray(glyphs.size * 2)) {
_nGetPositions(_ptr, toInterop(glyphs), glyphs.size, offset.x, offset.y, it)
}
(0 until glyphs.size).map { i ->
Point(positionsData[2*i], positionsData[2*i + 1])
}.toTypedArray()
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
} }
/** /**
* Retrieves the x-positions for each glyph. * Retrieves the x-positions for each glyph, beginning at the specified origin.
*/ */
fun getXPositions(glyphs: ShortArray?): FloatArray { fun getXPositions(glyphs: ShortArray?): FloatArray {
return try { return getXPositions(glyphs, 0f)
Stats.onNativeCall()
_nGetXPositions(_ptr, glyphs, 0f)
} finally {
reachabilityBarrier(this)
}
} }
/** /**
...@@ -472,7 +505,13 @@ class Font : Managed { ...@@ -472,7 +505,13 @@ class Font : Managed {
fun getXPositions(glyphs: ShortArray?, offset: Float): FloatArray { fun getXPositions(glyphs: ShortArray?, offset: Float): FloatArray {
return try { return try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetXPositions(_ptr, glyphs, offset) if (glyphs == null) {
floatArrayOf()
} else {
withResult(FloatArray(glyphs.size)) {
_nGetXPositions(_ptr, toInterop(glyphs), offset, glyphs.size, it)
}
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -511,7 +550,9 @@ class Font : Managed { ...@@ -511,7 +550,9 @@ class Font : Managed {
val metrics: FontMetrics val metrics: FontMetrics
get() = try { get() = try {
Stats.onNativeCall() Stats.onNativeCall()
_nGetMetrics(_ptr) FontMetrics.fromInteropPointer {
_nGetMetrics(_ptr, it)
}
} finally { } finally {
reachabilityBarrier(this) reachabilityBarrier(this)
} }
...@@ -630,9 +671,6 @@ private external fun _nSetScaleX(ptr: NativePointer, value: Float) ...@@ -630,9 +671,6 @@ private external fun _nSetScaleX(ptr: NativePointer, value: Float)
@ExternalSymbolName("org_jetbrains_skia_Font__1nSetSkewX") @ExternalSymbolName("org_jetbrains_skia_Font__1nSetSkewX")
private external fun _nSetSkewX(ptr: NativePointer, value: Float) private external fun _nSetSkewX(ptr: NativePointer, value: Float)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetStringGlyphs")
private external fun _nGetStringGlyphs(ptr: NativePointer, str: String?): ShortArray?
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetUTF32Glyph") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetUTF32Glyph")
private external fun _nGetUTF32Glyph(ptr: NativePointer, uni: Int): Short private external fun _nGetUTF32Glyph(ptr: NativePointer, uni: Int): Short
...@@ -640,25 +678,25 @@ private external fun _nGetUTF32Glyph(ptr: NativePointer, uni: Int): Short ...@@ -640,25 +678,25 @@ private external fun _nGetUTF32Glyph(ptr: NativePointer, uni: Int): Short
private external fun _nGetUTF32Glyphs(ptr: NativePointer, uni: InteropPointer, uniArrLen: Int, resultGlyphs: InteropPointer) private external fun _nGetUTF32Glyphs(ptr: NativePointer, uni: InteropPointer, uniArrLen: Int, resultGlyphs: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetStringGlyphsCount") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetStringGlyphsCount")
private external fun _nGetStringGlyphsCount(ptr: NativePointer, str: String?): Int private external fun _nGetStringGlyphsCount(ptr: NativePointer, str: InteropPointer, len: Int): Int
@ExternalSymbolName("org_jetbrains_skia_Font__1nMeasureText") @ExternalSymbolName("org_jetbrains_skia_Font__1nMeasureText")
private external fun _nMeasureText(ptr: NativePointer, str: String?, paintPtr: NativePointer): Rect private external fun _nMeasureText(ptr: NativePointer, str: InteropPointer, len: Int, paintPtr: NativePointer, rect: InteropPointer): Rect
@ExternalSymbolName("org_jetbrains_skia_Font__1nMeasureTextWidth") @ExternalSymbolName("org_jetbrains_skia_Font__1nMeasureTextWidth")
private external fun _nMeasureTextWidth(ptr: NativePointer, str: String?, paintPtr: NativePointer): Float private external fun _nMeasureTextWidth(ptr: NativePointer, str: InteropPointer, len: Int, paintPtr: NativePointer): Float
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetWidths") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetWidths")
private external fun _nGetWidths(ptr: NativePointer, glyphs: ShortArray?): FloatArray private external fun _nGetWidths(ptr: NativePointer, glyphs: InteropPointer, count: Int, width: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetBounds") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetBounds")
private external fun _nGetBounds(ptr: NativePointer, glyphs: ShortArray?, paintPtr: NativePointer): Array<Rect> private external fun _nGetBounds(ptr: NativePointer, glyphs: InteropPointer, count: Int, paintPtr: NativePointer, bounds: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetPositions") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetPositions")
private external fun _nGetPositions(ptr: NativePointer, glyphs: ShortArray?, x: Float, y: Float): Array<Point> private external fun _nGetPositions(ptr: NativePointer, glyphs: InteropPointer, count: Int, x: Float, y: Float, positions: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetXPositions") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetXPositions")
private external fun _nGetXPositions(ptr: NativePointer, glyphs: ShortArray?, x: Float): FloatArray private external fun _nGetXPositions(ptr: NativePointer, glyphs: InteropPointer, x: Float, count: Int, positions: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetPath") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetPath")
private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer
...@@ -667,7 +705,7 @@ private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer ...@@ -667,7 +705,7 @@ private external fun _nGetPath(ptr: NativePointer, glyph: Short): NativePointer
private external fun _nGetPaths(ptr: NativePointer, glyphs: ShortArray?): Array<Path> private external fun _nGetPaths(ptr: NativePointer, glyphs: ShortArray?): Array<Path>
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetMetrics") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetMetrics")
private external fun _nGetMetrics(ptr: NativePointer): FontMetrics private external fun _nGetMetrics(ptr: NativePointer, metrics: InteropPointer)
@ExternalSymbolName("org_jetbrains_skia_Font__1nGetSpacing") @ExternalSymbolName("org_jetbrains_skia_Font__1nGetSpacing")
private external fun _nGetSpacing(ptr: NativePointer): Float private external fun _nGetSpacing(ptr: NativePointer): Float
...@@ -2,6 +2,7 @@ package org.jetbrains.skia ...@@ -2,6 +2,7 @@ package org.jetbrains.skia
import org.jetbrains.skia.impl.InteropPointer import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.InteropScope import org.jetbrains.skia.impl.InteropScope
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.withResult import org.jetbrains.skia.impl.withResult
import kotlin.jvm.JvmStatic import kotlin.jvm.JvmStatic
...@@ -116,6 +117,13 @@ open class Rect constructor(val left: Float, val top: Float, val right: Float, v ...@@ -116,6 +117,13 @@ open class Rect constructor(val left: Float, val top: Float, val right: Float, v
return Rect(result[0], result[1], result[2], result[3]) return Rect(result[0], result[1], result[2], result[3])
} }
internal fun fromInteropPointer(size: Int, block: InteropScope.(InteropPointer) -> Unit): Array<Rect> {
val result = withResult(FloatArray(size), block)
return result.toList().chunked(4).map { (left, top, right, bottom) ->
Rect(left, right, top, bottom)
}.toTypedArray()
}
internal fun fromInteropPointerNullable(block: (InteropPointer) -> Boolean): Rect? { internal fun fromInteropPointerNullable(block: (InteropPointer) -> Boolean): Rect? {
var result = true var result = true
val rect = fromInteropPointer { result = block(it) } val rect = fromInteropPointer { result = block(it) }
......
package org.jetbrains.skia
import org.jetbrains.skia.impl.use
import org.jetbrains.skia.tests.assertCloseEnough
import org.jetbrains.skia.tests.assertContentCloseEnough
import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.KotlinBackend
import org.jetbrains.skiko.OS
import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.kotlinBackend
import org.jetbrains.skiko.tests.runTest
import kotlin.test.Test
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals
private fun isLinuxOrJs() = (hostOs == OS.Linux) || (hostOs == OS.JS)
private fun isWin() = (hostOs == OS.Windows)
private val COARSE_EPSILON = 2.4f
class FontTests {
@Test
fun fontTest() = runTest {
val jbMono = Typeface.makeFromResource("./fonts/JetBrainsMono-Regular.ttf")
Font(jbMono).use { font ->
assertEquals(12f, font.size)
// TODO: we have to use bigger epsilon because of MacOS and definitely need to investigate what would be a better solution
assertCloseEnough(14.880001f, font.spacing, 10e-5f)
val glyphs = font.getStringGlyphs("ABCDE")
assertContentEquals(shortArrayOf(17, 18, 19, 20, 21), glyphs)
assertEquals(6, font.getStringGlyphsCount("EЙ를üẞ無"))
assertCloseEnough(50.4f, font.measureTextWidth("EЙ를üẞՇ無"), COARSE_EPSILON)
assertContentCloseEnough(floatArrayOf(7.2f, 7.2f, 7.2f, 7.2f, 7.2f), font.getWidths(glyphs), COARSE_EPSILON)
assertContentCloseEnough(floatArrayOf(0f, 7.2f, 14.4f, 21.6f, 28.8f), font.getXPositions(glyphs), COARSE_EPSILON)
assertContentCloseEnough(floatArrayOf(3f, 10.2f, 17.4f, 24.6f, 31.8f), font.getXPositions(glyphs, 3f), COARSE_EPSILON)
val firstGlyphPath = font.getPath(glyphs[0])!!
assertContentCloseEnough(
listOf(
Point(2.8798828f, -8.639648f),
Point(4.3916016f, -8.639648f),
Point(6.6708984f, 0.0f),
Point(5.5195312f, 0.0f),
Point(4.9189453f, -2.4345703f)
),
// TODO: investigate why we have nullable points at all
(firstGlyphPath.points.toList() as List<Point>).subList(0, 5),
10e-3f
)
assertContentCloseEnough(
arrayOf(
Point(0f, 0f),
Point(7.2f, 0f),
Point(14.4f, 0f),
Point(21.6f, 0f),
Point(28.8f, 0f),
), font.getPositions(glyphs),
COARSE_EPSILON
)
assertContentCloseEnough(
arrayOf(
Point(3f, 2f),
Point(10.2f, 2f),
Point(17.4f, 2f),
Point(24.6f, 2f),
Point(31.8f, 2f),
), font.getPositions(glyphs, Point(3f, 2f)),
COARSE_EPSILON
)
val expectedGlyphBounds = arrayOf(
Rect(-1f, -10.0f, 8.0f, 1.0f),
Rect(0f, -10.0f, 8.0f, 1.0f),
Rect(0f, -10.0f, 8.0f, 2.0f),
Rect(0f, -10.0f, 8.0f, 1.0f),
Rect(0f, -10.0f, 8.0f, 1.0f),
)
expectedGlyphBounds.zip(font.getBounds(glyphs)).forEach { (expected, actual) ->
assertCloseEnough(expected, actual, COARSE_EPSILON)
}
if (isLinuxOrJs()) {
assertEquals(26, firstGlyphPath.pointsCount)
assertCloseEnough(FontMetrics(
-11.64f,
-11.64f,
3.2400002f,
3.2400002f,
0f,
7.2000003f,
29.460001f,
-20.880001f,
8.58f,
6.6000004f,
8.64f,
0.54f,
1.4399999f,
0.54f,
-3.8999999f
), font.metrics, 10e-3f)
} else {
assertEquals(24, firstGlyphPath.pointsCount)
// TODO: this cross-platform differences look very suspicious and need to be addressed separately
assertCloseEnough(FontMetrics(
-11.64f,
-11.64f,
3.2400002f,
3.2400002f,
0f,
if (isWin()) 0f else 29.460001f,
29.460001f,
-20.880001f,
8.58f,
6.6000004f,
8.64f,
0.54f,
1.4399999f,
if (isWin()) 0.54f else null,
if (isWin()) -3.8999999f else null
), font.metrics, 10e-3f)
}
// assertEquals(Rect(1f, -12f, 21f, 0f), font.measureText("ЕЁЫ"))
}
}
}
\ No newline at end of file
package org.jetbrains.skia.tests package org.jetbrains.skia.tests
import org.jetbrains.skia.Color4f import org.jetbrains.skia.Color4f
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
...@@ -12,7 +13,9 @@ import kotlin.test.assertTrue ...@@ -12,7 +13,9 @@ 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) = abs(this - b) < epsilon private inline fun Float?.isCloseEnoughTo(b: Float?, epsilon: Float) =
if (this == null) b == null else if (b == null) false 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)
...@@ -22,6 +25,22 @@ private inline fun Color4f.isCloseEnoughTo(otherColor: Color4f, epsilon: Float) ...@@ -22,6 +25,22 @@ private inline fun Color4f.isCloseEnoughTo(otherColor: Color4f, epsilon: Float)
epsilon epsilon
) && b.isCloseEnoughTo(otherColor.b, epsilon) && a.isCloseEnoughTo(otherColor.a, epsilon) ) && b.isCloseEnoughTo(otherColor.b, epsilon) && a.isCloseEnoughTo(otherColor.a, epsilon)
private inline fun FontMetrics.isCloseEnoughTo(b: FontMetrics, epsilon: Float) =
top.isCloseEnoughTo(b.top, epsilon) &&
ascent.isCloseEnoughTo(b.ascent, epsilon) &&
descent.isCloseEnoughTo(b.descent, epsilon) &&
bottom.isCloseEnoughTo(b.bottom, epsilon) &&
leading.isCloseEnoughTo(b.leading, epsilon) &&
avgCharWidth.isCloseEnoughTo(b.avgCharWidth, epsilon) &&
maxCharWidth.isCloseEnoughTo(b.maxCharWidth, epsilon) &&
xMin.isCloseEnoughTo(b.xMin, epsilon) &&
xHeight.isCloseEnoughTo(b.xHeight, epsilon) &&
capHeight.isCloseEnoughTo(b.capHeight, epsilon) &&
underlineThickness.isCloseEnoughTo(b.underlineThickness, epsilon) &&
underlinePosition.isCloseEnoughTo(b.underlinePosition, epsilon) &&
strikeoutThickness.isCloseEnoughTo(b.strikeoutThickness, epsilon) &&
strikeoutPosition.isCloseEnoughTo(b.strikeoutPosition, epsilon)
private inline fun Rect.isCloseEnoughTo(rect: Rect, epsilon: Float): Boolean = private inline fun Rect.isCloseEnoughTo(rect: Rect, epsilon: Float): Boolean =
left.isCloseEnoughTo(rect.left, epsilon) && right.isCloseEnoughTo(rect.right, epsilon) left.isCloseEnoughTo(rect.left, epsilon) && right.isCloseEnoughTo(rect.right, epsilon)
&& top.isCloseEnoughTo(rect.top, epsilon) && bottom.isCloseEnoughTo(rect.bottom, epsilon) && top.isCloseEnoughTo(rect.top, epsilon) && bottom.isCloseEnoughTo(rect.bottom, epsilon)
...@@ -42,6 +61,10 @@ internal fun assertCloseEnough(expected: TextBox, actual: TextBox, epsilon: Floa ...@@ -42,6 +61,10 @@ internal fun assertCloseEnough(expected: TextBox, actual: TextBox, epsilon: Floa
assertTrue(expected.isCloseEnoughTo(actual, epsilon), message = "expected=$expected, actual=$actual, eps=$epsilon") assertTrue(expected.isCloseEnoughTo(actual, epsilon), message = "expected=$expected, actual=$actual, eps=$epsilon")
} }
internal fun assertCloseEnough(expected: FontMetrics, actual: FontMetrics, epsilon: Float = EPSILON) {
assertTrue(expected.isCloseEnoughTo(actual, epsilon), message = "expected=$expected, actual=$actual, eps=$epsilon")
}
internal fun assertCloseEnough(expected: Matrix33, actual: Matrix33, epsilon: Float = EPSILON) { internal fun assertCloseEnough(expected: Matrix33, actual: Matrix33, epsilon: Float = EPSILON) {
assertTrue( assertTrue(
expected.mat.zip(actual.mat).all { (a, b) -> a.isCloseEnoughTo(b, epsilon) }, expected.mat.zip(actual.mat).all { (a, b) -> a.isCloseEnoughTo(b, epsilon) },
...@@ -90,6 +113,10 @@ internal fun assertContentCloseEnough(expected: Array<Point>, actual: Array<Poin ...@@ -90,6 +113,10 @@ internal fun assertContentCloseEnough(expected: Array<Point>, actual: Array<Poin
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: List<Point>, actual: List<Point>, epsilon: Float = EPSILON) {
assertContentEquivalent(expected.iterator(), actual.iterator()) { a, b -> a.isCloseEnoughTo(b, epsilon) }
}
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) }
} }
...@@ -208,26 +208,14 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nSetSkewX ...@@ -208,26 +208,14 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nSetSkewX
instance->setSkewX(value); instance->setSkewX(value);
} }
extern "C" JNIEXPORT jshortArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphs
(JNIEnv* env, jclass jclass, jlong ptr, jstring str) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
jsize len = env->GetStringLength(str);
const jchar* chars = env->GetStringCritical(str, nullptr);
int count = instance->textToGlyphs(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, 0);
std::vector<short> glyphs(count);
instance->textToGlyphs(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, reinterpret_cast<SkGlyphID*>(glyphs.data()), count);
env->ReleaseStringCritical(str, chars);
return javaShortArray(env, glyphs);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Glyphs extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Glyphs
(JNIEnv* env, jclass jclass, jlong ptr, jintArray uniArr, jint uniArrLen, jshortArray resultGlyphs) { (JNIEnv* env, jclass jclass, jlong ptr, jintArray uniArr, jint uniArrLen, jshortArray resultGlyphs) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
jshort* shorts = env->GetShortArrayElements(resultGlyphs, nullptr); std::vector<jshort> glyphs(uniArrLen);
jint* uni = env->GetIntArrayElements(uniArr, nullptr); jint* uni = env->GetIntArrayElements(uniArr, nullptr);
instance->unicharsToGlyphs(reinterpret_cast<SkUnichar*>(uni), uniArrLen, reinterpret_cast<SkGlyphID*>(shorts)); instance->unicharsToGlyphs(reinterpret_cast<SkUnichar*>(uni), uniArrLen, reinterpret_cast<SkGlyphID*>(glyphs.data()));
env->ReleaseIntArrayElements(uniArr, uni, 0); env->ReleaseIntArrayElements(uniArr, uni, 0);
env->ReleaseShortArrayElements(resultGlyphs, shorts, 0); env->SetShortArrayRegion(resultGlyphs, 0, uniArrLen, glyphs.data());
} }
extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Glyph extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Glyph
...@@ -237,90 +225,81 @@ extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Gl ...@@ -237,90 +225,81 @@ extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Gl
} }
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphsCount extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphsCount
(JNIEnv* env, jclass jclass, jlong ptr, jstring str) { (JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
jsize len = env->GetStringLength(str); return instance->countText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16);
const jchar* chars = env->GetStringCritical(str, nullptr);
int count = instance->countText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16);
env->ReleaseStringCritical(str, chars);
return count;
} }
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureText extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureText
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jlong paintPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len, jlong paintPtr, jfloatArray res) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr)); SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr));
jsize len = env->GetStringLength(str);
const jchar* chars = env->GetStringCritical(str, nullptr); const jchar* chars = env->GetStringCritical(str, nullptr);
SkRect bounds; SkRect bounds;
instance->measureText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, &bounds, paint); instance->measureText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, &bounds, paint);
env->ReleaseStringCritical(str, chars); env->ReleaseStringCritical(str, chars);
return skija::Rect::fromSkRect(env, bounds); jfloat r[4] = {bounds.left(), bounds.top(), bounds.right(), bounds.bottom()};
env->SetFloatArrayRegion(res, 0, 4, r);
} }
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureTextWidth extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureTextWidth
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jlong paintPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len, jlong paintPtr) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr)); SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr));
jsize len = env->GetStringLength(str); return instance->measureText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint);
const jchar* chars = env->GetStringCritical(str, nullptr);
float width = instance->measureText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint);
env->ReleaseStringCritical(str, chars);
return width;
} }
extern "C" JNIEXPORT jfloatArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetWidths extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetWidths
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr) { (JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jint count, jfloatArray res) {
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);
std::vector<jfloat> widths(count); std::vector<jfloat> widths(count);
jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getWidths(reinterpret_cast<SkGlyphID*>(glyphs), count, widths.data()); instance->getWidths(reinterpret_cast<SkGlyphID*>(glyphs), count, widths.data());
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return javaFloatArray(env, widths); env->SetFloatArrayRegion(res, 0, count, widths.data());
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetBounds extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetBounds
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jlong paintPtr) { (JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jint count, jlong paintPtr, jfloatArray res) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr)); SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr));
int count = env->GetArrayLength(glyphsArr);
std::vector<SkRect> bounds(count); std::vector<SkRect> bounds(count);
jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getBounds(reinterpret_cast<SkGlyphID*>(glyphs), count, bounds.data(), paint); instance->getBounds(reinterpret_cast<SkGlyphID*>(glyphs), count, bounds.data(), paint);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
jobjectArray res = env->NewObjectArray(count, skija::Rect::cls, nullptr);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
skija::AutoLocal<jobject> boundsObj(env, skija::Rect::fromSkRect(env, bounds[i])); SkRect b = bounds[i];
env->SetObjectArrayElement(res, i, boundsObj.get()); float r[4] = {b.left(), b.right(), b.top(), b.bottom()};
env->SetFloatArrayRegion(res, 4*i, 4, r);
} }
return res;
} }
extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetPositions extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetPositions
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jfloat dx, jfloat dy) { (JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jint count, jfloat dx, jfloat dy, jfloatArray res) {
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);
std::vector<SkPoint> positions(count); std::vector<SkPoint> positions(count);
jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), {dx, dy}); instance->getPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), {dx, dy});
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return skija::Point::fromSkPoints(env, positions); std::vector<jfloat> r(count * 2);
for (int i = 0; i < count; i++) {
r[2*i] = positions[i].fX;
r[2*i + 1] = positions[i].fY;
}
env->SetFloatArrayRegion(res, 0, count * 2, r.data());
} }
extern "C" JNIEXPORT jfloatArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetXPositions extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetXPositions
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jfloat dx) { (JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr, jfloat dx, jint count, jfloatArray res) {
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);
std::vector<jfloat> positions(count); std::vector<jfloat> positions(count);
jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); jshort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getXPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), dx); instance->getXPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), dx);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0); env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return javaFloatArray(env, positions); env->SetFloatArrayRegion(res, 0, count, positions.data());
} }
extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_FontKt__1nGetPath extern "C" JNIEXPORT jlong JNICALL Java_org_jetbrains_skia_FontKt__1nGetPath
...@@ -360,12 +339,46 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetP ...@@ -360,12 +339,46 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_org_jetbrains_skia_FontKt__1nGetP
return ctx.paths; return ctx.paths;
} }
extern "C" JNIEXPORT jobject JNICALL Java_org_jetbrains_skia_FontKt__1nGetMetrics extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetMetrics
(JNIEnv* env, jclass jclass, jlong ptr, jshortArray glyphsArr) { (JNIEnv* env, jclass jclass, jlong ptr, jfloatArray res) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr)); SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkFontMetrics m; SkFontMetrics m;
instance->getMetrics(&m); instance->getMetrics(&m);
return skija::FontMetrics::toJava(env, m);
float f[15] = {
m.fTop,
m.fAscent,
m.fDescent,
m.fBottom,
m.fLeading,
m.fAvgCharWidth,
m.fMaxCharWidth,
m.fXMin,
m.fXMax,
m.fXHeight,
m.fCapHeight,
std::numeric_limits<float>::quiet_NaN(),
std::numeric_limits<float>::quiet_NaN(),
std::numeric_limits<float>::quiet_NaN(),
std::numeric_limits<float>::quiet_NaN()
};
SkScalar thickness;
SkScalar position;
if (m.hasUnderlineThickness(&thickness)) {
f[11] = thickness;
}
if (m.hasUnderlinePosition(&position)) {
f[12] = position;
}
if (m.hasStrikeoutThickness(&thickness)) {
f[13] = thickness;
}
if (m.hasStrikeoutPosition(&position)) {
f[14] = position;
}
env->SetFloatArrayRegion(res, 0, 15, f);
} }
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nGetSpacing extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nGetSpacing
......
...@@ -13,7 +13,7 @@ static void deleteFont(SkFont* font) { ...@@ -13,7 +13,7 @@ static void deleteFont(SkFont* font) {
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetFinalizer SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetFinalizer
() { () {
return reinterpret_cast<KNativePointer>((&deleteFont)); return reinterpret_cast<KNativePointer>(&deleteFont);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeDefault SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeDefault
...@@ -24,212 +24,192 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeDefault ...@@ -24,212 +24,192 @@ SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeDefault
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypeface SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypeface
(KNativePointer typefacePtr) { (KNativePointer typefacePtr) {
SkTypeface* typeface = reinterpret_cast<SkTypeface*>((typefacePtr)); SkTypeface* typeface = reinterpret_cast<SkTypeface*>(typefacePtr);
SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface)); SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface));
return reinterpret_cast<KNativePointer>(obj); return reinterpret_cast<KNativePointer>(obj);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypefaceSize SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypefaceSize
(KNativePointer typefacePtr, KFloat size) { (KNativePointer typefacePtr, KFloat size) {
SkTypeface* typeface = reinterpret_cast<SkTypeface*>((typefacePtr)); SkTypeface* typeface = reinterpret_cast<SkTypeface*>(typefacePtr);
SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface), size); SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface), size);
return reinterpret_cast<KNativePointer>(obj); return reinterpret_cast<KNativePointer>(obj);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypefaceSizeScaleSkew SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeTypefaceSizeScaleSkew
(KNativePointer typefacePtr, KFloat size, KFloat scaleX, KFloat skewX) { (KNativePointer typefacePtr, KFloat size, KFloat scaleX, KFloat skewX) {
SkTypeface* typeface = reinterpret_cast<SkTypeface*>((typefacePtr)); SkTypeface* typeface = reinterpret_cast<SkTypeface*>(typefacePtr);
SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface), size, scaleX, skewX); SkFont* obj = new SkFont(sk_ref_sp<SkTypeface>(typeface), size, scaleX, skewX);
return reinterpret_cast<KNativePointer>(obj); return reinterpret_cast<KNativePointer>(obj);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeClone SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nMakeClone
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* clone = new SkFont(*instance); SkFont* clone = new SkFont(*instance);
return reinterpret_cast<KNativePointer>(clone); return reinterpret_cast<KNativePointer>(clone);
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nEquals SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nEquals
(KNativePointer ptr, KNativePointer otherPtr) { (KNativePointer ptr, KNativePointer otherPtr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* other = reinterpret_cast<SkFont*>((otherPtr)); SkFont* other = reinterpret_cast<SkFont*>(otherPtr);
return *instance == *other; return *instance == *other;
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsAutoHintingForced SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsAutoHintingForced
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isForceAutoHinting(); return instance->isForceAutoHinting();
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nAreBitmapsEmbedded SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nAreBitmapsEmbedded
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isEmbeddedBitmaps(); return instance->isEmbeddedBitmaps();
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsSubpixel SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsSubpixel
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isSubpixel(); return instance->isSubpixel();
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nAreMetricsLinear SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nAreMetricsLinear
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isLinearMetrics(); return instance->isLinearMetrics();
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsEmboldened SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsEmboldened
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isEmbolden(); return instance->isEmbolden();
} }
SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsBaselineSnapped SKIKO_EXPORT KBoolean org_jetbrains_skia_Font__1nIsBaselineSnapped
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->isBaselineSnap(); return instance->isBaselineSnap();
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetAutoHintingForced SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetAutoHintingForced
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setForceAutoHinting(value); instance->setForceAutoHinting(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetBitmapsEmbedded SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetBitmapsEmbedded
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setEmbeddedBitmaps(value); instance->setEmbeddedBitmaps(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSubpixel SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSubpixel
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setSubpixel(value); instance->setSubpixel(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetMetricsLinear SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetMetricsLinear
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setLinearMetrics(value); instance->setLinearMetrics(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetEmboldened SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetEmboldened
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setEmbolden(value); instance->setEmbolden(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetBaselineSnapped SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetBaselineSnapped
(KNativePointer ptr, KBoolean value) { (KNativePointer ptr, KBoolean value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setBaselineSnap(value); instance->setBaselineSnap(value);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetEdging SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetEdging
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return static_cast<KInt>(instance->getEdging()); return static_cast<KInt>(instance->getEdging());
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetEdging SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetEdging
(KNativePointer ptr, KInt value) { (KNativePointer ptr, KInt value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setEdging(static_cast<SkFont::Edging>(value)); instance->setEdging(static_cast<SkFont::Edging>(value));
} }
SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetHinting SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetHinting
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return static_cast<KInt>(instance->getHinting()); return static_cast<KInt>(instance->getHinting());
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetHinting SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetHinting
(KNativePointer ptr, KInt value) { (KNativePointer ptr, KInt value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setHinting(static_cast<SkFontHinting>(value)); instance->setHinting(static_cast<SkFontHinting>(value));
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetTypeface SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetTypeface
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkTypeface* typeface = instance->refTypeface().release(); SkTypeface* typeface = instance->refTypeface().release();
return reinterpret_cast<KNativePointer>(typeface); return reinterpret_cast<KNativePointer>(typeface);
} }
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetTypefaceOrDefault SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetTypefaceOrDefault
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkTypeface* typeface = instance->refTypefaceOrDefault().release(); SkTypeface* typeface = instance->refTypefaceOrDefault().release();
return reinterpret_cast<KNativePointer>(typeface); return reinterpret_cast<KNativePointer>(typeface);
} }
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSize SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSize
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->getSize(); return instance->getSize();
} }
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetScaleX SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetScaleX
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->getScaleX(); return instance->getScaleX();
} }
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSkewX SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSkewX
(KNativePointer ptr) { (KNativePointer ptr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->getSkewX(); return instance->getSkewX();
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetTypeface SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetTypeface
(KNativePointer ptr, KNativePointer typefacePtr) { (KNativePointer ptr, KNativePointer typefacePtr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkTypeface* typeface = reinterpret_cast<SkTypeface*>((typefacePtr)); SkTypeface* typeface = reinterpret_cast<SkTypeface*>(typefacePtr);
instance->setTypeface(sk_ref_sp(typeface)); instance->setTypeface(sk_ref_sp(typeface));
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSize SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSize
(KNativePointer ptr, KFloat value) { (KNativePointer ptr, KFloat value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setSize(value); instance->setSize(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetScaleX SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetScaleX
(KNativePointer ptr, KFloat value) { (KNativePointer ptr, KFloat value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setScaleX(value); instance->setScaleX(value);
} }
SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSkewX SKIKO_EXPORT void org_jetbrains_skia_Font__1nSetSkewX
(KNativePointer ptr, KFloat value) { (KNativePointer ptr, KFloat value) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
instance->setSkewX(value); instance->setSkewX(value);
} }
SKIKO_EXPORT KShort* org_jetbrains_skia_Font__1nGetStringGlyphs
(KNativePointer ptr, KInteropPointer str) {
TODO("implement org_jetbrains_skia_Font__1nGetStringGlyphs");
}
#if 0
SKIKO_EXPORT KShort* org_jetbrains_skia_Font__1nGetStringGlyphs
(KNativePointer ptr, KInteropPointer str) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr));
jsize len = env->GetStringLength(str);
const KChar* chars = env->GetStringCritical(str, nullptr);
int count = instance->textToGlyphs(chars, len * sizeof(KChar), SkTextEncoding::kUTF16, nullptr, 0);
std::vector<short> glyphs(count);
instance->textToGlyphs(chars, len * sizeof(KChar), SkTextEncoding::kUTF16, reinterpret_cast<SkGlyphID*>(glyphs.data()), count);
env->ReleaseStringCritical(str, chars);
return javaShortArray(env, glyphs);
}
#endif
SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetUTF32Glyphs SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetUTF32Glyphs
(KNativePointer ptr, KInt* uniArr, KInt uniArrLen, KShort* resultGlyphs) { (KNativePointer ptr, KInt* uniArr, KInt uniArrLen, KShort* resultGlyphs) {
SkFont* instance = reinterpret_cast<SkFont*>(ptr); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
...@@ -239,166 +219,84 @@ SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetUTF32Glyphs ...@@ -239,166 +219,84 @@ SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetUTF32Glyphs
); );
} }
SKIKO_EXPORT KShort org_jetbrains_skia_Font__1nGetUTF32Glyph SKIKO_EXPORT KShort org_jetbrains_skia_Font__1nGetUTF32Glyph
(KNativePointer ptr, KInt uni) { (KNativePointer ptr, KInt uni) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->unicharToGlyph(uni); return instance->unicharToGlyph(uni);
} }
SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetStringGlyphsCount
(KNativePointer ptr, KInteropPointer str) {
TODO("implement org_jetbrains_skia_Font__1nGetStringGlyphsCount");
}
#if 0
SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetStringGlyphsCount SKIKO_EXPORT KInt org_jetbrains_skia_Font__1nGetStringGlyphsCount
(KNativePointer ptr, KInteropPointer str) { (KNativePointer ptr, char* str, KInt len) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
jsize len = env->GetStringLength(str); return instance->countText(str, len * sizeof(KChar), SkTextEncoding::kUTF16);
const KChar* chars = env->GetStringCritical(str, nullptr);
int count = instance->countText(chars, len * sizeof(KChar), SkTextEncoding::kUTF16);
env->ReleaseStringCritical(str, chars);
return count;
}
#endif
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Font__1nMeasureText
(KNativePointer ptr, KInteropPointer str, KNativePointer paintPtr) {
TODO("implement org_jetbrains_skia_Font__1nMeasureText");
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_Font__1nMeasureText
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Font__1nMeasureText (KNativePointer ptr, KInteropPointer str, KInt len, KNativePointer paintPtr, KFloat* res) {
(KNativePointer ptr, KInteropPointer str, KNativePointer paintPtr) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
SkPaint* paint = reinterpret_cast<SkPaint*>((paintPtr));
jsize len = env->GetStringLength(str);
const KChar* chars = env->GetStringCritical(str, nullptr);
SkRect bounds; SkRect bounds;
instance->measureText(chars, len * sizeof(KChar), SkTextEncoding::kUTF16, &bounds, paint); instance->measureText(str, len * sizeof(KChar), SkTextEncoding::kUTF16, &bounds, paint);
env->ReleaseStringCritical(str, chars);
return skija::Rect::fromSkRect(env, bounds);
}
#endif
res[0] = bounds.left();
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nMeasureTextWidth res[1] = bounds.top();
(KNativePointer ptr, KInteropPointer str, KNativePointer paintPtr) { res[2] = bounds.right();
TODO("implement org_jetbrains_skia_Font__1nMeasureTextWidth"); res[3] = bounds.bottom();
} }
#if 0
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nMeasureTextWidth
(KNativePointer ptr, KInteropPointer str, KNativePointer paintPtr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>((paintPtr));
jsize len = env->GetStringLength(str);
const KChar* chars = env->GetStringCritical(str, nullptr);
float width = instance->measureText(chars, len * sizeof(KChar), SkTextEncoding::kUTF16, nullptr, paint);
env->ReleaseStringCritical(str, chars);
return width;
}
#endif
SKIKO_EXPORT KFloat* org_jetbrains_skia_Font__1nGetWidths
(KNativePointer ptr, KShort* glyphsArr) {
TODO("implement org_jetbrains_skia_Font__1nGetWidths");
}
#if 0 SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nMeasureTextWidth
SKIKO_EXPORT KFloat* org_jetbrains_skia_Font__1nGetWidths (KNativePointer ptr, char* str, KInt len, KNativePointer paintPtr) {
(KNativePointer ptr, KShort* glyphsArr) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
int count = env->GetArrayLength(glyphsArr); return instance->measureText(str, len * sizeof(KChar), SkTextEncoding::kUTF16, nullptr, paint);
std::vector<KFloat> widths(count);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getWidths(reinterpret_cast<SkGlyphID*>(glyphs), count, widths.data());
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return javaFloatArray(env, widths);
} }
#endif
SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetWidths
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetBounds (KNativePointer ptr, KShort* glyphs, KInt count, KFloat* widths) {
(KNativePointer ptr, KShort* glyphsArr, KNativePointer paintPtr) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
TODO("implement org_jetbrains_skia_Font__1nGetBounds"); instance->getWidths(reinterpret_cast<SkGlyphID*>(glyphs), count, widths);
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetBounds
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetBounds (KNativePointer ptr, KShort* glyphs, KInt count, KNativePointer paintPtr, KFloat* res) {
(KNativePointer ptr, KShort* glyphsArr, KNativePointer paintPtr) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkPaint* paint = reinterpret_cast<SkPaint*>(paintPtr);
SkPaint* paint = reinterpret_cast<SkPaint*>((paintPtr));
int count = env->GetArrayLength(glyphsArr);
std::vector<SkRect> bounds(count); std::vector<SkRect> bounds(count);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getBounds(reinterpret_cast<SkGlyphID*>(glyphs), count, bounds.data(), paint); instance->getBounds(reinterpret_cast<SkGlyphID*>(glyphs), count, bounds.data(), paint);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
KInteropPointerArray res = env->NewObjectArray(count, skija::Rect::cls, nullptr);
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
skija::AutoLocal<KInteropPointer> boundsObj(env, skija::Rect::fromSkRect(env, bounds[i])); SkRect b = bounds[i];
env->SetObjectArrayElement(res, i, boundsObj.get()); res[4*i] = b.left();
res[4*i + 1] = b.right();
res[4*i + 2] = b.top();
res[4*i + 3] = b.bottom();
} }
return res;
}
#endif
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPositions
(KNativePointer ptr, KShort* glyphsArr, KFloat dx, KFloat dy) {
TODO("implement org_jetbrains_skia_Font__1nGetPositions");
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetPositions
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPositions (KNativePointer ptr, KShort* glyphs, KInt count, KFloat dx, KFloat dy, KFloat* res) {
(KNativePointer ptr, KShort* glyphsArr, KFloat dx, KFloat dy) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* instance = reinterpret_cast<SkFont*>((ptr));
int count = env->GetArrayLength(glyphsArr);
std::vector<SkPoint> positions(count); std::vector<SkPoint> positions(count);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), {dx, dy}); instance->getPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), {dx, dy});
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return skija::Point::fromSkPoints(env, positions);
}
#endif
SKIKO_EXPORT KFloat* org_jetbrains_skia_Font__1nGetXPositions for (int i = 0; i < count; i++) {
(KNativePointer ptr, KShort* glyphsArr, KFloat dx) { res[2*i] = positions[i].fX;
TODO("implement org_jetbrains_skia_Font__1nGetXPositions"); res[2*i + 1] = positions[i].fY;
}
} }
#if 0 SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetXPositions
SKIKO_EXPORT KFloat* org_jetbrains_skia_Font__1nGetXPositions (KNativePointer ptr, KShort* glyphs, KFloat dx, KInt count, KFloat* positions) {
(KNativePointer ptr, KShort* glyphsArr, KFloat dx) { SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); instance->getXPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions, dx);
int count = env->GetArrayLength(glyphsArr);
std::vector<KFloat> positions(count);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
instance->getXPos(reinterpret_cast<SkGlyphID*>(glyphs), count, positions.data(), dx);
env->ReleaseShortArrayElements(glyphsArr, glyphs, 0);
return javaFloatArray(env, positions);
} }
#endif
SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetPath SKIKO_EXPORT KNativePointer org_jetbrains_skia_Font__1nGetPath
(KNativePointer ptr, KShort glyph) { (KNativePointer ptr, KShort glyph) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
SkPath* path = new SkPath(); SkPath* path = new SkPath();
instance->getPath(glyph, path); instance->getPath(glyph, path);
return reinterpret_cast<KNativePointer>(path); return reinterpret_cast<KNativePointer>(path);
...@@ -413,8 +311,7 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths ...@@ -413,8 +311,7 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths
#if 0 #if 0
SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths
(KNativePointer ptr, KShort* glyphsArr) { (KNativePointer ptr, KShort* glyphsArr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
int count = env->GetArrayLength(glyphsArr); int count = env->GetArrayLength(glyphsArr);
KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr); KShort* glyphs = env->GetShortArrayElements(glyphsArr, nullptr);
...@@ -443,32 +340,47 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths ...@@ -443,32 +340,47 @@ SKIKO_EXPORT KInteropPointerArray org_jetbrains_skia_Font__1nGetPaths
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Font__1nGetMetrics SKIKO_EXPORT void org_jetbrains_skia_Font__1nGetMetrics
(KNativePointer ptr, KShort* glyphsArr) { (KNativePointer ptr, KFloat* fontMetrics) {
TODO("implement org_jetbrains_skia_Font__1nGetMetrics"); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
}
#if 0
SKIKO_EXPORT KInteropPointer org_jetbrains_skia_Font__1nGetMetrics
(KNativePointer ptr, KShort* glyphsArr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr));
SkFontMetrics m; SkFontMetrics m;
instance->getMetrics(&m); instance->getMetrics(&m);
return skija::FontMetrics::toJava(env, m);
}
#endif
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSpacing fontMetrics[0] = m.fTop;
(KNativePointer ptr, KShort* glyphsArr) { fontMetrics[1] = m.fAscent;
TODO("implement org_jetbrains_skia_Font__1nGetSpacing"); fontMetrics[2] = m.fDescent;
fontMetrics[3] = m.fBottom;
fontMetrics[4] = m.fLeading;
fontMetrics[5] = m.fAvgCharWidth;
fontMetrics[6] = m.fMaxCharWidth;
fontMetrics[7] = m.fXMin;
fontMetrics[8] = m.fXMax;
fontMetrics[9] = m.fXHeight;
fontMetrics[10] = m.fCapHeight;
fontMetrics[11] = std::numeric_limits<float>::quiet_NaN();
fontMetrics[12] = std::numeric_limits<float>::quiet_NaN();
fontMetrics[13] = std::numeric_limits<float>::quiet_NaN();
fontMetrics[14] = std::numeric_limits<float>::quiet_NaN();
SkScalar thickness;
SkScalar position;
if (m.hasUnderlineThickness(&thickness)) {
fontMetrics[11] = thickness;
}
if (m.hasUnderlinePosition(&position)) {
fontMetrics[12] = position;
}
if (m.hasStrikeoutThickness(&thickness)) {
fontMetrics[13] = thickness;
}
if (m.hasStrikeoutPosition(&position)) {
fontMetrics[14] = position;
}
} }
#if 0
SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSpacing SKIKO_EXPORT KFloat org_jetbrains_skia_Font__1nGetSpacing
(KNativePointer ptr, KShort* glyphsArr) { (KNativePointer ptr, KShort* glyphsArr) {
SkFont* instance = reinterpret_cast<SkFont*>((ptr)); SkFont* instance = reinterpret_cast<SkFont*>(ptr);
return instance->getSpacing(); return instance->getSpacing();
} }
#endif
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