import UIKit public protocol RDEPUBReaderDisplayEnvironment: AnyObject { var currentBrightness: CGFloat { get set } var fallbackViewportSize: CGSize { get } } public final class RDEPUBUIScreenEnvironment: RDEPUBReaderDisplayEnvironment { public init() {} public var currentBrightness: CGFloat { get { CGFloat(UIScreen.main.brightness) } set { UIScreen.main.brightness = newValue } } public var fallbackViewportSize: CGSize { UIScreen.main.bounds.size } } public struct RDEPUBReaderDependencies { public var environment: any RDEPUBReaderDisplayEnvironment public var makeParser: () -> RDEPUBParser public var makePaginator: () -> RDEPUBPaginator public var makeTextBookBuilder: (RDEPUBTextRenderer, RDEPUBTextBookCache?, RDEPUBTextLayoutConfig) -> RDEPUBTextBookBuilder public var makePlainTextBookBuilder: (RDEPUBTextRenderer, RDEPUBTextLayoutConfig) -> RDPlainTextBookBuilder public var makeTextRenderer: (RDEPUBTextRenderingEngine) -> RDEPUBTextRenderer public init( environment: any RDEPUBReaderDisplayEnvironment, makeParser: @escaping () -> RDEPUBParser, makePaginator: @escaping () -> RDEPUBPaginator, makeTextBookBuilder: @escaping (RDEPUBTextRenderer, RDEPUBTextBookCache?, RDEPUBTextLayoutConfig) -> RDEPUBTextBookBuilder, makePlainTextBookBuilder: @escaping (RDEPUBTextRenderer, RDEPUBTextLayoutConfig) -> RDPlainTextBookBuilder, makeTextRenderer: @escaping (RDEPUBTextRenderingEngine) -> RDEPUBTextRenderer ) { self.environment = environment self.makeParser = makeParser self.makePaginator = makePaginator self.makeTextBookBuilder = makeTextBookBuilder self.makePlainTextBookBuilder = makePlainTextBookBuilder self.makeTextRenderer = makeTextRenderer } public static var live: RDEPUBReaderDependencies { RDEPUBReaderDependencies( environment: RDEPUBUIScreenEnvironment(), makeParser: { RDEPUBParser() }, makePaginator: { RDEPUBPaginator() }, makeTextBookBuilder: { renderer, cache, layoutConfig in RDEPUBTextBookBuilder(renderer: renderer, cache: cache, layoutConfig: layoutConfig) }, makePlainTextBookBuilder: { renderer, layoutConfig in RDPlainTextBookBuilder(renderer: renderer, layoutConfig: layoutConfig) }, makeTextRenderer: { engine in switch engine { case .dtCoreText: return RDEPUBDTCoreTextRenderer() } } ) } }