From 2c97f43ed372466cfbd189b6e1cbf75b2667fe11 Mon Sep 17 00:00:00 2001 From: Horis <821938089@qq.com> Date: Thu, 7 Mar 2024 10:06:42 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/help/book/ContentProcessor.kt | 5 ++++ .../ui/book/read/page/entities/TextLine.kt | 17 ++++++++++-- .../read/page/provider/ChapterProvider.kt | 16 ++---------- .../read/page/provider/TextChapterLayout.kt | 26 ++----------------- 4 files changed, 24 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt b/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt index 6b893408f..1b2ee5219 100644 --- a/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt +++ b/app/src/main/java/io/legado/app/help/book/ContentProcessor.kt @@ -1,5 +1,6 @@ package io.legado.app.help.book +import android.os.Build import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern.spaceRegex import io.legado.app.data.appDb @@ -27,6 +28,7 @@ class ContentProcessor private constructor( companion object { private val processors = hashMapOf>() + private val isAndroid8 = Build.VERSION.SDK_INT in 26..27 fun get(book: Book) = get(book.name, book.origin) @@ -182,6 +184,9 @@ class ContentProcessor private constructor( useReplace = useReplace && book.getUseReplaceRule() ) + "\n" + mContent } + if (isAndroid8) { + mContent = mContent.replace('\u00A0', ' ') + } val contents = arrayListOf() mContent.split("\n").forEach { str -> val paragraph = str.trim { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt index 53724ae85..a465d942e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextLine.kt @@ -215,7 +215,9 @@ data class TextLine( if (exceed || !onlyTextColumn || textPage.isMsgPage) { return false } - if (!atLeastApi29 && wordSpacing != 0f) { + if (!atLeastApi26 && wordSpacing != 0f) { + return false + } else if (!wordSpacingWorking) { return false } return searchResultColumnCount == 0 @@ -234,9 +236,20 @@ data class TextLine( canvasRecorder.recycle() } + @SuppressLint("NewApi") companion object { val emptyTextLine = TextLine() - private val atLeastApi29 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q + private val atLeastApi26 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O + private val wordSpacingWorking by lazy { + // issue 3785 + val paint = PaintPool.obtain() + val text = "一二 三" + val width1 = paint.measureText(text) + paint.wordSpacing = 10f + val width2 = paint.measureText(text) + PaintPool.recycle(paint) + width2 - width1 == 10f + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt index 9509fdfac..a498de9be 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/ChapterProvider.kt @@ -23,7 +23,6 @@ import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.entities.column.ImageColumn import io.legado.app.ui.book.read.page.entities.column.ReviewColumn import io.legado.app.ui.book.read.page.entities.column.TextColumn -import io.legado.app.utils.LogUtils import io.legado.app.utils.RealPathUtil import io.legado.app.utils.dpToPx import io.legado.app.utils.fastSum @@ -817,9 +816,6 @@ object ChapterProvider { titleBottomSpacing = ReadBookConfig.titleBottomSpacing.dpToPx() val bodyIndent = ReadBookConfig.paragraphIndent indentCharWidth = StaticLayout.getDesiredWidth(bodyIndent, contentPaint) / bodyIndent.length - LogUtils.d("ChapterProvider") { - "bodyIndentLength:${bodyIndent.length} indentCharWidth:$indentCharWidth" - } titlePaintTextHeight = titlePaint.textHeight contentPaintTextHeight = contentPaint.textHeight titlePaintFontMetrics = titlePaint.fontMetrics @@ -889,17 +885,9 @@ object ChapterProvider { //正文 val cPaint = TextPaint() cPaint.color = ReadBookConfig.textColor - cPaint.letterSpacing = ReadBookConfig.letterSpacing.also { - LogUtils.d("ChapterProvider") { - "ReadBookConfig.letterSpacing:$it" - } - } + cPaint.letterSpacing = ReadBookConfig.letterSpacing cPaint.typeface = textFont - cPaint.textSize = ReadBookConfig.textSize.toFloat().spToPx().also { - LogUtils.d("ChapterProvider") { - "ReadBookConfig.textSize:$it" - } - } + cPaint.textSize = ReadBookConfig.textSize.toFloat().spToPx() cPaint.isAntiAlias = true cPaint.isLinearText = true return Pair(tPaint, cPaint) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index 8b3641ba8..daab964f4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -21,7 +21,6 @@ import io.legado.app.ui.book.read.page.entities.TextPage import io.legado.app.ui.book.read.page.entities.column.ImageColumn import io.legado.app.ui.book.read.page.entities.column.ReviewColumn import io.legado.app.ui.book.read.page.entities.column.TextColumn -import io.legado.app.utils.LogUtils import io.legado.app.utils.dpToPx import io.legado.app.utils.fastSum import io.legado.app.utils.splitNotBlank @@ -30,8 +29,6 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock import java.util.LinkedList import java.util.Locale import kotlin.coroutines.coroutineContext @@ -84,19 +81,13 @@ class TextChapterLayout( var channel = Channel(Int.MAX_VALUE) - companion object { - val lock = Mutex() - } - init { job = Coroutine.async(scope) { launch { val bookSource = book.getBookSource() ?: return@launch BookHelp.saveImages(bookSource, book, bookChapter, bookContent.toString()) } - lock.withLock { - getTextChapter(book, bookChapter, displayTitle, bookContent) - } + getTextChapter(book, bookChapter, displayTitle, bookContent) }.onError { exception = it onException(it) @@ -659,20 +650,7 @@ class TextChapterLayout( val gapCount: Int = words.lastIndex val d = residualWidth / gapCount textLine.extraLetterSpacingOffsetX = -d / 2 - val textSize = textPaint.textSize - textLine.extraLetterSpacing = d / textSize - LogUtils.d("TextChapterLayout") { - "words:${words.joinToString("")}" - } - LogUtils.d("TextChapterLayout") { - "textWidths(${textWidths.fastSum()}):$textWidths" - } - LogUtils.d("TextChapterLayout") { - "textSize:$textSize desiredWidth:$desiredWidth residualWidth:$residualWidth " + - "gapCount:$gapCount d:$d " + - "extraLetterSpacingOffsetX:${textLine.extraLetterSpacingOffsetX} " + - "extraLetterSpacing:${textLine.extraLetterSpacing}" - } + textLine.extraLetterSpacing = d / textPaint.textSize var x = startX for (index in words.indices) { val char = words[index]