yangsu@google.com 2011-08-01 17:07:12 +00:00
parent dea2f8d863
commit 12d177d1f3
16 changed files with 5132 additions and 0 deletions

View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//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>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.yourcompany.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>${MACOSX_DEPLOYMENT_TARGET}</string>
<key>NSMainNibFile</key>
<string>SampleApp</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
</dict>
</plist>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,16 @@
#import <Cocoa/Cocoa.h>
#import "SkNSView.h"
#import "SkOptionsTableView.h"
@interface SampleAppDelegate : NSObject <NSApplicationDelegate> {
NSWindow* fWindow;
SkNSView* fView;
SkOptionsTableView* fOptions;
}
@property (assign) IBOutlet NSWindow* fWindow;
@property (assign) IBOutlet SkNSView* fView;
@property (assign) IBOutlet SkOptionsTableView* fOptions;
- (IBAction)decreaseWindowSize:(id)sender;
- (IBAction)increaseWindowSize:(id)sender;
@end

View File

@ -0,0 +1,31 @@
#import "SampleAppDelegate.h"
@implementation SampleAppDelegate
@synthesize fWindow, fView, fOptions;
-(void) applicationDidFinishLaunching:(NSNotification *)aNotification {
//Load specified skia views after launching
fView.fOptionsDelegate = fOptions;
[fOptions registerMenus:fView.fWind->getMenus()];
}
static float deltaw = 120;
static float deltah = 80;
- (IBAction)decreaseWindowSize:(id)sender {
NSRect frame = [fWindow frame];
frame.origin.y += deltah;
frame.size.width -=deltaw;
frame.size.height -= deltah;
[fWindow setFrame:frame display:YES animate:YES];
}
- (IBAction)increaseWindowSize:(id)sender {
NSRect frame = [fWindow frame];
frame.origin.y -= deltah;
frame.size.width += deltaw;
frame.size.height += deltah;
[fWindow setFrame:frame display:YES animate:YES];
}
@end

View File

@ -0,0 +1,42 @@
#import <QuartzCore/QuartzCore.h>
#import <Cocoa/Cocoa.h>
#include "SampleApp.h"
class SkOSWindow;
class SkEvent;
@class SkNSView;
@protocol SkNSViewOptionsDelegate <NSObject>
@optional
// Called when the view needs to handle adding an SkOSMenu
- (void) view:(SkNSView*)view didAddMenu:(const SkOSMenu*)menu;
- (void) view:(SkNSView*)view didUpdateMenu:(const SkOSMenu*)menu;
@end
@interface SkNSView : NSView {
BOOL fRedrawRequestPending;
NSString* fTitle;
SkOSWindow* fWind;
NSOpenGLContext* fGLContext;
id<SkNSViewOptionsDelegate> fOptionsDelegate;
}
@property (nonatomic, readonly) SkOSWindow *fWind;
@property (nonatomic, retain) NSString* fTitle;
@property (nonatomic, retain) NSOpenGLContext* fGLContext;
@property (nonatomic, assign) id<SkNSViewOptionsDelegate> fOptionsDelegate;
- (id)initWithMyDefaults;
- (void)setSkTitle:(const char*)title;
- (void)onAddMenu:(const SkOSMenu*)menu;
- (void)onUpdateMenu:(const SkOSMenu*)menu;
- (void)postInvalWithRect:(const SkIRect*)rectOrNil;
- (BOOL)onHandleEvent:(const SkEvent&)event;
- (void)attachGL;
- (void)detachGL;
- (void)presentGL;
@end

View File

