Browse Source

feat: 下划线问题

HapeLee 2 months ago
parent
commit
c890a98d44

+ 7 - 4
app/src/main/java/io/legado/app/feature/reader/core/layout/ReaderPaginator.kt

@@ -192,10 +192,10 @@ object ReaderPaginator {
         fun columnLeft() = config.paddingLeftPx + columnIndex * config.columnStridePx
         fun columnLeft() = config.paddingLeftPx + columnIndex * config.columnStridePx
         fun columnHasContent() = elements.size > columnElementStart
         fun columnHasContent() = elements.size > columnElementStart
 
 
-        fun addPageUnderline(rowElementStart: Int, lineBottom: Float) {
+        fun addPageUnderline(underlineElementStart: Int, lineBottom: Float) {
             val underline = config.pageUnderline ?: return
             val underline = config.pageUnderline ?: return
-            if (elements.size <= rowElementStart) return
-            val rowElements = elements.subList(rowElementStart, elements.size)
+            if (elements.size <= underlineElementStart) return
+            val rowElements = elements.subList(underlineElementStart, elements.size)
             val start = if (underline.extendToColumn) columnLeft()
             val start = if (underline.extendToColumn) columnLeft()
                 else rowElements.minOf { it.bounds.left }
                 else rowElements.minOf { it.bounds.left }
             val end = if (underline.extendToColumn) columnLeft() + config.contentWidthPx
             val end = if (underline.extendToColumn) columnLeft() + config.contentWidthPx
@@ -528,6 +528,9 @@ object ReaderPaginator {
                         }
                         }
                     }
                     }
                 }
                 }
+                // Processed body text can retain its indentation as real leading glyphs.
+                // The View reader started a non-extended underline after those glyphs.
+                val underlineElementStart = elements.size + indentItems
                 lineItems.forEachIndexed { itemIndex, item ->
                 lineItems.forEachIndexed { itemIndex, item ->
                     val itemBackground = (item as? ReaderMeasuredInlineItem.Text)
                     val itemBackground = (item as? ReaderMeasuredInlineItem.Text)
                         ?.style?.backgroundImage
                         ?.style?.backgroundImage
@@ -581,7 +584,7 @@ object ReaderPaginator {
                         if (item is ReaderMeasuredInlineItem.Text && item.value == " ") wordSpaceExtra else 0f
                         if (item is ReaderMeasuredInlineItem.Text && item.value == " ") wordSpaceExtra else 0f
                     x += if (itemIndex >= indentItems) justifyGap else 0f
                     x += if (itemIndex >= indentItems) justifyGap else 0f
                 }
                 }
-                addPageUnderline(rowElementStart, y + actualLineHeight)
+                addPageUnderline(underlineElementStart, y + actualLineHeight)
                 columnRows += ReaderLayoutRow(rowElementStart, elements.size, y, y + actualLineHeight)
                 columnRows += ReaderLayoutRow(rowElementStart, elements.size, y, y + actualLineHeight)
                 y += actualLineHeight * paragraph.lineSpacingMultiplier
                 y += actualLineHeight * paragraph.lineSpacingMultiplier
             }
             }

+ 33 - 0
app/src/test/java/io/legado/app/feature/reader/core/layout/ReaderPageUnderlineTest.kt

@@ -50,6 +50,39 @@ class ReaderPageUnderlineTest {
         assertTrue(underline.overlayStyledUnderline)
         assertTrue(underline.overlayStyledUnderline)
     }
     }
 
 
+    @Test
+    fun nonExtendedUnderlineSkipsRetainedIndentGlyphs() {
+        val items = listOf(
+            ReaderMeasuredInlineItem.Text(" ", 10f, style, 0),
+            ReaderMeasuredInlineItem.Text(" ", 10f, style, 1),
+            ReaderMeasuredInlineItem.Text("甲", 10f, style, 2),
+            ReaderMeasuredInlineItem.Text("乙", 10f, style, 3),
+        )
+        val page = ReaderPaginator.paginateBlocks(
+            listOf(
+                ReaderMeasuredBlock.InlineParagraph(
+                    items = items,
+                    indentCharacters = 0,
+                    alignment = ReaderTextAlignment.START,
+                    lineHeightPx = 10f,
+                    baselineOffsetPx = 8f,
+                    baseTextSizePx = 10f,
+                    leadingIndentItems = 2,
+                ),
+            ),
+            ReaderPaginationConfig(
+                0, "", 40, 40, 0f, 0f, 0f, 0f, 10f, 8f,
+                pageUnderline = ReaderPageUnderline(
+                    0xff123456.toInt(), 1f, 0f, false, false,
+                ),
+            ),
+        ).single()
+
+        val underline = page.elements.filterIsInstance<ReaderElement.Rule>().single()
+        assertEquals(20f, underline.bounds.left)
+        assertEquals(40f, underline.bounds.right)
+    }
+
     @Test fun contentRuleKeepsNormalContentLayer() {
     @Test fun contentRuleKeepsNormalContentLayer() {
         val page = ReaderPaginator.paginateBlocks(
         val page = ReaderPaginator.paginateBlocks(
             listOf(
             listOf(