|
@@ -253,7 +253,17 @@ object ReaderPaginator {
|
|
|
* 因为只有章末才知道它的堆叠高度要加 [ReaderPaginationConfig.chapterEndPaddingPx]
|
|
* 因为只有章末才知道它的堆叠高度要加 [ReaderPaginationConfig.chapterEndPaddingPx]
|
|
|
* (旧版同样在章末才 `textPage.height = durY + 20dp`)。
|
|
* (旧版同样在章末才 `textPage.height = durY + 20dp`)。
|
|
|
*/
|
|
*/
|
|
|
-internal class ReaderPaginationSession(private val config: ReaderPaginationConfig) {
|
|
|
|
|
|
|
+internal class ReaderPaginationMetrics {
|
|
|
|
|
+ var lineBreakNs = 0L
|
|
|
|
|
+ var lineRefineNs = 0L
|
|
|
|
|
+ var linePlacementNs = 0L
|
|
|
|
|
+ var inlineParagraphs = 0L
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+internal class ReaderPaginationSession(
|
|
|
|
|
+ private val config: ReaderPaginationConfig,
|
|
|
|
|
+ private val metrics: ReaderPaginationMetrics? = null,
|
|
|
|
|
+) {
|
|
|
|
|
|
|
|
/** 每页成型即回调;章末页在 [finish] 内回调。 */
|
|
/** 每页成型即回调;章末页在 [finish] 内回调。 */
|
|
|
var onPage: ((ReaderPage) -> Unit)? = null
|
|
var onPage: ((ReaderPage) -> Unit)? = null
|
|
@@ -624,6 +634,7 @@ internal class ReaderPaginationSession(private val config: ReaderPaginationConfi
|
|
|
appendSeparator: Boolean,
|
|
appendSeparator: Boolean,
|
|
|
) {
|
|
) {
|
|
|
if (paragraph.items.isEmpty()) return
|
|
if (paragraph.items.isEmpty()) return
|
|
|
|
|
+ val setupStartNs = if (metrics != null) System.nanoTime() else 0L
|
|
|
val letterSpacing = paragraph.letterSpacingPx ?: config.letterSpacingPx
|
|
val letterSpacing = paragraph.letterSpacingPx ?: config.letterSpacingPx
|
|
|
val indentWidth = paragraph.indentWidthPx
|
|
val indentWidth = paragraph.indentWidthPx
|
|
|
?: (paragraph.baseTextSizePx + letterSpacing) * paragraph.indentCharacters
|
|
?: (paragraph.baseTextSizePx + letterSpacing) * paragraph.indentCharacters
|
|
@@ -704,6 +715,7 @@ internal class ReaderPaginationSession(private val config: ReaderPaginationConfi
|
|
|
.coerceAtLeast(0f).toInt(),
|
|
.coerceAtLeast(0f).toInt(),
|
|
|
)
|
|
)
|
|
|
val originalEnds = breaker.lineClusterStarts.drop(1)
|
|
val originalEnds = breaker.lineClusterStarts.drop(1)
|
|
|
|
|
+ val refineStartNs = if (metrics != null) System.nanoTime() else 0L
|
|
|
val starts = mutableListOf(0)
|
|
val starts = mutableListOf(0)
|
|
|
// 每行的纵向预算在断行阶段就定死,绘制阶段直接复用——排版预留与绘制的外框必须
|
|
// 每行的纵向预算在断行阶段就定死,绘制阶段直接复用——排版预留与绘制的外框必须
|
|
|
// 用同一份 inset,否则框会压到相邻文字上或者留出多余的空档。
|
|
// 用同一份 inset,否则框会压到相邻文字上或者留出多余的空档。
|
|
@@ -757,6 +769,7 @@ internal class ReaderPaginationSession(private val config: ReaderPaginationConfi
|
|
|
lineBottomBudgets += bottomBudgetPx
|
|
lineBottomBudgets += bottomBudgetPx
|
|
|
previousLineHadFrame = lineHasFrame(from, until)
|
|
previousLineHadFrame = lineHasFrame(from, until)
|
|
|
}
|
|
}
|
|
|
|
|
+ val placementStartNs = if (metrics != null) System.nanoTime() else 0L
|
|
|
for (lineIndex in 0 until starts.lastIndex) {
|
|
for (lineIndex in 0 until starts.lastIndex) {
|
|
|
val from = starts[lineIndex]
|
|
val from = starts[lineIndex]
|
|
|
val until = starts[lineIndex + 1]
|
|
val until = starts[lineIndex + 1]
|
|
@@ -943,6 +956,13 @@ internal class ReaderPaginationSession(private val config: ReaderPaginationConfi
|
|
|
?: config.paragraphSpacingPx) * paragraph.titleSpacingScale
|
|
?: config.paragraphSpacingPx) * paragraph.titleSpacingScale
|
|
|
else config.paragraphSpacingPx
|
|
else config.paragraphSpacingPx
|
|
|
}
|
|
}
|
|
|
|
|
+ if (metrics != null) {
|
|
|
|
|
+ val endNs = System.nanoTime()
|
|
|
|
|
+ metrics.lineBreakNs += refineStartNs - setupStartNs
|
|
|
|
|
+ metrics.lineRefineNs += placementStartNs - refineStartNs
|
|
|
|
|
+ metrics.linePlacementNs += endNs - placementStartNs
|
|
|
|
|
+ metrics.inlineParagraphs++
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private fun addRule(rule: ReaderMeasuredBlock.Rule) {
|
|
private fun addRule(rule: ReaderMeasuredBlock.Rule) {
|