import UIKit public struct RDEPUBPreferences: Equatable { public var fontSize: CGFloat public var lineHeightMultiple: CGFloat public var reflowableContentInsets: UIEdgeInsets public var fixedContentInset: UIEdgeInsets public var themeBackgroundColor: String? public var themeTextColor: String? public var fixedBackgroundColor: String? public var fixedLayoutFit: RDEPUBFixedLayoutFit public var fixedLayoutSpreadMode: RDEPUBFixedLayoutSpreadMode public init( fontSize: CGFloat, lineHeightMultiple: CGFloat, reflowableContentInsets: UIEdgeInsets, fixedContentInset: UIEdgeInsets, themeBackgroundColor: String? = nil, themeTextColor: String? = nil, fixedBackgroundColor: String? = nil, fixedLayoutFit: RDEPUBFixedLayoutFit = .page, fixedLayoutSpreadMode: RDEPUBFixedLayoutSpreadMode = .automatic ) { self.fontSize = fontSize self.lineHeightMultiple = lineHeightMultiple self.reflowableContentInsets = reflowableContentInsets self.fixedContentInset = fixedContentInset self.themeBackgroundColor = themeBackgroundColor self.themeTextColor = themeTextColor self.fixedBackgroundColor = fixedBackgroundColor self.fixedLayoutFit = fixedLayoutFit self.fixedLayoutSpreadMode = fixedLayoutSpreadMode } public func presentationStyle(viewportSize: CGSize) -> RDEPUBPresentationStyle { RDEPUBPresentationStyle( viewportSize: viewportSize, contentInsets: reflowableContentInsets, fontSize: fontSize, lineHeightMultiple: lineHeightMultiple, themeBackgroundColor: themeBackgroundColor, themeTextColor: themeTextColor ) } public func renderRequest( for page: EPUBPage, publication: RDEPUBPublication, viewportSize: CGSize, targetLocation: RDEPUBLocation? = nil, highlights: [RDEPUBHighlight] = [], searchPresentation: RDEPUBSearchPresentation? = nil ) -> RDEPUBRenderRequest? { if publication.layout == .fixed, let fixedSpread = page.fixedSpread { return .fixed( RDEPUBFixedRenderRequest( spread: fixedSpread, viewportSize: viewportSize, contentInset: fixedContentInset, backgroundColorCSS: fixedBackgroundColor, fit: fixedLayoutFit, searchPresentation: searchPresentation ) ) } guard publication.spine.indices.contains(page.spineIndex) else { return nil } return .reflowable( RDEPUBReflowableRenderRequest( spineIndex: page.spineIndex, href: publication.spine[page.spineIndex].href, pageIndex: page.pageIndexInChapter, totalPagesInChapter: page.totalPagesInChapter, presentation: presentationStyle(viewportSize: viewportSize), targetLocation: targetLocation, highlights: highlights, searchPresentation: searchPresentation ) ) } }