mirror of
https://github.com/nickshanks/ResKnife.git
synced 2024-12-22 17:30:15 +00:00
178 lines
5.9 KiB
Mathematica
178 lines
5.9 KiB
Mathematica
|
/* =============================================================================
|
||
|
PROJECT: ResKnife
|
||
|
FILE: ICONWindowController.h
|
||
|
|
||
|
PURPOSE: This is the main class of our bitmap resource editor. Every
|
||
|
resource editor's main class implements the
|
||
|
ResKnifePluginProtocol. Every editor should implement
|
||
|
initWithResource:. Only implement initWithResources: if you feel
|
||
|
like writing a template editor.
|
||
|
|
||
|
Note that your plugin is responsible for committing suicide
|
||
|
after its window has been closed. If you subclass it from
|
||
|
NSWindowController, the controller will take care of that
|
||
|
for you, according to a guy named Doug.
|
||
|
|
||
|
AUTHORS: M. Uli Kusterer, witness(at)zathras.de, (c) 2003.
|
||
|
|
||
|
REVISIONS:
|
||
|
2003-07-31 UK Created.
|
||
|
========================================================================== */
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
Headers:
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
#import "ICONWindowController.h"
|
||
|
|
||
|
|
||
|
|
||
|
@implementation ICONWindowController
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
initWithResource:
|
||
|
This is it! This is the constructor. Create your window here and
|
||
|
do whatever else makes you happy. A new instance is created for each
|
||
|
resource. Note that you are responsible for keeping track of your
|
||
|
resource.
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
-(id) initWithResource: (id)newResource
|
||
|
{
|
||
|
self = [self initWithWindowNibName:@"ICONWindow"];
|
||
|
if( !self ) return nil;
|
||
|
|
||
|
resource = [newResource retain];
|
||
|
resData = nil;
|
||
|
resImage = nil;
|
||
|
|
||
|
// load the window from the nib
|
||
|
[self window];
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
* DESTRUCTOR
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
-(void) dealloc
|
||
|
{
|
||
|
[resImage autorelease];
|
||
|
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||
|
[(id)resource autorelease];
|
||
|
[resData release];
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
reloadResData:
|
||
|
Loads the resource's data into our NSImageView.
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
-(void) reloadResData
|
||
|
{
|
||
|
unsigned char* planes[2] = { 0, 0 };
|
||
|
NSBitmapImageRep* bir;
|
||
|
NSString* resType = [resource type];
|
||
|
|
||
|
[resImage autorelease];
|
||
|
resImage = [[NSImage alloc] init];
|
||
|
|
||
|
resData = [[resource data] retain];
|
||
|
planes[0] = (char*) [resData bytes];
|
||
|
|
||
|
if( [resType isEqualToString: @"ICN#"] )
|
||
|
{
|
||
|
planes[1] = planes[0] + (4 * 32); // 32 lines a 4 bytes.
|
||
|
bir = [[[NSBitmapImageRep alloc] autorelease] initWithBitmapDataPlanes:planes pixelsWide:32 pixelsHigh:32
|
||
|
bitsPerSample:1 samplesPerPixel:2 hasAlpha:YES isPlanar:YES colorSpaceName:NSCalibratedBlackColorSpace
|
||
|
bytesPerRow:4 bitsPerPixel:1];
|
||
|
}
|
||
|
else if( [resType isEqualToString: @"ics#"] || [resType isEqualToString: @"CURS"] )
|
||
|
{
|
||
|
planes[1] = planes[0] + (2 * 16); // 16 lines a 2 bytes.
|
||
|
bir = [[[NSBitmapImageRep alloc] autorelease] initWithBitmapDataPlanes:planes pixelsWide:16 pixelsHigh:16
|
||
|
bitsPerSample:1 samplesPerPixel:2 hasAlpha:YES isPlanar:YES colorSpaceName:NSCalibratedBlackColorSpace
|
||
|
bytesPerRow:2 bitsPerPixel:1];
|
||
|
}
|
||
|
else if( [resType isEqualToString: @"icm#"] )
|
||
|
{
|
||
|
planes[1] = planes[0] + (2 * 12); // 12 lines a 2 bytes.
|
||
|
bir = [[[NSBitmapImageRep alloc] autorelease] initWithBitmapDataPlanes:planes pixelsWide:16 pixelsHigh:12
|
||
|
bitsPerSample:1 samplesPerPixel:2 hasAlpha:YES isPlanar:YES colorSpaceName:NSCalibratedBlackColorSpace
|
||
|
bytesPerRow:2 bitsPerPixel:1];
|
||
|
}
|
||
|
else
|
||
|
bir = [[[NSBitmapImageRep alloc] autorelease] initWithBitmapDataPlanes:planes pixelsWide:32 pixelsHigh:32
|
||
|
bitsPerSample:1 samplesPerPixel:1 hasAlpha:NO isPlanar:NO colorSpaceName:NSCalibratedBlackColorSpace
|
||
|
bytesPerRow:4 bitsPerPixel:1];
|
||
|
|
||
|
[resImage addRepresentation:bir];
|
||
|
[imageView setImage: resImage];
|
||
|
|
||
|
//[[self window] setContentSize:[resImage size]];
|
||
|
}
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
windowDidLoad:
|
||
|
Our window is there, stuff the image in it.
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
-(void) windowDidLoad
|
||
|
{
|
||
|
[super windowDidLoad];
|
||
|
|
||
|
// set the window's title
|
||
|
[[self window] setTitle:[resource nameForEditorWindow]];
|
||
|
|
||
|
[self reloadResData];
|
||
|
|
||
|
// we don't want this notification until we have a window! (Only register for notifications on the resource we're editing)
|
||
|
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resourceDataDidChange:) name:ResourceDataDidChangeNotification object:resource];
|
||
|
|
||
|
// finally, show the window
|
||
|
[self showWindow:self];
|
||
|
}
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
resourceDataDidChange:
|
||
|
Notification that someone changed our resource's data and we should
|
||
|
update our display.
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
- (void)resourceDataDidChange:(NSNotification *)notification
|
||
|
{
|
||
|
// ensure it's our resource which got changed (should always be true, we don't register for notifications on other resource objects)
|
||
|
if( [notification object] == (id)resource )
|
||
|
{
|
||
|
[self reloadResData];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
/* -----------------------------------------------------------------------------
|
||
|
imageViewChanged:
|
||
|
The user changed our image view. Convert the image data to the proper
|
||
|
format and stash it in our resource.
|
||
|
-------------------------------------------------------------------------- */
|
||
|
|
||
|
-(IBAction) imageViewChanged: (id)sender
|
||
|
{
|
||
|
NSArray* reps = [resImage representations];
|
||
|
|
||
|
NSLog( @"# %d", [reps count] );
|
||
|
|
||
|
[resImage lockFocusOnRepresentation: [reps objectAtIndex:0]];
|
||
|
[[imageView image] dissolveToPoint: NSMakePoint(0,0) fraction:1];
|
||
|
[resImage unlockFocus];
|
||
|
|
||
|
[imageView setImage: resImage];
|
||
|
}
|
||
|
|
||
|
@end
|