Removing the use of private CoreGraphics APIs to draw shadows, and replacing with...
[ITKit.git] / ITImageCell.m
old mode 100755 (executable)
new mode 100644 (file)
index 055435a..a5d6852
 #import "ITImageCell.h"
 #import <ApplicationServices/ApplicationServices.h>
-#import "ITCoreGraphicsHacks.h"
-
+#import <ITFoundation/ITFoundation.h>
 
 @implementation ITImageCell
 
+- (id)initImageCell:(NSImage *)image {
+       if ((self = [super initImageCell:image])) {
+               _scalesSmoothly = YES;
+               castsShadow = NO;
+               shadowAzimuth = 90.0;
+               shadowAmbient = 0.15;
+               shadowHeight = 1.00;
+               shadowRadius = 4.00;
+       }
+       return self;
+}
 
-- (id)initImageCell:(NSImage *)image
-{
-    if ( (self = [super initImageCell:image]) ) {
-        _scalesSmoothly  = YES;
-        castsShadow      = NO;
-        shadowElevation  = 45.0;
-        shadowAzimuth    = 90.0;
-        shadowAmbient    = 0.15;
-        shadowHeight     = 1.00;
-        shadowRadius     = 4.00;
-        shadowSaturation = 1.0;
-    }
-    NSLog(@"foo");
-    return self;
-}
-
-- (id)init
-{
-    if ( (self = [super init]) ) {
-        _scalesSmoothly  = YES;
-        castsShadow      = NO;
-        shadowElevation  = 45.0;
-        shadowAzimuth    = 90.0;
-        shadowAmbient    = 0.15;
-        shadowHeight     = 1.00;
-        shadowRadius     = 4.00;
-        shadowSaturation = 1.0;
-    }
-    return self;
-}
-
-- (void)drawWithFrame:(NSRect)rect inView:(NSView *)controlView
-{
-    CGSGenericObj        style = nil;
-    CGShadowStyle        shadow;
-    
-    if ( _scalesSmoothly || castsShadow ) {
-        [NSGraphicsContext saveGraphicsState];
-    }
-    
-    if ( _scalesSmoothly ) {
-       // CGContextSetInterpolationQuality([[NSGraphicsContext currentContext] graphicsPort], kCGInterpolationHigh);
-       [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
-       [[NSGraphicsContext currentContext] setShouldAntialias:YES];
-    }
-    
-    if ( castsShadow ) {
-        //      Create the shadow style to use for drawing the string
-        shadow.version    = 0;
-        shadow.elevation  = shadowElevation;
-        shadow.azimuth    = shadowAzimuth;
-        shadow.ambient    = shadowAmbient;
-        shadow.height     = shadowHeight;
-        shadow.radius     = shadowRadius;
-        shadow.saturation = shadowSaturation;
-        style = CGStyleCreateShadow(&shadow);
-        CGContextSetStyle([[NSGraphicsContext currentContext] graphicsPort], style);
-    }
-    
-    [super drawWithFrame:rect inView:controlView];
-
-    if ( _scalesSmoothly || castsShadow ) {
-        [NSGraphicsContext restoreGraphicsState];
-    }
-    
-    if ( castsShadow ) {
-        CGStyleRelease(style);
-    }
+- (id)init {
+       if ((self = [super init])) {
+               _scalesSmoothly = YES;
+               castsShadow = NO;
+               shadowAzimuth = 90.0;
+               shadowAmbient = 0.15; // In my tests, an alpha component of 0.85 perfectly duplicates the old private API's results, resulting in identical shadows. Therefore, the ambient can remain 0.15.
+               shadowHeight = 1.00;
+               shadowRadius = 4.00;
+       }
+       return self;
 }
 
-- (BOOL)scalesSmoothly
-{
-    return _scalesSmoothly;
+- (void)drawWithFrame:(NSRect)rect inView:(NSView *)controlView {
+       NSShadow *shadow;
+       
+       if (_scalesSmoothly || castsShadow) {
+               [NSGraphicsContext saveGraphicsState];
+       }
+       
+       if (_scalesSmoothly) {
+               [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh];
+               [[NSGraphicsContext currentContext] setShouldAntialias:YES];
+       }
+       
+       if (castsShadow) {
+               CGFloat height = ((2.0*tan((M_PI/360.0)*(shadowAzimuth-180.0)))*shadowHeight)/(1.0+pow(tan((M_PI/360.0)*(shadowAzimuth-180.0)),2.0));
+               CGFloat width = sqrt(pow(shadowHeight, 2.0)-pow(height, 2.0));
+               
+               shadow = [[NSShadow alloc] init];
+               [shadow setShadowColor:[[NSColor blackColor] colorWithAlphaComponent:(1.0 - shadowAmbient)]]; 
+               [shadow setShadowOffset:NSMakeSize(width, height)];
+               [shadow setShadowBlurRadius:shadowRadius];
+               
+               [shadow set];
+       }
+       
+       [super drawWithFrame:rect inView:controlView];
+       
+       if (_scalesSmoothly || castsShadow) {
+               [NSGraphicsContext restoreGraphicsState];
+       }
+       
+       if (castsShadow) {
+               [shadow release];
+       }
 }
 
-- (void)setScalesSmoothly:(BOOL)flag
-{
-    _scalesSmoothly = flag;
-    [[self controlView] setNeedsDisplay:YES];
+- (BOOL)scalesSmoothly {
+       return _scalesSmoothly;
 }
 
-- (BOOL)castsShadow;
-{
-    return castsShadow;
+- (void)setScalesSmoothly:(BOOL)flag {
+       _scalesSmoothly = flag;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setCastsShadow:(BOOL)newSetting;
-{
-    castsShadow = newSetting;
-    [[self controlView] setNeedsDisplay:YES];
+- (BOOL)castsShadow {
+       return castsShadow;
 }
 
-- (float)shadowElevation;
-{
-    return shadowElevation;
+- (void)setCastsShadow:(BOOL)newSetting {
+       castsShadow = newSetting;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setShadowElevation:(float)newElevation;
-{
-    shadowElevation = newElevation;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowElevation {
+       return 45.0;
 }
 
-- (float)shadowAzimuth;
-{
-    return shadowAzimuth;
+- (void)setShadowElevation:(float)newElevation {
+       ITDebugLog(@"setShadowElevation: on ITImageCell objects does nothing.");
 }
 
-- (void)setShadowAzimuth:(float)newAzimuth;
-{
-    shadowAzimuth = newAzimuth;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowAzimuth {
+       return shadowAzimuth;
 }
 
-- (float)shadowAmbient;
-{
-    return shadowAmbient;
+- (void)setShadowAzimuth:(float)newAzimuth {
+       shadowAzimuth = newAzimuth;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setShadowAmbient:(float)newAmbient;
-{
-    shadowAmbient = newAmbient;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowAmbient {
+       return shadowAmbient;
 }
 
-- (float)shadowHeight;
-{
-    return shadowHeight;
+- (void)setShadowAmbient:(float)newAmbient {
+       shadowAmbient = newAmbient;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setShadowHeight:(float)newHeight;
-{
-    shadowHeight = newHeight;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowHeight {
+       return shadowHeight;
 }
 
-- (float)shadowRadius;
-{
-    return shadowRadius;
+- (void)setShadowHeight:(float)newHeight {
+       shadowHeight = newHeight;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setShadowRadius:(float)newRadius;
-{
-    shadowRadius = newRadius;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowRadius {
+       return shadowRadius;
 }
 
-- (float)shadowSaturation;
-{
-    return shadowSaturation;
+- (void)setShadowRadius:(float)newRadius {
+       shadowRadius = newRadius;
+       [[self controlView] setNeedsDisplay:YES];
 }
 
-- (void)setShadowSaturation:(float)newSaturation;
-{
-    shadowSaturation = newSaturation;
-    [[self controlView] setNeedsDisplay:YES];
+- (float)shadowSaturation {
+       return 1.0;
 }
 
+- (void)setShadowSaturation:(float)newSaturation {
+       ITDebugLog(@"setShadowSaturation: on ITImageCell objects does nothing.");
+}
 
-@end
+@end
\ No newline at end of file