1// PXPencilTool.m 2// Pixen 3// 4// Created by Joe Osborn on Tue Sep 30 2003. 5// Copyright (c) 2003 Open Sword Group. All rights reserved. 6// 7 8#import "PXPencilTool.h" 9#import "PXCanvas.h" 10#import "PXCanvasController.h" 11#import "PXPencilToolPropertiesView.h" 12 13@implementation PXPencilTool 14 15- (NSString *)name 16{ 17 return NSLocalizedString(@"PENCIL_NAME", @"Pencil Tool"); 18} 19 20- (BOOL)shiftKeyDown 21{ 22 shiftDown = YES; 23 return YES; 24} 25 26- (BOOL)shiftKeyUp 27{ 28 shiftDown = NO; 29 return YES; 30} 31 32- init 33{ 34 [super init]; 35 propertiesView = [[PXPencilToolPropertiesView alloc] init]; 36 shiftDown = NO; 37 return self; 38} 39 40- (void)dealloc 41{ 42 [propertiesView release]; 43 [super dealloc]; 44} 45 46- actionName 47{ 48 return NSLocalizedString(@"PENCIL_ACTION", @"Drawing"); 49} 50 51- (void)setColor:aColor 52{ 53 color = aColor; 54} 55 56- color 57{ 58 return color; 59} 60 61- (void)drawWithOldColor:(NSColor *)oldColor newColor:(NSColor *)newColor atPoint:(NSPoint)aPoint inLayer:aLayer ofCanvas:aCanvas 62{ 63 if(![aCanvas canDrawAtPoint:aPoint]) { return; } 64 id setColor = newColor; 65 [[[self undoManager] prepareWithInvocationTarget:self] 66drawWithOldColor:newColor newColor:oldColor atPoint:aPoint inLayer:aLayer ofCanvas:aCanvas]; 67 [aLayer setColor:setColor atPoint:aPoint]; 68 [aCanvas changedInRect:NSMakeRect(aPoint.x, aPoint.y, 1, 1)]; 69} 70 71- (void)drawPixelAtPoint:(NSPoint)aPoint inCanvas:aCanvas 72{ 73 if (![propertiesView respondsToSelector:@selector(lineThickness)]) { 74 [self drawWithOldColor:[aCanvas 75colorAtPoint:aPoint] newColor:[self color] atPoint:aPoint inLayer:[aCanvas activeLayer] ofCanvas:aCanvas]; 76 return; 77 } 78 if ([propertiesView drawingPoints] != nil) { 79 NSArray *points = [propertiesView drawingPoints]; 80 int i; 81 for (i=0; i<[points count]; i++) { 82 NSPoint point = [[points objectAtIndex:i] pointValue]; 83 point.x += ceilf(aPoint.x - ([propertiesView patternSize].width / 2)); 84 point.y += ceilf(aPoint.y - ([propertiesView patternSize].height / 2)); 85 [self drawWithOldColor:[aCanvas 86colorAtPoint:point] newColor:[self color] atPoint:point inLayer:[aCanvas activeLayer] ofCanvas:aCanvas]; 87 } 88 return; 89 } 90 int diameter = [propertiesView lineThickness]; 91 int radius = diameter/2; 92 NSRect rect = NSMakeRect(aPoint.x-radius, aPoint.y-radius, diameter, diameter); 93 int x,y; 94 for (x=rect.origin.x; x<rect.origin.x+rect.size.width; x++) { 95 for (y=rect.origin.y; y<rect.origin.y+rect.size.height; y++) { 96 [self drawWithOldColor:[aCanvas 97colorAtPoint:NSMakePoint(x,y)] newColor:[self color] atPoint:NSMakePoint(x,y) inLayer:[aCanvas activeLayer] ofCanvas:aCanvas]; 98 } 99 } 100} 101 102- (void)drawLineFrom:(NSPoint)initialPoint to:(NSPoint)finalPoint inCanvas:canvas 103{ 104 NSPoint differencePoint = NSMakePoint(finalPoint.x - initialPoint.x, finalPoint.y - initialPoint.y); 105 NSPoint currentPoint = initialPoint; 106 while(!NSEqualPoints(finalPoint, currentPoint)) 107 { 108 if(differencePoint.x == 0) { currentPoint.y += ((differencePoint.y > 0) ? 1 : -1); } 109 else if(differencePoint.y == 0) { currentPoint.x += ((differencePoint.x > 0) ? 1 : -1); } 110 else if(abs(differencePoint.x) < abs(differencePoint.y)) 111 { 112 currentPoint.y += ((differencePoint.y > 0) ? 1 : -1); 113 currentPoint.x = rintf((differencePoint.x/differencePoint.y)*(currentPoint.y-initialPoint.y) + initialPoint.x); 114 } 115 else 116 { 117 currentPoint.x += ((differencePoint.x > 0) ? 1 : -1); 118 currentPoint.y = rintf((differencePoint.y/differencePoint.x)*(currentPoint.x-initialPoint.x) + initialPoint.y); 119 } 120 if([canvas canDrawAtPoint:currentPoint]) { [self drawPixelAtPoint:currentPoint inCanvas:canvas]; } 121 } 122} 123 124- (void)mouseDownAt:(NSPoint)aPoint fromCanvasController:controller 125{ 126 [[self undoManager] setActionName:[self actionName]]; 127 [[self undoManager] beginUndoGrouping]; 128 [[[NSDocumentController sharedDocumentController] currentDocument] updateChangeCount:NSChangeDone]; 129 if (!shiftDown || [[controller canvas] lastDrawnPoint].x == -1) { 130 [self drawPixelAtPoint:aPoint inCanvas:[controller canvas]]; 131 [[controller canvas] changedInRect:NSMakeRect(aPoint.x, aPoint.y, 1, 1)]; 132 } else { 133 [self drawLineFrom:[[controller canvas] lastDrawnPoint] to:aPoint inCanvas:[controller canvas]]; 134 } 135 [[controller canvas] setLastDrawnPoint:aPoint]; 136} 137 138- (void)mouseDraggedFrom:(NSPoint)initialPoint to:(NSPoint)finalPoint fromCanvasController:controller 139{ 140 if (!shiftDown) { 141 [[controller canvas] setLastDrawnPoint:finalPoint]; 142 [self drawLineFrom:initialPoint to:finalPoint inCanvas:[controller canvas]]; 143 } 144} 145 146- (void)mouseUpAt:(NSPoint)aPoint fromCanvasController:controller 147{ 148 if([[self undoManager] groupingLevel] != 0) 149 { 150 [[self undoManager] endUndoGrouping]; 151 } 152} 153 154@end