1// 2// PXScale2xScaleAlgorithm.m 3// Pixen-XCode 4// 5// Created by Ian Henderson on 26.08.04. 6// Copyright 2004 Open Sword Group. All rights reserved. 7// 8 9#import "PXScale2xScaleAlgorithm.h" 10#import "PXCanvas.h" 11#import "PXLayer.h" 12 13@implementation PXScale2xScaleAlgorithm 14 15- (NSString *)name 16{ 17 return @"Scale2x"; 18} 19 20- (NSString *)algorithmInfo 21{ 22 return NSLocalizedString(@"SCALE2X_INFO", @"Scale2x Info Here"); 23} 24 25- (BOOL)canScaleCanvas:canvas toSize:(NSSize)size 26{ 27 if (canvas == nil || size.width < 1 || size.height < 1) { 28 return NO; 29 } 30 double widthLog = log2(size.width / [canvas size].width); 31 double heightLog = log2(size.height / [canvas size].height); 32 if (fabs(floor(widthLog) - widthLog) > .001 || fabs(floor(heightLog) - heightLog) > .001 || fabs(widthLog - heightLog) > .001) { 33 return NO; 34 } 35 return YES; 36} 37 38- (void)scaleCanvas:canvas toSize:(NSSize)size 39{ 40 if (canvas == nil) { 41 return; 42 } 43 NSEnumerator *layerEnumerator; 44 PXLayer *layer, *layerCopy; 45 int x, y; 46 NSColor *A, *B, *C, *D, *E, *F, *G, *H, *I, *E0, *E1, *E2, *E3; 47 int xScale = size.width / [canvas size].width; 48 int yScale = size.height / [canvas size].height; 49 int layerWidth, layerHeight; 50 layerWidth = [canvas size].width; 51 layerHeight = [canvas size].height; 52 NSAutoreleasePool *pool; 53 54 while (xScale > 1 && yScale > 1) { 55 layerWidth = layerWidth << 1; 56 layerHeight = layerHeight << 1; 57 layerEnumerator = [[canvas layers] objectEnumerator]; 58 while (layer = [layerEnumerator nextObject]) { 59 pool = [[NSAutoreleasePool alloc] init]; 60 layerCopy = [[layer copy] autorelease]; 61 [layer setSize:NSMakeSize(layerWidth, layerHeight)]; 62 for (x=0; x<[canvas size].width; x++) { 63 for (y=0; y<[canvas size].height; y++) { 64 // A B C 65 // D E F 66 // G H I 67 68 A = [layerCopy colorAtPoint:NSMakePoint(x - 1, y - 1)]; 69 B = [layerCopy colorAtPoint:NSMakePoint(x , y - 1)]; 70 C = [layerCopy colorAtPoint:NSMakePoint(x + 1, y - 1)]; 71 D = [layerCopy colorAtPoint:NSMakePoint(x - 1, y)]; 72 E = [layerCopy colorAtPoint:NSMakePoint(x , y)]; 73 F = [layerCopy colorAtPoint:NSMakePoint(x + 1, y)]; 74 G = [layerCopy colorAtPoint:NSMakePoint(x - 1, y + 1)]; 75 H = [layerCopy colorAtPoint:NSMakePoint(x , y + 1)]; 76 I = [layerCopy colorAtPoint:NSMakePoint(x + 1, y + 1)]; 77 78 if (![B isEqual:H] && ![D isEqual:F]) { 79 E0 = [D isEqual:B] ? D : E; 80 E1 = [B isEqual:F] ? F : E; 81 E2 = [D isEqual:H] ? D : E; 82 E3 = [H isEqual:F] ? F : E; 83 } else { 84 E0 = E; 85 E1 = E; 86 E2 = E; 87 E3 = E; 88 } 89 90 [layer setColor:E0 atPoint:NSMakePoint(x*2, y*2)]; 91 [layer setColor:E1 atPoint:NSMakePoint(x*2 + 1, y*2)]; 92 [layer setColor:E2 atPoint:NSMakePoint(x*2, y*2 + 1)]; 93 [layer setColor:E3 atPoint:NSMakePoint(x*2 + 1, y*2 + 1)]; 94 } 95 } 96 [pool release]; 97 } 98 xScale = xScale >> 1; 99 yScale = yScale >> 1; 100 [canvas layersChanged]; 101 } 102 [canvas canvasShouldRedraw:nil]; 103} 104 105@end 106