// // DTCoreTextLayouter.h // WeRead // // Reverse-engineered from binary analysis // Based on DTCoreText open-source library, customized by WeRead // // DTCoreText is an open-source library for rendering HTML with CoreText. // WeRead has customized it for their reading engine. // #import #import @class DTCoreTextLayoutFrame; @class NSAttributedString; NS_ASSUME_NONNULL_BEGIN /** * DTCoreTextLayouter - CoreText typesetter wrapper. * * This is the original DTCoreText layouter class, customized by WeRead. * It wraps CTTypesetter and CTFramesetter to provide high-level * text layout functionality. * * Key features: * - Creates CTTypesetter from attributed string * - Manages typesetter lifecycle * - Produces DTCoreTextLayoutFrame objects * - Supports caching of layout frames * - Handles string updates efficiently */ @interface DTCoreTextLayouter : NSObject #pragma mark - Properties /** The attributed string to be laid out */ @property (nonatomic, strong, nullable) NSAttributedString *attributedString; /** Cache for layout frames */ @property (nonatomic, strong, readonly) NSCache *layoutFrameCache; /** Array of created layout frames */ @property (nonatomic, strong, readonly) NSMutableArray *layoutFrames; #pragma mark - Initialization /** * Initialize with an attributed string. * * @param attributedString The text with styling attributes * @return Initialized layouter instance */ - (instancetype)initWithAttributedString:(NSAttributedString *)attributedString; #pragma mark - Typesetter Management /** * Returns the internal CTTypesetter. * Creates one if it doesn't exist. * * @return The CTTypesetter reference */ - (CTTypesetterRef)typesetter; /** * Invalidates the current typesetter. * Called when the attributed string changes. */ - (void)invalidateTypesetter; #pragma mark - Layout Frame Creation /** * Create a layout frame for a given string range within the specified rect. * * @param range The range of the attributed string to lay out * @param frame The bounding rectangle for the layout * @return A new DTCoreTextLayoutFrame */ - (DTCoreTextLayoutFrame *)layoutFrameWithRange:(NSRange)range frame:(CGRect)frame; /** * Suggest a line break for the given range and width. * * @param startIndex The starting index * @param width The available width * @return The suggested line break index */ - (NSUInteger)suggestLineBreakStartIndex:(NSUInteger)startIndex width:(CGFloat)width; /** * Suggest a fitting string length for pagination. * * @param startIndex The starting index * @param constraints Size constraints * @return The suggested fitting length */ - (NSUInteger)stringIndexFittingLengthForWidth:(CGFloat)width startIndex:(NSUInteger)startIndex; #pragma mark - Frame Caching /** * Returns a cached layout frame for the given key. */ - (nullable DTCoreTextLayoutFrame *)cachedLayoutFrameForKey:(NSString *)key; /** * Caches a layout frame with the given key. */ - (void)cacheLayoutFrame:(DTCoreTextLayoutFrame *)frame forKey:(NSString *)key; /** * Clears the layout frame cache. */ - (void)clearLayoutFrameCache; @end NS_ASSUME_NONNULL_END