@ -0,0 +1,278 @@
#import "SkNSView.h"
#include "SkApplication.h"
#include "SkCanvas.h"
#include "GrContext.h"
#include "SkCGUtils.h"
#include "SkEvent.h"
#include "GrGLInterface.h"
#include "SkGpuDevice.h"
//#define FORCE_REDRAW
@implementation SkNSView
@synthesize fWind, fTitle, fOptionsDelegate, fGLContext;
- (id)initWithCoder:(NSCoder*)coder {
if ((self = [super initWithCoder:coder])) {
self = [self initWithMyDefaults];
}
return self;
}
- (id)initWithFrame:(NSRect)frameRect {
if (self = [super initWithFrame:frameRect]) {
self = [self initWithMyDefaults];
}
return self;
}
- (id)initWithMyDefaults {
fRedrawRequestPending = false;
fWind = new SampleWindow(self, NULL, NULL, NULL);
application_init();
fWind->resize(self.frame.size.width, self.frame.size.height,
SkBitmap::kARGB_8888_Config);
return self;
}
-(BOOL) isFlipped {
return YES;
}
- (BOOL)acceptsFirstResponder {
return YES;
}
-(BOOL) inLiveResize {
if (fWind != NULL) {
NSSize s = [self frame].size;
fWind->resize(s.width, s.height);
[fGLContext update];
}
return [super inLiveResize];
}
- (void)dealloc {
delete fWind;
self.fGLContext = nil;
self.fTitle = nil;
application_term();
[super dealloc];
}
- (void)layoutSubviews {
NSSize rect = self.bounds.size;
fWind->resize(rect.width, rect.height);
fWind->inval(NULL);
}
///////////////////////////////////////////////////////////////////////////////
- (void)drawWithCanvas:(SkCanvas*)canvas {
fRedrawRequestPending = false;
fWind->draw(canvas);
#ifdef FORCE_REDRAW
fWind->inval(NULL);
#endif
}
- (void)drawRect:(NSRect)dirtyRect {
SkCanvas canvas(fWind->getBitmap());
[self drawWithCanvas:&canvas];
CGContextRef ctx = (CGContextRef)[[NSGraphicsContext currentContext] graphicsPort];
SkCGDrawBitmap(ctx, fWind->getBitmap(), 0, 0);
}
///////////////////////////////////////////////////////////////////////////////
#include "SkKey.h"
enum {
SK_MacReturnKey = 36,
SK_MacDeleteKey = 51,
SK_MacEndKey = 119,
SK_MacLeftKey = 123,
SK_MacRightKey = 124,
SK_MacDownKey = 125,
SK_MacUpKey = 126,
SK_Mac0Key = 0x52,
SK_Mac1Key = 0x53,
SK_Mac2Key = 0x54,
SK_Mac3Key = 0x55,
SK_Mac4Key = 0x56,
SK_Mac5Key = 0x57,
SK_Mac6Key = 0x58,
SK_Mac7Key = 0x59,
SK_Mac8Key = 0x5b,
SK_Mac9Key = 0x5c
};
static SkKey raw2key(UInt32 raw)
{
static const struct {
UInt32 fRaw;
SkKey fKey;
} gKeys[] = {
{ SK_MacUpKey, kUp_SkKey },
{ SK_MacDownKey, kDown_SkKey },
{ SK_MacLeftKey, kLeft_SkKey },
{ SK_MacRightKey, kRight_SkKey },
{ SK_MacReturnKey, kOK_SkKey },
{ SK_MacDeleteKey, kBack_SkKey },
{ SK_MacEndKey, kEnd_SkKey },
{ SK_Mac0Key, k0_SkKey },
{ SK_Mac1Key, k1_SkKey },
{ SK_Mac2Key, k2_SkKey },
{ SK_Mac3Key, k3_SkKey },
{ SK_Mac4Key, k4_SkKey },
{ SK_Mac5Key, k5_SkKey },
{ SK_Mac6Key, k6_SkKey },
{ SK_Mac7Key, k7_SkKey },
{ SK_Mac8Key, k8_SkKey },
{ SK_Mac9Key, k9_SkKey }
};
for (unsigned i = 0; i < SK_ARRAY_COUNT(gKeys); i++)
if (gKeys[i].fRaw == raw)
return gKeys[i].fKey;
return kNONE_SkKey;
}
- (void)keyDown:(NSEvent *)event {
SkKey key = raw2key([event keyCode]);
if (kNONE_SkKey != key)
fWind->handleKey(key);
else{
unichar c = [[event characters] characterAtIndex:0];
fWind->handleChar((SkUnichar)c);
}
}
- (void)keyUp:(NSEvent *)event {
SkKey key = raw2key([event keyCode]);
if (kNONE_SkKey != key)
fWind->handleKeyUp(key);
else{
unichar c = [[event characters] characterAtIndex:0];
//fWind->handleChar((SkUnichar)c);
}
}
- (void)mouseDown:(NSEvent *)event {
NSPoint p = [event locationInWindow];
if ([self mouse:p inRect:[self bounds]]) { //unecessary for a window with a single view
NSPoint loc = [self convertPoint:p fromView:nil];
fWind->handleClick(loc.x, loc.y, SkView::Click::kDown_State, self);
}
}
- (void)mouseDragged:(NSEvent *)event {
NSPoint p = [event locationInWindow];
if ([self mouse:p inRect:[self bounds]]) {
NSPoint loc = [self convertPoint:p fromView:nil];
fWind->handleClick(loc.x, loc.y, SkView::Click::kMoved_State, self);
}
}
- (void)mouseUp:(NSEvent *)event {
NSPoint p = [event locationInWindow];
if ([self mouse:p inRect:[self bounds]]) {
NSPoint loc = [self convertPoint:p fromView:nil];
fWind->handleClick(loc.x, loc.y, SkView::Click::kUp_State, self);
}
}
///////////////////////////////////////////////////////////////////////////////
- (void)setSkTitle:(const char *)title {
NSString* text = [NSString stringWithUTF8String:title];
if ([text length] > 0)
self.fTitle = text;
[[self window] setTitle:fTitle];
}
- (BOOL)onHandleEvent:(const SkEvent&)evt {
return false;
}
#include "SkOSMenu.h"
- (void)onAddMenu:(const SkOSMenu*)menu {
[self.fOptionsDelegate view:self didAddMenu:menu];
}
- (void)onUpdateMenu:(const SkOSMenu*)menu {
[self.fOptionsDelegate view:self didUpdateMenu:menu];
}
- (void)postInvalWithRect:(const SkIRect*)r {
if (!fRedrawRequestPending) {
fRedrawRequestPending = true;
[self performSelector:@selector(display) withObject:nil afterDelay:0];
}
}
///////////////////////////////////////////////////////////////////////////////
#include <OpenGL/OpenGL.h>
CGLContextObj createGLContext() {
GLint major, minor;
CGLContextObj ctx;
CGLGetVersion(&major, &minor);
SkDebugf("---- cgl version %d %d\n", major, minor);
const CGLPixelFormatAttribute attributes[] = {
kCGLPFAStencilSize, (CGLPixelFormatAttribute)8,
#if USE_MSAA
kCGLPFASampleBuffers, 1,
kCGLPFAMultisample,
kCGLPFASamples, 8,
#endif
kCGLPFAAccelerated,
kCGLPFADoubleBuffer,
(CGLPixelFormatAttribute)0
};
CGLPixelFormatObj format;
GLint npix;
CGLChoosePixelFormat(attributes, &format, &npix);
SkDebugf("----- cgl format %p\n", format);
CGLCreateContext(format, NULL, &ctx);
SkDebugf("----- cgl context %p\n", ctx);
CGLDestroyPixelFormat(format);
static const GLint interval = 1;
CGLSetParameter(ctx, kCGLCPSwapInterval, &interval);
CGLSetCurrentContext(ctx);
return ctx;
}
- (void)viewDidMoveToWindow {
[super viewDidMoveToWindow];
//Attaching view to fGLContext requires that the view to be part of a window,
//and that the NSWindow instance must have a CoreGraphics counterpart (or
//it must NOT be deferred or should have been on screen at least once)
if ([fGLContext view] != self && nil != self.window) {
[fGLContext setView:self];
glClear(GL_STENCIL_BUFFER_BIT);
}
}
- (void)attachGL {
if (nil == fGLContext)
fGLContext = [[NSOpenGLContext alloc] initWithCGLContextObj:createGLContext()];
[fGLContext makeCurrentContext];
glViewport(0, 0, self.bounds.size.width, self.bounds.size.width);
glClearColor(0, 0, 0, 0);
glClearStencil(0);
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
- (void)detachGL {
[fGLContext clearDrawable];
}
- (void)presentGL {
[fGLContext flushBuffer];
}
@end

View File

@ -0,0 +1,36 @@
#ifndef SkOSWindow_MacCocoa_DEFINED
#define SkOSWindow_MacCocoa_DEFINED
#include "SkWindow.h"
class SkOSWindow : public SkWindow {
public:
SkOSWindow(void* hwnd);
~SkOSWindow();
void* getHWND() const { return fHWND; }
virtual bool onDispatchClick(int x, int y, Click::State state,
void* owner);
void detachGL();
bool attachGL();
void presentGL();
protected:
// overrides from SkEventSink
virtual bool onEvent(const SkEvent& evt);
// overrides from SkWindow
virtual void onHandleInval(const SkIRect&);
// overrides from SkView
virtual void onAddMenu(const SkOSMenu*);
virtual void onUpdateMenu(const SkOSMenu*);
virtual void onSetTitle(const char[]);
private:
void* fHWND;
bool fInvalEventIsPending;
void* fNotifier;
void* fGLContext;
typedef SkWindow INHERITED;
};
#endif

View File

@ -0,0 +1,66 @@
#import <Cocoa/Cocoa.h>
#include "SkOSWindow_Mac.h"
#include "SkOSMenu.h"
#include "SkTypes.h"
#include "SkWindow.h"
#import "SkNSView.h"
#import "SkEventNotifier.h"
#define kINVAL_NSVIEW_EventType "inval-nsview"
SkOSWindow::SkOSWindow(void* hWnd) : fHWND(hWnd) {
fInvalEventIsPending = false;
fGLContext = NULL;
fNotifier = [[SkEventNotifier alloc] init];
}
SkOSWindow::~SkOSWindow() {
[(SkEventNotifier*)fNotifier release];
}
void SkOSWindow::onHandleInval(const SkIRect& r) {
if (!fInvalEventIsPending) {
fInvalEventIsPending = true;
(new SkEvent(kINVAL_NSVIEW_EventType))->post(this->getSinkID());
}
}
bool SkOSWindow::onEvent(const SkEvent& evt) {
if (evt.isType(kINVAL_NSVIEW_EventType)) {
fInvalEventIsPending = false;
const SkIRect& r = this->getDirtyBounds();
[(SkNSView*)fHWND postInvalWithRect:&r];
[(NSOpenGLContext*)fGLContext update];
return true;
}
if ([(SkNSView*)fHWND onHandleEvent:evt]) {
return true;
}
return this->INHERITED::onEvent(evt);
}
bool SkOSWindow::onDispatchClick(int x, int y, Click::State state, void* owner) {
return this->INHERITED::onDispatchClick(x, y, state, owner);
}
void SkOSWindow::onSetTitle(const char title[]) {
[(SkNSView*)fHWND setSkTitle:title];
}
void SkOSWindow::onAddMenu(const SkOSMenu* menu) {
[(SkNSView*)fHWND onAddMenu:menu];
}
void SkOSWindow::onUpdateMenu(const SkOSMenu* menu) {
[(SkNSView*)fHWND onUpdateMenu:menu];
}
bool SkOSWindow::attachGL() {
[(SkNSView*)fHWND attachGL];
}
void SkOSWindow::detachGL() {
[(SkNSView*)fHWND detachGL];
}
void SkOSWindow::presentGL() {
[(SkNSView*)fHWND presentGL];
}

View File

@ -0,0 +1,31 @@
#import <Cocoa/Cocoa.h>
#import "SkNSView.h"
#import "SkOSMenu.h"
#import "SkEvent.h"
@interface SkOptionItem : NSObject {
NSCell* fCell;
const SkOSMenu::Item* fItem;
}
@property (nonatomic, assign) const SkOSMenu::Item* fItem;
@property (nonatomic, retain) NSCell* fCell;
@end
@interface SkOptionsTableView : NSTableView <SkNSViewOptionsDelegate, NSTableViewDelegate, NSTableViewDataSource> {
NSMutableArray* fItems;
const SkTDArray<SkOSMenu*>* fMenus;
}
@property (nonatomic, retain) NSMutableArray* fItems;
- (void)registerMenus:(const SkTDArray<SkOSMenu*>*)menus;
- (void)updateMenu:(const SkOSMenu*)menu;
- (void)loadMenu:(const SkOSMenu*)menu;
- (NSCell*)createAction;
- (NSCell*)createList:(NSArray*)items current:(int)index;
- (NSCell*)createSegmented:(NSArray*)items current:(int)index;
- (NSCell*)createSlider:(float)value min:(float)min max:(float)max;
- (NSCell*)createSwitch:(BOOL)state;
- (NSCell*)createTextField:(NSString*)placeHolder;
- (NSCell*)createTriState:(NSCellStateValue)state;
@end

View File

@ -0,0 +1,279 @@
#import "SkOptionsTableView.h"
#import "SkTextFieldCell.h"
@implementation SkOptionItem
@synthesize fCell, fItem;
- (void)dealloc {
[fCell release];
[super dealloc];
}
@end
@implementation SkOptionsTableView
@synthesize fItems;
- (id)initWithCoder:(NSCoder*)coder {
if ((self = [super initWithCoder:coder])) {
self.dataSource = self;
self.delegate = self;
[self setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleNone];
self.fItems = [NSMutableArray array];
}
return self;
}
- (void)dealloc {
self.fItems = nil;
[super dealloc];
}
- (void) view:(SkNSView*)view didAddMenu:(const SkOSMenu*)menu {}
- (void) view:(SkNSView*)view didUpdateMenu:(const SkOSMenu*)menu {
[self updateMenu:menu];
}
- (void)registerMenus:(const SkTDArray<SkOSMenu*>*)menus {
fMenus = menus;
for (NSUInteger i = 0; i < fMenus->count(); ++i) {
[self loadMenu:(*fMenus)[i]];
}
}
- (void)updateMenu:(SkOSMenu*)menu {
// the first menu is always assumed to be the static, the second is
// repopulated every time over and over again
int menuIndex = fMenus->find(menu);
if (menuIndex >= 0 && menuIndex < fMenus->count()) {
NSUInteger first = 0;
for (NSInteger i = 0; i < menuIndex; ++i) {
first += (*fMenus)[i]->countItems();
}
[fItems removeObjectsInRange:NSMakeRange(first, [fItems count] - first)];
[self loadMenu:menu];
}
[self reloadData];
}
- (NSCellStateValue)triStateToNSState:(SkOSMenu::TriState)state {
if (SkOSMenu::kOnState == state)
return NSOnState;
else if (SkOSMenu::kOffState == state)
return NSOffState;
else
return NSMixedState;
}
- (void)loadMenu:(const SkOSMenu*)menu {
for (int i = 0; i < menu->countItems(); ++i) {
const SkOSMenu::Item* item = menu->getItem(i);
NSString* str;
int index = 0;
NSArray* optionstrs = nil;
SkOptionItem* option = [[SkOptionItem alloc] init];
option.fItem = item;
bool state = false;
SkOSMenu::TriState tristate;
switch (item->getType()) {
case SkOSMenu::kAction_Type:
option.fCell = [self createAction];
break;
case SkOSMenu::kList_Type:
optionstrs = [[NSString stringWithUTF8String:item->getEvent()->findString(SkOSMenu::List_Items_Str)]
componentsSeparatedByString:[NSString stringWithUTF8String:SkOSMenu::Delimiter]];
item->getEvent()->findS32(item->getSlotName(), &index);
option.fCell = [self createList:optionstrs current:index];
break;
case SkOSMenu::kSlider_Type:
SkScalar min, max, value;
item->getEvent()->findScalar(SkOSMenu::Slider_Min_Scalar, &min);
item->getEvent()->findScalar(SkOSMenu::Slider_Max_Scalar, &max);
item->getEvent()->findScalar(item->getSlotName(), &value);
option.fCell = [self createSlider:value
min:min
max:max];
break;
case SkOSMenu::kSwitch_Type:
item->getEvent()->findBool(item->getSlotName(), &state);
option.fCell = [self createSwitch:(BOOL)state];
break;
case SkOSMenu::kTriState_Type:
item->getEvent()->findS32(item->getSlotName(), (int*)&tristate);
option.fCell = [self createTriState:[self triStateToNSState:tristate]];
break;
case SkOSMenu::kTextField_Type:
str = [NSString stringWithUTF8String:item->getEvent()->findString(item->getSlotName())];
option.fCell = [self createTextField:str];
break;
default:
break;
}
[fItems addObject:option];
[option release];
}
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [self.fItems count];
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
if (columnIndex == 0)
return [NSString stringWithUTF8String:((SkOptionItem*)[fItems objectAtIndex:row]).fItem->getLabel()];
else
return nil;
}
- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
if (tableColumn) {
int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
if (columnIndex == 1)
return [((SkOptionItem*)[fItems objectAtIndex:row]).fCell copy];
else
return [[[SkTextFieldCell alloc] init] autorelease];
}
return nil;
}
- (void)tableView:(NSTableView *)tableView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
if (columnIndex == 1) {
SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row];
NSCell* storedCell = option.fCell;
const SkOSMenu::Item* item = option.fItem;
switch (item->getType()) {
case SkOSMenu::kAction_Type:
break;
case SkOSMenu::kList_Type:
[cell selectItemAtIndex:[(NSPopUpButtonCell*)storedCell indexOfSelectedItem]];
break;
case SkOSMenu::kSlider_Type:
[cell setFloatValue:[storedCell floatValue]];
break;
case SkOSMenu::kSwitch_Type:
[cell setTitle:storedCell.title];
[cell setState:[(NSButtonCell*)storedCell state]];
break;
case SkOSMenu::kTextField_Type:
if ([[storedCell stringValue] length] > 0)
[cell setStringValue:[storedCell stringValue]];
break;
case SkOSMenu::kTriState_Type:
[cell setTitle:storedCell.title];
[cell setState:[(NSButtonCell*)storedCell state]];
break;
default:
break;
}
}
else {
[(SkTextFieldCell*)cell setEditable:NO];
}
}
- (void)tableView:(NSTableView *)tableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
int columnIndex = [tableView columnWithIdentifier:[tableColumn identifier]];
if (columnIndex == 1) {
SkOptionItem* option = (SkOptionItem*)[self.fItems objectAtIndex:row];
NSCell* cell = option.fCell;
const SkOSMenu::Item* item = option.fItem;
switch (item->getType()) {
case SkOSMenu::kAction_Type:
item->postEvent();
break;
case SkOSMenu::kList_Type:
[(NSPopUpButtonCell*)cell selectItemAtIndex:[anObject intValue]];
item->postEventWithInt([anObject intValue]);
break;
case SkOSMenu::kSlider_Type:
[cell setFloatValue:[anObject floatValue]];
item->postEventWithScalar([anObject floatValue]);
break;
case SkOSMenu::kSwitch_Type:
[cell setState:[anObject boolValue]];
item->postEventWithBool([anObject boolValue]);
break;
case SkOSMenu::kTextField_Type:
if ([anObject length] > 0) {
[cell setStringValue:anObject];
item->postEventWithString([anObject UTF8String]);
}
break;
case SkOSMenu::kTriState_Type:
[cell setState:[anObject intValue]];
item->postEventWithInt([anObject intValue]);
break;
default:
break;
}
}
}
- (NSCell*)createAction{
NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
[cell setTitle:@""];
[cell setButtonType:NSMomentaryPushInButton];
[cell setBezelStyle:NSSmallSquareBezelStyle];
return cell;
}
- (NSCell*)createList:(NSArray*)items current:(int)index {
NSPopUpButtonCell* cell = [[[NSPopUpButtonCell alloc] init] autorelease];
[cell addItemsWithTitles:items];
[cell selectItemAtIndex:index];
[cell setArrowPosition:NSPopUpArrowAtBottom];
[cell setBezelStyle:NSSmallSquareBezelStyle];
return cell;
}
- (NSCell*)createSegmented:(NSArray*)items current:(int)index {
NSSegmentedCell* cell = [[[NSSegmentedCell alloc] init] autorelease];
[cell setSegmentStyle:NSSegmentStyleSmallSquare];
[cell setSegmentCount:[items count]];
NSUInteger i = 0;
for (NSString* label in items) {
[cell setLabel:label forSegment:i];
++i;
}
[cell setSelectedSegment:index];
return cell;
}
- (NSCell*)createSlider:(float)value min:(float)min max:(float)max {
NSSliderCell* cell = [[[NSSliderCell alloc] init] autorelease];
[cell setFloatValue:value];
[cell setMinValue:min];
[cell setMaxValue:max];
return cell;
}
- (NSCell*)createSwitch:(BOOL)state {
NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
[cell setTitle:(state) ? @"On" : @"Off"];
[cell setState:state];
[cell setButtonType:NSSwitchButton];
return cell;
}
- (NSCell*)createTextField:(NSString*)placeHolder; {
SkTextFieldCell* cell = [[[SkTextFieldCell alloc] init] autorelease];
[cell setEditable:YES];
[cell setStringValue:@""];
[cell setPlaceholderString:placeHolder];
return cell;
}
- (NSCell*)createTriState:(NSCellStateValue)state {
NSButtonCell* cell = [[[NSButtonCell alloc] init] autorelease];
if (NSOnState == state)
[cell setTitle:@"On"];
else if (NSOffState == state)
[cell setTitle:@"Off"];
else
[cell setTitle:@"Mixed"];
[cell setAllowsMixedState:TRUE];
[cell setState:(NSInteger)state];
[cell setButtonType:NSSwitchButton];
return cell;
}
@end

