/MapView/Map/RMTiledLayerController.m
http://github.com/route-me/route-me · Objective C · 159 lines · 91 code · 32 blank · 36 comment · 5 complexity · e0624cfc54438073e0a6ac63207fd50d MD5 · raw file
- //
- // RMTiledLayerController.m
- //
- // Copyright (c) 2008-2009, Route-Me Contributors
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions are met:
- //
- // * Redistributions of source code must retain the above copyright notice, this
- // list of conditions and the following disclaimer.
- // * Redistributions in binary form must reproduce the above copyright notice,
- // this list of conditions and the following disclaimer in the documentation
- // and/or other materials provided with the distribution.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
- // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- // POSSIBILITY OF SUCH DAMAGE.
- #import "RMGlobalConstants.h"
- #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 = CGPointZero;
- [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) centerProjectedPoint: (RMProjectedPoint) 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
- {
- RMLog(@"drawLayer:inContext:");
-
- // CGRect visibleRect = [self visibleRect];
- // RMLog(@"visibleRect: %d %d %d %d", visibleRect.origin.x, visibleRect.origin.y, visibleRect.size.width, visibleRect.size.height);
-
- CGRect rect = CGContextGetClipBoundingBox(theContext);
- // RMLog(@"rect: %d %d %d %d", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height);
-
- //CGAffineTransform transform = CGContextGetCTM(theContext);
- // RMLog(@"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);
- /// \bug magic string literals
- 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);
- }
- - (void)setFrame:(CGRect)frame
- {
- }
- - (CALayer*) layer
- {
- return layer;
- }
- @end