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 var numberOfColumns: Int public var columnGap: CGFloat public init( fontSize: CGFloat, lineHeightMultiple: CGFloat, reflowableContentInsets: UIEdgeInsets, fixedContentInset: UIEdgeInsets, numberOfColumns: Int = 1, columnGap: CGFloat = 20, 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.numberOfColumns = max(1, numberOfColumns) self.columnGap = max(0, columnGap) 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, numberOfColumns: numberOfColumns, columnGap: columnGap, themeBackgroundColor: themeBackgroundColor, themeTextColor: themeTextColor ) } public func renderRequest( for page: EPUBPage, publication: RDEPUBPublication, viewportSize: CGSize, targetLocation: RDEPUBLocation? = nil, targetHighlightRangeInfo: String? = 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, targetHighlightRangeInfo: targetHighlightRangeInfo, highlights: highlights, searchPresentation: searchPresentation ) ) } }