View File

@ -0,0 +1,6 @@
#import <Cocoa/Cocoa.h>
//A text field cell that has vertically centered text
@interface SkTextFieldCell : NSTextFieldCell {
BOOL selectingOrEditing;
}
@end

View File

@ -0,0 +1,48 @@
#import "SkTextFieldCell.h"
@implementation SkTextFieldCell
- (NSRect)drawingRectForBounds:(NSRect)theRect {
NSRect newRect = [super drawingRectForBounds:theRect];
if (selectingOrEditing == NO) {
NSSize textSize = [self cellSizeForBounds:theRect];
float heightDelta = newRect.size.height - textSize.height;
if (heightDelta > 0) {
newRect.size.height -= heightDelta;
newRect.origin.y += (heightDelta / 2);
}
}
return newRect;
}
- (void)selectWithFrame:(NSRect)aRect
inView:(NSView *)controlView
editor:(NSText *)textObj
delegate:(id)anObject
start:(int)selStart
length:(int)selLength {
aRect = [self drawingRectForBounds:aRect];
selectingOrEditing = YES;
[super selectWithFrame:aRect
inView:controlView
editor:textObj
delegate:anObject
start:selStart
length:selLength];
selectingOrEditing = NO;
}
- (void)editWithFrame:(NSRect)aRect
inView:(NSView *)controlView
editor:(NSText *)textObj
delegate:(id)anObject
event:(NSEvent *)theEvent {
aRect = [self drawingRectForBounds:aRect];
selectingOrEditing = YES;
[super editWithFrame:aRect
inView:controlView
editor:textObj
delegate:anObject
event:theEvent];
selectingOrEditing = NO;
}
@end

