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