Forum Navigation
Forum breadcrumbs - You are here:WeLoveGod RallysPublic Forums: fbcocoaNSImageView
You need to log in to create posts and topics.

NSImageView

Posted by: svanvoorst <svanvoorst@...>

/*
   Source "Cocoa and Objective-C Up and Running", Scott Stevenson, ©2010, pp. 329-48.
   Converted to FBtoC by S.Van Voorst       {20120122}
*/
include resources "MyImage.jpg"
BeginCDeclaration
@interface NSBezierPath (Utilities)
{
}
+ (NSBezierPath *) sheenPathForRect:(NSRect) myRect;
@end //interface
EndC
BeginCFunction
@implementation NSBezierPath (Utilities)
+ (NSBezierPath *) sheenPathForRect:(NSRect) myRect
{
  CGFloat minX  = NSMinX(myRect);
  CGFloat maxX  = NSMaxX(myRect);
  CGFloat maxY  = NSMaxY(myRect);
// Scale base of sheen with the image.
  CGFloat bottomLeftY  = myRect.origin.y + ( myRect.size.height * 0.25 );
  CGFloat bottomRightY  = myRect.origin.y + ( myRect.size.height * 0.9 );
  NSPoint point1  = NSMakePoint ( minX, bottomLeftY );
  NSPoint point2  = NSMakePoint ( maxX, bottomRightY );
  NSPoint point3  = NSMakePoint ( maxX, maxY );
  NSPoint point4  = NSMakePoint ( minX, maxY );
// For arc that crosses the image.
  NSPoint control1 = NSMakePoint ( minX * 0.9, maxY * 0.9 );
  NSPoint control2 = NSMakePoint ( maxX * 0.9, maxY * 0.9 );
 
// Create path.
  NSBezierPath *sheenPath = [NSBezierPath bezierPath];
// Starting point.
  [sheenPath moveToPoint: point1];
// Arc to other side.
  [sheenPath curveToPoint: point2 controlPoint1: control1 controlPoint2: control2];
  [sheenPath lineToPoint: point3];
  [sheenPath lineToPoint: point4];
  [sheenPath closePath];
  return sheenPath;
}
@end //implementation
EndC
BeginCDeclaration
@interface NSImage (Utilities)
{
}
- (NSRect) proportionalRectForTargetRect:(NSRect) targetRect;
@end //interface
EndC
BeginCFunction
@implementation NSImage (Utilities)
- (NSRect) proportionalRectForTargetRect:(NSRect) targetRect
{
  // If the sizes are the same, we're already done //
  if (NSEqualSizes(self.size, targetRect.size)) return targetRect;
  NSSize  imageSize  = self.size;
  CGFloat  sourceWidth = imageSize.width;
  CGFloat sourceHeight = imageSize.height;
  // Figure out difference in size for each side, and use the 
  // larger adjustment for both edges to maintain aspect ratio.
  CGFloat widthAdjust  = targetRect.size.width / sourceWidth;
  CGFloat heightAdjust = targetRect.size.height / sourceHeight;
  CGFloat scaleFactor = 1.0;
  if ( widthAdjust < heightAdjust ) scaleFactor = widthAdjust;
  else scaleFactor = widthAdjust;
// Resize both edges by same amount
  CGFloat  finalWidth = sourceWidth * scaleFactor;
  CGFloat  finalHeight = sourceHeight * scaleFactor;
  NSSize  finalSize = NSMakeSize( finalWidth, finalHeight );
// Actual rect we'll use for the image
  NSRect finalRect;
  finalRect.size = finalSize;
// Use same base origin as target rect, but adjust for resized image.
  finalRect.origin  = targetRect.origin;
  finalRect.origin.x += (targetRect.size.width - finalWidth) * 0.5;
  finalRect.origin.y += (targetRect.size.height - finalHeight) * 0.5;
// Return exact coordinates for a sharp image
   return NSIntegralRect (finalRect);
}
@end //implementation
EndC
BeginCDeclaration
@interface AppDelegate : NSObject
{
  NSImage *mainImage;
  NSColor *backgroundColor;
  NSColor *borderColor;
  NSWindow *window;
}
@property (retain) NSWindow *window;
@property (retain) NSColor *backgroundColor;
@property (retain) NSColor *borderColor;
@property (retain) NSImage *mainImage;
//methods automatically called
@end //interface
EndC
BeginCFunction
@implementation AppDelegate
@synthesize backgroundColor;
@synthesize borderColor;
@synthesize mainImage;
@synthesize window;
-(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *) theApp;
{
   return YES;
}
- (void) applicationDidFinishLaunching:(NSNotification *) aNotification
{
  NSRect  viewFrame  = [self.window.contentView bounds];
  StyledImageView *imageView;
  imageView = [[StyledImageView alloc] initWithFrame:viewFrame ];
  // Create background gradient
  NSColor *gradientBottom = [NSColor colorWithCalibratedWhite: 0.18 alpha: 1.0];
  NSColor *gradientTop = [NSColor colorWithCalibratedWhite: 0.35 alpha: 1.0];
  NSGradient *gradient = [[NSGradient alloc] initWithStartingColor: gradientBottom endingColor: gradientTop];
  [imageView setMainImage:mainImage];
  [imageView setBorderColor:borderColor];
  [imageView setBackgroundColor:backgroundColor];
  // ---- Set properties for this instance of the view ----- //
  imageView.mainImage = [NSImage imageNamed:@"MyImage.jpg"];
  imageView.backgroundColor = [NSColor darkGrayColor];
  imageView.borderColor = [NSColor whiteColor];
  imageView.shouldAddShadow = YES;
  imageView.backgroundGradient = gradient;
  imageView.shouldAddSheen = YES;
  [gradient release];
  // ---- Resize with the window ------ //
  NSInteger resizingMask = ( NSViewWidthSizable | NSViewHeightSizable );
  [imageView setAutoresizingMask: resizingMask ];
  // ---- Add to contentView and release ------ //
  [self.window.contentView addSubview:imageView];
  [imageView release];
}
@end //implementation
EndC
BeginCDeclaration
@interface StyledImageView : NSView
{
  NSImage *mainImage;
  NSColor *backgroundColor;
  NSColor *borderColor;
  NSShadow *imageShadow;
  BOOL shouldAddShadow;
  NSGradient *backgroundGradient;
  BOOL shouldAddSheen;
  NSGradient *imageSheen;
}
@property (retain) NSImage *mainImage;
@property (retain) NSColor *backgroundColor;
@property (retain) NSColor *borderColor;
@property (retain) NSGradient *backgroundGradient;
@property (assign) BOOL  shouldAddShadow;
@property (assign) BOOL shouldAddSheen;  
// private properties
@property (retain) NSShadow *imageShadow;
@property (retain) NSGradient *imageSheen;
//private methods
+ (NSShadow *) defaultImageShadow;
+ (NSGradient *) defaultImageSheen;
- (void) drawBackgroundInRect: (NSRect)rect;
- (void) drawImageSheenInRect: (NSRect)rect;
@end  //interface
EndC
BeginCFunction
@implementation StyledImageView : NSView;
@synthesize mainImage;
@synthesize backgroundColor;
@synthesize borderColor;
@synthesize imageShadow;
@synthesize backgroundGradient;
@synthesize imageSheen;
// Use @dynamic since we created the setters
@dynamic shouldAddShadow;
@dynamic shouldAddSheen;
- (id)initWithFrame:(NSRect)frameRect
{
 if ((self = [super initWithFrame:frameRect]) != nil) 
 {
  self = [super initWithFrame:frameRect];
  // Add initialization code here
 }
 return self;
}
- (void) drawBackgroundInRect: (NSRect)rect
{
  // Draw background  
  [self.backgroundColor set];
  NSRectFill ( rect );
// Draw background gradient
  [self.backgroundGradient drawInRect:rect angle:90.0];
}
- (void) drawImageSheenInRect: (NSRect)rect
{
  NSBezierPath *sheenPath = [NSBezierPath sheenPathForRect:rect];
// Draw at 280.0 degrees to simulate light source from upper-left.
  [self.imageSheen drawInBezierPath: sheenPath angle:280.0 ];
}
- (void)drawRect:(NSRect)rect
{
  NSRect bounds = self.bounds;
  [self drawBackgroundInRect:bounds];
  CGFloat insetX  = NSWidth ( bounds ) * 0.10;
  CGFloat insetY  = NSHeight ( bounds ) * 0.10;
  NSRect  imageRect  = NSInsetRect ( bounds, insetX, insetY );
// ***** Draw the Image ****** //
  NSImage *image = self.mainImage;
  imageRect = [image proportionalRectForTargetRect:imageRect];
// Save graphics context, apply the shadow, and draw image.
  [NSGraphicsContext saveGraphicsState];  
  [self.imageShadow set];
  [ image drawInRect: imageRect
                 fromRect: NSZeroRect
                operation: NSCompositeSourceOver
                   fraction: 1.0 ];
  [NSGraphicsContext restoreGraphicsState];
// Draw the sheen
  [self drawImageSheenInRect:imageRect];
// Draw border around image.
  [self.borderColor set];
  NSBezierPath *imageFrame = [NSBezierPath bezierPathWithRect: imageRect ];
   imageFrame.lineWidth = 4.0;  
  [imageFrame stroke];
}
- (void) dealloc
 {
  self.mainImage   = nil;
  self.backgroundColor = nil;
  self.borderColor  = nil;
  self.imageShadow = nil;
  self.backgroundGradient = nil;
  self.imageSheen = nil;
  [super dealloc];
 }