View File

@ -0,0 +1,9 @@
#import <Cocoa/Cocoa.h>
int main(int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int retVal = NSApplicationMain(argc, (const char **)argv);
[pool release];
return retVal;
}

View File

@ -0,0 +1,13 @@
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#import <Foundation/Foundation.h>
@interface SkEventNotifier : NSObject
- (void)receiveSkEvent:(NSNotification*)notification;
+ (void)postTimedSkEvent:(NSTimeInterval)ti;
+ (void)timerFireMethod:(NSTimer*)theTimer;
@end

View File

@ -0,0 +1,58 @@
#import "SkEventNotifier.h"
#include "SkEvent.h"
#define SkEventClass @"SkEvenClass"
@implementation SkEventNotifier
//Overwritten from NSObject
- (id)init {
self = [super init];
if (self) {
//Register as an observer for SkEventClass events and call
//receiveSkEvent: upon receiving the event
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(receiveSkEvent:)
name:SkEventClass
object:nil];
}
return self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
-(BOOL) acceptsFirstResponder {
return YES;
}
//SkEvent Handers
- (void)receiveSkEvent:(NSNotification *)notification {
if(SkEvent::ProcessEvent())
SkEvent::SignalNonEmptyQueue();
}
+ (void)postTimedSkEvent:(NSTimeInterval)timeInterval {
[NSTimer scheduledTimerWithTimeInterval:timeInterval target:self
selector:@selector(timerFireMethod:)
userInfo:nil repeats:NO];
}
+ (void)timerFireMethod:(NSTimer*)theTimer {
SkEvent::ServiceQueueTimer();
}
@end
////////////////////////////////////////////////////////////////////////////////
void SkEvent::SignalNonEmptyQueue() {
//post a SkEventClass event to the default notification center
[[NSNotificationCenter defaultCenter] postNotificationName:SkEventClass
object:nil];
}
void SkEvent::SignalQueueTimer(SkMSec delay) {
if (delay) {
//Convert to seconds
NSTimeInterval ti = delay/(float)SK_MSec1;
[SkEventNotifier postTimedSkEvent:ti];
}
}

