1//
2//  PXLayer.m
3//  Pixen-XCode
4//
5//  Created by Joe Osborn on Sun Jan 04 2004.
6//  Copyright (c) 2004 Open Sword Group. All rights reserved.
7//
8
9#import "PXLayer.h"
10#import "PXLayerController.h"
11#import "PXImage.h"
12
13@implementation PXLayer
14
15- initWithName:aName image:anImage
16{
17	[super init];
18	[self setName:aName];
19	image = [anImage retain];
20	opacity = 100;
21	visible = YES;
22	return self;
23}
24
25- initWithName:aName size:(NSSize)size
26{
27	return [self initWithName:aName image:[[[PXImage alloc] initWithSize:size] autorelease]];
28}
29
30- (void)dealloc
31{
32	[name release];
33	[image release];
34	[super dealloc];
35}
36
37- name
38{
39	return name;
40}
41
42- (void)setName:aName
43{
44	[name release];
45	name = [aName copy];
46}
47
48- image
49{
50	return image;
51}
52
53- (double)opacity
54{
55	return opacity;
56}
57
58- (void)setOpacity:(double)newOpacity
59{
60	opacity = newOpacity;
61}
62
63- (BOOL)visible
64{
65	return visible;
66}
67
68- (void)setVisible:(BOOL)isVisible
69{
70	visible = isVisible;
71}
72
73- (BOOL)canDrawAtPoint:(NSPoint)point
74{
75	return [image containsPoint:point];
76}
77
78- (NSColor *)colorAtPoint:(NSPoint)aPoint
79{
80	id color = [image colorAtPoint:aPoint];
81	if(color == nil) { color = [NSColor clearColor]; }
82	return color;
83}
84
85- (void)setColor:(NSColor *)aColor atPoint:(NSPoint)aPoint
86{
87	[image setColor:aColor atPoint:aPoint];
88}
89
90- (void)setColor:(NSColor *)aColor atPoints:(NSArray *)points
91{
92	[image setColor:aColor atPoints:points];
93}
94
95- (void)moveToPoint:(NSPoint)newOrigin
96{
97	origin = newOrigin;
98}
99
100- (NSSize)size
101{
102	return [image size];
103}
104
105- (void)setSize:(NSSize)newSize withOrigin:(NSPoint)anOrigin backgroundColor:(NSColor *)color
106{
107	[image setSize:newSize withOrigin:anOrigin backgroundColor:color];
108}
109
110- (void)setSize:(NSSize)newSize
111{
112	[self setSize:newSize withOrigin:NSZeroPoint backgroundColor:[NSColor clearColor]];
113}
114
115- (void)finalizeMotion
116{
117	[image translateXBy:origin.x yBy:origin.y];
118	origin = NSZeroPoint;
119}
120
121- (void)translateXBy:(float)amountX yBy:(float)amountY
122{
123	[self moveToPoint:NSMakePoint(origin.x + amountX, origin.y + amountY)];
124}
125
126- (void)replacePixelsOfColor:oldColor withColor:newColor
127{
128	[image replacePixelsOfColor:oldColor withColor:newColor];
129}
130
131- (void)transformedDrawRect:(NSRect)rect fixBug:(BOOL)fixBug
132{
133	[image drawRect:rect withOpacity:(opacity / 100.00) fixBug:fixBug];
134}
135
136- (void)drawRect:(NSRect)rect fixBug:(BOOL)fixBug
137{
138	if (!visible) { return; }
139	NSAffineTransform * transform = [NSAffineTransform transform];
140	[transform translateXBy:origin.x yBy:origin.y];
141	[transform concat];
142	[self transformedDrawRect:rect fixBug:fixBug];
143	[transform invert];
144	[transform concat];
145}
146
147- (void)compositeUnder:aLayer flattenOpacity:(BOOL)flattenOpacity
148{
149	int i, j;
150	for (i=0; i < [image size].width; i++)
151	{
152		for (j=0; j < [image size].height; j++)
153		{
154			NSPoint point = NSMakePoint(i, j);
155			id color1 = [image colorAtPoint:point], color2 = [(PXImage *)[aLayer image] colorAtPoint:point];
156			[image setColor:((flattenOpacity) ? [color1 colorWithAlphaComponent:[color1 alphaComponent]*(opacity/100.00)] : color1) atPoint:point];
157			[(PXImage *)[aLayer image] setColor:((flattenOpacity) ? [color2 colorWithAlphaComponent:[color2 alphaComponent]*([aLayer opacity]/100.00)] : color2) atPoint:point];
158
159		}
160	}
161	[image compositeUnder:[aLayer image]];
162	if (flattenOpacity) { [self setOpacity:100]; }
163}
164
165- (void)flipHorizontally
166{
167	[image flipHorizontally];
168}
169
170- (void)flipVertically
171{
172	[image flipVertically];
173}
174
175- initWithCoder:coder
176{
177	[super init];
178	image = [[coder decodeObjectForKey:@"image"] retain];
179	name = [[coder decodeObjectForKey:@"name"] retain];
180	visible = YES;
181	if([coder decodeObjectForKey:@"opacity"] != nil)
182	{
183		opacity = [[coder decodeObjectForKey:@"opacity"] doubleValue];
184	}
185	else
186	{
187		opacity = 100;
188	}
189	return self;
190}
191
192- (void)encodeWithCoder:coder
193{
194	[coder encodeObject:image forKey:@"image"];
195	[coder encodeObject:name forKey:@"name"];
196	[coder encodeObject:[NSNumber numberWithDouble:opacity] forKey:@"opacity"];
197}
198
199- copyWithZone:(NSZone *)zone
200{
201	id copy = [[[self class] allocWithZone:zone] initWithName:name image:[[image copyWithZone:zone] autorelease]];
202	[copy setOpacity:opacity];
203	[copy setVisible:visible];
204	[copy setLayerController:layerController];
205	return copy;
206}
207
208- (void)setLayerController:controller
209{
210	layerController = controller;
211}
212
213- (void)delete:sender
214{
215	[layerController removeLayerObject:self];
216}
217
218- (void)duplicate:sender
219{
220	[layerController duplicateLayerObject:self];
221}
222
223- (void)mergeDown:sender
224{
225	[layerController mergeDownLayerObject:self];
226}
227
228@end
229