Skip to content
Open
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
1 change: 0 additions & 1 deletion .gitattributes

This file was deleted.

18 changes: 11 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
# xcode noise
# Xcode
build/*
*.pbxuser
!default.pbxuser
*.mode1v3

# old skool
.svn

# osx noise
.DS_Store
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside
21 changes: 0 additions & 21 deletions Classes/LeavesAppDelegate.h

This file was deleted.

63 changes: 0 additions & 63 deletions Classes/PDFExampleViewController.m

This file was deleted.

22 changes: 9 additions & 13 deletions Leaves/LeavesCache.h
Original file line number Diff line number Diff line change
@@ -1,28 +1,24 @@
//
// LeavesCache.h
// Reader
// Leaves
//
// Created by Tom Brow on 5/12/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
// Copyright 2010 Tom Brow. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol LeavesViewDataSource;

@interface LeavesCache : NSObject {
NSMutableDictionary *pageCache;
id<LeavesViewDataSource> dataSource;
CGSize pageSize;
}
@interface LeavesCache : NSObject

@property (assign) CGSize pageSize;
@property (nonatomic, assign) CGSize pageSize;
@property (assign) id<LeavesViewDataSource> dataSource;

- (id) initWithPageSize:(CGSize)aPageSize;
- (CGImageRef) cachedImageForPageIndex:(NSUInteger)pageIndex;
- (void) precacheImageForPageIndex:(NSUInteger)pageIndex;
- (void) minimizeToPageIndex:(NSUInteger)pageIndex;
- (void) flush;
- (id)initWithPageSize:(CGSize)aPageSize;
- (CGImageRef)cachedImageForPageIndex:(NSUInteger)pageIndex;
- (void)precacheImageForPageIndex:(NSUInteger)pageIndex;
- (void)minimizeToPageIndex:(NSUInteger)pageIndex;
- (void)flush;

@end
79 changes: 43 additions & 36 deletions Leaves/LeavesCache.m
Original file line number Diff line number Diff line change
@@ -1,48 +1,53 @@
//
// LeavesCache.m
// Reader
// Leaves
//
// Created by Tom Brow on 5/12/10.
// Copyright 2010 __MyCompanyName__. All rights reserved.
// Copyright 2010 Tom Brow. All rights reserved.
//

#import "LeavesCache.h"
#import "LeavesView.h"

@implementation LeavesCache
@interface LeavesCache ()

@property (readonly) NSMutableDictionary *pageCache;

@synthesize dataSource, pageSize;
@end

- (id) initWithPageSize:(CGSize)aPageSize
@implementation LeavesCache

- (id)initWithPageSize:(CGSize)aPageSize
{
if ([super init]) {
pageSize = aPageSize;
pageCache = [[NSMutableDictionary alloc] init];
if (self = [super init]) {
_pageSize = aPageSize;
_pageCache = [[NSMutableDictionary alloc] init];
}
return self;
}

- (void) dealloc
- (void)dealloc
{
[pageCache release];
[_pageCache release];
[super dealloc];
}



- (CGImageRef) imageForPageIndex:(NSUInteger)pageIndex {
- (CGImageRef)imageForPageIndex:(NSUInteger)pageIndex {
if (CGSizeEqualToSize(self.pageSize, CGSizeZero))
return NULL;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL,
pageSize.width,
pageSize.height,
self.pageSize.width,
self.pageSize.height,
8, /* bits per component*/
pageSize.width * 4, /* bytes per row */
self.pageSize.width * 4, /* bytes per row */
colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);
CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width, pageSize.height));
CGContextClipToRect(context, CGRectMake(0, 0, self.pageSize.width, self.pageSize.height));

[dataSource renderPageAtIndex:pageIndex inContext:context];
[self.dataSource renderPageAtIndex:pageIndex inContext:context];

CGImageRef image = CGBitmapContextCreateImage(context);
CGContextRelease(context);
Expand All @@ -53,52 +58,54 @@ - (CGImageRef) imageForPageIndex:(NSUInteger)pageIndex {
return image;
}

- (CGImageRef) cachedImageForPageIndex:(NSUInteger)pageIndex {
- (CGImageRef)cachedImageForPageIndex:(NSUInteger)pageIndex {
NSNumber *pageIndexNumber = [NSNumber numberWithInt:pageIndex];
UIImage *pageImage;
@synchronized (pageCache) {
pageImage = [pageCache objectForKey:pageIndexNumber];
@synchronized (self.pageCache) {
pageImage = [self.pageCache objectForKey:pageIndexNumber];
}
if (!pageImage) {
CGImageRef pageCGImage = [self imageForPageIndex:pageIndex];
pageImage = [UIImage imageWithCGImage:pageCGImage];
@synchronized (pageCache) {
[pageCache setObject:pageImage forKey:pageIndexNumber];
}
if (pageCGImage) {
pageImage = [UIImage imageWithCGImage:pageCGImage];
@synchronized (self.pageCache) {
[self.pageCache setObject:pageImage forKey:pageIndexNumber];
}
}
}
return pageImage.CGImage;
}

- (void) precacheImageForPageIndexNumber:(NSNumber *)pageIndexNumber {
- (void)precacheImageForPageIndexNumber:(NSNumber *)pageIndexNumber {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[self cachedImageForPageIndex:[pageIndexNumber intValue]];
[pool release];
}

- (void) precacheImageForPageIndex:(NSUInteger)pageIndex {
- (void)precacheImageForPageIndex:(NSUInteger)pageIndex {
[self performSelectorInBackground:@selector(precacheImageForPageIndexNumber:)
withObject:[NSNumber numberWithInt:pageIndex]];
}

- (void) minimizeToPageIndex:(NSUInteger)pageIndex {
- (void)minimizeToPageIndex:(NSUInteger)pageIndex {
/* Uncache all pages except previous, current, and next. */
@synchronized (pageCache) {
for (NSNumber *key in [pageCache allKeys])
@synchronized (self.pageCache) {
for (NSNumber *key in [self.pageCache allKeys])
if (ABS([key intValue] - (int)pageIndex) > 2)
[pageCache removeObjectForKey:key];
[self.pageCache removeObjectForKey:key];
}
}

- (void) flush {
@synchronized (pageCache) {
[pageCache removeAllObjects];
- (void)flush {
@synchronized (self.pageCache) {
[self.pageCache removeAllObjects];
}
}

#pragma mark accessors

- (void) setPageSize:(CGSize)value {
pageSize = value;
- (void)setPageSize:(CGSize)value {
_pageSize = value;
[self flush];
}

Expand Down
Loading