BWToolkit / NSImage+BWAdditions.m

Full commit
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;