BWToolkit / NSImage+BWAdditions.m

Brandon Walkin b48f0b7 

Brandon Walkin ac10541 
Brandon Walkin 100e138 
Brandon Walkin b48f0b7 

Brandon Walkin ac10541 

Brandon Walkin 100e138 
Brandon Walkin ac10541 

Brandon Walkin ec5d314 
Brandon Walkin ac10541 

Brandon Walkin b48f0b7 
//  NSImage+BWAdditions.m
//  BWToolkit
//  Created by Brandon Walkin (
//  All code is provided under the New BSD license.

#import "NSImage+BWAdditions.h"

@implementation NSImage (BWAdditions)

// Draw a solid color over an image - taking into account alpha. Useful for coloring template images.

- (NSImage *)bwTintedImageWithColor:(NSColor *)tint 
	NSSize size = [self size];
	NSRect imageBounds = NSMakeRect(0, 0, size.width, size.height);    
	NSImage *copiedImage = [self copy];
	[copiedImage lockFocus];
	[tint set];
	NSRectFillUsingOperation(imageBounds, NSCompositeSourceAtop);
	[copiedImage unlockFocus];  
	return [copiedImage autorelease];

// Rotate an image 90 degrees clockwise or counterclockwise
// Code from

- (NSImage *)bwRotateImage90DegreesClockwise:(BOOL)clockwise
    NSImage *existingImage = self;
    NSSize existingSize;
     * Get the size of the original image in its raw bitmap format.
     * The bestRepresentationForDevice: nil tells the NSImage to just
     * give us the raw image instead of it's wacky DPI-translated version.
    existingSize.width = [[existingImage bestRepresentationForDevice:nil] pixelsWide];
    existingSize.height = [[existingImage bestRepresentationForDevice:nil] pixelsHigh];
    NSSize newSize = NSMakeSize(existingSize.height, existingSize.width);
    NSImage *rotatedImage = [[[NSImage alloc] initWithSize:newSize] autorelease];
    [rotatedImage lockFocus];
     * Apply the following transformations:
     * - bring the rotation point to the centre of the image instead of
     *   the default lower, left corner (0,0).
     * - rotate it by 90 degrees, either clock or counter clockwise.
     * - re-translate the rotated image back down to the lower left corner
     *   so that it appears in the right place.
    NSAffineTransform *rotateTF = [NSAffineTransform transform];
    NSPoint centerPoint = NSMakePoint(newSize.width / 2, newSize.height / 2);
    [rotateTF translateXBy: centerPoint.x yBy: centerPoint.y];
    [rotateTF rotateByDegrees: (clockwise) ? - 90 : 90];
    [rotateTF translateXBy: -centerPoint.y yBy: -centerPoint.x];
    [rotateTF concat];
     * We have to get the image representation to do its drawing directly,
     * because otherwise the stupid NSImage DPI thingie bites us in the butt
     * again.
    NSRect r1 = NSMakeRect(0, 0, newSize.height, newSize.width);
    [[existingImage bestRepresentationForDevice:nil] drawInRect:r1];
    [rotatedImage unlockFocus];
    return rotatedImage;