Skip to content

Getting Started

Installation

swift
// In your Package.swift dependencies:
.package(url: "https://github.com/MaTriXy/mobile-pretext.git", from: "1.0.0")

// In your target dependencies:
.product(name: "Pretext", package: "mobile-pretext")
kotlin
// In your settings.gradle.kts, include the modules:
include(":pretext-core")
include(":pretext-android")
include(":pretext-compose")  // optional, for Compose integration

// In your app's build.gradle.kts:
dependencies {
    implementation(project(":pretext-core"))
    implementation(project(":pretext-android"))
    implementation(project(":pretext-compose"))  // optional
}

Quick Start

1. Measure Text Height

The most common use case — compute how tall a paragraph will be at a given width.

swift
import Pretext

let font = FontSpec(name: "Helvetica Neue", size: 16)
let prepared = Pretext.prepare("Hello 春天到了 🚀", font: font)

// Call on every resize — sub-microsecond
let result = Pretext.layout(prepared, maxWidth: 300, lineHeight: 22)
print("Lines: \(result.lineCount), Height: \(result.height)")
kotlin
import com.pretext.Pretext
import com.pretext.android.PaintTextMeasurer
import com.pretext.android.IcuTextSegmenter

// One-time setup
Pretext.setSegmenter(IcuTextSegmenter())

val measurer = PaintTextMeasurer(myTextPaint)
val prepared = Pretext.prepare("Hello 春天到了 🚀", measurer)

// Call on every resize — sub-microsecond
val result = Pretext.layout(prepared, maxWidth = 300f, lineHeight = 22f)
println("Lines: ${result.lineCount}, Height: ${result.height}")

2. Get Line Contents

Switch from prepare to prepareWithSegments for per-line data.

swift
let prepared = Pretext.prepareWithSegments(text, font: font)
let result = Pretext.layoutWithLines(prepared, maxWidth: 300, lineHeight: 22)

for line in result.lines {
    print("\(line.text) — width: \(line.width)")
}
kotlin
val prepared = Pretext.prepareWithSegments(text, measurer)
val result = Pretext.layoutWithLines(prepared, maxWidth = 300f, lineHeight = 22f)

for (line in result.lines) {
    println("${line.text} — width: ${line.width}")
}

3. Variable-Width Layout

Flow text around obstacles (like floated images) using layoutNextLine.

swift
let prepared = Pretext.prepareWithSegments(text, font: font)
var cursor = LayoutCursor(segmentIndex: 0, graphemeIndex: 0)
var y = 0.0

while let line = Pretext.layoutNextLine(prepared, start: cursor, maxWidth: widthAt(y)) {
    renderLine(line, at: y)
    cursor = line.end
    y += lineHeight
}
kotlin
val prepared = Pretext.prepareWithSegments(text, measurer)
var cursor = LayoutCursor(0, 0)
var y = 0f

while (true) {
    val line = Pretext.layoutNextLine(prepared, cursor, widthAt(y)) ?: break
    renderLine(line, y)
    cursor = line.end
    y += lineHeight
}

Next Steps

Copyright 2026 MaTriXy. All rights reserved. Released under the MIT License.