251
gyp/CocoaSampleApp.gyp Normal file
View File

@ -0,0 +1,251 @@
{
'includes': [
'common.gypi',
],
'targets': [
{
'target_name': 'CocoaSampleApp',
'type': 'executable',
'mac_bundle' : 1,
'include_dirs' : [
'../src/core', # needed to get SkConcaveToTriangle, maybe this should be moved to include dir?
'../gm', # SampleGM.cpp pulls gm.h
'../include/pipe', # To pull in SkGPipe.h for pipe reader/writer
],
'sources': [
# gm files needed for SampleGM.cpp
'../gm/bitmapfilters.cpp',
'../gm/blurs.cpp',
'../gm/complexclip.cpp',
'../gm/filltypes.cpp',
'../gm/gm.h',
'../gm/gradients.cpp',
'../gm/nocolorbleed.cpp',
'../gm/points.cpp',
'../gm/poly2poly.cpp',
'../gm/shadertext.cpp',
'../gm/shadows.cpp',
'../gm/shapes.cpp',
'../gm/tilemodes.cpp',
'../gm/xfermodes.cpp',
'../samplecode/ClockFaceView.cpp',
'../samplecode/OverView.cpp',
'../samplecode/Sample2PtRadial.cpp',
'../samplecode/SampleAll.cpp',
'../samplecode/SampleAnimator.cpp',
'../samplecode/SampleApp.cpp',
'../samplecode/SampleArc.cpp',
'../samplecode/SampleAvoid.cpp',
'../samplecode/SampleBigBlur.cpp',
'../samplecode/SampleBigGradient.cpp',
'../samplecode/SampleBitmapRect.cpp',
'../samplecode/SampleBlur.cpp',
'../samplecode/SampleCamera.cpp',
'../samplecode/SampleCircle.cpp',
'../samplecode/SampleCode.h',
'../samplecode/SampleColorFilter.cpp',
'../samplecode/SampleComplexClip.cpp',
'../samplecode/SampleConcavePaths.cpp',
'../samplecode/SampleCull.cpp',
'../samplecode/SampleDecode.cpp',
'../samplecode/SampleDegenerateTwoPtRadials.cpp',
'../samplecode/SampleDither.cpp',
'../samplecode/SampleDitherBitmap.cpp',
'../samplecode/SampleDrawLooper.cpp',
'../samplecode/SampleEffects.cpp',
'../samplecode/SampleEmboss.cpp',
'../samplecode/SampleEncode.cpp',
'../samplecode/SampleExtractAlpha.cpp',
'../samplecode/SampleFillType.cpp',
'../samplecode/SampleFilter.cpp',
'../samplecode/SampleFilter2.cpp',
'../samplecode/SampleFontCache.cpp',
'../samplecode/SampleFontScalerTest.cpp',
'../samplecode/SampleFuzz.cpp',
'../samplecode/SampleGM.cpp',
'../samplecode/SampleGradients.cpp',
'../samplecode/SampleHairline.cpp',
'../samplecode/SampleImage.cpp',
'../samplecode/SampleImageDir.cpp',
'../samplecode/SampleLayerMask.cpp',
'../samplecode/SampleLayers.cpp',
'../samplecode/SampleLCD.cpp',
'../samplecode/SampleLineClipper.cpp',
'../samplecode/SampleLines.cpp',
'../samplecode/SampleMeasure.cpp',
'../samplecode/SampleMipMap.cpp',
'../samplecode/SampleMovie.cpp',
'../samplecode/SampleNinePatch.cpp',
'../samplecode/SampleOvalTest.cpp',
'../samplecode/SampleOverflow.cpp',
'../samplecode/SamplePageFlip.cpp',
'../samplecode/SamplePatch.cpp',
'../samplecode/SamplePath.cpp',
'../samplecode/SamplePathClip.cpp',
'../samplecode/SamplePathEffects.cpp',
'../samplecode/SamplePicture.cpp',
'../samplecode/SamplePoints.cpp',
'../samplecode/SamplePolyToPoly.cpp',
'../samplecode/SampleAARects.cpp',
'../samplecode/SampleRegion.cpp',
'../samplecode/SampleRepeatTile.cpp',
'../samplecode/SampleShaders.cpp',
'../samplecode/SampleShaderText.cpp',
'../samplecode/SampleShapes.cpp',
'../samplecode/SampleSkLayer.cpp',
'../samplecode/SampleSlides.cpp',
'../samplecode/SampleStrokePath.cpp',
'../samplecode/SampleStrokeText.cpp',
'../samplecode/SampleTests.cpp',
'../samplecode/SampleText.cpp',
'../samplecode/SampleTextAlpha.cpp',
'../samplecode/SampleTextBox.cpp',
'../samplecode/SampleTextEffects.cpp',
'../samplecode/SampleTextOnPath.cpp',
'../samplecode/SampleTextureDomain.cpp',
'../samplecode/SampleTiling.cpp',
'../samplecode/SampleTinyBitmap.cpp',
'../samplecode/SampleTriangles.cpp',
'../samplecode/SampleTypeface.cpp',
'../samplecode/SampleUnitMapper.cpp',
'../samplecode/SampleVertices.cpp',
'../samplecode/SampleXfermodes.cpp',
'../samplecode/SampleXfermodesBlur.cpp',
# Dependencies for the pipe code in SampleApp
'../src/pipe/SkGPipeRead.cpp',
'../src/pipe/SkGPipeWrite.cpp',
],
'sources!': [
'../samplecode/SampleSkLayer.cpp', #relies on SkMatrix44 which doesn't compile
'../samplecode/SampleTests.cpp', #includes unknown file SkShaderExtras.h
'../samplecode/SampleWarp.cpp',
'../samplecode/SampleFontCache.cpp',
],
'dependencies': [
'core.gyp:core',
'effects.gyp:effects',
'images.gyp:images',
'views.gyp:views',
'utils.gyp:utils',
'animator.gyp:animator',
'xml.gyp:xml',
'svg.gyp:svg',
'experimental.gyp:experimental',
'gpu.gyp:gr',
'gpu.gyp:skgr',
'pdf.gyp:pdf',
],
'conditions' : [
[ 'skia_os in ["linux", "freebsd", "openbsd", "solaris"]', {
'sources!': [
'../samplecode/SampleDecode.cpp',
],
}],
[ 'skia_os == "win"', {
'sources!': [
# require UNIX functions
'../samplecode/SampleEncode.cpp',
'../samplecode/SamplePageFlip.cpp',
],
}],
[ 'skia_os == "mac"', {
'sources!': [
'../samplecode/SampleDecode.cpp',
],
'sources': [
'../experimental/CocoaSampleApp/main.m',
'../experimental/CocoaSampleApp/SampleApp-Info.plist',
'../experimental/CocoaSampleApp/SampleApp.xib',
'../experimental/CocoaSampleApp/SampleAppDelegate.h',
'../experimental/CocoaSampleApp/SampleAppDelegate.mm',
'../experimental/CocoaSampleApp/SkNSView.h',
'../experimental/CocoaSampleApp/SkNSView.mm',
'../experimental/CocoaSampleApp/SkOSWindow_Mac.h',
'../experimental/CocoaSampleApp/SkOSWindow_Mac.mm',
'../experimental/CocoaSampleApp/SkOptionsTableView.h',
'../experimental/CocoaSampleApp/SkOptionsTableView.mm',
'../experimental/CocoaSampleApp/SkTextFieldCell.h',
'../experimental/CocoaSampleApp/SkTextFieldCell.m',
'../experimental/SkSockets.h',
'../experimental/SkSockets.cpp',
'../experimental/SkEventNotifier.h',
'../experimental/SkEventNotifier.mm',
],
'link_settings': {
'libraries': [
'$(SDKROOT)/System/Library/Frameworks/Cocoa.framework',
'$(SDKROOT)/System/Library/Frameworks/Foundation.framework',
'$(SDKROOT)/System/Library/Frameworks/QuartzCore.framework',
'$(SDKROOT)/System/Library/Frameworks/OpenGL.framework',
],
},
'xcode_settings' : {
'INFOPLIST_FILE' : '../experimental/CocoaSampleApp/SampleApp-Info.plist',
},
'mac_bundle_resources' : [
'../experimental/CocoaSampleApp/SampleApp.xib',
],
}],
[ 'skia_os == "ios"', {
# TODO: This doesn't build properly yet, but it's getting there.
'sources!': [
'../samplecode/SampleDecode.cpp',
],
'sources': [
'../experimental/iOSSampleApp/SkIOSNotifier.mm',
'../experimental/iOSSampleApp/SkTime_iOS.mm',
'../experimental/iOSSampleApp/SkUIDetailViewController.mm',
'../experimental/iOSSampleApp/SkUIRootViewController.mm',
'../experimental/iOSSampleApp/SkUIView_shell.mm',
'../experimental/iOSSampleApp/iOSSampleApp_Prefix.pch',
'../experimental/iOSSampleApp/Shared/main.m',
'../experimental/iOSSampleApp/iPad/AppDelegate_iPad.mm',
'../experimental/iOSSampleApp/iPad/SkUISplitViewController.mm',
'../experimental/iOSSampleApp/iPhone/AppDelegate_iPhone.mm',
'../experimental/iOSSampleApp/iPhone/SkUINavigationController.mm',
'../src/utils/ios/SkOSWindow_iOS.mm',
'../src/utils/ios/SkImageDecoder_iOS.mm',
'../src/utils/ios/SkStream_NSData.mm',
'../src/utils/ios/SkOSFile_iOS.mm',
'../src/utils/mac/SkCreateCGImageRef.cpp',
'../experimental/iOSSampleApp/SkiOSSampleApp-Debug.xcconfig',
'../experimental/iOSSampleApp/SkiOSSampleApp-Release.xcconfig',
],
'include_dirs' : [
'../experimental/iOSSampleApp',
'../experimental/iOSSampleApp/iPad',
'../experimental/iOSSampleApp/iPhone',
'../include/utils/ios',
'../../gpu/include',
],
'xcode_config_file': '../experimental/iOSSampleApp/SkiOSSampleApp-Base.xcconfig',
'mac_bundle_resources' : [
'../experimental/iOSSampleApp/iPad/MainWindow_iPad.xib',
'../experimental/iOSSampleApp/iPhone/MainWindow_iPhone.xib',
],
}],
],
'msvs_settings': {
'VCLinkerTool': {
'SubSystem': '2',
'AdditionalDependencies': [
'd3d9.lib',
],
},
},
},
],
}
# Local Variables:
# tab-width:2
# indent-tabs-mode:nil
# End:
# vim: set expandtab tabstop=2 shiftwidth=2: