Skip to content

Commit 355ede9

Browse files
authored
Replace half leading to top ratio (JetBrains#989)
Support configurable vertical centering for implementing Compose's `LineHeightStyle.Alignment`. https://youtrack.jetbrains.com/issue/CMP-2602 See also: - JetBrains/skia#5 - JetBrains/compose-multiplatform-core#1569
1 parent 1ca83c1 commit 355ede9

File tree

8 files changed

+126
-1
lines changed

8 files changed

+126
-1
lines changed

skiko/gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ kotlin.code.style=official
22
deploy.version=0.0.0
33

44

5-
dependencies.skia=m126-1d69d9b-2
5+
dependencies.skia=m126-d2aaacc35d-1
66

77
# you can override general skia dependencies by passing platform-specific property:
88
# dependencies.skia.android-arm64

skiko/src/commonMain/kotlin/org/jetbrains/skia/paragraph/StrutStyle.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ class StrutStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finali
211211
return this
212212
}
213213

214+
@Deprecated("Replaced by topRatio")
214215
var isHalfLeading: Boolean
215216
get() = try {
216217
Stats.onNativeCall()
@@ -222,6 +223,8 @@ class StrutStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finali
222223
setHalfLeading(value)
223224
}
224225

226+
// Same as topRatio = halfLeading ? 0.5f : -1.0f
227+
@Deprecated("Replaced by topRatio")
225228
fun setHalfLeading(value: Boolean): StrutStyle {
226229
try {
227230
Stats.onNativeCall()
@@ -232,6 +235,29 @@ class StrutStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finali
232235
return this
233236
}
234237

238+
// [0..1]: the ratio of ascent to ascent+descent
239+
// -1: proportional to the ascent/descent
240+
var topRatio: Float
241+
get() = try {
242+
Stats.onNativeCall()
243+
StrutStyle_nGetTopRatio(_ptr)
244+
} finally {
245+
reachabilityBarrier(this)
246+
}
247+
set(value) {
248+
setTopRatio(value)
249+
}
250+
251+
fun setTopRatio(topRatio: Float): StrutStyle {
252+
try {
253+
Stats.onNativeCall()
254+
StrutStyle_nSetTopRatio(_ptr, topRatio)
255+
} finally {
256+
reachabilityBarrier(this)
257+
}
258+
return this
259+
}
260+
235261
private object _FinalizerHolder {
236262
val PTR = StrutStyle_nGetFinalizer()
237263
}
@@ -321,3 +347,11 @@ private external fun _nIsHalfLeading(ptr: NativePointer): Boolean
321347
@ExternalSymbolName("org_jetbrains_skia_paragraph_StrutStyle__1nSetHalfLeading")
322348
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_StrutStyle__1nSetHalfLeading")
323349
private external fun _nSetHalfLeading(ptr: NativePointer, value: Boolean)
350+
351+
@ExternalSymbolName("org_jetbrains_skia_paragraph_StrutStyle__1nGetTopRatio")
352+
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_StrutStyle__1nGetTopRatio")
353+
private external fun StrutStyle_nGetTopRatio(ptr: NativePointer): Float
354+
355+
@ExternalSymbolName("org_jetbrains_skia_paragraph_StrutStyle__1nSetTopRatio")
356+
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_StrutStyle__1nSetTopRatio")
357+
private external fun StrutStyle_nSetTopRatio(ptr: NativePointer, value: Float)

skiko/src/commonMain/kotlin/org/jetbrains/skia/paragraph/TextStyle.kt

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,7 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
323323
return this
324324
}
325325

326+
@Deprecated("Replaced by topRatio")
326327
var isHalfLeading: Boolean
327328
get() = try {
328329
Stats.onNativeCall()
@@ -334,6 +335,8 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
334335
setHalfLeading(value)
335336
}
336337

