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