Add the new Font Editor. (Doesn't compile because other source files are still out of date in the repository.)

This commit is contained in:
Nicholas Shanks 2008-07-30 22:40:15 +00:00
parent aefcfa8c65
commit bf529bbb77
14 changed files with 1197 additions and 10 deletions

View File

@ -0,0 +1,171 @@
#import <Foundation/Foundation.h>
@interface NSArray (NGSIndexExtensions)
/*!
@method subarrayWithIndicies:
@author Nicholas Shanks
@created January 2004
@abstract Returns an immutable array of the objects at the given indicies.
*/
- (NSArray *)subarrayWithIndicies:(NSIndexSet *)indicies;
@end
@interface NSArray (NGSKeyValueExtensions)
/*!
@method indexOfFirstObjectReturningValue:forKey:
@author Nicholas Shanks
@created January 2003
@discussion Calls <tt>valueForKey:</tt> on each object in the array, returning the index of the first one encountered which itself returned the value passed in, according to <tt>isEqual:</tt>, or returns <tt>NSNotFound</tt> if no object matched for the given key/value pair. Mostly useful just for increasing code readability, as the methd is only one line long, but one that's not easy to understand at first glance.
@change NGS 2005-02-23: Removed unnecessary code, <tt>indexOfObject:</tt> already returns <tt>NSNotFound</tt> for me.
*/
- (int)indexOfFirstObjectReturningValue:(id)value forKey:(id)key;
/*!
@method firstObjectReturningValue:forKey:
@author Nicholas Shanks
@created January 2003
@discussion Calls <tt>valueForKey:</tt> on each object in the array, returning the first one encountered which itself returned the value passed in, according to <tt>isEqual:</tt>. Returns <tt>nil</tt> if no matching object is found.
@change NGS 2005-02-23: Removed message to <tt>indexOfFirstObjectReturningValue:forKey:</tt>, incorperated that method's code into this one.
*/
- (id)firstObjectReturningValue:(id)value forKey:(id)key;
/*!
@method objectsReturningValue:forKey:
@author Nicholas Shanks
@created January 2003
@abstract Returns an array containing all objects in the receiver which have <tt>value</tt> set for key <tt>key</tt>.
@discussion Calls <tt>valueForKey:</tt> on each object in the array, returning a new array containing all objects which themselves returned the value passed in, according to <tt>isEqual:</tt>. If no objects matched, this method returns an empty array.
*/
- (NSArray *)objectsReturningValue:(id)value forKey:(id)key;
- (NSArray *)arrayByMakingObjectsPerformSelector:(SEL)selector withObject:(id)inObject;
@end
@interface NSCharacterSet (NGSNewlineExtensions)
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
/*!
@method newlineCharacterSet
@author Nicholas Shanks
@created March 2005
@abstract Returns a character set containing only the newline and nextline characters (U+000AÐU+000D, U+0085).
*/
+ (NSCharacterSet *)newlineCharacterSet;
#endif
/*!
@method tabCharacterSet
@author Nicholas Shanks
@created March 2005
@abstract Returns a character set containing only the horizontal and vertical tab characters (U+0009, U+000B).
*/
+ (NSCharacterSet *)tabCharacterSet;
@end
@interface NSIndexSet (NGSIndicies)
+ (id)indexSetWithIndiciesInRange:(NSRange)range;
- (id)initWithIndiciesInRange:(NSRange)range;
- (unsigned int)getIndicies:(unsigned int *)indexBuffer maxCount:(unsigned int)bufferSize inIndexRange:(NSRangePointer)range;
- (BOOL)containsIndiciesInRange:(NSRange)range;
- (BOOL)containsIndicies:(NSIndexSet *)indexSet;
- (BOOL)intersectsIndiciesInRange:(NSRange)range;
@end
@interface NSMutableIndexSet (NGSIndicies)
- (void)addIndicies:(NSIndexSet *)indexSet;
- (void)removeIndicies:(NSIndexSet *)indexSet;
- (void)removeAllIndicies;
- (void)addIndiciesInRange:(NSRange)range;
- (void)removeIndiciesInRange:(NSRange)range;
- (void)shiftIndiciesStartingAtIndex:(unsigned int)index by:(int)delta;
@end
@interface NSNumber (NGSRangeExtensions)
/*!
@method isWithinRange:
@author Nicholas Shanks
@created February 2003
*/
- (BOOL)isWithinRange:(NSRange)range; // location <= self <= location+length
/*!
@method isExclusivelyWithinRange:
@author Nicholas Shanks
@created February 2003
*/
- (BOOL)isExclusivelyWithinRange:(NSRange)range; // location < self < location+length
/*!
@method isBoundedByRange:
@author Nicholas Shanks
@created February 2003
*/
- (BOOL)isBoundedByRange:(NSRange)range; // location <= self < location+length
@end
@interface NSString (NGSFSSpecExtensions)
/*!
@method createFSRef
@author Nicholas Shanks
@created November 2002
@abstract Returns an <tt>FSRef</tt> for the absolute path represented by the receiver. The caller is responsible for disposing of the <tt>FSRef</tt>.
*/
- (FSRef *)createFSRef;
/*!
@method createFSSpec
@author Nicholas Shanks
@created November 2002
@abstract Returns an <tt>FSSpec</tt> for the absolute path represented by the receiver. The caller is responsible for disposing of the <tt>FSSpec</tt>.
*/
- (FSSpec *)createFSSpec;
@end
@interface NSString (NGSBooleanExtensions)
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
/*!
@method boolValue
@author Nicholas Shanks
@created March 2001
*/
- (BOOL)boolValue;
#endif
/*!
@method stringWithBool:
@author Nicholas Shanks
@created March 2001
*/
+ (NSString *)stringWithBool:(BOOL)boolean;
@end
#pragma mark -
#import <AppKit/AppKit.h>
@interface NSOutlineView (NGSSelectedItemExtensions)
/*!
@method selectedItem
@author Nicholas Shanks
@created September 2001
*/
- (id)selectedItem;
/*!
@method selectedItems
@author Nicholas Shanks
@created September 2001
*/
- (NSArray *)selectedItems;
@end
/*
@interface NSGradient (NGSGradientExtensions)
/*!
@method aquaGradient
@method aquaGradientWithAlpha:
@method gradientWithAlpha:
@author Nicholas Shanks
@created May 2007
* /
+ (NSGradient *)aquaGradient;
+ (NSGradient *)aquaGradientWithAlpha:(CGFloat)alpha;
- (NSGradient *)gradientWithAlpha:(CGFloat)alpha;
@end
*/
#pragma mark -
#import <OpenGL/OpenGL.h>
@interface NSOpenGLContext (CGLContextAccess)
- (CGLContextObj)cglContext;
@end

View File

@ -0,0 +1,263 @@
#import "NGSCategories.h"
@implementation NSArray (NGSIndexExtensions)
- (NSArray *)subarrayWithIndicies:(NSIndexSet *)indicies
{
NSRange range = {0,[self count]};
unsigned int count = [indicies count];
unsigned int *buffer = (unsigned int *) calloc(count, sizeof(int));
NSMutableArray *newArray = [NSMutableArray arrayWithCapacity:count];
[indicies getIndexes:buffer maxCount:count inIndexRange:&range];
for(unsigned int i = 0; i < count; i++)
[newArray addObject:[self objectAtIndex:*(buffer+i)]];
return [NSArray arrayWithArray:newArray];
}
@end
@implementation NSArray (NGSKeyValueExtensions)
- (int)indexOfFirstObjectReturningValue:(id)value forKey:(id)key
{
return [[self valueForKey:key] indexOfObject:value];
}
- (id)firstObjectReturningValue:(id)value forKey:(id)key
{
int index = [[self valueForKey:key] indexOfObject:value];
if(index != NSNotFound)
return [self objectAtIndex:index];
else return nil;
}
- (NSArray *)objectsReturningValue:(id)value forKey:(id)key
{
id object;
NSMutableArray *array = [NSMutableArray array];
NSEnumerator *enumerator = [self objectEnumerator];
while(object = [enumerator nextObject])
if([[object valueForKey:key] isEqual:value])
[array addObject:object];
return [NSArray arrayWithArray:array];
}
- (NSArray *)arrayByMakingObjectsPerformSelector:(SEL)selector withObject:(id)inObject
{
id object;
NSMutableArray *array = [NSMutableArray array];
NSEnumerator *enumerator = [self objectEnumerator];
while(object = [enumerator nextObject])
[array addObject:[object performSelector:selector withObject:inObject]];
return [NSArray arrayWithArray:array];
}
@end
#pragma mark -
@implementation NSCharacterSet (NGSCharacterSetExtensions)
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
+ (NSCharacterSet *)newlineCharacterSet
{
unsigned char bitmapRep[8192];
bitmapRep[0x0A >> 3] |= (((unsigned int)1) << (0x0A & 7));
bitmapRep[0x0B >> 3] |= (((unsigned int)1) << (0x0B & 7));
bitmapRep[0x0C >> 3] |= (((unsigned int)1) << (0x0C & 7));
bitmapRep[0x0D >> 3] |= (((unsigned int)1) << (0x0D & 7));
bitmapRep[0x85 >> 3] |= (((unsigned int)1) << (0x85 & 7));
NSData *data = [NSData dataWithBytesNoCopy:bitmapRep length:8192 freeWhenDone:YES];
return [NSCharacterSet characterSetWithBitmapRepresentation:data];
}
#endif
+ (NSCharacterSet *)tabCharacterSet
{
unsigned char bitmapRep[8192];
bitmapRep[0x09 >> 3] |= (((unsigned int)1) << (0x09 & 7));
bitmapRep[0x0B >> 3] |= (((unsigned int)1) << (0x0B & 7));
NSData *data = [NSData dataWithBytesNoCopy:bitmapRep length:8192 freeWhenDone:YES];
return [NSCharacterSet characterSetWithBitmapRepresentation:data];
}
@end
#pragma mark -
@implementation NSIndexSet (NGSIndicies)
+ (id)indexSetWithIndiciesInRange:(NSRange)range
{ return [NSIndexSet indexSetWithIndexesInRange:range]; }
- (id)initWithIndiciesInRange:(NSRange)range
{ return [self initWithIndexesInRange:range]; }
- (unsigned int)getIndicies:(unsigned int *)indexBuffer maxCount:(unsigned int)bufferSize inIndexRange:(NSRangePointer)range
{ return [self getIndexes:indexBuffer maxCount:bufferSize inIndexRange:range]; }
- (BOOL)containsIndiciesInRange:(NSRange)range
{ return [self containsIndexesInRange:range]; }
- (BOOL)containsIndicies:(NSIndexSet *)indexSet
{ return [self containsIndexes:indexSet]; }
- (BOOL)intersectsIndiciesInRange:(NSRange)range
{ return [self intersectsIndexesInRange:range]; }
@end
@implementation NSMutableIndexSet (NGSIndicies)
- (void)addIndicies:(NSIndexSet *)indexSet
{ [self addIndexes:indexSet]; }
- (void)removeIndicies:(NSIndexSet *)indexSet
{ [self removeIndexes:indexSet]; }
- (void)removeAllIndicies
{ [self removeAllIndexes]; }
- (void)addIndiciesInRange:(NSRange)range
{ [self addIndexesInRange:range]; }
- (void)removeIndiciesInRange:(NSRange)range
{ [self removeIndexesInRange:range]; }
- (void)shiftIndiciesStartingAtIndex:(unsigned int)index by:(int)delta
{ [self shiftIndexesStartingAtIndex:index by:delta]; }
@end
#pragma mark -
@implementation NSNumber (NGSRangeExtensions)
- (BOOL)isWithinRange:(NSRange)range // location <= self <= location+length
{
// e.g. for {6,1} a value of 6.000 will return true, as will 7.000
return [self compare:[NSNumber numberWithInt:range.location]] != NSOrderedAscending && [self compare:[NSNumber numberWithInt:range.location+range.length]] != NSOrderedDescending;
}
- (BOOL)isExclusivelyWithinRange:(NSRange)range // location < self < location+length
{
// e.g. for {6,1} a value of 6.000 will return false, 6.001 will return true, 6.999 will return true, 7.000 false
return [self compare:[NSNumber numberWithInt:range.location]] == NSOrderedDescending && [self compare:[NSNumber numberWithInt:range.location+range.length]] == NSOrderedAscending;
}
- (BOOL)isBoundedByRange:(NSRange)range // location <= self < location+length
{
// e.g. for {6,1} a value of 6.000 will return true, 6.999 will return true, 7.000 will not
return [self compare:[NSNumber numberWithInt:range.location]] != NSOrderedAscending && [self compare:[NSNumber numberWithInt:range.location+range.length]] == NSOrderedAscending;
}
@end
#pragma mark -
@implementation NSString (NGSFSSpecExtensions)
- (FSRef *)createFSRef
{
// caller is responsible for disposing of the FSRef (method is a 'create' method)
FSRef *fsRef = (FSRef *) NewPtrClear(sizeof(FSRef));
OSStatus error = FSPathMakeRef((const UInt8 *)[self fileSystemRepresentation], fsRef, NULL);
if(error != noErr) fsRef = NULL;
return fsRef;
}
- (FSSpec *)createFSSpec
{
// caller is responsible for disposing of the FSSpec (method is a 'create' method)
FSRef *fsRef = (FSRef *) NewPtrClear(sizeof(FSRef));
FSSpec *fsSpec = (FSSpec *) NewPtrClear(sizeof(FSSpec));
OSStatus error = FSPathMakeRef((const UInt8 *)[self fileSystemRepresentation], fsRef, NULL);
if(error == noErr)
{
error = FSGetCatalogInfo(fsRef, kFSCatInfoNone, NULL, NULL, fsSpec, NULL);
if(error == noErr)
{
DisposePtr((Ptr)fsRef);
return fsSpec;
}
}
DisposePtr((Ptr)fsRef);
DisposePtr((Ptr)fsSpec);
return NULL;
}
@end
@implementation NSString (NGSBooleanExtensions)
#if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_4
- (BOOL)boolValue
{
return ![self isEqualToString:@"NO"];
}
#endif
+ (NSString *)stringWithBool:(BOOL)boolean
{
return boolean? @"YES" : @"NO";
}
@end
#pragma mark -
/*
@implementation NSMatrix (NGSSelectionIndicies)
- (NSIndexSet *)selectedRows
{
int numRows, numCols;
NSMutableIndexSet *rows = [[NSMutableIndexSet alloc] init];
[self getNumberOfRows:&numRows columns:&numCols];
for(int r = 0; r < numRows; r++)
{
for(int c = 0; c < numCols; c++)
{
if()
{
c = numCols;
continue;
}
}
}
}
- (NSIndexSet *)selectedColumns
{
NSMutableIndexSet *columns = [[NSMutableIndexSet alloc] init];
}
@end
*/
@implementation NSOutlineView (NGSSelectedItemExtensions)
- (id)selectedItem
{
if([self numberOfSelectedRows] != 1) return nil;
else return [self itemAtRow:[self selectedRow]];
}
- (NSArray *)selectedItems;
{
NSNumber *row;
NSMutableArray *items = [NSMutableArray array];
NSEnumerator *enumerator = [self selectedRowEnumerator];
while(row = [enumerator nextObject])
[items addObject:[self itemAtRow:[row intValue]]];
return items;
}
@end
#pragma mark -
/*
@implementation NSGradient (NGSGradientExtensions)
+ (NSGradient *)aquaGradient
{
NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
[NSColor colorWithCalibratedWhite: 0.95 alpha: 1.0], 0.0,
[NSColor colorWithCalibratedWhite: 0.83 alpha: 1.0], 0.5,
[NSColor colorWithCalibratedWhite: 0.95 alpha: 1.0], 0.5,
[NSColor colorWithCalibratedWhite: 0.92 alpha: 1.0], 1.0, nil];
return [gradient autorelease];
}
+ (NSGradient *)aquaGradientWithAlpha:(CGFloat)alpha
{
NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations:
[NSColor colorWithCalibratedWhite: 0.95 alpha: alpha], 0.0,
[NSColor colorWithCalibratedWhite: 0.83 alpha: alpha], 0.5,
[NSColor colorWithCalibratedWhite: 0.95 alpha: alpha], 0.5,
[NSColor colorWithCalibratedWhite: 0.92 alpha: alpha], 1.0, nil];
return [gradient autorelease];
}
- (NSGradient *)gradientWithAlpha:(CGFloat)alpha
{
NSColor *colour;
NSInteger stops = [self numberOfColorStops];
NSMutableArray *colours = [NSMutableArray array];
CGFloat *locations = (CGFloat *) calloc(sizeof(CGFloat), stops);
for(NSInteger i = 0; i < stops; i++)
{
[self getColor: &colour location: &(locations[i]) atIndex: i];
[colours addObject: [colour colorWithAlphaComponent: alpha]];
}
NSGradient *gradient = [[NSGradient alloc] initWithColors: colours atLocations: locations colorSpace: [self colorSpace]];
return [gradient autorelease];
}
@end
*/
#pragma mark -
/* CGLContext access for pre-10.3 */
@implementation NSOpenGLContext (CGLContextAccess)
- (CGLContextObj)cglContext;
{
if(NSAppKitVersionNumber < 700.0)
return _contextAuxiliary;
else return (CGLContextObj) [self CGLContextObj];
}
@end

View File

@ -0,0 +1,12 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {openTableInEditor = id; };
CLASS = FontWindowController;
LANGUAGE = ObjC;
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>137 216 356 240 0 0 1600 1002 </string>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array>
<integer>21</integer>
</array>
<key>IBOldestOS</key>
<integer>3</integer>
<key>IBOpenObjects</key>
<array>
<integer>5</integer>
</array>
<key>IBSystem Version</key>
<string>8L127</string>
</dict>
</plist>

View File

@ -0,0 +1,13 @@
{
IBClasses = (
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
{
ACTIONS = {imageViewChanged = id; };
CLASS = FontWindowController;
LANGUAGE = ObjC;
OUTLETS = {resource = id; tableList = NSTableView; tableListDrawer = NSDrawer; };
SUPERCLASS = NSWindowController;
}
);
IBVersion = 1;
}

View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IBDocumentLocation</key>
<string>445 178 356 240 0 0 1600 1002 </string>
<key>IBEditorPositions</key>
<dict>
<key>31</key>
<string>864 207 78 249 0 0 1600 1002 </string>
<key>52</key>
<string>612 490 436 355 0 0 1600 1002 </string>
</dict>
<key>IBFramework Version</key>
<string>446.1</string>
<key>IBLockedObjects</key>
<array/>
<key>IBOldestOS</key>
<integer>2</integer>
<key>IBOpenObjects</key>
<array>
<integer>43</integer>
<integer>31</integer>
<integer>52</integer>
</array>
<key>IBSystem Version</key>
<string>8L127</string>
</dict>
</plist>

View File

@ -0,0 +1,2 @@
/* name of menu item */
"Add Font Table..." = "Add Font Table…";

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@ -0,0 +1,131 @@
#import <Cocoa/Cocoa.h>
#import <Carbon/Carbon.h>
#import "ResKnifePluginProtocol.h"
#import "ResKnifeResourceProtocol.h"
@interface FontWindowController : NSWindowController <ResKnifePluginProtocol>
{
id <ResKnifeResourceProtocol> resource;
OSType arch;
UInt16 numTables;
UInt16 searchRange;
UInt16 entrySelector;
UInt16 rangeShift;
NSMutableArray *headerTable;
}
- (void)loadFontFromResource;
- (IBAction)saveResource:(id)sender;
- (void)setTableData:(id)tableResource;
- (void)openTable:(NSDictionary *)table inEditor:(BOOL)editor;
@end
/* known Open Font Architectures (OFAs)
true = TrueType (Mac)
0x00010000 = TrueType (Windows)
OTTO = OpenType
typ1 = Type 1
*/
const OSType kOFATrueType = 'true';
const OSType kOFAOpenType = 'OTTO';
const OSType kOFAType1 = 'typ1';
const OSType kOFATrueTypeWindows = 0x00010000;
/* known sfnt tables for all OFAs (TT, OT, T1)
acnt = Accent attachment
addg
avar = Axis variation
BASE (Baseline adjustment)
bdat = Bitmap data
bhed = Bitmap font header
bloc = Bitmap location
bsln = Baseline
CFF (Type 1 glyph outlines)
cmap = Character mapping
cvar = CVT variation
cvt = Control value
DSIG (Digital signature)
EBDT (Embedded bitmap data)
EBLC (Embedded bitmap locator)
EBSC = Embedded bitmap scaling control
ENCO [seen in Tekton Plus]
fdsc = Font descriptor
feat = Layout features
fmtx = Font metrics
FNAM [seen in Tekton Plus]
fpgm = Font program
fvar = Font variations
gasp = Grid-fitting and scan-conversion procedure
glyf = Glyph outlines
GPOS (Glyph positioning)
GSUB (Glyph substitution)
gvar = Glyph variations
hdmx = Horizontal device metrics
head = Font header
HFMX [seen in Tekton Plus]
hhea = Horizontal header
hmtx = Horizontal metrics
hsty = Horizontal style
just = Justification
kern = Kerning
lcar = Ligature caret
loca = Glyph location indicies
LTSH "This table improves the performance of OpenType fonts with TrueType outlines. The table should be used if bit 2 or 4 of flags in 'head' is set. (Microsoft)" [seen in Cochin]
maxp = Maximum profile
mort = Metamorphosis
morx = Extended metamorphosos
name = Font names and other strings
opbd = Optical bounds
OS/2 = OS compatibility
post = Glyph names & PostScript compatibility
prep = Control value program
prop = Properties
trak = Tracking
TYP1 (Type 1 glyph outlines) [seen in Tekton Plus]
VDMX (Vertical device metrics) [seen in Cochin]
vhea = Vertical header
vmtx = Vertical metrics
Zapf = Glyph reference
*/
/* THESE C STRUCTS ARE JUST TO MAKE IT EASIER TO LOAD THE RESOURCE, AND HELP WITH DEBUGGING */
/* sfnt resource http://developer.apple.com/documentation/mac/Text/Text-253.html */
typedef struct
{
unsigned short versionMajor;
unsigned short versionMinor;
unsigned short tableCount;
unsigned short searchRange;
unsigned short entrySelector;
unsigned short rangeShift;
struct
{
unsigned long tagname;
unsigned long checksum;
unsigned long offset;
unsigned long length;
} __attribute__ ((packed)) tables[0];
} __attribute__ ((packed)) sfnt_header;
/* name record http://developer.apple.com/documentation/mac/Text/Text-266.html */
typedef struct
{
unsigned short format_selector; // always 0
unsigned short record_count; // number of name records
unsigned short record_offset; // the offset from the start of the table to the start of string storage
struct
{
unsigned short platform_id;
unsigned short platform_specific_id;
unsigned short language_id;
unsigned short name_id;
unsigned short length;
unsigned short offset; // the offset from the start of storage area
} __attribute__ ((packed)) names[0];
} __attribute__ ((packed)) name_table_header;

View File

@ -0,0 +1,336 @@
#import "FontWindowController.h"
#import "NGSCategories.h"
#import <stdarg.h>
UInt32 TableChecksum(UInt32 *table, UInt32 length)
{
UInt32 sum = 0, nLongs = (length+3) >> 2;
while(nLongs-- > 0) sum += *table++;
return sum;
}
@implementation FontWindowController
- (id)initWithResource:(id <ResKnifeResourceProtocol>)inResource
{
self = [self initWithWindowNibName:@"FontDocument"];
if(!self) return nil;
resource = [(id)inResource retain];
headerTable = [[NSMutableArray alloc] init];
[self loadFontFromResource];
// load the window from the nib
[self window];
return self;
}
- (void)loadFontFromResource
{
char *start = (char *)[[resource data] bytes];
arch = *(OSType*)start;
numTables = *(UInt16*)(start+4);
searchRange = *(UInt16*)(start+6);
entrySelector = *(UInt16*)(start+8);
rangeShift = *(UInt16*)(start+10);
UInt32 *pos = (UInt32 *)(start+12);
/* printf("%s\n", [[self displayName] cString]);
printf(" architecture: %#lx '%.4s'\n", arch, &arch);
printf(" number of tables: %hu\n", numTables);
printf(" searchRange: %hu\n", searchRange);
printf(" entrySelector: %hu\n", entrySelector);
printf(" rangeShift: %hu\n\n", rangeShift);
*/ for(int i = 0; i < numTables; i++)
{
OSType name = *pos++;
UInt32 checksum = *pos++;
UInt32 offset = *pos++;
UInt32 length = *pos++;
[headerTable addObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:
[[[NSString alloc] initWithBytes:&name length:4 encoding:NSMacOSRomanStringEncoding] autorelease], @"name",
[NSNumber numberWithUnsignedLong: checksum], @"checksum",
[NSNumber numberWithUnsignedLong: offset], @"offset",
[NSNumber numberWithUnsignedLong: length], @"length",
[NSData dataWithBytes:start+offset length:length], @"data",
nil]];
}
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[(id)resource release];
[headerTable release];
[super dealloc];
}
- (void)windowDidLoad
{
[super windowDidLoad];
// set the window's title
if(![[resource name] isEqualToString:@""])
{
[[self window] setTitle:[resource name]];
SetWindowAlternateTitle((WindowRef) [[self window] windowRef], (CFStringRef) [NSString stringWithFormat:@"%@ %@: Ò%@Ó", [resource type], [resource resID], [resource name]]);
}
// 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];
}
- (void)windowDidBecomeKey:(NSNotification *)notification
{
NSMenu *resourceMenu = [[[NSApp mainMenu] itemAtIndex:3] submenu];
NSMenuItem *createItem = [resourceMenu itemAtIndex:[resourceMenu indexOfItemWithTarget:nil andAction:@selector(showCreateResourceSheet:)]];
[createItem setTitle: NSLocalizedString(@"Add Font Table...", nil)];
[createItem setAction:@selector(showAddFontTableSheet:)];
}
- (void)windowDidResignKey:(NSNotification *)notification
{
NSMenu *resourceMenu = [[[NSApp mainMenu] itemAtIndex:3] submenu];
NSMenuItem *createItem = [resourceMenu itemAtIndex:[resourceMenu indexOfItemWithTarget:nil andAction:@selector(showAddFontTableSheet:)]];
[createItem setTitle: NSLocalizedString(@"Create New Resource...", nil)];
[createItem setAction:@selector(showCreateResourceSheet:)];
}
- (void)resourceDataDidChange:(NSNotification *)notification
{
[headerTable removeAllObjects];
[self loadFontFromResource];
}
- (BOOL)windowShouldClose:(id)sender
{
if([[self window] isDocumentEdited])
{
NSBeginAlertSheet(@"Do you want to keep the changes you made to this font?", @"Keep", @"DonÕt Keep", @"Cancel", sender, self, @selector(saveSheetDidClose:returnCode:contextInfo:), nil, nil, @"Your changes cannot be saved later if you don't keep them.");
return NO;
}
else return YES;
}
- (void)saveSheetDidClose:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
switch(returnCode)
{
case NSAlertDefaultReturn: // keep
[self saveResource:nil];
[[self window] close];
break;
case NSAlertAlternateReturn: // don't keep
[[self window] close];
break;
case NSAlertOtherReturn: // cancel
break;
}
}
- (void)saveResource:(id)sender
{
// write header fields
NSMutableData *data = [NSMutableData data];
[data appendBytes:&arch length:4];
[data appendBytes:&numTables length:2];
[data appendBytes:&searchRange length:2];
[data appendBytes:&entrySelector length:2];
[data appendBytes:&rangeShift length:2];
UInt32 offset = 12 + ([headerTable count] << 4);
// add table index
for(int i = 0; i < numTables; i++)
{
NSMutableDictionary *table = [headerTable objectAtIndex:i];
NSData *tableData = [table valueForKey:@"data"];
UInt32 length = [tableData length];
UInt32 checksum = TableChecksum((UInt32 *)[tableData bytes], length);
[table setValue:[NSNumber numberWithUnsignedLong:checksum] forKey:@"checksum"];
[table setValue:[NSNumber numberWithUnsignedLong:offset] forKey:@"offset"];
[table setValue:[NSNumber numberWithUnsignedLong:length] forKey:@"length"];
[data appendBytes:[[table valueForKey:@"name"] cStringUsingEncoding:NSMacOSRomanStringEncoding] length:4];
[data appendBytes:&checksum length:4];
[data appendBytes:&offset length:4];
[data appendBytes:&length length:4];
offset += length;
if(offset % 4)
offset += 4-(offset%4);
}
// append tables
long align = 0;
for(int i = 0; i < numTables; i++)
{
// note that this doesn't output in the order thet they were read, nor align on long boundries
[data appendData:[[headerTable objectAtIndex:i] valueForKey:@"data"]];
if([data length] % 4) // pads the last table too... oh well
[data appendBytes:&align length:4-([data length]%4)];
}
// write checksum adjustment to head table
NSDictionary *head = [headerTable firstObjectReturningValue:@"head" forKey:@"name"];
if(head)
{
UInt32 fontChecksum = 0;
NSRange csRange = NSMakeRange([[head valueForKey:@"offset"] unsignedLongValue]+8,4);
[data replaceBytesInRange:csRange withBytes:&fontChecksum length:4];
fontChecksum = TableChecksum((UInt32 *)[data bytes], [data length]);
[data replaceBytesInRange:csRange withBytes:&fontChecksum length:4];
}
// [[NSNotificationCenter defaultCenter] removeObserver:self name:ResourceDataDidChangeNotification object:backup];
[resource setData:data];
// [backup setData:[data copy]];
// [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(resourceDataDidChange:) name:ResourceDataDidChangeNotification object:backup];
[self setDocumentEdited:NO];
}
- (IBAction)showAddFontTableSheet:(id)sender
{
}
- (void)addFontTable:(NSString *)name
{
NSMutableDictionary *table = [NSMutableDictionary dictionaryWithObjectsAndKeys:
name, @"name",
[NSNumber numberWithUnsignedLong: 0], @"checksum",
[NSNumber numberWithUnsignedLong: 0], @"offset",
[NSNumber numberWithUnsignedLong: 0], @"length",
[NSData data], @"data", nil];
[headerTable addObject:table];
numTables = [headerTable count];
[self openTable:table inEditor:YES];
[self setDocumentEdited:YES];
}
- (void)openTableInEditor:(NSTableView *)sender
{
if([sender action])
{
// action set in IB but swapped at first click for a doubleAction ;)
[sender setAction:nil];
[sender setDoubleAction:@selector(openTableInEditor:)];
return;
}
[self openTable:[headerTable objectAtIndex:[sender clickedRow]] inEditor:YES];
}
- (void)openTable:(NSDictionary *)table inEditor:(BOOL)editor
{
NSData *data = [table valueForKey:@"data"];
if(data)
{
id tableResource = [NSClassFromString(@"Resource") resourceOfType:[table valueForKey:@"name"] andID:[NSNumber numberWithInt:0] withName:[NSString stringWithFormat:@"%@ È %@", [resource name], [table valueForKey:@"name"]] andAttributes:[NSNumber numberWithUnsignedShort:0] data:[table valueForKey:@"data"]];
if(!tableResource)
{
NSLog(@"Couldn't create Resource with data for table '%@'.", [table valueForKey:@"name"]);
return;
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(tableDataDidChange:) name:ResourceDataDidChangeNotification object:tableResource];
if(editor) [[resource document] openResourceUsingEditor:tableResource];
else [[resource document] openResource:tableResource usingTemplate:[NSString stringWithFormat:@"sfnt subtable '%@'", [table valueForKey:@"name"]]];
}
}
- (void)tableDataDidChange:(NSNotification *)notification
{
[self setTableData:[notification object]];
}
- (void)setTableData:(id)tableResource
{
NSDictionary *table = [headerTable firstObjectReturningValue:[tableResource type] forKey:@"name"];
if(!table)
{
NSLog(@"Couldn't retrieve table with name '%@'.", [tableResource type]);
return;
}
id undoResource = [[tableResource copy] autorelease];
[undoResource setData:[table valueForKey:@"data"]];
[[[resource document] undoManager] registerUndoWithTarget:resource selector:@selector(setTableData:) object:undoResource];
[[[resource document] undoManager] setActionName:[NSString stringWithFormat:NSLocalizedString(@"Edit of table Ò%@Ó", nil), [tableResource type]]];
[table setValue:[tableResource data] forKey:@"data"];
[self setDocumentEdited:YES];
}
+ (NSArray *)filenameExtensionsForNativeHandling
{
return [NSArray arrayWithObject:@"ttf"];
}
+ (NSString *)filenameExtensionForFileExport:(id <ResKnifeResourceProtocol>)resource
{
if([[resource type] isEqualToString:@"sfnt"]) return @"ttf";
else return [resource type];
}
@end
/* sfnt_header *header = (sfnt_header *) [[resource data] bytes];
for(int i = 0; i < header->tableCount; i++)
{
switch(header->tableInfo[i].tagname)
{
case 'name':
name_table_header *name_table = (name_table_header *) (((char *)[[resource data] bytes]) + header->tableInfo[i].offset);
NSMutableArray *nameArray = [NSMutableArray array];
for(int j = 0; j < name_table->record_count; j++)
{
// load names into array of name_record classes
NSMutableDictionary *name = [NSMutableDictionary dictionary];
NSData *stringData = [NSData dataWithBytes:((char *)name_table + name_table->names[j].offset) length:name_table->names[j].length];
NSStringEncoding stringEncoding;
switch(name_table->names[j].platform_id)
{
case 0: // unicode
stringEncoding = NSUnicodeStringEncoding;
break;
case 1: // mac - values originally were smScript values, which are equivalent to CFStringEncoding values
stringEncoding = CFStringConvertEncodingToNSStringEncoding(name_table->names[j].platform_specific_id);
break;
case 2: // ISO
switch(name_table->names[j].platform_specific_id)
{
case 0: stringEncoding = NSASCIIStringEncoding; break;
case 1: stringEncoding = NSUnicodeStringEncoding; break; // ISO 10646
case 2: stringEncoding = NSISOLatin1StringEncoding; break; // ISO 8859-1
default: stringEncoding = NSASCIIStringEncoding; break;
}
break;
case 2: // windows
switch(name_table->names[j].platform_specific_id)
{
// bug: should use correct encodings here
default: stringEncoding = NSWindowsCP1252StringEncoding; break;
}
break;
default: // undefined
stringEncoding = NSWindowsCP1250StringEncoding; // guess Win-Latin-2
break;
}
[name setValue:[NSNumber numberWithUnsignedShort:name_table->names[j].platform_id] forKey:@"platform"];
[name setValue:[NSNumber numberWithUnsignedShort:name_table->names[j].platform_specific_id] forKey:@"specific"];
[name setValue:[NSNumber numberWithUnsignedShort:name_table->names[j].language_id] forKey:@"language"];
[name setValue:[NSNumber numberWithUnsignedShort:name_table->names[j].name_id] forKey:@"name"];
[name setValue:[NSString stringWithData:stringData encoding:stringEncoding]] forKey:@"string"];
[nameArray addObject:name];
}
[tables setObject:nameArray forKey:@"name"];
break;
default:
// else just save the data of the table
[tables setObject:[NSData dataWithBytes:(((char *)[[resource data] bytes]) + header->tableInfo[i].offset) length:header->tableInfo[i].length] forKey:[NSString stringWithCString:&(header->tableInfo[i].tagname) length:4]];
break;
}
}
*/

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>Font Editor</string>
<key>CFBundleIdentifier</key>
<string>com.nickshanks.resknife.fonteditor</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>BNDL</string>
<key>CFBundleSignature</key>
<string>ResK</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSPrincipalClass</key>
<string>FontWindowController</string>
<key>RKPluginName</key>
<string>Great Expectations</string>
<key>RKSupportedTypes</key>
<array>
<dict>
<key>IsResKnifeDefaultForType</key>
<string>YES</string>
<key>RKTypeName</key>
<string>sfnt</string>
<key>RKTypeRole</key>
<string>Editor</string>
</dict>
</array>
</dict>
</plist>

