RMTiledLayerController.m
3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//
// ScreenProjection.m
// Images
//
// Created by Joseph Gentle on 28/08/08.
// Copyright 2008 __MyCompanyName__. All rights reserved.
//
#import "RMTiledLayerController.h"
#import "RMFractalTileProjection.h"
#import "RMTileSource.h"
@implementation RMTiledLayerController
@synthesize layer;
-(id) initWithTileSource: (id <RMTileSource>) _tileSource
{
if (![super init])
return nil;
@throw [NSException exceptionWithName:@"NotImplementedExcption" reason:@"TiledLayerController is not complete. Use CoreAnimationRenderer instead." userInfo:nil];
tileSource = _tileSource;
[tileSource retain];
RMFractalTileProjection *tileProjection = [tileSource tileProjection];
layer = [CATiledLayer layer];
layer.delegate = self;
layer.levelsOfDetail = tileProjection.maxZoom + 1; // check this.
layer.levelsOfDetailBias = 1; // Allows zoom level 0.
layer.tileSize = CGSizeMake(tileProjection.tileSideLength,
tileProjection.tileSideLength);
RMXYRect boundsRect = tileProjection.bounds;
layer.bounds = CGRectMake(boundsRect.origin.x, boundsRect.origin.y, boundsRect.size.width, boundsRect.size.height) ;
layer.position = CGPointMake(0, 0);
[self setScale:1];
[layer setNeedsDisplay];
return self;
}
-(void) dealloc
{
layer.delegate = nil;
[layer release];
[super dealloc];
}
-(void) setScale: (float) _scale
{
scale = _scale;
layer.transform = CATransform3DMakeScale(1/scale,1/scale, 1.0f);
}
- (float) scale
{
return scale;
}
-(void) centerXYPoint: (RMXYPoint) aPoint animate: (BOOL) animate
{
if (animate == NO)
{
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.0f]
forKey:kCATransactionAnimationDuration];
}
// layer.position = CGPointMake(point.x, point.y);
if (animate == NO)
{
[CATransaction commit];
}
// topLeft = point;
// topLeft.x -= viewSize.width * scale / 2;
// topLeft.y -= viewSize.height * scale / 2;
}
-(void) centerLatLong: (CLLocationCoordinate2D) aPoint animate: (BOOL) animate
{
[self centerMercator:[RMMercator toMercator:aPoint] animate: animate];
}
-(void) dragBy: (CGSize) delta
{
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:0.0f]
forKey:kCATransactionAnimationDuration];
layer.position = CGPointMake(layer.position.x + delta.width,
layer.position.y + delta.height);
[CATransaction commit];
}
-(void) zoomByFactor: (float) zoomFactor near:(CGPoint) center
{
[self setScale: scale * zoomFactor];
}
- (void)drawLayer:(CALayer *)theLayer
inContext:(CGContextRef)theContext
{
NSLog(@"drawLayer:inContext:");
// CGRect visibleRect = [self visibleRect];
// NSLog(@"visibleRect: %d %d %d %d", visibleRect.origin.x, visibleRect.origin.y, visibleRect.size.width, visibleRect.size.height);
CGRect rect = CGContextGetClipBoundingBox(theContext);
// NSLog(@"rect: %d %d %d %d", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
//CGAffineTransform transform = CGContextGetCTM(theContext);
// NSLog(@"transform scale: a:%f b:%f c:%f d:%f tx:%f ty:%f", transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty);
NSString *path = [[NSBundle mainBundle] pathForResource:@"loading" ofType:@"png"];
CGDataProviderRef dataProvider = CGDataProviderCreateWithFilename([path UTF8String]);
CGImageRef image = CGImageCreateWithPNGDataProvider(dataProvider, NULL, FALSE, kCGRenderingIntentDefault);
CGDataProviderRelease(dataProvider);
CGContextDrawImage(theContext, rect, image);
}
- (CALayer*) layer
{
return layer;
}
@end