Unverified Commit 8fccb7ea authored by Aleksandr Veselov's avatar Aleksandr Veselov Committed by GitHub

Add support of TextIndent (#510)

parent e8b3b444
......@@ -3,15 +3,15 @@ deploy.version=0.0.0
kotlin.mpp.enableGranularSourceSetsMetadata=true
kotlin.native.enableDependencyPropagation=false
dependencies.skia.windows-x64=m99-51988d0bc1
dependencies.skia.linux-x64=m99-51988d0bc1
dependencies.skia.macos-x64=m99-51988d0bc1
dependencies.skia.linux-arm64=m99-51988d0bc1
dependencies.skia.macos-arm64=m99-51988d0bc1
dependencies.skia.wasm-wasm=m99-51988d0bc1
dependencies.skia.ios-x64=m99-51988d0bc1
dependencies.skia.ios-arm64=m99-51988d0bc1
dependencies.skia.android-x64=m99-51988d0bc1
dependencies.skia.android-arm64=m99-51988d0bc1
dependencies.skia.windows-x64=m99-f85ab491eb
dependencies.skia.linux-x64=m99-f85ab491eb
dependencies.skia.macos-x64=m99-f85ab491eb
dependencies.skia.linux-arm64=m99-f85ab491eb
dependencies.skia.macos-arm64=m99-f85ab491eb
dependencies.skia.wasm-wasm=m99-f85ab491eb
dependencies.skia.ios-x64=m99-f85ab491eb
dependencies.skia.ios-arm64=m99-f85ab491eb
dependencies.skia.android-x64=m99-f85ab491eb
dependencies.skia.android-arm64=m99-f85ab491eb
org.gradle.jvmargs=-Xmx3G -XX:MaxMetaspaceSize=512m
package org.jetbrains.skia.paragraph
import org.jetbrains.skia.impl.Library.Companion.staticLoad
import org.jetbrains.skia.impl.Managed
import org.jetbrains.skia.impl.Native
import org.jetbrains.skia.impl.Stats
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.ExternalSymbolName
import org.jetbrains.skia.impl.InteropPointer
import org.jetbrains.skia.impl.NativePointer
import org.jetbrains.skia.impl.*
import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.impl.interopScope
import org.jetbrains.skia.impl.reachabilityBarrier
import org.jetbrains.skia.impl.withResult
import org.jetbrains.skia.impl.withStringResult
class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
......@@ -170,6 +167,23 @@ class ParagraphStyle : Managed(ParagraphStyle_nMake(), _FinalizerHolder.PTR) {
return this
}
var textIndent: TextIndent
get() = try {
Stats.onNativeCall()
val indents = withResult(FloatArray(2)) {
_nGetTextIndent(_ptr, it)
}
TextIndent(indents[0], indents[1])
} finally {
reachabilityBarrier(this)
}
set(value) = try {
Stats.onNativeCall()
_nSetTextIndent(_ptr, value.firstLine, value.restLine)
} finally {
reachabilityBarrier(this)
}
internal object _FinalizerHolder {
val PTR = ParagraphStyle_nGetFinalizer()
}
......@@ -244,3 +258,9 @@ private external fun _nIsHintingEnabled(ptr: NativePointer): Boolean
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nDisableHinting")
private external fun _nDisableHinting(ptr: NativePointer)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nSetTextIndent")
private external fun _nSetTextIndent(ptr: NativePointer, firstLine: Float, restLine: Float)
@ExternalSymbolName("org_jetbrains_skia_paragraph_ParagraphStyle__1nGetTextIndent")
private external fun _nGetTextIndent(ptr: NativePointer, result: InteropPointer)
\ No newline at end of file
package org.jetbrains.skia.paragraph
data class TextIndent(var firstLine: Float = 0.0f, var restLine: Float = 0.0f)
......@@ -2,6 +2,7 @@ package org.jetbrains.skiko.paragraph
import org.jetbrains.skia.impl.use
import org.jetbrains.skia.paragraph.ParagraphStyle
import org.jetbrains.skia.paragraph.TextIndent
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertNull
......@@ -17,4 +18,18 @@ class ParagraphStyleTests {
assertEquals(".^.", paragraphStyle.ellipsis)
}
}
@Test
fun paragraphStyleTextIndentTests() {
ParagraphStyle().use { paragraphStyle ->
assertEquals(TextIndent(), paragraphStyle.textIndent)
val indent = TextIndent(20f, 10f)
paragraphStyle.textIndent = indent
assertEquals(indent, paragraphStyle.textIndent)
val indent2 = TextIndent(-20f, -10f)
paragraphStyle.textIndent = indent2
assertEquals(indent2, paragraphStyle.textIndent)
}
}
}
\ No newline at end of file
......@@ -148,3 +148,20 @@ extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_ParagraphSty
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>(static_cast<uintptr_t>(ptr));
instance->turnHintingOff();
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_ParagraphStyleKt__1nSetTextIndent
(JNIEnv* env, jclass jclass, jlong ptr, jfloat firstLine, jfloat restLine) {
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>(static_cast<uintptr_t>(ptr));
TextIndent indent;
indent.setFirstLine(firstLine);
indent.setRestLine(restLine);
instance->setTextIndent(indent);
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_paragraph_ParagraphStyleKt__1nGetTextIndent
(JNIEnv* env, jclass jclass, jlong ptr, jfloatArray result) {
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>(static_cast<uintptr_t>(ptr));
TextIndent indent = instance->getTextIndent();
float resultData[2] = { indent.getFirstLine(), indent.getRestLine() };
env->SetFloatArrayRegion(result, 0, 2, resultData);
}
......@@ -61,4 +61,73 @@ class TextStyleTest {
screenshots.assert(image)
}
@Test
fun canApplyTextIndent() = 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")
})
}
val textStyle = TextStyle().apply {
fontFamilies = arrayOf("Inter")
fontSize = 28.0f
color = Color.BLACK
}
fun drawParagraph(canvas: Canvas, x: Float, y: Float, dir: Direction, align: Alignment) {
val paragraphStyle = ParagraphStyle().apply {
this.textStyle = textStyle
alignment = align
direction = dir
textIndent = TextIndent(80f, 40.0f)
}
val paragraph = ParagraphBuilder(paragraphStyle, fontCollection).run {
val text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do" +
" eiusmod tempor incididunt ut labore et dolore magna aliqua."
addText(text)
build()
}
paragraph.layout(500f)
paragraph.paint(canvas, x, y)
}
val image = with (Surface.makeRasterN32Premul(1200, 800)) {
canvas.drawRect(Rect(0.0f, 0.0f, width.toFloat(), height.toFloat()), Paint().apply { color = Color.WHITE })
val linePaint = Paint().apply {
strokeWidth = 2.0f
setStroke(true)
color = Color.makeRGB(128,128, 128)
}
for (tick in listOf(50f, 550f, 650f, 1150f)) {
canvas.drawLine(tick, 0f, tick, height.toFloat(), linePaint)
}
var y = 20f
for (align in listOf(Alignment.LEFT, Alignment.CENTER, Alignment.RIGHT, Alignment.JUSTIFY)) {
var x = 50f
for (dir in listOf(Direction.LTR, Direction.RTL)) {
drawParagraph(canvas, x, y, dir, align)
x += 600f
}
y += 200f
}
makeImageSnapshot()
}
screenshots.assert(image)
}
}
\ No newline at end of file
......@@ -148,3 +148,19 @@ SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphStyle__1nDisableHinting
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>((ptr));
instance->turnHintingOff();
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphStyle__1nSetTextIndent
(KNativePointer ptr, KFloat firstLine, KFloat restLine) {
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>((ptr));
TextIndent indent;
indent.setFirstLine(firstLine);
indent.setRestLine(restLine);
instance->setTextIndent(indent);
}
SKIKO_EXPORT void org_jetbrains_skia_paragraph_ParagraphStyle__1nGetTextIndent
(KNativePointer ptr, KInteropPointer result) {
ParagraphStyle* instance = reinterpret_cast<ParagraphStyle*>((ptr));
TextIndent* indent = reinterpret_cast<TextIndent*>(result);
*indent = instance->getTextIndent();
}
\ No newline at end of file
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