Unverified Commit db8a94cc authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Add support of `TextStyle::baselineShift` (#400)

parent b0dfb83d
package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.*
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.Library.Companion.staticLoad
class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerHolder.PTR) {
companion object {
......@@ -286,6 +285,23 @@ class TextStyle internal constructor(ptr: NativePointer) : Managed(ptr, _Finaliz
return this
}
var baselineShift: Float
get() = try {
Stats.onNativeCall()
TextStyle_nGetBaselineShift(_ptr)
} finally {
reachabilityBarrier(this)
}
set(value) {
setBaselineShift(value)
}
fun setBaselineShift(baselineShift: Float): TextStyle {
Stats.onNativeCall()
TextStyle_nSetBaselineShift(_ptr, baselineShift)
return this
}
var wordSpacing: Float
get() = try {
Stats.onNativeCall()
......@@ -426,6 +442,12 @@ private external fun TextStyle_nGetHeight(ptr: NativePointer): Float
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nSetHeight")
private external fun TextStyle_nSetHeight(ptr: NativePointer, override: Boolean, height: Float)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nGetBaselineShift")
private external fun TextStyle_nGetBaselineShift(ptr: NativePointer): Float
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nSetBaselineShift")
private external fun TextStyle_nSetBaselineShift(ptr: NativePointer, baselineShift: Float)
@ExternalSymbolName("org_jetbrains_skia_paragraph_TextStyle__1nAttributeEquals")
private external fun _nAttributeEquals(ptr: NativePointer, attribute: Int, otherPtr: NativePointer): Boolean
......
package org.jetbrains.skiko.paragraph
import org.jetbrains.skia.Color
import org.jetbrains.skia.FontMetrics
import org.jetbrains.skia.impl.use
import org.jetbrains.skia.paragraph.DecorationLineStyle
import org.jetbrains.skia.paragraph.DecorationStyle
import org.jetbrains.skia.paragraph.TextStyle
import org.jetbrains.skia.paragraph.TextStyleAttribute
import org.jetbrains.skiko.tests.SkipJsTarget
import org.jetbrains.skiko.tests.SkipNativeTarget
import kotlin.test.*
class TextStyleTest {
......@@ -99,4 +96,13 @@ class TextStyleTest {
}
}
@Test
fun textStyleBaselineTest() {
TextStyle().use { textStyle ->
assertEquals(0.0f, textStyle.baselineShift)
textStyle.baselineShift = 4f
assertEquals(4f, textStyle.baselineShift)
}
}
}
......@@ -235,6 +235,18 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_
instance->setHeight(height);
}
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nGetBaselineShift
(JNIEnv* env, jclass jclass, jlong ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
return instance->getBaselineShift();
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt_TextStyle_1nSetBaselineShift
(JNIEnv* env, jclass jclass, jlong ptr, jfloat baselineShift) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
instance->setBaselineShift(baselineShift);
}
extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_paragraph_TextStyleKt__1nGetLetterSpacing
(JNIEnv* env, jclass jclass, jlong ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(static_cast<uintptr_t>(ptr));
......
package org.jetbrains.skiko.tests.org.jetbrains.skiko.paragraph
import org.jetbrains.skia.*
import org.jetbrains.skia.paragraph.*
import org.jetbrains.skia.tests.makeFromResource
import org.jetbrains.skiko.OS
import org.jetbrains.skiko.hostOs
import org.jetbrains.skiko.tests.runTest
import org.jetbrains.skiko.util.ScreenshotTestRule
import org.junit.Rule
import org.junit.Test
class TextStyleTest {
@get:Rule
val screenshots = ScreenshotTestRule()
@Test
fun canApplyBaselineShift() = runTest {
if (hostOs != OS.MacOS) {
return@runTest
}
val fontCollection = FontCollection().apply {
setDefaultFontManager(TypefaceFontProvider().apply {
val inter = Typeface.makeFromResource("./fonts/Inter-Hinted-Regular.ttf", 0)
registerTypeface(inter, "Inter")
})
}
fun buildTextStyle(baselineShift: Float, color: Int = Color.BLACK) = TextStyle().apply {
fontFamilies = arrayOf("Inter")
fontSize = 14.0f
this.color = color
this.baselineShift = baselineShift
}
val paragraphStyle = ParagraphStyle().apply {
height = 40.0f
maxLinesCount = 2
textStyle = buildTextStyle(0.0f)
}
val paragraph = ParagraphBuilder(paragraphStyle, fontCollection).run {
val text = "Hello "
addText(text)
pushStyle(buildTextStyle(10.0f, Color.RED))
addText(text)
pushStyle(buildTextStyle(-10.0f, Color.GREEN))
addText(text)
build()
}
val image = with (Surface.makeRasterN32Premul(200, 64)) {
canvas.drawRect(Rect(0.0f, 0.0f, width.toFloat(), height.toFloat()), Paint().apply { color = Color.WHITE })
paragraph.layout(Float.POSITIVE_INFINITY)
paragraph.paint(canvas, 30.0f, 20.0f)
makeImageSnapshot()
}
screenshots.assert(image)
}
}
\ No newline at end of file
......@@ -258,6 +258,18 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetHeight
instance->setHeight(height);
}
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetBaselineShift
(KNativePointer ptr) {
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
return instance->getBaselineShift();
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_TextStyle__1nSetBaselineShift
(KNativePointer ptr, KFloat baselineShift) {
TextStyle* instance = reinterpret_cast<TextStyle*>(ptr);
instance->setBaselineShift(baselineShift);
}
SKIKO_EXPORT KFloat org_jetbrains_skia_paragraph_TextStyle__1nGetLetterSpacing
(KNativePointer 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