//  Use this if you want 0,0 (origin) to be top, left 
//  Otherwise origin will be at bottom, left (Unflipped)
-(BOOL)isFlipped
{
 return NO;
}
- (void) setShouldAddShadow:(BOOL)shouldAdd
{
// If new value is same, just return.
  if (shouldAddShadow == shouldAdd) return;
// Set new value
  shouldAddShadow = shouldAdd;
  if (shouldAddShadow) self.imageShadow = [[self class] defaultImageShadow];
  else self.imageShadow = nil;
// Redraw
  [self setNeedsDisplay:YES];
}
- (void) setShouldAddSheen:(BOOL)shouldAdd
{
// If new value is same, just return.
  if (shouldAddSheen == shouldAdd) return;
// Set new value
  shouldAddSheen = shouldAdd;
  if (shouldAddSheen) self.imageSheen = [[self class] defaultImageSheen];
  else self.imageSheen = nil;
// Redraw
  [self setNeedsDisplay:YES];
}
#pragma mark Private
+ (NSShadow *) defaultImageShadow
{
  NSShadow *newShadow    = [[NSShadow alloc] init];
  newShadow.shadowBlurRadius = 8.0;
  newShadow.shadowOffset  = NSMakeSize( 0,-6 );
  newShadow.shadowColor  = [NSColor blackColor];
  
  return [newShadow autorelease];
}
+ (NSGradient *) defaultImageSheen
{
  NSColor *color1 = [NSColor colorWithDeviceWhite: 1.0 alpha: 0.80];
  NSColor *color2 = [NSColor colorWithDeviceWhite: 1.0 alpha: 0.10];
  NSColor *color3 = [NSColor colorWithDeviceWhite: 1.0 alpha: 0.0];
// 0.0 = start of gradient; 1.0 = end
  NSGradient *sheen = [[NSGradient alloc] initWithColorsAndLocations:
      color1, 0.0, color2, 0.4, color3, 0.8, nil ];
  return [sheen autorelease];
}
@end //implementation
EndC
BeginCCode
{
 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
 [NSApplication sharedApplication];
 [NSApp setActivationPolicy:NSApplicationActivationPolicyRegular];
// ******* Menu and menubar ******* //
 id menubar = [[NSMenu new] autorelease];
 id appMenuItem = [[NSMenuItem new] autorelease];
 [menubar addItem:appMenuItem];
 [NSApp setMainMenu:menubar];
 id appMenu = [[NSMenu new] autorelease];
 id quitMenuItem = [[[NSMenuItem alloc] initWithTitle:@"Quit"
        action:@selector(terminate:) keyEquivalent:@"q"] autorelease];
 [appMenu addItem:quitMenuItem];
 [appMenuItem setSubmenu:appMenu];
// ****** Window ****** //
 #define _wndW  500
 #define _wndH  400
 id window = [ [ NSWindow alloc ] 
                       initWithContentRect:NSMakeRect( 0, 0, _wndW, _wndH )
                       styleMask: NSClosableWindowMask | NSTitledWindowMask | NSResizableWindowMask
                       backing:NSBackingStoreBuffered
                       defer:NO];
 [window center];
 [window setTitle: @"NSImage" ];
 [window makeKeyAndOrderFront:nil]; 
// -- Create instance of AppDelegate (NSObject) ----- //
 id myDelegate = [[AppDelegate alloc]init];
 [NSApp setDelegate:myDelegate];
 [myDelegate setWindow: window];
// -- Instance of StyledImageView (NSView) Created by AppDelegate ---- //
 [NSApp activateIgnoringOtherApps:YES];
 [NSApp run];
 [pool drain];
}
EndC


To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]