338+
// Same as topRatio = halfLeading ? 0.5f : -1.0f
339+
@Deprecated("Replaced by topRatio")
337340
fun setHalfLeading(value: Boolean): TextStyle {
338341
try {
339342
Stats.onNativeCall()
@@ -344,6 +347,29 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
344347
return this
345348
}
346349

350+
// [0..1]: the ratio of ascent to ascent+descent
351+
// -1: proportional to the ascent/descent
352+
var topRatio: Float
353+
get() = try {
354+
Stats.onNativeCall()
355+
TextStyle_nGetTopRatio(_ptr)
356+
} finally {
357+
reachabilityBarrier(this)
358+
}
359+
set(value) {
360+
setTopRatio(value)
361+
}
362+
363+
fun setTopRatio(topRatio: Float): TextStyle {
364+
try {
365+
Stats.onNativeCall()
366+
TextStyle_nSetTopRatio(_ptr, topRatio)
367+
} finally {
368+
reachabilityBarrier(this)
369+
}
370+
return this
371+
}
372+
347373
var letterSpacing: Float
348374
get() = try {
349375
Stats.onNativeCall()
@@ -560,6 +586,14 @@ private external fun TextStyle_nGetHalfLeading(ptr: NativePointer): Boolean
560586
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_TextStyle__1nSetHalfLeading")
561587
private external fun TextStyle_nSetHalfLeading(ptr: NativePointer, value: Boolean)
562588

589+
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetTopRatio")
590+
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_TextStyle__1nGetTopRatio")
591+
private external fun TextStyle_nGetTopRatio(ptr: NativePointer): Float
592+
593+
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nSetTopRatio")
594+
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_TextStyle__1nSetTopRatio")
595+
private external fun TextStyle_nSetTopRatio(ptr: NativePointer, value: Float)
596+
563597
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetBaselineShift")
564598
@ModuleImport("./skiko.mjs", "org_jetbrains_skia_paragraph_TextStyle__1nGetBaselineShift")
565599
private external fun TextStyle_nGetBaselineShift(ptr: NativePointer): Float

skiko/src/commonTest/kotlin/org/jetbrains/skiko/paragraph/TextStyleTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,15 @@ class TextStyleTest {
143143
}
144144
}
145145

146+
@Test
147+
fun textStyleTopRatioTest() {
148+
TextStyle().use { textStyle ->
149+
assertEquals(-1f, textStyle.topRatio)
150+
textStyle.topRatio = 0.42f
151+
assertEquals(0.42f, textStyle.topRatio, 0.001f)
152+
}
153+
}
154+
146155
@Test
147156
fun textStyleMetricsContainsMeaningfulValues() = runTest {
148157
val jbMono = Typeface.makeFromResource(jbMonoPath)

skiko/src/jvmMain/cpp/common/paragraph/StrutStyle.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,15 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_StrutStyleKt
145145
StrutStyle* instance = reinterpret_cast<StrutStyle*>(static_cast<uintptr_t>(ptr));
146146
instance->setHalfLeading(value);
147147
}
148+
149+
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_paragraph_StrutStyleKt__1nGetTopRatio
150+
(JNIEnv* env, jclass jclass, jlong ptr) {
151+
StrutStyle* instance = reinterpret_cast<StrutStyle*>(static_cast<uintptr_t>(ptr));
152+
return instance->getTopRatio();
153+
}
154+
155+
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_StrutStyleKt__1nSetTopRatio
156+
(JNIEnv* env, jclass jclass, jlong ptr, jfloat value) {
157+
StrutStyle* instance = reinterpret_cast<StrutStyle*>(static_cast<uintptr_t>(ptr));
158+
instance->setTopRatio(value);
159+
}

skiko/src/jvmMain/cpp/common/paragraph/TextStyle.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,18 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_
257257
instance->setHalfLeading(value);
258258
}
259259

260+
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nGetTopRatio
261+
(JNIEnv* env, jclass jclass, jlong ptr) {
262+
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
263+
return instance->getTopRatio();
264+
}
265+
266+
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nSetTopRatio
267+
(JNIEnv* env, jclass jclass, jlong ptr, jfloat value) {
268+
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
269+
instance->setTopRatio(value);
270+
}
271+
260272
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nGetBaselineShift
261273
(JNIEnv* env, jclass jclass, jlong ptr) {
262274
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));

skiko/src/nativeJsMain/cpp/paragraph/StrutStyle.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,3 +145,15 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_StrutStyle__1nSetHalfLeading
145145
StrutStyle* instance = reinterpret_cast<StrutStyle*>(ptr);
146146
instance->setHalfLeading(value);
147147
}
148+
149+
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_StrutStyle__1nGetTopRatio
150+
(KNativePointer ptr) {
151+
StrutStyle* instance = reinterpret_cast<StrutStyle*>(ptr);
152+
return instance->getTopRatio();
153+
}
154+
155+
SKIKO_EXPORT void org_jetbrains_skia_paragraph_StrutStyle__1nSetTopRatio
156+
(KNativePointer ptr, KFloat topRatio) {
157+
StrutStyle* instance = reinterpret_cast<StrutStyle*>(ptr);
158+
instance->setTopRatio(topRatio);
159+
}

skiko/src/nativeJsMain/cpp/paragraph/TextStyle.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,18 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetHalfLeading
255255
instance->setHalfLeading(halfLeading);
256256
}
257257

258+
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetTopRatio
259+
(KNativePointer ptr) {
260+
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
261+
return instance->getTopRatio();
262+
}
263+
264+
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetTopRatio
265+
(KNativePointer ptr, KFloat topRatio) {
266+
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
267+
instance->setTopRatio(topRatio);
268+
}
269+
258270
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetBaselineShift
259271
(KNativePointer ptr) {
260272
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);

0 commit comments

Comments
 (0)