Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions mreader/ReaderView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,18 @@ nonisolated private struct InitialReadingPreset {
)
}

nonisolated enum ReadingPresetSamplePagePolicy {
static func pageIndices(totalPages: Int) -> [Int] {
guard totalPages > 0 else { return [] }

let preferredEnd = min(totalPages, 5)
guard 2 < preferredEnd else {
return Array(0..<totalPages)
}
return Array(2..<preferredEnd)
}
}

/// 阅读预设检测器:在 Reader 第一次创建之前完成“这本漫画是不是长条”的判断,
/// 避免先按普通模式预载再切到 8192 重解码(审查 #17)。
nonisolated private enum InitialReadingPresetDetector {
Expand All @@ -186,7 +198,7 @@ nonisolated private enum InitialReadingPresetDetector {
if isDocument(comic, "pdf") {
return InitialReadingPreset.longStrip
}
let sampleIndices = samplePageIndices(totalPages: pages.count)
let sampleIndices = ReadingPresetSamplePagePolicy.pageIndices(totalPages: pages.count)
guard !sampleIndices.isEmpty else { return .normalPage }
var ratios: [CGFloat] = []
for index in sampleIndices {
Expand Down Expand Up @@ -253,12 +265,6 @@ nonisolated private enum InitialReadingPresetDetector {
return comic.chapterTypeRaw?.lowercased() == expectedExtension
}

private static func samplePageIndices(totalPages: Int) -> [Int] {
guard totalPages > 0 else { return [] }
let preferred = (2..<min(totalPages, 5)).map { $0 }
return preferred.isEmpty ? Array(0..<totalPages) : preferred
}

private static func medianRatio(_ ratios: [CGFloat]) -> CGFloat? {
guard !ratios.isEmpty else { return nil }
let sortedRatios = ratios.sorted()
Expand Down Expand Up @@ -1594,7 +1600,7 @@ struct ReaderView: View {
reason: "pdf"
)
}
let sampleIndices = readingPresetSamplePageIndices(totalPages: manager.pages.count)
let sampleIndices = ReadingPresetSamplePagePolicy.pageIndices(totalPages: manager.pages.count)
guard !sampleIndices.isEmpty else {
print("MReader initial preset fallback: no sample pages for comic=\(comic.id)")
return InitialReadingPreset.normalPage
Expand Down Expand Up @@ -1628,15 +1634,6 @@ struct ReaderView: View {
)
}

private func readingPresetSamplePageIndices(totalPages: Int) -> [Int] {
guard totalPages > 0 else { return [] }
let preferred = (2..<min(totalPages, 5)).map { $0 }
if !preferred.isEmpty {
return preferred
}
return Array(0..<totalPages)
}

private func medianRatio(_ ratios: [CGFloat]) -> CGFloat? {
guard !ratios.isEmpty else { return nil }
let sortedRatios = ratios.sorted()
Expand Down
14 changes: 14 additions & 0 deletions mreaderTests/ReaderReadingPresetTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import Testing
@testable import mreader

struct ReaderReadingPresetTests {
@Test
func samplePageIndicesHandleShortBooksWithoutCreatingAnInvalidRange() {
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 0) == [])
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 1) == [0])
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 2) == [0, 1])
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 3) == [2])
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 5) == [2, 3, 4])
#expect(ReadingPresetSamplePagePolicy.pageIndices(totalPages: 8) == [2, 3, 4])
}
}