View File

@ -286,6 +286,22 @@
E1B2A5920E41103A00A72928 /* Template Editor.plugin in CopyFiles */ = {isa = PBXBuildFile; fileRef = E1B2A5860E41103A00A72928 /* Template Editor.plugin */; };
E1B2A5930E41103A00A72928 /* Hexadecimal Editor.plugin in CopyFiles */ = {isa = PBXBuildFile; fileRef = E1B2A4570E41103800A72928 /* Hexadecimal Editor.plugin */; };
E1B2A5950E41103A00A72928 /* libResKnife.dylib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E1B2A4F00E41103900A72928 /* libResKnife.dylib.a */; };
E1B2A73F0E41218F00A72928 /* FontDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = E1B2A7350E41218F00A72928 /* FontDocument.nib */; };
E1B2A7400E41218F00A72928 /* FontWindow.nib in Resources */ = {isa = PBXBuildFile; fileRef = E1B2A7370E41218F00A72928 /* FontWindow.nib */; };
E1B2A7410E41219000A72928 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = E1B2A7390E41218F00A72928 /* Localizable.strings */; };
E1B2A7420E41219000A72928 /* Font Templates.rsrc in Resources */ = {isa = PBXBuildFile; fileRef = E1B2A73B0E41218F00A72928 /* Font Templates.rsrc */; };
E1B2A7430E41219000A72928 /* FontWindowController.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A73D0E41218F00A72928 /* FontWindowController.m */; };
E1B2A7760E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
E1B2A7770E41230E00A72928 /* NGSCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2A7740E41230E00A72928 /* NGSCategories.h */; };
E1B2A7780E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
E1B2A7790E41230E00A72928 /* NGSCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2A7740E41230E00A72928 /* NGSCategories.h */; };
E1B2A77A0E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
E1B2A77B0E41230E00A72928 /* NGSCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2A7740E41230E00A72928 /* NGSCategories.h */; };
E1B2A77C0E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
E1B2A77D0E41230E00A72928 /* NGSCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2A7740E41230E00A72928 /* NGSCategories.h */; };
E1B2A77E0E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
E1B2A77F0E41230E00A72928 /* NGSCategories.h in Headers */ = {isa = PBXBuildFile; fileRef = E1B2A7740E41230E00A72928 /* NGSCategories.h */; };
E1B2A7800E41230E00A72928 /* NGSCategories.m in Sources */ = {isa = PBXBuildFile; fileRef = E1B2A7750E41230E00A72928 /* NGSCategories.m */; };
/* End PBXBuildFile section */
/* Begin PBXBuildRule section */
@ -402,6 +418,16 @@
E1B2A55A0E41103A00A72928 /* Bitmap Editor.plugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Bitmap Editor.plugin"; sourceTree = BUILT_PRODUCTS_DIR; };
E1B2A5850E41103A00A72928 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E1B2A5860E41103A00A72928 /* Template Editor.plugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Template Editor.plugin"; sourceTree = BUILT_PRODUCTS_DIR; };
E1B2A7220E41213300A72928 /* Font Editor.plugin */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Font Editor.plugin"; sourceTree = BUILT_PRODUCTS_DIR; };
E1B2A7360E41218F00A72928 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/FontDocument.nib; sourceTree = "<group>"; };
E1B2A7380E41218F00A72928 /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/FontWindow.nib; sourceTree = "<group>"; };
E1B2A73A0E41218F00A72928 /* English */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/Localizable.strings; sourceTree = "<group>"; };
E1B2A73B0E41218F00A72928 /* Font Templates.rsrc */ = {isa = PBXFileReference; lastKnownFileType = archive.rsrc; path = "Font Templates.rsrc"; sourceTree = "<group>"; };
E1B2A73C0E41218F00A72928 /* FontWindowController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FontWindowController.h; sourceTree = "<group>"; };
E1B2A73D0E41218F00A72928 /* FontWindowController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FontWindowController.m; sourceTree = "<group>"; };
E1B2A73E0E41218F00A72928 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
E1B2A7740E41230E00A72928 /* NGSCategories.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NGSCategories.h; sourceTree = "<group>"; };
E1B2A7750E41230E00A72928 /* NGSCategories.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NGSCategories.m; sourceTree = "<group>"; };
F5041736036BD60801A8010A /* ResKnife.scriptSuite */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = ResKnife.scriptSuite; sourceTree = "<group>"; };
F50DFE17036C203F01A8010A /* English */ = {isa = PBXFileReference; lastKnownFileType = text.xml; name = English; path = Cocoa/English.lproj/ResKnife.scriptTerminology; sourceTree = SOURCE_ROOT; };
F50DFE22036C258201A8010A /* BoolTemplateField.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = BoolTemplateField.cpp; sourceTree = "<group>"; };
@ -714,6 +740,13 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
E1B2A7200E41213300A72928 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@ -774,6 +807,20 @@
path = "Template Editor";
sourceTree = "<group>";
};
E1B2A7340E41218F00A72928 /* Font Editor */ = {
isa = PBXGroup;
children = (
E1B2A73C0E41218F00A72928 /* FontWindowController.h */,
E1B2A73D0E41218F00A72928 /* FontWindowController.m */,
E1B2A73B0E41218F00A72928 /* Font Templates.rsrc */,
E1B2A73E0E41218F00A72928 /* Info.plist */,
E1B2A7390E41218F00A72928 /* Localizable.strings */,
E1B2A7350E41218F00A72928 /* FontDocument.nib */,
E1B2A7370E41218F00A72928 /* FontWindow.nib */,
);
path = "Font Editor";
sourceTree = "<group>";
};
F50DFE20036C258201A8010A /* Uli's Template Editor */ = {
isa = PBXGroup;
children = (
@ -835,6 +882,8 @@
F5594EE9021F3E2301A80001 /* Categories */ = {
isa = PBXGroup;
children = (
E1B2A7740E41230E00A72928 /* NGSCategories.h */,
E1B2A7750E41230E00A72928 /* NGSCategories.m */,
F5D0CBCF022744C701A80001 /* NSOutlineView-SelectedItems.h */,
F5D0CBD0022744C701A80001 /* NSOutlineView-SelectedItems.m */,
F59D5DE40320DFF601A8010C /* NSString-FSSpec.h */,
@ -852,6 +901,7 @@
F5502C4001C579FF01C57124 /* ResKnifePluginProtocol.h */,
F5CDEBAB01FC893201A80001 /* ResKnifeResourceProtocol.h */,
F5EF839F020C08E601A80001 /* Hex Editor */,
E1B2A7340E41218F00A72928 /* Font Editor */,
3D3B99B704DC167D0056861E /* Bitmap Editor */,
3D0B38A504DEF41E005AED5E /* Template Editor */,
F5354435022673C101A80001 /* Template Editor (Abandoned) */,
@ -905,6 +955,7 @@
E1B2A5480E41103A00A72928 /* Ulis Template Editor.bundle */,
E1B2A55A0E41103A00A72928 /* Bitmap Editor.plugin */,
E1B2A5860E41103A00A72928 /* Template Editor.plugin */,
E1B2A7220E41213300A72928 /* Font Editor.plugin */,
);
name = Products;
sourceTree = "<group>";
@ -1262,6 +1313,7 @@
E1B2A3FE0E41103700A72928 /* OpenFileDataSource.h in Headers */,
E1B2A3FF0E41103700A72928 /* RKEditorRegistry.h in Headers */,
E1B2A4000E41103700A72928 /* RKSupportResourceRegistry.h in Headers */,
E1B2A7770E41230E00A72928 /* NGSCategories.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1275,6 +1327,7 @@
E1B2A4430E41103800A72928 /* HexTextView.h in Headers */,
E1B2A4440E41103800A72928 /* HexWindowController.h in Headers */,
E1B2A4450E41103800A72928 /* FindSheetController.h in Headers */,
E1B2A7790E41230E00A72928 /* NGSCategories.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1304,6 +1357,7 @@
E1B2A4760E41103800A72928 /* DataSource.h in Headers */,
E1B2A4770E41103800A72928 /* Structs.h in Headers */,
E1B2A4780E41103800A72928 /* NSNumber-Range.h in Headers */,
E1B2A77F0E41230E00A72928 /* NGSCategories.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1413,6 +1467,7 @@
E1B2A54B0E41103A00A72928 /* ResKnifePluginProtocol.h in Headers */,
E1B2A54C0E41103A00A72928 /* ResKnifeResourceProtocol.h in Headers */,
E1B2A54D0E41103A00A72928 /* ICONWindowController.h in Headers */,
E1B2A77D0E41230E00A72928 /* NGSCategories.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1435,6 +1490,7 @@
E1B2A5690E41103A00A72928 /* NuTemplateDBYTElement.h in Headers */,
E1B2A56A0E41103A00A72928 /* NuTemplateOCNTElement.h in Headers */,
E1B2A56B0E41103A00A72928 /* NuTemplateLSTCElement.h in Headers */,
E1B2A77B0E41230E00A72928 /* NGSCategories.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1683,6 +1739,23 @@
productReference = E1B2A5860E41103A00A72928 /* Template Editor.plugin */;
productType = "com.apple.product-type.bundle";
};
E1B2A7210E41213300A72928 /* Font Editor Cocoa */ = {
isa = PBXNativeTarget;
buildConfigurationList = E1B2A7260E41213400A72928 /* Build configuration list for PBXNativeTarget "Font Editor Cocoa" */;
buildPhases = (
E1B2A71E0E41213300A72928 /* Resources */,
E1B2A71F0E41213300A72928 /* Sources */,
E1B2A7200E41213300A72928 /* Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = "Font Editor Cocoa";
productName = "Font Editor";
productReference = E1B2A7220E41213300A72928 /* Font Editor.plugin */;
productType = "com.apple.product-type.bundle";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -1699,6 +1772,7 @@
E1B2A3DE0E41103700A72928 /* ResKnife Cocoa */,
E1B2A43E0E41103800A72928 /* Hex Editor Cocoa */,
E1B2A55B0E41103A00A72928 /* Template Editor Cocoa */,
E1B2A7210E41213300A72928 /* Font Editor Cocoa */,
E1B2A5490E41103A00A72928 /* Bitmap Editor Cocoa */,
E1B2A46A0E41103800A72928 /* NovaTools */,
E1B2A4950E41103800A72928 /* ResKnife Carbon */,
@ -1827,6 +1901,17 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
E1B2A71E0E41213300A72928 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E1B2A73F0E41218F00A72928 /* FontDocument.nib in Resources */,
E1B2A7400E41218F00A72928 /* FontWindow.nib in Resources */,
E1B2A7410E41219000A72928 /* Localizable.strings in Resources */,
E1B2A7420E41219000A72928 /* Font Templates.rsrc in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXRezBuildPhase section */
@ -1948,6 +2033,7 @@
E1B2A4310E41103700A72928 /* main.m in Sources */,
E1B2A4320E41103700A72928 /* RKEditorRegistry.m in Sources */,
E1B2A4330E41103700A72928 /* RKSupportResourceRegistry.m in Sources */,
E1B2A7780E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1960,6 +2046,7 @@
E1B2A44D0E41103800A72928 /* HexWindowController.m in Sources */,
E1B2A44E0E41103800A72928 /* FindSheetController.m in Sources */,
E1B2A44F0E41103800A72928 /* Notifications.m in Sources */,
E1B2A77A0E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -1987,6 +2074,7 @@
E1B2A4890E41103800A72928 /* DataSource.m in Sources */,
E1B2A48A0E41103800A72928 /* Notifications.m in Sources */,
E1B2A48B0E41103800A72928 /* NSNumber-Range.m in Sources */,
E1B2A7800E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2084,6 +2172,7 @@
files = (
E1B2A5510E41103A00A72928 /* Notifications.m in Sources */,
E1B2A5520E41103A00A72928 /* ICONWindowController.m in Sources */,
E1B2A77E0E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2105,6 +2194,16 @@
E1B2A57C0E41103A00A72928 /* NuTemplateDBYTElement.m in Sources */,
E1B2A57D0E41103A00A72928 /* NuTemplateOCNTElement.m in Sources */,
E1B2A57E0E41103A00A72928 /* NuTemplateLSTCElement.m in Sources */,
E1B2A77C0E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
E1B2A71F0E41213300A72928 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
E1B2A7430E41219000A72928 /* FontWindowController.m in Sources */,
E1B2A7760E41230E00A72928 /* NGSCategories.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -2140,6 +2239,30 @@
name = ICONWindow.nib;
sourceTree = "<group>";
};
E1B2A7350E41218F00A72928 /* FontDocument.nib */ = {
isa = PBXVariantGroup;
children = (
E1B2A7360E41218F00A72928 /* English */,
);
name = FontDocument.nib;
sourceTree = "<group>";
};
E1B2A7370E41218F00A72928 /* FontWindow.nib */ = {
isa = PBXVariantGroup;
children = (
E1B2A7380E41218F00A72928 /* English */,
);
name = FontWindow.nib;
sourceTree = "<group>";
};
E1B2A7390E41218F00A72928 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
E1B2A73A0E41218F00A72928 /* English */,
);
name = Localizable.strings;
sourceTree = "<group>";
};
F50DFE16036C203F01A8010A /* ResKnife.scriptTerminology */ = {
isa = PBXVariantGroup;
children = (
@ -2321,14 +2444,18 @@
84A45AA60E410BAD008598FD /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_VERSION = com.apple.compilers.llvmgcc42;
MACOSX_DEPLOYMENT_TARGET = 10.1;
};
name = Debug;
};
84A45AA70E410BAD008598FD /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_VERSION = com.apple.compilers.llvmgcc42;
MACOSX_DEPLOYMENT_TARGET = 10.1;
};
name = Release;
};
@ -2939,20 +3066,17 @@
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = NuTemplateEditor/Info.plist;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
PRODUCT_NAME = "Template Editor";
SECTORDER_FLAGS = "";
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
WRAPPER_EXTENSION = plugin;
ZERO_LINK = YES;
};
name = Debug;
};
@ -2962,20 +3086,60 @@
COPY_PHASE_STRIP = YES;
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = NuTemplateEditor/Info.plist;
OTHER_CFLAGS = "";
OTHER_LDFLAGS = "";
OTHER_REZFLAGS = "";
PRODUCT_NAME = "Template Editor";
SECTORDER_FLAGS = "";
WARNING_CFLAGS = (
"-Wmost",
"-Wno-four-char-constants",
"-Wno-unknown-pragmas",
);
WRAPPER_EXTENSION = plugin;
ZERO_LINK = NO;
};
name = Release;
};
E1B2A7240E41213400A72928 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = NO;
GCC_DYNAMIC_NO_PIC = NO;
GCC_ENABLE_FIX_AND_CONTINUE = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = "Cocoa/Plug-Ins/Font Editor/Info.plist";
OTHER_LDFLAGS = (
"-framework",
Foundation,
"-framework",
AppKit,
);
PREBINDING = NO;
PRODUCT_NAME = "Font Editor";
WRAPPER_EXTENSION = plugin;
};
name = Debug;
};
E1B2A7250E41213400A72928 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
COPY_PHASE_STRIP = YES;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
GCC_ENABLE_FIX_AND_CONTINUE = NO;
GCC_PRECOMPILE_PREFIX_HEADER = YES;
GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/AppKit.framework/Headers/AppKit.h";
INFOPLIST_FILE = "Cocoa/Plug-Ins/Font Editor/Info.plist";
OTHER_LDFLAGS = (
"-framework",
Foundation,
"-framework",
AppKit,
);
PREBINDING = NO;
PRODUCT_NAME = "Font Editor";
WRAPPER_EXTENSION = plugin;
};
name = Release;
};
@ -3099,6 +3263,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
E1B2A7260E41213400A72928 /* Build configuration list for PBXNativeTarget "Font Editor Cocoa" */ = {
isa = XCConfigurationList;
buildConfigurations = (
E1B2A7240E41213400A72928 /* Debug */,
E1B2A7250E41213400A72928 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Debug;
};
/* End XCConfigurationList section */
};
rootObject = F5B5880F0156D2A601000001 /* Project object */;